From c208f7effcfcf03f2a87d72d72f3a8c10c1cbdf3 Mon Sep 17 00:00:00 2001 From: Matthew Powers Date: Mon, 1 May 2023 09:15:45 -0400 Subject: [PATCH 1/3] First pass of documentation in mdBook --- .gitignore | 4 +- docs/mdbook/README.md | 17 +++ docs/mdbook/book.toml | 6 + docs/mdbook/src/SUMMARY.md | 8 ++ .../src/images/datafusion-jupyterlab.png | Bin 0 -> 86143 bytes docs/mdbook/src/index.md | 27 +++++ docs/mdbook/src/installation.md | 46 ++++++++ docs/mdbook/src/quickstart.md | 61 ++++++++++ docs/mdbook/src/usage/README.md | 1 + docs/mdbook/src/usage/create-table.md | 43 +++++++ docs/mdbook/src/usage/index.md | 9 ++ docs/mdbook/src/usage/query-table.md | 109 ++++++++++++++++++ 12 files changed, 330 insertions(+), 1 deletion(-) create mode 100644 docs/mdbook/README.md create mode 100644 docs/mdbook/book.toml create mode 100644 docs/mdbook/src/SUMMARY.md create mode 100644 docs/mdbook/src/images/datafusion-jupyterlab.png create mode 100644 docs/mdbook/src/index.md create mode 100644 docs/mdbook/src/installation.md create mode 100644 docs/mdbook/src/quickstart.md create mode 100644 docs/mdbook/src/usage/README.md create mode 100644 docs/mdbook/src/usage/create-table.md create mode 100644 docs/mdbook/src/usage/index.md create mode 100644 docs/mdbook/src/usage/query-table.md diff --git a/.gitignore b/.gitignore index 4e4450082..1d0a84a43 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,6 @@ venv apache-rat-*.jar *rat.txt .env -CHANGELOG.md.bak \ No newline at end of file +CHANGELOG.md.bak + +docs/mdbook/book \ No newline at end of file diff --git a/docs/mdbook/README.md b/docs/mdbook/README.md new file mode 100644 index 000000000..743c937aa --- /dev/null +++ b/docs/mdbook/README.md @@ -0,0 +1,17 @@ +# DataFusion Book + +This folder builds a DataFusion user guide using [mdBook](https://github.com/rust-lang/mdBook). + +## Build and run book locally + +Build the latest files with `mdbook build`. + +Open the book locally by running `open book/index.html`. + +## Install mdBook + +Download the `mdbook` binary. + +Then manually open it, so you have permissions to run it on your Mac. + +Add it to your path with a command like this so you can easily run the commands: `mv ~/Downloads/mdbook /Users/matthew.powers/.local/bin`. diff --git a/docs/mdbook/book.toml b/docs/mdbook/book.toml new file mode 100644 index 000000000..6540074a1 --- /dev/null +++ b/docs/mdbook/book.toml @@ -0,0 +1,6 @@ +[book] +authors = ["Matthew Powers"] +language = "en" +multilingual = false +src = "src" +title = "DataFusion Book" diff --git a/docs/mdbook/src/SUMMARY.md b/docs/mdbook/src/SUMMARY.md new file mode 100644 index 000000000..37f276c35 --- /dev/null +++ b/docs/mdbook/src/SUMMARY.md @@ -0,0 +1,8 @@ +# Summary + +- [Index](./index.md) +- [Installation](./installation.md) +- [Quickstart](./quickstart.md) +- [Usage](./usage/index.md) + - [Create a table](./usage/create-table.md) + - [Query a table](./usage/query-table.md) \ No newline at end of file diff --git a/docs/mdbook/src/images/datafusion-jupyterlab.png b/docs/mdbook/src/images/datafusion-jupyterlab.png new file mode 100644 index 0000000000000000000000000000000000000000..c4d46884e93a077c7ae8e3a13f4077854709b2d6 GIT binary patch literal 86143 zcmeFZXIN89_dXmzKtaR;qI4?)(xgcVMd?T{p%)S9gx;$t2uM*t5Tr=20ci<@fQSl$ z5PIkV=_T|KAe47=p5k--9l!oRy6=|p#sX!nQjk1!Q zHV8!C1_F`Ro~8iK_#uMjK%lcSb`KwFDnES4uIUDSYUgMT0x3l%K`0G$zF*ETeiJYA z;0!zat?k<{`$5_dY)Nt%niZ5tpI>~;UO3bvPmbZeT=AjgdKAlfiN`itjzbL8r0w+v z72Hs58BE};|5l*;eADs!J@h+wn^hE9$UY~`;C+}qD4v@u{!92N{%^Mn_?1jSl*J(w z??Wh)llh*?D=LBvC`Ox-z2Tti4&@SU)knj}=Fzv!0i@ zfMpg}WSkPe|8-bd$?Id)s>Esd)nh|Astc9RS=qSq!!<$F~# zY>@I}!b?6nlB}+fAyHA$I9gY(FCyIvXFop5e76&({tYYC7cNvc_Uc+`N_0cvDXOin zVqe#JJnXUbFCUQ7?HgFu-@LDHXP%lSec#;CJwN_Z(HBap zd(#i;_nK3EO?(erc!%^tUncPv-e_ZE61dOM$j+}M;9Y9WuJTf6Dd0TAsV`jLe$u(B zSNF1tUYdE{<|Fvhbc=dA(Q4xhDT1AT-=`kIE^c;#!z}SDO|<@(Fg~&iAvB~UWJ;E5 zWWMawr;YuW{io8iIj*>bo_YczanZaNcH_+q__|LFnf#>2%Tw&Zwk9DB5D?Y1W6zg* zCM+`b4RB4V>r9ei_ZgmtG5hc(#a*QFRXwF~?Z!cbH*cxr73jIr%A;U3Z6)^VVfGOuU#xvGmbu0KhLMSh=kG;Ej z_w51Q?3Hd3d{|PQ5>bEwLErDuLgvC&crMA+bPRNV64p&iO$f^vXYbJe#?wJH&4Fv` zoQx>=P<=zD`1qbzya|x;b4S z`Lm)*Zy}5M$O7f(SKpDJy?k)}^cCg{XxCFM!{3L=LBj<3jeWmMH;$dz>v^zszQLeL zcQ*@*$pvrTm75?UcydR2Grh|4vql6Lh#_`8_ss+Hhz{OUyKglkB-Gfhkhxos%}<{l z3l&|blx06F7wQv#_V(um!71_N5Kaq<6lxWjs|FPMVR(y6LsVYRz>}at%GOVIF6T@r zAkAtnw6F~Ib<*un?@7UD>^GlBbzcbla_Xbp$_1O}k-OJrl}=rZzImfaiQ@W$+_tk% zShd4TWd?5;$J;-Vb~_~&VOrKMl?%u5)uBI|#!7<|U#0|%_)AOXXP)aD1!>oOJyctbpcoKziSc!mY z&V%Wf3P^>f+otY`PZOWQ<{o#NrZNa4Ym|)ijbx1i%Jz(mYr1T~AFMpw#nZZS&^geY z%sg-VOEqORVk3ql)+7Ga#x+EbY7Z07i=O#Qx(m#h#qO^jWgcSnV)d$?v_Q>tf?~sxL5t=Uhs+leFcc%A=($oG1KH;hVxWg~vIb3O29&VmxCGW2#<3u4eMD z3VcZ0O+Brq|L(nzZ&$Zv#TBtvHLsp3WEOp}D=g~wh_)+Pv=MZuI#ueM10Ddic1n6u^Qm~Ec+?1;YGwMw)G81g zZa-}!IGo=;7tYi3)-KHn*}PNCVn6>h*$!gq{gt)G8_qBSt$;GgUYQbmAe3z{hYU+4 z>-f<9;oH>f9GKN}tB+Qw>5kWzZ|ErSviSzhh;oP)Fc&zf6BO)XsF?I5i(UI2Y$R+l z++S?bFchm+bT}qcBtu|3Fj7nm3_iZ#Y&CWnAzT;eNpML}6Tc zv+%OCVV%zepE*1uJ{WtDAMu{**7NWPURtO5E3Q88?bXdw6o-CP%(>L8Bi8X#aW_`3 z-@FiG)h%FYr5{_zW_Oh{sx*#N>wRI87HxJ}4u>LJ%(ZWFt-4<%qgm)BZtMgwgPpa< zUjMWc+r;xwjn_44r> zLk+?W3<1GMTtRW46e}KdC#@zlUPno^a9CL@Xylte^?h0%&tt+DkVKza!?_&jrMnZm z68b*(J*tkYuBc8?&M4ba%RR$&qQ61pBMKomCNS)2RsHjOy8!pHzJPub%n#|;yA(YOn@tB=zhA#3<3HJ=oqZ#r{ z>Q-JqQ%Sc--=d>R;%xn8_}i8y=Dcy+_)p98&MwX- zjaPlEaQdIiMsd@l63$ytZ|wKFttIEFaWr9WjAM*1Fl!_0;KNi)v9#my(CE~J>w(r} z&f8YkxHa$;*mpzdcrm$a4_%0EM?R`AMy4a<@TUkSfl{l!^VA#BXw`y<1>-nrQi zO$W#Ji%g@KJ(W%SN&HXIeW+K1XW(c*+xYRi=_(SvrYgM3AmCb{ zA#q^GVH&;;B~ZFiQhYHv13BUjX^zS-AY1pN1ob}wEvyG9TrIeN{GB@cepUO0T@3?Q zg+vB#kp0xL|0BKwq#dONR>bGv+5XZr$;*7w^J`}`8InJU`{*ZRa$CPRjV4L6YRsR_ z4-M9#v*}{{c~nP!PY<&0PUL%L9S|q;UEUQ4DWa?ml%J}pfw+M3Y0xPWMi4nrA^|>9 zBuxJ;E0Ej)k^Oa^6a6Udt!Y$JV?)PA(_U0ZICZ14Som4@-6*Cr4*@aUbyYziNmB<&)EV*V+H7 z;^6?kZlI>g{t)VB%`U>r&&z*Zii(|`UDEBzQ*muMg@4};9D%RfdU&{q^YM9md-Hk= z@?D}uS(Gr2o>X? zqj!HG|LO{Vmc{3g%*S2V=UzURk>{trn20?7%xLe2w6S?=W8-Cmt&e-8(Yj<#*q&I^ z#TQYyb46*LmjRKS`p2(A8&aCn@t7*^uEpyiAkx$9|L}F6gmh-?^gmuYsgBnU0r{dD zR^AK!^X)(#61UYqyk7c=S)(qLxhrOx=LIw2r2!XMhk9wLLHW0x`Gjw+bo$WOp)JfNB_$(!#F&Ni+SIftJ?Hs%X;wvAfxTdGK+G zQa=2XbrkXdEp_Nf%3}Rvcjf5;6V-J-7yd_y8J_}-=qbL<;sV58IL3VTj}ogr z4Hz;HXO8ze{5i)N|ru(+i`~Q_|YMO&88HEh+5 za9p~$^VV(EQIw)&`hM4`f7D6d#XEK(2ZY6@5!3RsH3Dps_Q3~-X@^_pE+$u~Vx_%S z9P-?XbXxT+8Ul$sur8DzzOt%IyhMFK8q*$hh{t#h=s|{=pbeJN#|Q5ATdZKep%4-> zZLGue7cE5=Ypd4Sn%TF;T^T+np?o6Ljuz8cj!+I8?XH8@o?Q{am?szt^g z_LKZw^jXfQ6NO}g+IYZ@pEWYSs_^h*pY43vfPUk(dRi~@k#vTt_AHag50-$Evf9d; zK_hO|b@^Qp>vp=)$I(2G<8&EFXMk?jFqru?zcur-BVvz_82njhMG`>1tB~y~Ht9;m zi8{U-%QS0DtrKQM7>~-oO-IKjWE+p#?p2M97;>!YT-jeP*Dx{TrCu6=dX7}vdCk4E z8A;HPy6S)CvZ;p_a`G8BYE9;;zlc* z&Q`3{zOBScMGK(y4mqdY(KqGtrZE4;`5#_?vu>HXGl_R)j@l5!m8gO)RbLTP9{~wC zk$%wrBmG#z9%H9XG*6|Rz1XGiq~g*F&`|7 zp)T66<2b4PHs`w8%l?2)mgGYkUGt!W}wH)_-}qG%j-1Isi3Vb2=ZV$B|oJMsqyp8Hiv?RT9fy7c-G zXCi1F=T_d;Ds+g{&fRku9t#v!H8#hi@L!unY`T~o^tCu}5VGhX;aTd@CwLy*r_R_) zKJLvzhYY{(ueP`M84f=5%8|+dYb=eCV~N;|ZD{MHYi^jhzi=+0*^V z&B5i^K!RzSklh=mF}JVukZR#UgBJV~eV0<%Fp8w&B9GfuHfXOc&jbH86h@7kc0+u* zG@-VUluyO?BF~b*VLNyE&~kZ`b1^)&sb5>waCxxI2|oaVJHf|AK5`)ZO1MB%9l{us z>Dx)-GC*h{53Ur&25j}0VuO#zS$!r+2!Sm$qOWit%K|1dgOBQ{DRx%JC2E}RZ=j`* zhjcW+vj>fPb4-2gKE+KGO~%28c&9!!QBQ1((?RvKy(QFD9>xV1jA>N|Cy(f!-6X0= zr(lGur1bGIA^3QHOg93t`JE#Z(JWK*$WD-s*?+Zeeq{h+E}R}#TJMERO+ka5GwXgJ z*YKk&1=6=$ohv>1-qsTLiLJa$M@u|ATjn}rmAH{L`x_I8mhDp8QG1rr;Di>Z9`dvy zHMFVqTEJmFPYXD>iopeyGfm{)D*3793b97P4B?$`(9^zYi&Q7oMzf8XXk2 zUxc#~-fs}gx}a)AO{m@B9R59V6}jd(_v0Newuz!>>`8)JsZN1|jgDeB!Ir5%>V(J~B@*K*zBdJDrZTACZTNIu#0Bo)lpe*7 z;7bTTZr*8VEIGE1VH8o3h|o(dcfM4hu9Q~bxhm;c%`+|pzMnaw%z9~`Z3~!l5!8-~ zqS8NK-dL$$hPhYK3rQ`PR`u#@X&xr(s4J&29A;Y-nRP%WMeh2UN{?oP68$p5<(r2P zS-yx^Z4wi}H`ey5aKES;uU;zKx6#QC^Wd7yW1Z(JNcT#`p$HR6Uhdzn+6)zH<%}I5 z8rm5{)MU9c8?$=PaXo#)Sk3=kDos}0rZd$VV&)P2o*TcvLxr5LG1l&&mkdT_Pu;DL(eJL3MZdJ& z1J+1RlQ%dZj*vRbmU90m$qA0|SmIu}U8Z-VakYbPEMq@yLnQ6e77lXYQUmqn5HWTpQ@*sdr8B6F zZ%hUHdga#mi@F+)wB!T0*#@4E za()xO4ywcf|`iN}lmGzG9IWBrmQy6CXkLhO0YgBA&;n+6Am@J=+mT7`Jg6sopRjx4FVj zpr+e3@tsY=0jB7J-`UCx+!@w|*-4kzXTCTcZ(|(c0_w00X($dfX~gi@(L8paJ8&SL z8=h!9#vzMEY9`WHwKi&%uqw;)WHU+nr=Rw}1=abDheL(Nf{zbZ;f%U9?aKIxabWV% zUS7PKXOon{wsh-ou^_YF+HYCDdBU~`@NJ>Jyr%WJjG^1_`;2b{g=m2tw*A37Lsq!S zFxptwkw7#7&WQV3Ha|LO48_HkWlSFJ<=MQQkc-^887D%z1czaZ2Qh17$i=;!i49BI z1Hi(D&w;l!A;$=t;FU-UK~+O<;VZiH&}j7=4K_3RS%iBXcdahne#Cz`z9qki*cRo! zyTk%(qUK^;_wCM-E&A$btU^O;@7NQ><~wtNu!85N%U%sK5BLq9NHohTB-x~919u*! zZWKr?qk|6k%OC~Xr>hOUaEWb?qwhL%IC?uTAv0g@uoJchMm>_|98$Ea?i_yamkxGA zJq)DXtYTfU;S1V%Wj-G0toyn*PwT5iR(XJw2#-tS*hTIUTp;U53i@LPns^7p)+CWy zEhw!9P8Buo?0XVx=WV)2+O!VzG?n=wQM7LgF*A+C)wGd7 zlXy84BYkd>F&O^prPI$Z7OO0O!PXI0f= zXDJNTZ)jI;|HDHD`DahGu)g!@yeu)&;f>}VJ@Tt1z0)Rv_<^9;#8(t;{gX+81w-` zl(D;DbT!nxm}smcev!reR#CGGS|!QW{*I{NT&81i3Dx6e9#(o`z;p+z?Q{sH^JVij z&?kK!yA6XXmLVo+o5R|`3>TVMzqV@;LkQRDv7>AnhN(3ZRJz{0i3;a3>!4s}6OaA& zI+U!?6|x9F$f_KHAI>)^k|)O+sl9^*zjyUN&02sqFYi!D^7P)Ni1R zeZrT_gB=Y2{M^MV<898Bz}QPBn90A|J0? z1Wk4#^WWP299xA9J#}!z%?0jED|!t%E$)>bZrX+%yh^7S)~63Ga^hPyc-<5bK5Eu_ z-)cTujf9tcRkxqa6x>r{Oy{Gmp_C~i1BTJ_(?lOdpwKj|4D7U+m^6K~a%RxX^GoV3 zobo>hOCn`Lo?W2gDk{VjXwYBs4(Q~58e+278#rm)EQwWmtqXUYvtjbki8aQvLzI{B z#S?F&@X>Bk+~`U^%gMXE*5Q6i`?6P)phmt04#fcnhyGq)Do{E|w1`Zj8q#!ShNTPM zr@(Ai9wY#74d{EpP^Hz{U=bI?W|<5YfRm_&E(vgS(FA=XZzFn2jC&b+Yj_`wa(%m` zsghqI*}ry6G&XeZMUz7y263v@$-VYA4p==_g*mUTGGfPGMFoGJ4Kf309`b$Gj_X0* zBX44icL&C+f=$Cz#cQ%4* z?@pFx+-kIOMm!#}pr?5ZA;9y;ut%)we#SRTRYm%SkMwCJR`^AwLU)QLy@WvJ3J+%M z^fyqS$CHnb&XCQh#Lb4)2c>gl_k~yVU^ip!2zhy`9(_b zW|997=ad(JN0c-lgo?AV)B0Q77L(dLdML8+QBXS?V&G_9-8N4^Vw$;MP90Ed;#TbvQDn@6DrWNf*Vx`x5>?IsBH+*A$qAK;c zDFN#V4Ui+7S@J!!m0#PWpkcHZP7_#$j&8Km=s^8!C*sLg-N~M+7hTb<#&~Y|2|E~G zk;D-A`ODWB!zS~?di$8alDDy~9#;y(u2=|-YDaOQp6CVSxHC~UD{RJ<@;4h+UL zs96ir`1~Hnn3P}O^^#5c-vFz(RQ-FPz2-DFE23kfZ+x?DcPXS`g1&jJ4!n8b8A;J2 zYU1gRv>-GmkIxHPPc|U_<%{|J<}vj9R0acpDwX^ zgpf#(?-h0kyQyc)Wj5vxp*CBOw1CEWCU&fU%fprUuESo&i~yPaB)*KQKE)qQKh}G! z%st6`6oQvka)ew6b)m-Q-YA}IxI%zfdFw#!_a);IMASBSE7tvGCJWO+EJe>W#idw^ zwk_YZTwM~k;7!IGGR^XNx3nxo#Y4&_4D3d0%gn(%YD)G`=`SsLHUgR|7%T=>QFuMF zY({K=R!9{P5yCRsUrgjG@6gbVD2g-<@M|*R=+~A%0OoSIduA!G)RjE|a1PV0apj2= zGXPwmPTrUU-L-X5$-As223Um?uom4!mTgw`d(v{JEMwoUJ3V)iewQzZ;>-z69k{a? z&FI4Fx9~wFhCax5_npIdi_^Q`auRH=)XJ5$Tm3N(*XFZA{Py8fi|(j`}!l(tWP!QI>uGLA6O<}r7igM zQE>zUt4;#SEY~B;D}ofLz@`_5r9qK>0XHrMwyDW(#Hwl9?g?zFz-nq(8i!L}Nku#X^JG*86vqaDzo@7Q9=p@shEdwOIoVJ5(bD0(M_iZ&NuWXHk+y(L_cBtfqF znKe8zFqLJ|Vr;R>cH>!h!={7Hjv`sE@piEzopEgH1VS?>i^A~LQT~8IfzXxVM8}{K zswHUsV!pHYJ8gQ-!&kkHg>vqe5DppEbGq+1W!BCy|4Ro6fDT+-mL5UDFIwA#%INfZ zLSq$Uncs=!+=+bhwjIsk?C$ck5~ebg>wodK}Ibk6ncH~mOsGGVU!*?{p$6IZH=s_!mcD9CW_ z$;RvtAhmBTUNL&>z|MYltfaNb@3E+Dw+vDx$tAw)0cBfDMsiR8sYX(&A)-lJk436E z$9~aPZCE3^A6@YWAOXTjMNbK4KT;Kaj5*1&D8}MYM*qh=9V=}EpFPi0QoAfd}%)@B7cUd5b$3}R~o;C4+ z>0EJ=%?bttBTwQvj#1XlVpYy%*fjCYGWIfldyt8r%YGfT{+ap^=5}FV}QSa6yO zp+fu2cVV6HHLLG-zTW#A01gW6J>4G-@)a_7%?XcLnF``dqgdB@r?V04Z-x;TUdW%r zF9ww2YNljwt;w>^MXI&;fFFN3t#i&k$u`8~n9Q70Mt3{)Sb@oDCch>4Gv-*3ysagq ziUP0eBBpbOjFL)(#dqd)l0GdZhT9|L0FDh3%#+a)n+zcvn+&xir+beD@D82w0UIWE z0r=!!^g=uw=#GD*6)sv3IqeI9<9b>w(eNTZ1ctXjeq#6&~- zPG~oO=fgK;VeR5C_zcK?EX)*{znK%^Jd!U?;^wrrT(qdlhw4uZ=Ni>ssweu*?Zf3q zPf}g5P;HFjwA|f_PozQKhQaoq?1lI5Ou}Rkt2Dy*c6G)4tbS%k^R^?J0+updBks!m zHj?UPP^aV3DR?*@QCp>!DaJ$I0D$&hgS^Qj&$f7MF;d{R4B}0&`7SuH)gU^bN0pTw z@*>ID=s3qzzOF)8CYO(D)80aatvZULttFH>seFGXL1QPa9t|Mb^(2!48Vip|+-RO- zK3XZlP4hiSk3g1uO^8YO5{wlW#NUqaJZLaa zJRuf}TY7XuS0%hkc^cL~uOg2)twRo4u^hu#!GeON&Ec6i+%rXWCPB?TG;Ly9s_1#Slcsttk*3Sf(Bx5!Ybz z9@+p7E;V3K_{NEr00hPD{;U3l4p~|>6-;mEGyHi6?iXT9d&{2Z)dSPY_{$7##s*Nm$!kokUu|TqJ96srN;Ywev;#e+&pS5?Bt^zOw%HC@y4eQ+kW1M(w@JEP zc~vK55AISO1f-X=q3d@DN6yGwaqe$4#{0NFGyFEV-%taCyDl+@Y~A|J+CUMUrE&I* zbCPy}f!3|hW`k5xoP{5|#FtZ^Y45Y)skZk4hZ}(!rK`~9SCCDWzijwrwol(eHcWQ^ z4Up0E3-y3h0>Z{>lR)eTE#R=&Olpx7`>5e2<&>=V;V_)UEaEqP3q zUWxwH>Lb)~(!A(hsx}7~HB&|W0j+AnZ8dFKXL7qlzG2aT6#xt3P00z>qhHY)Pm+3Y zi}wzs9dKeVB1@joA8#*?HT{f<33Iq9ld;&{vvKpWR>+wogO`6M#%a{~TZ%oV#W7*%LoC zr_+~U)pAS2WddZ?kK{>a3NnMl%RVY^m24T)FqKsEq13YH#}2m8P(IZ58zzYdTYCL{ z69vNWBntMyZ8e$eVg>UDKyqbupEaJdBDYpgZ*fE<08Gh}F9g?s+>EGk8J?y>A zc_pt|J|XIvJe9(oH3v1oHE&LKKctNTH$3a_;6*yxvp3m-zEa{Ii=KPRHSkKiOD@{4 zhs!73No=Vw$K?E2dAUrz-~Iip+)TEhc8$>Q6$HfFOYE5?xvYbYihc|Ei(fAres*5l zdMRvJXg87#AdT>nR+D%UzI}Nj%5BZqDKAeynwLu{#6&_5iYJ<7jy|mImF0TcuNxw{ zYA_`!Tp^FO?RF!7C%oV^WWnIfpk5Nn!7IZGyCj;vZA`7B{MBiGz9>0hzAOC@({JM$ zT;f-yNE7rf%I|(j54+Km4`w*79-H{N7cuX9ntf_a;)A4TN z$^2W+7(|-KaL4ekq_Jn{O^tY`iUO=D3WtJXchZLI#>*=@2ZzM*sNzTtY;YUQXHzmw z%wJ)oxLtL^KcTS}{Vl>MEb4g6dMPuZY<`mWsKoT&Sp&x=Chv;1puLe!2+VEvZqv?U z^hz^)?p$x}qbhwb%#=oMZOQ6$KRT>S3r!I#G$@#gi+dr5)sbsSw#dTI;OUQ)sm(YC zVnt!W2ft9R)1yT?9Pm555N||G{y>=T?)nt(`O6fyh0YiF&B{kVlU8v(4=eHPN1B8Y zi)`wiH7kn^wjAzd__;Rkx}aRd&t4|(x#`fl2s7K(sa%oi@y5R&a5!Mp{dq-C}&58QZ`F8=ehsK&A6$T7Wf?se1l7_0IMf3q}Eb}KZVAWD-fwq3`K z%M3nNE^7kPsUx@i$5K+V_O{|3n5JsWqp0I z<8ybLd0{#`*rjJlbCpTM%6wKSEi@QN$8CG5W(uUyhjq&g8w{m=n9SA^~8%l zK;;b>Ok#OAI<||#X}}ISMGDoW{hkmOUAM#0Y$uPk!VC9{TxEij>php>s)PzVjR+CK zp9kl2fZ1x+Dw2KC8DJbhgBe^I0%k2M?=O#jo3*m30aAw9wqOjiOFLVFnry}Jao0Wa zj<<%6b=9AIp5TqPJO@h+^Gzy&39S2qn%$eC?DoDA3@*t#AW2W(wMhLZDe~RU>$Q92 zleg91FZe~l9fy1Mjh$*5DD*lAyY07N9@LD8DyPxf+L<@1Pf^@7l?AM;0DhFvF;$Xy zL7WoRjs=pSr39UH`oKf_v)UF~$MnlX14Z5+;W5fz8=gNNp&gP!Od9eme^E$}q{)Giqbph*a8F~n8BEzbr0q?JCH)V|O85&^Io z>H?jJ2#*~*e@nbnf$^fK&Iz{jZAGMnm*0l%(A z!`F-N9kR{D2^!Le{iyUDcT5$R-Q5@KyTD9f8R+&-U)>d4fcI7)6m=OxPZxzgd-iuc zGeqWgs2>wM`uS%d4k%0`RVLZ2_Z8{?C#Gmt{s|AWnxCi$3e7$PaP}C5DIffOd3wSc zY<~bS4-HKe)JaKB-2{lC#Q$66ybL=7Kntw1{m4sty5IhUA-KP(DfV}*pCD^lgTQ;r zJ(HhPT?>(EBxUp=970?3M4<4o`oVhZ(SGmS|H$S$4Ky@@@zEdYqWw(3EAeyM?%BUN z&tHch0P3S=*q_Osem4NJ;Dm|2I^Ew9z+atZ2UxSL_WXb3%xXeU7>Q}BosqvK-hMHJ zp98$dhcx-Wr8Rzac_{{HrJs9|nAZOl-M<e4?uN*`2K2&kCbi|4 z9)2tJ^PX7jvY#f?AH{zCWPDr{iuetG`qi64Q=p{|7<`t^#DZYUvQEEs^4DP$FajHtx|u2dWTjbNCnL-h6E^Z&Cx0E%DFZh2I!o;AA0>u6 zX(s6kKX>;gAa?m@bNs)_>DOV6D$r6~J!}7; zyZishKtk=w+c?zU8z8&F|14Pc_&h)=cRv`={82j%r>HKn1C&o+-y)YkTZ%OwAiEVl z0gjh{H;`YX?DHHlA(HAZe1FO6x6=Rrh+hKve=Q3c67ryf4aGEm%V)y&{cYl&OS-ce ztuahC0Luhk*09+=SZUqCg|Q+3hrtti0Qi9U`EU9_^JNA}DVbeDPKZ3U-*2Z4#fVNA z%z7!Z`sT&}e3?O0Z&T!Sti%b^QqQ@C>Q{e%mFlR^v!lmL)u9_x5p4Atr2u)jrZZKz z!>HQUvV#Zyp8CrPp<6xExHbujfu$SQK+4U$1`Tbjk%r$fC#=qY(Yt|mWAJyK$LoQu z#e+t-%9-euF8cr+-Iax$I4|zAY*J$*aA;=3X0WQ%?j%{?VUgS3Z1SkcsN)v)qSPt~vfU0D*To16`h9{fDoB#&uD^s)fcK|jXO#?8=^(+A< zd9hCO!Gr$5ot5F*mU9wA07U7K25t0JZz{Kn75jEXXgVGScqC35QhT|b08KuxA(5Hs z{|?|gs-faQ+RP%1W(A0}-N4*@$d$^yi|yv^KqmVO!A6g*O6{5bN~nCBhMq(Ne@80Gzg3?0&*U zXZ2svGA`D)22*JfDhRtkH0=mbR?9XKK`$WYfdl8Hb}a}=W;13lH2$yoWK{sO5cRSl zH=!1I=+N%QwCQ-igV7>uswi}|5uGB?BDKG80|`+6A2m1ZpJz}0`d-Z4@%ydhYJk4o zsBb2yr$Q#-wb*-0Pg>ZG8OWH`{i@;U%`&iJhlA7&r5-w0jrEQNS@_?+DG!_#CJ&)h$9D2NY+I>f03+p z_y)sin7(Di`K6Xue5U%?kzyDS3J|>SCuKZ2J|w^|X-EoqReS^XB{W|)d;UX+j9!)U_F0=i;c^qy+v{LUVnKkFAaM$Dtft(33o`-Qj=vn} ze@p$>L*J0M4TKSfZ8C*v6bfYezeHXd&k8Fkt&Hm6WMyevjpWF1S@uCX!0NuKaUE}} zOW^%j6>rrz}EMUWxS)kR{`X`T#em3h0EOMyPV_EkBEBEp%WMdpRcEm14in=TO)f; z@6G`U{UVNSaM1zqrkzh@v_r_XMu(G3O6PmAzS*bxwCidj!(RX=^W=n!zcL5pLQ|2g z+0+nYC*e^be9x)k4#b3{P^mWpWLxKuN3%(Tfw}G&6ukQZwcdz=;0b_~%xFEE1gQlu z?-5|*3KZI~5xywp(3=~{InY5u$!r1mjFRd@AS8KW>|AGU-`MLkBlyyua|sp#d!^ei z)Z5J>%x%&=$EuGNY3?aoo!+&14y&7Ri&st)aT*IouGW`0(5(|UGR5DnmH}LY zp$z}ktE0AA{`0XCt1h1XRS)bQ1>|UbSc2^rdLLi4c|TR`HSUS2!$y|d)MoNE?q;(9 zdncUn?pxIGN06Q_Odrk)mwGtHxgjth#+Q>3qs z{Pi*|i{lsj3Xq?AfzdQ8f&_pVQy0Oph-Xby^_=B(z1Ji++inbI%SXE;iHnuV9yR3n zRn4W99|Bt`M9CLsEl@-qpsWi0<8 zlzv+^$FmANmdmpqKHDn>Oav0Mi8>e8^k^=Ym^IoLMqbY3Ft^jL9wVGOhtc8P1ynmq zPHfq;KidtJlNW11ORP1xxatGUQY3mKL+#c8;scy9Ti#9{0Cn#&Nq9MWye9IZfyn=} zzIhIpTBz~qd$R?xgX zrf}x?;Nau11A~x~L8>HjT-M!jkLOLY4N?v@PrpmJ1#|txr@G&;)<|^x6hcz;m8zeU zzZA5R6DPIgcGKYl>4qgbuqpHz=EQ3gi*fx{2B`cbD`E?+boI&hAUtUtbz&DV)6Gup zkZC&udjMb)jFy8%}wZY{q%|xR$W!>>*7IY4XD>_CXhD&aAlt&hzF@sA9e&F>RyECxn+U` zfTyXTzTn5M0Qj=LYm7Kx2gtNR>800Y;mq^{iglwc4U+?9$kC19%mfUbB{Zng*gy&drK0JZpvb;+k1(uPLwqdpC3TyOsFA?HvL z9T!)9*HRCw8hv&mx5{X?(9NDrU>nw`EG5g#Qx3d{KCOF_?fyA{Z^&kTTueHn5}7T^ zpgU;h?}R+sU)E_hAYUD*8lyZCMgjJa&(ev_NiC``X{~a5QS!WQ3U6vB7m!LDh&k%t z&B~tWn&|Fq`%w28bCcxKB%M$5<%#!yve3fB}Q;11j=75fg z{N9%wl3jicgdc(H4$I}>IQtAno5U^2yDDivx7ASnT#{KDbK~Bm6^vxlc1;^^-&LzJ2%^3nTEV^m#BsvxG`Gb ztZXlH8hb^HEL@|{9iYh?93LGXI$x4@FY`y-KwX=pG}Kf10OXg2Oy2i-q;!}-ZD;)W zW<2=y{{f|0dUwKtrRv^i{Q@jyk${i)^K~aqS_!eIb)IYalx!}Y#+n!O|FQR$VO4GI zyEq_?N`s^zAPoxAwG?Ry=|-ibySo&T?pz?fXz4~IC8d#Wq`T{kwcm4od!McQ{q+A| z=gYq2!^CSX=A2`W@r>uWpZmV&bnWFCkfPQJ_DRd6Q})ll%I0T38b5+jA5IIH@h7Fv z)Ox;p)^rVWn|MqkQ|Mr=IUo>@HhQ=@VH;qc!WvySAbjy2FTdzC*r~{8QJR2UKred4 zm>Y3Ffzw#?{auQw>qy1Ax1UgD56^aEO7#IQD>c$QxyEVf-S@~l-@91Q9fRy)baB1I z#;E7ZnAEHyH}&S-s_d%U(L+K?FFl>Jbh@(OTe*8u^z#AQQq4Um8J$gHJ6^4MIlD)GNkX) zJdwkk+CI{Epz%+>&kJ8{F3!9_KTy8V@9;1JO)F4G$t-@_;;PQ?ccGZp8~>T1`~>WS zuT2TP!X9SD0&1Jnv_o9C-8PTvBaMbGIG0m=ENw1M4%&BfLr%<0HE?wjhwmro2WXl!X4iy5>V-0ryh%LN=PlY|id%DOBnQU-#x~X`T8pVvdcBx0{ zXYa^w7+P3s*PIt&BSHE~$&WaXVL2E(mU*lU^`7!T#eN8xr8wmc!~Ggpjrs!Fqzn*oI;^r4B_SY!_PL4xoml=p&7sp#kT>?cO zxe*e6$nRm+k;f@!(-{{pU+FHgoz5yZ`dDyjG71Hg5?rN~4CwDs{94*Us6^nSKp0Q@ z=#_Uq4Cy0jJ=^SpUs!@~oXrK4-ysjnpLs6xON=YU#Z>Faorw;LV(#06Bx=P!>){nC z==QD~F^7mQwuelYyUKg*wGkKbSlQ!r{S>x6D{8(+xT*9=S!hJXc8#$xt+8kf&H>^t zK)R^SR*5l3TAFyTCm({0>DdvpTZo?3jPBNa;r1jI;S8SY%-DW^+@gDB;}Dpn1`jXa zz*NxQxjH|xtIM^_7y-56W};b<&4uDC?UUdxP?;Ezrd8!d!tY<{D#lJv?8H^rs^=2O z-m)(w#QfIIS96k@MgGJG{yZ8X`eU`I-3iZ0uOIaE{_5WM75iB{qlmqI)A~!-@z?Kv zFc;S^5HY6s?dzSak92#e;mE>pN-;{sPf`vWijX@Eci|Yrkb?XcDCBC_K*L&i#Ow&j zkw3?%>GG{9A0!sLe+Ow{!sKxa+-K}f zm$q5<_iIz(8q2OQ%3718b>z+**`yUzm%|V=(&W#E-LVrEs#(#1?s+epm+yb8Z|)MS zC92Yd6nzYuF|GcY{*kFLs`qw-VVdAJlk_M1)fA@*SPnF?HZDe05^?nfU=&K6aJe47 zRl4>d%tBYx*DVqoo94O4klS?7C+1p6I~G(b{OgiYkU$9{r3$-SeNR?u{!Yb=KL)<` ztM2}fp4%WAv#}TN6EFvse?cOYs>^2}WsnydQy~acfv7HnDn}A!BcH6=N#OQ%0#`4f zZu*jF$Z;1*_BVcC&?riN&2<#2mKSvEF7KD<`+`OOjK)s_KMA_K9RDzu^+V2MxK{wt zQ_Mp@`mTb#{>Y_aL|Q#N99v2?KjnGnk$KpQI(C6hciZ)hewlcTTezvr zRVP0pBQFvp0;}t8xy;{x)H&^x>xh8h=C~9gQS0JL_H|avGYgDxMcAY1PQdgs0Qx^e z^TiO?V`ec~K<&T$H0{7-IPD>JsI@)*IpZR+caqZ7{=3x>&nR3tRk@OAc0Qfu(FfoK zf>vD+podoE6FAyXeq1F{V=BYT`D`~SljuwDVim63CC!s^X=V3;NhaZ0m&S&se!f-m zD4(Di1$Ec8tm!8=f8x}C9ubHG>5{FA##1OjY#yq(p}?x9Y-NbmRbI)|WQ~+*pQU;r z2vpcU!bKG)bXHQZfC0Ncp;W>zDi9VH>85$NVy5`qwDo6LtV=*kxt*I4%8~l)`BNC6 zaR^P-_sPKt9WZEqmp-c*N<pvH}#7PN7|0i-qnpuQA+Am=z|Qyu66RQ-GjP zmXV5}NBNxmsAnw4b@O~-NSUE9AhcL}1>hCcjQ7v9tQrjA#XVD7$e@D%Q{64mF)1HY z9X%c65uGtv6TM+O?QUfPUS(0KC(gxl^{)Ew4FODLt5?wkdFe_(>=>pt5D8)kINO=D?sOwukKZ(0MD`Kft0_vOKUW4=x5 zMd@{E!=rUl=e6>D?BhidLIct!zwtEMyi0pwzu>PJ6@t$cN)TYN5ymKr!ninMO5Qt7 zxdQf2DZm%oSZxo!J|*`$U!#wcYd&G10QFE|<%Frpq-g?DwI{`$dp|(Sx!hrW0q}}- zRY2=jwQuEZxW5pI=`V-y3Y!{ zz-FtS^9@b{ki`tBlyg)x0Z-0$OTovGi$TTkeqmK5tHZPkS_~YC0c*CpM(@GR!z@Wm zrJd*8QWtq&fD-sF8jnh1g3m3q?80Jp0Ag}wsVV*dWBtMpjXuVGopM_Srh9n&E{N1_ zm?6qyz`NWuSn(xIYyrcc;r7p?073>SZ|$74a!O41JbLSL2AoXYZXo-Wvwt~p@-2$K zjxr6?=%O6MGvE=VXl5Qbb~t?O6TUFt0Fa{|>lWvxVbM&Mbnl#Ia-&B+FH338y2>cs=gy4KgsZ`{8RE_P%@Sf~k@C-BPTySH4-#l^&ZWj1<2agzpZa+>kSejMVit zVaqArlhFXz+6x}C^o`$d{$6kZ&?APBC5hK2U8d#}LMoD$bj&lxdT+%L2D%_pq9r!t zJBsT{Lk4!wQ7(sR^!OGCt5y1JwnU#EzYu#Wb@Xnu5)L?%?JD}oF=a_}`!s%{Vs z-oyo24robAKh7Y(SQpzyi|JJsopsZ0Sc*9g{Ovb6;qA-zmSA|8_Ji1loNLJBcs#e-jh_ zNXmSWfFBP#!h^a$+p2#%%5?*mxiQ0)(f;QG`r8o-yzz|i-0`2imQLVZ)&?{2kbmrN zV^V?s8$#eFU_AWUv-s;#+BUq)>NXZk`j4Ch0to0`BI5i&`ORScr$Cv;2UmJhM8fr( zBJV#ZWAFz3L?o(Gtbe!+1fN=frPpukaGD1Hrk?%-<5oZb!;S(mApYAp{rRhdJh;;7 zI-}ux|9HCy@V0_?C);1g;7?`*I9i87p2DAQIqdO2-meESxZl|wgueU#aGu;8q!G;U zF(pp9-}GPpGZWHogNGN_EVe}OkC$Q#P6MqY(fZr;`}5amA26yM)q%-K|9Gj};C}6R z^#6I>IpDJll{iA_Zxi&-UpsZcsBRmX|MNUV1t;mAdtm$9&fOo6=RfVcVAg-U*Dm-Z zBhh{?_cx=ZKc5Yi6L|bJNuU3D8j`>lo!`e!#y>~sZ%0dPpkd?0S^4M9{q2b17C4Ea zH7?)pI-37k+EakSvufE+^yjqu+mRuB&D~~ukn=yCnZI2HRd^kEZd1ME|GX;yog9B% zS^rLszpk5qBgdaX0UZ51IsTm-e;t9pO^&oa9qju zE}+h`rr`bOQ2zjHcmn9$=Yh#hi80irz43gVIf>uFlqJM>30U71S^ydAC?JfR4d=ex zbnST#D05Rb9TdlaG_k5215)2{xZw$KfGNp})18n7XwW|2mS0R13J^4tCkcDF?qj;J ztbPCFw*~C=T+F{c{M%0Q$FFS!xekc?HjC{EzJVFyAzeRS4~P+0fS%N}>(RO)oEzfe z#ti`!Sm5fzKqlmBUx7VTq$A*zx>M3}w-U&d)!e*}T+rZ>C}5+gheD^&G7WqbUw-!} z<@`-H=JOS6I1%9t&`0#uv~2=(0H8Y}+zr}@{it`z-2~V3Kb&IjTAt zG(fbk@1XZf2YS1lW^a2R%4?+?6)+(t-r0OU_guKv^a^YKoJggHX zZSUl#+)>+XE5E54mgy8q5zc^zoyl~qgI$CEqU6bh89Nz3qzwglmn80c7{IMB0riOA z(&_kgF-!|s<>|*gwu3^z2=(P#Oef{Zc?$|^P4@$Wm;o=dg{GB`Hh5wt2hw|4|9Lbv z#@2sh;{Wlq9pM&yQ#~9De0||iQX?1OU^%)B_5iIxJHOL5dEIH6-`%e9Zb8S4 zSJ{I)mw?5hfwt)<3*-;iHmidruUo7gn{ynSpy8n$*J)g&`5kHt~~QC%gdQna`o z4uk}gz@wqDdR>*z3i!xvpTuk&lyy;M+-X-0Jg1r&0DXY-(M)=F`kU6urFT(MTnS`AmIHh1KlL(ctXcj1cqr0OHW; ztuT@6pNhk$0f6c9##|0AF`JInFd}J6WCigr+eIY??ymDEv6ry2MZek~#n*$q%i;(px zN?L+RJ9x?8itCEn7Ec0XBDg#Xj(N2uAkyj8!y)%Tx#RAGRpIDXasMBPRu#8_oS zsblOh=m;2rI9^JI_3Qxn#I8X_!XKVFR-M0BodIl?oUDh>9_Pdz1;@EWH z4yu*~7+aiU`)$N}<<7^eTO4G4XzeVnh&rB=(fp5R?*?#L6&=06RJ#OLV0gE7;6^V*U?)(kmRczHHF!_q7%vm0q=Lh4Lr+3PFu~gL ziGz*F-dh`O=v8Ew3?(ba2ts9o>jUD6tn6)iuIvO5zrc!c2K$%43=h+z)dWTiM6eL3V|oE zRK9w)Yu@K&fbKdrZM0G-vxHZTZj67{H|63={z;N)Y@m|mb#u+;p-|b6$fdi!^A5WD zg8-!q%u8n_(g&Eo*2)Tz2ri1Qghz)U%8V7%!XychN%?FIvhwq(r0OUElL>u zSpE^c3 z`*5)a_PjE9BYpd@G%-iFP0GssEn3#?@Qss#Dv`s7lG-1z!t+-vXYO`ZF;u7wYM~_n z(_!`eRp-jKSvOZob3i!#VYxD@ByTIEl+PqDxaUt{(~7H7NK^-JqB;5Oo8Q{|Eb#i_ zFQYN+;u8r(jvNpZymYY!K$|O3rvsW=NQ3-GJT(AT7u7F;wp}-j-gruwa9AzuC^P+> zfmNol*`{e0tif4$ZgVq|MZ;i#ZF{6X`q(`vaM;H-UIAO4%lZk>SG_M>P%C7tI?YfK zs(J{hB&Ld8>6ud(T+50-5zcyfX3cM*-7O&HZXsQlDpr=3F2hxmCZQ@`*TBCMo*!3J zVaURs>XkbU(L_azR-lYrGqFWSPF7A(RXM}y?T9l)~0yH+`vA6dU zdewf3skstJbQt0JJg>D$@laZ#MXKRe zY03+k<&)i0(J|{{weK{n%|=?PrH}EY)r>ZJE>x0{m935GB4S8tKb9Ic=)%y{xPN8L z)MZsz^=v_!@z#>f5yol&qHP0g5NKb6SMz2^@nl$DgC;}QxMbF98=w^HGKwiGdJ7gP zu??Lek6v9@6t>$1Zp;@Nn`nE_TII`UMGwpscF96v&2lE6;e7&YrC)VBX_Oezv=B<- z@W>ih36Oj(h%NR%gcKo8bC18e6<4L^!;7L7jrzQ%htPk}Ui;;a)bhL0S3bgDG7w6A zhcGYOQOrm6ygYa$^`5l7$X;aF&7n#}ojX{Dn<#K`=f=I&{*cWcFYHkZr)(GIO*NCo zKhYf4QW|4rAq`~jG4TZZYlmgN#o_1|U_|oM_tf(~X32&#DKb~l&v>b`rNz;(zI>Ca zpL?Zex=M()8to`&aMHLNFuEMfQypRps7;OZJ;mIH+7C)uLOR+*$m;Bd=BhDI*Q=J% zhGhlTg4hA&)83qYzj`&ow+ygC#qEh*y!s#R!gswo0tK+~Kv{vcb~Y-~onW{I)JglO zeRPt^W*JC*9jq*KBYNUK;M3O*Kaq0jLc2q%4C8U-J{nd>lvc?y4qa!U&$9TI&2UmR zh{)(%C>{dtTVS!$rXPWe;3r9}eaeVJ=JNH-_jA(k>U@)nq(%-RFdM~NWJg2_V*u$NX|}bhQfFLmQ|FhqG5XNY6m82zrxv46_UE&MKnH z_brrK2H9c-SayPrHj4acg#`p${AehL8Db&$PO~0P_Ku^oAJ<|nvP_vE&?mbV+G$ns zY-cm_`@@h%8!HlqxjK+qv`6OSN(+5lRK#V3OysK-OHTqfts}Az7Zl19yhh?+KW1vc zP*j=IFi|=b2;>e8sFNoRuE<-BMr}}T(Jp`c$RMN}CpK?A0odUAY`<7ju)lp3dz2I! z3%a*$(Ynk^MU=qoVQzcLw8Jz8(xY4S1OR(dyP}SC&!!I{p6!?G@1E# zu+1BCh0oyXEf@#UmDLLc9umuIs%%@C>5wK@*Y+diF)CN-t8kd$*;3SKmDQ|t{@dO9 zw^luw&>t#C)oR6>S>u5lT(FtAk1VBEFB5J?vW+-lYW zF#5*g3=sE80TmcL33&6JP40sKjtHimOt+jRjW9=4P4FuJN1=yzjOUrxNs)P=>Uvdsl+PnQbW%L1}K zmIz~K9uK-Z<)!&XLb+}c+u4-7R7aoVHE;#D07e?H^4h_8h8@T9Xnu%p=LWtI&yCJ% z5s%zgyf{yKuq&@dKuHp$2d#LMbhklL9xB^}=kX4nPQ@q|<;vAO$z(J>hs!Y5l-U{% z6*mSlB(lzW{)Tyj7liB+!B+?)0?i5r{zC#4EyPs6yZpI>k7FpQ*{-Cj(_=f1oWroh z;nu+X*PRhGEgF`ZLX86UKNUQsEKHm|`cw84xeL>PpeY&r*OnnNF}y+7-iqIWIM{ghM%~$=Mve#hY|x>j*#* zIZV2aScpggD$ld=`t$4LNMSo*Vg^JjCTb+B`FkuAUt$QHN9Upe;YYXqs*P2-&n4@L z;sm}B+AuT!Sfq@%;G}E2&?H!OdZ4_9#Eg8L#r7r9O!RCSVnPC7|INCdgcoc)Wn=Qxc6O(H*3Nc*Ppkd+!)Hen2{Qa|I zjB3#vaq3%3wU!{{x)VzDSlMu&&E-$nJ)X+T^V0(x^FEkgb(bsGyw^%kXFiF(KL;My zZPqYLZ@4wE4WlpSKsSFJf{XSp?;Z9I_5jR3s^ab14K^kIaCg%7ucjR-`VJc;#7k@j z-r7P<0Ajk{eS*o|aL^~vahE`|pIuS+%tp2soYm}!S~Twh&GKJFk_dXft`Kv*eN zyn-f23@Ty0CA27{Ee^H`;Ll!yim~W3G;ZWhIB_?t)Z3F3 z&!XO(}#SXTd+-!5@;ttaz6}n`LwjKR<U_O>e$w`ZMkP-e zy-8};eT|8AJ35!bRCoD8kR`o;`JuAJ4J7g*|7-`?ASWBNr+pK0&*!bfs7p4doZs2MAB&pWX`yB4l>Go%0=pY?x|c zV$cSZQRyMwT}|wd&gquxvF1 z>GY?|O``B59WI{r(v>3dE$r%RIlYsM1CHS`&Auoq=^E(Gdkbxx`42GkBOZwL7z*J> zp#X9z50jOv2iqv4zomU%43moV{?fM$ehfTX$ybHx{Af5W)25GK{$X;C$*wPi-9vNN ztf3Q?!R&b z4AV$jDZDZ&93S$>Rk&`Gmd$ccg6{flPuERiXVe?oT$1zIRu_~J)dPhUhvTNYSwtds zHl)#NRv5T&g?2ywZs}y<1iOcV@@ZvdgArMaN5w=m@g{SHJmflK&yr5-8DPxy(j+Q|O6Q3pMHP)!;?U3o|O`hRejnGlaKbQH~8* zoPB|;xG0gNJ1vq9}_{34~vb81F^U5BFRwnkvR)5qg1Kx;BkU$~#lWTH* zd&#*E8-16Aop5qmbBzm!ywn4F*+kkHX0_w;1P#xv2`(S!;PD|HKIXP+?#}YL| zVUs8d#nwG^&!v(~+{(EOBsDs&hd<{PSs!99Ic-n9q|Vt)NedJS4SnG5<;v+iI4MCw zZ7CEP1tqo8{afZ z>sOb9l@CH}R$$GCF0z>;b^&vA3X`!S3L~KjP{k>$M%^nH`5dSY@tsOV+r~u*6kzx-Ns#`O0s&bh*nP7#3#opa@|n>VE`qK7k1+O}rpCUqG3fF6JRaxmvVZQIa>oXaFcb@js-G;bZWLW!woya`r%X()U52lqT zYDL=!McwMt)cN}{hV8l*->@{?!2b!Hx3v?)$ zJd3S@0U>#MO^u|~xC2*+J``toQ&*}i>Lrk6+eh;@?|uo8V4+aS;RLGskn7IErDYPh z#A*nihydv@yS}3EE85pbU)=CSw?%-8whAe{(HEayPWf^FQ7IIaDZE8sVyMK^SsA1v zZFD9NL+=#pIoE8@HtF%SC4;xpOiI0d$Kwiil-?s(RLUq$qn_}o8oP}LcCK?@5T8n- zI(?9Kpp!>B1EYyzQ9>rDKHbJKb~J~m+u-U@mCowl3;GkPm;?-I`AJIXjUbHHxPuhN zC;{5c2XvdNk@WIKAKjtv5|fJW9MFdQ6$L2UpT*b9~+o{f@J*D2})@hCFoOxEopC(%HVQ41!|oOjBt(BK_fT`xqN>9W+-| zzdk}1LSFzn(*1j!q!->)$&dBL?VO-^uhubl@3QJO*5fTySxi0z9g(P!e6@`c${Z-N zt$CQ8tuapO_fI~@AZ7wjpwIMBS3UFur8-9oLR7>tYhdlwRX0V+_H^w1JyYy}v@w?? zFnU$TKaaq-8-%|z77YM{HH%P4$qqZ1j&33@(!L)Lo=S8B`|%vXoB;c4Z&()lHLDjL~MO%L)mjPHlN6s7pb! zQ{+d5Ssc}N1HC93rLe%0-|bL7)e=+_D7I7*ibCi=wgts+)zHE-%iF+Tv~5y(XDBLd zgEcvDhEmDOH>0Ac%EkGmD5O#=M=r$|x;YpHxjRqlTgP7Map4$uZw$I1a#1Q`M$szp z-q?IFQ>w7dv-dqnNA7%-_94$8()Bzu3|pwS)Mu!9e(d>-7uTN)r|U>01V;45Q0w?2X?hSgkLRUQ>tPng+6QwBRm41!$OyOp_B>%CK@fM_m(Kf&&j$(AKqbhAF0O|C@ny?I3tAVY&B z@zyQLF6405A@uko8&ulVxU_=0G-l}eoZ!uHQh*_9;Pj~yi;G8(l#CFhD}go*ro*}O zGWgLs4lk-xaa`%s!x^D+L=?>1wg|1@hE{`|7q|Pm@zHcb${V> z120MPbLv;-EQ6ev;P1d26C~cQG$i>=1{n_7q{87w;&tE(yeA2eeccUlGImxz5(G^Ou1M4y}yH`^@s7%-M}iX z=SY0@D)S9>ZYP!(MsnTT$hJC&9bz0pUUw+&?E1>Zv86O6)fV2DwzMRB#e6#(5_&p> zKJRB1qJVd;{>KBWbvr2vqQ3%=)TzDcPX>qtK0js<0pmic>Ica?)VN>?g(YpI!k&6&afwDKdprVBT# zMW;caemhldqbsJ_APZ;#BjIl7y^WZZfhQsA6^?#rrWK|mn{B#rxKZvP9_#~@xeLTP zngZbJ)X@ogWA19m>oI6wf+cAHk-MS+yWH6x(J>&xf4sLF^uouCW8DSByme zX&|!g=B*EOUZCGgHz=`mb@wwSW$#=Bs}{F8sWKKFkJX*`48$*444fwYoE`BMO_B%VMn#;)lvmpj3v(rkd#7b^{TBub=Zl<-?pcs<`xcJ4ugbR3m;z$r8sZy z%?THHhkqO(cWe=w&5*!$v+?i#8QijpHyZ(cR+Kh`3|*8A#}ZxjW=C>K+p>3(uQVAF zN5!TjpXYm>Rc8^Q{~BcCx>aqRH16zj@sFs#)>aq&^!KCpG>E(rueK|q{Y?gn7Z`#3 zRgr3pc4xYdz9W=E>CL0()IFk?zJXC7#s3z~7-i6xtRWrEfU8ho>QVnnu0K_zxW0?p zU{R#iE-)FVz;>x~9EsFJqt{S$fVS!fC{ z{T~MI;s%rqY<;P@FYK;v14*J5&z4WsrPD^i*6vmS^C)1!-Pa-bkI@26-{kd2qHp?u zz9p|;q0#+pxM9aEN4+FIpv4oX5B-Bn^R0Iq=#-KM$+S|D)^Fc*PI}LxUg`MlOat3J zDNrx;>?FSO5_xxt>;n01XiLLKH}etvY1~Z_`Ad2Be@(tG9!Lb8F2A3U|MS6CDe$4i zCBs#z--e_A`J4jPs?e|5(O>@uhaN+LDl954gqwPitWs;-{fq6Ih#!+0?IzG%MX{q|Nc2JP}u)-ufIL`ccA_l)_(`;-x&p8 zfd4MNe`6FpApCz8%pnk@vt~ausqo*GKYu~w-q0dqELb@F? z*}Nt7mp||un1?D8nIZf=0S~tLf8Duo*x(=Qj(H{Uo4@gwGdz>_Msks~Ie7KouWz2*P^F3!{ULhAo`0sOZc|9^g=|Bo*24XY2pDLNZHE@+?nA}cn!yEOG5 z>@Rnhx*nPGd7PI6LaMmsOg*EJ>*21O$kZ1eB*4Im1ZZomG8=&548BFSWhJA~;+P`Q z%R{5LCadbmD*<8(Fi6rkTcTEBB&|yGmrZD+oHCKLACwE!2Q*t<@B+D!;Pp75Q}R)W zfS#OUsex1u$HiBGRTu#A-g+GiX!AybES^y*JJ|JI>DV#{JV`=+HU}CQu^VH>GQcJA zEciaUq@@hfXMcz~#?s05H0S+Ha9XCl#f}p!&c>qK$tA_;UC8(FVW+m^gs)yXlzQY?NgUfFj-8 zT2+<~jQUTl(dS;*0Lyna0W$E~@N)3t^Z$M8IAP$b7j4JEN^I5j8Fm)0x0|M}Y?DuZ zzCc0|YV$)EymMQl#x@Jzmw-_b{kaq=hW{;}i3&3;a^wQlT6>cO-~v(6Y3R88slqKxHoxOjoJA|>l_@h4v(UX4c zUuvUfHav=rilouUOb{xEj&V+x-XsfhT7Sqpk&3e&OnY;;c+y`cKpm=)`h`Ov$4eNeSt?-S)zO_SDiB1 zO@;=$ws8TH3t)uCoRChyo5wJXvg|RV`$ArlY_rvw>&udH5|Q+B^A1Tr3rbFg<$ky< z=<(TJi|~0J6&T1QDcNRqGiTYUL`O?0iWv_*5InBXQZww>^D^v*QP{2z+SI&x)St|s zwDe>`_n{h{R1}Ma|K$52X|ElUV1_e5p&MpQ=68_3dtbO$ zvQ)X)ME9M`k!k$F2>sOqDNaKUK+`qZq12e!CQ(tXck=pn_M9{4Xol$cMo`1i>!czt z_TU43)-LmOuk5vFU2(EznKUc$jsT=|G*7<>Ym6ix5=!iLPaON_#n(8;`@&8TInq=L z_4P~>TCeP{jpjsy{HN}E^^P+ek7bq^m@yXV4>j3qnWh@uw2nz;D<;FNRA)85;nBqv znAl3zOsUXG)J_eIuvB$i?M!(t3XEusJ8JEDzRp(Gn10OHRmy*%%6M(f-xTI@acp5S zoEw2xoTpaI24n&IX7>TA7zz5)`4*41W}BKiw)!ouB~+cZGDqqAV|7fgFY7d%X0h=N zI&$YtNswIjgsl=bd>`NPad$kzTq!cW;cmgH;>ce<(7K6HNfF3(LD#MDN-`P!&r_RC z2gKL&;bE_9EqZ-557=|9hNs1@JJQo%<$t!7Bwja~lwQ`qPEKyz)J2y{rutx?J1CnN z=Q_HZi%~qlH(PY?VbkSNg9H>~fj&H^yOFA2#aZgn{UV}ZHzUw^*$4A5PwBRkkGsW5 zk?l(HQC?vdY9srP^I51_>P!-UC z-~O#{fJUW4yZ4&D%~g2!i{4FpzOCt&X+_bJcXQ;`9_oxE@zzEKBvek&zV+NJ&PqF4 zb#^o&$%#A^700Bb@@i;y`nk&$@xv$h=#?|(Uk}P?W!5)m^2EB&W#5m<+|256YfO?2 zz%;R4@?HqI*_5+lC-2o3Ol({TsnjWmt|{HLpif@3;>&l=G`M--bruRd3ydY@GG&ke zz`iYdeYeTyFo^kuXXqv&f2DP!_7l$yJX$HHvq?T^3QZlmUZucW^d+rZIGyq=dQ4tN zTWiM(FImIU4xr7P1kkKqx1gQ)=PwyH>jK)IfiPJ@jgx_5dw2{Qy|T@l!>}k!J@0YH zN39=ZL3cKBH5Cnc#(DA1QCryS>fOdL@UrjKLJr3jwvo+uF}Bivn0&Mn*-NH;vO%qp zk1Yn{9i?qb8y-KUnzcJkf3nl0pp#lP5fhnXcCo7BbEj}-5xk~8M7dCNq=I|(SZ9E+%@{x-zjHiG89>EWfvr?Tjq?)UHlfw6z(6X;HgY+XI zjYhqsE`YhNT(>4>*_5aK(5G6AsvY#Fg5x##zjXui8Yb|*zA!B{wn$^LA(Z{NcSVsg zH~jS!VDl*~fSfsfOs$cj|y} zbjiWBFko_IwPL*hST^X58-gS#w(?aabv(9fr4ii?;sWZY12u0rbLhkM~wYQ~4 zx|3i@anO+87L;k?M846`%3fEB#4YrU_D%Sh*gYV0aJ7zGdUI$Adzl7}?oxR=NXN4< zNcuRhitDyj+C7@64wh!OUmbi=##iH}Tlu+lACqsD0nS30G$Lgy73tx5?{>Vi~^uBPzCu- z0VFiuaUu!tvvb5NpOq8{0D{Sy`1I~lHnC)33DV-vU`ea=kHy4>^AP{PR|xI`%I_L5yLL!F-5 zmF60Bjx@Sf&mVVE8``Hld;$Jvb)f+>A@+SlP=>Ys|m+ccsj z4=dChb5VD^a(WtjZKpkICBkZ=M90mW8P~yV5Ld5}g1I@tx0{6OKSCgH}`EyJ=Bpt=_c##nxp5 zTS7ga=^gs1+~Vu`?<^zlUd?jas8IFqzUAYqboNQUa?6;ib=MdqWM(7jQV9EYbxizd?Wxtv^1{l-q#fhAZfA##$xHvhs$uv%?r@Ca+a$%;Ib z9OuN##l~iQ**0*K1UrETvSQ`bn!htUhYx$XYg1eo#EiuEY-4_!MJkeZ5SRfH;u$S> z#Q{us7=myj>-rgKgkxAUq)+$Kdo zD=+HIm;$lX{GO+3mNX$;uSu0~0KAn|N|g&FCc_V>Q>Hm}4T#uvS)6C58a?VJDkUQx z_}&1nd(@KnY1k_*s@Z;t)!vBwj!?;UB$VZM^N8;D*V-S5MH;1%Qu1A}_!=xjE_oKQ zYfO2IGFdfWVA{J&;gMm4ymlTH;&6&hlvk_I6jaVGNOU?uyWnf`$k&X?7{HHw;^(%C zxHZY;6f*sgX8nN2Sfr+iS3J*g{V^K60Sak{j!-_kIE8@64&$(N> zD)2j&TTAI|ZBFEB41SV*7|P--GN%5foRv3MTU`d(CULrGF)p$*mY{zqUI-_kZs&at z1{8!?eDoT~U7t!Ty^}o%uEZr^o2ztA)2$UKeDY-scdKLj{8);fG92f!pk+>YWzJ zUFW}k(UjVtC7ejY-#e9)4wM~0{Ec=M+4vSAW1j|mr@s~@Vz{qK5orpH8c^@z`QVUsI|gXJ_a({8bd zbI|Kh&-QefFwWyA(!~+mjAf$kvP00p>BQXXH&FM}dtL6m*K9EOhW9Og;0Dd4zGtrP zHqi*>lEg}1tn5x>Vd(Ojd~9Mx*7H=v$nUYU)bU7X0IyJ%NU6935Q(rzVvdc+1qavY zOQTzd?&i3i#H2`P9VaNZ{v2zw)`7xpC8?T=*W8SI<@Wi@IOi=D^FC9YHZQ6AubN_Q z4UTWucpT+*)Af#JHxRgg{)i`8!0dO%aVMhN6ll#&dhWkK>0p)3+T8^j|IRw^&ZnC>Iy2)BIQVaGLA9ne zpn@(2<0Y@3Iz7W$y7-ZJ`D4Ziz3aU(Kfm1}KYCG&IG_00Qyl2*+~W$&KB|%So7{Xp z`4Bn3tU|5$g`-8RSSjDkZ^;|a-@^S-vQ+!HbS8=# z>H_oGk;?8G(auvx*+=Skik@C1*WM)TuD|(!*R{2LyxfVtBthI0#hO~bb9_R6AyKzq zwZpK7M{CWmO?47H6uQkmH`8H^GMf962Iv*!w~Ocf!5U-3MTbE`p%#a4%v$2)L4#9y zhu?Loa7B*lJ@JZRiwwHs-h!A?bpV5Q_6w4YmBDHo{gI(9<$E6j>Z-(69D?XilI>z$ zrj@uwd6>@zg^G{d3%zID50CZVe&SBnzrH*p{0PkP)Tkab`F>?!0ZhGK$j#&!OQHbcirp!^FvER>~Z-Dj%>NMVr(`i_4Vr@ZI#T)j2 z^t!fq&ZLW@r_BuqY;a88<3sQ})tjnTD?nv;ya3D+SAVsq@iBna+6~an!hCnA#7~B+ zNDg3S6*eP0{yL3Xbr`Gh-}N%&#S1bPKOygOs-2v*&BdSBLMqEXJ)aPq4ms#_V@;{_?);B^A%R zCu*$5y6OL^xP_gGnuBEAoVxcN3w!zFeZEJ0au=(ySt%z!ziRG``dWM(UeB6plSkGQ zw+2{hvz+Y%Psv4`jf$5%8B&8S5AwAeJs-EDFIC59*{O!ptYS+A(K6Cmz4KLkq=ajt zTpvIy6+gVD`M%|=m6v>EaU35%VFVhrM*32zd%wFznH6lR)~&nqY&S5v>!ln{oFH_M zJ$rnUwdq?)fSnk2L#)If&&9tRJ>GN^U}VtaO(NJvYZ6(aslL{qJ3m>xW56w=li|{-`TuEXN{V*X|>1n>U+xBP#BndSMf9 zSj*dv+Lu2H-!TS%>Sfq2twg#^{_@-J>T*RIbUYyu5ha>UmnN<%R@bk>$)U^lFmxO? zX{B^Z!X1>ju;q7DQYc8pw^vv*f09|%4u5#joX~W`Ay^rgkn~15nyBtTcd(@X0fGw(V#9HvPv3pf& z_R_ecw;l{L;=z`+-i>4J9M^1w<}UN3vQk^DFDo6W`qZl?6zm(G1a(r-%bxQtH1bJvxQAv(P;Wx8AV#fm6Sj1M zP5!^wd&{7@x;0%pAtbnl0Kr{@h2ZY)?!kTGZowhA2M-q9-4op1Z3TB0EZo1D-M#ne zx4Yk6->>uQR3%j@n5pS=jPX48ecjotwE--wt=EKT zUcaxR95R)uWQyjpx&8FAp6#2zlE(x9A|a>HK4jjd^+nWks#q|)@Xn{h#tB~WarNFU zt~{T!O}-lf19ss?Z!VYg-~1(}L9-6#{(U6#Fo^L8&o_B+F<5SJ9R?veO>_Af`0O@{ z**psAE3B9!f)oM0GT$WQahZ&lPINn|8YAV!G-0|ED3pd&J(IY4(Z`W^8fC^pF;EA9-!+*bRkmM_a!b$G?y5KP-%jYt>{!~Oj^1dT$upKdX!2>d ztNwiIpmk|T20beE=D}t#V@azj@=AQo?q?-F^-%BO?rVgzxnlzm;-;ov?Ps6;`QN{4 z#hU6C*P@%qV!@xdfeuJhg}i{nk~5}&gVEdIOCE}F7H2|{t#UJ*0Vlpm-LF?i#&fMz z#;s*XdwVziZkopig*?a4WA&wuhf|dGGWXZt>-EB?@{?f2-Gjnp{W=f1S$+k2F9`?? z6cwPxG{ud}#yzAWMzA4EHhINb&t1`WrCiwEgkz2$ALcr}-{2H=#1%Dh=4`2b2vOv} z31^}dk=~v3J~;>x(b^@}E`lAj7#^4tKv;rA0Obs03Tr?BJ8PKb4VChj@Mua?BMBV{ zne>AXL}+!`41qrM(XipJ6&@MNpSFcD(*o>pHA8LH-h02XYyqa<@Cq8Z1mn(4Z%YNA z03$IyH4CTg<-!M+1%Pt0%}_yy>n9$CNBKuWrXA#jHTF8ksE*WT z7{FFkVq;)lj&cx^orOn{Md*8+MwTCXr6+rxXKmRX6uld`uEic$r`0pxfeFv1iL<%A zFy{I+Iw_?1pLKg7++UOogpk_*sI+o&YnP!?p%);zd94=g>x81j1$I7_4Xsnan8y`W z4fK$JpSI1#Y2vM-Pnnb52uuPZVkuq{PjqfxIR~z__g_aScN`in7O<8eNV2P zD7Ux8eyBIt*##lo&S`b?N>Zb`Q8ukZB`u9 z1fG9)6%RVkaY+m*wAGXcO6slfL9+kQ!+)|pxOpe~PzR83xZ;9BKY6yUJ0Ro z9fZ%SeLt@4_I_t*6L0N|0jyOv_k8tato$=9#g|A`260y^!f3k1yJhHNPyfO6)nM$7|8?>uZ~yy#25SPaRT#pW^_Hg^ z7NGv@ns2+z%$t6xe@@(~I_K%0y$ei-*Vk2mo~KJ$8k=<*69EPx!I=%vv7!V1#sd@Y zp+6X0g}ec(+sHllrwX1<+lVsHGmm<$b&VF8HFevE)nJ87+SvOb+9CSheArAm33W%z zUbYO51JwBb2u}SF7p*4w&98z)@P4g=`fgXkQi(&i98UMAhBeRB5}_3OTW7+=@35y~ zq0=b}Lr$9qrKpuH!P)2(Xd%56fX;k#acT?bo5l|*bw@lLy^{#7>gX_DdSV2^eP$yj z`3XO5x@a}K#aT%N+#q1x%NExl#%t?0J4mq;=vul8^2Zl6dEeHF$i`fSNKAYQG{2TA z3?EfP$r#Q@bs{S|ZleQi9a*F3?)B!ZM(*ACcsYl^R|({~3d?|%ev)8NLz-G$AC0cN z#l7*|L@Ih&1P)ULdn4l3DSBvk{N*aX;j?z5t2+g`D3Um+yOt2unt97_a-H&bSa5z( zIC9RSl^e1-f;;5!@O#W#Wd9XU0>9mQ!Kc``l-w>H^4T4A!}$wD4t-xUH7DM599G_+ z7}>h1N)_FOoT68^Ap=j}&#$5&_qjGs6T zoo0oyX*SFqsrJ>VktpcYHK{(CefXMbqm`cQc>B{=P2FqhLpMU7(}1KOEHu-=kJ5|U zr}FA>|N8E9WWR53?pMhexn9d)_c%BAFEt^ohhOHe3=cm8-K_Xe*T%CFzjB&nfbIY@ zCHhBy0)d{JDSy(lmqehWD?m(Jgu6_GhU5RRrWeQ8xvX>G!)?x8Nn@`w5s?}fjC7lt*9l!Bl=$D7}5SI#q zu9N3mMRcJ`o%ow%DEA&!qyhNh^!2uE!ee!KO`;6BtS>VWm*nvV>508Y&y<5EXtP~P zziSj**7_ouK;mQ$cuBK#_!^a7u4@gs+^Nh)A^JZAhNqiA1AMHWJ3BOVF2Y`@{qD~e zgoP%Ee-M0373-ROj8fv@Z7M*Z%UZFDrll z*jk&q{v;pR%*KbyX*-{megBGt|D;teG&Iw^7?kZI?Y|=3{n(~Pa=kU^dIBD;X&FYc zf_u&5s_r1O3Sp?40!mPvl>4I51YRG&Kcj#9So;~pUZ>7!u@hmvcal~oK z5~-29xOjW&e<{h}^RBRzynnMx8+6xZcA-Y-d%EzW)HBoU37BOq__k)EOCEpcZy&JI8>!9F}&sHBl>bp^x?eIyU9vn;>p7n0`kWqumt=g9g zp3GQ&r^lUc7l=&B%o8t)|4QD$($$n$UFMQ?DM4bed`u}6_Fgl1-9X0M_~P)DQyrm) z_+01uL=5^}!Nu<|z6D|%;$|-ECmL_xT2Dz3UURz>J@8_F6C^Q#;qp~H+eGe;aR=&= zdN+T{KnlamV6KO(#o}U=OPc!YuXg8Pp#iK z3YZ8dCr+27zo)UUNxtB|@P$#d9&ud-W$t0FtNFUOhA_IO9l&NNk;Zm%niQm}UP7wn zC=CM!5WIlZ*xV`29`95&YbMD8Haa^Z7hYBQ)tJz`AP!;NVp(zC)1romR#!SZRIelP zdk13BV+QZk?AcE%104M1%^E?F+z5id$AwcTo_@M`j2&{7mw3!ob%cb;fx)I}UuWkx z2BN16G{%jz=8v*wG_hWt=ztZc>kTYws~!gdA~u_w^QRp^h4J;;0iNQ@v)XV`!{7V% z)A*+P=SH?b^8?IuMG!+3a-HH{*@bd`%+qdF7Lq zIHN-kxYq(F(i1_W)n_+3E~EDAN}H1in}gMELBJ_{hxT_EF30BItLXZZOR;VUFdm$g z)4)7nsav}dXBx0aq>iD(`vEy;dT^wQ$&7k*f8y@m)9Y5&Dqx_B@hDpO>-KX?=#^?T zvDMKM%%W!#9HFPZ4IxlDb-(V9#lm7q&s(k&%z8WvQFi>Y$?9x$i+NjW$242F)QPV@ zF22C{P2M84a}`OsYFefQ*$;i})dm;xy7Z9mLuy)oHcGoeN2DE z^ww$VI%2!%YOSB;kAX~FiguoAdxphj0b>?Gyg0P^Qc^Gwc(+2Q_Tc52S6hkUd z)`nm(2CD7&V2P!ISX5_;TTOZfd)-JdIe-1m|sYDx|#>i}PP{lX( z@Rg1|c0nFrCyUhk0tA3&h=Jed;EU&OQf@Me7eS^yw9(-qO6%db`u)MxiVj~1H20`o?l!dgn`qi+g1NQ*fYgLI#6r(>(_g}Hs1J8BBa!ZsN zNk7jbuxzo@E8hqrXG)nR@jP@Zj}Yg7&lfO{m)n~u==&?|EK>0kv$bB2eZLcJmO`Pd z!%CiJW&2=xe{DlIe~gnDnNnm!2iVT25_8=#phvs~FBBpdblFxu1LF}L5>+7D>89%9 zE(@4OL(?i*eJWCQ;8+IEJ{*E5^05o6=C6hgO_3Foq?(&wu?Ap0| zd9j9Va{Be)HEJt&7gGtv=a<0WhW`#nDP=XzB6$vF2fpsK4cuL|B(g{&I^W(JymqXE zgK1``(6}_ieflWyTq)VYgFz*JI@z#YswYq}ct*&o}ISQ7BS!WMCw`+$BnNr+zTzc%5x6=h&i(F2V zL*|{E5Vl(MuHIHrEj|21ho-OKKwa7+G(b{G6{yv%o`WBtYBAC^z3}bOk)M<$Loz_a zA|;(C!hFsth9<5AwHxytO!MryPZY)#RSk9#;1i;SPY=L-l$1Y$h+xNaCDERLXN6l+ zakmUd6u}&Cb}313WxVrb8Z@KWuckV$>!461;ZSPML=Zi4ZtX_L0`c9&v^~l2oJ*n$ zkOcIYSTnapzIQd%zm_xfp#v&KVJXET3%@XOjC#Ks`c%Z(W&msBU1HuB$F7G{VyQqC zU5()D`oh&_sN*8=EMIKDo$`!46Z8Z#)AfLs$Z@wlA9>_Lq?%Vy4M+6_R+7uJGf|Ta zlGL|#ArX5PwQQA=5>8|fgG~2AGxLO+A$`fPSPLS3HUpQ4`xeea{%~&aftSNUiT^zhe8gKBS8w1 znGp9(Zuwfqb9NL!(dK%CNw<|*jlbPk0H;=q<2xz%u|N*b73MajQY}%tptj|^SO%!) zFeGYUMQsRYY)=_(kP+kS>xR?wJ3w~?x;5-Dc0U|ZIFPCsq1A1eBwA5d@bD`5nprrU zbl8~J6WF$^acFYF9a?z)H7<$*&?Q}U-`5co38JDA9;XI|e&DsawRWFO0{~)6$lw^U zuUKbpIQ+8$)kdigv;AjX+k-r?YqX`@Zi@GLfWpp;qBvL5*o}d!uZ3l?*mn5boz0RWV(XDzxI$ zWpA~iIP`{E_lLo`-^AG77s_PX({O@umIG)4l#lQu+YoH`Sk7q-taa6v-)EsgG)v4HR2W; zNW6!FQKzAdZXkoJRysPK(_u?g!2P>OQHbqYn-;)MsN89Ptfo=~x=7{D$4hEy?6y{Y z(&BsXO!#63oCgr}s6XaV3)9A0Gnv=9Z4dOta|b((WB{p8Qtcc&L*cdaGqkpN^CQ3C zGabP~T~QDv$JNIM%O^gU#`10^w8Zl`NxKlu3E;bB#<@b6RK!lPCHAo4m%}WhV?Umh zt-=kPY>u&7%_@_V(g|m3+JYx#rs^OtK=p-aYi=tKDCTMdMO|aQw(;{&dEGei_TA#U z%Ek|Lgm_}!e#>sW{}5aclm7l~`bH||fvqPj2o3|8+)g@$@fgDBUE*i4q`C;*?=PvK zMoaytKryojAWI}JrPa{^x`dBF|3E5jhDCLz@GWAMvU9NJFQjTzu@IFaKmrVA5qjji z?A}EkkP)c+v^jKD#Htu8J7y3O-5@a|UTRKt@HpvGFSy`fzCLlahdwZAxC-?33Ztzf zuK%mj0L zsWWdf^k#g$xniyDL+A5(o)ukNzYgyKu9$MA{oBFhIhO%1&NWshSqrM?%;n0lm!#6@ zB|VwJEywCg%_h-~AGiF#&7Z9A&qk*n3wKpLg4<@dSE)l z4-H+v_fcZ(6dHE#Atv)~;G$Uzw59FAC!z_BXa?6dH1+3o9H~^En8FfLS_x(ORjHuK zvzxKpIKWTL_h)`U3MGph05}>mfhb+Yn#A_81d*o{vh-QyWgT6|8dsg2kfA58Hoy7i6OW?!Qjj0A-UmrTFmW%97=n%6+ z3@@fG*(Bu%o*4y!QEZ`Pnj$uCb(ad27qjU3*6krw(@g@~Gi-(x#h+lKV-?-2Q;Jw( z#Nn_-p(Qcl&AU}VPqT9rN1E`gHVbABy1fb!w5wN$?D_F__e4nym>28tb&`&edsrEi@TBJDLpt*8kM%dmf#5xOKYom1ZRRa;5AXUP=|9Kd518DZo1O?&tI<(Z&)R zG>EcaIfdPN=CQ!IQudCmS-*L+AL!*Rs75Tj=1BPbz?@0b+Z29HQkQ%{ z_kRF-Y}kZ;D|Ehx4cbmFIV0NCifE3JSmHNnw#%ne^Z`l{!ALxzN~-jc0`M=xG!O0w zF&q0{_y1Pb>n*gD-ee;yKIH+x4bLiuDT7bQy{`?C9_*4RzKcIJDoVx>31tOgY7j99c9+128A1isCgy&qD)~LtP z7Jw#!aZsQR5-K7H(wJlivbBWFoHYR*y{hB;_A&nYPQ{Q`xZ8cC`GUDpRE+n#Q=PU_ zmYOVu6wQ7!>vi9LF32<|XMjnI;9_v)Gc|KuLPx^%)wN8HC&=PE1V#GpbcqCE;18l%CSRRX~`d5jddz%R{dx8Oh~ z;~J}0eF{~j{uMW^F?;Fd*G2VChsgHa#Ipxxt~;>9@k}DRV&bJnA&+$Pi#q%s$$BPQqG!# zZKdOL{Vk*2QJd}MTHbgf#KJau+MAo4SE}2HA!DcvDaYpi7pqsnbUrnuSbXBt_q~Jw zii}g&C_8WFm<%48P8$Lyo@jxaF(|exX`=1?NPx@uXTLa1 z$BN7KNg%b^v?Mj-Ezgl+L2Dh|@~_Q~yiMOf0$}fk&)==yidS7&pH?RhY3Wa}oK1%~ zK>L3TS`o&Rks~J-Mt|9}XnoUc1vYxm`N&oeZ%6>+VFJ9M1mye7xu`pkT2)!h0U&ci zVSm0dn_J;AIwS*=!)^`By|Lr5LBw74U8Dd&o2niM7M+6t$-LC9GD~2+EqM~1YW?>c zC4x>4`vpPh4S*br+S_;-bA{(qROSrj~ zh^A&0UA_q?;(XL>Z~fDV^FXFfsS}GBMCq0?|D#ZPrtXI)^(R{|rRpD1AU7V7+)`6cqGDZJY6Fvr94VsvGP@>afC zi9i)7UIv@eXb2&?_-ZNd3|eOxlQp|SgLGG#MNl8l(lhis)k`8XX)F=>b2(5Bu)x*! zR$V^P%=GJyc5s&z&8z@WAsaqOl|*9a7_hX_3$5rJ(!{o6)=-%_=pEAdQ@a5o8$xp0 zHz5;55N^F6%i#uz^(op={h#lZ+P?Fl3R@YgDMZoTA^)s3;VB+!Nm;nKmJ9 zS#+|=H$Hk_Kv`Xgl6}YdaD}m>VVXguKH5JfM4+~ilK2JmN4~|y2#$Plj?ld?+zRt! z^mg_1+r=$(&px+8?@w0)Nz1e7yZ}2#S6!iP`L*+MRe?eQ@ z%JxinNPYs`8y%AV>au8sD`TA$(u~lEFkBm8MgsKYZ42OhNVJF}T6XPx2xQ~h96egi z6FF@e=FgMFqgX_DFg=wjh}PkwC>pa$HVT;-BEAuHk~yEgzFTsM zXqp_)Tj(}pVQ5nhA&+a~p8!MvsP}V|;4BVfeEbRh3K+Si!!e_Y*8msD0Cl!^E_>7f z&jXGj z<<1e!%@$PNVp1%QiX-oeFgbmwM`-A1Xy$O*Vd!JqEc{}POxYlPd5(O?v7Q(m_GrEv z@dQ?NmjEDOJ>Cp$v>qxHc(m?&JJajL!B}%mD?^?Fl zOgrrJIkxXhMSFf`pFuC69$hYNYx*-cVQok~>)LuS@}3Vv1Co73qU@Q%(m@;i z=0S}xTc{`Kg3azrW&gzG39g9QwfuuVy1;~$`{%LQwqPua=YWxN9g*^(<&r2Y--6b9 z?TH;X$lCD~MyO`SV7!=jX29GFV~M8_&D6Rp{M0J5d<8l8>u?NZQaiRrmot2LG)7yc zRoaah!7P5UH>pz&IiR%RPl>jj?vHJenh!ZPymjKtkTH@yxALo;O<@*7clFQ898HAh^boEm_*qS^5#_UPUrcRFYN@oMirTXIS^ zHFGGi{WI{AMfdpsg0D7`!`zQ>voC_AYU%hUK{R4w&o#zd+JjDqe0$Mt5Aj&0+qHmY zlkNDoB!hvvPCsTRzCD-Xgda&Sqe2jk5+zI~XI&2;{jVM;O_L~Oj=Uc14!OkCNhF$D z0KaU}btqtSEWO4#^d(R0_d?(=RgXBBK;WK#D=cpXM}ByAMpOv4WASVOz{Yd40oOV~ z+LL5W`l&!1(f)E{WxiaxIuK=&{}sSik;3=B>2^cUdXJ6`(}}?BT&7xapPLK<0W6*o-}0>ywR%c7q>Du(C4C+d)Oi^X*SxF~2ymgXnti zImPv|bnAuLFMRdba>hn(<2mKD**Y&$p9hnkQKg=)2n#;)4NfMd%O+spQjwo-~pM0P-?d$LGQX&bt^`ovVs$!Ic zN#n3Cu`qnYbn~j8aX6TsBZ(wy+9HCDs`W7=u-WFF4q*1ME><6H=R7$1h6|mqG8AEb z&&a=ddeVcWtZJ&!>9U_oGDo}-O>QXfNFGwzNFj8xM3gXGHb3G?b&I=R)UJ*lkr(LulBf*DLXMCB^ocsXbhLdu~KqwhD){S9sFH~rgOt;%9TgS zt25ZKm#!l58pwm!y(HgAUN*9aF#w>gsR$OMuhH!hAz$qK_ihyQ_Apdn!!e@Js^YXs z8c*JIVz?TPw(w8f?zNc9>v1zuGZLv08l`}AKXs{^Cg|=HV;czUazgg3T9ddi-N@RM zYkCH^*O6ZXLM|}3V^_}c-1(`Ce#FMyT?c3X&*B%TpLWNyaY{wdjY7#onkqvk%WpC) z0&#&1E4y~wITiSAc)qW@KY@w&vAqkBYH8(X9&fLZxQ@8;ev|G6g7`h z*h(LYI$*oW!Dkr~DZX+&5};(LWI2Z_8M#r%A0e^r&};{Ej87@hZDBmzH$In2lDMMV zQ^!hNjreM{8NBg(j#+B6OUImQ0d)+V(2arMNRe{IOu7))f1xlrbEAC;frmJ1&!C@D z#CGSEh#`%4|9)jT3h-|8op#~YWF_aqd*)bvEnH0)6aeU7q!8%xC}4;K5QXe~u;i>= zy}mY#p~+u({0Y`FCCiA^uoEEf8~9325XbL>3t1d#w16(uiXI$E{BIyRSyfr5&7l0= zg##_-06;s=>DD{%D-Xv0Y8+E>A|LDFg7NEI1?nf--^W@H7Np`^KId@ulQ3phT@m$P z&z`QIh;;W*67gzah8+SlkN!)ZFT2F*u;?MCI|t8Xt3RrJN@(rQKErRpzpM4_x7>f~ z#bd1-_|H0V9LPX-6`kCSSr%91>bK8krD4xNG$9Y{dgLkbFg%h_1Rl(9FF@g&lDXN7 zNA8;21=yH>gh(2LJr|s0-(&PNNc0k7obhAOp-9yoCsWE`7m6-lU3%V570AeE?L;;g z5B6lx`XW{6w;#-Wc6TLP^i;zZk3%OgI6W_l0AG;~dS4g@ig16X1ew1*CBWm- ztwdgaM~%?NXO<_c%YPi$PvLhpgBb=GCXdVCFeW>tfDnZfEWFxHmG&o!zUyx# z0)Bxo*s}1Rhcg&dqqk)3^bLGdd%3nEK@9Hu1t~LUK4*K84I$8oC4*+OBdEUcxBYBUp6hZEy_ONh(qc=vqh_l+?AiG`D>p+;lw8xPO2*qeNp3v(>j- zQ%1AalKlrK1YHlfuM#*OL@BT<=-(Qj!faL{{QDW{2aICJ_**H?#qqEdu?8KkI&|%y zRxQDqX;|?ZI#>>Ln=n9c;}rgAsa}SXRAj`#J+`01c-eSr*0Js#QN3hXgc2g|?8ayw z>rN)A4uK5}%Wan7a-a`K(DTy?9!sjrly#7)5T+3xLKC^Y)hL}7c-q5RXikGLF_8cv+xk6ngM z6Skz@-g*D#aXT3tVS65IZzV%3kRqdm0#}aK$W53id%cS6uY@$gG7|g83tGV9RUQ}1 zpG7gAr80$!kiAK5#yP0z;NXGz2TAjr8rYvNjIqoA#+UmSY|no|2;kEkHAV9x{oCzc z3IN=<>$kY2{~jRMg9?D=jQd@-wEkDT+P{8yBlQKQIs2z(=D&yHxT1d-B;u(c9}oDq z+x=7k_WB6hckt)D|Nc*PAb^Qma3J)+{x=%|zw*WWE_g!CtWN!}tMtG9BaHCRmnHge zp!R=*XaApzd71!Vv;_RCx&L|({}12pA3q0pnZVoUsw3?Ee zz1V0;l{875g6lQI{q6MK4{xb#ITlSg(np_lQ_@X#WbY|k5BR9ZrQ9a1;(HnZDg^~- z(CmNYi2W;ySX7;a@TG?d_(gQ|-{owhzxR)YfevJRlo0z%mgavAt08fI2?L!#S$y?B z;-mgEenk)q5j|F7J-v_ie@O`ZkHZUM6ci+CA@%wnaTNcID+m(?c0%Jl&1w2SsQ>@@ zfBYw2!w-mXn4tab2`kY6I|;VKEBxD7arBlKFFp1`j{ZJ)8WGq@-l^PX;@`%s3*(TG zpsmL8{g3RKe_mtJ9AGC{9hMm%|Mr6I!N6|i;Mc(Y?YYumk&wi6aYU*7ZOS^l-j^@D z&LUU;y4(N#c+i7^ohaS>a2WdA3zma~9vcc8Ao{O&`!A0{t|G7#MDQp1_y4?4|NRF3 zUwSzHJf#de4WjFmPJe$o@L}k&=d}O*2>*3LVN(88uv>taJxYp~5$|tL$n(z=aNWK+ z^7l^wI`9O%jFJ1>4RSSr%jOB@86)`Hy}$yGJNoGY*57XM{|@87+(?rDzgL54jzh1_ zy*h)(O&(aV(gK|17#GwE;(uIa|8M9Ejds~(2A%pJO$JEVtY*T(t#`=&>s=%{2EJs4 ztJibKL$1WU`&Uc84x?(RTVIj)k5gU>FlyIH0zC)wJ2ZTDSvrjhg42e{nX{3cK*#kX ztxA;+GB4C-GHdn9?GKWVFuMwwn9c6LGA!<7Qz`ZCehWMoKhtq_Ct^0aKeg#{IxP_} ziX`Vh%5m1a#f(pnCi2AOw{9S2A1V)bS@2)a7~w|kR$I-|SVeL}j*=+4yao%{^_71+@W>I;rLXRFOK_>Y= z-rXM3rHen19Cm~o802dq(SnO3N+DAm1_?e$Pt28e?&YmmHVZxVjP<;!kEf5Ajkcxp z`-#5L_q3}O?emV<`SSj+WUz-@gkEj!wfJqXgukswXsf>GakQQ0(XI3d5UhgH>5ql&CrjUr9Ph;eJ+UKi7V||?FdwtsHm52(Ljx6Vs6)m%|3|au9 z7GG`LpEkMGaaWD}m$y&y7)A;IACVREnnD_YHGM0Z2fhhl`xA1zY9F{D8VK_HKDc`T zv5_OBf8rF1HLG*M-FCRp@`vST`r0+tQ_Y7dry9F;?^?$CH%U%JK8n$HYg;ZplUT9V zBsJ!1Hclv%MDCIw^)r_bJ*S{B?Fh9u+ru1Y8S`n{0&ZhYTORf>t-hIz5*%d-$a9Ua zD!d-Tf3wRALm1QrJGg_sJdCW1eB3-)_9o)0hua!-IB^A1`;Jlcz^D81x=0+p0;*59 z2QszyA>{os$pNq5@+IQ!MSZrtwJT<7uBeRNW6yC0p0-Mt+R9Fw`)%{i*2(lyQy$mk zve!r+my?PeYy)H|I z&f`C`MW}cQW)bWX*}lB3j>0zqrH3Mm^`<=0i$SdS2Qla75mrx~h$QWT=7{-~D@IbM zn-?Ov(KG}rcziD=B~16H3Y7n_3OF5d^JP-Tj@{e-%a;ilU2=thuRR{%IL$Vuc?pz* zhYNt0Z6~tD4Z?`VheeEh!y^Xc==YJfkvI93V>udM^V8@Xp6jTj?VaaK1upk!EDT^Q z2&+mD3?W|;X!9&!6ZmnK;Gd93qbt-06@*1 zc!-$(GTQrF0E1afh#T$5F0QoT6A)WGv^SYI`hGN%N5fHvR9raf3omJAqE-qX476Mz z27}>Jd8@)}>p+^LU?f;aV)Cc8**VYXS)Ey1^h05REpR3S?VaoJ1LSU3Qap~*a9h-_ zHaL&FX$Ne*cooMkQ`(raGJ%W7(OgKYRAi`bg1$hFWga#Yh?a}-zA=1gOgh>;|7+s4 zXrN#Z3=}A`4FUBADj;$&8MwTIKs7lZpxON4GpeYx0Sp_EFA!YI;&T+-?$tj(_(8v| zY416aO9$WwY!?@9Slb-@(Jc)F6bY-ALe0BNh~U_7N+b#y?9Hrqo& z-tmH)u=v;#1-={6Tc516uNU#xR;B7E^;`vOQLnc`fYs_-J&$LF%B-1v)?L$~E&wI6 zDWui8S(M0>CR3vI)`q=ATajuM%orMz9p^pQ0V?$^-z{ivN2Mg0m*PUxP8ibjd%XMz zB$GEj-g#nFe0j)FlQ&-ua!?;=8IqNDT_4dJ%;2beZ}_coXEeT0nr$$aE22_`d075r zk-=+c(Mlw+Aa^8esc8@Nouxyta`TwaW74;iuA({!Yi4yWNdo zBuBMo=uT5G9{7ND%brLhJA0*lxP+WvB3j2_SD?kPy*}nV_ifpBg>&8>%`f^Ib2nSZ zyPv*|cXgra74~u=B`&{bM;D>0#h}cHdq}#I4`2;ag2#n?7ep=(aAhn8sVf+NKs}xiBSAQ{wVE9DVFsesHMenxMH9?;E8-tsiCW&4*_X#R)rZOZ7j` z@&{H&DMXUXqA63dLAW5Fwed_=B>7{ooiE3w*jl=^*CWHIr!5BUOpjaC?XVXzq_#Px zkv-dZ)jE*4UvjQXOcxH`4fr5}fayq?cD-~BP~Jwu(f0S|20x>0awBB@b@fp!OG5VY z7SNoIYB=tW$7Fw>ObLIpqSvCErCDj*AN>)4BO2)WFit;f)h+{4r)?mGEp{}WBV7#d zD4EG%P2ZNt?Rbe2_z8#0=%pW&O7q9m=R+&(RGoV@i_th#BH{ zzo_GV-WJwsIr%bwg~rB6d#(XVVrY$#*`D$+8Nk16yW_;6U?TyyxRhE8t1{G1mFsZq zf_(VVB!B@FvXR2Ale3GE-9Hh$&CO3usUxuC^f>l@+C;7L`T-ofp%-3Q`pJLqY-)B05`-`4=myVi~H=Cgzje;WLDXjLmMVfB3G ztYfh1%}BqTlaT1S<&b^YRnJWM3ToLndws9(r61EN#XX+QOR8d5Zr74xF{|weR@F*w zyZXAjv*U89(82ucTRU_>z}jT+kSRj`$8PC6n;B7%dwu${9Ev$DuE8=^$2n+`e;=n& ztsvW7T3X<&Zn-AELvx`Z&q8s()be|q&xU)Wnx{&!I@nHk_{n_-!ReI{&Zku7S%_#A zcWS|#p(W>gK|A?Wl!u3fi%n)={)Hr9-HtPVz%xPLqkC(p(3md0rW2m%Q4&aN8OP}3 z**H7)MfW+m?Eb1IqSiR++B5b0O7qD4d4ABy`W^o6p?82*a-x%g<)iHy`x8_&?&=IP zjl%Kqw@{6%ph0Wta$d+xKYNAS{bMUISuTFw)KqEcUDUGUeVVIDb&5Om5KeGja+%W0 zeCr6{R4#sn6WH4xzES>uLv#vvcwhqgpltp z=({&T+6*xGVtV0ppf- z`I&ti?tq8w6a!brkIQRbb`JxyUBO7{A4&0otaa^+Q!S(ofS5G}Q1dpn4_-rq z>oP|3b5v@@W4(={?hsb9^jHQT)AChcc*q=H0Gdx;$BOC_A4%g!Wy{%34z1eTs>Kfb zHJhm_X(2ApjmQzrHkA$eOs8WGu2)d01gb&$%AU|5fG6CskW~?Q?~Z8&cr5UWd1`xC z9d{;#YOlTP?O5^o#Z!Hc?9V->Eth1RNy0q~YeEdqK0M0SZag+?NaGRf zGs}8PjEp@4B0Gsdi*M$LHNHWmo?C7n>A7kJ8O~T{3ZIjCtN6`+*g9VJr2}FAt;y>5 zmo=b??UqH)NA9~7JXgm4xk@(juk`?ykPBF?SkKf|O#jrC(6yS5i%f;;8fPsF*r?pQ z(8O?eJ%c-Z^1V}1C;*(6#K;}efXk<|AH8352tR(Z-5)!nBC}|^ea;&WJ3wRFRH`$$X@Vm$ZE*F=Tqm0jd zQ!g~Z*G>-oVj{Bl=RfksN_|hmiH1Inf6*1`sO^t#7B)Z5Cp8c{e5~yjl&rpIN^!5c&LIcS ziW6SqUUoJHK$#;y@l`p8vl-n(M^zqW7dfaec0$bQpMHwO7YGV9_6~!6WL#x4O(JLc zbtX6F_O=KdhwgU5*S^=-jaiPGKkBU8jD1EZS{3UWz;#~j`g%g`b2X5&|c-1|LbCLvtO@MqyrSP4-WNv za^q^_Z`-k(2b=EhF0U0n-Y9_ADloS0q6i;X=YDiTfcgGsH`bWNuh*A4bM$r(&z zTJyZeS0Ov-9Z%vE5`tNY&+L-&udbs0S+@Ge7aW#8cH`wO52THpTs)F_*JEDKEqt!7 zA<#Wt-`|0P`9vc-OL0)`rPXQykH8LQ&1PSQ&&{4xl zjGEVWYK$Mpa7p4Qxk0_9e$P)8EqP}C z*~ECCtR@N>0^gnLrSgTA?xvDUY<2Cc>|7>kY{w&~er%pwRJgFdK*~P+tbd0eUPwMt z?~#l!`8e+RJr$wxlW6g+n89T13WC@HInS6M0W`5mOwIH~5F(VT|IvvK7VzP7omdg=X$C*Lz2pTNfg_K^S?0eKrR zRcV=0Gv3o)zH3Jst6(Y54IF(_>zGDk)d!u0TdjGv6!%lZ<}o~_Qd4x^SI|uz_F-_g zAK5())2Duh`J7q{%OHD>cCGImnsu)o-}dl#u#z;UcqE5TDtg`LBT%8&4x8_dzGUe9 zE+?{aSdRbtD$KY%w1VGZxgqV+<&C!Ceu4ek``Felr$g3Htu8Ve&z{{9(pN^kaH`B5m{@O8Hl;c}-N{Y7kG-c8k zK0t|h#<%0vzsnIin>wjX)!63YW1=MT>}lq<89yFR(;v2-HiN4JGvrBVlHWN=`oD>4 zdqUj@V-Ut!gI6rLeHxZW3C6zwrlD1C-?B@T2!D+ zqn+6PmC@Sivy@l+3T5CB8IMjQiPk)+It|oOo_AkQT{ttv)mh)xzrs8TReoo1asa6^ zyX}L74hb0a!tEfu25{>6&M1z%)joXlodS1mlId$Cbl}_9ji9?maSH5&#!}J)O||*J0%VOLFpy?qQ@gO@*9Omdj;$zfUfMT=a^LkL^;1inP*4 zLE>%GibFWV?@k$?&;8C#$Dpe}p3(U5BzrM6T5WkuhCFX?LX*t29N%pHiOWOAW&TMZ zVdtn?^qXIK>^Q&c!e}?LxTZ|vfdk#2DF+?TH_Pz(9W+TvT zWTQuT=`#$}XHIgtm#IGme(JmG_-d^spBai^{Vn3NM%#6RP4+{CmK|K;j##XK@<)=G zTA2I#$4*SIi|UZXclvjg#e-!pi{Ip#M-wEYh;%yX1t&Mso+(;4rc+lWk@6#G2cN!qHk6a$`{0?}uGyBV91R83-~L)W6z~RxXkA zUZ^XR;F#Z=;n`*UNL~?B_9)@&N7j*{*aUK4c-b87T6rt>Fe+?b@Qf{^e8N|G z6>kTRUK>(6N8OlS>;08bd+G2($&dKrT383zVcBQK7!RToVkv}yw>+Uy0?4)Ecz%X0 zvnPOqfyNN{YOu{(`|%A}yMZW~`m`yTcz0gfgV6uuc^f;I96J9zwhDdYj5YyX+p z?_00mW?^2l4bp0pI!1Od?fFwuN&G@0G)FOufiz| zl{59kh{}(Bc>q$^6MzZB8i7GM5E8KM!nm$)Z-1+-b(&o`3UW!TNUoKn(RCyObEP$# zL44!a@EF{h^*$-oJ9llQWU-Fde-Pewdx$wfrXn$TUgfB{O0OLC9dghiduzID|hzCou7#z^`l0Q>>`;j14o^J2V=cgqd+qP zZp4w$qfDqiL{EEJC;hzdYo+JX50%*euf4a9in8tch6OQDQ4ldeV3ZOhl$0J72`L4o z!=O`I8pJ{*q#Grrr5R#S5ov}V8ikP>LR$LWb6wB(+aJ*Ja<(N|I=nH}a@|^8 znI9%?jUjhY{bZH4G7}QDI%ujV5_muN*!aWuB&hHwZE_6C+QXOHR&T_3gxqMPH|=m~ zce&nZ1@?I{)qAj3IAe88LSI{8CbK8Ag29J8s(MSP1#j>~hq4K^(eLnqWG!y-WQ^`4 zb4t~qXP~pkD4jU2uYc6~YyS_s;~a*D3G)00a3TxZo;yp!Y<)}85ko(3`i{jWNR7Kr z!ocjCXTu-<87bYTCg>CyM$h>hn-|2mu(yF4!>lh0!Xf?*%CB+gjafTUNARjrtOm=h z8b7Z+7+gtePwdaND$jCyNRqC#LYuC^8^P{x`-5h3up57vt5RjnH=%h!L()O42bo2io6mg6C@=FP$%j{b1&Z-_R9!wv0&4u?sUx4Y#(+ zOf4y}@LObl5|wqkWKo^=^N{f+fVP~53vb?6C>Ela$gBS{8QjJpkTf%bvg1WvbvrnI zwu`PcKuqMuc|?iw{o&7RYMTBzIkYWhI>VA&>WM$D1(!c#LSR%;850!YU!uc1+CHji z_a5D5lPHp*7PWqLWv{KVaJ)dJB;PVlv3ZtJI>ud;?PS)xXJuu>Y^2iF?GJkw%wvX3 z!|=}i7L~@coY*hPEwrnA+5?6jjJd9xa^@oqzwkxJ(vs92PGq9e7aQ&6JSXX{wfOSK z3G~m*d|rzT_0o~IncjLBzh>mq9i#mIE`HfFICtfTr#d{`6FbJa^Ih{v&7#I92xPYD z#+|u8p^uIYY|V&9dJQ;_PW+9&{-UdEu|Cop;B2jzwKl4xo^za(ZU#7%A@C@JA*hLszEydQTV0IWV zqKA%99Otpdf_AHcYLK}Mzxd8Ya)a{TM#n~DCbjzK^tBab=8E&`TEmD{EYEDQ71o>D zw%>1_NoKAT^kC(?3cqG{KPzhFyMmpxi?dg5 zOzOEG%iZzjJ1s-6;@+=cw7Sg?$52geukWJ{+S%?LO-y=UWXNTo%}(;ox@u)XYioZQ z=>m1RqtvQ{GF%0+ei&f?fs;V?`U|HKd^1K6AHiSlu$UyX@}vg|pP(*6kK_(Dy!(QoqLAa^C?sx=v%Z#o=(XxY{%KIK@5t-x z)t{J@Rx~KGrp|ZU@KSAO{i@MG*B6W9W^%7WkJe!rB#oYx4Qqe@C8QUT^)88?e`;}I z$GJt}eFXRQ{kiDx8kC^yu~JUx7E4TpaDFmg-YBeF7fZJX-N%R#JGXM-hv*n5f5>AI z$=tTHK?&kU&qAHPya-)08$RFV;%?-jzWn@+AbnRxl6FYJKDr=AEtJlf(@RFn%!GP6 zJ$J>0uCkiwk3SD#O-0yFD_%fUp_Dx{-EJCU9apI7~$c_Jfd^qm!74fTK4`>}l5 zq;7h%=_%ei7F$n-LbTc`o0O2@$R|s4JFF!pbZA6VzwQWK^LC-glDj9V&`o!1)|hg~ zY`P~ehrD&UYH_xL4;>qvi{`xk$I(?uBJ83_-l*u@7v+~dY08YIt#7XeD+bd-58Ou| z$-W;r#=!4T3u9iH*LAcJ@3wB6hemg+I2A)?fX(!C!(lbcP(%FDhLVu(hOCtNkVk49 zVcO5DoSkt6E2uon&E&+p4P$RU%BH7`aBJXr~{)5u)Z>lg{$;r{VX?^ zV)ju;f7!7Tt!^sT7cu1=#!vfk z=Id@&gRN(*lw{a?I#tfbEAF&xc9fK8#@<5e)f{3w%>TOT>bHSfN4#~{t79WOdQ*yf zE1kdP3SS@la&zM8hIMR}-64DDOXIWF31ql!1F>-J9m@~vi^>L#6I4dex;1iF+ICRx zAq@}x3|!N9bXOr}joMO<6A?(ZKET>9m;dmOv?_vx;I%EAm(KLp26mR?bINf^fg@}_ z^4~T$b6^TfJb5v`Go4A_bE|0BqlM;FR+}0|Z1Htd0;6QUI{w`$PK{d(Za=SfWIvuC z8S`AQA5rqOgdAFXe#%B&Yg&TGUxS6LL!=@YC7qR`#Uy)Q@4>2EJd6%VFlie4IlH42 z0qA8+gx>-Fkft+yJ(*2O&!+>IV=dzk91q%A!+4mke$wfvYTQecyfx?@h_mi1Ot%jLGIHH5V$P|Hp<>V!w$uOHkw?H5IE>Qoz)bIoi=Pt++}Ei^0nPD=K z4W_}PL{PM_kc*#kXr&R8b7@dBpn6FC3WF*y!l@g%qCVFn{3cCl={<`|VM>bEX6q|M z-l|d6u`>I@U#X1Gqv=@Rb+-$N9{Khn;QgS4u*BOEnF+SSsKq&{jx%=d;ahp~trH%{ z57qgVSg>Fvck;2{V}&Thc9fhQB}%7xG+WuX$8Po-XZhY@G{^VWEcZFje*Z-`-e+?> zfy{1p`zRIU`Fv;k4Z5$-4~kQxd3jE;8M7h#oKrKTtURdL zygMt(qUXa^+wm4IyYa6(B{yV64gMhx&-SVCBP0zKnNvQM21s=a!d#RDYH_nFm`nAl zd;cny!FBqwW|@8Z8e{$$J|o$$@*$tr@VSjeR>c82*cIqzjY1z6v!A%7u92Ye2<(d6 z@OM>PU>3NC@9Vlf(p=VZ>D=Sl*eC->>(yMg)pd`QBXMOzv8x9#cS6d|%L6~UjmEGn zEDmHFxg!8p-(pLil%IEKHrGt5-Ox^|+iMAZaBait<$T{f(8@n|J+;Y0rlxn<5M zSz%6*dM!vSPTv@_>HlSuNZn-GsGgQ{$9?Bvf_|Lj0*1EU%DcPzqvt0u1lwuygvS{`9+A(+ZMR`+EtJ_M+>w|LQ5^@JwuxIX-Qg5&BvcGJ1*&) zSjj2OfTh^f>UQ7o?{ygbB&i|PoFo79Qj4|g6?64|x*7dK%vbW5^d=e%x?a^-A z_a~b`mz1402%mz11_|-5v%(Rd>8vZxQP2s7x~V<-;JM?WS!5PQo@osbvbxvI)b!)T zAL7%wOH=QSC@OMMW3+M!5|v@zsUe9s2H6aCVE(iD@pMRYMp^P1w^*#aXKEC6m}0gY zYr33Ugf1SxV6)LGM^UH0K74-72~Xwx-bOCn^`QrQC|jmZp<|iZ=(#gOPJXZB3Tn!u#!<%#`%I8Sf zTT6WnN?7|9toM!83R&_q)z0J}pcNCKwe+Vg8gezZ3%G>+AP0TECdQW3_1M`~XWu04 zY%^({lwwoN;xl=#b2l~C&MtS{MXWr_FTCzTS87}jwU-h5tyV6aN4Sa?$=qU z4NOqsqcKAD0qoR@!mse<6$Y$y4h*-hcSy#Y;ScH94QpsNIJxNMM{pWSjM5^l68NtQ zZY@>v=d(&Qxhd+6kL8TF1ZnIQ6IW|#H)Qcy*3tf|gUYHuXji(n?M^-Y#+{M!ysxkhYKci47Pr9k~$%5f zVprr#WL!tIbl(q0*J&pix#{DpWbDsB@brusbUgm;@Hh@t=Ic?7up4soC~48o3@|8? z*s1S=@+Rg4kM;E4t@pQ+q~u%L{=r+ImYw&~@m}&wMMIK@EIXE|!rcLiq0$B%`z_IG zQHHdI{gx0n+wN?wmYewp(g`U+Cf5DVyY6$=Llvk@4A2}>EPC@-xOD=-1@AaH^Ju0P zOU;$bn_()Cdi_CG4*euuYL(gqww(ix-W)f2Wxg$9M z38AnWzf)|^eBUuj*GN#a#>>Wx@YP6QEO~MY8wdM5yquU8Bn+jN(Hk%G8*vsf%JaepR!^t`xaqc&}@T zm~Qhamy(+5_fOQ_E7wtldk!7^fS+@n9iO7J3Z+fZG`z$;7`d!7=jQ&XS0%Hlp`+zS z&bWZYPJ)hV_H(>L>CRV_W9%0;P>{O8?5)=a2gc3Kk9Tt1C$EbW!jKB1!~HUPMYs1y z81D>LZE<)y%uS(sDjdUA7JARsJ=4PM%<+uuokR*QZ&vKjSG?qIf2{?WoU%2qXmou} zKIx4|{|U01QNDzgKD7;Xv(a)44pRBX9c3f*BKAQsR%P{eVg2|@*VR`68ts?*x%(eD zJpxZ$#0?7ljk>h0D_M?-{q!1ao@ouWnZCJ?IVH0G3uqZ8bGGcu8Q3gEd==hg2WR$T zM~?+xMQ7sQ6gR#|Nh=c8MwJj@rn@nfOw#lGzK?EEkod;L`*~7-TKT*&u0d%dmz4tj z1Yz4Rul2+}802Z6A*UC9e-35baZgdEBR*duH(pT&eagZ<^UU4oW(@8b5DY_$wl*3d z#(ivMB|R4Yc!G+3*+d(AP%~Glo0PscJ>@*VPFvYn3uW$rXPIpM3&!Ol&7SZ{vhcK( zxsX_F7**w1sF{m`tCSh)Xj}@8$&ys0u)yM)?+b<^>DdF9YrSZKtr?a>FqHCDmXA8L z#eZbj&L(j#Z$;_krV5wPl~*xg1uLt?c1o-ndoQ_tSnKxbeuo{aV8wjsw3q!Hc!S5D zcQ~h>R6x3RtOKNuoTjL>2&5! zt~%1aC}ezG;2Xu>iT8`Bp2Y??m{J0xIVwE&#I*mzZMaKHb-2#**%kc7Zjp6ayvA64 zhzx&Zw+g#y5xuC5TJfA;$X*$x#@@wK$sfBklWz@W+1@Q~)L&Dc=qt)<=(ChD#K(`S zls!^H&GyBrX-3&UP{y56K*qP)9M?|UQO(-1%S!s{u{kfJy1cWF=38vd*rB3S($8&!+2%7z1FctB{6SrSs&`$xo_Wa_R5!}i2;)JjT9kS+i><6T>I(ua*tng zU1RPT%`ydK(%0)^%fFhLHifu3u^*KZrIF?VJo;#z47F^tG1j&PNB%#9INE*Z8G>Y( zw9LfD0lbJ~nsiv`D0AQme6Qdy5lc;aFge!C?oLtn5YJHl-3IztrgL7%{KHpd0s~>% z3k*K>A2m~TN+TW}}kzDneiYPiKyGW*WW zPbuH2=P771RZIm?oO4mWdPQ?tGn>UQVro(G$ogxsPr(-2*qQzDc1-z}S>hHcw)QPHg(hMuK`n3FS zw?x{*BFkVmYI@KA`_um3j;C_KxKs$5-v7rc{l>~fl#v06AHOwX@jJWw4;be&GZc%k z$~yY|k^lY;oTt=WcOslKI<< zcwd6AeL)@!JNo;be|w}<1Z@7_8}-{yf4>|V313@HR&Vv&lYd(bcv_-7ELhnPPs_<& zS4;uE_WlzCp+j6 z_ANoI@F^W%`s;4|_QT(90c%8d5jHOC^wzFB+x`?5Ec!7W>fo-6eh+Fqd}xv+cYV`n zV8tp^TQi;V-ep%1lv(hU4-b}Pe%s7H7FU)UR@8LF5_f*rZFxci@}u^8d)GBLy$1WH zSmCcjw(FaIfTw(V)%JIZ!yhm3w+J8<;ee+3mb~%%QzU+Sse@|p6phR4yH;-{lYOD&vp1DXOPSCRK3%%d&IZpxGOf-%(}DKZES4X(^c7==W9+;Ph)Np7lfA--X{*% z9fJ=2F+$dks?7Txvk0ODCFqSx-7>f_pg!IbXE^f3R|4zIodrYTk1$FM*j>)$ z@&?`$5cCuc2<=OtiNcvHkM1G4*_7k?lbT`XEn;=hDZvd!Bav9juo3@$*>ci!NRa;3 z9)i(*>CJ%ic-%^&fph0ilVx{5sS~O_u3l*j$p{!WheVKW9twLd$+Nm{8ATRtUlI+lEC#xs+A;jNs^dhq@vL zVG81>_W?|dBUvMaV1bg`rSe;wYm2-v&UUi5AWc)P(B$?S#ke7~OA}D9WaR{jHp_`W1pi-3$W#?^ zmkcL3!xSiXesLTl#N)a=#RAb~p?Xy9;Zxjo!=5`_1;&_gNU+H`&JM6^X_qNP@g_Pn zLF-bZ1Zu(A!E$x!*QdYtVFAi#DKKj0&0UTZ(R^Rfm7}YjaVLF5#~|K(&^+$jZ5i&l zp1kXY@ea^wusQGIo%aanp_WOg2Qe4b{l=LW49UX1BS6^coz`z`J#kU3sZ(VKSfmCp zKP(t}4NzAQ8U^Sbl@nfto)doE0oc@Kv?sXXeC<_cT^Xs4v#4=~wwUw20><>N+2T3lCoDF8jRvMz52K9=lF`RL zF@)@5OoBxAsoX`*X7S9JlYY(7EicD9LHyQr2G1j(ov2RZRo zfI;M8K#ALIm6Y%C)aNDc*Q;mw0rrON4uD8HUffm9Wp$QIOY5t8hb=p;PNx2~nJ{&| zH^7XD;U;Jm=!C@5IXGSh6-20^{?%bm{UsyP-9!%dejo0|QTpTbaaoFcHMj~!ENDFf z=|#Ic6RcX_dZ&-NcimNwdV`bPS_=76Qxi3-HL6p6r+fxl4A_6k8|1%KVjhp5_)+1! z*q7P#5cVlWEnCZ~Q99r(`_9&!XEQIwoWqixH|ajy&+pZ|HX~BKg{C2z>gg&hZOFcY zzqz_B8V^{2ha4XhgKhDufY(lBdRsI(;Y@!ccRUfBauisn>Ep9!g77ar=t**z8fQ}H zI^ZZ+AF=NRlH>(KTl~sCF_B!|>PPgZdeF0rKuexL^(rRx&s9}6t-YT^1w6&JO}SXf znXYI1Xj`FbEHbc3!*|~Po8SDG)kInxO3nb9!+Ra4L5CctYkTh)*9V`w{#+IsBsR;A zHbwE3uTN4_U>!)Mxm*(!@e0Px(OqJzn{PsCaUgc(Svn{chR5GXs9Qx=(*-(39j8qi z;wEhMujcYGJ6hrKsBroDu2>RO4%SOg#!$5J6AZkU0*;C(-%SyyzcCV$6L&I34pq83 zsjA(mw&A*(r08QtU!U!b9ujNCLlo<{Mmv*)2P=}Te8ZYyX>NGf5?6v&);gsVvww@4 zRpAlcmbIGB`h8^!Env`LWo^gTk@0ww6;O)NIY9j6Q}ecvVcbQzx{{`IAk>GT&vp4V zE3R|4%>r1mEQxy`_pE*MIi}!AZ|X7XFSI@&$WDU7&D?EMRr$?fGRO7{`jNjX_Q553pgWegSIR zg!!9x6c#Y;b_OP zLPGksVwvjPyG%+pSe8yVp+tc-5-f15JC&)&{2cIpT4^>Ds*46O?}1GXeYH^|lp(Bw(uOJJ+W%Fb;4 z=5GGxha&vRlgqpY7~-;8gVN@vWtfMCw-}F+dmZ`<@~n;h1xD0>y{${Qm5e!URL>bG0-mpy5L}4P~{y z83khH`c z)om#%O%=Th+_!Sjmfk%#>8I(xtj_QMqKqNP9QMsOk=|s%xTZGEjO!7T6Av)=?%?m4 z>)Kk%1Tr{;8Mh&{&4V}0fSs785H&)3&T38-b6FqlHkK05)J@I|bWG=J`XDGOO|yle zAyK0&D@>p^j?@+9ly;xOIzrp}2FabxQOCHd%>_R(D3&v-L|dCBvD_t;BZmuTH<3z8 z7Bc&3t(iG~n6W;8N5B6uH{^#xqwd^^U~@Qu9+z<5CFE*j56U35H9kXuS#O1rKbNTu zI0~MR%vG+&pE>7IL!(}bD>@>ZrWDtN2dEYLuRh9L&Q1azPLYqZ_}j$+)$<7DiFF-B zcgU?4@lLNzI7+r*e)9quL(cKuVkM1pCOv2vwOvB4v$t1o!(ynSce(iqbXoe+sd&s@ zdwmxrMoay{>}r~9f!Q5>&fAGk*T%u!TXb%Ecl|}#`sTRgjt%~yKZ8?t!4vfohn2$@ z`5l+@8X|lADj8l-(2Y$Q`#)XLnnT@#(!ZQ-mm~U$n0mB?dH&5@ZnZ~qT2+oSTDi;K zoRNIS0p^V4x(Rmr?_$dZsWu($DE0O!+o zFrf9#cadv4G2I<4!7P5}aa&R{WS9iW;R*$lr^}G+z;&tX3v4YphjHAU*8SyXA8wF$ z&5d9~)vLgby(zJVqb?8=@JAf`F>sy!YR+j#Mdvt5)yBdJ=43fbwSzpmW%ie2Rwp}Z zLtV%n^;>wwTkx_ZSwdAY$P)12Giv@q*1F^!*EXv&UI z*Wj4RV->b|=~G5dhlF+Ia`>5nIgIA4`yhbm){pkRsY+K@u%CcB-*Y2k=;AJgn8S}J$8|1DI?m1{q zA^YOUnFrQWEAM}(6Y?A-hI18*0UAXegW0ihj9D`aKi zH18tjxm{tRd6J?s0s@nhL+F)0^9AVYin6qu>SS+g=Y~{|qc&t;AX2*BMm6H-90Yx1 z8}YeSv)ywL!a41m;4^9p0{6Ns`xx$70l&fn?D&Ab3P$%j4(fxWbv3D=05&;~XVeE!H34 z*Mxu%5Q%y1k#l^#sR!iNUX}nh>#di0-(MZ2+9ei}LDY~gJPI}wrsk@B_h}CNJsv1P zJ2pN`J%D|~B%^SKGW&%t47z8BB4t8+^T|@Bv7z(Ptjoh|jTsXgX;v;FQjOU?KP*Y} z+UaN=gCtB^5!5+s#e>EP?nYKt6E^(QP+XHq-T!oXmjm*3Um`C;d326E;*^(HfExBT ze!bZThH0{t)_kvi0X+~nQk7R{2UDQl;lCC27saCjMleC=d@`5(s{A@{dNsjxMnLk*!c4Su!?@KZO3JT~M9e(0o5BwpCa02n=g-3Wt658X`m&Ez~NwECa z(*eF4=lhq&_{YB}LjW|pyjE=2MtuF?ax$FT{@-r*o6iDR)dLj(%vgsVckd$OSofW$4N8C(D{5I9_rEoUvNQD-7zaiP-3L!AADAt6%`P)}ooe8( zr70(bUwd{4rW@>gFxifRPJhHcO7;dR6-8Z%^)NTV!9QF5oFWALnzZxLIPowDRU2MX zF(pHc3^nt0IB^Y*{&F-1=7PY4wX#T0mEK7k5#nD;$ppJd<&s2RM_$LY)HeEo_+^g> z$%Jc+`$%m`7Y@2FUEw4yk~)C(2e!(1d&Ls27C-7oe0w7Rzh+vxjXp45>Mf^^%j}%LQE4Hu>3^K6#1{1CCZ0ARAlq~yJUVs5B zow@q@W0(XUXoIbgRgPT;@{#A(~1%%~JuAcbFxP)aNf3BUp#Z_4I6#L2cg?{U*dI%CL%Z>r$#n~YN zCiSVx~Pa0KI+* zgTE_)ssXsrx3?t;0_Nc-xU}woCE$z^v^-?CA?CagiP!yb&)cMx!2%D!Q7?D!xCAug zob1Va_#uru!EM2}(4_4edUHX34ZL`tA&;rfbk=*vT&@celPbc`o=_5A3y?Lvq*6cz z#ty{`yle@(7}1|T-V~+!{K%Q}BJDadk+n57sBGow8}K5@;IOkY&tY@*9}HG@V`7Aq z57BTKNI%Zi$op*We(kWmec}E}LK6xo$8dHSglHY_0#*-KgoXit?S-ZtFXPJtwylQI zl~@!@G16xqTvu%Zq_ARQGcH)1GPH;NZbqnGnDY=2huL*XKm1pVI)Ie}bZ3xkxXh~O z!+n)p+ZC;ySe5rY1 z5`!HFU`^qG7S=Y=6_~W0*R1lWL>X1CXqW*O5Cp9Pl~ zb_~wl4^TeAqE1%zFj%Llf(dd8`NkLq0v8e>RR!qO8exIWK?6L`S6c^uUp_rsD?MR= zVE}_Thh~9M80o%4yQ2+zygwY05<}$bRhFH-@(4-rlbx5l)T>==(w&WA9*C{(9KcM> z0CUtkmO;C%V8Ht2iYjh;Y?tS$2W^xB0?F&K`3otO#7JBw5tM2maUX2= zqxlGS<)b9mk`z&c>Ww308jp7ES&<_g!jH92xrxhQ&}%q^^)F*ua|ref8k2rFO58sR z)`z3N=I_oxFjWKN2Yhymq8^Z5rU_z{aMKtAl$j6!Knwdw&m7>MvJ>3-i|R_V6^lys zFn|2jHyI9ue%^y;3b9w(PIGGJOTB`g*RVz5fS<|6i#e;{`l6EgZbS+nB)%NX=PCK1 zy;HV!3XH2Gwnk%CS>(eNKImUjljcBJLt~L6wET7WRuc2YogRvH;U z@OgTd)Fvs_%P2252(H?b<)|MfGNlqg`5S&G!yt#!@MPa%gYC^V?p%PR*)~k3WXW(V z`-~dH6=5_ZH?#l@1CON<#HpD>7Y%9$Iso|%3TQHr*M&R_iz9BckwK)Fse_<^PJMlK zjz{E4ANIl|$=>~S2N>P%{nCS350kC$t_OvFatOSG%sKZ9Y_Ou-8Szm_OEhNYqB%g9 z37jG{&}x8W#qog}vfdakG1*IH#9csS{=qLm+KG(cU*q^_=s!|T4`QAcN!L+%WOtM&}zKVZdUdmZKva#c!(e#QmD?8Tb{@|ANI`9dkS8 zhAPVm`87`LTLNeAzjNm(FCDhY3YZDP0;RLfnUHJ9!Gh`L#T0cmz_1_P#*k6DWKvs) zpIwlpWLfd|f&7A>l0mc%^s+)3^zsmwQ8FfwQD?Z1!BBn$LcUCbC#)EoN73r_>%5zIOqJgUh1b)&_EP^?TkGN$3|_MB%_mNnn*P2)vv3 z;KmtA54ZfYKD$Wg9#UWOFH*>y5TzlTTKcaesPXs^z(R%^4IyFGo^khLff&~ToWA>V z*nr2zj1@Ll=)hEWwmBQEpAY}<8d82{rKBcV^WJ+P8J2W^v-+=W5*zR- zZ(O&vM6XBE+~1^1r^Nxd6$}{NO#t3>)%idkokx7xn(z>czv^aEZh_MrTQ*HcTwq9P zUiy0JTn2*WTOI8PZe1L3=HGytjcRKbcUcO8_&LU5oe4g{#r>GXueWDzK>T54HwaqV zR#8vHdBK1kTw_Q1Vt9x};q;&MssHp2pHPCz&|!<8hRmpbG(^Gm5DgQ2V^a|XCWI{z zFYV3tHAGp0eXz`7QRnOm7AP@nhA(ze$YkD;oMt(x*_1*duUa2@`5`VnEuL41H1<>~H>9NOxNjDZ zgMycC3?S|yAP#y*9;)m50Ro=yyl6y7>7IZxqXvk+pycGp6HYN*sJ>Zs_zF3jAaJ{7 zzkhz#{BrHc8Qx!0;hc>J{|n7_D(Jvuh{YfieGps!vwa^Pk}m8Cns`E7i_}9i-}vb- z=wnEvgc^rh)&)RGS1G=z?BZJ?qJV7^a;9f^mSDNI+yymufxFn5;J&;qdNSuAdRkq- z^?|6xBq39|1G?u1iihzvSh&rFG;d?#J48wD{qg_~y#Fvz!tw!Ug_&Jfrr%t8S$7#! z8~cl6jNuUS5MtBwwnyKHOaL^41GhAoP?Z@c>XfYHGrEft=rk}vUPjB4-z7TgYmn>u^=B(1oBY+_E~!3=lXwWDUeco7l3?G4;5}r zDNr{nO>hg(Jr9+f2B*SsXM2kf>OM@*)~nQllo!{tLo~tQ3Vs3gnoV3bf?kmUhyjt6 zE@TUhufV7PRssX$27kRP2cTkMR7}#cpr{RTb#LljKinyHa!-J{Gh75{eJ44;W7K{Z zB`^I~{4Y)YKNKp#{=Ew%{hx~B*iQxlP34xL_0aTwPw)W1AO~xvhB%yLSNUS;4(t#d z*s}=LG^KiQWqv@8&k9fNdb`*{GhM$5-IO4y4^})%!zp(e2JnSL(!Y_AtoZiHM-NY} z6~rWS)cM!<7tI3rBG+O-(i>oBSRkd+Ug2zq>1xl?_HDmoB;_p026mL zuKal|t;Jk_i87Fp&U6;{p`br{d!{;%^Ttex;m>cMu38gZBzCRB_xx4^8juh?(YfNh zfV+$>hpO$ix8gnBkjX62WyZLJPHl%CvGsR!WLSD` z@efS#KmU{L9O1P9U9FV1VH9<2q7gHvi~}^iL=_Xomj?P+%03wta4FEw&rUm`$L~Kf zlM1p!!14J~=9--#WF3Ek<4)b{pL*bNW7nUaoR~17a3Q2W31(@k4ALFgW$@MN&D|mU zLg=!zmmC{G||Eons z<%SHQ-OI_*1c0MD89EZ6%TnqMI}vI7oufDJ+1)03rlj5w6xI;u|GPjMD6oU>Cl3Bs z7#|`LYC@^m48U5C{RKLKM*)zf5#&_zJ+@r_hAatv2BAG%2zUl^;GjPIuOLg+H+$1| zv5}x#AA$+Eyz<-*MRc_YNZLGH;dcBVV*RiG{J#=r-WeVmtaTCI@!aDXcHjPHT-ud`)@!qNs#aROc~+b+*l&D4 z(cFx6*b*_0n-g}hT6fFAj63Dj8Yf{KDu=NfWAh%Xn1a=uVzaT}OpbQ$f?NyBa?dsqD9)d>Vzc`3f0avBbP{{PRtN(hJ zzpuaGjMP(CKLs4efQE*K2?#c=)RNI?3BbhZ!MgZENOS|7TwA_XFgjmh;Nx+C30?2p zz5Byxi1j9sk3c$;hl(K>#U4M((k|iV1{y%*rTf=XMSv}!%Y4;g0j7Cb)Akq%c!44n zY;gjqhL|TXtITTJcx!z*4;<+w5%P(^D8s>ev2 z+k72}EjE&l%$6nyvfPqT82{-PBz$Aqa9jw27yp`0D96{wtAhN+VPdN(fO z)~{mzD;cEL42CSz-eH10*GVhR?sGLj6!ID5+VS(l5#IGHcz}_2oW*zzJm}VahAu& zm3X-=jy2m%rKf#u2)j7?Co z!gVXoX~-8$EP0*imc9)&Gm&k$r%g(_5KD#w&TAmVIl_YnoQ9l@U(*V3Y|WCb6>poB zDieE{G2vkd#13@38m(Atfoa31zCu!e6f9z3oMRvRU_a?X%eMN!=5I#;&gI`9-4hND z;sKI1JB;`#pjo~k5JnBIiB&71|8nH*Vkdfiy#1Q%gMv6!1Mfj)i_zqPZ zcnYo|T(Byizds?iqG!nu)`>bJJ%IQ11>BPk#xXZA{z>`y`SmL&gM_|6x=QR(0e?SA zSt&4A2gN%G!Q84nx34@;W#PQXyDH$&N(8G{-ceVVv9z>&7lUOW zCLv^f%m@VLHgYJHe%?9-vaU67cKW-gW^&jN)Li4rSEC>SraFzlW4#CnV1ypFvoo13jqZ@L$Yk;akc6uZKkdW{+Zi#l6^CGe z@tFvzk$rPXToi}u`V*6n6213r!o42`ik~bQbkvUNwgD*MvO!&tVAqT+3kiyGa=H#Z ze}vdyKBKO?i`<6fe+@*;eaWlS1(>gSwG92KW%TKHxJlL^2lxQoyvY-2$b9zzYg&{y z&QW}n9yc?h67`Q|AS{gcd2$>Ff+zU?i)gM0uZrtF!=GM|;Y1Hk*bq|^ht4AqJO>|c z&`|}s*4*51@@FHuNy)IhLD4fN@<@=uTF2XAL?3+cV4a^=UpVVN9O**wG_?cKTgAhz zVD_h_CfsUxcK>bJf9@s0uC;+(yTN9K+Dn4+s`wH29jb}`&A5?j5-bDZoNR(pY6IbY z|NecQ*$~T|G3c^9urw2}*I-)0+{84G-h)J69*AU*16CK#1#e@{@(m(S-s3Ip9ee=i z&ouvx$R`rs!r%hPIHk7wzrPRRC$}U(&n##jW;*w8GWyr%9Dxrz^8o*f_{|$+kVriV z^ZU%iZyxjx6v}lAU8;XS0E9(bI|%EMo0;hc?W1K34Got-6Sx_?5({2mU)O-S^!77- z0?-Ti6ohi@wt+u7HX+wM3REHAL8oEyjEsy1<9pIXRZYg>hC!;;Hhf;;uCLuc-LfJ{b`o9=_3vi{r(Hj2?p(y-s5xek4JnppaH&L0PK1I zG^yc+L}OI^lvSPziM7$0AVPZ^AdJVW$w(SDgq{|((8yeNEPUeSCbLhRsGdJZW=kCe zncoV{EAg?XmGvC*m&c(^+-pA`^kcmCjWuqB)02t|bn;2WUaU|P0R|9&t&t`^%xhpb zUvWRM0xkPbf*AU}U~qX)H3NM3fa}M^3+KyD>))gaBC!7RuzIdVS5naK8`3v!-0(Ae zRxwHDd`_TQ? zl^)*4?YDf2oPwOBFnq*b`NU0v2{yk6v^N(Wm&p{wj?O^ ztm)SM3zvu;J5f#qV))vxKJ(lf!wB7QJ%0vq5t#p5SY6t0jwBrFq3v7JM2;469%Ntp zH584+qW#2BvAl*ikI)Hbydya)?{}c7B6W8y? z5c`HgbtG~-w+DjhkR3Nbkc?J{k;&dmrka}B&MdOri?rp zrVct4d&h^^?d*|oJ07j;_hNn-&hL$rlS~2Zj`0HhrF+O}5T)DT)h0mRj5qWv1|nf5 z;rn{i%04BGlbpqcE5uAvPdsvV?*gX5A{Ky_{xR4vn5?Gz1*~UXQ_!C`k)kK&fbM= z&qzLDU0rQ$x{c`qW!7!Y{kZ;^RdW>(5oV{tdCgK z@ivLLUlZAUx-dTZJhp36oTFHb-{d-23DpJC8d$aWC=ffTKU7ej@aP=XF zh1yPP9SwngGwzK)w&vG)1kdvfL1MyVl1or^xa418!Bi8Vs-X6+ zx^9tTCJ@cP0x(gmsrT{;JOuK2H7pT2$Jyc^KM+YH#8$jJgt!Wt#GimN2=!6>U}5Db z-jw+=4Sh0PO>h@cJ32#f>^)kq9w_Qff!@-Won{9Fv2(IDS$h|{zdruveIPa09XKrN z=69V+b&%-lr?f;w5&3oxSiX~#$3&+;0K-`6Fw3*@u)C1>h^~U;_W&^Y{29JX8d_GUuw0WSbN-gY7Szca#6MJF@+sKy+x3MR97qL;S9M_ltO&J!nD z%X*)a6VTV!C-^Fzm^$0z{rS+ry2JS1v2HT(cLc3Z(h%Fp3$MW6xsa7D#DO>!RDzc8 zB)WEy@Yn}aR%w>t@3@KfUx&ds|E{CX5bXOu{hfOaKiX=5Z2JJB-8MMu?=vzu040px6c~BI0&X8YD7B(7$L1)G$2N&8CqQrH^V?9!)&t085^SBas*pOd zM>fd5O(t>H)zu}~4EEZk$&QD0LFWvmR0rPaz*L?20Xt01+p9hgzP>(FGn3V%rQE#+ zf#yrdzl&_;Ha#~cx<)uDSir<*CxZ^x$rmo$%M&r$A5X%E`W8R&(t#_p)3k}bTQT_k z@`W^nQ*hi;eDF9C3IA||@T6=6oPh`v{A4(hHTUKsjoOC`lvp=$TWl6m{05ba;{-+G z!n2mw0(QMhZVjq2PYMk@y1u!+F*m=|pF4^0mRE)Ea*L)l|3gisMJ!ciML9z!sdOQXo_u06h+3yLAL8I12SGcxkN2-iTpD1SSYUfXeqJFjhE1%!G8Xx;Z`ncxm72=RsvLh-XxPn8 z3>?E5kL~P|p;vp4UO_xRN>2-HM+@vC__<2s8xR^xA1^Ffwd=PmNx_8KPUluE+|;qD zp_!p~8Gw(u3`EgVaIHtdB{yGPgiM0s-W5m538Dx8VBvK{ftMRp`!*}t>;UJ||C8Nu zsZ|IX>RVlxCa9Ffm+vsMHHT1-fx=a6&@MkM?qUyQO?HZU=<40AwQTeQycE4@0PrTs z=YVb^L|9>*z5Vee4=9DUfr>N1%rYo!{JM7J?3E9iYo#`$BLJbXPxgd#3Nvwb8j7x{wo}Aue$@!u?^_4|NFJornQHILF>k52(f!0 z)ch6R$yOa&JZd|KmSfBq!)Z7!~ZQG`BVRy;F|PI1CRe6_@CSjC8?Zi_n!PO>7;pG literal 0 HcmV?d00001 diff --git a/docs/mdbook/src/index.md b/docs/mdbook/src/index.md new file mode 100644 index 000000000..6248bd8da --- /dev/null +++ b/docs/mdbook/src/index.md @@ -0,0 +1,27 @@ +# DataFusion Book + +DataFusion is a blazing fast query engine that lets you run data analyses quickly and reliably. + +DataFusion is written in Rust, but also exposes Python and SQL bindings, so you can easily query data in your langauge of choice. You don't need to know any Rust to be a happy and productive user of DataFusion. + +DataFusion lets you run queries faster than pandas. Let's compare query runtimes for a 5GB CSV file with 100 million rows of data. + +Take a look at a few rows of the data: + +``` ++-------+-------+--------------+-----+-----+-------+----+----+-----------+ +| id1 | id2 | id3 | id4 | id5 | id6 | v1 | v2 | v3 | ++-------+-------+--------------+-----+-----+-------+----+----+-----------+ +| id016 | id016 | id0000042202 | 15 | 24 | 5971 | 5 | 11 | 37.211254 | +| id039 | id045 | id0000029558 | 40 | 49 | 39457 | 5 | 4 | 48.951141 | +| id047 | id023 | id0000071286 | 68 | 20 | 74463 | 2 | 14 | 60.469241 | ++-------+-------+--------------+-----+-----+-------+----+----+-----------+ +``` + +Suppose you'd like to run the following query: `SELECT id1, sum(v1) AS v1 from the_table GROUP BY id1`. + +If you use pandas, then this query will take 43.6 seconds to execute. + +It only takes DataFusion 9.8 seconds to execute the same query. + +DataFusion is easy to use, powerful, and fast. Let's learn more! diff --git a/docs/mdbook/src/installation.md b/docs/mdbook/src/installation.md new file mode 100644 index 000000000..9a1925437 --- /dev/null +++ b/docs/mdbook/src/installation.md @@ -0,0 +1,46 @@ +# Installation + +DataFusion is easy to install, just like any other Python library. + +## Using Pip + +``` bash +pip install datafusion +``` + +## conda & JupyterLab setup + +This section explains how to install DataFusion in a conda environment with other libraries that allow for a nice Jupyter workflow. This setup is completely optional. These steps are only needed if you'd like to run DataFusion in a Jupyter notebook and have an interface like this: + +![DataFusion in Jupyter](https://github.com/MrPowers/datafusion-book/raw/main/src/images/datafusion-jupyterlab.png) + +Create a conda environment with DataFusion, Jupyter, and other useful dependencies in the `datafusion-env.yml` file: + +``` +name: datafusion-env +channels: + - conda-forge + - defaults +dependencies: + - python=3.9 + - ipykernel + - nb_conda + - jupyterlab + - jupyterlab_code_formatter + - isort + - black + - pip + - pip: + - datafusion + +``` + +Create the environment with `conda env create -f datafusion-env.yml`. + +Activate the environment with `conda activate datafusion-env`. + +Run `jupyter lab` or open the [JupyterLab Desktop application](https://github.com/jupyterlab/jupyterlab-desktop) to start running DataFusion in a Jupyter notebook. + +## Examples + +See the [pydata-examples](https://github.com/MrPowers/pydata-examples) for a variety of Jupyter notebooks that show DataFusion in action! diff --git a/docs/mdbook/src/quickstart.md b/docs/mdbook/src/quickstart.md new file mode 100644 index 000000000..2609d3c42 --- /dev/null +++ b/docs/mdbook/src/quickstart.md @@ -0,0 +1,61 @@ +# DataFusion Quickstart + +You can easily query a DataFusion table with the Python API or with pure SQL. + +Let's create a small DataFrame and then run some queries with both APIs. + +Start by creating a DataFrame with four rows of data and two columns: `a` and `b`. + +```python +from datafusion import SessionContext + +ctx = SessionContext() + +df = ctx.from_pydict({"a": [1, 2, 3, 1], "b": [4, 5, 6, 7]}, name="my_table") +``` + +Let's append a column to this DataFrame that adds columns `a` and `b` with the SQL API. + +``` +ctx.sql("select a, b, a + b as sum_a_b from my_table") + ++---+---+---------+ +| a | b | sum_a_b | ++---+---+---------+ +| 1 | 4 | 5 | +| 2 | 5 | 7 | +| 3 | 6 | 9 | +| 1 | 7 | 8 | ++---+---+---------+ +``` + +DataFusion makes it easy to run SQL queries on DataFrames. + +Now let's run the same query with the DataFusion Python API: + +```python +from datafusion import col + +df.select( + col("a"), + col("b"), + col("a") + col("b"), +) +``` + +We get the same result as before: + +``` ++---+---+-------------------------+ +| a | b | my_table.a + my_table.b | ++---+---+-------------------------+ +| 1 | 4 | 5 | +| 2 | 5 | 7 | +| 3 | 6 | 9 | +| 1 | 7 | 8 | ++---+---+-------------------------+ +``` + +DataFusion also allows you to query data with a well-designed Python interface. + +Python users have two great ways to query DataFusion tables. diff --git a/docs/mdbook/src/usage/README.md b/docs/mdbook/src/usage/README.md new file mode 100644 index 000000000..8f04b05ad --- /dev/null +++ b/docs/mdbook/src/usage/README.md @@ -0,0 +1 @@ +# Usage diff --git a/docs/mdbook/src/usage/create-table.md b/docs/mdbook/src/usage/create-table.md new file mode 100644 index 000000000..0c4239c20 --- /dev/null +++ b/docs/mdbook/src/usage/create-table.md @@ -0,0 +1,43 @@ +# DataFusion Create Table + +It's easy to create DataFusion tables from a variety of data sources. + +## Create table from Python Dictionary + +Here's how to create a DataFusion table from a Python dictionary: + +```python +from datafusion import SessionContext + +ctx = SessionContext() + +df = ctx.from_pydict({"a": [1, 2, 3, 1], "b": [4, 5, 6, 7]}, name="my_table") +``` + +Supplying the `name` parameter is optional. You only need to name the table if you'd like to query it with the SQL API. + +You can also create a DataFrame without a name that can be queried with the Python API: + +```python +from datafusion import SessionContext + +ctx = SessionContext() + +df = ctx.from_pydict({"a": [1, 2, 3, 1], "b": [4, 5, 6, 7]}) +``` + +## Create table from CSV + +You can read a CSV into a DataFusion DataFrame. Here's how to read the `G1_1e8_1e2_0_0.csv` file into a table named `csv_1e8`: + +```python +ctx.register_csv("csv_1e8", "G1_1e8_1e2_0_0.csv") +``` + +## Create table from Parquet + +You can read a Parquet file into a DataFusion DataFrame. Here's how to read the `yellow_tripdata_2021-01.parquet` file into a table named `taxi`. + +```python +ctx.register_parquet("taxi", "yellow_tripdata_2021-01.parquet") +``` diff --git a/docs/mdbook/src/usage/index.md b/docs/mdbook/src/usage/index.md new file mode 100644 index 000000000..eb395661e --- /dev/null +++ b/docs/mdbook/src/usage/index.md @@ -0,0 +1,9 @@ +# Usage + +This section shows how to create DataFusion DataFrames from a variety of data sources like CSV files and Parquet files. + +You'll learn more about the SQL statements that are supported by DataFusion. + +You'll also learn about the DataFusion's Python API for querying data. + +The documentation will wrap up with a variety of real-world data processing tasks that are well suited for DataFusion. The lightning-fast speed and reliable execution makes DataFusion the best technology for a variety of data processing tasks. diff --git a/docs/mdbook/src/usage/query-table.md b/docs/mdbook/src/usage/query-table.md new file mode 100644 index 000000000..dbd0bb774 --- /dev/null +++ b/docs/mdbook/src/usage/query-table.md @@ -0,0 +1,109 @@ +# DataFusion Query Table + +DataFusion tables can be queried with SQL or with the Python API. + +Let's create a small table and show the different types of queries that can be run. + +```python +df = ctx.from_pydict( + { + "first_name": ["li", "wang", "ron", "amanda"], + "age": [25, 75, 68, 18], + "country": ["china", "china", "us", "us"], + }, + name="some_people", +) +``` + +Here's the data in the table: + +``` ++------------+-----+---------+ +| first_name | age | country | ++------------+-----+---------+ +| li | 25 | china | +| wang | 75 | china | +| ron | 68 | us | +| amanda | 18 | us | ++------------+-----+---------+ +``` + +## DataFusion Filter DataFrame + +Here's how to find all individuals that are older than 65 years old in the data with SQL: + +``` +ctx.sql("select * from some_people where age > 65") + ++------------+-----+---------+ +| first_name | age | country | ++------------+-----+---------+ +| wang | 75 | china | +| ron | 68 | us | ++------------+-----+---------+ +``` + +Here's how to run the same query with Python: + +```python +df.filter(col("age") > lit(65)) +``` + +``` ++------------+-----+---------+ +| first_name | age | country | ++------------+-----+---------+ +| wang | 75 | china | +| ron | 68 | us | ++------------+-----+---------+ +``` + +## DataFusion Select Columns from DataFrame + +Here's how to select the `first_name` and `country` columns from the DataFrame with SQL: + +``` +ctx.sql("select first_name, country from some_people") + + ++------------+---------+ +| first_name | country | ++------------+---------+ +| li | china | +| wang | china | +| ron | us | +| amanda | us | ++------------+---------+ +``` + +Here's how to run the same query with Python: + +```python +df.select(col("first_name"), col("country")) +``` + +``` ++------------+---------+ +| first_name | country | ++------------+---------+ +| li | china | +| wang | china | +| ron | us | +| amanda | us | ++------------+---------+ +``` + +## DataFusion Aggregation Query + +Here's how to run a group by aggregation query: + +``` +ctx.sql("select country, count(*) as num_people from some_people group by country") + ++---------+------------+ +| country | num_people | ++---------+------------+ +| china | 2 | +| us | 2 | ++---------+------------+ +``` From ea803f85137d085648e0c25632db89fade4c21f3 Mon Sep 17 00:00:00 2001 From: Matthew Powers Date: Wed, 3 May 2023 19:08:32 -0400 Subject: [PATCH 2/3] Address code review comments --- docs/mdbook/book.toml | 2 +- docs/mdbook/src/SUMMARY.md | 16 ++++++++++++++++ docs/mdbook/src/index.md | 16 ++++++++++++++++ docs/mdbook/src/installation.md | 22 +++++++++++++++++++--- docs/mdbook/src/quickstart.md | 16 ++++++++++++++++ docs/mdbook/src/usage/README.md | 1 - docs/mdbook/src/usage/create-table.md | 22 +++++++++++++++++++--- docs/mdbook/src/usage/index.md | 16 ++++++++++++++++ docs/mdbook/src/usage/query-table.md | 16 ++++++++++++++++ 9 files changed, 119 insertions(+), 8 deletions(-) delete mode 100644 docs/mdbook/src/usage/README.md diff --git a/docs/mdbook/book.toml b/docs/mdbook/book.toml index 6540074a1..f9a3ba8be 100644 --- a/docs/mdbook/book.toml +++ b/docs/mdbook/book.toml @@ -1,5 +1,5 @@ [book] -authors = ["Matthew Powers"] +authors = ["Apache Arrow "] language = "en" multilingual = false src = "src" diff --git a/docs/mdbook/src/SUMMARY.md b/docs/mdbook/src/SUMMARY.md index 37f276c35..b4908994d 100644 --- a/docs/mdbook/src/SUMMARY.md +++ b/docs/mdbook/src/SUMMARY.md @@ -1,3 +1,19 @@ + # Summary - [Index](./index.md) diff --git a/docs/mdbook/src/index.md b/docs/mdbook/src/index.md index 6248bd8da..3cd0fec1d 100644 --- a/docs/mdbook/src/index.md +++ b/docs/mdbook/src/index.md @@ -1,3 +1,19 @@ + # DataFusion Book DataFusion is a blazing fast query engine that lets you run data analyses quickly and reliably. diff --git a/docs/mdbook/src/installation.md b/docs/mdbook/src/installation.md index 9a1925437..ba00c8b80 100644 --- a/docs/mdbook/src/installation.md +++ b/docs/mdbook/src/installation.md @@ -1,14 +1,30 @@ + # Installation DataFusion is easy to install, just like any other Python library. -## Using Pip +## Using pip ``` bash pip install datafusion ``` -## conda & JupyterLab setup +## Conda & JupyterLab setup This section explains how to install DataFusion in a conda environment with other libraries that allow for a nice Jupyter workflow. This setup is completely optional. These steps are only needed if you'd like to run DataFusion in a Jupyter notebook and have an interface like this: @@ -43,4 +59,4 @@ Run `jupyter lab` or open the [JupyterLab Desktop application](https://github.co ## Examples -See the [pydata-examples](https://github.com/MrPowers/pydata-examples) for a variety of Jupyter notebooks that show DataFusion in action! +See the [DataFusion Python Examples](https://github.com/apache/arrow-datafusion-python/tree/main/examples) for a variety of Python scripts that show DataFusion in action! diff --git a/docs/mdbook/src/quickstart.md b/docs/mdbook/src/quickstart.md index 2609d3c42..bba0b36ae 100644 --- a/docs/mdbook/src/quickstart.md +++ b/docs/mdbook/src/quickstart.md @@ -1,3 +1,19 @@ + # DataFusion Quickstart You can easily query a DataFusion table with the Python API or with pure SQL. diff --git a/docs/mdbook/src/usage/README.md b/docs/mdbook/src/usage/README.md deleted file mode 100644 index 8f04b05ad..000000000 --- a/docs/mdbook/src/usage/README.md +++ /dev/null @@ -1 +0,0 @@ -# Usage diff --git a/docs/mdbook/src/usage/create-table.md b/docs/mdbook/src/usage/create-table.md index 0c4239c20..332863a16 100644 --- a/docs/mdbook/src/usage/create-table.md +++ b/docs/mdbook/src/usage/create-table.md @@ -1,8 +1,24 @@ + # DataFusion Create Table It's easy to create DataFusion tables from a variety of data sources. -## Create table from Python Dictionary +## Create Table from Python Dictionary Here's how to create a DataFusion table from a Python dictionary: @@ -26,7 +42,7 @@ ctx = SessionContext() df = ctx.from_pydict({"a": [1, 2, 3, 1], "b": [4, 5, 6, 7]}) ``` -## Create table from CSV +## Create Table from CSV You can read a CSV into a DataFusion DataFrame. Here's how to read the `G1_1e8_1e2_0_0.csv` file into a table named `csv_1e8`: @@ -34,7 +50,7 @@ You can read a CSV into a DataFusion DataFrame. Here's how to read the `G1_1e8_ ctx.register_csv("csv_1e8", "G1_1e8_1e2_0_0.csv") ``` -## Create table from Parquet +## Create Table from Parquet You can read a Parquet file into a DataFusion DataFrame. Here's how to read the `yellow_tripdata_2021-01.parquet` file into a table named `taxi`. diff --git a/docs/mdbook/src/usage/index.md b/docs/mdbook/src/usage/index.md index eb395661e..1ef4406f7 100644 --- a/docs/mdbook/src/usage/index.md +++ b/docs/mdbook/src/usage/index.md @@ -1,3 +1,19 @@ + # Usage This section shows how to create DataFusion DataFrames from a variety of data sources like CSV files and Parquet files. diff --git a/docs/mdbook/src/usage/query-table.md b/docs/mdbook/src/usage/query-table.md index dbd0bb774..5e4e38001 100644 --- a/docs/mdbook/src/usage/query-table.md +++ b/docs/mdbook/src/usage/query-table.md @@ -1,3 +1,19 @@ + # DataFusion Query Table DataFusion tables can be queried with SQL or with the Python API. From c02cec9e965795c6fe35ad49aca39ec01ee7c27d Mon Sep 17 00:00:00 2001 From: Matthew Powers Date: Thu, 4 May 2023 06:10:10 -0400 Subject: [PATCH 3/3] Add missing ASF headers --- docs/mdbook/README.md | 16 ++++++++++++++++ docs/mdbook/book.toml | 17 +++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/docs/mdbook/README.md b/docs/mdbook/README.md index 743c937aa..664b4b4ce 100644 --- a/docs/mdbook/README.md +++ b/docs/mdbook/README.md @@ -1,3 +1,19 @@ + # DataFusion Book This folder builds a DataFusion user guide using [mdBook](https://github.com/rust-lang/mdBook). diff --git a/docs/mdbook/book.toml b/docs/mdbook/book.toml index f9a3ba8be..089cb9a97 100644 --- a/docs/mdbook/book.toml +++ b/docs/mdbook/book.toml @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + [book] authors = ["Apache Arrow "] language = "en"