From 8aca79dfab39919333d2313364e5fd53708dbf5c Mon Sep 17 00:00:00 2001 From: Nolan Darilek <nolan@thewordnerd.info> Date: Wed, 18 May 2022 13:04:58 -0500 Subject: [PATCH] Initial commit. --- .gitignore | 3 + Cargo.toml | 14 ++ LICENSE | 21 +++ assets/footstep.wav | Bin 0 -> 93548 bytes examples/game.rs | 72 +++++++++ src/lib.rs | 372 ++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 482 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.toml create mode 100644 LICENSE create mode 100644 assets/footstep.wav create mode 100644 examples/game.rs create mode 100644 src/lib.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..be8064a --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/target +*.dll +Cargo.lock \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..0e996a2 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "bevy_synthizer" +version = "0.1.0" +authors = ["Nolan Darilek <nolan@thewordnerd.info>"] +license = "MIT OR Apache-2.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +anyhow = "1" +bevy = { version = "0.7", default-features = false } +derive_more = "0.99" +synthizer = { git = "https://github.com/synthizer/synthizer-rs" } \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..c74962d --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Nolan Darilek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/assets/footstep.wav b/assets/footstep.wav new file mode 100644 index 0000000000000000000000000000000000000000..78612877589b6e6dcdaf0bc826ade4bea2456e63 GIT binary patch literal 93548 zcmYJb1$Y!o6E55`Gi%v+NYLQ!?(Xgm!2$$32X}Y3;0JfN;O_1YK@vzHF1uNoY59xq z-uwLQlVq8l?dj>RuC99PeW!D)=FNwU#;8Z5?#+gdo>0&qA%x*I=L)=;j1fWpXvn|` z0~^9Q|L@=bdnYAA|K~^i-*^B2Cx74lZRhVlDgS={_dSIlE(x?M<^TEg?@=xd$^Lf+ zMe6^~`FjS3BY(g9e~u{sdyn9_0%w?z51i?iIsf~XOJ>7gKV<#il`s<01+Tv?3;DMd zj12hy-!t+cUpUJIN3767j?9o|q(OT&xJ%pruI-XenGWZgp>+p*8jM2Vy%&!B?F;|E z$AnCSBR2RX7!^V#PysmO6ZFE2{=gX}P$^UdULkOe7xIC0|F1WH@4$reBRgDA$RN0n z=kOgai=ZH+!*`Qpyws%y`s0U+!%sfw(-XMEhR{-`OqHcjJ5&jJ?uK*YWhiQZYNB!| z7fOV&v%#5h@R!Nb(0YQ*3w_Iwe$XplR29Bo40^<59=MW#(SIZVND0^SgWku=pYoo( z4cBqX9dfPQ4{gWFL((fdp-AYh2ks{bdSXT4s3}^33ZwV30jhznNd?C1mOLj@WEJS& zc6mbXfp+%D3(^YLy#_6ILTT{c7kc<!c0?P|NHi9D9fC?jU*h46-Lep>44?jy9$6DT zlc!}tR2JGl1!K}3O+|fBZ|K8F6pGHuU=#+|s{^B#4@P^AtP9tBA{)wJc~lOCbElwj za7HGohF7E2a+%yE%cFGpO7=r_p|>5-zi7Qw<p-Gw_7n^wzd&}9TVWK(!Zm_mBxB?v zIU03F8|7Y@gCeLcydKKMvJ2e#D>!?FtO)Hrmrd|)bXfL4E_qPSkr6_H`F$<tp+#sZ zx(fFiFDJwAO)w7iWl7lsM!O@L3-h5tp9!*n1xBI~a=!FOjpaBwO@5R=<N!GzZ0Ncy zj$=`6ycO3#>twjxEPulp<IoUX89$J#<aoH!E%{XTN1IVI^hsLeNf9Fo%B|3A6U^g1 zISg5G9<ZfdC<Sc++v|;n!VL69)nR1L!3g@If^h92=owsVr9_g6Q~z552vwCwz^XpL z+?53jNt1igGU)ebX_M*b1WE$Cu*kcz3<?A*b3$L=gPrt&x$lcUVv0R-vb-s=tS7&~ zC$muwYJ|t5$<WF;R7&<jOHd$chHoPSWx>3Sl^bOQN{6{BCcpDJB14AAFTy1s$?7Ns z=a${XI<ZG^(G~^c_h8q$yo4mYFOEl|UFfJ>ClbVY^cr!n@rg1;*hFj56|KWg{0{Ep zut<_s<VL<pY!=(m4$>VzLbpV5aaL|YpTP1v;S%I9E{%VP(PEDr0d{*zZWkNGWEt?k z^%jIGqBf|q)KGgoiA*JZa7X-$PvnLuCj(IjQeLS<_YoU<ZTJ|A*f?1dk0Y&cL;O-c z=D%b|xu198iQHFi5c#Bvo8x|HA6V2}o{ygrR$Lo7&`Ws*EaM|v!`6#ka-7JK?N9{j zg@53EIDtH&W6*xl9rq`_(M3FyM2ZbYQyfa4kP^yTl8rx02Ip=SWe_1HMSX6?ckp)l zgQVhGxVgSp_wu^rERM%($OxK)rtr;1xZ&ij#Zzg*5n{HOAhydn=!#UuC|N*`715HS zndCOTMgGHa=m436-=G<|J^XINYoqz-E_`n@J}Hm!;o=&40zR__J_c*@t$Zw2q8g;U z)WiyTj3Rm#Zy+ydGa8MniF14n-@?|*L71bV_&Z*V*T{*ixb9*L$TKB?926Uk`}#-y zBwL2IV-LMfi;$u6B71H$W+QQaGK174m*E>T*>XKd|HLiwq5KE;C4Ir>7s`d=l~ISE zm;2BqxX-d$d9%}$OU=tM3+1Qe2=tt8()ydqlj~vvnkU-J7T{Yy^C<LFzUCi{VtfOC z&eB*j{y@ycDsG17l0A3=SUtwWWHfq2+mb6_SJ(M{*^VrfX5H$2?R7CLvWwk#IeCEk zi!4!v6eO=mGa5{DsfX1cS}RMexvq9y8H-DykD6O^$^g%>EbMg4kETTG#o^=}iV&Hy z1FdS=s)X~Odfx03=~pthXI;-+;hxO?5mDHUXULMGEq$PURl3m!YCqEwa#bGY^L0PZ zH1Ak_Aj;H^Xyr*Y+=ce0&+s)|k5@46xtF?z@uq?yH(jqT(wbUxD+lCy(f~ZoC0rZN zm-%rQJRJ4LJ|r(n7GKd3QjG4!eiUidEyt}H+EC(8o8x%lMyaSF&99iudCc8ZRn4z1 zRA66opLb^IkBx$S8#*C(WhXf587ue$6vww4MVUX1q34W@oN;=LT0*^|^;e7Fc=lYR z5i4`Ksd0~gmYjAYKIFc73T<cmxWM&AwCB6$sW(S0tE7lmxP%g^`{nHP%yZdY4~<#+ zIwKa1NBMkQrc?MIdCTa_3*uDs6muix0R75nPIKoy_d@So{UzVUyNDIaYs*^eCvCT- zyw;R_G75-H{l0Th){h*b7xRAb8ms|5skZe05#;alM;)UL!cjN{?a-SU{XON}FP+`8 zt9#c-shq{<w5qn*<Oa^K6qfCHy7VQR#RvB==QEGf@j7d~IHL?FU$y%7*uX-zrIvlR zm!@!25w)jfsozDVfL_a;<jKjJ>|7|ZQeISG!QvA&+s2t{o0nM6+2`7)SRa}XC@*B3 zQPLRTYLQ(fYqGnBC`+c3Hp)HA6U!zg1tq{-w-qJPC|uUk(DuOhUwbq9OuS~f^y!ZI z&RW@Fo-D9;qA5yYv|C<Qep4GNpxv<T)}qO5b(OY4`-;Q(Bz>Fl%6&7ZrT36=gICe- zdggf)_dxwWoJp1_rL}ozgmKHbj7Ryr4OpVw(MNh8vNre}?kh~JxmwX2W4@~tBbUwC zHqyKrHxTP`^5z6*wai}Os^xs)%yxxlPRKY+QvIuk915-G7ev;{w)mZa9X&F#vVC07 zvWDT#rWA6+)YCgrv?5-^<Vs~_XfN$P|Crs3t;D^QJxZ_Om$^y>)Xg(4;EsA;Z<jJ8 zdGMdc@!Gd(iRP?4ZpFP5w=<R1zH8OZsWQw+!ttabdV{(uoqd*(ZEOH)sdhD0Lf=?J z?+o`J*Oc^_ZyB){e@#m%pjWeh^tmkGn)3SH_9^0D!?(7jxM`ZLE3xT`-uJHh-gHk( zeLH(*O!iI_LrryjhMHs4abma;<qkKZln()+!D+Te%6n_HWtrIK>LZ-6=Zy2cVcv+p ztK3pnn@980B)(LypB0?q&h~izF<R0cxT|s9iJT8JJ7xFASI`SmQ2ob0IA~Uo45}8m z%{EVYVIFN?K%)3$y|8GVS>Vrw-(`MR&Lplp#ux7!R|Qs?zYv#bBwb=E791T=%hE@i zN{4$JxGdh~`Yln@n7~c)F`H+E={9zbWUxKX^I5N0dvixipyjl!vFS9Os18=B@)>WV zEqq4$#JR4xs_-yN8*4djt%$VT4QpmArhcXmWf!pst+LMYE2Qn`$HgtxhH{K_Iz)Xa ztI<2I>@2I1ApNcW!PWd)Sz~N<d?wfidY`7v^VYT$MoYY<_%EJBa+CnP54FU>=#FfI zYOt;(!aSA)Az$3bBGe#$-^lN+uaD1|kp9*)-Lcqv#oEhnhWRM@N5p%JrcX<+=Sa*c zhMrnJnNO1_^<NXmQ}x@KjnZ!X`H(XaVwQPYq;I6ZP<QGTog3u`^wzb~eb93$XP0N4 z=z?o{&v^I9DC1oAf1Ve%uSyT^B{m&bM%xT3W|DAEOII`Zp^Rsa+{Q$`sdpqhi^tK^ zrf_u;pMXCIvlyZ_4m=-Fk6c6p<!+kG(!#%aKxf}s(vsf8-Auh{QBBS0R{Gi~C3>?2 zPZ-^oGspAA_QQ84sj5ulgEJTA_*>R%$>Ol%0?TEx;X8V4c4eb8D~dJko!Z=Yagkvq zc7?XV7v0TMx;htoMrPf2hHCpwM{J$UDJa{Q6et#kRcXy{-{jqs6@lCOS$(FlPH48h zi*Jhdoz&2(8CnkFxlM;Hnk}ANUF}@?#6j&}tH1T8HkK4-_mc`GO?G^B=5;q#t_Cd* zD?#rk)J<}yY{|Tr)+ec5)_knyU7O1poaJ*?%`kTl>~5Lw2urQx7>e5A5T4}<VvS4} zeCpY18F9aNc&Dk;eNych&Cd#Q)lh!>t@dq?$AWJeuC=Fcv=#O>N>A^9qKK}g9b*G6 zC1?$AUg0sl_MIPCo=(cV?p951djvk>5qyEVRj=zfk~z!q&{!|$sD12?z+}q?am_h4 zdwbf#bi#Z1?yxrq9A~w8BWQ+wX5f?jX<>&#TB)<V1v6(R3P*Q)|2%7Qd+cpQJ<S&Q z#&0Jzr=R>*`%mnjk6$~cZE?jp{$*bRX6FsC=jF@NqTe0<F(GSY>e}R|o={Rm{?wyo zKdq6rAD2Y~k*`r9ee>^Snm1s*wQ<;#(i8IEvIKf-C;j|<F82HHGN}tZ!)YIUO5LG6 zU<-du_z?5;U|g%D8SeI46x-=4ni}&ccT7+HxsRF>=Q`t=;3pg2uWl)Dy-3w+8#|S4 zlh}eaUD|L(rPKMj`G)nlZIU;VEg_Xsi^eD510@z!{#Mw}<Zo(2D*c@L{9tUfD~^Y% z<+b(3jht7E(Q5%CtUt9HthP+jwib9-V@892OZEso8IWyTfE#Fi0uIq#STR}rQ$yDj zo>lN<;N83*iZ##O%N*d`k!aVuDO(Kt&-%aOUCoKiycxG3uH(}wH_tsN`|V1?q@)}1 zoqxRieE2*2dhK=lPr={Mc|KSl8%>RF&NdlM<2&EGd@JvVy>a<IzP@w!(buo0SDQ}0 z-f()~>oYH|TzzupS)*sR*jI5&-rsvw_a*vtCZ$nM)13U?)8F2|=<;c6#zs-pJR+cn z&kFaRlsaTZ=&_KpA>)gtl#Z*lrs0qp*Yf%L#8~Q+(YTK7RY>dbiWM$5t<|J_%Z+Vp zZ30@BX;QTHvyM|c>~9m@`D4$RCQU0HtXZw@i%Q$;E^YC-*6yPA3T11*u6DNEm|}rp zcYUAw-wu7B?`L>I!Ow*n6qx5@wVw)YTewnX(%@8s*tW@Sk5_3Iyv0^6xLN+&g<BMj z$g|fZj9Tekf7Sdl=X<@lW)It)IB<5v?ZVHmJ{fW6_KlWzn>_Qr^gbQ@@ZH4&du=<u z-;7H(|3>eYyr}tLX3VtH-%sq@|LecayUU*JcU9i(bXU2$@aW!s6Hm0bqMwXEgwI_( zJ9yXE9kos*p9nj!_Q>`#^Uo}}-T0Mu_0_2@4^DlnpO&6<I&tv#;7{(fY1t3-sz#pl z=pS1@*+19&I3|9cH+RUQ0(Zj)ml#{3fB4amdP)IL&77L<;$%)}g<>^Jwk{P^dQ63N zb@e8>yG-c4ynT4<&ds{DywmGLH%qh6HH{7#5pR3djF{GwM=Tuqtmmd~wMGn`Z2dPr zqIN{9Zq=LIs9UvV)1LbWoE=m&a$w&%U6yoM-eXmt^?jc7HgzoCq<@QqCL0@{?>N2L zuu`V5_2uGf|Ec;s|BnDQ*Mq94T5PErr4LrvRqSYhCF$mm&Dd_QN5`;Q`fkfM+gxeS ziTu^*X`?&h%a<Q5?pkgIzk3wh?2C9?`GxuM-t#X`_dUPv_}EjeubnyR-0|P;PX}Jd z#NR1=`SSTn7qYHZduIKZ_sz-2Qyz?dRq#uluP@$DewzDkgFA`$IzOuTvEN7a{+!#H zw=DNI-Ya!`!GobshrU?%H7LROvN(RppA(6rW2^l55ufX~;fze~8oT??OV=pllCxp* zk)Jnz4@&-#yep}C*160^e|9^L;h$ujv$*4{_k!+bR@dqDZP}IFiP;y7RwkjXHE+o^ zIB2l%3F~VTDmGd+2fp{4Y-wfA@3%MTP8iNJFaN<}4~tg}ua(EhH>l`>0vm(M`&Q01 zrBFs`bMcg*%GNmhbH6O#KDG=?Yuh>dS)Z+b?*g*|hWqt2PnN~WTiQcrdJFRv*5dYU zzLwC*xxzyh1!V`e4#^!b$)0Rd)lS+v^H^&W8o`e6!|WN)XG*kqOl$1*{U6&DYmPaW zEy;G%_f(z-1-FEc3}0DfcA+%^=S*j{GS&h<Gc2F2W+fC|CtXYr)aur}zCV1U{jH|9 z>Oh|l_CMBe`z8CRTw6oC2Tt~D>t8M)1J`jsa4j%VpBmO?fxSb<`9HJ>9F0pU7exb4 zC~D=iRtu5C<riGs*x<@5oADv8(vJGN#PNp3J(>6BeT|E_yo^e#`=?Fnv)|QzKg=l0 zE~>w@Ve+SF!iMX+*aq*`>`yrv&i0x2+_UgP*QvA)8DrDxCiPDopFGJiRd;$@Wz|WE z&7R;~nSl~7{A`{Slb)1zU7w56-5atyrTTyS@59i<$eiw39TP8oON*=Y-Tcib;ZrKh z`Qs|#F6cdxQ$1TtTacE=sXJS_>{*M_w<VTJod0Wa{F<MIf9y%hm6Dz~G<B=@H0oyT zbR0_RlbAQLaf;is8Xr~ive)`0`A(mkRWa+1IBKmI=n9Cp{jhxtd>B$c;9*Fiz%~U& z6+Z2!dOYb#JS$*dU@H?s^}LbxMfR%LgU47Km}~fs4Ea&8a=6*oWlb{M)%WtYu~Y2z zSrK|AZ_|)P=GP)OzhT;JtxiW;Kl}d*d>&di^nI=gfymz465un@|GBNAl2=aQQF_tr z#H=XSTcub)WXONk>trR%<7t?4k>{{ktg`p5vy4X*^PPt?7djF$h8jcYeq(P|YflN0 z&OURqw|iE-<X1^^V63;MZ%XNvZFSc+V)ZwU$=(m59UJTJl>Rnzk81+^CcNShPtJ-> z&F|Sq<J5<!ik#x!<0$Hw=S<9b?`-LEx?Xs)-A&-w!kq2;PNR{3L>?YoHqY_Eu)w#$ zNx8B^&IXst*CG5t!5O*wSq{@!lQa!5&9{6|KT$^Bh(YM6$*HY}J3a1mG<$Pe9j%zp zD!<`{x0Sb+c$K?XfREjw-NS2mwoIU3)d}{VzRW(vubl5lzk-%9+l!#nq5lQm3W)Mq zVe=)W=^m2L6PdNfwOY(kiPDAclXHAN1Xyf->N~ZuUpeb}_lJyz>1|V2<{b6@$sV6J zGc6=_ae5zjU+TfHTyf5)&M@7Tlatdnb4F%evRkQUbjTX-F!&R7z1D>e!!e$KjC<(= zvafri)V9__^bq^x?&qw-diiX(tW=uPNTYDttd#EQUEL~~z~^QhNxhJL&*_IBD#y*+ zwAcCyZ!+4Z8;<uLyW@D$;LNdPsL4g|m;(In`xaA9x@W4F!jtpL(9a<Wff<%M{<-oE zx0F{31%?OQ^7r=(()Q9F-gYjpI1q9ryne`4dvX6aAxH9W^sQpt_Xu$_>#5^_zLF&{ zv#F=)l2$nIKxk;-NNZhdEz=rWO*xDrv;EWd8diCg4~BR#Kpk#EbVJTXPYSCd<18kv z5uzl`z1!I1Gs!*#1A^u^Fm$~AnPQjuNMrj0Yi_bl`{O?}D8HqI>8veXeZgOwt_GpN zaCNlu+%ima(?5Qn!z%bKHRd_1m@fFO^?MgmGdNFxzqJ*fh+77l{ClFac)K>lG?heR zUmr`zLBDCairOxFdb@us4()+8J=Ze-tJ+MKo_RiPkX}}3#zimo)MhKpMFLg^t?|3z z>+zlICw!xWB7>G%pYxA;8#31Dkh#F+YituS7MuO3y=mY-JS3%R`mC&-nb?`*h|mwv z)rh-_x|Ezt**9{ki&Jb{cFXMj=|2)1CS?8^m((=le0sN(L)mBf8dOLQ=I7l$IV*Ga zXJxt<WRG`^(KGZfiKSv2WJO3n2lb3`kklq=<$vEyIF$S{vz+^b_m}gJ%ST+xvO3E1 zP42guR#!LPi0-z=6XAVn{9-{yJ37y_(P-f6<ErL7mu$%%rWQBV!!DDsJ`^q0Kznf` z$eE-1sU>+V*Udw1#Y0Zy?i^MlY<J)q(<w8u_w{|PU(KGO8%mm~pw`20d9Inhe^9i! zS@3ZCbIq-PP8#XBFXEJ^rbd3Va!(-@`8{m4j8Pi9ugJL}a|#RyI~`CdsIXdI)Uyr` zm?c_e6xRFF_WpWUjBjJTwNV`Ks_FQ*ewdc?Jr)*Zzb#kcPA)xll^A2*68I{(ZE!w1 z#np+8POY0BuUpw2Ud7O9TXSu+BJEVtTe(`DWa;J2Yb?>*7$>tQ|L{#nO>3H%^1GdJ z&EASP{5|u}W=DEvKw8`Ee$J7ZC!8CMQmzu&aoG<X4riL9h<B7_js3RjBVOpY^`ai) z+Mrh>ZO~4<U*-Vr79@0Kn`eZprf`vPa?w~~>Xf@;!B3X;&QJPNInS7Gt{1u>;DR!p z-Xl%XlI#abpWR(iEzdRaKI}@NIYGJo^M=HRb<EuavXDsaNZ=FmN`Aom!EufXKY!Ck zUI%rxwXyn{my*S(s9M+T@agB*%=q-PLtNqP2BL|1uHSL(Kit4mEzO?w*|S+J(*F1r z^y%W$G+=|juvf9~U~AmbGPhq7+fG2^>)_r-fCsT^o+NKGS5;il1c;pN7%AmCmL8wI zK6QB7K_|nr-DiF+Naws2@Bim&VrxgRUK&YKiX3t4B1e?)%+C<%(>=-R8uJ#G<GLyb zfsg;l?lZT$u(!YV+Hj;-bC%92o_#oTK~8()jcKS~f-;8P_dLdx)LgFBS;F%QMMJ^s zFx??e(n_`iL02p;`qY$a9~c-M@*ybMKSXUR-<jUn`X~okf@tSCl(S3vX+zW}{E9J% zyrxC6BmUrwqM6S#5}cu|Ij_#8+Q2u$bdAKyiQM1o<q=vfg>Z|$!zinarb*tFIpwm0 z^-yAn1n2Lpiv}R+?l*c9oLlU4Jj{$XI_nPSe(wqo@|4iO8RxwfGAFuL$yo7OU1|-p z%r^P*UhWEDC!5j|6NaR$OM9JmF6mv0HS1G`HFJpjqocWdlwjsp))_=qk!h&BhM4V( z|0rvmQV8`zAKg2%#?p267?Z`O1nvoVtW7o=d**naIF7iAnYO489EF^%v;kJG)zb3X zdMnk9AD&<6gRQf5o@aYTL%o4#f&Ry`$9%$6+rL~$F`I5qw+05E$)n}kZ*66rrCrpk z$U~&QDZt*r|A4i!ddlap{~2o=a!JnDA_KODytIYkLU^}yd$T;<MGCQNQSyh&gg082 z+pe42n0xu04-E9X;v3`NTG^^E^ep#s{k1nRC&?&Im^#(+94+>)bezzivMh(mQ(5cb zGYmh(UF96_A7>%=wTum}$>IveZjsd|`BQ2iy{vxTIAHjBkBGO->-d&=+uhfj=?xbh zT!nLfdrq?(o^-iXElv*`yU}ygI%^@!WG(c^+065Y%rHAG^;9o<s!sE%p*(iZcRp6i zo2_IW!lqK@K%YrIhb`~TU&toqi)Fidz`HFc)ooXw`A$%ySUs^=Ic&~v`DN~lL%pN) zUs%-+spV{Y?A3g#*$&`DF-3V0Fecz&P^Hi^L9cu=EdOb@%oe{rzMqt>XqM8RcEAQV zWLq*vxkI=J$75tgHcM~D3h~CqLAFmfLuITW*Vs}$z^Evvq6l(cdx4s`>^aYJh~dlD zdUMG)M(3<y*~7h)PzCiG>Ec=GBsp`vlMLi3&i9e0bS!x)ABjMUX(abyGel$a0o>DF zzz}?~vDR58eQx$e{z&xZgV-c@3D-ZKGVTw~fh-SBb#I53K4%Tkuc|}nTv0>*)IO3= zJPZ)*?_S8Y*dW=Lb#rAnliZtKd$WVwwQzzui+wka$|J^1?^Jg_M+$4E*_4&K;h7{~ znf@g=JXbSQ(gPf0++CrCpPu%P*vxaT#qN38$?l@+KvO&qkm2-_tl{04^T@pcqU8rr zXRPf0mR--8ki+;DvRw=jnY^O6lSA|9-dgTLp5n$~<Doo&4Y7^Y_dazxT(SIuy4iG4 zeL@D1u7vSlt`W`w`YLn=pO+ia3FQWjMOCzk=8inns34LZvs_(ih!%~bh{LqecZXjS zQx`JO)YewSaugR}%qXiqQzMl2xU2HaJj}Y-a>%mVFWoP|9%;Yq6J!hV;kL3Sn>td} zm2s9>+X|nl_U-14v<{E)<mP*DL)p`CiUgS1ecpfdqaM}$*?US<Q82BmoKeci0A2u% zm+9n{iCB*D{LUht#zL1N;=Z0o^i+PEoig5i)pOEwj-N5gdB(br86h%4?lFR0bv+U6 zK3^uQh{k-p@JF|lQFxVcM=!=lqkZBeUm@ZtRWk53Vo|Q3deT?vYJX>aq6fG&Q4>3i zhpdOFM?R1jWQLmL6KfANot0L+*qSe3Wk5Sy5KTub=pXBE->;!%LaX_g*QU#zq6*&4 zyU9fJp@7rD+pRZAdwC^uMrsw;SiIUq0@DI!*#gi+5zp^9Td^ISOP6`N`4uf;oN~v& z&f0;Nr6wMP8!JCmj30>CBt<>z`Q;+it?r;c+7sy^7wl(!f7#~JM0N)%Mz2YjB6usg zmliZnp`+0zC9k63J4BT?q#xam^J=xMx5>qvb-G5wk)4k<LOiF8L-=2)z*Ob?MS1*< zuA$L9#a+fYLt2UQIaXI^xrek6BaPlhef=&}Bct_S#A>!6vnRuS4%q>v_PB28{wQ5J z&2GAe<y7-_($=5`#(txa?8)EY&LYlJ#_QHsaTCwW0vzA64mmdHSLjI69$RFl+v_gH zvgI4SV@?Bibv=kZVh!+q;)9#8mhNvkq2Bqd2%3bNpdxZJKk0d!z0y_CIO;u;lae!7 zu27hG=DLxyklmD#c%$+`c}{B4+gc*}C>qF>EK|fHir<LV{3v*Y@7D2wZ7l0ZJ@O0v zB*ErR=1oxN7(gyU%~8c0@Ku&uR8@x2<22m%%C?Ub<(Fiz>9YBP`d*Dw5|wpyy;9Or z*>=UWj!aPJn73#hl#75buc0~AL6(!^WC1xQgN?Sv4KhaEjQ6mexSVO77DBJc$+VMs zyU%N%m8J`di4>%jwOxQ!$MO9-)a~@2t~6(wbFf~3EQ7km5}JWN=@Y$~{0Lv+K9=3a z)sQ!qtK~iP4yyiz@F$tb8hiVDp6ZP}KfIrLs*Gek(Fny4UBIVUFdr%aC2?1AJaC8c zfw+@9pQ{gRz~<*%H0sK9??BgM?-$Q6Jx;Db2lO@G1#C1=HIm(L+$pXOj@iy@`T>^A zyNaF0YGag`hw7>ErvB#XCX*IN_UJ=gUyP3GcM>MP@|Q9Mt(EhDNAe!x^jA<be`-2p z-m5|NS?%syz?Ums*k)Hp?>#oiIHQN)U{jRor{aUM_%Wj_NmBEf=F3^SgBRu}jL)*2 z7OT~@T1+?b1o4IS(6Ro9=hj|84XHdDDM#?LMzTCk`_Te;49c&LHg$&Dd6GCsqtxBX z2I;H+W2_S+)NGon23hKu_v7ij78`}0LM{KW>6PiYvH@2VCeq)uMb;DZlz43jJ%bmE zp1>bykKW;e${tb38?SegK58D7sw<Qd@SR)yuHkSkc0FRVhzGTV%5`2oPW+UI5C#^- zRD2vSAlb;_jrWdbuUQ9d!a3}=F_Kx?8TUp{XH-S4uI57ny#ILCxaYcd$dlBEgwxk@ zJ-@_i>vi3&*<>XQjbkh2a_Z$RL@&CU7F6!zMKX~eVNrTdqp)$^b<opBUN9S`MY0NC zj7E?We26|@EF(W@J#CP(RJ!;lUX;1nOE#TH$yRbAuvdiK!>{ALxTvtxYWRgHft<>2 zdR6??T?PUsOC>qRXlATMLzS;eeYJ}E6R#%csfCQg^-&AH7v_H@4pj`=5xGSRU>ocb zkM+g6g@>XO>JjxSc?3wdMHB!&$|PWAEHRQ%S8cjjBtvN+-YKfm7~Bu9#$`!6*ilc3 zcCsv)4C}HTx^6sWb%h6Q5b5YHt*7)<?oh-NSv@%u9pf=<l`>j2#9bo~tfFb+rKysZ zM`rTV(yQ)Kd}TQIHzGZoy-ui09cG_o1N@8SfQJkb2FpT?(Ppuis+Kvbg`QEm%KvyX zTpm|MUf5MSv9c@@9i{VVdD;-_*bPZ-k_&K?I#B691ipU&{w^;Y?F9tW5G`GTdTcv6 z5=}&y=wvQbtD6x<>yvBvkUB-XuD&A!absYW6o7~Xvx_`N`ttXN8K0t)@qLkBbm1QT zKmLxarQPX8`h^t5v0^A3zacLvi@_2fqTz7gdvGq<i<c7z$ra@UjUt^W1{>|eCh<7F z5Vs{ip(cC>6~;Ai0NDgwtIP5ZJIoVs963WKkgdp#`_ck*yK<dCot?MEKS(9K4#grn zi6Y5-7T-h!U>hrO6<h)Qds`GMBGFcShJ071tAth|H_;-D38quXJGo0Fi@TycAaRLk zA^wJ9m09M#nnlf0C(shWh4`ZsQ7V%`$cqN@6p>pQtO(VtTEN5qBOH2j&uOT>_~O^J zzxr8eibtUbxBv|%ckzAH0*yh}fe*7l9w2@33^We!fIAwgNYV(HJl#czY>NBH58^4g zCEM#Yy>(bA<D^kXoC20tS3C!qjZ9B3<B^dnTd7}_&Eyi^Cm%3P+>sSfZr~h6^W`#z zh7&jMAQQy|K(cm72Rey^V9%cH@iU47L*yuOv7PQ#-h=u@{T@fW8S4Ywpqqw2A1Ql^ zvHZPUO{>#icn6vx>TtJQEUNQ-_$nSo$7?Ip%|yuRz;=qloylS`R66hplm^&ReY8}c zVQl5tyN55wErC3EjVu>^yw7!=RYD`l4Otc=T2<a)cfI%Z>asUkNjHcqd?k7y%ZWuS z+EYt!$t7!{f8)1B8~g=7li}jN?2In*8+Z}100(Ut`bTaC4opM6o&FJ3hrQ}1Kg;i; zYqW)O5-Lk!#uQ*RxUy?z_CXfyk~Yj!Ipd}4vn-@=xa-omE4!qx68^F@D{UwumW+Z? zkHNk;(b%aE#ntE%enzZ9L*zfQhbWD%GLyJ0XE3{d%&5eQdY`$Q3q@;cszZ`kJ~@#1 z$u@ioDng#2v#2>fgDR8LC_k+9T*?r%UNsY|cF2^99;;2{Dsme&F@MqKL$r2~1?zjn z1++ptsr02c!3s2-fsW#QK!WTIbGAf8id-U8&P5T*G;&R@W_uZ;+muoC9T}@^gf$h6 zVt8e)$oizN;>LyeG!M_Y;hx3J_!#bi6VM7-Q;y<oP$(&kTpXdNcoJ}a3gV`uA$@>` zko8JOB^1{OwpKcBtO_-TZo=n9aa2uq;coVV{eX%W;A8wD3lJA%ZMoWbXEXzB+{SJi z57;r;PcD_Ufv;8s^~crlXVDU@GatUdqr_cWlZKKII-1S|2F!D@M&v^uWo6P-c?vA8 zlXwN4Pd?xSz~nnmM$yN#I4z0R^FOQw|ACg_2s8{<d4dRH8lNgYN*$k|@02o1C$b8i zL!<F2IbQrLEx3w&$a~8fWE5)5YshvqmA*o)(M!}+)MoyuBzUN2C>Wx`0$NqPR6zY0 z?UeZiMPZ}>DGfV8Kj7I^MxTK2+EQ(!CgO{t4VnbJ!C&MfIf1*#1w2^BqJwCfj1z9z z3T?*e^f$?e|C0pIQ8JXdWCSWG8w(3_8immzBifrGCZUJu6;4*lYBiM)av2LSzIg^4 zexg6{u!@oyG>~)=A9+i;P1eIN<UXFvqIf+~Uw-22#a{FSUj=p`=X1D+z30VbVR?`{ zd45qsewELFI~XHx;>&Uq&y-ofKJ0@R1H<r*V5}7P0#ho5`N<gZh|iR5WG0h(W$!ER zD&w|zhZV5RakvalA{EF5bV!;-BCi2nVj^%2y<)RWgS>GbYA0KZa6rT#@_A@CUW4M% z3se)ha;dy8?tmkORbD4c(N`2jmf(}*HtB=Th{>=c7Y8d`%*!($<|BUtbE<@VfcHQ& zwg5O?`Q>mnl{Epj;XGlMRY(Ewk!O_*w46QXQRE)AqQN|h9p%mBHsF&c^JV-fu#n!0 zHn85ma3Zz{Kl~c!qdV2S>N-`S1m%JK;<+5ok3#?FqTeVEzgDBwj|x*eE0?GWxtb<? z(G33CC@r#qX?Y5Fq!DBUxrWNg-lCt_gL~spbQ@Tp2gL)uf&S8%gkxw8ZJrV=dWim9 z)BEb1jML&2-luF=N0Ve(Tm-{BX0SPE5ct*|U>$$(FVquN7U6t|43hczASr+&`kNhr zo$>>|M3w{7*hXgKL1+!TV%(6$fYrPN1>njgM%v{kU>53lrV>T(VK3>XY$x?aA=ZG; z0JfaY-lHDmt!OGX$TaZzo4u3us=@~ezMmZwv&0u}=HumMY(_=V2K+C0fr`Mz%!9%q zKD-NSyaGN9zA+n+u<c@{e8p|@3?le6nv196J%X~YMt6QzJOe(j4{$z90|Gb~_`HR2 zHjYLqn5y}xf>+48=o{96QTYv`f({V1cwn7-@e{OPc9ny{4li;m>=D7(iLRqjvM1_D z-jb8pik)&A%10u}Nt&h%Ab*ev4+T$WM#XRhUXI7&!+1R|h??^<e1U9_#>y5vmV8#D zfQ`BgT@mTxfov&`qf@Af7y_#znCQyCw7EPXR)M8UF&(Fqc(esLG4shM+>P8p|B8pe zVBHIRz@K;~>dqGF75NudM#Rg(aswhX4|cFUJPlpNKEN&g49x0RVmJ7wlE9}<f|b?= z{Xzl2i8;=eVx(TBVR#9ti1M@FMk_HFEf#s@1F{oaf#ot^EN2_URNxQq#F3bw3w$)s z0)F0M+C=G!OTqrr1-x}M?7)wK(>Mt|^&InjmU(1lugBX6r_gQE01jgw$W%V?WRZjq zkv%dmKOokjT(HXbV}Sz10;3J<DXN1{$pdSyB90~j*v5~t5%PgJ%2&xgB%Q1y-+{ww zK__9QXNWmqQ^jBw4x+EPpBSkZGnmoY0K^3Hp>TW&Vw)GNl{`q!Q4KhP4b>0u8lpBZ zRaWwgc;Qc$<9kqboR0)9tOVhjcpmvXnn!?xU7A>Fcd**hsFV24Z^&_Qon+voW#Rd_ zDjqLNv%PwK<Fc%!Bm)AG*K}7oM{+@2`wl$tYn(%Jlfl@9UI7n&7h5aZ;U~bmZG_IS zciz>kJ<l(1lR5Mv38NehVWW&L`XaB7_%7qw5V@B4D~qs&bXNM&V<Nv%9_;6bXe}!t zAAW-Ml0N97jDz^IJ;{wy*>uCj&WNtEF|+c6z?Z%Scl{kjQ5P-@%;KBkCF!7qE02hU zI!S+g5f?#mkTVwLgxwQc$PWBRj+S;30c@urQ5@Fj33%_7DZD$MB5$J)vKZw4r|2=f z82mZ{rfYus21m(LC|LXyy9hyFML{}3ouox6Yk{wwU%VIJWM0Vo%Hf6hU-E`tz*}%9 z>=Y+p{+;?4;~{?{Qh=wQjfO)U*b@AHKcj~pu8-4G^d|fQZiJ73CSaElppWuC^PG~0 za8J|??tcMVsur~{^&-h5_lUgEzXaJEjTA$9RrHn})rT5SSVwtO6laR@kGF)LOP^*$ z@KAOF@R{v6NV94OX$@qEl029#N5j>n#Kb=9neP7HDpJs{))ltXmg`zMOEJ@AvB&W> zy;5e3^O>``@m-ls4w~NBvu*9vqR7e`cpdB#pk=#wFM%-dtCa|1;KJy;tbs~E+}jGc z!kxuynTIS_hN`W!3Q8PpMyi0--_{=)h45gqjWkyJqHxd|Bm?K&3|#a}vN7&Q<H$ig zRd(R>gaVdR2pH>~P#-$P?4fzUADm<+whkh<!!i=x0q(1V)W)sRAmHYgl;`okfbgxt z9ne4AjswXT)Jn#%_xfy4bI)2sMel)konR!Qv3MQx;RBIIIv@vpGh4jl-FOjnkHiD= zR}PoZB20InvX@UZ6i#u0U*N~(b3uX6Uxaif8&D@{$HmAqu@+eG1Ar@j2-an~Qe1p8 z{?Uq?I%;15r??60_Zyxh9l%+gA<mIoWEbko2=HIWNHegY7vjFik3^Fu$Rxh;X-FaO z2~lFy+oX)lk1Vtt^d$igg?M+2mR}7ZId~HGh{ocWG*Bfx6E8#OWjKahR^$Q=#0lWz zua_0%NZA3RrXKt-?}p-qmE|}7;jLLkeH+UqddZ`B8C?(APqutuEM}Ydzj7_?2IE9u zh*W#Zy~a4+Q10Y=*#_e@n}NPbUr}AW;0u|9J(UK2MpDH$c1xPbP>5J2qcQXh-K8vp z?C1t?Nxy=EVK%YiU1%(cqIdC7QW3CXjDM3RkU7`XN^8lq9%xVe(G6Lf|K?D=m+yHM z{(}!jVfdtY$aWd)jVt;PKsKO`1^eG3BTRnd%UC5j3^WV1Q7ZmUny6pZk!S|1AdbR{ zi9x&RN<3E<MRiFU*+|Vq6`xpVz8BpfdvOw<&J*!_TAobDg-CPYOPkdNN^i(3$IDtW z933|X8*9XKi6C~lD0c7!;Sg(3bJ7~J$`6pYR}@<T)r>X>a6sB{AKsNs<z++^n`+E5 zo*Fe6VFir0u*d8Hg~wPFN#bb(Wjl?8xK{G&?1EkgxEBRv16Z9&XgT<cU6B1uW+RyZ zUiJ#(A{wV0(k5y>RFA5ui8Kv8<SP2CmNzX`X42iT+Aqo}pjl}M>XwI`qC&W?_|Leg zPc%aKP}COx-5r;qEqsx2K{(|VTp42a3F0uIE{{k}T1pwDFq%MJ;D4h*?K6ZtM04;5 zdS7A6Sn?mKhE9XJq66%vRb?0477qYRFCyDQT)7o|-v`_Y{OU7MY7o#r6~H$ke))hF z0VbKByunw*QC30@l%2#bd=vPXEx1SA1|+B|FcnT4gA5%aiw5F{m?w)u4Wa~aSC*27 zGJ_2lJGm;Xpq)61ca!ndgF-|-PzEHUK*%|oD$#HU<M1%D0sKfP9w)zn5A=no`m#{@ zMDXhS*=2T-g@LD2SR28~85GP<vD1*No)uliZsui&*=1gYe-=ehGF~MX!pv*~%r*rO z+Sg<xjaOPJfwUK>J`&JEF$3btE9^7-D$0v~=rhrglg|c?k0B@Xo8C*_P~!|=Def7U zJ)1mN_519qROkjO@dO$~UyyWK1!lW3)<F?=k%yz->V5M}b5mtFt*msWA?Pvhf%cJq z;7T3%P<=XNNr|GX{?4;OPNFMOZm|{k$#rEVoSW<hOC1M0>RD2jE+?xYzJ5&F!5D;K z10N=3Vecud-l7-LG;s>zH3zKuP*MSXhDZ?0tKzy)NLO6Tu<-qV6-A(m@dH26OOy~b zc&0vzRRhJ;Hi%3o$vL=y%r+Jq*^pnmLGN<{Ev5PBCddLl0b*f>YS4Yu0OHQ}5ZP1_ z&3Jv;3?t<QFu3P)8%s7iiwcmTA2a1xY7u56gKlRiD4CK;k`_r1q9vfB!TcPXCpMvH zz<kaDY$<}BF|I-c)|Ia?#^F)qg#5uy8wMW*{$MdFOA<v9UPWoFH32K0gx4qw&_LW0 zcJkxK6+V)@2DEZ0rLF{hgc>4anL)4^uh#^`pq*SQ3W#jLHA0}p9bz%;4;@e~(oLOj z+Hc;jP6LMdW!6Z#aD6gX>t`yW<kv=-@}l?rGKu98o;S{4nYmm|7!~`C8E(b9jCB_u z<P(VF{AFu&9VeqTh@q{@CQG#Cu@<jfrS+8tbS4@O$nrK;TXce%DTKen&OvZHz;P;( zDR@7c%l5DpkjYLFCqVml8x_ZSA<O8_%W}paLPmqYbKGRnyf|b{CQ^ZxSE7|!bS^q4 zX7Om0g&)9(?qIjrK$J?_V6*7KHgkXBh3GgCBG_;=Q;tEiaRg{he(KAO0ibs)1$lpE zF$0c1;@^=}w$Xm5G|W*Vw2w(09Ih-gU7%2P@J#gjA*4)Hg2{QY#z->mi09}m?M0Y; z2i&FoqMVW7KEi5YE8RpJlir{zN<s&5s@TO#iiPO6@E4EdL_nx6;1r_^uMfL(f03J% zR71?s+B4!n;ba)`igNrO@_}707sPt^&_NQ8H;Bey<)NsS_#@vc<CUJI5cs3YT9y`u zOY!I6UGfQo|3VDU#Sz3p8lf-Zov;J0{|z$NkNlU|26#bPz$vWCCwv4{LW}4MWi=fE zxJX`FihAXJnCVb-Qry-P*+Wu@y5uah7VzP^cp9?E+hV4;CCZ90<iK{Ki<#hkOS6X} zljUV@{s_Os(?qxdn5j`;#PTkBWy39!=^fM%cE!JH&08o6<|jl}q+VnNRpw#&lQXdy z4**r$0omAC?0%+~<ZI<=F-$yx+_5q#fVzU7@{TwU+%!y1(?#^CT0q^5I?I#LUWgnZ zn#+!OHmQV;gDR>HWH$-yC<~M4L`m_SMX>+)Kt9ii;!~JSA7|(gk#0aup`})I5Pm9R zP(j>WtYjvB)7Z`W0gG&sSOw@rEkG`J<0YsJ@Z=}6I{Y}YVUuWV>;T<HXA(zesQc(d zF&a?Xi?oKCp(H}QTU;3nx+9n7Ru|GXO0fC^RT5303YL#%Le^ba)aKpgCQu5LmH9zs zx<GzJF=(vtvOz-Umsu`u2R-0Q?h+@7i&O;!_#DbDSBZ0gkRtpVO%+GvA8gR)q!($4 z#z`GH=uh=7G0+iQom{5R(NFPN*kzOi6$7lX`t&8fO?sGaX`?~IwhtMk9_lWeiF+)| zXwK@fey9ZO3dzuqaA30>^bY4OWI^0mb_c{MgzAu~?iGD;IpG#RU=6<&2iPy(myd#x z=`K&=dMHgF=B>v51xtL!Ci6w?wmgrDgJ;|b8q;YIF{Z*UN5Bu~r<-Xc%uGq*OB>_b zG8%B<S70YW=o07+lSC7A9PI+cXcRvQIbSd>Vv4k`HQ7uRVJ-d;-65kn3!2Qekj3^j zVJeNS?4c3CvJD&0!*bz9kjebb$}vt+W~(dYaIl`z_!YfG+lblpsCf=v%WuloI2W(V z6Lr<o+F8c!b}jHeV+%z%)C9hxUi1W}<S7Q#rbwd>B?4wW9<RV#VSMt^Dv&QOHVnNH zbD|X4gRf;%*b4Mb?PT&(s-PHgRod`pa)3_99mEH*k1z9F@@&%Udv<yTvvT|$FAMfr zklkSq*naMW==1=&hZ~~Jl8dwAqIgC+n2MS<l2w2vN>PffW1+AoJw?8-t|!PCzMAjk zuUSzMB@=iWzXkm|AboLlS{XMa6(OG=hFyRTrlEgmS5gxFl5W18ZxG3HH*dn?I5Vmn zF*-I>c2495U-u9+rPX0B>&xyuTr@_yxt%#sQpR{baY(o0ca}u$3fr7LTW0x=Gffbj zy=67%c)9}pqHXCZW08>q+Pn&YdxrB${4qDPG5RDvMeH)pv12ThL|DF?7OL}Ue|(%j z7aak`*)PtpS8@PUKRO}sFQOXkiFrWBTZvXD2LB59;z~eUT(Y>_B26e&CIcGUNW`;I zFxyRtN+zShq9^AZ@>k=Y_nUDPWzv;^<6lP&$xK>Y*#wA6ENGs;;8oxq%Kwcw_zuQ_ z9r&2V^QB4w?X*$|Zz6+~M&`bjrI;EYz4zG~lnuO)ah5x3EZ|mIoWkAA6tQw1iBzhC zUA~4m$RtOI>7psrzDm;TfK$ZKaZp((gZJ|J<PaS~>ti2Lfqycv=qCOcBfW#6c2u1H zR*utwph%1Z6r?|>p&#OLsGayF_b4g!zE}r51A~5~ckn2v;`9M!TvtAmH;`q(zr7<D z6_erxWo|jZC3hMK9RNS+McL>YXiZ)G8jKG?gHbgxgAYS}K?i#YQ0-X!HxiEpEGU4C zC3hg!SO`qm0%9{dL+>feX(K!geElR@78F3LTn=@Imhk<iaxx&lxo`}B#YW)^q&4~g zID{Xp(fP<vSw{-t;;1kwD8EA1yAu5i*pe@<1B&jBxF8Of9KTbFs-Sd|)!7lqci%$p zHcn>KMd~E8Lzx4;?E!mvK2VdNlTS%^wVdKdr>kzIlg!X_8FyJ58G|N(mbME?got#g z^pb2)kS35rWDHq@`{K9Qfv-RmJryFbOn!<F5}$Y#ber@gQ$=aeg8$7PPqQyjcT7Z= zWOGqST;-vBwCMjA3CD<RgRHGRpoz8c2Gmy0<ZVS&sEXvlKcPy9j2zuZkJd{W3HmQ% z5-`O|7<pJ<F`M~$8hdVf4|~(}e~nDGSAK#$ZWH*j5l}_z!qPnc0zoW!2auC2;s^Im z_#yU&0V4>M)fV8vJpdhWS<t2Z01NA;r$VOP2mAp%;{bS3P{9y~$yL$|qUyP%pW+~; z=wccR-Z2c%Msr0f)Q2j9_tQY_-dqw`*N4O$U_kYge&V3m2@3I{vIe}I?6F9ISTz&< zkY4nRY^7VsS9tb;AE-**5OZD@J8^TsfE}PMKBwg19b^_%m?{7own0WJ{nXQV6<Y+g z&;_CwUkUL*Wr&Q+fQGgeRP&C>7I?IA-JPHVKcBtCOVv2_Io(a`LOt%L?Cl+?zmkXO zW;~02R|72fwT`qUX^C5jH~Kmr#d836>m+)B*FQpf5DwA)H66*rG9Ogk=BP1f60ixL z0#<Ms&k_;*ENX>Ei@InG$wf2aE(gn0sFEN&i29R)$O=|?l;nqqv?C72*LfkpJr)=R zq53u$yjC5uiq1e(`pcJ~(my4##ah$|O$6`!-uzSjEf(<l5Sbi-y4VnS2EY@X2B_L{ zdW!5v%>jqsjjBV1tro37%ERbuP$!zoE{RrftxjSnAo77wXTOH-Lf_8G{=lQ@B}YM4 z23P{0Bgdnq(jk8GM|`2tL4U7T;L(3`IayCc^Vh~>{enK3g#(^30-~ksxCm64mdQ2n zRD(LOzitNgq#0(s4m|T=1${}Y;%0*K(tx{t1z%7@yn*;)FuDwxTp}P)vy9qao&Df@ z_zm6yufyxbX-{SMHFU@FOgja2f%CE@f1!N0PE-=bOgW#}$wXqORp|#(nN9=EcsVjh zmZd?k?xN9P@&%rEv6-g94p9duLFEcEdK#$?A)~}1k^pnD6SWpC_&}&+M9Qzg!N?<* z7+;KV-j~&73X_l(JOtdW1MUIVI}abCUsNkR5n#5qiJq6=MJg~ae3WDGtbvlCP2YyS z43vh(8@7_K<IVK~dKFgP2s4)J$?hZiA9M+JzT>PEFbNLeesZDA3)M1(6oJZPGQCV| zK?S^zd;<toB<p0f5%rNxPUGFhAV87^!VE?5$$ShqqY5$*cGWj5T71NRSXY)usivGV z{^ff#t2zkK_I1o(KhH~|vC21P60QZ6c?-ILYLg3Mf_DIS(Y$0Tnn0J*5RxVTC70+T z+zsN$RiNWMicjNx_&Mm0Ysn#W3sknc19Eu=Fv&&eE#Ja(pby`8Dq0KA&Uj0<ljo=- zt_CQ5d2|CmMTempKZ)c9H1<2}<{o&C#b9&+Mx`R`zFp8kz*O>}PAE=HLFXZYs{qeY zG07$3KX{_aEHMe5Ly#jvL}yV7qM`s%-H0-d8D<v8=0N>zDjEVA)L^-nQNZ)sKpxyq z{iR&RW5r;8TW)|SIpjkdNf(@jThSOa9J04a`H)SJ+kih%2=4**(QQ6g5NQ=eoDvl! z6pjJe?utsHj*35BEB*0qz;w>a$DrmJ4>-bqFeZ_J1U>-|T0vA1El?)tqSt}a-iD`( zg0i590^httCc(2O1PZ~AWl`xTTcQboAGRYGs0&yK!(<`R0iG7}Ox}UZZN`4U;FtlH zz5_T#E$Bw&2VF>K%Zl(!iT{tIvjC4HN20K#o*CP5m>D<BoDDN`Hq6Y-Ob#<Mb2iM( z%(P)<W;^ywOS<3p-M4qQiJ?a=RlR!eRcV9yZv5t;SZq$XW%SxWlE7xY%FU=Vp)e&D z6JUJv!D*H<gX}VKoVu-?e6PL<7cFkJ+$Ja4EU16|iGy3kZ8b^7Wk*Mv>ITcY>CJ4E zHYSw*|Kzfc9jyDgwTQEY#00TZ_M}puX1D9bCV}0m*V+xT2Qw@lqCl2o4$FNr+0CxI z*=}fn#d(vfh%!syXI?XZ;iMerG>4^2s;(+43*mjagHz`|v7v|VWq#{f=7^b!Q*yX0 zrkcwIFtIIhU7RpSq*ej^$7z@bk_6RgDY*ZqP08#RKhBn=Za|+S@|Wj#57#42K)i!P z8!5ufVYfSMVIpd<HukZupqrYa_!vf@Tb$NS#9C3#CI(BkvoooHs!;i@7ltmGl%V-F z=(|kHabuW`HjJng?3ts&sAu1)#G*6qCE-b=Ug^pKpBrUTh}d?r8Wh~k*HQ*6>AB<7 zQ(;umr<^OQCnqDDstRN3(EGc@v&)&Q_LIBnqWhdyuhk&@;N5VO3>Hzkt3Kl9chj41 z%%Ew3b7Y4aFDv2c$xXeJSS9w<^ZK0T_+~q!75ecn{brU+CsD@c3uMr<?GLw-`@%Gq zWlVkl#Hcdve$&_#F%Ovaa!Xe<qx2(c|9$4GYV5t?6oTJ-rrU|rCZ^j1FUA=>9br0q zpx&RQcxy+PoTyN}qG!z5=J2sQnE{baO?J{Sg<(6K+XZ_GH6xT&?WND?Kc=4^t6$4f zPB&4{%-8eXvu=G9peekYmtde<{4>l+2OAs8zO6-+SfbXcgrc@7Erznk`!G#rF*xj$ zOeTLYwPylv^%R+TE3S~KOh2gvPU&ynx$~JGQBYR2nN5A2-n?U8#a2;`HHu;`%zQJ* z9p<Lh1vuknWC=MyyaoTY#)+0)3%h}tL4t`Tm*Ei>i@D}BwZ}R!8?MY}KIpz~26v)% zY<c6;lXPD5h506P?7!lJdL~c6TkUq!@~Kkm?fjfu(Zi}lHU4%4zMI<Uj3fAoY3*Bk z67NhY_|6~dE8PEQQwEM?4WBKQj3-~qcIrQ|0B-)2j&C}dYUZ&yjG8$|JQ9cS<*k83 zFC|mS<LH#FWd^l~Gq({9u&0`!x}q&~iRLhLQj>w||COADzA_y?GmY)1cezjXUfWWJ z;(A$Vj*>SgnnUgnw};4~W~$GspVMDmHxtZG`;5=?#2K&h$U^eI%qrV}1*e0G3c|n_ z0zHmZ75TG+Zj`PrhN!#pDab5H^fhCtT;u83Adr02!0E}dv(bu6>NcFSCblz^K$5Fx zB2r9}%R~h@n|hvL-vwV?Z#E}BtdjIJ_MRcyu7NdgECw>Y=bm{>-C7%8MN4+%Z}*+P zXRlL-d@-SD$dPy-vY8+54y{dlK1)^hY<f6{3U)J$aB<sFk9F6({XmN++?h5L==%~Y zx>x)36t@IZr{<tPK0*s#DZ}kX+zQEwzj@?s8KRoPi^a8n%wqPEpGt6!tSS@Ot0ocN zid6O=Q^ICt!pc-nXHQn<vt)K}1j@oT?Un}SYKXH&WtWxg4K>ztPvyX|KfsAp;V4GO zJe!^Ip5eZKya%1kPC!1j1;jRIxM!2f46pr$c+_97aL>3SiIt0VGILG8cK->S@RxQw z<9x^<4(kkPZm-!pZ)_5D+56F};2zd@!E3E_S(8`y3v>!ZMO|m&!~oruI`@3k<;Z<e zIU{56CvyYa-5h2hdr+xSaD5xid|QhdL&?$9>)@VF?d*3hF=xv~SC2uB5-bX+MZA~Q zYJ~h@yP6y}Qf_i?sR)|~KItZ`%^Kd(-)fI~tjaqB@FyHqc{~HXO}!;ObyW{1sb`v+ zs{U~<$Q>eFN?Fa`VJ6E`W|}M%^{Hk9@}KB+=LsUkY}HBqg2()%KZ$A1W_Yp|qML}P z3d>>gka{X#k(Y{!Gcui!rj$;rUk5$~E(QM5>-1VTHK)I>JOr1R*sjt2?0)mp?N63F zA+D*pP7!=kCEW(Zo{RngQHk6lZr{ikkyDu!G(zHM;T@lLyZMLuyV=+FLZD1wdO*07 z1G#iJ6E1IhzI*RGIYbk))<*N@y*&p!JioJ5X?a(5VeZg0^H!t+SsjKmY=e9Cy`1aG z;GN>l>YL8kxafFYLDWKj+M*_*HwAD`<%6F}$7HI^0^UTYwq?M?xy^D`_obMGa*+*3 z;Z>B#zUBt}>xaP7Kofnz6ebSFu~n$RuIhw%Y>x!?yGQk1w7;hCXvTDb_ws||BJ2$_ z$9)yp?dEZB2KohZxhGVP&{)1m@Iik4U!Wb&+r-W?4%N{HwE_flfisetYCgXXLg`UB z$sbS=)c}+15?w@d91l6ENMoR1tx^k^UUWjH6|GDa=H+Ci`fGreH<MggPkxfunY;8| z?Ni_J0jyxo*(s*}bccWTIW>t<P32ozL<u|;dDR-{GugTUr?<TQ+raMd`zG6hb}7hW z0~5iPqhigL1-)f_rGnB2ee&fD`Y$+3&?3(TPcz?rZ#wT}r<9yx&eQ$mF}qBBu-R%Y z*%N1?CjO}(*~YH}@$_^-PY?{#ee*PM(cNx7>8E}fxi8%P{q4uM?{B_O`?~w{!O!)- zpZuBfcjE99^bo|1JQmSB>W%i<LNJ1FoUuXIL#l*!2^kRlGqg`=i;&pC>w*M-aw8;h z(9fV)!FPP;ybFDKe0{vHyk9(n(Q<R!UV+L{8KRQ-TLtd;`$diOuk)vmY8mB^`VmNH z|CV!{G2Rj0Sl+eXP+x04*;3!|ppwCPLp;8RaxiLWD_zvxLsW~Qo{DwUaQAE%+}+9a zUAzq?MNfGit+=dsMqPQ%?6RX}QO_Ljay3X)6wQd0;o^aMsd~$FAeMdRwJsfK?WPOR zjpJ5=<tYU2cpzpG(el`UJ6(s{nM`AuOU3(`d0Jb+i+gktG_EepeLG<b!hoFv7eza^ z)|<#c*T5{QfWM4%uh|JAxjllLtdY)Y8_B=LSSAKe6OD=4)5K;tOD`Q3oo$5K3iB4% zwng(ksVBpi6woF0c6f%t<ffDQmyU%36vEuAq0D%zE8jR5)maf&enCU3<b1;2mR?m+ z9aSf19Ve}<%HaG|Pt|S}o3;5)l%6Ht@QlM4+~~K>?F}l>aq<LipisVME*io#(7+K; z=5kS&9A5<WwvA|`-Z(HiR6tQ+sf22{*u)O62s&DCtDAr1C8xApXf~VrI7jL*XD&0p z-^cW=s&=iZs}BWg;ixPj>dP!>)`RR}R|it*Z+Zc$-D;Z@4@Q3G1unB6%|zDlg9)<7 zz|a@$O=_YpI0Pz#wU4>OY$d$>**x9UEB1a){R`eZzl(C~*(dYJfpU*Yr@P>axd|Kc zJxT`_l5@_AanblmrFLSe8E7}7QLsPAqWGLQi)DC+X4(Y!)mAcbuZeshJkm$CeA&#l zwZN<c>`!pOad2>1W&+;9dGZ2x;cQOqFc8lX(+Z7Jp-(4b{>MmMROjV78L;s|H;t(~ zu2KWuhYyd=KLv25?BVw<WsTdC6LR1*A0pyV-*4op`q+VTCZ3{pFw?zpdn|$JY6{}K zYM<I%whytazZ(}X+)|y5cOOL5Z>L(Q{Ib7oPt{e2>M652A>)F2rio(mC%SVkIYBjc zTFEQ!h(M%Umnm^u>{&8na%PL|us!S|CfvoLYh^GwBviDp*U8GE_8>@LzvzJ?b&V)= zL`<PpJ175xf3axEOQ>{G$P22wdTN%rJ>2Sn9{v;lfqE;5;GSE{zZTEQ3I7b8jH!<Y zL?ZRCIs>9^BXCstdO2}yS^J4j!&)HlT0wbZhs8|gohklxZ<zI78FNCc=f2LSZsaq6 zc0Dg}jqH>Oez8ncMELlKJN{n!vp-%`1^-{@Qnkqlu{~EkGo84yBDf%{lLr@AX&i`u zbZ`9+3VU+1ALLP&-5Hx4-`Gx4<%!n)q|ZsM8Vf0hI{m4KhLI&sPzi0)mEA?I*4<I6 zt-qsQV5gewXcWVl#Q0d$rFVtCa;km7yKe?J5+ClnmYFZY@M-);<p_vsayV}3vAmT< zu(%x<__f!Q(P?C>y93=3Fp*hccP`4>!t$BQqU`rZ%iM<dJiqfWXqhvWo{lkYby44W ziZa*IEcOe3b6d@u+4);n4P>xqJWrjh;<3MdV4P_0T=uT;7E!6qx4=p_La(-Kom!sv z>X5w2+p29|1~LYkx{Hi!+sX8J3GSQe`llOel8G=`6C|*aH!~8yyp&e<gt;CE^Lw86 zdXH*oD~#(Y6F@VIBOS5K6flxAksZA_9=U#^-DPIt@totv(;4B7XW|^atIxQ<^<%xk zJsZgFTD=5UZ)(pMZ*_GQKdO&<GP6G5jg@d?%y!Wy90yM>XIjW`*)dR9{uh+qDdrbZ z-~5O4OLw`O2%J8Z^Rdg`b^GfNGKceBtyF(`?m7F_5U01Vr1u0F5uD`NrtVATN8#R& zlnK1`JaffQn9FXsOBR8~`iPEjT36|k%j+*ifA0f-vZ$g_b^W*ejr?aLYey=&v*X|~ z%@X((7^d-Bs0imHT-#aakY|avp7)j$=}G2$<69r}A!stXRVh^AjPjFdW1heh1QY4b zuwU}h)zUK%;vS?@A7a)M&7Zli+?v!jTj&tEXg8X*{%ql8f4zu|uLi`L9J7JB|Le!E z-~QBaTP2*)-ebOZF&@P08z)&%m`vvH7BMhto_AQx;Gkq?ooV63P<hRoKc#<<|J5}r zhi6^rqo4}5zFiz>8CBOz@wNz#?;A;%;PM!;LQ6S?bXEUq|6a4qyD3KI5IU~h9e)}{ z4MSP1K}Wy}*~0O9caS$-GbCz!psi@>jFo<rl-}^b$#oN0-3dAieI5l&ML4WyVh26n zKXEE=&|d?km>c+2Rds5!!?c_vZ&EjvkWr$79cd?tR?IE^Cg+0<zXYVeqrWO@dM@*~ zDQGu<D~3=X6(=_o!!`KCrZhEm5!UK}IYZCyI%huT@E^T5@H3!n1r&p%xM7>iHelz9 z;;61+wu`jtKh@Fc;Kad8F$+x~mg#F|n65<Y=Ax!Ot_}G!iCwQ#>9V>IeKa4al-k;M z=phABO8T0$Wc8&csl9E>pyke$dsI)=RYj?~cv&7$UEO6GVRtluG4KPAVU*t49-N*; zf&X+N=4h4|o8feNi+$oE^|HjdZeWw{xx>-8*7A(m!Pn{J2)h$M(^~NPN;T8Dp{A0l z!fY(@O(e%V={hl;dAL1m;k1cOUMt9Vjb{$;HoM2(#qa$R*L)8+nJ0FO9RP=QMP|p* z7=bgnEo|IZ``u(ES9!!ns_BO)kn@<&*&a6M26{@E+{-N5L9n{jVUM=6<A0i4CO*HV zlzGVR?xLsY4tj=ZN#*+=wc;*WO_f$rVi+s^gLAS%rleD*jT!<MbI%SU&ZV?pK<y2w zYgUpSg6&zn-jhvnlNujSTl^lG$%XgW+pSG?oaO=axl#1IWRVrnQH#hM_#|(mByA93 zV1+97jJ$$V@&K&<Qy9Dswk}<9E5Q4AO+MBw1>D1V{7s3O{TsthA*x+-X38b<KF+|I zxX|Yjt8>B+FT?HDp8m!}py_wikzQhLU6DZkC0%9=_cE37YAxp{y#g;3XR>e(T$SmV zsq%>lz6F`-S{o0|R+*YeUz!Zt9X6njS)zmZlvQn2YP4}YPZ3sl7Cy8=_NKW(#Cyi) zs0~N(m9IDCfxbGektTXB>1MKjSNk51as*8I7jxe%$CDERYw}E{b9&P8krl);SPUUo z)J9bpjlVh`Z@;D9tCyH=CM^>_TZ2S;;GJitvN#WGP#T804rr~ESj}$@<?Xz)=j>OQ z)#4(VYQ=ebgFZ3~USosZk1zhSTf_7c#hoMc`#obvx0Z*QM_h}Y9~19M9MDA({Je{C z#S~Y0oRieuKVj;-;wv1&3Eu-pI#3tX0o~sWX2vZYI{KK~M6c$wfQ@js#AUK<bC5|2 zQHj%DfuC{Fnc->WoTUmaE>g(nsA$XVUU?lnbj>#4v`sWan3(;5x_+BU0@9jHx4;Tr ziaE8jz_si6jXBWTP+8#qT$@WCrD~dF3)02anCZ3E#1WL#8|H$&0wymkJEP6FG)1Xz ze&G9`#>`=#$i}qVnDU<HQ_*u>(QOoU+`rB}E1v{k@Lj<d(<Cs`KgB(v*U3M=a^5c{ z2byn>Kv8!gXzZj-j~{2B+|L`y4Py<~k?Fy+8_+!m;?K*<3U3y<h#N;xod;75PBzD> z5_jS@+r`RdB&%l?h3rXGvNC3;?uc?d31{XDQP`=C5BNTn<8_dFcDvm8OmbtGzgtcY zk<F=H`><xM>@;>=L4Nae+;3%>y#12%wwPTu3C1Na&WuX*3A6!`hRZf;Aqr+<I=eoA zwrA3L+0)YzMsG3PSVQ&L+se0C4P~vniI_522E-P5O+9qpi^cZ6Xb37zBA$?a;+mfN zw3}ZmeN^8;J?%@c$6ZiBMzh5%fZZGiuNDgitp+MmA#;Jwmv9+Qgn7X(y2QVy!w2_= zb6rrr0?RL9GIo2sq3y*qdz-xWm$+aCq5*v6v{hl6_XaBOH6k{C+h+KL9*b0-rfRrZ zOJy?99+iV+EFxzZYH<de*liW)Y748?xT%(^n|6hJ%QOSsK9tp+OY$yXxeWJDJ9i8^ z!b+POMSZDhBKL!78{n&`NMzj&L-WEEmmXBOBXSQ&W~?ZSpL;$m`%lvs4{-^bTPAhx zvHF*t=swS1rlP1P(u+$rqfMlyqMFphHUG%%=AO3+J^j2#aZ3KCA7{K-;VuZAa+wD% zV}t6J$UC+iZ?(5=Ey_CEo%E`b?F;VNfPxq-?t|qVC%yArCSyu@E-?<4t~kAWE#xkG zR6WrXhvAH$@wOe_vJo#-0q2fWP=!-hmcpmy)$|0&tLBFu%vXGHrH+AjrGy;|v%Y~7 zPzqmlGm%=HfroC1C-o>^!@O#d7|E>cdUUtV^kfj3bV`*!=pIgG$9-tl5tSz5=8RIK zRBV}1zcg1x0&@jUB3y6vw+y7FGpH+7;~jStb!b0werxw=<n=#Mer4|AI||b|oL^2? z_@6~Yw29(CV4QzG(>FIb^<-1_R5<&;G3T)>aU-@|VV{Dnv*;{QH{GjnfYb3W9n@3A zYAyz78CZlXs)g*N=E_8>rdY4D+bc4N+BD4cp*O51&iZ8*exAP0<v6sXr%wMC4N>$` z<MMhGJtLa4_**9o910|~Gi6>F{o``0UFz1?lZ2NZ(V^brzRxNSC}bs5-ixc&PA8|j zd@nz%xb#J2C6eZ#_9!8L<D*S0;yC%7t7MRou;x!#<-7KPO{_l2fuQ+z)V~E$G;X>d za1KADwpwAQ!GvAFzqAdmcnvPhv1%8QDO3y#9E_Sy7R}}^U<Pm-<*Ih7oMTl}vD(cB zw(RMez%JKoM>*3yCFEPQajgsDjvHu4S>gO~e%p?CS#w4eh`MgJ!A%Us$(b%tJW~3P z`Rn@A1lmxwj-*3ryDq9T%iPW`Q5kkqGkt#sU2f$?Rn~mCxecqhP^?Bt_@(396YhaP z8NJ!obb8?L>jI9?WL}%yBCeBFt&@Y)GpC(;ZA<AQCel22+sJ9QY|v|81#h@WVLYD7 zYK-aUObPP%B7-LQvie2_O$<uo>%j!yOTIEeZ#~_-PlHl>A9;3qUj)OGI7vL;(Wd6W z%pZ|$eUm~$L&gR54muJPa4L(2uvhV&#m*$$4>eRG;^|mvRTi8CT}=hvW^6Z3V0R!N zT67QDL$}3kw>5Abj691PxwQ7^xy+MqO%94;lDn((*km{+r`V;Yh+Z9d=sp60IQY57 z*n)ai<eR8_I<b98tX*qHi0kky-SE*IR&PW+n@ykdKaU(1733~-cfrgZ3+#o>>S}tK zKvbvj5)qU9ne=sdjHV*kR0@=c${HCP|KCX>>SUZ0|A4WE=*5ABOkj?R>>U{3sz3t& zadx8XKO8s}$g7j`GxNe*By^Vt-UOZo9=K!C1?TCdAc01zvAjli$}O1W6lm*~8h*WD z&b;;EI2)&iC?%Itb*-Z>vmPFjDr%7@vFD`cjrRtQ?M<E<UdN|`jJK5ck}{|f{k`Xd z8VCRKRq{l5s(Tj54)A+>y(@zA1UK~6a8BB$`ie>DO!Ut2ZpT{_lO6d@Wp_TS4o*DB z#~avhvr-dJvN>TMYRd=o^~9A!Y*yV0r*5b!=Xu2`XhW~zZ`=b(;Sk!hYnPf)<|^6k z9$mf<@V6&}4`|4_U&-DJHL=~={-aS%{JY#8c=^jPlfIaHHR?rFZT}uOF0SLoI>N2u zPGY)L3v{EAuwPl_Q&kE@Vt{6f9`5o|^w!0oa?DG&$Pm+(PqZDap{DuGT!ozYu$JJn zX$OMx+SFzlPP_Fmwuf=hRD;KU2zttc({Ps_h%>LJ>h4(^bSAjGw>OUNOy-q)6y0PC z_Y{=CxptLFM$46vBk3m(!+S7H3^n=839D3lwDRI0+@rD!GhLR;YAAoHaIrZmH)!l1 zP~RT8+p_`Z#R?EtcUzgB*8}#OX$xmNSbU;GVn-lGpqNfW-&iCbRUZm}X}bo*Jly6Z zi*JT4d%%p#2z7&%eZwr6r_6o30@IU3omI)4+;r|1A*z>m5;>RDMcGBHf??~8)4wt` z$0bnX9Qqz3P?JCNc_U?in7GF{5VFa5PG0Y7Pg%M+K6yHNE07aTkfWc-CY}r4r=G8# zuHHu|0^9MT45g23s6DNI%0j%A%2Z^9@q%vP)`>8BHoK|;azb=Z1zyz!_}`|APii!s z_;H!`Fp|1z8?|5w^TcMB?RYy~MR!ryd<k^)@AE4%RR#W}ES`WArXh1UV*7`?z06lV zOV`mOVJa8-n-dAsqhejuIZSDDLC+*o<#AWKk6oW`Nhh<gi%b-^4K%?|kP}RJ8pUK` zU~*tI^O(ER)A$c6-*<Ic<Z%<b+e}ONxQXy(9i0@;UGo1d@kf3Kt-Ked)Jmt7Du-LC zIPTEoo-UpiPD2!ie8jaLp8P&<&~#rbm4PnNy6|ernQT(Rsp}L6x2B+iSTEM$h<L^v zhD9=wEG`y_#4?K<!pwj*GB5t#%xI;haF=xu%c*o{$}rUt1peKe)1~OS&1E{XzSpQ| z8{5OGD11dbW)%d}+1H7hsG+!s((qZ|vR^<a@4(R$a1Y-yGpLf!`#ph0fl+QA*aQo@ z4VXplz`z3IWm-fO_l2AT9sc30bt6;1WupB_^5P)sjM}Cp&c(7g08*K$_=B>6p{Ls8 zAhEh8qpfa3IRUF!xk1rYFy5V7XiM+uh-^W(a}sXg$Y2i9Lw-^`h7Z^;-V;eTnX1&I zUHHTsRY&eqX@@i58}7n2)KZgV8Yh|4fiBxhq8EK1b6BZaDj#a*1}eO>)H`!=NligP zJ|v%r7w%}2S6tKA13{=Hll5)-HKtLcOoaLSn={_n#Ksf4mVV7LvalUsk{NpUIH?(^ z?P8$y<zb(VA`0ZwA8_{Om3Q!4A7G}#3ijs>UBQ&co%)T~QIBUX#VI*L7szAWa<ln4 zPw_Y$6x;EcrNM8v1y@sUJc@ZlPj2L?Zx7)?D2uv&+Rg&){%f<*!MO%sdKN0`MbxR! zsYHj<0o>Cz##1qZ^*JE$cR5*9R+$tXvyw`o#&Q==b-MUmb&E{1fjT}5-K}Rt66)?{ zsOJf+pZEBUJ2u+jjqZ-hc7PamRAg5RL@ztvo}uC!3ws>O*DCpeJ%1Oa;WR$bedu<- zQKjqg=Z~4<lUf{*mtjU%sutoed<UVnshJ`6<5Jlpi`x*h2o||0(QgvnJF{dSXPByn zW*@|Qw55Mx1w8pH(Nqm}&e8K8B755)x?C5SV%9+?=qo<j;iiQCN-q=hRp=g$p)#t; zA||`I0=3sge*Sl2+I`!InNW}E=%~l(y`v|Z!zL~@PkU<Kt0wv`nY;A6UDIjly_rUr z$X7a$Gr>Yc-x4$!HQ*v%ooP6C^0C{ViRq@lJHgGxN#BMF|I&2ehMV!!xkt<cbJNzB zkKi6=h`(ff)b5og1qk*DJiGxtM#z6bclW3)4zmj9(ZLVkdV5SIqv$kF!LHlR-;888 z4iaNc8QYsq&+KA-bmuN=>NnWX-Q=`gRCjynuDii!ea(tL5}RRO578<3&H3At(-}oC zTPINfUG%tIq&!U0O6_^=$*9&-_YIN1J&(P!oY+okdV;g?lLo8B<kz*%9<>RMp(UK~ zI@Q!O&UwPA@4;NA$LfeP*;~-lNBxHq@zk!OGWtWMSH{eyi*Py>-BY|9XJHImxwG+I z?y<*gd)D$OvlL>m&%2ve?u$Ujzzcu3Kx(G8Wi*+{)$_@M<pMR)D`)8U#O4D!ul)$~ z(LYcsYK(t9-rU-_TEB|4W|)6uV24{-`}GY@OhwMmBlnfxMkR_`^XJ!}Pf=^!vBcs> zx)pxlA^tK^I%-KEIlO6mGledo^rAFxxH4SAWjOwsREh~vSx3?hagb^)r)mO=vOzud z-1W9_6617wPTbB%FWnfEUT<*+;V#~(ui-;VO_lx3EoCGMQFG5&?{DW8QQ6}u<T<78 zbEni1C#C0-s*PK_EPl??-0TzE3G$ZmoT3gph}Z2qJqsy4i`7`!3FkxrMV1q0W2zzO z_x<EzXD9CIyD|ujGaa?{uyd2ho{)d?JK1qr3*3Xf)f`n!J*NjWA^-gpE%+23rXFGo zr*Z~vkx4K<i8w1Oi5kK1X2noSW{5`ix$vqYumk}*A}gt(c=}3H1&?GROMdC%DRXgF z&O-;ejyvuTF=j7{TpzQFbD9vmH<etGjwm=;mlacu*B&!}^nDzsiRmdmtuq-9y%9&` z8LG;O)Yu8lGNx(t<EErRC^W<9FfPqCXbIij-23y2wLhsP4ErP4m4T>zW$8r-VwR4N zuD^?Rz8MVHl@_k6ow>u?nnssw61){>?E!gGM8Hkm=fw4+hcn!G@t!<||J-Y8>4N5k zc}Gvo1giE+I+s|l%F^Ezg%>9a`dm(NSB#apWfTf$9L`lX*;9s!Lt+=#vZY{u#aDY! z1pBBh^uf=g&$k8K-Ch2)3tZ|S_?!3KC2^LW7@K?-4-T^dH8iXM5ihaWs$j6FV;|XG zoYDqVV;k%^c^x-(S@h4&Fa-~76I)(9S8bd|&iDUMAPP~5;Zb(WSaJ;g4vEY!x0HUZ zbF->z;3ZS(VdeolyeB!28<22|9wc@@v9IX*uELp31F~M=Y`_Ioi?yjn#{Y~mFh^9v z|Cig|(mw)20u9_%_}~)j+I-s7aun?DSd{zGe1>{-Jf6bux)PikAz#q%l^u3Nn$2zj zm%e)5#}Ih#7WfWs!WYK3^=up5v+-EPR(KaDFny;03{HOfVcyX1m{#2rW5`H3>HZM( zZtcWzUY;|24-66m#H(yElSgNU6Zi~ww+lV;JS^%+Sy_I8k&dpVYshcl%CG#^Fw@JX zhg(R%nq*@Yo6=+2k(Ey<E}>Pf<0O0W8)suLzMxC_6gQx?C1X7YKg>6`h*`z(&Q&*~ z@!*}X@5~rHJH<>trVMSiE8XhuWnJ0cfwg!ACY^wvYyeJ#9Ypl@Fep3Nttr4Kzr<k> z(>k?RX1D*Lct3@e-$D0W5!^ei<VDWJQn>e8c7biizS?K5G9ls&QNJ5El5L|V`6@2) zd8)(fePS;pkX7KaN~yJSGEq4-cQN$>9fqPuC1SEiapALraETo@e=#Rw0^IE*bB;d9 z49u=t#!Y<<Im7wrCdmLt812zBVuXk#@1fCcMU{SulCJG7o@*6Zasbh5850{;+g7+~ z^HbSOW9rE)`^8j*<=p@_NZ<_f3E9|RR}A*7a!c#|p0vIxWYVqpYDeLU>SJFUugc|Y zmv^<_ti@qEOisg#k&2(22V^jd47GtOvN3#e9Z=g;JXi~Ge&06}0z3Sv%tt#;zYL7k zI8D*&4xqLM;V1a&2J2VwYL!KNS(lhs7Deu+_yQNWRaT<c>?=x49p1%5p5P$+Hx@pX z+Dt|axV?3CxP|)013RtsA~5J{DxCtH+!@@3_K3LmH;Q!~B80VDiJ7xyNtuD4F;L_Z z-Erx6Wd9t8iy6p{ad^LQ3jFK}yybKzE&o};p2=vQ5#hdY3tK!Q=yZ8Pg*uJ!t2Lx! zuK`GT5ckpj=A^7aoyvuyYB7F<DK;5vbCPJ7H+nt^y3TgBlSw}{=)^t>o7n_Ce;$$S z0Q0tT6K4g8=?Rs`SNFQj>S^xF71Y;P$!Si+Pma@RK5SA~na6w7Th}`*=yULxkUX(R z$9^6oU5pVilE+99QYNHD%(XGk#`+m+NX+ITzrFFOqDurV4!Rn&$Y-4M@TVil`j6<< zU4r87==^4|TRJc;P$!VZAL&+7tKngum}tZ69yg~uFe;({roZf;(SO3Cy15Hs4?0CA zj_Arv;7mWh{LB-cIXv)r@Q<<n?h%iEPWX}PN0P6-zpneSEn;3|m53|9Vn)>emErrM zA9H_q{&O;-Pei@&nLii&I``*v`0-y`et+`cGlTsnez*G*9@)ts99}Fur@LJj_D4is zcdNnyWsU3+u`P0?Ke29vW_>O2IwIotI=>QeIKvCnZBK7*YRhPk(rK}Yc{X0TPu=&# z_8xH3!hdFQI(U-@&kb4`@`c-Q(gdH1@hvno#;TABF)qcd7@8uaXi&G1Ng-h&6GGa= zcpkDKC{FOB;MzgCgRjNd7CJxVPEaA=Lr+{^H{UX6gJ)1sA@3&7U$}K%daiJOu5!y= zdT$Z$kYFdq0PkqDjkK}?vpiO+2A*raAa5nlTE{XaWHIM(l=w%s#a%wZTh-Id<}me` zYa9noydSQqrtoQSfq{+sC|XDud!V`A5mhNNyZ(dMa}6CeGvr7e6?NKuCvU0$+%{2J zqjI@D)G=o*n2kAW@{}&DC*i{DPH%{Ht4Gdr$El~dBk$Xi=33;V$N_=cqN%sNCpH?3 zg_BMwe{r*4PU^%K@~b;N>WSN)sX*<V7S2{1;(jv6ne9^A{EOl(^)LTL-4~Y?m{?3l zsmz9-r=O_lx#5{>)9bb71;}w7NOZO{+BeKw!-?(r?VS!wH<>=pl1%M;FO~<IiAzD- zd`ER{e<Cx}+dinXC!f13>XE(+6E;;1pxb++Q&XK}#?=tnU1fneXinXw+<6hRqTZT@ zx@TZ*U<f{sN`ZWw=Iqo>bKK+ZQd~w`Z7uhrze*s1`Ax6YC2-CK92-mZMfW)D-Zps5 zFWgl*4sYvQ(;a?ro+zWzc_w)KdLF6G#De8GFA7mdC*bSa@k#zeH{GMl2(9MPJus0z zi7>KrA(5N<W0~{WbKA4Zli$0ZSxV1P!{2+t@a<*rCh}APrTIJ!@nObd=1V@`AZDKU zoPp|z+(0F^3V+aIPjOFbr;l@&Nlp7a^E|K7)w6kmoLAJsk<6ochBorh4uNs2!kgPo z$6<Cj`WLus`@2uv68f9F6Q9#pcZx0tKRytCxC!p_d%6+5cZaohi_y*W!=3IXMc>HA zq@~~PZGWD?Y-YfmWUj?&y84Als;}VtDiIhJb%9AG2Si-l?+f|vCd^r_igQ0JeG(@? zDFel8s`d$R5l7HTwMlO;kTE0OK1})fY)_D#({W?$Nt1@Y`0;iLJb8R-#px&_^_Y%P z-wp*?HJ6F(a(ZTB!znJaL-6PQgHzj&E2ka#y$Ev@u7doIQ*}3Gw$>Kj-&T~+eKx+V zY14x|Uf@UCi*ho^t>6xY2Z#+4{TH>4c_a3Xaf$8YQS0_F=OLX8r*HEg69Kl*1cIoe z$Jk={Irr-%atAr%r<i1Vnt6Djo7;2ZBlZ7Ya^EyqjI3sj{)YBeoPAJ^Y_^LI(dpbJ zx`I#jlz9nS_Eka7S9x6gAyXefgD=knpy5pQXd>^yXT^{;KtLVnfJzS<Pli4>hR>{U zHZEa4Xb`bJ7^X;o!814y>1p~+6}DYO$&<{03ilrI_V*~y1E(7EPR@xuYKvOLMA&;M zSkKXZGr>%cbbB(}cD-(oZnzLEc}1VspYd}D7~KnYCwSuzZ|0Ev3r24n{7WTz$;Z*> zkk}cB-*O>emlg;5TRRFw))9Q22^M51K9WZIMIecLEATPU&aI|5nbA~Sk=B4C4uH__ z^WSYz=F^j_v*FD<X-4sH3BYq9c0KbRw~-N#nNH;8d2lnQ(F@nZbd3kef8?1KOCLI2 zKkA2%c()&#qvY<2><kOqH+Tdl8VAmY&JgmpU{`J9EnlDx*@9X(0|Y&RcmII=T%DTe zm|cp|JtZ!Kb>OXJOyXEb?fZqwyaQ-LagT0q_==4%|Fg+tL(#fY!sJv1JD*0w$b#pU zSp>{}SjjV`<@^8RYoDQLHwC$t;O8EP4{CxwRY@HI-|l1&FyWT2_;~ErUh=Fc36@U) z7ja$g!ONe@dT`Q*$Q*JhnX@^4eD|1i7Dj*Q0#NCD-cfpUQWfxZRq>e;)z}GjPJrGr zP-*m$TdAVEI%VY%lLx>0NA5UXhnH#&uBQ!55~!e$z*)~{I+O$Iu;@J3O%y(eP2i9s zyvP0^B9|x03^%q4Uu6cm+HP{jVuSbNat0Q$4q0HPXX?dfDXhO?pVUJ+s3W^D<@2LE z5Colq7*|>z0*(JoB*)t+`%z&Oh4X!A`hcQ#a!NOtYk2z3fJUdFniqq6QMg*JvZEyI z*EIYcv(Pu=!U#@<`&l9HqpkiF(^1z`&@rxXlT2nc>+zn_bE9!|FU({(@&ll_iSiHg z9}TxLYj}*gu)a}njaR67I?6Ltv#<E>6kw#9eBUH$$oSE-9oSjZaDWttYmSG;+8<nd zhMRbIQ~%8u_vykY1cQ8Abe3^&$V_5BN)~yHiJ0p|OL2l4{Tvm|He5p+@x{avb45Yi z7R${h>cHA|A8gnnvTFy}`cK9~r^jKO(|=Rbe#Q;fT(*;;sxuQGR)NB+$x&1vwXD_L z$VnY@S6^m|Y<78w7`YQ%`&ciB!<mSKWG}bo=0XWf&zbyW$K%Qw3O|0B>^zEU^(n4Z z$JV404B@Pm!8_%k#MNb1+j_MDkMCNZ^@fcn`^vGL+?m`MT-!{i3wk(gbS<-(y0))w zfSQ&DPxTA#AH8ln;N-Q`%A-K|F{tA^;*+^8$2yrkQ>hYftC-G4qWMad(%IyEP#@s2 z>*8k3Zx7I0^G27`$#tY|0+0WT4v4F|t3F8$_ZroE5PIHU&JR?pVytKZy6t9(Marnz zk{RA$ifQ;rhZ4UNpqGb%$<M*nO~SvxG$<1rtz1y!Y{F-_2i#l{oqqy4*Adv=Yi>dP zuUSG3n29RzIrYE+kq$3?7reL$U^Y&3?sLGS7lA+fB68Awx0h30fSkck=GohT%?~lD zazEbFJN(>xW;*+^D(jRkdS-^}=SG?{ZY>-l_c@o*d$unXXFaObRBAk#xsa!sr-P@M zGm>c@|I+_M7Xprx;Z#O_(82fd?9FTdH=E=Mufr$brIys};<u&}-N5h7W&F;C=_r~= zys3bHNpO-n+on_%J7i{A3WYYFaBz->;>8+DeZ9!!L?`-Jm%?|EhV1r8XQpERi#pRa zsW{zPY;kIf*QN`+-#_Gxb=)$%N~gjX+DmSLZEt`d%8L)RBW!jW;$%(SvVGu3!%<?V zkcSV0;T3VR7SSsWxwR@f+6DSJ%F7N^Py@_9qN6cwsJlx^Dfi+>8q29sbSiDYx3ErB zVShK4t?_@q6g%W;7~Zs=t$0@#(p|oX{<=5fnp@j!0YQCd2Gk(d;+sg%^n;voAU&%k z&{B6(WiI*uyv+=FkOs-o?6>bCij|`p!*{hCmSZzM+RCtEzll$cVcO2{Ss&Ulun9T% zy#YHIW_2G7zE2#bp8HA-){>LC2ru0SUDsxpBjhLkW-{@5i#Sf?9}fF(i6E8f4Oqcf zt;XXPM*iAHc1R|&<ACD5!;>$kw*6w}!Ve!JtK8x_zmR)2;0a62B$cw%|52chG~~8N z<Sy=^CiAYv)7G7tn!Vszw+bQaptFqU*=KMIx{p)Yk2{!u*qq?V^HkyG*k@gFHzbse z$Qb?Mzuwxz+!=n2JL_i?d$#M1Ahh%Fe>LzHY{pTr4J6myG@`%rrx-(D{&41Hw#7Ak zhgoPZn0LKXHI)ffHrz9H;W`qtFHhq37!J00jO*gCX#g|OoA|nbPkNeO^AUC{Um1oE zXAL>^F1=T;sjIh}hS3fl{2^29I_4Y|;<NpOyXBYtkEtV{;nd37VK_L#P<Io+()=Nx ze*=GMoGydR8rF6Jh@b@eNoE-Lda$|=VF7b9!DKx*n%BWcbPVNpnLB|S%;THC?RO&Q zVP*&CW)FW?Eu3<=4W2Oj@uAbpNsP0;CR4#1h@tQkA4L)7Px+WPeuX-Gh3UcjSxTpI z4$#_ueNvCnFPRpRh<mAb;iJqXvop7(2z_la$nojrLOc!I)G1tk2dEqlQgM}t&dg-k z+2F&K;<jAE$@s-njb$E32b}V6;2Nf&I&H>@y;PrrQTR&KNyv%$OkFmY?9$F2#`%*> z{z7qR0;BMZjB-=7!ArA;GrW&H-<}<*I4u#J?C0#GQ?LRSSJY&FQ)k{uW=_y7n2s#u z<6<b16F99C@Z5xh^vW@7wvC==HB(JXixaR!nN%||z;uO)+)bul&r?sfKZpV@Zzl}S zWfHn_d1J}n@#!ufk1jG6ji3nGJ}diq9Fs>6!4(YU)P$1tpYd)7!CdTM%3UKE*ApPO zWUOs4Im?kvS+%9&Z*WZmTnOQ^3VD*d4LJ8W*7>AQV1V<ha5@QlnOb1PI)<!8rhE*$ zlN2vuKY9vh=(H$lv*^f3@8oo5s!PP?Niqz_e`eUEm~?Q}C1XcfvNOIX2aI(CF0V1( z(bX^?^~7-2`j=SDGk3S~h^=SgmVcNK>caGLxjm;FnnNJhRbmQJx;RWs7$-Wyo(8G? z#cuk*Cve%Rl~Ckf`7&_(!w8#ze%ND?DFS)r%%JPuQlORovZqZMs2R~J@&!``$Kwnv z!VLM@ba&0CUu7n!DGRQXL)1V`h=tLr)EF{jC7wJ7mClkt^FR*Wfk~QWVN3tUA2L84 z#J|*pCoM?)9!_UVFXH_+R?CN5=^RrRQpnl%40jOhgdJ(b-r8W-6CE;<^+t1se$qG8 zfoT@U$ntyP#5bVZ)rQw;tO}}HOlI82#1Pzx^aGAphh;yU56wA~W9UD4M2B<@kY;jb zus*=^&2&fB=>n4r47EitQR|v*MHhrc;~7H4zsp?y6zqaw_**LxbxT;Eorrhr2XW}8 zNJ3m<GA)QT7g4kev9>O`D!_9*XG%v#-sE0>_kLD)8c+SlE~Ni^1iL8<Nc1{P=m{|p zhIO!LF7m-%RFDhM-YZiT4JMlWAgWj6Z%V<naU%&#Z%&h0uctb_YbL=`766glmYJOF z>Iqop9Xt0c72tllY%>#QM=&>f1gvd)uz}R&bqgk(eF$W6N4u?cJ+M+$I)%N|ozY4m zzk|5ijy<)D{1yPSx0R>(Oa;jwcjO#CR{_rP17h4#IKg6c3!ecomEos$(lt?7Cs5P0 zAbxKlQuRis3*qS}*=EimI?`sEqA31vZ4dbx?_Pf92^9cmzCuwyj>G?eWV!*p2g>sV zr)f;iLvv9YhrNXb?uqwdzPYMz>8Y^4l|Z)*$*zmQ!tgoh5C_#EkH=}i`6!5f)m-;u z_Vi)f0<1TVN<X`tMLrLpIApTRS;6b}j|}5<eWi|xNsmc5wMhyT*6hsA%7YKQDDSQ# zd}Ieu%_=I;n8cfyM8{7c(J?Y52&M=7DEiDiCKJ-t!#spas0RnA_Kx#zyONFb;yq7H zt#*LE<4>ULZtTm<On-@sUL8I8y##0W8auF%-NLlPW1!Ib)UPA>-Y#%K;ULf$ypI~- z@eiQKOFF;~kIxe&qn0X1&P`+&!?-^XPeJo1LF)0z#Q9J=TH#xMhgWn1k#jUZp*PvA z51Q>xTTz#CL-jBno1WXX%oiVm-z_N$(MDT`coK_!vyJtLD;sm-&NCMxg_=MH8Aya` zjK=a6<a2^I5}&6GBOCT00u80|=#B?xKKV5Zoe+W;6Vp8#b)8#PSIN1d^JCu+8er4; zoBnzAGw}1ftrGe$R@GP{bhalG|9axf?r^X3J4VKstAg-0(7ln%?d2co|If_`6T6#e zT#}jh&-D|W^>uYVI-%|`J1WHK<jLXLjha!G8loIsK-`<7@+&QF(aqSOdlJ&2N?oJh zyE&h#ftjrT=ujLJ+x31B<veB*e8XMap4ADnS;0%oKo2FUM9+iT&Ja~Hu-oXo=48jF z4%&v29-p^VmX*3d<oyCx^2&}NX~CqxDR^bRqI@hO4lklsdQHVMk}4!0F8&GRx8LyK z->Kx|QHN9~cl;!haMOc$0;5wDR5Ofxv5OO0ld5w8S)>A8BiZR6X$AMO2Lv>P-j>&> zM$!1K18-_1*yIFgYYeFB6#29idch1khd0#LM$j*lAGM}8dgW5M@RY>%tK5LF1vJ-? zTJa+_{#`2k{-{3<acsn(XZ4WT#w_|#sAvy~kW)c)Cs8MJQzLeuODzF4%zq%3Z&d%y znTvD~?a0H)_(7C!%jupDdQZe}NJy7X8t~o?d|NNTe@U2Qom@;p3CazUNGFprEo>K2 zwGHzkAL7Y*XwHBym%t3=q}~{6ALvB7lCA?ruL0u!EIQCd7M~UAf`jBTs5}klbs({( z96$3t@v$p)&=oMeF$-)Lo_Z_QOLwr_Z*WX<T=Q*-x;vx&zMLRq=D{=3KZi2<k_w^> zn4>5jjK5g9%6xZL&PQ9`);v)SF6&e@k^wom_B-nHRPmXc7kY^YFi<gJ=zF3BHf8R2 zY}H8?SLqe=_25yq6FKtY(tK=#>{0sL(||pDz!}!U_neb?rf=+bV%<m_ci-hyJOSVF zn{UB6@RD5h3S9AqNHd47iH|59DVY;8mY#{icu?NxkL>#R`Y+vrZp#uNpQ?D+ub6n` zq8#vbQ#hq>qcf|sgd0*n(~(rkY3jUU2hAsHPQ&Y5SIh^4^rC0+4qYpy%^C9^jct%j z%Q>lr<Id1`(A*SYie6vXgH!Z;b~C%kC<oXRlZY;h*_~5y6=bH;UJUcpl-`OOR7I&| z9hiiE?3&%YjS(m{D8EF{i{zo5C|}%CzzKS6Q`#N$mfQn(ttDmzSmnIpZ}3xnn1L14 zvrL6z*LEeBwdHh7Ad(!$)$#{ks~p*`uLuL-1cMxlk$aQK`Y<D}Q2(CWL)=E65=FK+ ziui1@sR#9~HGfx>O#F#j^`7|)UL!5K=WQ}{Ufy;h{xk^~XAYmdKFmuLUXeY~hy%<! z8&)C{jBr7ijKp#y8M>PC;Ixj*e9#|MaYy-C6+rb>>5t9?^6$vq5=YP$E3;l#I4>3H zQk%yFE{CWP8>PCaY)n1dhI~B3a!(THL=Zhj6M=J3yG)Sl!L@1l>~n2-R^cG$|0z81 zF}i;bz?F?)@AY8U#-o!V87_bZFjNi6DecIz4~Q$r@G^bJY4VEy&IWo(i@rJruj@FK zK~16#ZAXpS47K<Mj)t9Rrt!hCtHeU^$8GsazT`YzVU-`5)STjWb|mu&=Hcvk=caOB zyM;^~lNe`C5IOk==b{rgPMnl`;WZ2{zvw&@j8CmB75NrCHswJ2i<mO-n+%wb{(={v z&Dg}uStb~K#8eF1lV`6AYX5E4!y_JqYoEf5%?9cl3O+a9P{aRA9Jt4sZUP3X#+&a8 zFR%@N_FA~mulj_(&%FT;@r91C+e8d{F(y!N4wth~C_jLXw&T*RVG<IVnIf*5r~>LE zbDtloQnH`zX_kZX+mji?a0P#4M%qq!5#+toa4!?C9}N?B366O@bN)JjE|QxfcmThH ze-~1bhQh{t=9HF{J^7rO<wE$b>7cv6WLkboX4tY<rXF$r4n0o4^eWy`^c13-HWI#K zGH5{Y_USMt+E>7rRfGEX4zZ~i9L;!m^F}BOgLNlxZWc6arU}#4-pf>?_K3;d8qpJO z@DsrLwxV}U;hu0|e-wGRB0o1B^-eIHVG`=g>+tWD#Aq<&S<xTGHm*v^y1s-HI0%ar zM{T3atPi(`oF^MJr1zy38R`vhbu{SC;e0MepL)q0tr_&~PJy>sNY`iudOQv>d#J0N z1Y*d6lJlF1UZI?;6lA(XR6Gfpo-!RCG%k+V&-9Hr?1dQ209&YwQ)x#}i|tN5zX!~a z2<|WsyZ;7`s<L8CbY~6zoPqFJIZ!%wn!<d>W#sA0W*B=p8|UIFZ0RMcn62_A9R%lL zl9S3gaA4=nR6faFv)8Wm{40|9Pnx5uFq0k{GuNdEuCcSanC{Hfg7Y{rrjt7lTMs<a zYm-%`c8=g03YPO_YBd4gW*GVNfmjZT3+7ImtgQdP`nmhg-K5vjIoVbJO@?e{6}U7j zjI5XEe<uc$Nh>nvGlxt>6w4<s5kr|mCRdRgk5DDtWa?0Vxk5eX9LAP|*vF%&9|utR zwE{c0#EV%Ld_IThdK=dhImb-X>zF$2;7(pb)jXaZ-VTj20yMLep6RaO<)O@3{0SnT zWbP8x^5J(+15Pe#UvN4j*lVBYC~U!+-(_x6680K5gMb?ffnT2Uy?I4Hb%9yYGn@`g za=3=`Y?%7Y?1@m7mmaSU@R!VPV@7^qy1R=psd*NvL?QeY1*wH9px#vHw!Jq*v=Es4 zhp@Fvh}w(j2`@uT>J1BXoc;L#&fqkadj;G9b-`X)#U&WXkG#p+FrOW$KZ?tA^pRad zaT<s7zbU)tHkI8G{-iTCb5s0DyXZD3&Z)0}zo(e0hhGX$BFaD;3rkMko=Mkt68Ro3 zwgCJ{7uc1BXaULK=mh-Ua`=~XdKNoiCK0ZnT*>UB@x=P3u--pl4q8#;?gOJ2CfDXC zddvdFhT!Xb$bPC$=hH#5*&nL?O*)yr&n)KS^e=_*zEaxkrVs2{Gw}8a`$>-G{-9eh z+%Iho*uoS<oy=gZ;!G83tFoInOuK!dhmuKuYKQ#%fyw!MWn~+N_c$>K{RH=+6k!f; z7tc!PntUL;5>o=iyl40X-%%TWQ@PY>&h}bvb@)lV@PJRskX!fQbI7J<i`lRN)u}S$ z^ZdEt0r!H7qv)GXN3Y2P_=(HliJvkLbI9T{O>-yb<}~$A9b6%Y<Q-<keFFznKpAOC z3>>9et3gb38Sk8TT6wgSkUPzqGTkYO+Ky(jkP0V0>R^3S&ScaH@Qfv8)z2BnlyS4u z*LH*$xr*N0G5G46<K}I_#QMU_`g@KK<pk_rQe1?ywU;_@7^vj|a}mFxk;Zm2aid0m z|G(Vt8bT+;b2_wpyITS|nb?L`mnc7(j_Z?j+?3?RttYx(HRp8*(W(p)sFwJ_9y>!W zZGa0TFWkl$P<#rff+vLj;IXO<`)`&!B|0)Cz(F6X1u8EIhP?wzG>7ak7&Xtuzuy>b zBe|^zD>wpA|3=Q%eYm4n#NMmqr%&cNp3{_OI1ce>9ko2?=_?#<LzP-uR=yGMW*JEE zt$OTv=18VW48(!+5xu#t+U{BFN#^uJzbH%R>>^c>?Cu4jUx7bc$sDJ=V6}%J>jl)` z5&X8HtXm826j1!Xo@g~o;qe_N8a?B7!E^jm7_G;VwW%#e+UB@13yGXe%$Oxpi0o9l zXG|(nlI&Q7`7jf4v)>Dh3$${>P%K*N)NV(2GI(kmvF{A33zGp*H?B!P=l?Iq=WKA& zc?Nq<Ixjpsys3Pv(baP^vHOo|<^<GZ_~?!(^3B0N(^PwOi&%J7qi;>mO;j#RgfC0I zK7+U8B@@SD-!vpMBt&l=OvlU;yayZfOLK}@Oo#CDbOooBBlm|9TSnta9}dng3?KZR zxK|8JnS@HZ7)n+U(drRr^?-=N8N_{@WU;2)LQxVeKfnoj$GMn5Jg-bl>qz(PeDt+k z)Yh|fTex0B_Go}}umv5F56xC$vB6iJ-rPmKHQaPqjcPj;F}#B~f-aqwOm`prIhDW3 z1aH6`N4T?|bnqnOCK3fMI0`R~ZyS~Rn%<0Zn27wo5x!tET5wOY4L3O9wtm41Un9~S zBEQ6>hcF9~^%prX3`8@T9NB>17YCn3C;7%o;^b1ezXtGGmqbhXl#Z(#_*fk$j+0Fl zm50f>+u$Tpp~OT_{%W8$QDe;}?g?&`8HvvW?7;U<;0YtlPpa+rJXdCVwbL;n?HvB= z7Wh$PnrpIy=c*b8UT)3Y!TsQh_u>KW-*=$0Qrw07-hHk6(TV+@+*=sr(w!A)0v2pW zWUm1}xW|1BTktNQr<=Gu8dG&9+C2kr4<r_3r4Qtj31Q#Or~ViXqx%+|G*&hu@*GjM z)C_Tr$${xjS#ZKMG`C??1z~u*BG4Fyf_&#t11F=FOH2e>OAq#DI;Ee2NweCwx+1x_ zoQTEgs0=EvYxgp<a59Q?4l-0nk)Ay>nzve6tRk`$HbbZ;`@^QTMvYy<e6-<m3Z3Ee zs1F)&;u}(@g<(O<!EGEp_}fWvYX2}Twh>uzy2z}CtK!@)mrr$+NkvJfW30sOo*drf zC3$cdTKfZ5<`1`T95n}7>4o5y{ct!N^fI@&9;AEe8DOzHRCe9Kyq)0}*1_I>0}V|u ze%RXNsw6XPGU8CUL!R0TPxy>_V+EeaJM=NUr8<d2f93(Rn!O&aDE<3?wq*))Qfh#r zZ}UBexTzrmJokqQDF@-3N|Cv$vR^at^_g&>mW0=N57sSho^p@tS9)W+pr+M^!>LBM zR6Nw=lcoUt_9A%5cuW^+%uJDNM1hw~0XmD)lZolu)ycN|nW!{Qt(AFTh(FWc9iK|I zKDt*|6QX|wE(e+hm^<t))6cmTqn--(WcC#H81AizaB||Q=}3oILr*<tk#maP?=;de z$x#~%1U^OiqAvLN!TGi)cGqTZ%>`2gJ_?msgwuI_429w_^B;FPF;V6p$}(sk^WZsZ zm|MEC4n~zfpe;PjB;sXm&gp!ZVw{BfhPh769)!=O5vp$%JDTcl2WPPY_X}mfL(&K| z@dZX^CRHZ+UW}w>Ee{KK1lLJDd62nSNjcf!oZ3z3iXGu|*6=q4!G6!_O6gB`MgnTe zP?)XObXK&Y>$wVS&mXFz+-AG2g}<-@{ei(?qmr<hB|T$2Uqos;@`HH`YwRU5!4SPu zq~La;?bhcn?-l}!uJNz6d%S)e>Pg|mTZx14tcTnZ?iPK}rcxc9RL*x%TWkNHz$Ft8 zkJ$lmT4zS%b|I<{vzuU62hs2Dm$l&VMzPm7a!#*+23D$9@FHWt2WLd|6rYly^N%o9 z1^F!HQRk}Avs;MTb1?6Du}#bQxl8@|+!SRm7lbG3NED9lj^D;9j&EI*u8ri^^I+9f zGCACRZurr>xDMvpqachFAhf^0Ay=qPtD%iuAWn^hE1E>@e1JcxNffLPR=rB>8UV(~ ziYMkfHU4KRw&))B=JugzMYmHkwVIsr3KYx@w_>Fn$VpvBPwsqKjx~*oE?Wz?{&U#- z<K)7VI3?!G67&l80%7Nd$%-v~Fxl0aR`6POgc1Ln{c+rGr&=z}cWnUiO@OQELQL}6 zZ~7=P`K#H7Cv_GPIu4aZOz`Lc=7;^qe59JV#+$Qe)}h`XhvRudot~4Pw^97rbvV3C zxXmrmdMw;Ub571IzH>E^C<FD<Vfe0PeAh?nvoSDub5RU$&@uGF%;heVC(M)jMO|AF zm&7eF%We3leJE+y(F9}TtC~i&t=RK-sNOR0lgh!5FD0+WVYhw7Z{onC)Fap2!gV#k z?&itn!aHvy=VT#=9j6BE3>Q5D4lVk2tD0o4_2@QlsIx1=YE=X|#bmysf){y5Y#ol) z5fAmlhg-f2D|r=u;}|jjs8i9~)botnFssnvkVs``I>;wFg}<rFvIX415F&jG?$yg^ z%i?U@>>hE4yLSR}1Kk3l?ogeS37~W69{5{67f)m>YKrn;_V$kBeeT;3bjQ0(ZB<vD z;oP|Jj464KJxQ1%^bqHL7qgh`T!ULYtQ*IT87L4H99i{GyYOYdJN*{nZ^NI49}TY( zQRj~@vSd`5zyWuco^P|rT1?sb$I0T!?hWyl@I0ovudZ&Z`Kqtn3JdKcnx>`aJB~Ta z%}Dil&hFeNm=9N8ExKb@xLw@#++;GvErLg{x86yuQW^%nf=DSHRo@xwUF^H#?dQGj zE$*G>`QzE|DeKAOjNz{F%xXG$VF~jy3NuwE9WI0QoURM7tyAG1#*-_b${cEw`lS}) z0=vsvw16k`!$3WQSFVo|%p^(}u|wvV&JNy7&y>k3@M%ThGPiJ+m!T+EB!jhO7U?5u ztP3EXN!$!|K?OT2s8r9ZWS*g(soYDM-;<r`H2ayZ6(3xX5*;$7>_#R%4i7b(-1g1n z0>OsypR0IWKA{RV0OKqpe=Z^awWKbu#~q2A*-6_#@p;KG=cp71!EQc+%UeYBZ3J5v zLcTf;Kd}zB;TdOS7CwxX@MnqOh)TjTkKpGA$my>+ACt)HkNK`u)SKl&=X1eZ$KfpB zx&3rEu+A_(_fMj%fP?R6gxR9!>RtLLj;SV8Fm>r^o(sD<hB%+ouotLlQs5)rOeXEa z*Y9L1K?NfFP#C1%XzGXQ{}=%CR}=MpFQ?)vPuv%+^D^%v29Cxo#GWZsqu)UGZ&}x~ z<jFBa_PHo=yWs<)-DjmaxvA*}drlONO$4fdKkXuZ5~ioYXjb98H3uX1pkm+0d238A zPK{QW7k##g$&S<J8nqe|K$+&y4llw!JpbeQ{f}`gu7+hVh&N*|Yuy!Huq{6|naIym zWsYV;P-AYQrCcT+f8=?ez@|N=-rR$J(19o1j=!us*!f>-jSs|^bHs_XyuB0jUjF1s z3NjN$f=wTzcz+~oohOQn1xY%*zdIrkN=t9NM;TNis@ncy5l_C6s1y^WFogQ&IE-Ot zl+<BF{~I_@nh<5u!$x%lg>A8sROog2`e)3xxIm6PfC>>8uh>$e*%_i}fEaw2E)~OX z`XGET0EgfJ){|?tQh{FPPY#d`a<Q)4d8S@OtrEPWji^=|;dcg@5oS6}^*}l#9-?E- zAomslzn5iSUI)o<M`0Y!IcPx@&;su7FkXPmIEI<Pf>N5A8ek|GF&mv-du4ugpEs}z zMYSXI7kcymwxF-(Q)%$)mr=vzM5@(iROqdU%H7EdQ@M>f4h&6EIQ{^7$vIO4-a8BR zQa7+eQl7G?eFmEr3hr@DX;#_rlzuSBHat(-tO8@?HyOyDEBW*HVA-F1p92alM8y7$ zrq-J?kb|1#0=Xdt^<eZJz^lLp#ql_V!;vwCg10o9e~!|Ta34%}5RR9rD*XFX_HKH( z!J=S1Kau+h>~nMS%UBqZH>~&qGDdl_mf&sGLP0TT9$(nG*Qp%(ao*37Ka#P(I)jZC zv0|-xn$u*mVBX#|>f)}b<d^vRO}wT3tm|%02VP&EvIZ>7Cmb>*S%E=xNQ_2_Jj?sP z%bOU5esUj;KPAjy22RU%80}PW&?7kuQ()G(H4OxDh6p|YZ($31<Tvp~eXLeE8U8w0 z_$~ZzVm|*HGXE1!>Soq}E*W^{vYfy(@EU{IE4OgCoZ+j3h&P`9KM#}2*}Eb1Qm*G| zn(_Pku}&%ImFdsfD2IknAHMTG&pMQ~Zv%H(k{uJqZahKGKF4=NQFD~x6F+0UKJk+! z{mpNwCJR%iZX$*krK@QV$_n)YE{|jQ61svmM)EbC(ZXKwzq5FsEm=petcMC*ji`SB z6`~OwX&3fS2I{S>sISwRt+<uiU>Ymd0c9j1DDy5ca57rjVYsH1C~Vm{=NCAK|Dw?~ zrY7KSJGg}ws4jVM^$s_mO((vx1}9&$B1bseovEyE^BWy@(RwQ3ZtTY_#Gf{(&A2XM z4J?1tf;!<g-3$xiGiu?JOow}{AbTSd-`R{PkpMh9k7u4towb(z-<)W&jNj3dStrTV z0cIu^S20vCSjB1Vm_e-g7<O78DwBnD?3~oA^ebJ&Btd0escUn)%1v&2mDJPYSU09I zu<PFQcJ5KbO+oSeMNC);0u$`uzlj?SSmPjAt1Yb5b#sY6hLPMa96gaOBkxYYn4Kik zc*rw%h|Zr;Sf`OecY+7|%c4xb?t$)|iTRg@sf#D$nn-~!V;&kzE*vUrdCsh`fxUR+ z4T)V1n4^}M9es|UUYDw^Ic&T^F<HS+$&2rIx7<dxF^A`*k|vU*mPe@t63PfPhSFrK z^>`px;X50|PoBy?T2IICX;4H*_E0n8NKazfMf{`NV5AE$!!<U{)M5U!*Br9FsXtfI zrIi$aO=FbC|Cq;BpUUK+dCX*^Ac+f!6+*KD1Kct3sNPahkF4VN3?VOM0!QO&;@`(p zqaI*l*=nN2J+gK@B1e4YloceddeH=X^S(#0!d>Zt&&T(T<h#qm9_>b@;Fcbo9O?1F zca}xitsmIq|A~wAJH+Kr+QK$hBXXqW_p~NXMBkjyi&L_OH|S+g#KU!Q0|eBCD6|+x z_Z0cECjWWMDnzh~<xzH~qW0&d=4{T|#FB4Vr-c8H&8>OU7f?z5;Y7A2TSh<C5&qvc z;$juf<}^<E5E#ukGE$7B1LG<>_<yiPOuWODd4<|w5}*7xzkMD&*B5--6Hq(8Q9aD3 z4h{uVJjCgJ9@lUZCVmtkE0>39=}T>$lG79gI#@>CJsU4vKA5}9x;$s9HG1V(CR(Mz ziCTdZmkG9}04Mc6Z>0gAiPX5ET*F<wq7Zv*2d?-ocq4kU%Wlh|FybB6df3GZ@WSOl z%>AigGNV(B!jm-v{j(D1cDfl%wRFquA)oYRQhg?>k#q31h15RT1YDLzodY){hWTD2 z(}Sef;g06UE9)m#4kB7y;~tTI#QHv9{sUl}yhO`9WRKRI-cq3dF~k&WDicBCld;j_ zSg9K*rt3M$S>U@DknP_Sqk6HUBUrmqxHOWZ8H}NmHvxI70J9tZA;YyLx=bKCe<B(_ zCflzhkIz7Rxd0;A0h2QkcfnQOYChiWA2QMv;_C*UtO>g53nHP!Pq~*JIh7~tLS()} zW~fPq$%dnB30-?t_?z^c<>DZlFXXY>V9S)8$xHYb3bU)0gQWcE+;xZxO*pBe*p~}= zf~x%dhA4&OScB;O_!|`ShM1R)T(BIxbr_s;j5YG%>@Cf2h{JyCj`CH8*fM|&Hj2}* z3!Gtzb-meV4e(qYMm-7VshWVtGx9g5iNF_8M5maA%-5(z2g2WU2`rOm(JR;6!zh5Y z;UKP~MdZP!b`j=0k_omm^mMRoX4d8)Cut#1nt&DlMx{03|55iZCSC2~T`wjM{X;iv zKXlgyWSdiT(wBuNdaBpx%P_gQ@ETV_@ef6dXoo{*D7){q=|wE)0)AePwzCXHBq^9@ ziQPv0f5|+(dZ>S~_}xi4-E)aZPskA?K_1cB;RgsJ3#*o$w|AXYErDL$5qw((pT#&P zPh?XGoUin)D95FC>jxSNqb5qnB*w>7$dz$Y93rFbCdc$3Mn=0?d$F6E;QsLv7f!-* zRRE1VCs#1b9M{o05M6xm#8<e$rA)H8Oux!%>GQ<#RFe0=RW*n>Z_)f$u}j);>Kn-z zDm5Lm1>vFnI9OZp4$p(<I&gL_@n)ytG%7~6`1}9$XaaWNco5<w5KU*IVMCq)&57p< z@O|_7sdd1i+yg*`QPaK#@n<5}|I1GAL2mC#HcQGr%8SxlS4DSrtmZv#r#EjnTtF6l zE;aEPgtOznf;j%>%!Kn(HgS3z;T_Mw`PoKHIYKmbS;-yjyl`UDD&9dgu*E9eT4Pw7 z&g|zxxTPk5F&cpLx^U{6b84iBR+Zo3z{$b+J^{9@L9D#W&s@Qpo`Xv%foH>mBkLgf z;u=$aZ{a%nMLeoQ-tWO0$p1C=9$;2g*Z=+uL!AMJ-lYqIpkl!wAXd}}7Ho-{*f7Q# zYb>#A&=@s#jlFB^T?7R|M6rRO0@8c$z0B}`-@CG(a|ih5|GV?dz31+;_u6Z(^;u=_ zv(LHM%72jbY1oD+E=8x$&}$vy%n$fRf6Znd*8KrjyEfsaE+tBxhL!xD{fFO?>yE^} zMiQ&H!qEt>Jq}^k&<ra36>P*`T!s(#KAh8#?2_DbDCQSjM7uA^lpC-zbTL`wy`b5( zgHEiNcIW?KGM%2p>ki!MH5VJ7$}{vP;%Uz%dN1V38TVqdhrzY85B3OwyP8PqdLrc? zv5qtGg<BYDduo3SM~{%>eoX#&E;GbW*%e)jUn=T}-#rxnR|&bkP02{?d<If{i>&s1 z{M(1@x!n_VAHY260QjHI`u=sy<ObnwSS18YQ}B7snVro6eY5eF9l7@K0qY#S;bAZc zd=criA?i0~ZF>%R(NHqv)`he2d2bMN|H%5xeXK{_Np|Kc;0cWQXL8ajh^E}%PU|PQ z;(cTxSBl8int{fJ#HRbnD^DgPdI(ST3Ty2@BJmrDxIe>dG5xP4v(%do0G;!|Of#g} z9yE7j<qc2BwVp0u{Cq~=m>h_mHrwX2gLf11?LyvJ4eOl;|E<Xvk7bni6Ek}vi!T}7 zb$H=_qM?WI>s)8UtF|Xo{tmfs0@Ev4A*hPa`q@1m%qGu5BkUOG^AzII1I(!!v9k0s zJG%EI`<l)i=gji1<eE1z3ww*}tsgP+EySm8jPFczJD6GA>+B-<C)vf>_=q+<xvnRg z?F8K#prQe|Xu>R+U!}s2{K7o{b36o3|IEdXu5fk~tv_QI$U3AwoQ&=>XbwYm=a5qs zaNYh3Ecsltd<WL}GwA;h`F<Jp{S8+0DmecJyqAH!X?VIL!CPJ8PXl^B8+)oo26jKK zdJ-MyV;{#OtFQSzu#w2_OrpYm_>>~nbsqqAv!VYeH9tkKE5X^}<R*KNDL#z%n9Y8) zRy?!iVth!?ZIg(_Te-HlC(+>0@|Mi}F5zAgo*%%KH=mbqH}&oZcdwwoYRnC<;!cMb z$YVAzpSps)YaQ1jb|X_Q#pCdc7UZ3W5vituj`x`@oz4iVG5XuUUl~_=OAAX_gT0+u zc(1})p!#ECPu0Q|%y4(*-llue|3Ub^N$h$%3_HIPMC^f0?}`Kpu!xp;{@u7TR!rvn zE%IN$=pSJvx)&B)#<lF$<SS<|?xWee_8ayq{=`nBljw5+tA6ZQMkl?XaXvBgZ$ynr zaP%Gi{Z@R$$6Sd!gH~tZkN(CQ?+o_o9M5d)F=lL+pwB13{d%m!m5F&gh2%Gk|4nvw z&0*DX3RZU_7C8|gp_H!1rvC({55(%LFk2kND$b=)V;2Tk-v^l<1AabcHL5PU`3K(N z8rFW;v4)SHfppzLdIR(D$>ct>%6l{aY(n<+88|B8dPH+H%Wni>x!ZUG#ObUK-3pCG z#2>P5aCjo~(ZS%W2YK09tV&fU^Is3AXJM1`$SLl{i~km^jf2~+*!P#Lr<Q{9SJ>Hl z2Xf{LA?xc?@ESK3u46BA5qoAg;4OwTpV(S(F4vO(4VHh)ZjIH<M7!ta!AG(yrwg;w zzaYDAjP5g5fZt;*t69q#M>h2&TAI(N_p9EB<rJXRI(V~MXk!f${+?Q&g8Et@{1?78 z0^6*(W9L(`&u6*f*c{K%8j0)$jlRsC|A-GhjuC&5!+IAY&t~Gu6=qY6=LjMw*EPV$ zNH{u({Xq@bU-|*mUS`xk5?g;Es=kCY7Lp?!Ow5>0FYmBsb`Lq#Z=ri3$Sq=o{0<j1 zs^D?wu-j}Bw&@ezo~NuoD^Ih@k-q1613vOT^206cPU(ouo+<1J&gWBhDl3Wi;m^Jy zGitZ(Ykbd{XmuY}#0N6oKj76@vA@3&JJE_j)MnO7p3Ke4CqlCY*3b@HABdH_&zT$X zQb!>B%ZZHju(0VMs0n*!dJ%WNCXafBr_DS@K6eVM2xaVq`4n7Tmecfitp1EgK6S9I z@5v~?AqqT9MEaaKc@kJUlz4Cxv<tD1i$P^Ee1BW80?fRQgz9r8bvKazDi}GA+|*2P z1`+3HyxAVKx){E0VvhJUbd3dT(dba3+qGzE7o@bJyg!IokA(liI^?aa9`>Z}8lLw1 z01^Bd#`AAxT7N}%?hASquXQ!PcMz*KKIztdrhg{(%ja_-aS=O&*XPzV>a)WCF4+Au z{>5jDutSX*z$b9=6{wlctolu`JRN<{MR>-Kwz`xrE<KE@2jSEs>-Uzup1bH-Vhi z99QFt;$M-$Q{-gtFyks`$JG*W(v-E3y39*I<!=<;dn(aj9mp8MNL!<!Cs=ju%Xoj` zySrjv0(&#~`zP7tLtt(c_bY7zjSI;vtKiMnBb_?f+!o~UF4S9M*`4uq4Vf#fMDOds z)Oyy8CXiiq%tfaYx$@8tq!!=}@5dJZfTbSD_xAYO&cyX@c=T%U+McZE4Zh8R_iOM} z3&~FQ$5szxc6}YFK9(5Ph<xHmM!GwBlIu*}8NoLADqs)CY}(uj<+^BmAFOI0yi9*Q z!^=?VMNAxkw(nxS?Q!&e0=St?G?|Wck0cUahVSkNzq9ec?;@iy*yej=)F<E*&S0Io zKRd;aVrA_lq;eMd^&g0N6Yvy2A=U4RccVbfBqVhjy>~+YcVmZNVQVGe_DyVcZ^~DK zxZALhbK&G#(6f;_?5)gE?}L{zvWRX(;0{>s%VhLTxI$UZjPF`9v*zG)ZtiS%I2?e! zcS8>gu!-9EnZ1Ys6G7sUNah&i!P8QhcfV6mUQm~(QdKLgR5*a1{tRB)(9=X#kv9=J zO0bDq?0tP3?iaHPe-9CF93#G(5#Iv>J0p)LnCY!y-Qs)JcV5IpoQ<BE;ccEm4lS9< zcK}Td!7o?xq27@=eK~9KzoLgxSYJPK&96XJIll96`1JRX-v+K#J_fcb5pmjqnKPNm zT!~Ix>3;)1%@dbd^Bh84<#(#t0eX7jE?f~D!`k#StS?<fFQf4WBk&zlvCosx$+GfA z%&zWXZ|eK3A5;O&w_vyZn8h~3Pd&n#^)Q}CU5SkMPG&Lh5E-vz)#7>P=3AIiH)S5T zm@C;|kWcl7S|jG)jfe)P<M*!T^GSTnV*LLDNa-iy<I~vATD;Fq*vL@gMmgT$Y}R0= zBZ;9{?-;asF?_lo|8F329g;j0Jj{U3DP*fB<BRK~xd~u>7}@a@W*<DYlNtR+t{crF zADn`B=*7IWgskLHRvaD&sZUX-HY+$Au%2s?_N}bo52Bw+tPAZ~cscQ?8#LcUvUg#> z6S0Pd%<^AH;twPHmw3N`Ykv2UbIt;zFJsxS;-PDhzkdTKH-POwAd^z&E-mmoW%$4) z(0Q9PkKl><MJjaF3_P>}Z^h_fH{#3Dd_M%eUC2m}VN6ws6+hBqKfKtjNa|%~(re0h zCu4ktn9mc?@z*Egg+B!SKC$9`EOjP1Um<b*5jY=&jf`WKax^wx4Ilb@Fk4I?`xDa# zk|AtG1Kr7QU%->DK>wA%;(pjdZ|-^cm9@D;h$`bj?mhUvXUW|*aOK?RA-KolRIs># z)wmUm?tbPV!&s+$fZ5tmB79wZL?=9W8GO~og8qQl*_XR+hLH1Jhi`k9oXBTL@rw(1 z@w>^5zk`FJcz{04C%<E7_u*t|?b%`9n)%LX?ATw%+LMS_!u)M8w%UWTkMQ#kV>h+o zx)wg*W^CglGKqO)s8{m$1bF?1=dt}<elWS#v+PZ1%gpm;M%|D4FOq3rf>-T|9uCCc z-N0O;fcQQhivJ)xJBGQ!=fsjJ)bTpfa5C_Q<Tmd!#~y(u_W?ssa0R;#&vK|;_%2p= zA$U2ToT4p~z5+a5f>*yC>-?FWr^B#?{`kD7@ZpomFzO(cvEXw9qxl&9yhVO^KWDnJ z+hsrIgZn^d1iJfyvHS~3)yvHo3enD3G+c*kS=CwDew%wveqwd=4l;q;@wUbEIEt37 zLDpa*{b}1OW3i37;(sTZ$wlCD33IG-@S5M_8B6doe+BcqlABa29FC`1h2|QQQP%}S z%jmfm{<4&;_4oMai_yy#;^DENV+)en2!9j7|5YG#7tmD|H1KQ{YG01rTjFaEq|N78 z@6F89u3$ak8Z7=Js2F?eA@!zs$|vw)Zz0V`@D5MrBI)PY*2iRppW#3KRoA8X|329I z7WDHv=SJpcL%%`3k0bLpv8dhIFZKugpVvP=gP(D%6rB&QT9L*5fb^~gp^J%UCxN}Q znNd8)?(ZY9<|mO@FK8SI_Dv?OQXH#U*l7x>t}V?Q0qrP{!?8SD2@ISh-smunk$ zvZMBER@&#Y-}H3+^DS7`s%^J%H{`GM`zoI294uf@N_T<k7tHTIrvH)fzkzFbH!+X* z8chL__$;Jd!aB(yENUMjZ*BbANmyWWBJ@DGDkYvbW&EA7yT(MaKjpH~QCQ<+$htn> z^bYiN3f4ReBsZmf38OfPaURHD9lXmP#Fk	exwiS&dJf0GjVXZ=2BNSnxHJ@m+y^ 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 literal 0 HcmV?d00001 diff --git a/examples/game.rs b/examples/game.rs new file mode 100644 index 0000000..66bea1e --- /dev/null +++ b/examples/game.rs @@ -0,0 +1,72 @@ +use std::f32; + +use bevy::{asset::LoadState, prelude::*}; +use bevy_synthizer::*; + +#[derive(Component, Deref, DerefMut)] +struct RotationTimer(Timer); + +impl Default for RotationTimer { + fn default() -> Self { + Self(Timer::from_seconds(30., true)) + } +} + +#[derive(Default)] +struct AssetHandles { + sounds: Vec<HandleUntyped>, + loaded: bool, +} + +fn setup(asset_server: Res<AssetServer>, mut handles: ResMut<AssetHandles>) { + handles.sounds = asset_server.load_folder(".").expect("Failed to load sfx"); +} + +fn load_and_create( + mut commands: Commands, + asset_server: Res<AssetServer>, + mut handles: ResMut<AssetHandles>, +) { + if handles.loaded { + return; + } + handles.loaded = asset_server + .get_group_load_state(handles.sounds.iter().map(|handle| handle.id)) + == LoadState::Loaded; + if handles.loaded { + commands + .spawn() + .insert(Listener) + .insert(Transform::default()) + .insert(RotationTimer::default()); + let handle = handles.sounds[0].clone(); + let buffer = asset_server.get_handle(handle); + commands + .spawn() + .insert(Transform::from_translation(Vec3::new(15., 0., 0.))) + .insert(Sound { + buffer, + looping: true, + ..default() + }); + } +} + +fn rotate_listener(time: Res<Time>, mut query: Query<(&mut RotationTimer, &mut Transform)>) { + for (mut timer, mut transform) in query.iter_mut() { + timer.tick(time.delta()); + transform.rotation = Quat::from_rotation_z(f32::consts::PI * 2. * timer.percent()); + } +} + +fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_system(bevy::input::system::exit_on_esc_system) + .add_plugin(SynthizerPlugin) + .init_resource::<AssetHandles>() + .add_startup_system(setup) + .add_system(load_and_create) + .add_system(rotate_listener) + .run(); +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..7a64e1a --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,372 @@ +#![allow(clippy::type_complexity)] +use std::collections::HashMap; + +use bevy::{ + asset::{AssetLoader, LoadContext, LoadedAsset}, + prelude::*, + reflect::TypeUuid, + transform::TransformSystem, + utils::BoxedFuture, +}; +use derive_more::{Deref, DerefMut}; +pub use synthizer as syz; + +#[derive(Clone, Deref, DerefMut, PartialEq, TypeUuid)] +#[uuid = "6b6b533a-bb1f-11ec-bda2-00155d8fdde9"] +pub struct Buffer(syz::Buffer); + +#[derive(Clone, Copy, Debug, Default)] +struct BufferAssetLoader; + +impl AssetLoader for BufferAssetLoader { + fn load<'a>( + &'a self, + _bytes: &'a [u8], + load_context: &'a mut LoadContext, + ) -> BoxedFuture<'a, Result<(), anyhow::Error>> { + Box::pin(async move { + let buffer: Option<Buffer> = + match load_context.path().extension().unwrap().to_str().unwrap() { + "flac" | "mp3" | "wav" => { + if let Ok(path) = load_context.path().canonicalize() { + println!("Supported asset: {:?}", path); + syz::Buffer::from_file(path).map(Buffer).ok() + } else { + println!("Couldn't"); + None + } + } + _ => None, + }; + if let Some(buffer) = buffer { + println!("Got a buffer"); + load_context.set_default_asset(LoadedAsset::new(buffer)); + } + Ok(()) + }) + } + + fn extensions(&self) -> &[&str] { + &["flac", "mp3", "wav"] + } +} + +#[derive(Component, Clone, Reflect)] +#[reflect(Component)] +pub struct Sound { + pub buffer: Handle<Buffer>, + pub gain: f64, + pub pitch: f64, + pub looping: bool, + pub paused: bool, + pub restart: bool, + #[reflect(ignore)] + pub source: Option<syz::Source>, + #[reflect(ignore)] + pub generator: Option<syz::BufferGenerator>, +} + +impl Default for Sound { + fn default() -> Self { + Self { + buffer: Default::default(), + gain: 0., + pitch: 1., + looping: false, + paused: false, + restart: false, + source: None, + generator: None, + } + } +} + +#[derive(Component, Clone, Copy, Debug, Deref, DerefMut)] +pub struct DistanceModel(syz::DistanceModel); + +#[derive(Component, Clone, Copy, Debug, Default, Deref, DerefMut, Reflect)] +#[reflect(Component)] +pub struct DistanceRef(f64); + +#[derive(Component, Clone, Copy, Debug, Default, Deref, DerefMut, Reflect)] +#[reflect(Component)] +pub struct DistanceMax(f64); + +#[derive(Component, Clone, Copy, Debug, Default, Deref, DerefMut, Reflect)] +#[reflect(Component)] +pub struct Rolloff(f64); + +#[derive(Component, Clone, Copy, Debug, Default, Deref, DerefMut, Reflect)] +#[reflect(Component)] +pub struct ClosenessBoost(f64); + +#[derive(Component, Clone, Copy, Debug, Default, Deref, DerefMut, Reflect)] +#[reflect(Component)] +pub struct ClosenessBoostDistance(f64); + +#[derive(Component, Clone, Copy, Debug, Default, Reflect)] +#[reflect(Component)] +pub struct Listener; + +pub fn update_listener( + context: ResMut<syz::Context>, + listener: Query<(Option<&Transform>, Option<&GlobalTransform>), With<Listener>>, +) { + if let Ok((transform, global_transform)) = listener.get_single() { + let transform: Option<Transform> = global_transform + .map(|v| { + let transform: Transform = (*v).into(); + transform + }) + .or_else(|| transform.cloned()); + if let Some(transform) = transform { + let look = transform.local_x(); + let up = transform.local_z(); + if let Err(e) = context.position().set(( + transform.translation.x as f64, + transform.translation.y as f64, + transform.translation.z as f64, + )) { + error!("Error setting listener position: {:?}", e); + } + if let Err(e) = context.orientation().set(( + look.x as f64, + look.y as f64, + look.z as f64, + up.x as f64, + up.y as f64, + up.z as f64, + )) { + error!("Error setting listener orientation: {:?}", e); + } + } else { + context.position().set((0., 0., 0.)).ok(); + context.orientation().set((0., 0., 1., 0., 1., 0.)).ok(); + } + } else { + context.position().set((0., 0., 0.)).ok(); + context.orientation().set((0., 0., 1., 0., 1., 0.)).ok(); + } +} + +#[derive(Default, Deref, DerefMut)] +struct LastBuffer(HashMap<Entity, Handle<Buffer>>); + +fn swap_buffers(mut last_buffer: ResMut<LastBuffer>, mut query: Query<(Entity, &mut Sound)>) { + for (entity, mut sound) in query.iter_mut() { + let buffer = sound.buffer.clone(); + if let Some(l) = last_buffer.get(&entity) { + if buffer != *l { + sound.source = None; + sound.generator = None; + } + } + last_buffer.insert(entity, buffer); + } +} + +pub fn update_sound_properties( + context: Res<syz::Context>, + buffers: Res<Assets<Buffer>>, + mut query: Query<( + &mut Sound, + Option<&DistanceModel>, + Option<&DistanceRef>, + Option<&DistanceMax>, + Option<&Rolloff>, + Option<&ClosenessBoost>, + Option<&ClosenessBoostDistance>, + Option<&Transform>, + Option<&GlobalTransform>, + )>, +) { + for ( + mut sound, + distance_model, + distance_ref, + distance_max, + rolloff, + closeness_boost, + closeness_boost_distance, + transform, + global_transform, + ) in query.iter_mut() + { + let has_transform = transform.is_some(); + let Sound { + gain, + pitch, + looping, + .. + } = *sound; + if sound.restart { + if let Some(generator) = sound.generator.as_mut() { + generator + .playback_position() + .set(0.) + .expect("Failed to restart"); + } + sound.restart = false; + } + if let Some(b) = buffers.get(sound.buffer.clone()) { + if sound.source.is_none() { + let generator = + syz::BufferGenerator::new(&context).expect("Failed to create generator"); + generator.buffer().set(&**b).expect("Unable to set buffer"); + if has_transform { + let source = syz::Source3D::new( + &context, + syz::PannerStrategy::Delegate, + (0.0, 0.0, 0.0), + ) + .expect("Failed to create source"); + source + .add_generator(&generator) + .expect("Unable to add generator"); + sound.source = Some(source.into()); + } else { + let source = syz::DirectSource::new(&context).expect("Failed to create source"); + source + .add_generator(&generator) + .expect("Failed to add generator"); + sound.source = Some(source.into()); + } + sound.generator = Some(generator); + } + } + if let Some(generator) = sound.generator.as_mut() { + generator + .pitch_bend() + .set(pitch) + .expect("Failed to set pitch"); + generator + .looping() + .set(looping) + .expect("Failed to set looping"); + } + if let Some(source) = sound.source.as_mut() { + source.gain().set(gain).expect("Failed to set gain"); + let translation = global_transform + .map(|v| v.translation) + .or_else(|| transform.map(|v| v.translation)); + if let Some(translation) = translation { + let source = source.cast_to::<syz::Source3D>().unwrap().unwrap(); + source + .position() + .set(( + translation.x as f64, + translation.y as f64, + translation.z as f64, + )) + .expect("Failed to set position"); + if let Some(distance_model) = distance_model { + source + .distance_model() + .set(**distance_model) + .expect("Failed to set distance_model"); + } + if let Some(distance_ref) = distance_ref { + source + .distance_ref() + .set(**distance_ref) + .expect("Failed to set distance_ref"); + } + if let Some(distance_max) = distance_max { + source + .distance_max() + .set(**distance_max) + .expect("Failed to set distance_max"); + } + if let Some(rolloff) = rolloff { + source + .rolloff() + .set(**rolloff) + .expect("Failed to set rolloff"); + } + if let Some(closeness_boost) = closeness_boost { + source + .closeness_boost() + .set(**closeness_boost) + .expect("Failed to set closeness_boost"); + } + if let Some(closeness_boost_distance) = closeness_boost_distance { + source + .closeness_boost_distance() + .set(**closeness_boost_distance) + .expect("Failed to set closeness_boost_distance"); + } + } + } + } +} + +pub fn update_playback_state(query: Query<&Sound>) { + for sound in query.iter() { + if let Some(generator) = &sound.generator { + if sound.paused { + generator.pause().expect("Failed to pause"); + } else { + generator.play().expect("Failed to play"); + } + } + } +} + +fn remove_sound(mut last_buffer: ResMut<LastBuffer>, removed: RemovedComponents<Sound>) { + for entity in removed.iter() { + last_buffer.remove(&entity); + } +} + +#[derive(Clone, Copy, Debug, Default)] +pub struct SynthizerConfig { + pub hrtf: bool, +} + +pub struct SynthizerPlugin; + +impl Plugin for SynthizerPlugin { + fn build(&self, app: &mut App) { + let guard = syz::initialize().expect("Failed to initialize Synthizer"); + let context = syz::Context::new().expect("Failed to create Synthizer context"); + if !app.world.contains_resource::<SynthizerConfig>() { + app.insert_resource(SynthizerConfig::default()); + } + let config = *app.world.get_resource::<SynthizerConfig>().unwrap(); + if config.hrtf { + context + .default_panner_strategy() + .set(syz::PannerStrategy::Hrtf) + .expect("Failed to set panner strategy"); + } else { + context + .default_panner_strategy() + .set(syz::PannerStrategy::Stereo) + .expect("Failed to set panner strategy"); + } + app.add_asset::<Buffer>() + .init_asset_loader::<BufferAssetLoader>() + .register_type::<Listener>() + .insert_resource(guard) + .insert_resource(context) + .init_resource::<LastBuffer>() + .add_system_to_stage( + CoreStage::PostUpdate, + swap_buffers.before(update_sound_properties), + ) + .add_system_to_stage( + CoreStage::PostUpdate, + update_listener + .after(TransformSystem::TransformPropagate) + .before(update_playback_state), + ) + .add_system_to_stage( + CoreStage::PostUpdate, + update_sound_properties + .after(TransformSystem::TransformPropagate) + .before(update_playback_state), + ) + .add_system_to_stage(CoreStage::PostUpdate, update_playback_state) + .add_system_to_stage(CoreStage::PostUpdate, remove_sound); + } +}