From dee2bfbfd5c5e8dce91be05a598be232ec790de6 Mon Sep 17 00:00:00 2001 From: Andy Grove Date: Tue, 8 Oct 2024 14:27:21 -0600 Subject: [PATCH 1/2] various documentation improvements --- README.md | 4 +- .../images/CometNativeExecution.drawio.png | Bin 61017 -> 0 bytes .../images/CometNativeParquetReader.drawio | 100 +++++++++++++++++ .../CometNativeParquetReader.drawio.svg | 4 + .../images/CometNativeParquetScan.drawio.png | Bin 75703 -> 0 bytes .../images/CometOverviewDetailed.drawio | 94 ++++++++++++++++ .../images/CometOverviewDetailed.drawio.svg | 4 + .../contributor-guide/plugin_overview.md | 4 +- docs/source/index.rst | 2 + docs/source/user-guide/installation.md | 101 +++++------------- docs/source/user-guide/overview.md | 34 +++--- docs/source/user-guide/source.md | 69 ++++++++++++ 12 files changed, 322 insertions(+), 94 deletions(-) delete mode 100644 docs/source/_static/images/CometNativeExecution.drawio.png create mode 100644 docs/source/_static/images/CometNativeParquetReader.drawio create mode 100644 docs/source/_static/images/CometNativeParquetReader.drawio.svg delete mode 100644 docs/source/_static/images/CometNativeParquetScan.drawio.png create mode 100644 docs/source/_static/images/CometOverviewDetailed.drawio create mode 100644 docs/source/_static/images/CometOverviewDetailed.drawio.svg create mode 100644 docs/source/user-guide/source.md diff --git a/README.md b/README.md index c318b05354..1a6281a993 100644 --- a/README.md +++ b/README.md @@ -30,10 +30,12 @@ under the License. logo Apache DataFusion Comet is a high-performance accelerator for Apache Spark, built on top of the powerful -[Apache DataFusion](https://datafusion.apache.org) query engine. Comet is designed to significantly enhance the +[Apache DataFusion] query engine. Comet is designed to significantly enhance the performance of Apache Spark workloads while leveraging commodity hardware and seamlessly integrating with the Spark ecosystem without requiring any code changes. +[Apache DataFusion]: https://datafusion.apache.org + # Benefits of Using Comet ## Run Spark Queries at DataFusion Speeds diff --git a/docs/source/_static/images/CometNativeExecution.drawio.png b/docs/source/_static/images/CometNativeExecution.drawio.png deleted file mode 100644 index ba122a1f2ca01b5957ed5a80f75151d588969d9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61017 zcmeEv1zc6zwl^RuNJ)1nAl*_@B1kvV9h=TgH%NzsbP3YkpfpN@f;7^NfV6adYb)F9 zJ?Gr}?tAyX`Hm;z`(#!!N9=Q zA>0BeLyuRcfj3w?1<@xkC4EF|z=beKRoqBg8ip45i~s{0XbJ-lX#)Hb0KYIWH_~BY zZUFDF5L!AM^e!A#`VHu3*g8nV&$Nk5FffcO_D@yqEuD=_EkH1oY(hUiQL-|dSliiC zvI$eNvg+B`FdCZb8H4pK?HH{<_5caEuV)Ohx^5tC?P_Xap-0Io!p_JH+@hA&GcdKX zx3)8(WP1W!i(A=)EP!`_4E&W<1pcT3zbwo;EbKa*G{8qe8ygFd3P@kl6c}BEgPEO? zg^`6FxIrx`_Douel2r)!Y+-5+0^USH2Ikg~PRby#ovF1I(1C@Mkpmzo>KW;QP5){D z$V?rt+kIaQ>qACPMizh!xnpObX94=LNR}TIeQU5G2>gQtEQOVl?I|U*AkY-@ViUS% z18`xbXL;RI4&VgCb$3(4A6>-_^aT}Ejh&w;+k@FfMW3m&8?*g(H0YR?&Z1yF8xv`3 z!|zNobp9~}2j}zqwUrgf;98W|4fViaYp1_%W@K$~y}0W(Ho&_7YIF!e@pl}BP*qF~?EzhY zC=(a^_4FWgF_5XT3G~S<%-44;^`MQf33euWhSp9$`hO?=DwH2=gfbIsZ4Hd~i_Ct# z4Q*uUECjNEC?u4R*Uteo=Re=~CpW-9?ctvpPEg9x)yfepp{ORTDlaT9Aua;aXJF<0 zp`DI;77o`u|3R>`cY!J}*xJF$5Cjnspr}urOib-TiZ*%%kmgQ+egQNSdrJ%8iUs%x zSi6OgwT1N$O=mL#ez>>*x}81P+8p%D9X1X&ZZ=?0z>Kd=$sTmApntIN@1(!a{lCaS z6l84)vIn~Wa)6Eq)s1V7XJNVKq|;yYhaK9+wiS9K$~l| z`1|vRc*x&q&mW5H_Ywo70X7F_^VAt+;9w81{)Y?tFG>(_YWAjpu?bq38e0KUwYP?d z_&0LZ*E8TUWcwqzva&sV$o_AWE625XuI0)Gb#1@OmF>FCuX1I9HvIF*mG$B8Oi|25 zAL5arlKs9VLDcRKjT2&h|ABG-L!vd*192G{0D}SBvY{#9dVVolPLLi42;v2PXU-f3 zTp)cT;Lg9poPUb>TI>&@4*nOhvvU2B*dZnh;ozS~>;M*lOz0N}41p|w0os2TH#0TV zx`n}}fcyY>@;5c$A8^nAkOurojhh83ykDfu{zt~m3ia-P9w`Gd`;C;LVwE#-v4gl< zKnLV3^Z?BH-!EPkLqnrKG-4KJPBv~}U;p1L$9@SO|haAVU4O%hyQHkQ0c9{=iA=KjdI%e)w;aFFWi1BKiJ)ZqxZ}?v+ zYvcbX-7gE*@5K8**Zp$+PQ3rmyI&UWzusIQLP625#tSvnUyb+Ax4ClvPP+f=oi8gS zM+xy*&tDG8BYl@qyf+frXwO5WNCe^_LXzU+0T~ z1QOUq6==&0C^XxX@0V(jOX!6#BuD#~D~QAUe&uXx|4TRE3epRLra{2xzjT6JK>Pfd zD#-A6<%7Ru(680i&e{R|J%bH&`NJ&hbwFpY2Q~)6xbFpqKWz6MdHnsvF2o9e6#?np zUlP;5`0+o=J40z;kOhzka{TLZ$RDZ8KQe{COhnEasGxBgzU_>WrtW2Ft2 z-{bgynfHOZ8;BSA#TEU;qHKG54Dg0&A z|IeA-kE#AkHt_3=&wpq_-%aiRo6rw8@wfg$z{_ti!^8i*CiMG|=ASj8e;Na`JOmC5 zeMi2Kod~)s{blp|6$L}~E;$g`6sSLZKX3#=)Bi%lf<}D*p=Euy!2fSqf6JzR(Es1E ztZQ8J%jN_vgZ?{HL4T6O0sC)rd{B@2OKiyUKP3;udL1zTB3ePy6!kqW`x|F?p)uQE4om-vTE5?f9?$-9#?1H zpTM~|_x+WMPA%R@a;hs+CN>_Py%o;ht$I%D!>O9hsl~+=99U$E$8guLyEE|a?hWYT zSkZeRaNryIuW9gN-q)`(_YwY2hVPMlprn=(1Uc^V!nJhfp94ITaYl)RLHzL=$A+b) za%3mQ3V`o`*BpYMF!%& zrqHfFHdK$7DW-D0;eJj)6(b$2|1WIfa~CrRlLv=)YPz^5S0aiiiac-~<)-oh@d=sP zGqkpF?B1xr$DhSptRS3B&QB)`mzaBV%fZ(Ei~x%+W;;6YQ}HzEmjZr_Lrc|gP41@C zJdUTPdGgh887{7#U=3JAGPL=`#Q;H)E{vp0b;80`+1A0t#d6CLxUes?H@aUwK+Rhh zUG`An5{UbNM`|%mlX+{SHu5C0-wP?{wd7>n&bKfE-Rbuy&FwkMb~ku&CqAgM=;4=Gom{x3fs$^=BReTiweVhCiF#wkE+8-~~N8D8B5G>3=VK!}hJZ;tAXZZmK7ysx})3n27OqB1g zM-*J0Ow9+K^~>Z-btK6c_72vd5u+&quS}O#*SOCs-+JRqZMH9OXx4#IGO0d3PA+MT zmb&e9d?aT%+c%zZ^ zqG8+@4ofHT)0yks12NmQsa~Konb*%&Q3Z4ebHzF4H+r!|tw7*$I^B8K|Qcme*X_2=+WuY)HIT((s=g$RJ;$~&iOc;fg-BR(2E+Z>-q^uS z)l2dC2iP;sZV`l>)*D~7&QNJ}LK71B^!${q_Lh2l*j5?!r-s!|-IJct$Tc6zsy6De zxgz6*=-=EIjG;xGo_zBJ9<+I^*zL9R#n#?*2!plci`kU_-f{pnXg@w7hKz=(XVxU! zCU^?dqm%kX(4V|hcD}tgUM!6xw%O63BPf7g$EfWjG(L*VlNXC2L4`AxTF*U(S{Xr9 zHbrFQPB!)!K|-YszDQVVMod&so?>GNBUO)5p%F@%`IVq%lPhujaHm#x8l78By6^(v z{d{y0-sY^TGs`(A!9RKOm?VR;neKUs$L;y$LY474^HODkxMFSN5`O2Hy?1gado&7U zOm|j37WX&0UJ&q|qWQOtS`@v*3B z)@)4~DATshQdU>cAETHm=DvTS@t|F}k61zC>EdYWj)6bxDfyjn`lD~89JdNbEr&R8_=@hVkC?Y9NoWXV!&At`k&st?{X~q*q%(qp?Q}$a z?DSYxI2;R+fyZ&|YZ&-lyKKX&`vvuZwFv_y$0=gYXIsRhmNPjq(e4S{UWlI53U_f! zHQQ-GDC^nue3Hr~11Aa`9uvb7wlra;b~rt+m0xy9y~-cj6OD5kq`hess^1N4L_4;C zuDcU)j^2mOwpbeICE2rVZYBLlh8jgevNbXLBnBI?qDt3qqi1mEZRjiSM5WZ=#ATD@-lHQ;j|lVGdBVqM#t3H=8rm> z3j$Bm#;YuI`|3^J&9A>mKF&5`Pu+eUm%Ac$jEjibR%xav6Vfhxhk_2Ak)Pe-@wz9S%EziZIT(0y8^gsI4^ITREL0KZ(qs{Az~)T24gQ)R}`i2y9ur~x?T0T%U}dp`-5^+@!KNW5n5xs zLg_8>1W888J7ncGLdePGpC3P(+|y$qYIwyzg7cEmQeC%i0o0|E!RmQZ{9?c_+{3-0 zIGmK%HS7*MA$4=y8CvyLz7ZbuMxUff2LlUIxP+m+BM z?5{NLXE9r_XUObQD-rRiQn9mywCWIG<7(bzN!&4s@Zp0)4nAgs z)2&gKiOC9sHx)C6g4!c-e&8PCl}K0W-aQ2|$krUis-|FPYwOLRvB0zRO!=O?k)hO{ zx7Wh5f3lNQ9G?7L;nz{14AKysVM*?R*!HLN_`nw1nf%6DuD-4m^#0>imC}1jhL2q@ zyCdZ>cNMe2T}d>VBQA@NS47+e+q$boV(*xlA8xyff6Z55eSU{uqFc4nmhRF-fs{%% zjqPkW$e@(^`GN|0T9ei!oj?pLEC=NxE>gsC88ZO7+<9RcH{5x7M(y?BD4XcQjQi8{ z-hln8kQY);Wz($0lDevTMcf}B7U_f>&CDdQc(Js(JaeoILi3})-L0&n7LL9V`qe&a zZquAaF4_2?{5T?Lfz8uIz>+;OF#EW=O#!Wkc3Dzyqvxb{&Pxf}O&GZYJWksN zFZcX`U4-&M1W}fU=>7covQ#Bc2Ftobmb3Z>_lrB`!#tvGQ3rmmJ6AlOv?RRle$_p= zpg32Z9zqZbI_1|S^*!{}Sr)VSkAc!74+Mqz5evtx2kT8P70x}a#s}>Ok4j_Esnk!z z0Dp1Es81t<*nN3?IH3B_po(r)rFhb>j=ey?eF6oX*ILFBJ>2(NTb0|Xfm;BDTK4FBB_!us!RxxEoEi z;(n6DSg*JAnlU7RnrAOPezOW=Df!YM`}`Os7?X0i2|K=2n~mXxe#oZmWGu{tS>x!nLl5Mznje=`CO-Rr*i!fd$Ye8C?BC_!>D`2rhe z!fcp5MNi`EbTvo%3OvDc@vqV>=%0mMkgZA#kCYv%r-rMfjSaZM#J%D9U&6#jN5FTQ zQQXCXb?NFk9Q2O4@%a_4HH*U%nIz#wV7Lg;@;QwpkKoPE>+WYVpX!627i?3nwvA<9 z?F^iHP=()TTc&_@qXgm}ZQ}qi_d{4UeSG$TrT94~GUMSA^b;=E@h|n#TyJfIzzcWY z8NN8xy$SYbu?wTnrGrDa7-62I{7YC9aSy=026^SE*Wp&A_eV$+fv?UX1r6tRSRnfs zGW+N~Xty$az(sKg^#%aT`4QRi2S66}y5rH$AdUk7)on&5pP8Wpw{+f32k)^As|G>? zxfUZxY=+E0_y9WaF&^AA8U6r*ji0g9co+~mB)? z#P=hpoqG%rxIP)mKf9i%%}ro!ntE~EB2WSuKp--ypr*a%{aZL-ttHI8MC8{5uDbvM z^`RP8>@~|YeIOB90w_G{nm`l;5N;>Yhe%wru;eko9l8&!onqGnRAGQ{LmKBPRGU=D z0EuH8B^m&m*!SrCHY7Cnc@UcM(whxqCkW%FX*3mzy@{2Tm00}!L`HH`Aozk^1;XdH zlhp)rWMeo&D%5uyH_Sh#+0hy4I_Jg(;f#>0c30%c`qBzu-Ko)>-lP1msc~2hUYdP3 zdO>s(^#gI}`R7VihgfDSq7TRQY*rQt5tyM=^HV+ec*n+y!eMv=np;QeN;XdW`YD>M zYVj^*mNa!7`MwC~Qg2FRP|WqNQp#8M-cg3rCwRMQ#J9Bah1BNd2G$EWo*6|5hNjUa z_iC!LV@i7!=<*u@aZ5`L{Qb{0E;TZ66nEwM#5x&O!<(r-JP9*-m8V^S=UM#hPU2wJ zlidzWU-)M`$rgEvC0sbgvp9y_<du7(~$#WL;@s_@&fHr5?GkCokY(Evvs_eOJ?c{*O~z6zgnVw zB>Ko{lxbIm9Hhr(iz5(AA5vPtfl!sY^>O`PKrYo_u2e`VYmTDCJ6Fwm4>YgQ3&hgd z2Eh$j@^Za?!Q#7B#VW+j&uH_{k{iv)Ps7q+Nl8h)F5>B4;ugNy_U|&r4_WOEZj{ht zSxT#P&D=Wc^A(NECNcGzi>dv>X&YBNabBH_o$2=_XX$+Q3(d-TB!yY*g?8`m;WW>= z=BZmHSbx}K>EKy^1QA+tEkY{ch)A$|Z53EQMh|d%J1z(SHia;SLied|f4QRb@dcG`JL*66bn-p7ppUrlFw(2Z9Kv~L_`sv)@3ym)$8BJRyg3GKu z74pQHEA&s}(J==aM4oE(N4B$;$W_6_S?}?&&ebrV zLB4@Y{Z&H9WS!O-LnyN}u4wIhIMVR)E>Mx~Go~mMnl7`~SOAOz)^LiOXNcRA2 z)E86@%e!=?Ao0M?=>9#Nm*mEMi)*2{U5Pa0BKGH6+-4#jzMa}{ZI7A+B;LhFgMvR`d+n+) zz1TZ(F2W*~m!g0l>swBCvgfw8wr=n^((ZN^ByILMli@B*3M&SDoqR99X>k!HZfwRp zXAI*pLk)E^N;!twEn5@pY$uVROG9z{4q}_LX$_3~ zl|b@$OaTw#XXNQVV5rqDMDt`s(&M(|a+YnxyK#qaS^Qp4St3F7kQCMqV8#^gZ!1-B zspOt=YldXcl_|*3V$%f$DD`I8SE7zPEg*ZU^wR44?+`vw@3ZFPKHS~qFupw&t}}br z?rAJ@iYO^vXh)>!eynxJ6OTvo4R0qnJ1UB@4qo=fX?a$n3pmniYH;GV6I6BdwNmY@ z9}rq{W6(*KPjSbj^=eJIeZvDGE&J0miRY;n!RU8}g}*$pGe-)IK@<?+l3WZR8&$phJ8_|xhoLX(v!$@ zNAN!V#AnyJJY}4Pj*!=JR{FZ&(nAxu+A5{(h2c}78S5&v;1NUzo1=Mh%kH(&s#gSd zL>`ZXdX^?&4?eBg_2}=T3gt3=YPx5+e&OdVkr*}2T9GX3I0*Q~)~PJjWH9Iiux$@Q z!IT#|w9CeAUn!5RJGC!PRI<~Wob!o%FX((k_&R{)%!_*Wh#!|5_cK0e(b&|D+HBb? ziQr=sHC;A5E_(Wf103>z*>2et^fdUn1|ja;afbMK!!|Q(u5@;sRDtf%0H#)BwaeYIv-E+DN>A$aXIYX zv6}V5le2R@k_Uro?;`cIZuXWLk5X$kcuHEM$KCOb1?8+Jm_`x{bB@%@tssBRc_S(5 z_OU?aQ(xhIMc0GpHN-;!8XkkW5=L8!jw?Zx<;$!e>8cIMo7gLgCttp(eVHaK)^nWy zUI>ytC4&YC;MD!7QsOI8s_^Jr zEq2l|eG2#nk1!e8GaU5zG zZDAxRqW#*Ra4?%KgUB~<^P|l{Vk!Qab@k>t@lA`yw^V1WJxBnA2QNjY6;%;L`WYp{ zsR;S)W4u*IJmy;rz1b)=Bg=({KKxYg^z~se%J^VUjI2()aaWbegB0}r(tGehPcQf)V+XCifoI23+90nlb+f0g=xt({$^6AcaN^&0&k zYt##Pi4p}x_I@`Z6v2T2%OD{Ocy$>Iu>|QKf*B_S?i_NE$3R!BnF2fpw;6`Z{hEbk zoB#{IT8f-^Ef&W)e7U=E`wrRGet|THr{(f#cN4EhD(zHVwhaEDqE!Uc>%&3M*BbRI6@+jRB42E zsA8!=6l(4Qq?;eSOUbZ*rgtwGdP( zk_c6~U_islhq_-7aaY8B*xuO46b{zU#ZaWbUOECHu=Mu<1_?ELTJz`Q&9>a0CF*pCa_x(-1EW)nW|26nAg&RgdMFIj)b3ooR8dv_f4pa~7P6Mwv=u>Z& z=QOxok({BCQqn@zQys1*Ge zMT+0f=nbpO3a|5-^M>Q})RaB_Xber|YM_gbMdZ(^09A2m|X z)(^}-q`ZNbHDxbPZ=?9ZCN@ZIuCwxy>567!7Ww_U{Hq83NyeRn3J?GKp_$U^=o{T( zE}^@7BXq<=X8M>PEMmStuB8vb=1q92bdZj1TPMX3F8&wu1zhBaYb}ZM)}o~%p&2B% zeK9J7#8-7=!wD&9D2sH#uO=fpuK7AX+{#>ZAlOpW9fKS1bx7i#p|kHTw7QQ>aTmtt zReki_(v1k1K0oU?U?_P-Pah-=m3hF2&PxV1P7?drKkd2i8G`KiI%Vfkb$xHE6?{eR z#=}qrnM)q$+jK`RpHWEf=##?tEQRJzIkmhk={&z6*OR7+pstM z*ARev^+~9Aen!iWm;J_|))eWj1qrWJh6MF~_Q*@wA%NCjG0N!R7&B9xg@d10bw^KN zy92{KA=8`U3c}@yn|>dJ$8vwEbuI}$!xheyEn9R7o`nd`TeF}+lUTptIo9A>EN1O) z|L;P#A?C)V{&8yj|dXd}?)aB$^sWyUo>hZbMJ7KBi9V zI7tQ^41z<7_G+6vNdlZKg5hoTH!6Ha_Q&qBJ*Sit`8b~wd^PvJ0RQc4uI-ddrh;=h z>T%cCG&}CwX6}g(K#@x8aZGybtFlg|Z40j(<;X;pwX7}P2(Y9(ERszktaW$tsHD$v zetx1pRWQ}neA&{R>h-24+IMaVt>{&AK!V;=GUchfFMN9FacMgpdD)#TI*nAIt|=6; z82Tn9ZVjThg-*|vO2!ag4M;V2S$!7GHxn>u1(EKrHrtgB7%%9%A6PPK6>WMWnoNMw zL9r1srH?L%bXHFeGuPj2oiV8&;Ln#@+3ej`?$;5Lc{Ts7NBm63oXqt3ao4UQIR(A? zO|7d`zXu~dncDssdK}g0p3&aOaP4Th z>L~iA!e7LeA+j$VO0syD+>zHyx;ORkWQZ#76;=4Sn8%>J#pXW-PyijgM z4P*=2YCf`~2*U75!w7)w#%MT)9YboMTIF2?xV7ufZ96|9t=Z^+D+^RhQ$`2}j6Ru6 zx$Gd2Y{{2duG<8`*;zzY6ci=+oW@Ef8`r4^XPlmoRNJvQ={jXey_8Ga7*BuTTAdeh zQ^-|UH#uiz@8$8VXbBwBZvbd47xiusiXS86}M57+v>X4aTW%WG+#Uik)N7`#;O|V zi>TD--D2}u3dZ=dVLiJ$bXwP7zsPY(zz<7q#1N1xiUo;A72TYM?>txSs*%ADC|Vo( zaw_<7qXSXsQ-cU4Q3_{Yntz5JfV55 z*s8w5VIFs)tuqGx7_oLrmErn!gVje%<v{BS-UH-Sl=YHQNj;^t`sb%H=Wbfx zWM#iusgdHU^uPD1HMrPio3QccQhEKpD~6BsR&}YrId19NJsn;T5?`LtcPE&)=kWR9 zhAoj8+>qZrzjza)wEQ5+e(T2UB#sFEOt?D3g#P)uZ^GLZggfyxfz1KZ?eA~AVbSd{ zYYQ=O)pGs%_SHJlBJzhxH{w=YOQDh{4|?_bcg^k7E^@3y8vIx;?j0R^Mw~g3Z1j)p ztCTtS=w?Z!-3*RS-Wmvw&V72dR#O%k#KEzpWc~J zYlQ!S_+})6jAy3A1k+Gv=eUci{SM=0;u~~-iP(YMisioiVs#XrZ!J^PD(s69)jN0| zpEbUI>*=0IJ(JIMx1}eZA#7GE&9mNF#4Ty*DXzbV6JcHH8GK8rCu4e!C85ThLB#R$ zhOK^w_i-Nb<|j>ogu*u)`R8!@nFhYyF*d-kmeo)P`vSCv$ zX$6A74=3*^A8{516J&?HK6<-mGGUJ3nXiiBHC#|o_+o26!sa{stR?Y0O#m7zpfG!HGe)9sr;Ou;G3vuc``Q+_8bM}1Feg>g#(SZ z?)#`YG?Kxp)Jr~J*XCcZu1##Zow{O%#`2bVtqr2}Yc~itE5CSHlfJ^P5m2R$I9+vg zw@;^0uY1@ld;c^Opm90Q8p!4e7Ws}$oXgV9R2b5DbcCQ2gOFC+ zRq%&i*S=gmNann!yz-(Zl}09&g^*;rxwz;SZgGIaWgC8W`gs6ue}nwlk=1dDKJf>< z8SE?jfCu{RiFO(KsmiL%rs)b~C7EY=%R4(^;q%i3_q1||3M??Et>V4n zsh7!a1UQ&_`%Yd7ZHsSIS1`LhllAcI2(ofMZM!l*YQKN4iFr>vksrHf*d$;hUS{#o zVdx;K*%>>9zX56SwED@4^_>iI;iLxo@2n4{BmyY^A8)7oFyXWH?IT_)c9=#<#V&p7)g( z%_qk?L##pAOz37D+eYp5>A;@Lxn8x-qo!4gKF}y`nlj#u(tMPZeilZ;hPrnlr&fM0 z(yd4eoG%b*4HpVClR=+cw%+ig{M;-e)pngsT3?yL+mgS(*wW2rCZ2`1#qVBJzy8pI z=yI}L#cPRBryH)eT<=KGQV(4+)O~};ZTV4CU&1K;L@-jk{O%Fs>D&C%TZxOk$j6OF zN?|FL@Ic~^H6BSkL)-r)9;*jzN1skfXoS4&$bvtM<2%+RCA8-;lxB0UPj9;(e{dmE z!69jWEyJCCAe$UGGI^+5{RqExNYTSh`Z=Gd?CZmFelF*AqCpDDFpVS9`)9aoW%3M^ z@Yw4GluRdLciY9V$`C`9)s&*F`}BS8g!Qj)x(!$_&}-%HaO$kxex-DS(Q{{IQv=KV zle)kXsN^YrB(Hp=#-*ituIIt&3uR@>ro57Q@}5)5Ucq-CH@v&;sxr*UaN5)B6g)%E zC+>9iX|YxmF95m3`T0Z83hxQ${e5%zlcNEHZ_hkbd97s(rBaDnjTxR(D`1D<$l;_t zeWd-?lP;sKo-VuR2I4};dmn6L`AiR{wg`jG9lEh1)fcy95;G^=&o23d^HH|ySeJGQ zZ&NkPdk&{$k2hQ~ziM{(7w#dIF3Le%OgztDQZF6KFV$WMDdMH=bg(vfW>?GQTJ%-| z)&*nftt8z|gUh#`s;rjJ8Q)l(+F;R~u^B~Nijv9_45ON_^miat!$%j|;D>!3kfKAo z8FCe9n9p|KCCRWWs+sFD?-V7Rl*^CUd@S8&ji4t)9)BZVYQU0cwi$c9c7v&_)up`~ zO>)gRVzV{xRdZtR=5zy5^zEa;PHv>QCn5Ihp^I7aZ|xQ_?qHP`3}#kmRJbf#2+KdX z>x3rT7M_N%F?>-iS_uv!?$2t$Ly60qfXR)iFbMm2=Aj6>C!R?!_6qNFB|ZneT3#{3 z7}KjKkFpbP;zD-5X8Uykt_E{H?Iz~{u3gN<)!90lPQz%6?U_cUxF!j+;0?a}c^lQ! zkB2Ts^ESSeE7DQzp@>^K?tLOaO4+W*ZiDR@4ahhe$ zfIthllF~qC4=6<>DoZU*ac7h9d7e&D=NM#O1|z9_IPvJ{|FmX-Kd8H;Qyj_Di+dVC zI7p0(G-@fo(rsFYf`8=Od1+G6=uz zcSqvT=RfVTs}qb#E#t5|p8cTbfiUTpmXz86$X6&!(~y4cTLzpH&+^2=9DCG!DXGxwt`xNyPSFo2Q4$E z{8SE0ux5T5DokINHdL5)K5RsNF4$EzC5(!3P^N!?5x`J&SwSK3#Ad#ojpXvGOD{=*MxG?2n{ZUrSO& zLzhk`)-~mB?~&c@mFa0CedzG{Gx==zY=cMO+j4!Ao01cEF}>&ong|ti&aq!oFc+^$ za-ZN_R#!wKpI0U-C$Pqq`nI(fEEMfgB8WSme@kSfTfU(nmGxroxItysk3r~hxL(|< z7Q;oM`U-{s8F|nGUEc&o=!oQV>QRxd6vkNX@Vgr-W&5;FdZA=-p~0aldM0N$W^2@Q zw@W_6e|Y0gkBy#*Urwuf%YYxZXfou9*^%_eirI|~)gt=}dfFz5Zm(m+>?DU4I)@ho zk_sY(3uF2&A91=~DKS`j;(m1i4Ie?gSBxwcQ}~R_1D$6J*abn`G0Q!yz+S-6U#mXh zd^dFD9V-@t3Z_1bi}MkSl{R;-<5m_&noNEXCKcKiGikHe)qE2A(@|^ZEl`CfCw(I7 za;5O6v=!`1y%Xf<iz+Np;O$tYceFuH1$UC;`XAR=hh_-J-jcYi zvcXCnI;=W&xhHWt0w&1JKi z$E!L`LZ6wYS**`zS6BrppGWJg_l#Pqb)bjF?3gNjoY?LcJqhNvvoTv<+G-V@s4dkP zay`|;V2xVPrR_@%lu2XjH(w;}y$8+`o8XoqlIAQpI2|^_U+PG8a}^gZ!mEzOSEpz3 z@kbi7`jUz(IgHU2B-5NstbP&KpTy4&$(x^x7c{*qo~qC|Gt3f8c`OiVNbEJeb>WJ? zdf{eWRkEMiG=F5KE%11I8&I->X;I31GI1GrD4U<)j!5|AjSj}m5I2fA8n4o&b~DQS zM*2cO?d|ry8;N*B`Y4AqZgaTe`7v)-wNkk%EQP#ekZ6BW(*dOt4tx2xU{bMAf>>J( zngB+r1jAjhmhdPyZY0BpsBbV~Mh7*>?l&^Y8 zQ~1F|^_=wbqke*SS0!yPKd8x_R96!QEwf$u^Wr*{==i-HAy_MJU$9YstVVHY9qqpy zdGqtl#e-vh2|BO4*4CtkJ@PO@tJ|U>Rf)R1&Nn8CF)K!IFghr22GzSQvU*zbz$B|A z#0lzm1V;??%8)%h4dbe^!#%WA3pN=jj=$$rq7g*jGq@-1bKdg^OKTH330W;k{3R>j z)@)q>nnDSXV$aF)LySp>(VvgqcgB=7*@Mc z&P_Kc46uyfFG;|@t+6W6R-9!sk5O-K_OJ03O%|m_+YFqH*H=%IId(eK-;8Dfsv65_ z7*Dso(FM?IyNzU$?=YAv4;;*Bm=w>fYxwN8KTeTVq>FX{s-Yh@H6E-We+d984#@%w zSzMk25?OL_(L=pC^K}!6wmLL86^=|iRO=2WgrGaiBVa?N-iP`ZQPvq4Vb_yfj}vKkjL^ekza@B-OO}_>h>-5Dm}uwyrc4<8<|~1a?BIRUs9Iv51ucO zgTlZ*)r;#V8Q$mIHdv1er|Hm!tB;&J!N{gZgs0L;#U5#X5y$w!tvL-EIWc>_W`lM? zhmwdN8wmEvBpLWbWCaT+ln!K=n$LZcj^3maG$1RgVeaxNeJI+^B&39`bR{k(7Nw$F_J(@ViG~LpXJ!G#_ zv7gsdYRSBuCUcrH(4Q|9SZ=(ifSgi$!_JYf#kZcb+~}Qfk4Q&=aHKux8q-sGv-M6y zXl1*2pQc9})BsF`shD7SDde$oiTRwOJt& zY2K>5Z}ts+P}MQC8|fm1)5=`wY0bUfzLdrF#s@xH)~o?eX5!*lEac;-buXFVD$c~+ zotBWqq^jK=x1&sh-$l+V8o1TT6oTBtOk`yZvR#8GI^oN)+9YF;Ib$;R_I%HRtt6&v zhOH96O{~uMy+Gr4dA%lD#7Z;hkslXgRS?)z9ab@NyelM-8j!OK(=&RJnF(%V@EILx zu6#r{8OdkR)<#*4#1Oe{HDR_;92X<(!uq@jFI%p+P*pex3oKY!d#4t7@npL8p%2EAmjPQEf3yO5>C?q zj@hM5+#4k$Gw%jYhj60a2z$X09Y?hsKx@7z5}BM>{Jdz5RKTmdz~!_2r-jv?W3@&! z{fm+tdEYz)EqH9`9}C=#Qi`E&7PNZ5$MU?Po}%de>Jp|h>!bz`Yi9)|XPNG?!ZDw9 zugk%tif(5G5v5FNb?-%bO7HDsI-F070gg6r4)${gaRs1?3(rwT_B9+uzKQP94LnCk`U^~Y7xXn>QRM#Vr zLdR-wFFdwKf~Gr#gB^!kZ|jc;Lr1Oz}Y?hNL^^Di$WI{C`OLAKa@kbE}M|S`T~7?;SGLX z*F%njG3NL@`FWNP59otOfp=Xbg+Uy@2^;T;n5^{y#{b88G0M9PMp#QUYDkH8@sCr4 zyV2Dy5J-GC5gI%$?nG>9c6NK1mm7bS;yq%$Kq%UDMQ)DEPw^vlJN!N^R7o4rz@sA|C|n4OEC2rg&FR+HrAFRfB}3I&XhzP=+B8q<9i zDDl>7e`Xb9zVbjQExJD-i5S{B{S|>yGFsc#Q>45EzeRiP@n$p)BPk*O0KR*63l{GX z1D7lm+jb#r@xHh#mcUE1@IcCE)6VE~gd8Jn_v?|uVa+Vzb3^fzaDb(`$qJ}J5V=^0 zk}bz`+pg{CO**v12?583Ui*rr(x~LEb3M@ms=CaQF)W%0ZJ~s>Yr*c=j2@MW7zi{z z{T`_zq4>D{qynh<&h*9xaKIqbNQ@yL!uX?&yjr&N5{T|1HvmxIU`jE=?QX<6n zLn2)WKFL@<;glwN^+ot+#9ZH=;0tZ582S`Msnp85{jUT>bC?DVmRhvc#ZL~Czs}QR z*Hgio!!^hhyXgiMrgws=#UK@-11j7hIMv7oHHFAO6jH0#$LyOANO>GXE&r)Okhn3+fSS_x zia5|CFnnEP0V^Gh0ZyVfrGtB?m5a|hQD6+%C2&+_xy{kybA>Nvo=PTd#?$?_Znjn3 z{1~p|GU}#i^f`xh$N>Noz_gt2MLs5j$09D{+Pyx8riY>tN1|2BJ zalrK&5vR5I21byP-ohv|2JQ(7@SqPz40Nqd*E_u~Ei!8hBgEB4BlUcyrF;h;)`}7p zpDOPD_mh@o=st{!Il8+eg)9BTLV=&MoUGeIaG9R*)fF;af!1kmADRq2FH)&8Q~IV= zMcu^;n<^D^|7JjmR;Xtv?itU8`B=#pKI>O~Oq%5xF7zF5ACPi+=Xjiwh1AzK*L~QL z^^U{5l1lhd9o)f348k@DRlvzP+(hE!E#PFi=Z{HXo|3Jda)%MbvIy+0gRD1l5 zC!cl!E_Hyz@qJ^NgMwq#<6;{KR=;9+9<`V zu_CTm>h^8RS9m>^!kyr;j&(Wx7TrZMZg}~TY)anZ)=+Mt&W1Fe2{+9WKKZSQ7bGtd zJ0lEQDnMfK?1d%C3|^l0X)Hpy%l#@6?|`s1=|keKT{6c+(*9}?`pUi!WkX}*fwQ3$ zn$>K_D5a#$Sr0aaSR8#B?T0rI9|w0U`g*EDWcpcRJ3HU}jK6*9Dkwtc4#8=kFV?7L z&SwKXneI!qwdh2hl1DpcjHYVUiX|Q|!mpue&nQ-4eVHp6=ua-XzPBIiztBFE>k}9K zr2E;4SV8|l>Lb%DOjDuo%=WP0XFBe$C!++wDffkLO*J~A@Timw_Y5tt7<^dum1q-> zgxM2M;N_MWEy#|g#J?f51OK)Nlb1a1N2#`q#b>)vCD5IsK_$FEpIeR7Jg!zno_7V6 zI7F%zd{6E4n~8E>WQ{PL||3V8Lcfkw9-`M4M8mXiyg zqp9jredv_QYRx#yb~I^t#`;rR>8dsDSLWWege2}yXNt5_EF0_N_tEMQ2+db~FrI*% zwYyAY{&DhRjtz6X+?{&`89&3#qrhGI)$wN(yN)BlG&%0<9v8LyEYGtH+9Rxq*17V) z87Z2NTomXYC>&Qvw07PeFzBo?6GFZJH2f|MGkmQ9p-DjH-t7vCeHOtb4{H90>vr26DD;E^BoQ$J(%@?0 zw!6H*y56zrBmUU;c<$Nkwjplns+WsnHZpM9ZB42BaMgL#YZsui7*HdL$t`C|xi2Ts zYIwHiW`T!tfUiV--Kq83I8B!`2#i^~$1l+~9DFRx58+f4eEV^wyoHE~^m+cxL( zk}70#Zh=KS&ZCS?e?Gf!cXe`G$?FVdD4a+z?IuzcQ_oOm#KGvIT_Bo4*`7+27K=}8 zbkmkrbGS~uLn|_fp<5*<%t~mFsgU?F)zMc$&T4~Io#p=f;bn2}%H~v8#3vL)Qc-oK z0Pqyvg!~ROyuAb*&1$@;z~P_h$1TjsKOXIg*tM02v`$P3ds8wkHoYep zTi9I_?#`YSM!*hv3kdiwVE?P1&;<^#ND3J04?jF3p!o;_kYgyI@=C?0~1$y8SUZOo?0hO7f1vW zhyaAazzcea`QNrVQO`*=djMe-4I zk&<{7ek~$ZjYV6O!^Y0sDSLzG?)whDddGbTtcvHoS%Jk6V$W@---S{2 zjV3qN_q!k_F(L!?uR3l<<{C1bf6C)uppfzD+9Ijh9B$X}Iy=QCnQjV*J{!|B41DFh zb9U{NE2((t0(Qr2R61mV+a+lW!hBJ^tqJdiU|eN;gU(1TBf zkPY38t#23lb&FI8LRiHV-u)pev6c}CK&i(6KfJwFP+ZXxE*v01LU01XEog9e4=w?M zYjAfbSa5fDm*DP$6WrZpaCaN#4(BB2KHi7F>aU`B=*ehjd+$y-gO)` zJ=fk2jtR>{M(JKNr@t!{gl7K?QAD8aBJ00FAHjXdwh;JO=KgyCKz>(|yyhDI!-fBg z7s%HPN$#gq|96V))d`VabwQ%V4jBmlFW>~#9TE(}8O!P z;#j=q#{cg`C6x9Ay=4qju!9us2JPL`6;`QTnKondP6)#K6zE@5AtqAA9#Vl^K8?L=pZu zPr<7chsr?mH zc|!!p-jP%!e-+V$3E2}p+bTZoKh3-zsJ8;*@&AV4v|h)!l2Waa6aT97I13_p$|95c zhuES23Nf3sEC<|wk3>OeNYV|->&MZ^{~>mgUJ*M5g=v2Og6ruuxL)>x(f_GP`Zc%| zr$@W~2|%yG_5Vbhjj)OTgDxQpK?EW)7y!}z_3jq8!)VMu zfyk=>by}3hLb?#TIk7+sN{}Z4>1f0FB3KIXUPVj1V zlL{`ye*$=j0AD|q>c7K^ZxEW0Ax5rXna8L8Yjw`I5W)XL9fJAMQe6KfIBB;1-0AjS z{QmgAAx10#{W=7F*=EPwI~4MLf4!qbA*z}Hy|~^JY3~p6UI6KT@1bu9V8aoZVCj$i zKYc{}s{shk78$ZSemJAs{{=a!K13oM9{TRD4j_;UILP|4{FtBqcgulif=Ecj`hNY@ z0%Z6V(kX}=7fSK`UzGbNLnNqq`a zYz8GPwm6_@)Sc}ztYhI2o}LzeulSr;sS~xwptF#R*Z}bx)JTYF{KL0KbJ+Jo*bkTU`z;ff6?Z!FN zwW>-Sh$eBO!U&_zeCbV`*oWT4k5?154tSywhdJYr8UtKWm{{|HohI4zWb#=bZy3tq$i^NUHh*1L1!`xuS>?UYenHdU!?t zu1t8LN{b(>F)>w{m{@9Y|F}qe=|puk4~Zck%%-zzG*qgeKTF4c(sVfuXl!ge75QnP!T$0NY_*V^lmmPFj7S|z{}Q zm1#G2+}nVRKOC$gb$_m6O2spL1qISWN{s>fq5$C-2%CwBR7o^2jp$4KWLE!;`PSq% z<&Zn`e<&&f{zp;a3t^AZo4lM&uGd4jr2)sQR_c&hr!SbQ6~UrYS@@x8IPXV>B~_Y- zg|>QNmj4IC^-56@`b%Mq8H=36YlSmWy~*w<@^Pgf{D{(5cG1IR*ZT&a+g*5=I8-V# zeNmxN-2$KA89lAxL^wo0;M;d<1qcC-ubQ0U&&IQr*&5c0yIPg(GVUr)PWP>N{@4c5 z#JUp2T&;-5CU+2Q!`WI;4SC0aOTgv!PKrZII+Iu!#Va>Kl>sE+k6rDla3L8AWNbSy zZ$SRXnQssG(NS4S-IaOen0F~0NG`+WVu&q|vtq3&MAuwpdVr9SFqvgj_p=NtO5@oY zOHz#g{IrP%4kL3Mg`9s=wZV44B~eH|Ev0V&&|=QOM=>1wea&^9(SY?&-KIB7&L??c z!2zP(b(7%zg?q9g#hT9{b?d>9X#qpG;_(gd2-00OS}v%EUI=H-CkTOud0#IT?RM1O zZ{7!jJcU4}*ESpaMolDW42hf!ipBSb`C^`OE$r?#nUn$!lUL}HB0f$Cdhh&0jsK6g z7t`m8UL^V?2UCUbc4>72f0EN|C#^4i`s#SRy=~?6yfJC;y?9aZp}uWanpuTX#Fdzz zM86&_Ajhjb%ds31)(1^es}vf@F$KnX>-7bDQ?nN5;kX}jeI!x6v8z7}PR02Lqscaw z4uZV{Q>HCMiM3Quqmh0`1`KJz{lfwjAt5O0EsCNtn z--4Zt{uGDYmnd@88kDZr3tEZ zqEed3Q0}SNF?9JKx`HGJxlI0|GIEsq0?O1&2D3|P*&StmHprxv!Z7dM%%%JfAP+i{ zQ>iLj*yhPe-ZYaz|Abt(zE#PcgL3)A&OOcVHERd~2Z@6l1?0Al9|pNE;#+i3m4~4x zvl>(^6~rnEO!T>Yj&(;^UcADd6r)S~BcjzkJYQL5+{JpL=Pt~54ki%zh(gHUtpN;U zwpd{-NN?-gJ!!R*rE|N6aQ_%kjDD*xtH&fFnilcCd6b2465+onj@1fqSe7hvyhwz^ zu78{)B9q^O@T9!5()>y0M=G7ODos+~rPJ|^EcfaeYe$+mIqTYAu5VX#A2JUxTZ{cj z1NO1jUs#a5*9}rJg%Dblx+wA7425uoC2q>s8)+OKe=`Dt=+~tB2jnyNUv^7Yc?!JB z!W7~P^DLIv6QGs8a*ep_)p27DN0{->8O#t|LJBJ%Z4BGx4vQ@L2j&;u;vLn)zt6e6 zYTYcw-$q*N`c=M9tRoAdl2XG!4f~1?#I{$b3kYTiKr?(Q=L{OtXu_=4@12M&>E{Z; zpp*(u8j2DnT!4@tNK-+`561S8YueRmdF}{#dp&QeKh&(MJ&X31%rOVwP=>~G5xW_A zTy9h9v^2#_$FL$)thWU~99NUQ3sO1w5TNce>V1GDzj$SzhgDBt=>B4*h@daOCCTe; zra)Lh25cD9Wyy7)C86CXp2`ivwv!liH{f6@|$NM+#U@RcfHub(&6n0xT9JB2m=8!W!+FI4SDrr> z*QGtm>m!J1=p(H0uLW;l2@Tj==99C(%cE2BRB9E=v_bp*hZ9@vA$$BOVW8B^3AJlf z7ED^*3k4UMb!DSvAlzMD0S-PKpd%B%6|7UcK;_Xv@0CwQlVrx~nub$7KksL1^LnA$ z7+#ZfC`so$@AXop5(s=*C4dnR?|UZyaw8#19h22!Ghc)7vVSdLxzsT1E57fZD}Eas z`L@KKMB~`7$@V8DvbAOeN2QJ_>KZ@)E?ixGuAU-n8PTX>pKEZMKF7^BRars(=|y<% z6Ica7N;o1^)t6PdopG((`~;GxgT)e2cE9!zVf-vgvRzly~FYDh0m42 zL06aVyzoxOzz`S%ki&TZUfS2&dxjfzTtSyOgliqY!YG}|LW3w{3r0g7)rU78w(*)= zj0Dy?9?vaypg=r!iM){PnK$kUnP74XympVx3aW3Av(aD|2etkD?CRlR0M5xn=H;Hp z;8W?omWXF(pwC*2YR5~W!Z_2cg(hYlkqTI}-`LyCi@|Y5!w|^xKiC(+vp)v#Nh=Fe zqc0umhZeLILyKkNhrQPyiX&6tr%j+#dg7-U-xsGPY-y`}_DcB3MTwrQA4eO@-mh0@ z(2HgA(<1c{4=5}C82>OH)Kc1zlb_<|WvW2)$sj@PSK_KLf8@Ge?uG4(l`ROMqANq6 zu@Yusf*#zcyZ+cyp28uD7Qbc&1c`81hV zV$;XZowyBoKp`^5!U^l!dvHl6S5sMa1u*0EaK&4r?t2^fPFR1~kywP8@DTk7uB6nU zSAUdos^85_Y|8iDwpKQf&PdVB>f$^C=_m;8i2pf$e#mzyj+6Lnm-$Gd6AaoyWm}>_ zgA5!up}@(bmAo9DTT5|)49)1pm#`!TID@qaPGX&O?}BR@9g^mk^>**dGsM=pk%>Em zW?fE?Y+!GfiR)0=L$PLi>A`x(8Hb>PBE@L>(FU0V!39SCGi(gs_K&9_>LrpfHH}G& z-NRj@TO5Teiy;>mrL{HDS{MjHOE=wdBtm_gvsHXOMuWJrR$peBa%y26a0HsddJ3A=rv* zn`oOJ7;fMY!W80UxU>>5L_N1NNp}H(g_*J0MK8*y(-UnK4f(EG7`sDE}@$~5sSx)gQfsUWJ+QwEuw(JMq=-TybSP}<%X+qWz}{)sh)E92W+(9 z+>yD!_P%)7Q5|zT8u1omP1X@=6}n35>uQG&5BoJ8P7&^6mZkLbE#IH&j=(3&jcOcs zM533$NG1*0$);w8&)dasd)-Or&=KlVImc*2qe8?-J}*@1ajtm)<~evcfahi%2ZP^s zVE6H6=#+{+&w&SJEp}%>W zmZ;_}Ly(-N%I2t{56a54NQhlXb|JehKPtOAD^GNDu1qUGB?=+ALo@l{tE)c7sX<8) z_k+*v;qYTQ1u|rC;EQ;=E{e5!c%#kQzBVgqOJ!t<_>YzQh_uR;DkmLc4x2^JlI3sJ z)F2WS7Y`7Ci~Zxx==7|N)$jaff%UqBGBDs#vuOx=BS%0|B zZcV43NQjS4)+HhkiR4?}}4?nf#j(Q>a z_#X~^E}L+$!zkcP4;ml9PuUaK%oJ#rKZ?_jpkx_NUUl)#g`c(`ymFM&5%mYuyZ8%S z34_eo&1J;Eoy&CgXp-?cSvk8n1D;B3T% z>)S!PZ`QWx(x?`})Z-lD9oAo18ZJI+EnO%usIWBdr6uwbh$>7v$=npM<;kyly#e0X z=T!bOI9wJcoK0NOiy;3>X4P^a6*kBAVey08^WYJWux5lVE%D)ne_C`xF`{Uk9V zITAKQ(Mx>XG<86CC zY$YUitz_9)H6uGtKnIOJi>tPRV6RQX!0gAJwR;TT+J*4aIX!h)(2&u0DuJfZxPX|V zFZU&AYgd&6KT-|pGHbQK*z%`BLmwhY7_1!&vFo|=?MYQthO75v<^{m9f{bs)SQXYo zPpJN+=`v*SXFKn0~`Y;_n( zEeorsm{*XTy}mL5ZQcEn7;U<)x8H4eVWna+s*d5Hb7;6nDeUwMphOv@+W6Z@$zFn1 zsDCSsGN^$Nz~1u(3dy1E#t$=@&5M}bdO0j)8atR10w1Ia#rhM$hUY?T9R4YpxrQMW zYa{|v0q5Q5g6wwg&2DOX9?#Eh2a<56HV$tzUm0N`BL#jA*cFhj1m>ryRzAfdnLs2> zmmckQVufFTi{HGJMdOaGbMoHVS|OzS=i(x)k9l}wT20}*NakBXxo#H@JaQHy~iO0=zzI+;b&y$nboD5FYT_@8u0W)DxWJY%(FmAF&L>FJcNpAcp z@uSk@@p$H^xyraitFD=xVzpYXCGgst40ohHNM>EERl&&(Ui=h-(LZekS}YK#&}t2# zw@Nd+A@gWpAjyIem&>*Led@Yp^blKxGXINd{-xih<=K)SZ12gneZz28*WzkUgkJhI zR9>rj!^_=6wBG8^@*%*080v|V7?6OW-5&cg2UL1Ard?m#DJ&6yq=h$GLlAD7xvpSY zxDJ>^hr-LnWX;6+&u#?5X`<*kWwpLK=QC8_Y_S(DRFYn^Cu z=lg>!J42c8stx)DRh+!Ks|XjW_lV6|O@Dh$OSX$hMrdP(#}A_C$%g4x?R6?#|S3XPmvGGf8zRu}Jlf`w(ddT5tQQ0iFq1(M>1kECcqcQ}}G#(m`L6dFe!* z3a&jD+q4LMSZ|8(3I?{5=+AI?7BNntr*#L#iq$^CTHpuwiCFh0CZhD<>c?MT;L%An zOeUgf?xsv#st%?6`eXKoiYrzH@eB7Y9lGIl4uMj&&l1aJIQrZLTuMY_EQMU~&t||} zkT6|~$@dH_p!vm6#1QiZOKdQDj-1z(lX2YvyTn6Y{=AKrbq+1^Ynvs&XnIQWPc(f( zg~#IxdHshem7*gWps;ZFyHNhaqz^1{xNz!mvYu+|Qq- zP|rjHrL+|ilaDyginDU|gCe9U^nk~c3+-Sk2y0=;wV7g$#ETY{b~(;1K5wYub6^5KgwUgN3x7dg!WQP-wc&3YT&DkGg+BL1B569tt-4)fooZ#R{W z2JATt%V;&Il?JpQ!#i)4r=w}UDtda27G{`pnU`XUch~^tq#$gsOdROa@OKX`TaZlY zDCx1|5`0?$Qx%$vfYN?Pquk=7|MhF{uXj)iq6MYF5xG7Br10>;YHvPbqAH+bqQ1-b zdxsWJN=0zc&S6I4uk-R?Y_rzt;zoiXNqlC+;l|<6T3gFf>(T1a>fy4lONw%W>JjwV z#Z8%`&6r`EZqkLll4Pq2xZAKr5YFk*jfxkx>nAB^Yzfm966nQjyXc!p3Y_ zUwC?ntfyNr+?BwLBTa*VOJ*tWNM$mdht8{YHoS$0WN|0+73on8myd+xm2@=ZAl_5N zB2k$4JHygn-Nay?#5R(Nk9lmPmulmHaZyHsni3hQInsnZB;QatNvaT`FOOstyPhA& zt@kQCq3t*coni^HuV3tA)j>fXPvU^sFE00-l>G%aYz$#)h-!$R3*Ips4wC6&vHSf( zM*dVi>fR*0Vx-UbZNDGQWD8`m-;Lsj44anh^=*XhQ-O0jrXa`Zw60k~79}7mDXzi@ z=KUBqwZBg2Ks<6rtcJHz;N&-_{*&`C)%XVSit?2@jmiPZ1E1QNkr&JL+od`yN~2Aj90>PDm{#*bh&fn;Wj!;A)y(xa zP=rZ`T{!x2uc5Gs_@_^L@<*DVNIayu*b0kN^Fy&yQu||eRet$g?gq`2$zC#_FWw8~ zaT0qm9Yi(QECT=xJ{jk5cro50kGv_``Jv!cPXgso_p(8=iH-Wr&1N}k3zNPHH^f1^5pxyVWz(BdHtr&1uSHK zWpCid+62Qxp$5&}cQ(CPzxRf3Y*-+=q`(4zl*uUkCxt9cUT)@wp$+HLu-=`m*Fxzg z2Af$|ZbG*-v#rv^BL|!Hq1KUh4q&aG;O$}5EiC{0RnDzn_2SDfFqL2`FFL5lBwGY$ zbxJMssY5h$EQvUFKJASp%ADG-LFM24li>T`a4{k<5PdQo;}YIN+QH0$V!g0;+*)xx zckD?6+74l`)4-SvyzzyCLlv?k@MldEp6&baITjcTM?F;Shiblv+|xTp1VjF7Xm5JC zH*`_8Y)O#E`K+iIgVOZmkq#a1F$4cjD2e@Ac|E2V2Aj#g%CK-MC(`?wMk=m+9EsJ|mvL7*SAn5Y; z4^m%*asiuE+aV=o66d{TAuD5e8I%QsJp-PR>`nj91FszPnBCvSEutllP+S5yVCVHp z(ECi`1jIa2O-R~ElKB^sVj1M=mzs>=7<|w3wr%hA7q+*7*w`QzV;P3DZ+Bpq;M=P; zbPn)`HgMh>n~~M(CvjK~Pe<*Ek#IT;C2wHJC8p|&4o>c%NgIYC=9H}|7=`}^w>;yiUiHS%VXb;x z&m3ers0K`VoF+BFb1KW<6!AeW{1G;9c6dmI`#4O2dof^*3!0~IIm!vD432e~FP1ED zHR<3uN5nn2v%-e)(goG|AF^4{=ewwQM~jVfM6tPF_20D(!JteR*Jy}(#~$#?Ze^3!4aMCNdYXqp>b2ajp1_ucG(>CIMieBye}w{l}o_xdM2jfPIg zcmO*--nkGcxG!fNe2e^WUU3>1H z;n43IW!g?^u4J8F5fcNz{7OmeeXptscGw%cn&y7m?{XhCLLe(R$eKD5z`vF+vtZ&n zzqn%_6iWS^2nD)kDPJ!j3c4+PVDSQ)spOKuMNLnv*-TzfW+`Pp2Z;W9BJ>RJ$f!>& zEaw+%@5m5)7nVA(o7z5^py7Nn3Ug|RTWbr~K2r@h>v>9!%V&d#l+_$+-QHTdBhD3} z@e*ZXG&gwG+>p_`=+z)APNRB&?0#4fd3_%Dk|fYP+b`&43szWaJbDuWb|=o@^a`h0 zR~kMCcC{-v^0S_1tzO?$ektB6=aBq4PO|+K8F;n8GFm*Kcjan04R*r95nV&(6OAM# zA5wsE{(~BtNGp{U`Q%qv5t@wxNEy0Rj=qn5whkiHjVwTrM)?M)t}R|76N8m(>)o6g z#2^LdfY9p9FBDVnhSgd|W7acHUbvmiI(yw%ttSa%>h;h75xS=9vW7y7RZerqn?R8? zH{=Fb9tY-gg9cx3v-=7a65D)gR!8Hk(C?(U>UBi-#B1kDYd&3<+mligFu3U%;^MI9 z=R@0(FsDG2Jxn_vd+f7cUHhwc)@xL%H!7cGyz+i8BO^?Ea|y6NPwtT!HIO9po^m!G zN6SL4hCYfE#cP3o2T@Li z0=$dHMoWj6v0715DL{I@-SbmQ49?k3!`PRIF|gGzQxS)Nsg%IGlRsmO5n2G$1A`)|2Jx6s(bS(Jxppgv5TCh9mI-%oj8gr#}~q zt*3Y6xh$MDc<)Rk#}XQec`$%xojgBHu-)P{9GN_@Z;uxwPy}vbYxJItmfAhZlv_aT z&KfV`p6ljA%pG5yvTVfX*PXu@ji;!le?D$K;M&1<_8~3yxJq>l)ctVVokoP1H81dq zemX69Kt?VtQ-s=cgD3qbusNpAY&zsQrM9pz?X=C$y0sCD&TdDQ``m1G`-?M#wT_3* zTp^P8UGc^5)z3KW{UdXSZ9oG-0W}2847I(#wL+UKjVLSCSz#5mM z!ts=I!#ZP?b7~9yyXtQMU~QJ7is-mvV#c@J8$eJY_muP=Ax^|~HMU=oTHRp>J(Mal zBA9w+L&)nYm3*dg+CrGQc<*-&2QXECH{*@>c&0EJ|5G%ab#6azupI7Wlvf&KWG*S$ zetCy+!&bG)(!{s{z;JKp%cjC*i`VyZ6%kyHYll!y_h@GuP5CDmq7O8}<2haf2YKeCcn$|M3!6UKuCNEKed-=WO|pM`STRb_~P`KrHVeBDYC zAdfpuaOB`l>w5(XRpN-5%eLZu2!KW7arSRG3c07uy%5G6iS^J zQMk*#mQwPdKh9HWJ=EvS4p_vE2?b)Rdg-KqUJPOWjvMz`Q} z74kZlT`1fiXL1f>9Z(tD+DB>gvoB@Y>I;R8aGHoI=IQjB8Y`HxqtB`2l3`EA$> z*`)UnMqe^`20`BhdpBXWl8Mo32@Y5cF8au!>e^;xHRdO*8s_ zif4Pbnd3Wdk6l(P zt#+9$$jfkKgwBGau7+(pfKV-ReKVIHrybqQ+h|JsF3;Y_@W(4{N?z6jZ&{OQJlJ{O zx$s@*KUe+q|5jy6f;&_Daketu5B5@VLi@OF#&ScKbg|hD$!H{fwy}szydu1fvIyoV zOEb}~F#MR|67a$b@S%>}ysysVfAHg?&~tE!aKAR)o-e+-nk~6?!ZAILMuBM(pH>o^ zcoQ4V&ooTLds(A1Wt^=WO=R5VA4u|2_2YYvWvWq;NKRQ2B1-MSr=NY;w%Hem>6}4X zm$wO{7r$U=B4Ac)?hk}uH8AQxPuC(kk}mgLO$-_12ynh=+?;F)l)oM`ZN zSUsx$gv|Jri?W#UxV`vt1LOPI!!9!wHjNjO69K1WBJUin=HQbM#idTflV_SHQR#g6 zUDn7JN_}5@OLbQMVUPSpoZ!RGd`yyuIR`TfmRjUsBFlv?(}$q9a@bzAg{i_DbVVP}B~7C<<(6b!^2o>lV-&+s@d6t7?mR+2 z1go_V7CZ_?g$6>$$=8L;Vg|B&1!h(0kU?QQt;NOp`Zz!1Xz8OXF zYhHhNQ;+j3%g@j*d8fOjk(g+s!)%n<4F#z)T`jLAR0)NLkpqP}@w$h7rHUp-@r>Rf z>Uf4L8Qk1)xmdDlf?xOtmvtrzS&^GsN1^5$;Dd>N32#(Swz|PvF`I#-`S5=M_TIx; zZDsd_Ul^E!zuzU6Nb&C5V$9s1#00pXZ>yJw+Bhj!(W2uQ*1ZvkgV0& zpIZZUDH;=;&qq*hi;17Py{JBRG|)yoJi*Iqd8u(T9|s6cV1M)kO{Ue9xLgAE_HR8b z!qStQ9~>U#@?q1B zZoT!3N2GePwr)&M&sa(@ic`=bzAM?*m^sfcAw;ep>;-@l> zq?bEJ7wzABdbazN0C=5gjzN!qs^}oEs+xM{I`MO~&2qcSW0({YjQe79Jz7!KMZJdV zalCIPm6b{5&@ke7{q36XvyPV?*B(<6$2L|``*LF#LCxMs=dgLv!OUROP9%}6y@$wg zmQv7wBowFFCm)7+_31XBE@8{(_J{WC>H?49>nV@v_Pw>swu9=70TrG9T>xJFf4I;! zcII&$P~|3K8M=geR3Y=>*BW+C^Yq2_d#@xs#*kk)!FnWHwp)>%A8ndL?rhtnnjiS+ zk`rv29qAA*T93ScteMesztfaIt+-`Rt51_Ku{Hg}U`$#^e0ztij8 zVCOA8Cb9p3*zCkr2VC)+dS(*yDBa(^uNep_Zt9LH%^uXga-$W9M5T3a4Guw%=|zls zKDuV>@)InEaIZB75z^xT$*Iq*q&-pc?0|r zVRgCbPO~&KkacYmHEUh1V*fm}5n@px+-cL;h4eGzafDmA7ICtD>=vM7nWm#p?Gd$B zka`U!x!%w$bfKn8qT(isqTAQy_XV1~?ZMpSc?(nhSjhKUJ~c!wH$>O@?CMATEqrxH zuAQMUW9c>;EIrkPqZRdlI3Vw$%LXs`UVmk%Ys18EeJE|Q*+;l*xB;aYc#hK|c;yjD zV^zaJmq3;|gLP}noP^5A(jZ+{h zX<{;Mop^*3MIGpy^)>~d;Yge!OF*%k~R*L(5bG^HL4+!>`3m;B}cg1xZ(L(HNM*|O8@k2%jp*SglbUH;Pzw=D@8PZI9iCWFBbzAR`W>9po0Qbf%tzxn?$~l%3 zmg+SHIWDkKKNiO(vP*uOJx@_V3e&JNzce8ha{HZv9qFCit==(Bu<;w_bq}bD_4lC| zwVbHH@r*Dr&xI6cFn^?qJiZuSQB-c!Qhhe-xiJPcgvv~FrvAa9+I~2O4Kd=OiH9Ja zCj=`TSHeTB@a7q68WIBJb8R7C&+kFXC5nr&A${};_sK^5+u{G&p0_u;PLCUNYm`*{ zqYP?X?7XggqrgmZsICj1w=_kN8_4As=h6t1`WqrCUNjt`<$1b7Z!bJqO_lP{5Z1D- z$!g*aIk={^3)dgQ30{xDxtX1M!fUTI_qy{t-3P=)^+k2Jv=*dPsmd8zyz>Vi|HO~9 z-tE{+4$X17o)pk>(*t?f=Xa^h-42P3g)vqB2?&faKnvq z`};oY=3=3v7_U9fH{_hW^FVamq$IR7_;J@wf1t}`5k9ZKNC<6#@0x*iwEhtqNQ z+hve{?8tH2cE6rp38=I0NlXrC@1|DVlk?8Gsq~PUz+y$#H+yRCCZ$lfo8z)eX&4JT zDH(~ln^?!7n99=imZu~oH55q=>&*=@g>sZiaoEX@ZCnwPZT*l3^p?vF@e`2fMUSQa z5zXdWq@aQStYOw1dWwo`a3GjLUaN(?xO z(bf;y&;gYNv$S_6+Pb9scQQxF@i72sowgB3dwkCrcj-6G^i2T`$_)9RcH23_$4fu@ zYs)mjhnHk-vHjEXRf&p+l(Ms`sFpwC)K3u^Umd(2g*tR+0Y}5nAFuGQXQT<-RQ9nn z+70PFr!E$=iBN8+@x?zo9d_a%S_Xbi2N!653P)$){SH)l+*^05GpKy1m_rd5&$Ucp znSK!wr!okPI6pf3DK|WgvMz3wI+M3GkD2}M%iKhoCjgb- zrhOr~#&AdiD2-KA-g*ZMuL-(ME15s4oH+7?ozfjveVQU{esXT97v?HmDGnHC;>5QL zU-D!PK5g3Mb_XpMnGP-?CB^Smq|qp5f!T`mX;EAo57>N=@%e>y+|~#g!;M^1%#~Z? zr{hXrcD&@gw`igYE8`MCOTNX zcJbY-b?B%mJrYN*A6eulBY;x1bSesAnIO~kt{#36`mgMw^ZDjEz=6QdmPl@qfTV=m zAhnI_C=7XL&5ee0PAu>&*Jims&)Z})zc^1^J3|=y({dS;#+wZK;}0I*w=yC$D!c5z z{64)vWrP9pCe76MPtJnTjRV@=Ib0E^#wCK-$b8W5%2~5Lcp`O)rRlXFP zl#5u~ND7{^&8FsmOn4vmA=gX6-PKw8{IJnk%oeYN;;dwi<+MY}|| zsPG!nGFX6m$U66Tm}_(J*5LMr^@S2%MONUITL;lsIrYvT`b4{i?Vt?M(4yg=-PPl$5lKt211trOwRs^7w(D>8$L#Z~vV~ zl9()*u9FF>s~qTtWwQ>IWssXPA@JOwhoGz{zNdJJIh2*;ML3hDVzng3;CLj$Rb#YS z;|`Bk$vc|m6@R$mf$g-?@1Jak0>8mINuhU~3jn-oZ9c~S= zc}xbmAe3X{qGRLCn-pwf-OPe3O3WnDJdxUj9+{+p=bIf_;$kGGDoKC2R=Tj<9TdAKOC zZ^L(wgGj(NF!JP7wXVVsXARVq%XB`E$jpa3PmLC5vIHuv=-bN=1F}G=$udCF(A3;+ zhKK212e|mafUWrK57EJ}ol?MnUZ6a`BZ}wsD2n}>$vw(eQzy<~JQEpkIKwYdW?2xz zApLniP7TUK?s?d~@MRW3hyi-#K=vnN^-#ys&oYN@HruBj+5IF2SdD=lnnp2BDmBHP z%q+U!+`2|)u^soUyhh%>1Q>#E{R~h-oduE@V2tTdD**KxbvU6*5t(_bn)B0aU!^Bo zK6*dBUu<378O&(R?){UZL0(M}4i6HY~86hn*T1Q{QcW z$(}>80snxSc}wQasH_V=mF~japNzD5Dk%^3BFHf)e&DK3v(DCMx;rPx1GL}iR}2e` zql_93mwre))h{}vvbhak173)}0qz=AKpJsVmUTf+-@JmqXQBnkPpJ~sC8Xp9(zOgJ zE~p+0l5+-&q)HjXLm%k|Wxh>9?IdRNNMCg2g7!Pxs8%w>DYCw4J=o^ZsLGp4Hz9UM z1U;7Xcs^9gINXiS4~HWd^T4*v23{59iHJu{T4xGPRM{GBh)Yx_0eefPzt;)!lOy=F z-Vx=87K9Fm2hB@1@6F+vJ*|QGAN4K`H*UZAyJcxuCNd;&5{>T@Hvzfq4lzB~fKH`a z)%aiWqu#eXV0-9R3?>C(m1`80nJ%AtGK=J+d6zQ|E82!~-#*2zS%66EZI%QRo47B- zM-t$d9zW`YFjpGlgd7CxN;YHEm+1qobF7Aw$Z6zbKkt-ZlqQzr~y(2Y)SIANCj=cqViVLOg034OFT7OC%OXrtd=BOa0 z^)sbXY5B#ukEfbuu?f9i-;epdVS6BQq7lTckP%t}yj$@MDA}`!8i<$Ony-9LGckam zhn0ztvxk#IlI*QZaH~GNK0qKsN>n8!L!P|&L$*a_mLk6rAG2num~g}77qZ-F@xZ?B zn9l!o{QDO{Cz}xw9<8xR=G}6*I+G`{ML@1ypOkVon>1(`9Xn%ywYscsD{Jw3hmO~C z+^AcjXDz80ehI7Yg((hJ%XsD!c3K!l-1(I4Koq5Z>57_Aat61jn6Yrj-eR=kSHy?+ zf5zk|O^bVnam3vM^G-o7)6(*Dh1}&lN@Jx_lP2pCs_4GvUn1U)7cDsz1+x8~Zf{&I zp5zZ+#I1uni{naRG0x_pN!T+=OyFPAyTp&+rI!|VE9H~B|JVkWEM2T2D_^b=xoieP z2>hh&;)muSDHgls6_2h4{B5qD7y=73?vRdV{EIV>wj5bczqaKZ-KCzVyZr;^)HHKn>$!KL zb;%Q9utr6v3c+)7lRmr~#*b>+^jzNpVab1M-%C@PJ2or%c41L`)G1kKbi%ArYe{|v zmm-m14OqXsr)STsxc9)a!H@7DS&&z}*(@?Vdv~krxC6{wiqQE8>x%nDbBuQ~nJxp2 zJ+4Tbt)eYZly+9yJ^cCencl%mA11dGb7()x)1M@`VKG+@>3VT<1+=yF*5}HUx}RNV zZ34%}i@YA2-Cs-B+gRH9^w728x1@nXO3@}kSVL1&RZmj@w4CS9Mu;aYxlj&Y>s4_ad2gZ`qTfQL zeVxDRTq*yml!?YD?PC=BF(>HvirDa+)pf%CkW$p;OH7@=dIED_*aYpGi5(q7(D52L zi#9?JFvt?c|9LEcAr5Y_&4B|nHcS!ciZbLQXGO(#24@d<-b?$A(4eF8QkFSPsnqnx zV~4ydx7*_H3hftCnP#+s|X= z2w>3_r64AKi!4*mo7A@UzlO6LOJ}trAM2xJ{&CGUCQ46?xv=T9^+IrwLu_|H6zqQ9 zzQ)%(BQrkTmF0OK=@{Juz!UH3z!Qn#bvj1kKJszpI4zLg=gN%knr5$bJdm&KU{PDJ z(rEYRcLh;*&C_a*rSWw1D>G_JS92Z_Gmp8qbY!7>UDK zo~z9MZyyzV$y;;)8BFQ%?ei3uquVCb;r$@WvqZHwwbAlp!nMXK9)17NL<^tCJ=h&E=`)tWGP3G2v>kYx%gz_1m_bo)1VG4a zaXY=aJBT{SgV{-Ae{?ux$@Sg0%f$KN3|9wl&2zlel4dMRD5NW=J0MSTQgpR9b_r{6 zl^;vZcM-|WNG-!V7C3!nbC-*D=8~HMh{!39>n8&_T)a024`O%ZGP)9Fa^UP1`L4^y zx8vZsMGc0@&*Zk(dSSNMP=JLQF8bAZL&G+l-&ctSw81acQ$==ECP%3R2uR?R%AfV}f3_|{)O;{_V88-GIE zwZ3LqK{y>yFL1%Kbo~b4w3oi-n{o4tX-;8@J|lBcbk31-wRzvHPyOzTMesN6j-|MI zw>v8~#Cs9Gu&vY|&C?mvEFWJ>4KVblpH?T&;kFqV(^b$jSXC5p&M=+^9ig(mJ~m7w zrz>qr)OiUwt`oJcT_h- zr^BgQp}xN{^CJ!BUm@Z>8F~4nOFI++?E(M^ZX@A$>wWqqU#?w~)e;O}#eK(5!}7dr zD~q?%MBC;5OWN2Ez2$diw-_Xt2 z%}T9mBSB1p$wecM&@C9HBqvKa+I){-W%d_`idhKmhMGBD1taHpT=v9I45nw?&HG_j_oZpV?q1hOUX90?{|O zNM+S1r?z}d;dyTq->(YTSrD=ds`E236uUnz7#gChwao9Dd74bAiRHU3e{W^0Zt?CL z(;wpKzexS+*$UMi4;#Mpv*}xn7s5`}n4=Y!j3jP>k6aX}ZvJLk>CLj;_c6{cSg2SWC4dW#>%hp z%i)s{9XpZru`+$TPSlKLRr&guT#fDPp$)GWdtnq5>M&~Urf!a2Mgj4lSrt~5Cv^sv za`Kz62W^uvCHn*Xc;r$q!fE>%0)c{nx^c2DL!q*0uQ7^kYz^67PqR0IY|Ix9Xi}}q z5%j)8%zbZMa58=ZoptoPscn7P5YHckDZdJKbOClGh|B9!x40-aR*)7MLN)csZ=#MXVRY2Qj0Eo1zl30-^tOhl)WmYw1Az=b*ynQ99kSQ=6dmGJI&-*?JUKzAfPsTF;R zm;*hPN6!h9zTfWYlZIuB!?Jsqi7v(V#ph|vV0wp&-`sfEv8l=wt-CV|zOzzkD^NIJU8+)XNLGj>OW3+s4TiZ$Di?Zq2;y2>4 zTqTxb2)A^s%3AY8>fc*E=t=;#gV(skSkH6 ziJN;pQJ<{e&|ub)=^sZ96b2e&4;_AEIUEc@^z?ZRGOV-1$e3m%LOqvb<;d8US>ut;;LKztGm_}XcCSR0|_ZqzlR-$9n3M}2!r?DN)&61)| zPy4-Z5SerSHz|EQi=ouSs6$+0zJ>oq3@CZJ4-Y-v>|sNk4w|WD8nYfKk`N<%ubftN znGfW;+4hOtlDD#o_oQVXy|Hf@NJzRMQCvqckKz?H%_8M36-B+-92=Wz%u2M{|8);99^D65S*`sa40H-9yA8#|=V#NG7#W52BD* z(kG`(;>{0I-gW((fPQ^1Zg@qa!%I+elO%QUz18aw`@2Mzh)w*2G4TqdoNCL~72T;_p2}~YlC*#tFUPm}q8|-gVDrySYsNPo z;RWkF#-F`EEC;OWSOw$#s0avSBq&kEgq)JqDn3CcgPF+BofMor7d>{TPINDp9MNcQ zmLTUK{ETdn_)mBhz6=7|^Uo)Ro9n>8-qWdcatEmAyUGb-sk$W z(+G#khN%z^R4fOJ+e`=|W?*lqw_e<2u+*#PUb)G6lerk%Z&;C0@7d$S$O~X}H)#ki zAwttrj%dT}cvaeR;l1rLs0Qt%V7^_}SgN@Z_r|a19nHVFTfarH>6a-dg(^(N#F%=d zO0%W*vxV>={6^EM0YmPiJjeq3ZESkf93Bmaa$h#FqQ!9vqgqF9-(VYl)JbC zZGtOC#!dqfzYFtUNg^yI@qflfsCe&t6(k}8%J|uz4royYz_1L*;pir5raGp0$iK3q zMjm@Y$-fUm0bM=96p<+2c*6vFG;W7)@@h%%_i=hB?djFTGqa+$`rP0LTj z%ytpoh3q?8usx8L^lc{>JuA*w%!aC-F0Mbzy$wQF&38RQT@W@zx^F3My6b#P^1S%e zbZYi{z{lhj&~cL@QRtm1BecKz~=xKulqG1=c zIs|dIA64Nlt~AfCJ0;Fx4H|j}<2$_+%aotoxf;rTqO9`3C!V!SLuJBfw#5iQ#CTia zt<;f)8Pfyj96H4=|0_`i+51c&?*q5gCgUikqFjFuh!`%&d!lY1qf1z&}!8(^_;)906GBq-OG~P(;L6JkjZ=aW?d@~;@a!p z`Y=*k5znV*^k{w-cLC=)7`;tRj2R8l+*ZB20KW>o&>Ef!diz@kCBVZr0x$v`$Hnv> z$VyzS0=aviIrzdwXGv*mrfajFaj%bwke;Q#Z()@ucPqsk+UOOIXH2-vJdi2#U2PTv zA63tVN8m#C`|lc|mM&%=CIxYp*{Fw4Y5c+!VKk66?yl zqYg|tI8ic-of~>kt{QT{K9h6ou{o6l6@;fV=PH$;;Paqji3ncJwWV#(SNKOjdH?+@ z0)U#8bB6!f-ZLrY$l+G#He^^UC;G+d<#`G7WYbw|=?;#G2weSFLbO>*Vz&XvtC~sq z%LAX8$bJ@;3gbr|ExuSHqT99=DaxDurOPKVBM;khFlrk-R5a$J2oWF{HNL!inU%`+Jt(>|39E;!>zNl0PuqkL9y676`xh%>PuzB{ka4!E zx`8_aGt{F}>S%rr1ltV;Enbh`SkivZ99i{vIrbt#o)BgEtQn&hf!h$wu^z2Ri#}Mu ztwIOhINyMRqfy-Xi7XBP<%5VIQSLnxx}YFF0*1USQMeC?E)Uz$Iv#rivu45K!*b}U zxyo36{EkK7^!0bVyGlx`mSD}qLe2gDx7D-x&W^A_4sD5Isog%zZHckF@%2+R(DJ97 zu;D%Fhh_j8}`(V{sx?A%{%IhW{d_bN@)A^d6RX}F~CAyk^p*vkt z#+s^Ardl+3CsOr}6^J)#Md-_98ZJmUyqrqW-ezZ6%{uH$6%j#1ldHoh{JxvC^JRkb zFB_Fpd>5!0>#W41vPb*)A zMYaWSmpl~V{vgJ+3TTMLEpZ7OBi6Lu? zv015@{0x$|InH;sGR!IWvVVKslez?@x(*lr14h%|l;ZCwZXNTVe0sco%n^XPj)w=F zMrI-$PT3YjZ}R`tshts8{RDwlu>TQdk3 zrTuh!6nOMGKx%L z0kgU%a@B19*!F@9Y?GqpfXX6)SAx02`ka(g8vZg!Ae2Y=(|&J7Z-tyx5u*Q`_OjOc z^zFTV`L7mtB}F`BuUw~((u$a3J!@*ucg0o5uVshpLFrDrY8+jjJo{g>mr1!~FsC|S zG~FIhk`Rz51ZStB~q=pbxDV^2i6Ymb4)TLsBVDW_mjUDn$n8y!+j{U4av zXQJNQ%xOu6^NBA^rrU1a5GJ^y*b7Mt6o>Y=Z}KV}5wTp3)cF7kMz8(JWzIdxiE5P3 z1Enu2f#E}4T*uAq?%gEk(^n$j4(_6ICRP*3wbD;c3YyJmcZ(YAx;cZ(Oa73N`3Erv zKBkYFGvzv7?HA+;oB`AZoX&hgayn@8Qg75!z6)-D9!|DIDjo5R)-DxcvA;9tH0Q+a zAa3@d!^#s&O9NAbzJn>b*<<}c!wF2Y7~m;()Zi$cKj4^h!J6JWYcE@kUlI+(ALKEF zz4K3Eh0kID3iZVRZ$5i|>LRBIn~AkqmcxY({x+7QHU`wIA07lIjVk5Y6+oR1K>P;J zA%#dpj_qqydWlOa$cY7XP~;ESRXM+tCJ+q0rmV;nk)@ZIeN{ za)vlj?ARmPjQDe0@wp62_h?ws>i6)k&O#S>%o5bKEc{V1b5vyc!DMTGszu-QL>kGl zk+`Lr?D~T|PE*EcV;hJ0je`Qb@~+iDwlitm)^;R$hUyeHjEL+qNb#hjLPYkYG~GUY zXFfY`uAPNEPYWI7N+Mdbx4QMutl+*)S$~DkBbS32o05N~6 zZA+82L!DkK)y(sER-hX4xy1rxiAsS-UKlZxu9-$;9$#Bc0!yO&VC$bB^95;AI~)aw z;x?MW$EvZ17Leb{KXq*nyM4c-brSNsWEk^PtaT~g$H6Igo?yD!rZcB~)2Bt*`KW%t5l{OF*pBAXb#5(j)TAunuUIRd`bgf-U#_)s#+O#kns_ zloPVLRPIRvzGgZysV2f)^DVaCAv_TY!A6niK$LC?4hsdLj=6$Y`k1gCdoBcwBK3jY zm@qrR!-fU{UzNA@CWN#vf&bgmV=FIhs1T@EDON=OTUuWVALV5mqvu_p^ovPl6nnSYI(Dqx`*wNXE-F+im7+g& zp69+v#q8!E{ki`^$E0mlJb6 zlKcb{6%bh19>y32fd#U3W)XTJ6LrCV3D6>QgaLxl<(}4oz2}+IW{1g{qw~BqI&k}) zO=$A1ycfKAOXkB_nY$n{uibXkgvdH*Vz*_BJ91$ERnlL{7k z*bq6)DnW@a#&QQy6J-PoM$k0j`0?C}-{8kj^M19Epcc{vQ)2-z88P?(f@E!r2Ij0X zzFAg1`rFd9$IsZkEmwj<&L5;XP!PxR-qvP$zh)TMVv?Mgq-UR%<;lR`hMlJ>59*ExW2(86j2^a+U zKI%HbLk9=wL=JF_N>p;v!MPHa$Pt8PK;`P!$_h{mvfIaFB<2jHxE-m1clhdbjCtQ8 zr&Yprs6Lr!XCehq#m0}Vv}9h+dkT>6FTCMrshI9W<9QbGTzr#6sGK`3(xt=$5Y6N_ zTKOmvs4rj}fzdZD*wIC^xPUhmgK_>HyDlo+J671+_5dXUG))r<5++pNM-vYQ9U$5c zy&1!Z4)(#50sG+hW*tsSaMT={{kHPW7P4VWc(ulS2mD)ckhkz8Wn6`Pd(0QjF7D1L z=7%;-a|QO^2}HVL)&w5-wcM^>rv1Lz8!Bda??}3=sD~{LvMWU0aID z&yOghwirqM7$3GhI3V$J@Z{!K@|&PUWkz4Byb^J6ndr7LU=|c~+D}O474NXBA608L zB&)@e^z4M-SA88W473MKn@I@ey@#R4GQP4Q@-4eMWKNka{+2rm7Mbm<6O4o# zzOcvxS#wX8r3@=Q0IcCFE|mM5gt^b(-L!{}EI5-_ID_GrFsFh@O>7S1+=K?O5zl5` zCK4DDd@r~A(Xqe~M(p|^N&xd3&gG9<4l0oe4hFyg%ZO4gO;KnDVpj+P+EOjat zDha}fGIH$p=Eg9hy*9GkHxxg3p(ip^hbZZn=@K^4)n^csLcq@2QttTR$~7?X z$Fbx2WJwpl-AnxH3}`tcmCb{B)1*W7J^AG%Y2x~OosL|kBt4+9XXF}|!@EKt^RKc7 z&`F8LI<+bpzcua)-T1R>fP7`plCnpKnQGIzXZc{lVwK={Q#r7|I(;ra|K-;@Y;5HSRzB_ggAi>^K!gV9W;)?ehzni?)kXm3fn={OK?DCro{)ZF=p*{%a(;)>yPvaV zzYOZ0j;I8EOE)V8&ZDe#cjtZzoK_m#xcBG@+($9FV?PIu+!+nr$r(B~(s+iQaL>BZ z3E#Nh&5Q{AnzyU*jnZE$i;#k-~)DhPM1~k>gSn`@k-s(#^>Iw;Hs;AF6q+Pj8gE+(j@Qq3g7bE zDDAmAFEbdOQ*0s`fOy!>y;i1A-lo7w-f%gz+4#9(`JBL)<;~Zo4_!q!e$$Dm>GzGQ zuO9eBY@fo%#WFph7NWUnERF&t8jZ@_BpZs_gpGQ~xIIRh0a)`ok&hw46%q zKEAXcerZvq0S5sa7m^?j_4b}bEC&fWsqwtwMhdxo?%e&X@&Qb$dEbbs`MRKXJMfkP zjDyNN|L7#*z3kc*+hPI2B;%XVD|7zzY+#SUT0B`iKG`T?^kbOQdm2Ndq2Noqq4qi5 z`P9g*S*e&y>sx6qXKus!U>Dv&t4VbN>+>E*JAuU%|i3S7kb9iY9UYtW~0toX(8~g ziZbMZ>}z3?RnkXOIihP`NyyQ>Q#ay?RjjC2F7p_Tu97+9ivZ&0X`@SVh8RG7Ejv4Y?sUxx0t5)Erq&Uwz zh&_9d8k!(G=uiIfewvF7*$$-7&)sN4wSZSGKPE%u(*@S@{E$1!@Is?4LHkm3Uasv{8-ItXbi@@=nFPw0 z7}QKEHa|69!zQnW3F-4J3}AZ5M%Q15sm*9PPsk3hQk*E664|sZA!MnW>F|k9Nc$Su z8CD?6aml zc8fSvbA&WZw*`2{q$;6&{1obCeU&7l;H&q;DI$)V&zvUrIHxO3c^NU(X~utgVzE^0 zZqw6laF^Y5^J6@>tWt$jR*~!P5041(2zzy3|B!@QTBFb-gBwB+wtOerklBG!ZBwUa zeL@;l72uHP!5Ly@iX&KZ@Bh;es|$AB3up4)-uv=ZjN0}I-UQc1&FyaqRgx_0X+I#S zVq-P=XO2#w#=2V;sq{x`n21{`Gw@Zw)ikh zXzt>%>p(=aYs|@=mufqM_{4%8Rl*ORmwHCa6r z?E=4*2mRp5=@0QA;^t7|P6?`@J+49Nje`Kl1X*8;j^aAOOZjCmoA zSoLK$t_xAPpzDRlEl?_xW5e+-`rknstXAtcXD>3gr7hu5QuFfhybpE6FS2#eM}v(Y zhjNEtWpABH*}hD)$?bcov5|L36}mNi;*MHLdz?9HB6a&a-svUfi*YuCwQ3{C)hZaB zoln;gHr>Z3cHPst=f#*IMVfZrXj{@+isw#w_9S7-y#VNy)Q>v}FE-o6+^c8Esq0~u zDEEVXo_NSr?I?$LL7RhjvDD6dt4s?B`Yw%p)?v6#?7eRpgP4T7H`SBJrK?4y6!CZg z%K0y)R~KXE5dmP;!#4-rDhAQkV@jX372iXsm_sz8&~d(*-QK!X%}dbdavRZE|37pi zShnHI;q@5h&VwzJLai@Lu`jd?N5HF-8qaZOoI%&C6JCob(R(SSu+~J}fbL(D^_J^` zi`xWMXANsaKid%tz7Ex^^+(KwWNQ=-S{=wWy!15xzys(}8E?a>xjkV@U;zeaZNeIY z8#>eK;m)>hu=VJM75Br;Bay-^-KMb33dtagU3gK!ROHl}S*0}S;Jg}HVeZMG0wF5F zht_;I9%0*b&nOU%P@5{b%J3!f{WYAFlq=^l6$%xVZDir1#&)la&DUilYqv{LsfvY7 zR_R%n3NRuaPEg9g!X^&&uS-_I>d|dqHj74n0h49p1O%`0;339x#?eQAsm)PB?a`9s z1=1H_D6|W=3(ktl_$)Xb%(Xs|;)P-L2U>HEX(;J};>x_LVrdgF;+`#az$|**$$6f) zd3_)0nKIV!8ows}@cFUq{^E@5F9DI;(D58lP>hJ3+mTkhFLDBn{DP`RG=QNju#cam z?=b&dX!0n=-zv*~DfhDI_3Adx3fZ=6SVWsEmmpj!W7KWv^ATcW2%%z!oS~k zWvI}dtgUy4s2d7B1{));zueqf&jXbmUVkX&(eVoL?1_nWYH@1|HKTU3mSi`XPxgs6 zun+v43br@;;T=U>Gi89_2=5q@$*K8|WoSPlC`T)SUL1_zv(dS+BVRK9E)x61NQ0$F zJxeCmzWzDJ*+AhDj((62!`ljapH6BlMZf3is%js8c}2qfTW-QSSLGr~otyLeCkx$F1Bv38N0J(;}V>8JfVk=nkpqs;D>B|z1j<;#;RG7QQiDj<< zO%Hk%PSqa7vK4v{`l5+C3_=TPNCXzXFdT`Wh{r)zzY?;APbO;Jz#D^65qa7D{pfxO zZkK(>U;a8e5?$2cx6DvU14<}!#-85YPegv*MJhkn$1?G9D;HS#G_mQe-`tPmOz_a9>vss^(_>IM!TiDQQP$#N zqbTXie1ChT!FRxwKTY7C-O%<;B_Gx4)W;FM{SRIrQSnxqHHb4**~@U;my$q9B@(YS zh@qvVZ-m-0aP(girnuToME^Q}&3wxL>lXQidO-mP^o8R6_gM3s;;v6{&6nn<-wOXgzjvLK{1eEm3M`J{A_-~VYV`~!K}TLujm9kWhk5*9 zE-y{|4W}D)#USg-mWJs==Lupc|BkzBB&nxEbjIcTsh4IsdrDGVB+N5x-r%wfMFJRoF0gWnJ4j z{JN}2(!IL8he(@)TX~o@F}05;t{$qg5LcMQ^r89rZb@QAE| zj)wLRkDF43^#EM^ z4(@yzHV9I2Z+-(y?yIO7O2~F2urT0g_K&_l*ijN@sX>A+P^NoL*l$HqFzTZmflu23 zdfL)x=Ed@qn|W+#b7aMBnaFkFQ9*<6F1$K(4~DRf`HDW{7ssIugr_8Chm$I)pVh=l>3 zLO{jRW{;-rbE^WydiY)A&%?R)46r>lODjVnh@y7wdB;fLcqL-#H?U=A+o5c~J$B3H zfM;1X2Ygi}J{d=ze!7}-b-KkHgQ^Fz zgBF%Dnj|gXj;qjA1sJ{ZHolHRIE&);Jpk5XzsnH;Rp$C}ru<}6-8%&D~{22!(ry~gO zPusklxP^`t@k+XW7h9Se-xkFPJnQy^>RPwD?X?C|AnyL!g%QJJ=yA?BD8AQa6JEi> zi~mbsYu0rZ=8aT5s3q0a0kWkAzkC;?I<-I$6OT_O87C?7_&Tngs0zG_+PUL7ZPC=3 zA9nm#QFFy8*<^8bpL!(lo_w6PW^8haoK=h(LpC@OQ|fb-0;?|TjmCSk4T->RsT7aX zPmA4C2<1hInloQlQ#l>EM2B5x;@L{N=SO{bx3?ZcJtcpJZ1e|Cwxnme_w%m#i=E_g zMfW4C6AtUyDqqT{>?>#3-s0q9|G6Dk%UKpY!4)vhyQ>!B-jn!XKfw^~8I6+8V5AT$ z+8U+q0mA<;KRmgn6UvG4V~11Y3S}KU)#9=L-o;a3>4gr#XjL^AfDGdckc)?@)HnU% z6Y80E!_757q|fv=bIaNjFvN@g;@Y{L77)XW8`$dm*Eya$bSjZ1Ic(FG7Mu`-ob6c& znrm5?>}M8EB6fQ5u-wwy6((UTd?{DSiLAX&0jHNry?4Yer2d@uO|x3&E%1XO+&RNS zlf5Jnt3iZR@Ryag>P|9aZIQgUggOHe?9|{Jm|(M2!t{u#q_e}5^?qTX46JD(H$x%eD3^_-X&56wa|f4x;jhV6&8L- zzTf35tyF;rooUGXf=PG05?wy9gjwNUY|A`jmm~^rD#a z1y+yG4L3SmMy3BEZ!rS1?jULdGD*D&;gzXh70ky(rX7{4fe;RcID{GL(7)O6VljO$m^1mOX zb>|;XooX%D$nJP-2T3AN3q%0yUk|5B3j;(RYc|7-x|euEB7S*nIrHAF7;dnCg5zgp zVYt)kn)-Ms?3yA$?3KOlQIuECklf^Y^Q+EWuX9v^bYCXJ4UVaRWabb(F}l%dJC?wY zjoNod)y9cyXg&Ec>HAfHwb&J@Zw+S2RT2OFc$;u(>jUqRV9YE{+MposozC*(slAiq z@%nr)tgKVM*EC=~lJdRQTAABlwcCqr09a$R-|LJKXM|z=5u>0-1mKkKl){->{YRLU zMI$f6yHJ`ZshZZ?ntWelfG-}c!sluJWSVD0Af=#sm@vo&udm&S0g?+LS=8dO%qN2| zE&&*Wa}uga;i#aJ<6R%jtvrT$JXuu^iSE;I2IL=Fhrh{=b(N5b(IOZ9%SCb1hW_if zA5E|I_EVZ=@jmn{VQoR?BTGo1Zvj#srN~lCS>HCk)YQx&==UKkc!3r=VLkcN|CTp=yL=liz6ONXruEu5R z#$typK7#IQXa4CB{ii88!3;3ggmC)*7ZogOd@$$~Wx1@&C~f@j3BV+oEdCjY!E##s zUtGQ82y-Ga`RyDH|2=`=25EdFm;ogx^O3dxqJo7{LBy~L9CBh^@xP~#vH&xnWPxaO z_a99E-Y@H5p4qbHR&oCC37B&x_x>~R|F3JMmmV(87i`@E205$#2OA7s8z-*qehI86 zx5rj&{?kMM-+Od55{$PWz-e>%|6rW?hf(|5@c%TN{)6+f;U7jvUX}lKb8^W)j49dk zeE(1PSO4pNvp564|8+CtKLaT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/source/_static/images/CometNativeParquetReader.drawio.svg b/docs/source/_static/images/CometNativeParquetReader.drawio.svg new file mode 100644 index 0000000000..0c1f93c7b0 --- /dev/null +++ b/docs/source/_static/images/CometNativeParquetReader.drawio.svg @@ -0,0 +1,4 @@ + + + +
Spark Executor
JVM Code
Comet Parquet Reader


IO and Decompression
Native Code
Native Execution Plan
Parquet Decoding
Shuffle Files
executePlan()
CometExecIterator
next()
Spark Execution Logic
decode()
next()
\ No newline at end of file diff --git a/docs/source/_static/images/CometNativeParquetScan.drawio.png b/docs/source/_static/images/CometNativeParquetScan.drawio.png deleted file mode 100644 index 712cbae4bf449346feec3a472cc27960ed91875d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75703 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

F 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 diff --git a/docs/source/_static/images/CometOverviewDetailed.drawio b/docs/source/_static/images/CometOverviewDetailed.drawio new file mode 100644 index 0000000000..ff7f4c5911 --- /dev/null +++ b/docs/source/_static/images/CometOverviewDetailed.drawio @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/source/_static/images/CometOverviewDetailed.drawio.svg b/docs/source/_static/images/CometOverviewDetailed.drawio.svg new file mode 100644 index 0000000000..0f29083b11 --- /dev/null +++ b/docs/source/_static/images/CometOverviewDetailed.drawio.svg @@ -0,0 +1,4 @@ + + + +
Spark Executor
Spark Driver
Spark Logical Plan
Spark Physical Plan
Comet Physical Plan
protobuf intermediate representation
Native Execution Plan
Comet Physical Plan
protobuf intermediate representation
Shuffle Files
\ No newline at end of file diff --git a/docs/source/contributor-guide/plugin_overview.md b/docs/source/contributor-guide/plugin_overview.md index c753829076..a211ca6b55 100644 --- a/docs/source/contributor-guide/plugin_overview.md +++ b/docs/source/contributor-guide/plugin_overview.md @@ -79,10 +79,10 @@ The leaf nodes in the physical plan are always `ScanExec` and these operators co prepared before the plan is executed. When `CometExecIterator` invokes `Native.executePlan` it passes the memory addresses of these Arrow arrays to the native code. -![Diagram of Comet Native Execution](../../_static/images/CometNativeExecution.drawio.png) +![Diagram of Comet Native Execution](../../_static/images/CometOverviewDetailed.drawio.svg) ## End to End Flow The following diagram shows the end-to-end flow. -![Diagram of Comet Native Parquet Scan](../../_static/images/CometNativeParquetScan.drawio.png) +![Diagram of Comet Native Parquet Scan](../../_static/images/CometNativeParquetReader.drawio.svg) diff --git a/docs/source/index.rst b/docs/source/index.rst index 4bf5d9fde3..39ad27a57c 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -42,6 +42,8 @@ as a native runtime to achieve improvement in terms of query efficiency and quer Comet Overview Installing Comet + Building From Source + Kubernetes Guide Supported Data Sources Supported Data Types Supported Operators diff --git a/docs/source/user-guide/installation.md b/docs/source/user-guide/installation.md index dc4429b8b9..bb5be8205a 100644 --- a/docs/source/user-guide/installation.md +++ b/docs/source/user-guide/installation.md @@ -19,73 +19,45 @@ # Installing DataFusion Comet +## Prerequisites + Make sure the following requirements are met and software installed on your machine. -## Supported Platforms +### Supported Operating Systems - Linux - Apple OSX (Intel and Apple Silicon) -## Requirements - -- [Apache Spark supported by Comet](overview.md#supported-apache-spark-versions) -- JDK 8 and up -- GLIBC 2.17 (Centos 7) and up - -## Deploying to Kubernetes - -See the [Comet Kubernetes Guide](kubernetes.md) guide. +### Supported Spark Versions -## Using a Published JAR File +Comet currently supports the following versions of Apache Spark: -Pre-built jar files are available in Maven central at https://central.sonatype.com/namespace/org.apache.datafusion +- 3.3.x (Java 8/11/17, Scala 2.12/2.13) +- 3.4.x (Java 8/11/17, Scala 2.12/2.13) +- 3.5.x (Java 8/11/17, Scala 2.12/2.13) -## Using a Published Source Release +Experimental support is provided for the following versions of Apache Spark and is intended for development/testing +use only and should not be used in production yet. -Official source releases can be downloaded from https://dist.apache.org/repos/dist/release/datafusion/ +- 4.0.0-preview1 (Java 17/21, Scala 2.13) -```console -# Pick the latest version -export COMET_VERSION=0.3.0 -# Download the tarball -curl -O "https://dist.apache.org/repos/dist/release/datafusion/datafusion-comet-$COMET_VERSION/apache-datafusion-comet-$COMET_VERSION.tar.gz" -# Unpack -tar -xzf apache-datafusion-comet-$COMET_VERSION.tar.gz -cd apache-datafusion-comet-$COMET_VERSION -``` +Note that Comet may not fully work with proprietary forks of Apache Spark such as the Spark versions offered by +Cloud Service Providers. -Build - -```console -make release-nogit PROFILES="-Pspark-3.4" -``` - -## Building from the GitHub repository - -Clone the repository: - -```console -git clone https://github.com/apache/datafusion-comet.git -``` +## Using a Published JAR File -Build Comet for a specific Spark version: +Pre-built jar files are available in Maven central at https://central.sonatype.com/namespace/org.apache.datafusion -```console -cd datafusion-comet -make release PROFILES="-Pspark-3.4" -``` +## Building from source -Note that the project builds for Scala 2.12 by default but can be built for Scala 2.13 using an additional profile: +Refer to the [Building from Source] guide for instructions from building Comet from source, either from official +source releases, or from the latest code in the GitHub repository. -```console -make release PROFILES="-Pspark-3.4 -Pscala-2.13" -``` +[Building from Source]: source.md -To build Comet from the source distribution on an isolated environment without an access to `github.com` it is necessary to disable `git-commit-id-maven-plugin`, otherwise you will face errors that there is no access to the git during the build process. In that case you may use: +## Deploying to Kubernetes -```console -make release-nogit PROFILES="-Pspark-3.4" -``` +See the [Comet Kubernetes Guide](kubernetes.md) guide. ## Run Spark Shell with Comet enabled @@ -99,11 +71,10 @@ $SPARK_HOME/bin/spark-shell \ --conf spark.driver.extraClassPath=$COMET_JAR \ --conf spark.executor.extraClassPath=$COMET_JAR \ --conf spark.plugins=org.apache.spark.CometPlugin \ - --conf spark.comet.enabled=true \ - --conf spark.comet.exec.enabled=true \ + --conf spark.shuffle.manager=org.apache.spark.sql.comet.execution.shuffle.CometShuffleManager --conf spark.comet.explainFallback.enabled=true \ - --conf spark.driver.memory=1g \ - --conf spark.executor.memory=1g + --conf spark.memory.offHeap.enabled=true \ + --conf spark.memory.offHeap.size=16g \ ``` ### Verify Comet enabled for Spark SQL query @@ -142,20 +113,9 @@ WARN CometSparkSessionExtensions$CometExecRule: Comet cannot execute some parts - Execute InsertIntoHadoopFsRelationCommand is not supported ``` -### Enable Comet shuffle +## Additional Configuration -Comet shuffle feature is disabled by default. To enable it, please add related configs: - -``` ---conf spark.shuffle.manager=org.apache.spark.sql.comet.execution.shuffle.CometShuffleManager ---conf spark.comet.exec.shuffle.enabled=true -``` - -Above configs enable Comet native shuffle which only supports hash partition and single partition. -Comet native shuffle doesn't support complex types yet. - -Comet doesn't have official release yet so currently the only way to test it is to build jar and include it in your -Spark application. Depending on your deployment mode you may also need to set the driver & executor class path(s) to +Depending on your deployment mode you may also need to set the driver & executor class path(s) to explicitly contain Comet otherwise Spark may use a different class-loader for the Comet components than its internal components which will then fail at runtime. For example: @@ -165,11 +125,8 @@ components which will then fail at runtime. For example: Some cluster managers may require additional configuration, see -To enable columnar shuffle which supports all partitioning and basic complex types, one more config is required: +### Memory tuning -``` ---conf spark.comet.exec.shuffle.mode=jvm -``` +In addition to Apache Spark memory configuration parameters, Comet introduces additional parameters to configure memory +allocation for native execution. See [Comet Memory Tuning](./tuning.md) for details. -### Memory tuning -In addition to Apache Spark memory configuration parameters the Comet introduces own parameters to configure memory allocation for native execution. More [Comet Memory Tuning](./tuning.md) diff --git a/docs/source/user-guide/overview.md b/docs/source/user-guide/overview.md index e386aec8ca..92dfe2bb94 100644 --- a/docs/source/user-guide/overview.md +++ b/docs/source/user-guide/overview.md @@ -19,8 +19,14 @@ # Comet Overview -Comet runs Spark SQL queries using the native Apache DataFusion runtime, which is -typically faster and more resource efficient than JVM based runtimes. +Apache DataFusion Comet is a high-performance accelerator for Apache Spark, built on top of the powerful +[Apache DataFusion] query engine. Comet is designed to significantly enhance the +performance of Apache Spark workloads while leveraging commodity hardware and seamlessly integrating with the +Spark ecosystem without requiring any code changes. + +[Apache DataFusion]: https://datafusion.apache.org + +The following diagram provides an overview of Comet's architecture. ![Comet Overview](../_static/images/comet-overview.png) @@ -34,26 +40,10 @@ Comet aims to support: ## Architecture -The following diagram illustrates the architecture of Comet: +The following diagram shows how Comet integrates with Apache Spark. ![Comet System Diagram](../_static/images/comet-system-diagram.png) -## Supported Apache Spark versions - -Comet currently supports the following versions of Apache Spark: - -- 3.3.x -- 3.4.x -- 3.5.x - -Experimental support is provided for the following versions of Apache Spark and is intended for development/testing -use only and should not be used in production yet. - -- 4.0.0-preview1 - -Note that Comet may not fully work with proprietary forks of Apache Spark such as the Spark versions offered by -Cloud Service Providers. - ## Feature Parity with Apache Spark The project strives to keep feature parity with Apache Spark, that is, @@ -65,3 +55,9 @@ features and fallback to Spark engine. To achieve this, besides unit tests within Comet itself, we also re-use Spark SQL tests and make sure they all pass with Comet extension enabled. + +## Getting Started + +Refer to the [Comet Installation Guide] to get started. + +[Comet Installation Guide]: installation.md diff --git a/docs/source/user-guide/source.md b/docs/source/user-guide/source.md new file mode 100644 index 0000000000..71c9060cb5 --- /dev/null +++ b/docs/source/user-guide/source.md @@ -0,0 +1,69 @@ + + +# Building Comet From Source + +It is sometimes preferable to build from source for a specific platform. + +## Using a Published Source Release + +Official source releases can be downloaded from https://dist.apache.org/repos/dist/release/datafusion/ + +```console +# Pick the latest version +export COMET_VERSION=0.3.0 +# Download the tarball +curl -O "https://dist.apache.org/repos/dist/release/datafusion/datafusion-comet-$COMET_VERSION/apache-datafusion-comet-$COMET_VERSION.tar.gz" +# Unpack +tar -xzf apache-datafusion-comet-$COMET_VERSION.tar.gz +cd apache-datafusion-comet-$COMET_VERSION +``` + +Build + +```console +make release-nogit PROFILES="-Pspark-3.4" +``` + +## Building from the GitHub repository + +Clone the repository: + +```console +git clone https://github.com/apache/datafusion-comet.git +``` + +Build Comet for a specific Spark version: + +```console +cd datafusion-comet +make release PROFILES="-Pspark-3.4" +``` + +Note that the project builds for Scala 2.12 by default but can be built for Scala 2.13 using an additional profile: + +```console +make release PROFILES="-Pspark-3.4 -Pscala-2.13" +``` + +To build Comet from the source distribution on an isolated environment without an access to `github.com` it is necessary to disable `git-commit-id-maven-plugin`, otherwise you will face errors that there is no access to the git during the build process. In that case you may use: + +```console +make release-nogit PROFILES="-Pspark-3.4" +``` From ef828b37c6b53a339c46e245095311f1d1dc7aba Mon Sep 17 00:00:00 2001 From: Andy Grove Date: Tue, 8 Oct 2024 14:57:26 -0600 Subject: [PATCH 2/2] add direct download urls --- docs/source/user-guide/installation.md | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/docs/source/user-guide/installation.md b/docs/source/user-guide/installation.md index bb5be8205a..343b658683 100644 --- a/docs/source/user-guide/installation.md +++ b/docs/source/user-guide/installation.md @@ -46,11 +46,20 @@ Cloud Service Providers. ## Using a Published JAR File -Pre-built jar files are available in Maven central at https://central.sonatype.com/namespace/org.apache.datafusion +Comet jar files are available in [Maven Central](https://central.sonatype.com/namespace/org.apache.datafusion). + +Here are the direct links for downloading the Comet jar file. + +- [Comet plugin for Spark 3.3 / Scala 2.12](https://repo1.maven.org/maven2/org/apache/datafusion/comet-spark-spark3.3_2.12/0.3.0/comet-spark-spark3.3_2.12-0.3.0.jar) +- [Comet plugin for Spark 3.3 / Scala 2.13](https://repo1.maven.org/maven2/org/apache/datafusion/comet-spark-spark3.3_2.13/0.3.0/comet-spark-spark3.3_2.13-0.3.0.jar) +- [Comet plugin for Spark 3.4 / Scala 2.12](https://repo1.maven.org/maven2/org/apache/datafusion/comet-spark-spark3.4_2.12/0.3.0/comet-spark-spark3.4_2.12-0.3.0.jar) +- [Comet plugin for Spark 3.4 / Scala 2.13](https://repo1.maven.org/maven2/org/apache/datafusion/comet-spark-spark3.4_2.13/0.3.0/comet-spark-spark3.4_2.13-0.3.0.jar) +- [Comet plugin for Spark 3.5 / Scala 2.12](https://repo1.maven.org/maven2/org/apache/datafusion/comet-spark-spark3.5_2.12/0.3.0/comet-spark-spark3.5_2.12-0.3.0.jar) +- [Comet plugin for Spark 3.5 / Scala 2.13](https://repo1.maven.org/maven2/org/apache/datafusion/comet-spark-spark3.5_2.13/0.3.0/comet-spark-spark3.5_2.13-0.3.0.jar) ## Building from source -Refer to the [Building from Source] guide for instructions from building Comet from source, either from official +Refer to the [Building from Source] guide for instructions from building Comet from source, either from official source releases, or from the latest code in the GitHub repository. [Building from Source]: source.md @@ -127,6 +136,5 @@ Some cluster managers may require additional configuration, see