From 6e323b26d2ea6c4279e585fa017112eeea521d84 Mon Sep 17 00:00:00 2001 From: Jackz Date: Fri, 29 Sep 2023 18:00:01 -0500 Subject: [PATCH] Cleanup, add extra witch spawning --- plugins/l4d2_extraplayeritems.smx | Bin 36040 -> 38501 bytes scripting/l4d2_extraplayeritems.sp | 368 ++++++++++++++++++++--------- 2 files changed, 259 insertions(+), 109 deletions(-) diff --git a/plugins/l4d2_extraplayeritems.smx b/plugins/l4d2_extraplayeritems.smx index 91d5fa6d6f8b9d9a311c24cb5da9eaa9b83e02ea..d7b4c94ed1af82745f80f53067d3fa8ffc8a36a2 100644 GIT binary patch literal 38501 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�=>1(7sx9i$?xpq=uwLFO)5kcWHb}-4G`gYyW zlgH97Rqu|L4tT+N0T5fuV`YFi}l zsZ(hQn^&nv^O+!QSY%s(GQYn+XLq+n@20k@z9M02G5eWh`c(^L**-QSsE;>A9F-ha z;L-H1fUO!WV&{lcm#pBYWqaOf_{j>77SqB1=xDc?0Z*^9T_A&~<1@$h&V!tOhv^1Z8ru(?ok^9RuSe@j?T2X0-W+f* z*GZHuj>v3Vcs{z6lGf=PEQR~Q91Eh1O9r229RZK`!nj)Lv~Yj;o`Vu@;V{!k*(K|Y zO@n<8=$oU?+4k%4&X55gy}l9eLw=i@-+xgD7s_r617#%;HgllRI~WVa8P!X;=$5^F zh(lfx+mn|1hN|G}gX0W^kaw;!s%~#&`iIrXdamTv_pK5nW^B>;&F4R=V+F_*x2S9L z%RAQ+O{)k9)a!eBp4AQ(O#n*@rUiCqGv>|`Ggc+6t1=20WsZHk{Y+BjV*R&gGHyEck zCW%CAUfDQ}UyFD_NKlb$Kv8qZ+0Rc3aVxZ|7arZpeTguG*9xv(F$zCUSS|eCnz7^2 z*9szVC6C?>>aT{ya$j~?nWj2f?}Th8UMPj-xU^#7N;Z}kOl-Cdw^P&AHS5=Peesf# zpq3}6X-yT=2pPVmG!s2rC9-x zk~Ivtua{$MrKVxyi=S-PQJs=Z-GylCimiTi_28hc?C|%E$#!w<HO4}EII6pP+8S8dj}MFWx@6 zY*aw=Dq9*#+xl0P$q@VPdKrvmrqXY6?uR9?PcHXOXD;o91i$*S6J^&HF3 zn1jwyIoUg7NJ7?~n>}Y|Bm>E~QhRgM7aQG{gKkVAG1Wpx%a%2~`jP=D#gsTIYxfit zZpr4<*;HnZnEE_U{%ZA77q} z@ly}3@#1f!3Ee=Q<_8P}{~aF2-5bOqUEjdsPEHpq*T$AT($kDxQziNHq5B7CNtUP} z4%2i?)W#^h;&1~$Z_U;}9l15YBARyiX4mCQ`&5xjeao*ihMptAi+r}{SLN9>$CHQa zIC4uN)UN)c<6XnM!I$2Luy{TjofeG|A6EO^!Il-8nc}LCREWE!KG&;bhTf?KTo*TQ|i~U`&eQD_@OUmT}M|2YBvM zxXHh~lJm?P%iG|q8~ci1H!P9!?x>SZ6V6M2{z*qUWKg-(Bz?l^CYg!N$Jni=Gqqd< z^KK`vIGvfKQ*tjo14WHnO&?@3^YFq!5;BnsmHe;S0gl!gPwUgt$g^zWh_2wBMkarBwxVGk=0o*8MJG zOk9H&i6fe^I2-k5)P>+|(_>>c{8#z5n^dPyDXz)MRo@;uQwJYh3bBB-UbbgHXY``a@&7B1e6u@dVWQmgLwMZve zhnjS7xA;T0V{xy1yd3o1G&ta?pRWJzVKzEDExArCorl}^T5zPpaVlnOrQ!`W_`Jg? z6R$j8o5$+^t4_L!nSq?QCd#K$a>soSU*ATC>bCr5d2?4Vjk~$tOj z+4@r2K6h)m%>A;VHa`(txKf-VTd$RCc5TrcW7oR*=9KO-bDYY>>{R$|pLuP2mur;Z zz08WwTwbZEBEc~bSNK&_uxdiX7^hgNqOE+FE11owM0z9#c?$&^r|a}N7;d#cT5r~X z%($PLy52B6#dkszbigs+hcp1<$%5R+Y2+g4JsH*`UV~kU>h|~7N9ng zAK}{!{hbjFT7*L7@2B`;LeLrN%c4D{X@pOwHqI7N&uilx~>sW6Q1IFa+Ua4JGZjnnT ze3WvV4Jg6U{zlocWLcBS2iJ6-N>U-ej3%B>PW9m7HTh3-{Q3`h?$4c5H?qfl+SjsH zUhHW0{2S$Gc(_vzH+-TE!APVE)P1aRy6Kc-;OBKR(NLkBI^zv7+1B;>jx~F&lDh*_ zHQCEB92S(XkbkkAz+rQ3bU6pZq__v>3m|in;gqZQn}(Euu;EJN1ltp9*B;D>eM{7k z6v;M5C8W8orBrls-tW-sy$S2oMYULsCv;ecu`gF$V0#?C2r_XDczYS8*5T!dB#eo+ zSJB$@&W)gJYbN-O=mbOqr^j~lHqv13)dX_6{H1QMCbu%AVn|F-66TnWc;v!1SDak~ z$4uenLo%~LHqU?E=}%Udu+5Jex!bv~1gTd^J^uqwIsZ^vCrxyMJH5>mRmC!X8{F{(yHBmH~ zZ(t6*@7Z6ND~H&_x0H}8YMS*Ln4N&KxyUx_QTXF;G z7OjlHf^|U3+KSzk1!U9{TzEbX=U&+?+%VwZ*bid9h}r{}dv2B(#|3K%^~h1h-O~`}Hh3#446g)4m%c z$VV4ZV@IC*SN>2$oXsOl<)+olMZ#76l`A}SXA;OpdKWe5uDv*fT+~FBw?fA;gohID4B1EUj+=fL z^F(W=P7HWnSn>A1LLIM1X^VKJZWazFq^I;-XX!Ml>sWt1*syHCF9^d@#@VMzBwOFu(pakQE-B%ZFZkJNM8e00^J6omFq34Ew8e{JEg*NG5u+X3$xw%Xee3_G++4^SE04eo6-`9e#)ep z{xR_N3@iRFt;X6N4(lUom(Edga2{w7MD~eiIU;=oIW9REJe*6ZIZ9zj5x0Q1u4lc? zlCK$Z@b6PCa3`JrRvm`Jv&H0A+$NFRdfu&B!JTNqpwbbsrF}Wap;d%W@WtF!7yf^5*g$DPT zFAb=yTy`{&bZgT~wor0kEt}fXKA?U6Jl$5_3qBzmle1*j5ib(3``-WDz7>C%r&#d4 zE@RUr1P0PXojEP-_omz4vh+2WXZ?9MPwdRgYbLJw&je`a~3Wju8j)CKm5v3v?CT8qEmcRv$s%Lu0tM##6FxjO&*9GA_w z!p#cj4bg*bt2dVN*BmDKncFP9A;TCuHN0#?K>Ve+5C+!>4$K-%Ka^^SZOi+)d%Z1A zcAQHP7UP&k@LY28Mbe7v?}93= zfX-6(Q?>@zp%apox`M);6k53B#o^88wV!<{yM`-Cen6Dp?B!Kn`emNaDZGiiZrjy{ zems;*gK0Bmu|8W*1UGwiev)LKzWA6Tr*PNpj{SN759^4?fD2pYUH|Ix8RNC1#n7_6 zEAWGxpTVXoEB(?2Ph6@odnxE|s*77WbO#;$db4@^T01!@{jb^^!c9&7jIP~|SzI(m zeGjN&L78Nmvj0j$mn|;kf9z!+-o2f2C>7HhvXaRhQswj(9JHCGeU)Y!Vf(H@D5*a3 z&hc*!x~9HB$0tek#j+!kzl{92Qooj3lSBvq)-aW(N*Qu)G=o+;IfDdV*S3jd+DvqG zzUT4slgrZIF7)S$8e`?bU1|xGj#O~Hd4;hZ)cO|5#Jl-m*JBBmEx>ta$tB1>P|h*w zc!fc0zNw~OB_hSeGIg-zyLxF!5&|v$POPt@XvB!caeF4o?lp_mwn37e#Un>rgQPVB z@#0RSyN+}-iP(YD@2y6`O9C;v>szm6#@iF+)1(yM$2~f@j5xHIT=758as8g9Be@Vn zE&1A|Ec-{-ls5W@sQd&owd4XPf!d*`<><$*zM`$m25#+Bqr(zZbh5dNw^`{9AEd|l zeja<(eC`X0h#62kxYc~%E)H1@jvDnh0h|ipw!$4Rq_sGcynvpPt?Z0Y$^CC z9JPvtYuGCue|{yE3^)+lt30 z#lW+r{I|-=Kih39{;AG>(HdDR#&%4-%&yfUOV1GQUa1QzN>SMrBRb!TuQnpGpun>~ z@{&JgPC22@Iu_kOwVplVkL@e;ES#|U^9LN_>ac|>l)f#&JW6!?P6^j(#Q2v-U%4Kd z2H4Qt(0^0JXl^R+QUy;Io;VCW@t7+u;!x*%I}mCMmDSO)~n)iwNl0P zs#{>bw_jAJ3bhuKgp zTACsJaM-5lN3DlgMJ+q|+{-_G-8r|O0S*B3w`<8B=MOn6^|^4SsIN&<7u|&{JoyBi$!k08~y zm0F+_(ZY-7@111s5_t%4`HoHgBW>FC_b}QBFdLMLt7xg!@{={$`){i;;Aai}I>P6%pV z+eNYi*ddv}r3aX&bpK~ntUDl-51?e^4J9VDx+6q&k8GZZpin8)8c;?ACC(vhA$Mn3 z#9 z72h<8%EtvuWEr|zN1Jusi{|=}#2-z}qkO0I(+j%_b5%7F5n_&r@IjS_J4u@_RodcI zQAHDC6e+_tMUI-Wa=U4n%Rp+Qr=&$gV;Uw6ci-=DO=5SNKD0^mvBViC*?2#>TP$ek zjCjjSa+_i0#kz_$y;P=Jitkrr>*yrrZ{oZGFL%4dQ#Aguh~3UPWLTN(N}T55&+0I0 z(h|Aj^7`51D5vJ4M*fr~k*pY6hxzCOf9j#Qr?H#`%2U5?As?hb#51++PCbF1t1PiI zCk;k7_n6gf5l;SzZ21b1R7d}ND`~cEreHDA*Y17V{0>~Z*2wOi1lOtKN9%VC+w&9u z-cjA<8mJS^dAyL7{dg|E<+HbJPsw*F7n9&;!Z0f-U7|-lZnX0iAtzjAAwYMgqUsFwack0OmCTQ{Klakmhm4{d^?4*-u)PDR=RcgPP!hl^03^*a#- z-3IdDM|E-G`oD?|>0fq4r$3bYGGTd-K{wCpkHgqKltzqGhXDSdo35xg|09n0tlny$ zDMXcMsk0bk`$8ixp+hPOCZc-}yS+`jpf|1iAo#eyvxE7TXZUZH-_Cb_+{gvd>M3zr z41G9eAi7gzN1PwHpF*MztpKB$*Wh{a0YxuwV!Lx#7)XGgF}hjkTN|#jz=?~$z0v*C zY`xJWYDk;Q%pHERFD|fc3|j;~H_GjMa`|U2ZwZ zY4@4x#CGX*@~lyzd|$f3G&8h}YeA==Kj?_giBFD0&93iZk>0Y|6VrRRqlbg^mTvLe z?kvoKv623DHeJ*W7TUs+^_I>qeEj_sYf@ z)pOpds2VqO0_Ag-|LL69P$#J+8GFpDR>SVwRzJy)*Ge ziSC}MK|J)47k1uKfD9x_<$L@v%zQe6#=GH+j?DXuU2ouwA{SIXhcc>-25PT7j1{uY z-6vbP#}>Ux-9y7iw?`XRoj@aDwND$S74S;{*d6Zkh32^3gIQTMwI31?EY`vYOHl?cPF9!lJ;6Dkh~B0`fe2fjR}Go6eU9&zK$YF7C^Xk+s- zr!XNIND8~tjA)&65U6*#wd4EzepspcUlBcC#h3}=@aS0G$3PLzp$YYvxUHrQx$IXR zjANYrDk%?xS(hH%7NNThBO{N!Z6ljL@Xx7-+@r8MyGiTU-?GC`&2P7m>dgUsZaDxP zh<5-+cg9JC$ZIJclP2EEaIWoNzGK`hVBD;i{)4F(?)qBtXvXEolIQEEvlQpXefuQ- zx6h5K&p)wlKQdw8uYWUZe|MU!kG*ERwsLG+T2F=G#ZdqqBD32W=g+2ZzZWHpJ_i87 z`sk14U4l=l6MRP%043HUG9$@YA-@KY5d5Bm;JgAPx7eaC2ofoT=1_ncQ3m!_1ADh! zD9gXTOGI#g62f$75efp}2vLyv7QvV3SIN6y6XwT$A|1Kco(fg_v*5+5s|Hh?V>5cn z^{{NE8>wEfPk1lSKYG_L)Eq!Yq(f{*`orn7^n>?+$JDh8|d`Vcfz=mOHQuGY+|t^@%-V9Nv8KqL^x7LeK8G*v(+#J@F0CWURY` zQ2Ig^Ad<`G#QPH#DjDG}Ov5H8s-_;$mgX)RLw9EZuaDY}M91)ssG{L!q=NB2q#CWWLgsYQioJx+snjCd;$ZIx{Y}dkbS{Ep>I!iO{5y#+|6Zntl8uAuwvnhISE~5$%}X@*?j3r+Zajv7cyu$?6&) zMXc9O?*Qx;4!wM;SVp7+7zt$DrVZ5x6#8`s1KddqJa}MQG*}WbzZcg4I)F^uLqa9Vcnk5V zrH9i9{Bq_0=l81r(s;q&;beKd{RQ4PF4%#BzIQN22=Us|THQgePUK;Ic#~R-n~ScE z_RVS6n%dmnTB+W1lP|7uTt%@fkox_pJvT~oP zFuv8XR8{8n)gdc;;>vly-&Gx%um(zAx3erqR{l}+4zl|`PHqs$Y)+ao@w#H7Y;$xi zg5|=V9q*{@kN0J~Je&u{?<8d}nLKKkiT5=5s9NqD*j|+T;;2pj+IP>cGGv4?lO7TG zzM07J^N>kFS+mpOX%uVVv$yxxmmRD-a4RO78GP7_rD3J-_a5t2ympnD_QgJ^N-twSb6cf7d;+);hwwf&**Lb z`KYDMNg3@dV%7VCV`=91wJgzbK&{7V@1kwP zm1BR&Pya)dH2i6bfQ^>bg?wtDaW{$W*?i(a13>$+u=^7x<(0V|wY^`#4&F{;bQ*=M z8Jx!B^*iAhfs<#xQym-VdxFP5XX^Brf}%Ft|Cqp@kf|AP@%90V?Y2}(boqkd^2%|)`NZCdoiriuXjkC{E$62GqN#<-YFNEJtpD)VP)L3 zRZE0zk+ylVgFoQ*ca3R|EG<`r&+FEh0X@-!gK_dFgn!$vkM!*5g>2OwQg3H`)`oC4 zpcjeqDaYMq4-hgM+7*xJ(=A?9Zd9rygZ5CQwaUi7nO~8hOi-af5xI=Kk3!~VAtV+ zinm-AGi5J!MlT^InQF<3sh_JryI8RA+pk(?mq<@f4#UD>ua4Xza{=OL_Hl<68h3Do!~<8LprviD)Z$?!~lPl;-HrQYc2WDYJJ0!X_^4zh|1Tb5@NKy zOS|q;+uSO5(lu2mhR=wg`k&y3qwT4X_E5;#y ziL?r-X4J2khiR#hPV;pEo5_!V*;u*1lakHeRSO7zvt%n3!lzLk0GyMZzX|@qgjDGM zSytr|oapu8!@9WzsWUy3X6&EX!L9!X#y~m0p;FlhvJ!l5DGHA{$|-WnI`#^pzt;;#N1-V_*Q{Wd2Bc{KAyBVu`6)nV@U0gb_)t4!=sZj z^N7;yD4t3iV&;jRGrh!K$R)=4C2!IWWVgVj>{R?H5fp=Fek#w_AJuq%? z&rIqkzacG4okOj-y!nP)0;H1pFm-5s3Ejy0QTPZinM+y8GLLLk8 zLrpS(>}jMtPldV>sgQP!i%A;@NGY5e&1ATqYJMWOHL*1VoUJ4#T%bN8h)D#7>-JJ% z(#896{lh`S#7gEjnYF~-z#?bHRO%u&@Z70vCZA8pS>OM+O$=Wq#5|=92{uqTWE$6| zx1=-MU{;k#G_*Zkh)zBgnx`-)v{($Br%UIxDx)TaF&yb^2%_U8zZJNfOl~`0V9Z&? zoOwuWEoKv1jI-iAsNp=W%rTD-iKok1&*=Gsou{prK?GuKOzNaUUN>B(ejsYeL@cEG zR`90b&`NoQhV$l(IlLdcCAJD8XjR*_ma&Br%XfC+5Dtj(v+g1MJq7FzK z^>QH@k+w(@=D0axrQrVqI!Fnhq=vjeY^8oB$T+{UCMWJMZ4QU#wm2s9RAgj;^N-Bi z+)MJ>8cifI=2KYv#yPRaLpwr4vSsp5iN;9eyW`gAmTV@GF08Ro{{&ieqzURb07V%P zyd^sDmFjZ9^fXxcJt{ag(M6POn6#LcbK!7Uv@I_ZXAof8!%UYfSt5!l=R>fwmC%#_1p9HAfp_Boc254OIU^z-HqA8AEVOY1yRjA!%WFz76PXD~z@MYL5@ zkz~eX3Xc5jWd_Cq-hyW*77Ae%b~v8M#X^sYMS~*>=Z7K*c_XcB9&{`f8spg|*c~Fw z8fYzGmgTYn>qml)!O)ar*G`+7)o(PJ$VT#smn~Pjh&G4hvq&=dh#$w{3HS>wB5tC! zE9@MHg8ryE8!D4bd}Sgn63)-f=B%dxt)V)+CQIhrU|f~|EPy6}r2rcM z@P2`v0DA!r0vwN(zBfp_lg8_gAJaWBK6eDU?}1^g^!-E?+#}?5Z;$EDnc^KlDc~=2 zK(z5HcfRMlO5W`aeKC(C!}B4SEfoI9i?|!-ta=>q2r#7eDM5?N4c{We0~J@{a$PsFSNYq60;+A0+9SK$|2k(;3$?&L-(QyTJ%l@l`#lC97PU*__5jPZR9 zdwZJu<7`4=s^F{`*7oH1B1_bjz;_b(9zPJ}c_}MB0p;V&Zg^XCYdLMIr{&cKdN>!6 z!Er$d48M;*k!@kV=JZ;TXlyW-NI{e0-93UwRc9)abDIalARdWB|BdEhsh359m@CLi zZjs~NG>-h*Wv!u{_OH_S4?35v;1eG%bodttJ`&!^Nsib3`PFI8 zIODr0coEf;NQxfa266BoAG`VfG|Xzz(FCF~jsXlacdq!VaQGK2o6^OxQCxxHi5R~S zjGvl^`quV@hWl6cu94veGuerx;8N{{Xr3Pg#_$k;o^7cW@Sr#%!d1weaO>EdIX5*e zHDA2UU&&w$CUxM+#}!WiNs5Pcyv+T$d`696D<-lMXUWi7Vmp(RQquT5&dhOI<{}TF z%{ATjjM0eP71lvM&JqoYEf0&och$tVH}c`o(3V72?3JhZOzB^CYX0B(r>!TnRev7$ z;tcMqkSCT)k8X8BQ}KNIoLES$>0h<(dAUkmf-8D4-}Uz_Dee;pGpxij+t2{K3J(aq z#KS;IaDj7uWuj|RXZfy|=c<(U+#qk~a(}KztTB+@P;*KSlCFudF>D&A9XDxUEZK}= z%o>euFCI8)zgzcF-}>G9-TK}7-TK}7-TIaD)88Z5|1x6-0S*Hk1vn0H65uqz*_Utp zEkAXpA|y-jje^x_Cpi2GZo;M>#0*oG>`c7_>y z6}|`H`^748FWSFWiTlnTs}}c|4Oa_cvG>6DKpSI!1mBMNj6E2HI>EOazI`hg8-wrc z0q}=!9M+uQgKx)L#vYl**qQZ=CE(k)5%PiWiRT#m8GJ8qVk}(4*pU|?P7S^t!q`2x zF?L~$v3J5Z36*~@eA^R@eFna};ro5~9)Z@Vt!3=B3C8Bb_YAb{9{6^=i?J`kHw)i? zg>PsFV{e|$Sp9#2zJl)__`VCim)^tJ$Kc!a3S&Q+F5YIJce{9dy%)Z-_b|2^zKwT^ zHy;oFDr3Kj??3(;W1qt}A;JA3zSsCc#{LDqN5Fpn46uKQvE}fc0{aKyJ9rmkpM~#P z`2HI{O8-01uK4Kq??QXP_t3`}`+fNC`8c!}e2>C+9Lg|!kg?x{?+*BW1>b|e8}fng zzE3jt0KO@B50nqSXW+X7zURNj*r(uo^)DFv=AGi*tyz#~{5y=TfbWj)LDuj+d6BUn z+$G-Fnq3e0`45ae3*SkwzYo5R|H9a};d>6g)sW}nA3z(yxBiEWy#U{t{|fj5-!rd6 zT=?$2%Gf`^_r#CHJ7Tl{Cu0loJH?oV?}+`Fu@A#{=}#H^5xyt(GsfO_FVwp_z@CBc zhG_xzLHIV@7GS5~8-wrn(f3O&0(zWP4In`u_f@mynwL@_%0q{?Dyb1{8^|Ae0M*?*jw-| zv1b7v;d^oe;2*vpwg$!xzBe|^SPs6&J_qdt-^OE%eFWbb1N%YvUib|3GrmDK1a*e* zwLfF*Z{U023yf9Gf-ql&_JMCRtSaWg_cg$iA^Z*k9>BL}HS`gDYd-~U@XdZ6@Dsk* z0Dq6ccOST4gzs^{haY1&DDT_e4CPqJ*c0$Q{YA#s!}k#2!G8EQLA^c;--D+Z`!alC zD6ns%y-m=qBaeu8@Ao~(*j)HtgaAw6dlKkFAAHY2dqPvNrMTY;fN$>NCE7b+oV^de zry(5}3hXK@DSs2bJE6S~VSMPfKgKW6moMS@Kfu?K{@^>O@U4gM|3EqkZS!yNZNS0+ zJ-W7;vD@*&uP9@03J83B80i({(+=O6K%d?Y-;1q`b;36U1?q$EN$?+n?-i)qG{hNz zw*ov0Fb|*upch~OU<1I509yfm8Q?boJ_hhum|9`0sa8sGxD95zXG@j@I!z%0O|o}9|o8Yuo&?e;CX-);xfR01^6w1PXYWn zz*&I51Go$@1yJ)=s1Ly701E)R0R{nL0NVlH53m>DcLDwY;7;U*6zH0$2|) zCf{_}1Mp#h!vKE@a1P-606zk#1{}Q?;7NckfM)2dy6!g{`O zfv2d#k=j>AC%fev$RsS60&%#A(5u!C3`B;8*YvMiF3jtCyN6e=VMBwx-Tj>dk^Y_` z#*Y<5@ZtX6HLa2Ly`6)rR}C>o(lk|J#;1((EP_&?5&oR7FsfIOZ7Y938LZi4B-tK| zgK4Xk%cIH)->5|C*SEwJivf4$2e*6|D*N6cU#O2)DGhG>M!6?E*pPLpSutuph^^3m>Lgp*W%&A$VJB%L05?ej>}n-$5Jk z5FxoF9AN0$bj-?i77F-&2p?2T2q(v*`FCa#C_sd@>qfykmgmyw{U{eB%`mXJKW4a~ zwLQGX%5!-N@M6@AGW8f{VMlYgGqx2mQu;V;;g&_M3tPjuZJCQGabu=g@w!W>ZC^AU z18#W?$PtSt#^ZqY5*g!|PJ2hYmJX+0%;d&32*Rz+&BeUA7{XevBh)Xq$rDIx{5-?0 zEgjJ4D1030lP8}-tdkktGU;_u7&%2zG%;qvt*!0QN<4-Xu~w@cnwZ%uZEb^LFacvY z850H}VUMYH%;%^kE(={IrH%2anPptonECmITie<@I>OzVR0>)>GAspzbvq1q1Z)cE zYCAj%|EiYS&djb-5I5Y~-rC+=jJZZg-?}5aJVf8y_JWd61SIEjjU4U!dsvdo4>B$Z z1Xg)6ArA~t+)%yVj&n#+KAS%kuS7(Egl&bA&R?{k-L9imSdl1na`{+hbd=(_;noFh zK#GcO$29}+7#`2r^UTW~qAdhMsl1n)vU4~>gheC*EY$fN&gCeX*)`m{u(`!98b4-W zP8$T7zo5ezWQZ#z7@Wc|rvZWM#XgDPl*!SR8SN}KkrRy@&x+MPing&>CSB;tWumds zD9&;`WVo%R9dJYpMxKO_^W+aVnO%7#q@cu`3ufwZY)6Q&pt+cfRgh?*+acJ(g$u&V za;Urt&b>wUK=^xlgxgw?)``a8bcnVNae#nr#a2YA3n6}`+acIOsGx8bqk)T9(o|i} zWA3pIG(;SMO3}h_Tl<1$XS(hrg^Sc)?8h=Ay?BB>!7||3%Kx^2>wF+WPqHV`)B$Kj zljyNkc0HWKe2$q5>oqXVZ&~1o-jCds%K-u|ETRgYh${JUW^jVQi(11^v!}tdux&xJ zOdrR_pwMb|IY2-NH&n>=zBCa{vZ4X7)f%$6mh)DeQlSapPYVwZ1ur7eM0OQ4w_t^g zj{NPb7lGgucxv0(wrrX!DTLcPaCFC`x#7&(EIx@w&7*Ow&Z1VJr2Ni6>}4#y_aqdd3VR;Wg}y&1Tf!5laYXJEq0XOdPY%+qd{5y}6wH!lQaLGD5_CBz7m z(t0R8=FQ(L;~9=7fn`OuoB_Fw0>jzf(pqdG64~W|QoqHngH{oIQhUpSVt=o(QW-wQ zB+{da5fo$H&b)mfDx&1-v~mXO8%+UcKOEfxtdf^|jGNVhNLo3EAel+&RKN*D7*UWh znc#yh$~iA+IH~6Zg;)ekr(Icr2Kc6($t@nkK5A`VK%=Zc@j}fi^qe3lva|w=*Pv7< zB_+fm+};Mmm-liX_B5<{hBL*EcRE4XMXep2gSQunzz(?_Qn2hmZVj2naQi|S%3a%m z8$wzGsAS>Wd@ctrIUa6DzG{t?O>Q5~2&IYMTn<{#;Dovx(B@$v4?vZL6dO*Wj2Lkl z0wG#kTNJw|m^on3m~Q9NBjQLMSOse=G0DdYQ}T1+`GBwCzGxoSOZc83BS!qg`G!%b z2@13@js)TP^I`r9OGy~3pUTBZ8yAQ~9=ua%jO4_sQ_k#sXS>@rV$aTBxCppLBxhXi z!-`SP)WaF&o?!JJ%?_ob{P8Z9SBCI>U>DoNP8Q8+D~gXmU|f*_^C8xZ-Nlup!6_A; zl&dCa6tQ%ezo?@PyH{iATn=HFjyu8w?LElnbY%*w$NFQ%1*nJf2-GEQ6~wA2Gd2cG z5?JOXVDEn+F`2xeRI1uL4u8FN8PYr7zVd^kZP^Fiox z$Zttx2dptHN6W$%zHBV&H;MjryFk!I3wh8rgaF#X4X$CBHempD=8#g$jTi_P+s+J5 z5EzOd?#Wnr;ocYJG=#ZbAm}0px;Ag|agI*ZEE>426(&edHUtAnjHqFSdf3qd6N1_h z8mDz!iEOoUKq>nMnZq(FcaaLHRRwm4Aa^H3$*}U0y)wB0BZ1o?IMs~8RD)W>Ru11l zW`kBPr5HSW2@qb;j*~2IzDU_KvG{d4gcr6fQBo6 zrdjiHTOpy`#uK9~&yU(5K8`wvPOei!m&r9ECqYst8=?VcquAgTz{D_O1kZLLMdnu+@$OqnvAK%k3t!E5ra| zF8xGODg@uq@byu4-VEV|$Rj(#_ZL|!59jd04v~9nqwFBODZHqoU9uCvq$1xC zOW`{%ZWsRPkFh9zS!aIBAiod>W#n5~=imTzCbM$62uvgRg~=QzO_ti8w~}LY*{w*R zpn%a>3>&ZoSy163Fl+ThAv;lsP$iNfskyXWroL=+>?Aj zw;T1`rIWqCE4OFxCL6MD!yN|cBOJwpyn{j^UO0*Ob=RQUyKsQ%df2`{NiKNk>V&g# zy?`IYx{TkWWIKu%eY^SlyM39=mWZNezZMeUZ6U2?Hw&O_sH1FkxcExZiXuelC3MB+F^)_uxpZ~}062v#Q0_TZLD zk0r+Qy_44HM1gAyNnV35aAJ(>?}2M^%QnwfgeiU&k>!Yt%88uA%;NP|LbnMUsWX?0 zZXe*g)>Prik~141zy#`!u|!_#MyyT?JjKY$EaJpfM+3%zqqR<+B8+nkfWT5C1Q$fu zl%qmd8x=!vB`&D|+H5)2yxO#KER9e*Lm@9`bA_{FEQ>22V1Y1oz5=rkLU7Ei8eX?L zi)aP&#L8%H%c>}@UOV$eM<{$^Y*KIM<}km5N#^C<2QUIA#c)$dLj$b$&G-N6aGIx(cZva*h}tmh&+T$0LX!XcbH} zlyn&^2POF{Qcq6(`tyQrh+W8{pUtPJ^+M5W^%xf;7UdL0=^{L|YL#wvy^c(T&v?A$ zdlFj}MV3>jXjPRKr{`))7|!$}mo$dWyDXYWiems6f7xhp4+^~2MRN(@on(DGM@Ow} z@hl3-V6pU_BYAnqBztDqN?O@WPKIW^_=c@$5;aX)g|%|Z#DKSfN6+gK&3j@?=7EVXGaOvMv7h42Htfbd1j zFtPML0~SbQ)XGa7mTf9AAJ4gpOEau1x(IelT4ea;)C;;bNcbopPj+9o`hmGzY8A2M$s z8e+2G;f15T6GH{*%4Cvu`8W?Qk{Ie)!DGoUAH&kz-KAnLFE%qiWrwqdm_UFujPq{q zPVt=Z15T2RpiQ!ced3G>kH3rCPB_g8o*P4;R}l}ebMRQHNB|KZxR#zgxZ+bJmSY_e zpyLfCmY9;qBr8DZeQb2>yHu<*H!izmI0J!uCtbaWYh8i2YE+Q${5&!`$%iE03$V$M zvr>>FgmY9)3~OFHTqL4he-I+*J0a5YF8@rzf z!dV50|3#;6+&1K01C$r{vpFdr8nx0urZR?Xur-h!m)t#WtJ>H*IFXMl>?k@8@O=t3 z7(_L(Tq_pHn9#l z(#CNuI@?Ln?XF+0u)&Vhn~UZ-cHs4Z_*S#3SGSc&QbbbwTdu7y+S_hVJXo`~JIlax zCr)Bd*~SDegFGCS?Mp+lI52R%#r1K#C{)k|HL@rppfIoq*s;=tlY*!Hc;XmsNR&`a?)PT!0um-Bo8v@o; z)z#Hh1#0T510rA`P*YRY%DwAbc_P8C>bf45gWy#!Wg$d;FpDLCXz1HjQw!vJy-+3uG^uY zT{8lZ1Fx&dPy7d$nqZ)YrwE^5*BxC@@;hsSSh52(m z6XXI_JiP$MfZEqp1?r$tW$js4ji_&ZO%OA|RHyM$)u+0GQ1#lfx1>3 zi>k7aN;mWyd;;8YRx98T;zp+j58ykSL@fI=a3F;|r9lYGqky z(E6%uPj!8u4uZ)+0C_;;-^2Sm0MYN^Y1CCg26xGBzAK1-cs}4)Qy<_TKIqX92-L%0 z;dUpYDCVYyPiwHNN)Du~s8bI#R9&zhQ>@`R-o^8(pN7VodT1bSh0!jGm8-AfK7p=U zaKQ4^VtHyYpJ_5oOFeW)m9#(ubFZ4N`;dke!{j0DV4WOKfx52h=0$lN4!7Z7RQIU| zcrUS&>U7N+qnsjG#0S~J0ZTeUEw zzSaYHe^9kBquv(UQ&NWu^|#Re8&a1G^|&4aS z8MN<^x?ZT~h4&JEP3nB1z8BhSrU^6Zv!MOyX+j4K^}kT{aL-_8iwB^b=Z>9{}WP|4fWX2|C>^$4fWWtyqBeJ8|t&6{!h&e;fMN4 z82-^2!VmS^UcmberOq4bwPE~^OWilrd&7&Fzb19yQ2%Wb>^K zt2joaZXD{xLALCa)R9B|I7~lqhcKg_+&-}X(jCH#`f})hMC#6=-W=lJccl&;>P=z! zZ@W|Ejrwz#f9st>rw;Y5aJ-F4-8$5(!}9-z)UiW-y2D`qlGL?BJv;2rOH$_!_3SXe z$L|thQNQj8*f&cZJk-C#^#3oZi-&r6Xb;v4GwR`Cdh_c=T-1L$hIed99X-^``vTGf zsjG+jaag`9QfCkK_5K{}_unndsJC|t@2r+Oe5k*N`E8TBe5l9w4a5hj(}((eX#cj< z?L)o3Z-Tw*9$`lPzP|$dWA_L%>iMC)U+Vm!zTdaOzFq46q2Ax$g8kD{2N3oDu)KHN zE6k_|i1xSNE6k`5i1iu_a=1;QJ?S%(&_tz8TAS={{{C6GwK(haAC2%SWv zZAjCQ{+y9Iil}G!)_~AaL|sMHOPmuBx{63Uk!B)2eW%o2M4F2Bh}2<3y+jP3le&yZ zlhOV@sndx1jA;Le)NMrlL(Ko6)N#Zx=>J)%>xlY=IG#>PokvU){r^VlKBC@ZI3RQ% z(Tw_uXrC!{AyF@}H6U~$k=7!OMg6`ZsT+wjr8^*WBT+{Z^&JsEc1T@GbVK`VQfG3X z9KRovx|3Lj{(#V(MB0lq7ws3NE+y6h!~a<7R3Z&PJL*(oUf9NHe?sb5;+%)}^-|Xo z>wx9oFLf@FCgAx0tkk{4K12JLr4A;BSt)feQ5O?wIHrf>4(&+GP=|4KKOE!yLiZ8J z?5E}Ti}H(lklO=77ZPa@>O;OiAao)>5)gWkm>%jz@-Zy!{nCzlk{=HUT}iZ~z9f#F zJu)2XP5!rl(4EA3d`7yX4&`S8LXQ&Tp)MtkksnHb)TzYwLA}aj0ij#@rGU_{{Axhx zSbj4g^emB9KQC!OO4?E9@$)M0z#rmMm>brtMZ}ojap}UIx{iOV&4(slq&}048pwMOgNKojrBL1OH z>u(2zUhAQt&~3$WkNT~c59+w$-3zGadNe3>T|XZb`mSFN3Z2()1clz~cY;Fq^}9i# z|N8$0g$^vzNYsPH@}Ms4>p`Ipi{(e1*lR(d7mIj_y0JK}P(SwDl9u5b1@+30R5|a- zxLED9e<0|ze@L^hndY=_s@3lNt#jJj?{eDDYWAb|I_*Ex?4O&d-2?n4r+t@Zf9ou# z{hu{^*PEU8zkR@I&%D)XfBJ1s`$5g#_lVQJyit3nK(niP1-l^)X}$L`=wtZ)eTVIb zP5jrupTCIh2Y&B_z(?Tw8}My|v2ht`1K{klK@n#*@~bla7aG0qL^<3j(l-6R+9>ii z{r;v=6ky;L+!7EL>gCOgLGi*8?Nbf;(gezWLnhr^UN zbJO1!!~J8?^j(=soh&c5)0ZU9BkKHaji5nzW86!?58f@?e;1^Hs8}uI)yeRut5v=* zwxk*N3;q$zp_!szuSj={`xE?AeUaxI42qKe|7D#Id{^`S$It$#rB$nz7Q;7vV=`J= zwQ87JnXFn_tXdjP<{B2GVVI1DVQN@RRz|xS4Pn@2m&Ib-VXk49(J)MQ8Ri;(uh)6M z&)MgDe)sX{@pNB1=W{;)Kkv^u@Av1+E*+u&J&x=A5T^u~r-uxt`PvX}-(Ty0!?d@493szU8TwUcS3QJKIS_}_G5mYQNeRGzrVAEQ%e*cGSbBL?~1K?+z(-?tnh`?8!vq%MoW?`bcC2iXST4?Lgb5V1-6!2hz{(D$&7 zwPJ^et(gL1+iGQlKXW!1BIk`%g4nKF^;R7k`@t#P4`Se*0LFo_+{1t;f;r)`Un~Zvf>mG~*Z@ug+rwr5)dx=J zo?wKW6B7&008_x3+=GC#z#?!q>j|90eCc&H`uA=yne7KIWI7|o7K#JUV*P*@u)e`; zwmZo4j_X1G2*&`p$9|!Ud6w-pN^Dy{&wpaOfzPqNN6Gw%G1LdIQQgp9ko2pM;gqh*}MjFvqU&vJT^`2ZW( zkCa8=KUm-3%d8*p71j^Wc4GUDmc14y{a0D9;6CHP~KFQPMvBQPMsousdJlJODOvUYQ{6)BrYf++q!V zlk*Yy7SDk@T-KaYu$A|LAM-x2gX0YR4;YTU_otlqju6|w0sK5j_UvDPZAZwSntSl? znSQkFk@LX+aom6dEGPH}(*gfvKLdk;Wv?6p<{v3*UIBOrSbC(iPxX<~K21kT`*3f} z_USlM+9w(7dI|T2N68x2e3Y!+E#N|qpQDB0;2B&Wj+S$-O29L@PJw4}odWs0P)*=c zuA8ufmvP+$m$N_mZ&K)%x%05@>nfz5OU$2oW< z=Tq=b&d=ao9M{TP@NTvrSjOio`@wtoeArA|_*`WIxRvSp#dgU6?`3)X@@}XAtYCiv zAK-ioKFH^RmFzFzPWD^Byd&xbt2uv97Dj@Pa{dM%1GB(goNvGymUpuB&m!;>*7s!T zr-jF2J>a)8a5`86#&f(LEALi%l##~?qrjOQx5`X#7W*BT09Gg~!P(%zaq{jZ7KY)e zU=nya`yH6a@vf`@H?UvEh;7!X>{j-HSA+dZ>v&-}xRK*PnGP249T9j9Z9wokj*ltA z0`PjU1iXRc1H36%&Tr#8oo4D_*AzLoG2#T&4H&6RRHlG8f$88TuoJw4_njc)C>)df zouD7Qo7cz6`j`ry!S;!jbJ((#rOL8cSwACB#I;;^z{Q+zz$I*7W!{PMPA?x!qa6h< zqkfW{>sEY{*vuv18jdsYX7(qrnEf8Sh5bO;dXl`W>;y|_?@Sf?z}wi5!8>TLfcLQ< zPnCY#IaT^=*Hr1Rd2!PJ^5dlcRVb_Dq#uS(lX*03n#`ja%FJmppJs#aaNL3aqWz+* zo~H9G_&(=%WiQyq{GANDocRLVIUbe$;76>#>C*r6rpvs{^Zf3oy*^#`B(2~!+70n? zE?*M(AnjOXAy~!h!JVAnW?&q09R#bnzW^WOec&$6ci`jP?PA{Az_IceLvCq5ah+Q5vSM2iCxnh?W z%@wH(E z=AqC9G7se{^A^bbQ?fwjpSA@upK$SC&UJC2%qtlS<(+a7xPtWqo=baYp}gA;hmo+7 z;}KlN^v{s_r|JwjN4F0=pY@v}`+`bv9mjEs><^O9ly5La;Ckj4{2TkzB3Z|?7s)za zzev{czD2T*C!8hgcPe-l+aJ7|~G5YRGCjZm0hVauU0G;RxXx#wSKY8t6htAUR@&dY1$ICE0&1ekhetah6-in z60sY?mWsU)zf|Vk6mT2Mxm4!eTxH%;nSblShu9C4J>Yist2B9^6A$iS{iccCP@E?7 zb$Oc1&lTX`*`DBT&Y$4pY}aM-?I{9$lIbiHdpvWQyn`uNCU$x0GO@eMmWkcnx=i*@ zUCM6o1>Ogv@Fm{2T=q?c%Vpoxuw3l&R%P3AvCmV^7W+IKe4XR&Z25LobGF#$4a!Dv zKl7I^>q;8`+yqoYu3NA1N@fho{P5R z_)}({EBl3f@F2?#{+IOy{>b~mpV)shgfU^o9d%FFSzm9qcHQRc3ceMrel*@x69YgfvCqq z_MMf=s@1aptXnPn&nEC_=6kigL+o8G-yZ#$mURrjO)7K1Nwh0LKg$hHX1T#*`Hm5c z;r-wg+OgmXv|HB*Bi6{b%y{rb<`bL>=7DjvPr+%lhu4UmPUj&q^gOZGW6l$MJ?T8L z$Ft58d%XNSvBUR*bHI9VF7u;oJ5Sz;_Ma#AdDvRZI*s`NlUOeBbUuHrd^2rQHiPq7 z&tNk1k%c7!OaRYdy?`lfA7v$YCVlm?1g?8JNa$gUk3H z0bI^}UVwE7^noi_Ztz^z+XeD&Hw|3L`cvkEt62^(lkE$xVY!t97s$8YgmuD1a4p|A zfLY8xcs~0FcmeMR*RegpY%nex>lNz@T+jQmcro)0Uc!FQ-&SRLFT}dV{9h>h zptK8R-@{+Pxw)=Y7-&BHy%

H z=QM#gG9Tb3=3~8l+xA~1i~);zzcL%Vh5Z=3mHWILIp;nPEM@+{JK2B0yI78k<=c1y zcn|XhZee=hR$dR5vt7aa*skFH>vGIxP#X#+rXV{U+@vuo6?^vi~+0JUP}HV;-l>Mm!izfKlpe49o)_5fseD_Un<`S zLNCKQ$Z{+F;FH{UDl@=6><5?0x7>1YFYi~jfX^~t;B(wpUyd@c{=gU5Uf@fdr}D6- zv0lJ`@Oc}sPO@D$$nOpGgN^JzS73c)y@IdudCCT5BlsHgeWfrAY-0JqeXO@D<(o%z zKK5m-2k-#%lP}*u@|6YPmz>|huQ(3CuX(?+4eaK)Q1*e}@VQrE{o=e1e#ic*Oapt^ zPr&c_{sHV|{=uI(e}H|gH}Gfn6Yv-2=W1aA_$#jm`}tgDANU*R)s0xk*q-13^Sx2t zC)Oxy!9SV)MtQ&3zfr#R@HhU*LNEv{1%tspWj`1Srd@+|jn{!gz_M$^r?>?S1LLp7 zI>z6701pK-!4V;H4m?=|jszRQ(IN617i0KM2^`DkDf_`lzJIt5>lEK7fKhx80Uiz} zfk!ZX@JRZQfJd_&^rZ#M!HM8rWj%Nd7+Q$5m|mg$UPTNT115vVGk?lra0=K8o&ffM zC-R%=^;oBv4j2cNrt7co8XVz63S1OAQgrNCUKceD7m z#}#A!0W-i2>_6aDEN`*+=ImA0gB$r?3@l(f-hy?9^#fkV`)`r=W>L4wd$Vk1&aLwP ztQNeP?WAl2i`nj*<-KzpcpK{jyq(u8>o?1Lw4TlK9xc2C>kZ4ROe&H0YFWx`u#EMt zEClai{{gqKJj!}-E6Z`4`1Jdfe(*kyAMk##39R5a1h=u?zz10Ww`2X`_y-?mzW{fD zmEca+_wC{X)~@UTt6APVu+QT4$`WuF`}H02&A1EP&2pBa4w$b}@fq`jd)U5U9rFi1 z#lPPv^n*{czV8&DvKnwN^9?@Bdb-Q9USvIh4g5R!GV2+9h4l+IGQGQn{=3EhA|HH> z`2_cI9t2-!xs)B?8@#U!eS__yOa}L}|CNdFTG&0EnKe_O?AC8`|j1DFnmfMw<4PtpPo z0b7;*%7Jq6y{o-fSO@JQwh^s&6#u%3YV$^!5humqgM z>$iz-;DC}ZRj2SeFqY*8Ph@)FNud8hVGI}tR)N!4t_Q`ZFtSp7CUU?TU?Vsa>{a%G zv%uVkPzKf~IG6RKYy%USAMg}DZ@Xok%Im??=^MCRd=(qE%kMIEfeTna4~y?&7l-zdzLi zUPRwVWiOZmCO(37gyjP-VZR11Wqmy&zM56wZd(*v(& zzXUgfnbqR+k_+Aj7J;Q;F?c8Q3Es{61n&Wxl+D%R``8C=WxYL$Jh7jE_i`LQDn6h& z%3QF5{TY0K`Bzqe4{|(#5AivVimzz9vIE?~egp1g`i}{t9ups(B=Au_2i(PUl(mnE zuW2Lrcjg=1&3*_z!SS$5d`^8zKe&hO4A!w;z^B>H;4^HuUE-Ts4c4>1l?}VZSG5`Z z2lH1Wi~?U~`rs?9Pi0As_!PB+|73eBduznkHRA7>_t`#R6WbTu$9@IA&i34mXYud5 zC5EjSY-N7HcbOjeKI;o?V?TV{vi{9}__+Aa<|*^RcIF5C7_59;e4MHt7oWgB@H5V5 zwZeF?ll2XL4rVJ0z%Ke!fnV}DPl!)$9{4q%qpVa`f!!>}lh~iIKEdxe&w}4Gzk4v> zvmU_T*&fQ&J>tV#0{+SLz@S5r9vBR^D?7jtFscrH63nZU*uH#arLqbf%KN}D-lq(G zN*D$X1M9(XutC|S>;^}G$xmZ`2eZHkJ`WrX7J*~Iny1BAtQ8!``@!+NAB+N{pTRs2 z#({@}@!%0m7mNloKp&V1PCP^$_sCH27%+0L{7zjQ=m*o48Q^5F06Z2f1CL`ql#$P3 zZsYaJGH?p$e@>VHp2X*ZQ^8Vj8tV<54(e;B~AY@J8kvEMh-Uwt+W+5w8d%!A&d&cr()nZ)H1yn|a?W5)0b~ma@M# z3X{OQ7()x*4K^v8!7{KPyoc@hPhmW`mGuvnGks+vcrV8ZcpvNQRoMS5H~0XUs>}c% zV!s6+X1QM#U(2Z1gbCmdmLJ^7bir!&CncTO9_2VwW`U2few0n%F6JMs0mJuU9bvyy zrh-rKdSxy6B+CibF*f*h><`#qz^B>o!M&_EWjpvR$Nw9a^&Im7KF@vzzQFMYzQpvw zmzn+>^81thU?c0h8S4h?o4=FCdH`SJ_2B!w9&F=yQnrF0u-yBx9)Lb&{C@FC%?CeX zKEY3TKlmy89rzj30XsP^!2@g`u#4%viFu#tDgEGAY#;Dz&KF=e+XwuH*S%#~-}3Lu zOz=Bi2Y%0a1w6=l2Y=vmz#m!ex5Q_50Q{Nl+agQ^e_?%rzcSxoKl>B-8}ki@4#9m& zIwKzfMu9`XOl1~0l)vK%hJnRkI9LLX0IS~?U)>sItFjFo4JN%KOa{j=J#Z{o1V-}y zcO*u9FL)Sz)&C`o1jqBaU=&yiP5@I|u?~RcU^G|(9!dRO)FH0}j{&Qc)!-zsLD>rW zS#EGL?|TpH0GI|I2j+n>U@dq&82UcueXtumf#qovpX8D@`JL134>12TrX8HY{Qp}R z3C`r-!C9;~FoF37XER@5BG|6%08a(OKg9gcbigDq7Cary0FzlCA4&{;o-!XyWx2t{ zjHOpLflHY_xE%DgV}55oz;xypT*3DK2=hJY2Q$DJWtK7>CCEzO7C%77H`55y% z>lMsmdY@o^XMU7r;03Hda2?CjA-@Zo4d(Li;H9h=Wu>wPyo~LjY*V&_m$N?pBg_W# zc*X#@f&KVXVJLV7%K=`=bisV43tr89er8!4!Dg_4>4VqM$6VPDUdMXt6#BtJ_FM3J z_Ag~Mcmvp}>;Z3NK0X&8^-S<4whOq4&rybbf%OB7R_21YF@115>swjE-+5)e!7A1V zxD)IGA7Q;JeFuawU^SQnKFWFlALDbngg$T=m=4x(+<}j?9>7|*r?M4%g8BRs^EVg| z?qUAGI@ZsZ5`U8X73OiU0Nl&;z-L*H;B#!Juf;b%8+?KJ0$*hRP?miyu`3N=1IJf4 z=5>y1@D)D)8_eg-FZe3U|Bb}AG=lrs&%xK3|8Mb+;~L!0djHO{-eUcMExb=z2fod5 z)?-=!Vm|;|SwG4oWpakgWFE|ry180Nn;2h?= zPZ$c$Wqm1Az(lYJJPoV>=Yf^rd_Jd7VnNb=7N&y>z%peyxDc!X&*b%BD%cDz2D_Bq z;1ZVa7tFU{2AIa@g3DMx;BsEC>;}&U`@j`!uU{?eT-GzVis^uvEQc}$T*LMP&*Sf8 zgKJs-UnPbmydU!_@9*ci3AmrX(+tKc6TtOgqB2{V175^@DEq-2-uIiFxsn6sf-T_X zU@N$R{pf$NqnQqPHS+~t%YLM+2Crj#f;Teu2HeE{`8(`pwm*0)?^ou4o7s=S64o1d z2hV%~?*bzRENct%58lh?fZM`Sj&9;C5!~0V1EJku)JU$`w93I+xahvA&RqtY{rAn@;dN2)-(A0 zQ2M|Llfinh6nv5W4}6K`0~?r5aFF#1>ql7xHV)-C$sp^W9FHME)~oEt;A`yX;J%@J zS07}(!Ttj7XZzYV%n<(`kgpGur1_NQjbkf;JVuspv`?6mgId@0iDujiV;vV+;uFpI75YS{TH*uEwqR@{<5?KP$aogUET(CED&tz{%gneI z`Yq3Aoz zxG%=Yu&wC>%(kYF?**2`ysWdtcbD;Cj1gcw7=3ovTjHb3Ga2Zc%lNR>LDEO)gUh&e z`rh*Q>FI0Bcrl)L!gw*p%rHKWKDC!y5(C5dvHT$ETlAs5!V;fZ_Oa`OB%X{uvsddm zZFHrek1Sm&==;jJvfIJyEQy^d)c9S-m(dsX21{aFZnPw}C0xf4>z#3T!L1sA%zr^? z66_fKrALgz@D1+sOUN?C^V1}3EI4%X;FUhiv-KEw!Q(WTng6WmSynB2eeiS@8Qttd zcdnth$Rk!$%<_mlTPOIM$#N(W4^^@r$?~%Y1#dFNNwJ;mUcp;U@%^JaJJAP&s{_R2 zJ3A=uHAJ63$ZDtff=6sdE`nP$ESn;ys0NCk7$Wn@{|^4n5ZSpZDgN#eD=3aUHc%{} zc$6VB&OM*vah@v~Xb~KLY+#mhDJCBqn57(wXPY8y#%zjf43WX&Srj*T(#)iIvq#LJ zxWyx;Q+&uHrcvDO5mPC?>?u(S#kV~o<4S@*^@vFn4|>EzibIYI6cZ>$dc=5&lRaV_ z#Tka^!*mx*agj%ip_t(j{S?=GL?6YC9x<9?iARjGtIi`vQhd@QMo@goBZgCa*CU2e z{MI9eQVfm>6fL`!JmLVBpJ1OyWVlc8Ngk0tSJusz9EfIj+M6Q|^sSSR()Nj2wzxIo zfIY=Byo5(<*|%p0Sp%&8Lk*GtpB>i@m>3+|*`Y053GcRy(J?*ZKodoVPPkdZT-r!6 zJ}9u)F(%3WpL_edMyu;&o$Vbl?%Yr-@+3VH!o6}*c6?K;uABC>W*2jv9oJ?re6ILY z#DOAO3N-;&jy+H}Nlg^<%68fqt2|=G(P|`^w>Qz6dDbIVj@PA?Q?Fz`(w?8~7=nut z^|TG!o*cYA-d%j@U_&xAdsUiK~ku!y!5i zv6~`e9P(6TPWmV^AR*ZhX;_AQVu+27#rwG-qWju;4*AXynWbK)NoV#{Sb9mZa;yCy zdZs6-$SeCP+TormT4S@U0gChm@1COKq)y2a56^0zGI+b4rLzptIoTy-ndeG7&CS6Q z&&Zg?0FgnFg(}*&(=(QljFl&e_lbQa-BKCOm@?J4@@qrn)9rkY3z2}u_NhibqYcrm zIzGq|`5^ap#y94~d2V;afZH80;C6;X4tQ^O#DLo!(Jdyu#}ZDKMVhzQ(fpvx7(*l} z@)#NW_9~65bgt}h>XSi?z8OaUxpe2kwVC)L=u(;bH4i>))nWyBR3qu4!DM7xJ< zqXPx(kf>DYigrHfEm5SR+Z?r_5{gBUQ)a)DCB{!N2Fh)Be)MOsRrV53XJBMh(o&;; z@^fhwZ0q`SjVt+$v&1X%b_VP;o;!H3PYA!RF*>F(Lwbna9D6*Xo%wo0T6)=*PdrI2h&VZF(6Gwi#S)hX_{gZZ|8f(MEt)5 zYz(p@jR)nfRndGfqeIjS5n(x{~*6|S6`k&Vt8t|-U9V)C^g)lm&ZxRq43VSQy^`MN zx!x-skyqOJWX;nbJ-X0nBi?R`?sVaZ?(Hl)-P60wE3Z_sztB^5I+mB*;3>N+nq_xH zmfdZ4`is*yJj-bgHZh&OyKgcU(+`KCt#5(FcB{+`_Lbib6F2Jc%|^qq?0(!Hx!GvA zpN5IUxg)xnrx>%@lX+J(Gw+DZy#4gahl&$(*KN|5dfln=c33T?Mv3gH(h%Kz_HG^& z-451Zh;BaVtsPbB$)_ut`E*3LgUvov4iD-aVYKFHhUnThypqQX`A2%Lbi_t8^BH(Z z>0O>m_8X#`d5Tqcc{1;cX679+AoD!gD94*6M|4+1W{E!5xp#Y>PO<22&(mGee7YmL zPiLC+!|u7qGh`gm9h=N2Ph6_iEV=n~#4IzP^tCS7;>jn)(k-5Rx}up+M`S+j+oukf z^PT!e8n>Tfiq7rxJfhv21;fSdx@D_msgmOL!^P*B{>!d-BM(il!2j7M#jK)u+i>xw zuHI%`dFOC(0nXko7In2d`In<2wj1@iXSlrSO&uj-lw;`fd$KEH-zrQA{`L`fAT8c13d(JEFZBI{lNUoMn#j^iRH$%^M^Av)36%^t0`L z(pY8YV@Ma)Vo`b0SY^2M#2cbr_A^F`+i&O|W3t*fQqD$e8DmsP%}6;2%{R_t*O}sg zvn!{ISjSt&l`SJh?0w5v%K4)UZSTU!d(X%`)2w+175#yc`9E-Fu_3xP1AVfxKNPV! zmoJ=0iQ^VU?9r_nio*lMFRU7voxu?SVoGNt(>w)YAJ0)6FPl5NHBTQUhpka`w=D|| z(U)%xZUY^WS*mqvp1wl^pNLptTUMjQ0Vn1QW2(%D*a9)@3#oN`QZ0fQts<|q=TDx! zSNrLpSmRU(orwy*@I1ZB5bG%3KT6z@0z}?U-zZ1ybGHK!YPyW(;D(W2I*lrJUe5P{ z;e#S8Ihi62a`(zeZMd)S^imalu-Y=62hnq;>KjQjHBZx|SpSWrnZ+wPU1X}rE3+w% z;dK6`ijg`DQzGOPyZrG+PhM__?)IMzXI|Onyyc*iO!oKkPN3b%Cp~Gx4jQ{NW+?(< z#6e?s#>{7Z2UF&tWPY#xCMrS>%BwzHuB@l{62uA>+3V~|Zh}~9TxnO`TM=>&pCd+Z z&|0FiP1`|Z8^{WAL{^A9U|rFv5MD{2oP-~YD|tArBeKu;IpzVqYMOhE&cF(x%T9l< zkmAImZ*MthiTVmh9SE1{8~c{ z7+myPY5L75`>i~N(h%)@-Ze)2UL4VWfw>Q2vA~ijN0H=S*h1<|(H0O8syda>v*~(Y0wg;^?AL zH6&;-pWIr~uOobD&|teajup`d(O0gm$=m6nk!4;lh_dhENVw|Yl*vwEC{KSj9R*MoE%o^ zh_pgUl=42brS%ppy=hBP{ceHS#&#Bf7VnVn1!# z%MX(iD_ii-*JK#FJm%6Li*z?aaO0?Aw-4bmxMJG$!4bdI2 zFGGyS7N{*-uIzVSCDmMj+b)y`6|6z8d-X6m&W56ObEj0u8;8l+H#rx2-hY~+TOp=s zKj=r?UWnnB{=6~M(qSn>MYlC+ZZQZf=Xqn-!!#Yyefo&;fujBNNJC`*v>(K+5DyB= zTkd)J;D`a+7FRU4Esp5EeBkSS9un2C+Vgtf6z$s=j2{&3&)LrHJo_qnrRR22bZ>V= z`+KxgA|7RydA6rSju=oPS2RoHi0*4irpe>W;#YXmbi{x(UC~U_5#3ti?F@PI*L!Yv zMe}w?4*Wn&J^9JGca%O^PZ=>qWN@349Gm=7h|6B-0q6z z?T#2wpFBP;CEb%HM+`{Q70omqk!jj%NAGwEkxP5oSUb4AVjNx3%f^WNb-V=IRlaOY zYyTTBk$C~4y|skU{EG2Lg6lhDv8tM77)CjZsUtG*AkrCzj_8if$x(r#yYKk_R}PUw zfJ(12%AOK6D7sf>N6GOEJzI>qjuW*b26P43^%_Hd>S<<2AIT*?oFz*Y!4-A z%_s@oEqlt-aE#Yw%x!?kAm9!aZF4IW)v2}Y_5~u+c($LO zHbIV)O+HK9>TD;6oCy-Mn7q$OGaq94s}fY0%P-$0DdQp)kO?n5h(3^tvD!un!!c_s45|v&fARy9vO9;|?XwpOI z0YV5NKnS6{-2450*YBMJ~MmHoY{NLp1n`bR#!JPq97+9NF*a$W}qNrx=&6< z_K>dec2a%HvkT@5K-UgGC$&s$% z|3@E6PWFU{j7*e-hjPftF0PT0$&qmXcXF~wYBI8yB>em*36u1%Nf=r|PG&{Aw>1f~ zSCNx(khlklWJy?x#KZoPNjQ?kKavPZ!WAT*N}`l%axx_nFD4O;gzu94fJu10hMdfm z#QRC4Q%g=3Lvl1p!o!>7WPg$P5{VW`IG5Cy9TE=NAtyszCnFI1`kogAH<|6fvoQ{aCk2T%Kefd6ZBc60LlpSyoO1o{U#{Ll9P6t@4h z6Loy+BI@ks`A>ZRKudb&+iHF%h`qu}>$#7i~sihCaj zmBHhrju;mvU%0tGV_z6o$^I56(@=af>cLGtt!H`A z`rJ^6N_2eWdGgt5-T_t-y&kgMkNF1VjtV8bA)dxYp0h=sTST3QN1aneo%^dqD@L9N z6Hn2{*c_7e#(KzfKjs4v;l>TcsYIu!ME{lmMdPtFgj4C$)5f#YW8!IV{TMe`w z>G#P2B0N;0iIL~@r>C4JSjGMIkfDA|1rYI)TUC5?(I**bn*_9d4@A7?hKh1Sqq(7K z+)z@SGThKSmFQ|xJUFc4%D?es0ufr=(0Y~VjHvTpk0a0E{nhjR)x-Th?}4@p{XX$P z1Q$1yQYBg=>Rg|2YJGq$Z~N^shQ)duU{Oa{OXPaS0d{eJ9iI(EkZ$mb8%i1lWaK&D zKi;B31-YTl|As)P5-raSRaS|nCiw|Jh5SH2161>$lSh8293J{K>*$dp!C9(Kd?OC^ zM+2nYu2rkCO=)X(Cw5OoXjQ+0OlI~@9%y5z&?i!Mojjae9j}ql%&qpEJo_6Rgg$m3 zrGlx|Xy>-nnLv1H^G=<`Dso%SxK{d!_k{NnR6PTdsxUTw;gnvGeE2lXXL_sOmCji3 z5NZ+^fZq;h%q?%gwVs1~z<#PD8iGK}J&AAaX;->4&d6WzZev!5f{|j;jZ4siciQ}C zKvC8Da2!I{x|A(L$!F4gNx2M-|Ls{QQ)z;}+pr+CqD%!}z;(T8aJj1NU92a}fTAL7 z4qRb5Ij;d|RwV&Dl_q={h{qaN z!hfpNdpqE!0u{YS@2=0(wp1D=F7~d`>x+9Q_QGX)TNKTfl#LSGfxXI7y)7DMOOm{O z7uWUL2QM+5o7USnQ0HDO0bn=wE{t_+NA@O``w715+Cqo;Dc`3vpJ}jG5**je1bSat zEBn2F8@sqCM*TWXWP+MfOB(R(6%S)W**eM(0-VKi*R5j6O}ciYY96Por1S>xJZujGbjG8qI4!<$zg=Gs~AX+QpwKTS=O)#7%h<9Yjy6ox_7cp zYf2AURY7uO8*KwDZ(qrJTs>B1rgOLQrBPhe9QIV@3Qj(0x5ZD@%Ktj2KAHoL1ocmK z(;9?@Gv!|j`}&paOV;ahFuN%kbX_T)(!%C@=@TOq-1f9kti8H@hoHf}BpZrOgv3>E<&yeqxBy$-Ia8`8g` zGXXW9Rlq~@ae-Vf#7#Fh#>i{ZzyD-_jxG4hM-k;c3Fk%U9m(t=hzpo$xA&ZQz^!#YT1mgja_YwzAmW z{j_iP%H53H2Wks|&D!rDbP9cz6<^FpP)q5*S#~3u6P5;j_qX%LWEu`tI=kZM*igJl zvg8oH!oZ6|g!!YZ3*jps;SsoJl1m@J@)Jt+RbQwZ)0O)BEq^Fmx(vp2S!OAEOC*@X zrjO9(b1^fOAteI+;T8tBioM#D(SlXK5(^v0G^5U-dtF71BTgvMt>{&e;PVKpE$(Jt z4(bZ9Xq~tlb}3`u|19FzTvEtDGN&|DIqclRM1S9P$sO z6o)jZ+;=#O24040;lrMWjyI|rMR-VyVwqUn#svRX#pI%FI>O^Ja>wosS-a_30Fl6(7BGCXUt3By>~gS*QY$00eCeac&8Tqj`q_HLfNaOUvGPS#szIG&_LnY&e^%~x4Yfald;Ti`w2lA_=P zkp(!1sf!2Aa8!O;M72(9*jZAal}E|%#Z_Lo>}H!1(u@GB?Z_)8HubGQvxBVnXPs27 zEm`mtT&B)Ty~3hc6>1Ok!JD=uWc{UCVYemWz<;@L9Wt`;eo4Rk$Jz0cL%eFGn_eZ% z{B_#CDoWRxsk?oc4I^q9As&F1RASVqtVvPWBL~*lM5uzVL?t)`9QHGkq9yPJ-cnnQ zkAY#wIaL^O`b&1l?~xt|}7p>Sy*nRW`Y zGzx-aAp3O-n*&y*M3cPy)+U;5aOFvu;gm?e&FjTV<-||K+z1wD>k|>*5CrCRe~$8Q z3$!Yf(_q=!tUpI-w*^+5?0jaVWz>X?Dn>#bFD$tRj4%us&i0h$}!_4AMF1pqIwI;voEeIN*nVvGp6M?+(YU{F*urz|Y5sAvWzNhmRQ>`#orA z!aggqGHh;LJz1ogYaWN3N1_#KJM%)qKIHw*#cRd`(Kwo0QyY=!-#Jn$vZolVuBd<) zFh0ZKT~eM#Qe%HO!_t-sUH^T0fJ>=c-zSm~jjEOZ>$JOQxed_G6X;xM5I!t`C zhUxCwQI-Ne$Vkv$kBeBbr8VZBzu}rv7?eh3AYp_FFjML=2R8Z%ElMIIK3!B)DXCzP z#N)PiQ&!DVCG6lTY36*l2Ap#D)`p~~{_^~Gu574zi}jF&%)R~F*hAxb1#{xdsn6p@ zRw+ZO#$Dhy#n|4Suk)f&Yk%}-Y$(K$(NPjcQ#|>X;XufAHedUg*Ip!WgkMTIr#>@} zGS#q8!;GW)%)o_EAu(h@YcO&Yx_EauB8B8s`(d&Udaeo!_X2HE z1$zTBi=)CCiTO{WLVQ(lej)e^AoHY8M+UqMD!A9ihi_ez&5E+A<_uviqIAwh*qyZ9 zSqBg8Rhs@)TG}HA9o<7|C*sJRfvGIWd(JRxwOllBAA!>u@#bwVP@LFtXFW1=o`KZ( zd?dQ1M@~$V_(|wvKvRz##^prE^e_I?p6PYt3>IY3IT(9uZJKm_`knRj$Mqp36b+K= zJkuDxNIVve;8+qlyp|&CaKa-D+6+&As1Q<%-91$7J>0hHUU-`n5uH&b0aZ)yf90&Y z^%b#MK7vuIHUfEJ&;c+5DS2e(G4EE2gB$nTlWs1;wdyCJDPgo3)XU(g9ceV*vsm32 z^b6gbu<4gQ4-4He4N4>E)hRVqH=-41+K{I3z@XDw;J=OG8?wk-M3K`+DYi~0oCa-3 zNz^UeJZ#cC>T?phbP1Og5=-bYTZqVvs@71Et^hgLL-@yXs_l@eclVWfKhU_c*%N|l zl|Q2^b(@pY%5$)-DM`T!j!218rAusSu2&~M37_9Qb-yEPttt3)SW3T6c~{3P)}>`D zYqqTE*;Q5?)RL`4si@JkWr|nH79SMdTScTMesx& zoxe)v{b;g8twmLi1&JeYk!ZzOBy@U~PA^#X4WZ&@rOfBXMdW;{OCdZ=y)}Qe)G~ZV zp|-f_;N1RO-t0HkSj70o63lDIuFaJez%6@XwbX~iXI}Ui94Wc)&Mj5o)?F@w&T`{U z?ul++q^&6YsZz_hNHa$*^&5XoI(Bc0_g9-${oZZn7eU*x6IEgToNGP56qzQ2ATBh= z?Eu?S+xwh=&nD&L+L5dsIZl^Ot6XD0+-mu*8p5*5^XWzxT18v6F`;*8uHnV>p&C7ObB=X>{f--#O38e+tl4U z5{73pzHITPkC}`y)V7o-;fl(RFz6AR*2^K(z*MAAJq)Wkm7sEw_gv=iZH^XbH&b*q z99aLv6e1;4&9&{HaeEE7TUA9G{g>yEt!ZmfLY7NKijcM{wNwz(w$jGa5POz@*!{wNa)W*`vJ_Lktp*~=$rS&N+$_vYh18^@;@ z!SL91Vp4y^p05Fm#Lwu%J~|W}mN(-nYm^ROiYRWH!^*Yu|13M;SnRo};~kzx0~N!+ znqkg=kR9c*FCCGGIA}Yudf!$OQRQV#1ZW2(kpyqEFfUa0soG|C>UduXau1d;^M!kqcNB8z!EI#oBUKu<|L0_02bAnH zM!9IZ2#!%Ivhu1gpB@gZJ6`8T?k@joI zuH5{UFDjzakFa5aw)UKEMkdyrq9WIrb1==S)&k}0eAVKueV^jnk4`~*Lb?GipWIGP z?&TBCird?J0{PE!+mw1I;YRN4HG#wCZM|d7^2>B5^@_XsCo}y>)Up3_1o-LY#!lHF zDAVI4+JXDGj&t!)v6twq0um-E8Xm+xQ`g>7Vu(~gBktdFGF}Qrv1dW2VUY`09q$z! zxGPgHX_N;YrSe;4E@sb00O-pc{M~kk{VXAjD)cNhY&w4OVKhiZBq93XLAvWN{XnR$U8mxV8trxpQZLtE_T$(C#E;DBdJ&r|{0dE_x zF1W&l4R%#JVBhpFINVvy5M|+9e+kq z+k+d3^*bHONq@7&1+dGU0?E0=nhFd>ZK@Jvbs+{iUyb0cs|#b2l1h$7v#e(+C~HRp zx2Q>C1wJ=m+Z>tuqQ!jJH)U_bWOhRZZ{R5qJv))*G7m3guky5!bi14MM%2fxxITaI zarT)&EqSmDF76q@M^mQhN-{Z;eDa)q4d3g2KiET!hjUwA<7*ZdV-0K1lLzY|1{)HI8 zy7hn2%TTlqye=y95E|399uwN+4a?t5ga%tuU*n05Y)NGV1iJ^+SYAdNgtkdn zzx=!&fO@lr)79fo7zKz-fb`6F^M#hvO>(fIl`!!vYX+NjRvBjDai=ruHIe*!ELb-u zq!uj8at1M3W&-ZW*k-PK!vlH=X2~=&*}H;GGT1|gvr{BYK3_4yJmra+5M)_7esn&LYv>UHqNKuv&E}8R%IzZ}y2TyP3Z&8&<_TZ=S zy?K%RwgD=I7o!(zInm&+NU3oK;5oDO(e>Xz=cjEjvJQo@Ws#e%~Y zoJ7NLQBL{6r5X#xdl)3uXHaY#)-@pNNRyz_`{I`&eG0-y>oPh@`_d||c0nWVYu6T{ z;=qk@dF*_|QK{fOSXLfdt~~Z=IMbUeb`;vUk<$E)cVX6f_}(WIA+$@>Om8kSGOraE zq3+B=l+~-y3(b39F@`j6g`K4?3U~LjRw?zLXpWrA!DdtZo2rkkt>5iC7z}CEj~?g5 zQYzC@m$W9{)47aR7E<-W$E1UrIF@3rR?^KC+B=;@iN0{E3@79`CVfa1ANFmq*G z!b=QWQNdc6B&*0V?$VA;rHtsF9zkdeB4}U`?cBoY9^m01W`%Z)npN7?6NCGPvvt>h zn*Q^rac;hy`QoR3eZUtrWWHUeTr*N`r?H9~uURzL2D!^Ny2&B>1A>+L?#B;^7B^e4 z(G!gLvXyJ(9%cYu(Sr?CPq*#my|rE*ci5Q>=-p)7J(}AJVbr5lm}QUjvflBF^YtB% zisq6!X;~V({~6tA^VTa|W<44?%A28hQ#Y*V3A^kY-hqlE773xoz7XpaoXQ($0QIGe znjn(igsV~*a#115J})Qa#856R8zf(&&7d3#g%ozrugUfMT@I`?uA)Bg?3#Jx>ByH_ zSriWwzOr92FYZ;ZONuwk?N=>Ywb2867cGf*bOO&adee%3-(3u8bF}CSBVliqHb+2YTF_ISlK+qCR;GPawAPgE6SbdlP;k zVbArSN6vm(-y3lmw`~GWNvLu{Fa1K`kV~vbK>BV|Gp2-x;G}`@!S4|zn9ZTTRQ=X6 zGL-mL<7NAITA42v^Uw7ib^GQbD3w;kxevoiGt%7h`xopx5|;Wp z*wJ;CoB4fx?=2w@)gk9Y?aMq#y?t$)BMJLn4+x*DJG|Tkoy1{F@3Tg7yCBK(d z#n#M*7q9@m^TqSoh4rr1*A!{iZ8D!(;kcf}UrxhZ^_xOhc~p_ASFf`oqN~1a`G?$^ zEkr5(LgR0if?Anp4y&G7bSQ;0Mm=PgX~|#Q6nARJ0pG@GhkVz}oX9&Y2r& z0c8qfxF+W1%`rDdLi->wCE_yr=WkFl7|P86CTg5mR}~*zHm-v9^Y?3Q51`bYqohY} zfPTu-ImDGC7Q(g+2gi>np+JGPI?63Ij12E)V;E#+|1#1lw>U*aY&Rh_cK~0L^2~Y1 z*Ir}b839hGyT=tLSB21XYC=2Oz~Ch)7L}b|Slu;Mbu#WC4TI{P$)X^p`T6Y2ZIxm@ z5qXD?Bw2mN2yXg9kg-OBC4(FH5|n9&`^I7vW1xKdDk>&%EZ`T4Jb-h}!~~^udKgg^ zjoFDA<_IU~ToPN86$`6;g~QMVT#-JjEq*xx+7slmZil%U)AH`p#HPuXQ70~;V@_u= zh2O|sv{)EMnfNDUM)h&{>&E&TG?KOz!=PckWn{!RAIaYbW{87&-G8y#?h${q?AQGT z;$nq<5YOd5HPPO9us@i6HS7mDd4sQy`ZHWT=hcRIIks5n=VId*CmwcN_TP1;ALg)(yewIMFhfr?YXjcEM3Aw^-CA$2v=%gw^q#%DmR%=(o<9dU z_v*#pOHU~k+r-E!tb6|n0D(9Xi@WRaQ8L{9i>Uh^)%JWmb3cY1H=WQBj8g;#2`Dq9 ziYtxk(5Cgf5dvZlKjUj05}aPmR(slCn2k0vBS8PMu08q_^} z+W}&MAMPc>MLJsZx20!_@5(sup>Tm~TrJ*1Di{|3!@s@H=AoCr8C2Fxyj7?zm28H~ z!}Fl+HF@->4Jr4QtMllsih>n6)fEJN@_~ z8XzwPm8$Gey1HD8lJ`qG^Y1DW)5{LyjaqLEsk<`0g_vFNfb_Gx!j&#YBt|4f5SEr5 zj;0ouP`@)~+H&DJM==PrU&2YmypvMqDt(PFqsl7ZT+Rp+tV914x+5FEI(+mj030))}5qKQ?ZT6&Ko*mH&z6PlzJs*~)suA=^-a zUSy|jv_#il`$MA?_~AE~6~9TNaZuxl#1;!tYxb9jf5d0Z8$%YTa?%Wj2`V&%;Xvr* zuXa+y@$7?e6zASK`!nvq^yax`_Sn)R@8j{L#>0lC>f({7W$54yPrs~YeUlO!k*nO( zpvB6nK|vaqq0XbLHb93gD)19vAC8JHQT%=A;pEa*d8Rv?NTe8shWV^6PruT;I(e~# zFVW@N7hv~b1qL1J=H;{YdnIL`eyP7~54vau{4~^e2}x;RuFepSmzM!P;iy_dO-ssl zS4eEI!H*^&XW#WP8Q6}4Tf-P!`jK6Ay>gqGP1m}oOVlTqIXZ69rTWyvGA^aR0Pp`K z!G2xTG+S-*EFgSDSkofujwD32wtR9c%2)3zFstFcF&x`kv4hb7I-%_sS5d}wHLS_-dJ<_rr2wlnk zzVaN}Z>>}tm>lAu8fFO@U8<7tw=AlL*gR()Sxy6sEp6Wu$w8JYfxZv3sVz^5_ePE= zsu5TL@-!$u{{7>v&RT>pIzN#Py5p%)f7NFdXkzhsV3WC>p<%8qd3{b*Zd=o|JwrE> z+qTci9^U6%nlBp?H7ySuc^g5q;WB2FepSTfr`P%pOE}v{0~NYYm!~c!o^h2-y^j}s z(=@N0GQ1s*RZ#*$5CPo%Gm!1#?Y^K({Z%E8Ay3~Z*#uzSDRtL;5p?}cT-C|zA>W1% z5~;-00%Oi+9*Fk4^NVvDOS|>eKh6x7GG4A)j)ieb16z>;8cT%PVbSyQ+!WQ|-&{}yh>LN(WA~SCB%md%QI5*4~vh}@uPJ~lEYL!TN8VFdXiBlt@@@izXe z5vAlyMt9z>zjW4H6}YT!``OKs%iV4~em-u0x^W=r_9QEvCQmHXDV8>_L< zPl9XJ^3dFMWHDfy)*-Ds^>>S1qDQ^%I&b=5_N@EWz?F^FGG4JH#;5p4bHuG3!bG*- zdnQf}LH+urv5AquR!`j;v)107+aVoUAj?cbR>V+-)$*yh+f}>L_JJ^ig4Gc5 zwc6@s-;{aA-%nIL`zOAG2&jdKYfVARhQQ~Zp9(QN+`LE;_T#0mTS6c+Or1!wX&C}iGi(1BU zpo^z_fTtkxi0=dK!-J!g0M@Ihu_w%nFBI3gg0qZLB}IfeNJUT7H6gU5X_8fP=}kfzXC{* z13#k@SbhS{Zj!*WpY(!{A6EZ>?^-QXmwad!5R2-g=eGCfx&7SR(Qx;k=~a!NS{%VixXhE zeXlN0CX5&{7!Z8X8Py>eY-@4=lg>kIL}mO~w8&i}U|!q~@(}A`Ib6AQhL9f3r) zs*Bd5y#;E~Htk(aIp;KZVlaP6%yV$$Ro>ak%H6ZhTpsz06AGMgYvBQ8J*>YvUreQAXW_7y56}-QJKvXhxE$1veYUKhaHY2mvL{4+7l%W7QZQq zV^#wcLq3xBmPBoH2CJow%GsdGL$mCI^!U}fv-nEc$-k8)Z7gOqa!ty0F zXqIz>_*C(7##(HpCPAfscD|ck6vH+;eJn9mbPgDk%PEk!3m!CoRMm>#Nbk!R(sclI zMOE*9XAtvgESk*?snN`i#*NmruhhGe;I>K!^N6msZWjW1PIxpD?_< zjaA;QGK6`&nhc1;5jQviJ?TKIP5yr2hV1xeaB{=a`2(cifi^s^%%Da*&sz8gLj>$wK_rDN^G1)uO^93e{wCGv97a-XcG)ol z3GeG@$w{sc^BMXrMi_pAws&wN-tGUEQvu^*VCAcl^jW^JPYe3831Z1x$bEX6cWNs` zk8P+>&W5NU*AABg8jj@OkshDx`uiwXdPxej7#8QNQTOr(B>e)P{;f$ zUTtAX08z4VmP+xPOg`LUN%hXeX2%_{loJO}-(rTh%UmQv1^egO)qEWEo=wxHDGhSw zwbQgt7$|1ezS)5D6fUf!Uuuvm-*v%dHfHeBYS~F@Dh%jXYS6Qpq*2{!r!i@(|Mzg` z$jORzDJxdCrWws}1yN3yZ2|LmECXeJBAIO%aF8B4Q4Fs|^m|dHm=3eT@lJ)mVgI@qStyRLq`wvCv1|{L>B`!P)7~!X7LAhH7B{s#4B*q3-#8{%$m~R$Qei-N zHkTE0=CiRKDudY{U&U&P{wMbeBGUIhei~kayQ50ySW7YhLAS4dJ-keNdH!DIvZS5B zwTu0s2Q5wLYKB*YMhDvQ7pd8tXU*p)hrBZ?9u{tem|AD}L)qhz9vy#!i8;k-%~Qo- zWg`I}@$8`NiHcu7OzDez{ZlGFO&ufqv#aY@OR~AqOq_#IEke>7#s}nY&b(*!oiHzy zsM^12ZEhqpw^r=`;AJU{g(zIgs;4~ax_epOj!5ct1I5xPLd`eyUWzuaP2ydwX71&} zZt1BpBu)*Oxw}i%-Hpy1?!_vBPwiz{d&)NKht@N`^()8iM~Sy49W^HmdmTkD+In}7 z0)lS?#9EV=eIkbcyb3dj9JX|Rzi(YAB^o(wlan3ZtS1^aaIuq0Bor-jPG%_WpGjiA zoG7v@M$K3P`*i@N8!8w2H>1w-9+F7#Xg*}=IQL=~u(B8{wIxwxV7f>ZRL$)3{@3iq zV&^ELobH#6m?*ncnEr42yzMKbcdp#>3je&n;4L4 zP5>l`dF3mcB4@Mw;oDzNtYsm$B|D^6S46xA0_fC;auwtu`D9=Td$$d$NdgSQBUfEL4lE1z?a{sL|&<3&SfE_k0;Z*qa; z9g`0__-9ecPjM>Q!_0dU79rtU@|D~RA=(`V8NZhncOTb^+F+dgvkK`F)dSf>6!!ef zkk=vmO^zJr%aj}IAE7)U%X0lkij;YMCo+{0uwPbVvf5ElNo;plFy2BZ6!J2BU%fra z#vb?b&%IqDGFmDq3J@?h2)%d8Wwd(c5O>dm}CiypkTzI(#67wHr7eLJ7WcE!`iWgnS@bSt1XKDrP>~h>ngVU)DpNh zIX!Gj0FY-q)^TMF3+V<{SE<-wjM{dd?rSPK@fTMN1HDvbvl_Ai0U6Bj!LE1~FIfz+ zm~>DFYWV0%JN=4_Y0KNhR`PN&Q6(TJq~*MFDaRh`Bef;JZ_0BEL4G_Hp{(THzv?7) z99?;-kbHoZ0)FG2O8am!~@uod^wkHnWV36ong;NZ3!miRXF@H}c}fkF$Ah z0XWNOMXGzh$S5AOW*l4I9u)z`1vq56+R{^bb$^zgVD4MX`WZ}3ul|s;Y+}M!Vv-TI zRXFGx*Ogczqd}AVl6YX06)L)rug!aSQrY^`3G*>lG94n8KJ=xn<@mz*F=Opsd7nCN zf0(iC3Bzp0a8C-)3BJxzG=I?@(9ElG=M_^2&&!*O2m|%_)RYUz<1|(}{tsW(O`@wm z#qrcBr04xALf0uQRQ)R2t9!g4T3(3$^;iM?hVCM-I_}cs&p2WG@SC!2B+-%?)I0nu zaJ+pWUpp85i5|Ik_Gb~|*fzK;4>y+1^KQd)c>h|^mwgjenzR4PCH$8>hj*J6i9+%= z>lfa)&W{?ecpnGbx0%D^jtTlm#4R8W!IptT(1LK@2J;stAPuUMQQt-V{yq$ty&FrS zfOcJ(DkPkxBS1D8Hzwr;u7(xqUuYVq*N5=5hVTc3wf}loC-mWUFgx^5h{ofuL$2+Q z+vIh0pkxO_l1Hd8Xz>Pd)gW;(${>y9Dx9J5^s8R}?oYKp|1b#^ z&3lGE%JyLwdK99OeNwtT`oq60$)Wo=SoU6vh?~q(MVp^&dGgZeFQJh7-4S?2TYzji z-7UDWrP=b$zzKSG|sAhDlDIxlKFHX`=t?m&us0>S)x`RjrSUvGi9q1d=P zSb<}rWRwtyZWQ+E(wFM4fRsY|XsnF-^VJuT^@)3{+-f&dqZN4tZr5&6S5jK*+%-+_2{qFH=SBJ;_Yn9ia_lA1A1`Qvx{tkXHBtv8P*W(lFHZB}E5`GFFSc~sGQoo>ca;pBp%#$1)Ld&)f-^_o!b2s*G zKBcdrtD&r+`NFB^^{~&&;jy%~Gi_1Qh=||av>ENyN6Kn^g;~0fC2PbvShwBwt&RfS z109qe(=0=!^{%UaYS5<~qZp$UrQmZB;A^>Ks63@u?WvH@GmI-M(0irp|6JUCA`!sK zMl(GAUg?bdeTjI9p#o-^hAAf!Bc7q9)?~D__gM?!8Q8bYVhFWMx)|c zu|{>EE#qiOpTzT5=3KEp-^C{!O|W!yX4AsgkH}`o@5G>E;4wElZ+8lIhFP53p%rNi zsm*R}Uw=U+->Khe(@FlHrcS5N@2}g^eZM|_eU5B^+=h~aB9|(16X>tql zix?JCPh{;>SDvg~Te-VJyTY+Tv2tfc;(jR2jB<>8j74Xm>PblADzMcHLywdlANN zx80XAe~=#8mgOqJ@rnLXmxI=q4&9DC4GklKfpI=2S&o9vPodu$jUFj*ATrg=yR$W> z_j8PjuuHhr#CqlKoNR8pAnjj#undv38$}}i@@u~6;6!gNCmA}YE_tqCVdZaXtz{o5 z{Q_Mj?qpc6ZE0qKWc^Jehn9YQAGWL(WDv8pG82`l--&#_{XhLV|8x{{U&<~^dUw$l}ixW}Z!_n_N;2;a}szX}OWDJeIYJ;bz9FD4T@$kr4R(&q<-w87q%I;aElFCx;bjUU~N9DnFrB z@lP?xKDlNz7wlh%{iMSPv;=JM(|=jUQnkw~54pjff1{mTT2BxQJ{((#Ugu%s5|mJx zzP9!0z2`F_nG^BfVHqHU(CE$INBt99*_U@FR;>bFh?ciNR1_6No8EI_vMXmy8W14O zq@H-gC0(UFBjUcpr;k=X^iHmv9BuLOEgDu=7gxk)XW@DNR|S+TQAtxX;5%Mr9|`kc z&c*OdPx|K+1s?d8uotn;1y~kNIR1QaS6}^ELewND=Nt#8McyZ1PYQkeam4%I%gyhA z6dY6>l(|$^WL8uo+0^+r$8T+eO82uC>E|dj$vDV!ujO91qA*@gmgf4-L~5h%AzLJG zCnu7}ll7Ck_?UJ*d+?OzJ53Gw7pgt7J#r2*j_bJ;xztuv#)z9-4C558*8|DJNty6I zhUGpT3$-T{cV_Y5-_@VS5-Z0wmnzAr2Z?~r;7q%k>)H{;!+#4ZvmJvSw;hEqi!ZG&mGA8*H(O|LEYr2!_(?TF@qsKT zrZ`6Qsp@?SP0Bv5eH1nYxU4jh^y&)^yU_vVDE^VY7^Sg^8%y zi$c~yo!h13Y zhh^C(9kFNe3-?~_{0Vf7<+~60?EB&D`0~JAOKKXattYG?{7?;h_wO6WX4l^B#&*yj zKVBQ}`}nL>jdnrJv(mpox#MZ_#l7(H5WAXg1G?Zh%<|(qMT)B5pDPK~j<5}kv>N#% zenw#4PBcHGH<~yxuHH`JxxLR4ZQN=Y&lYIyUsG01FFhbEHX%x#dA3JN*~LFGL-7&1 z^nAzjs_BE{JN*V8=f)7a(_5L8Kd(zsT98}EL_fXug)EUWm@Jr7=l3FV*2H9Z*Sk{@ zeZDen;<=i%p2jZ7=M});MiWioBetO*O`g}_$vr%-*`beOUz3Z(`QMOyBB6dN@KGSX zzv!)8ecIN%)aoD2$Kpzs2J0quv^pA%ECfNEmbgWYmoF$hQ5LdLueJOjUd2dr)bB$BCta7{S5t+#*ULD zQuy9^ax*iYS5N3Z#oYBwvRpE&YgQB^zhYItGk*CeU9aa-lJdTt`I3}W+$(Y`O5b-? z8Xnkj-lrzzDy1hiDW|XPQS4EHspcr>Xy&Nr7)Xh)3IdPMu()xC?3VZ6ZIRNG2O2e;1U=L!K9-MoRJy1s`x4?&_(2bG*3z zlhwszA(=Q`K#tpi{&T&S{L7OUdp0WXu?M;ul8=@z!_<3~xf8;$zsldbF0H%s^-KEX z5d45*tPk(yoV=hk>SRWV4oiqcTu>3sC4@~{?$d}R)@&}ogfOyI6PVH(+jv1=o!97k zLFR84HC8SnJ!}ky)UM=#6yfCTWa6Za5N8cd4RsB-?_a*xd^vn?`7-&EKe>71Ew3$I zCiQ=^ML8yjRKn@zsOD~l($z5dlKng7?vN%Omv5PxpuREr7MVL4-G3&W-CzIBE6NiJ zKC*Z+4RU_6QgS32GkFGin%Rv}iVtkn7#Noa&4;25o=O=v<5QK)G(X)|VF=#r zop{g+kYpR{jej;@X{W34yt_Hj_cp-{s5 z31YtOFOe<#ar56l(~B&P5%=G=S}736yJC5;R>$NK}ohq5Fi)Rea_C_qyvxjJ_;}7x!INRs`(Eo`0W;S&tc4d}>L~Pu{2_&P}FI z$;L%RN1c1UL5ZS`MvlQX>TbaGm51NU?-3~Z$RS<>P(8t)Rg@gpjDzn3I_;lIZxyrr z<4IzJv?AXS(YTCBiCMTe!0pR6J|25c?m{jCCkb5RXDo-*R@VZRqoZj58OZ;CU(x}? zms7Rllh+GE;xT>i~;h9kR_y1k_M zK0cbd5y*4a+2~a%*zl+6wS~K7ZE$#eQQouIpmsdx(rDx5*X_RA+w(Vq*=zVREocHo zJ#5?8s@nH&>D~0JY7$>Q7A@jk5(>j8YO59g_1DjdXS}g5oq1%cnF{~EOOx%z6}{dL zu($p}kc~F;?6_N{(wZJGqvejiMii^2jq?kDkToY-TceS3=XAWJHqfS@H$^)^*Ik&E z^&{WT!|Vy)@cS7zr=%ZX?+&WOYZOt=TV;Anqy*p7?Pnc(Q6#nn|3UF_Ob5wrKwl~x z@hG2Dn>S_R!7dbhM^i3k{+Fb0TiFZ7M{iZ^v~n%$kV8g`^{vJVdd=IK1YD$rqp6$O zzCvb)sq=kC;EPu4xP9Qu=Z_4yp4op1{TUo6{57GJ5$pP>!LK~%zRHUXL%2@-#_A6h zy3#&6uf%U(8a>~+erS6sH7zTgj(3;QV54@_46{@D{*52YKbh`G(Gi1H#YFw!ks=L0t==lfrkzCqJRACGi<91suCENKtK3Nz)i@ z4vJ=<9*VI#}HJ@HbVXyOoCs)%mEvVMt z^y@3h-Mw-3XPH*+kFt5pZS97-3*Nl4yCr?mT~O+n?f3ffV{++wmcYS}34i`xit;er z=+0-JiV@>G84~?{4~_k_MLkwghnp3Dg@xU*e%F*=x-dg2VuhtBv%fC{Y3b6AbL8EO zjeSt4;67l#SGLC_JJOuX=(l1hk*dqfOxvHbdQCl0IG2UKcjJvd{@1soMSG9<{&BvA zjJLaH#>spc{@UfnQN!BcJfGY2g>(vf=Bd-;<7RRDZag0v6G(?xP6ZrhOAD4VUvT8?sq+L)TOU5Gb5(lIJ9?kxp(ee94u^Dq%R=sFjaz?( zz2XtbVz=2a;=cbVWs`lZM@{>y^k7w7Tz6m&2VMW(Twm_UlXv%7#6L*0w0y5wHLQHx z28R2n;UERXl>~twZ06h+GD;k25>lFyj7f=ff0NO_fAVD@+`Igl+8vd;1DfLMjLl|$ zS}lmx!R_mt++18AUuf~FvU3hRiLCEud~kOz+4!Ma9yQolZc5{>q6h}=;opxSAB_0T zun`br)UqiRVlh2+5b130gRd{3Z{vxn(@}38_?wryhTZnyVYpqWoXQ7t?IE_L5^C4% z^dluP*G&P?kXHJ);uOy7Kql@1`rq_?qC$%O>QXY&S`wbC+7_QaygbAf$;*#^yqq4; zeE9gLuD%84!L8>)w>q1$C|EX&ssD-<66pJGm*2G+* z@}NTl&mGiMa>id5uF$+HjD2lySMZ`(LwmJ$^c*WPB{Te;;-+}TG1u4GHyLH@J@;<| zKU8!WMjA)C7I)^21Cf#wt^#l$^*mh?h z*C6VK4^bk0cFR{uO`N-MVRj6-#J<3^J0+45r75khw0Jv#-b=f5ZEz`DU`OuzOWB!% zXk`Iy;M)5EwW@p*yJf94qvZ)TB`TNGpzcS1Xup+Jmu^i^H1ARzyPiC7PuWqE;;g|J zxSbs)33a{%uHJu_%IL1-6)j`Ds4iQuj0!|0#_`~9i37rJ{D_FgKgXHIZPm;6zPtGT z^nOs08z+}useD32v8siF?y%Znm8}%V(AD4El|zh#(8u65{uBXE6f?b$HS*3vG8}CntS~V4%%k3$F~RLc}D$u zFE_h*UJcUin3-5a)deru691O%TGG4Fq4R)?f2O|%f%VrDJLGvab)%zsk5){z1^3 zS%46r2G9&JFLmJ;$FMK1`#(0*a_GNI0QHjI0Lu<2o4p$hsL<$#Oux& zw|hl=?wl#SS44>7_uWk4UK+1^VBGF7$=@k63f?cXGMuI>!R4OgDt$*Z`gNg1tY<@* z87y4X7dqF@Uv)2V64=)GkfQUYhF_$^V}`K8Wz?Wml$b7zSg7anQo``x<8j5Ouy|%( zCCy24?^Ji3_BAdyRLNe)D_L*caAs{{7Sje~(qDksP7z)*hTHRkY+L@F!q zY}R*2EGL2^9V23OvX4k~e`-u#|14-zaX_)wi6|C@x|Vf3-n+Vc zRexyBvNn8mhT7K?UDy^{wyu9oTj=rb{yxnkXrd9N8#O@8tz8~V2}ZVAgm0{s@GF9+ z_T5N&6V)wzet(tPR?Qq(*KCX@qq+S38uEf8b~BK}o!uzpmWDQ|a%$Egk`>x0mu~YT zs&TMBwzoN@Kg}pCrWIV|!`hy*-*t)F<8(j1+#d!(UN{;}j-h;#5v|`6-dswXnrV5p zff=rVDA1h42!gzaJ)T}9eC^4#D$z)9CO(QLrMp`c|7h*OYc6gf&^a~`L;nqBv202c z0n6lcB{%8u={6qx+U6<7uUPvBowRdk?GLKsAKB<@rIRy{)wGe9=Ob3=Z39e+Sg9vR za(;FLfxzYVZ-rl|iap<3<2ifi9K_3dhLa0 zRvuDCXoH%cyI3pUUUhsytDE`tjl=WjU(>X#Ip{_C;sSWgA*@W3BNktPB-JA=UiNNU zE|ZpNG@`On=b30Nwe81BsppMsXiGd7<7LkC7smY6Vb4Of#9>h#^g|!vklNyi%D0p1 zu#~qjL83FFUvYcm5gc6Ju8)OM7oF?yHC|)=QZV>-1pCbM!N6VYa4w z)sxTa)$hZ!Q=sP1?#_qv`wz;Fc_g)kEZ~1+K=hIfgObpK>B`E)*RIa;T`3+<-bfFM` z4)e?+AtqtwnuLg#3sK!H#49j6dxba%bN3TMoP$}}FT~q|LL6TUo(JZ>8-~jvd$SPVgn0_)y%j>#+#PAyAFH?bCgvgx%$9lTO+319{}V7r{ucTFHu@ZGeDE=Zhq-SJ`W@yZc-BwBtU|wj4(8s+g*Xkf_Ps*< zfZmi_iMED${-Z+NSdDg_5aKR+LvFhe_4ExcwTIq}`voC3!;HLBh?ijQMfeGr)yVhL zFn9K-_vN-fk9LPy`2zS|dXw&edQ7e0u7gxP?4AB7n~JDz}f`IAEY zJIwRPg?QvmX!lX{MX$AN9lX*mlkHFlu2kFgH@5|GhR}=c)<=uA* z0TdVKD%HE?NA6Sam7ly@UJ)c(Nd|yqv;p+4`)e4dw5h*zBif(#R)9Y{C?4?e{X&iZ z-yqpGz{e;YaP<((YM7scxfgi-zl3@#{S4sZb3$N9h)Xd4MJT-gPnbKAPc`UB73jrm zq9=_)+z#_R+-qR&g1Hdpn^E}t0S^N@06l=Ufad_402#o~0e0)Ry*>^&3OEkdjPKj_5mgUe+c+I;0u5= zfQx{@ThNz)djXFF)&brL*bVp);Ew^H2b>0c7w{86CHid^;9kHIz)HYVfGA)q;3dGT zfZqcA9^f$GDBz2Le+Jy}Rw3pA76KjxtOFzg?*jY^;G=*;faCg|kRJd9Xw=Psy8w#; zj{?>Lh5$bg_+`L{0iOnZ0q}Le4*+ifZoD0170>`!3g`kn0~iOqU%wafhk#>%Zvy@W z5C9Fl6>vA89`NuTbT*Y7k@v_yB^TgyBAAtq{Cj11yhFbW%fd=235Sacy=rYw&p==Q zn(kFAl>NzN9sR4<2)QS&g7kMUThlo3)UvkT)vNl1BRQUuveT0;SusG8egpDZQ)RVY zgS9{9L$dfxCk7JDkr-^7qnRv;{L4)?l8Ei<6-q|6k2e3r$Uw}_uRjxyk{k`4)~o%v z(XC9@zcZW*ix)d>$;A3a4b2ZW(qqnjae9SV9j^)VJC_`YX9q?TLcO6oAa@6?k3>A1 z6C1~dg_5g`C(~m&q2C2Y`YkOD_1(#Mjx~xbrJGwE5f(KsZmjRlK1q9m%D+1z%lv1n*mNe6A)?;a* z{`T74Ox-VKq<{}=laXkqEtjL$3nU5)CGHsuXCF(&NrZ(e*+C*#A}eKTyGbHL+c9*c zKQe4u^gv_%nrK#@zQap!J4pspn5M>-`nJesl4;RC&ae8$hQ-Y-^(2Wo&@~oW4zy7s zbHdFjm3%Usp*Vy{XgYOk-*PPyNpCnTmjaQ(&#%65(c(po^&P3v(Qq;{KoX4I))uO8 zccrw@>RPA}s7{cjlpb8tkWXoi5-BW9tiVHcjs2aoguBo`QaDWZSa+vLNZ~6XMIP{} zw_o+HD9LJB&m9x7$qR|fx0MrGAPj?Wv#4)sZfU8%PuwR`>1d`={#^vu#X$S}#r?1? zX>6`vAQq4f*!PHd1hxlIxxQRx*$ZRggveWlP^LclNHG;On?rK=vq*+VCWL1iOPMv5 zh&+`}3c^PDZial@XDAU3XNVjMls*h3Zfa>l$Hc;!{?ytuJvqYdLoxJS(}Rs@aJhv^ zY4uCFT=TmNjh=`K^+9TPGPmKe@zYXO|^&^yZ3SR{A4RWC%r|0~(Q| zFGOiv(o#?74f4z(8nF;Gj=9UjSt=B$$L&cHCmEKKP9kerkZ23q**Tn?Uy2Zm{4oaN zELnu+D;PBe4)u#4XjF8YghI19+sDNTft#D;^yUa=e`Isf@F-0niyv4_0fD?yUIkTq zoTNtz9ON4**-i0uPjr}Sis?X7rMxVwI)W;6QBx)&G%k@5)?g49MsjgQlm{A`>)SGf zn3{z_um~trp%Vf>hyrz{qFLqMg=VLhdJ0{(qzPjlY>+e5GC8BzFWkF0jfThdga{N; z)4^g4%!c~4*{GBbphUS{&i{)aBvLPji#+)d%t}(Zq-PS&2_*=G&@HMwZQy#q+-Z+ro{u0J#eM?h=n$uKwvzg7|K>7t)>RTF1ijQk~fTpS#rY6k? z2*(FWkS>>8GN|_$9kn;+ZHs_QDpdW04T?ta+|YUoF}&PShBeV)K`LWNp;?V19@64H z3*2Zh_sLo5!Nm{ed2c-)oL@vPg%lR-CtLl4Eg0Q|yQ?s(gY>FC?oO_eyql-T5J^#G zX&g$=&Nz)BjG2gKQ5^1*`KK$l~N4I99iQzoACJ9oXRAjQ8&{CjcZBj|X=IX|hlDsE6PfJ32G`=m|6f@kajDok&>~+GNLg9`th<3($`W>mJU`V zmCUtg(B@ziLHVVZieoP}b-{;Z(WD=Vw#iblZ{lioNad(rPwQ2hV9JSFzgOwYD+l#D z+8R;-Qx4!u`fY7_<>rW?7fQD3yB6-|zET>#Ps-E`7cMDy$ZlF z8qynCmW=Sv zzC^PBSkz0}w>p_$xo2fxjLO}fw4`dJ?jV`&G+ow!u$VF9$sy8<>kN+)`iD1Rl^l`w z-jv1}^(n=jwOumI%1WZniMT|Auv}HkvI6O-3)?c8@YWu=DWV(|ibpkHgrPM?66{#^ zX^GF(Nky|LvSn9sV%CVjScW6$pV|u=kwXQ6wVW$0uc)Jjly(@2yAoN@Qw@FDk~CRs zMX6^oE!7oOBrO)sw)H6iVpU>I)ud=yhi!$oTxt!_`oJP^BBmW>vneKpFC3JoJ&zKX z7>gvByKEn&cxgN8f@T7<;kD(TNPXhOO8kiAZ75nJ;<;Qpw!9IprKzANwFUiTE${2| z>wGmf)k?fuuR6Mu5@S)u6^Ycwa6(dNwT2Z>E?0{H=Q7;6#CUPqSKBmsKYLkV zt+Ml8tB0j9nJT9$N;_LiS*_AxT>zjHk!-GP`Of%ei}lj1jcQdZEy=i9ykCE687)eN zsd<-&;|aCJ2ilqr=P=t#Vh*n-!7MD2CZg$7 zMu!&5=yg2RBo=QR&8^kEtt2sh#y2IcdQQ=#KI7YNdaHx;yt}=DE>taLZ57YkPZEe~ z55(>TFo}9QP}%a_rG?2o%Ye!GkAC*C>al}`uxBGuc4%g;jf z_IyMW`ZAk0qfgsLXBWDjde2qo4Qilfco|+fY87WINP8-ku*)acvMPzb&c|geZOXx^ z?H%pbfY+0~PHRQJ(djK5n)nqD017bD78#8vJ4R)`WWY&N3+YI!3cU{~SrdxEQ%ys=lJLVOTJMOSXCAo+-`OvYd|Tw8^CTuh8oeF#?-u1 z2kpg54h_VQm|aOt`@pk;Qlwn6p-R(?thrv=3$yX8cPtyTdM@wSBe#q!v{lul2C_rg zWzA#0rk(kjED5rD&8ICw(k&D$ZosX|g(&3w~|H^ol#*&=JEj&=% z6n)8&!nt>K<`?+H7coej!9`y6T0AXEM6q?>l{uCO}XjL=WZ3XOf5x=b9t(w3)748``8YBr2$8*r!sN zL`1cx?I`CUw(lmtM+V|*{t?fQ<>GW)J(5Um=}0ALbA|4+v6O*jHX>GV-Y)0Sn0e@~ zTup}#rvhYF(3OOJ9c#LK`v;_A4tMD2S=P435u&ZXO@O9t)+Y`t?R6m*MhO&KEv&($ zi~RjOu`$^W{c$Qi@Olf_^@qnOG<@u)Fg zW}5G%?xVw%s;us5AXLgPgdEGhSiv$W#_ix>mgQI9vHS)ez2RH@Yr` z)|D##6kYp)o0T}lvh+N%HC8V(t$v`z<+#{SHQTb0v{D+ z>E)s#fIsEw_A+?kzi2NjYe%fIs;Y{zKt)w~K)DBkX-cW8A^^We1ZkgE-54Mv*gmbQ zQ)JqwRg}GuMv&@28VOfalm{x>DGKb%14xSg;B$FERER(zK>jF3`3o}LYEe~IQPEx* zK(4aLDm(QbE)_xKi{MD7g6ecrRj_?}`?LU@f|O|mN{YhFppv38(nRShrcqrg+Gkdw z#2Hx{IAj84GWANb)4wYE+fZJG|FUKkvSQNO9t=?WXpX9~Kvh+_E>%FZ2UW$ZD}q!o zD#J8c@=W_plw5@lsXxgKxZ!BxCqE5~?XrtAl z<sLC_@j4G#a$JEZtdN9jHQBJ!p^z8vkb5-vOj?vrGsBEZbhCySXYze`IFx z3swiDL7o&g7zkA3uX4MI&=Y?et%24UY%kYCF0Ja+84OlaauqT=l~MIHvQ|{1b>t_; zyDC$rx=i|jxCGj7fE$(P1}e`Dl+QFBY*973qfCFGfu&bP`>jN}@?o+_K3Jv4QlP4R zTEl}`8V)zm-zpMdC1pJlfDb64cM^D~M??Qe3%`@#D+$+rM+?D|0Q?Mm&nZ)O5`@1A z-;ZgbcoK-8h3_3&IDSHZAJjtfBp^@Ur?s#=3Cfe~#jj|gd=hY`cR|0Xh4V=;p9GD6 ztcCPRKwn-uQK9T4s80&lSuM0r0{is+8(Mgu1okQZUuYqI5_}%R_Ybu&KMC@WD=ud*qH&iM+3H-l|@A^t*C&B;!L5iDN z34jy;D7{y;G5{$8pvvO7Rtg}60Q#QP$^oPp@BtExp04bq81O+7zShbDBpAIH-|y2( z1EerO{=cV{2S{3epQg%{E zp!7zxasnwPkf8W)Xe9+wQ1}z-Kdr1liVA;;@46e6ofH=S8sE=qNDv?0D3uvVseuIk3BOlqa1)L69;8DJYy1N*RKbB1rM!f>25kG!|(LQut44B?(e=K(k9F z2^zb*_4qxll_p5Rf#Ux_D^HN(0)@YpgwbBPEY}^r0 zN*@%L>P+!Jq?JG@P5M5nl|iV_>HCCM3L(W0`u=yV971)X`jB!6DTxqGBL6K~S%mty zF`$%1C@$5ZC7_f>s4S%5LH?iBN+eVU^8bofCLzU$LI-(RBLWs+CYk0foNbua!~O>FSZ2zff7ltP{jD8&$RC*=^r2~rS=29%Nr(bTVM^L1^K!bmcpltzdqlj6ub14?;h zS3oI{NZS2oMI*!dJEgx#p=3`$DV5MSDV7lJ`vV=06ij|App;Cg9;dZCDVuyWpcGCh z9x0s=4JE}B@+ajJY9CTS`MrQrLLvTy6j6=@lrqX+29!by&4r|tLg~D!zezde%K@dJ z^0k0cQla{iq6*R8@9FSA(fN|n%GrQYT)7ZX$}7~~i?!LVO;Tj}-vOn}Qc}u2?}u3A1zmkGlY+%JVQ#0q(JjWGv!K=hSDcx8tT7Sb$C*$IaaO|Yra^n zlxt3xD+L?scT%!>y<92Ue7{^N+x)0pDcnq!E2W#Vpi;ac-hq^Fh`%ER9O6w$3FpS3 zQpC9}sFZQ2A4wr+Zcr)ZP=AtQ4k=fXa?X80rJ&OkR7yGz29=`DBSEFCL+wQhJCq+O z?JN%}#hrnmQr?LNl>*NTL8Zh){rG8Zk}}Wcpi=1B7F0?-?+Gf!9>OzH?%5So3O>IU zR7yTHZb{K+Z%`@wd^o5SetsvYlzx6Us1$!b6;#SUM}tZM=y*^m0evB;6oI}PRLVd^ z!$~2C%0o&)=YmQxh5@8lfk_rq^-e*d=ded>1S z_lmoXi-e7Di>{Z^Wh+SQ{ovXD73M!bVEa*%RiT}pqzn7u_YMU9B+U2Hnrg0U^Bi#J zaotz*s2)1~=kE4aVm@%UO55%C`MXu#ZojYHt@1H{Z?j|kao+7ScNeB-`~F?t*A7Q14@%p&^5MRpx211Twklm-YNweRXQ}Hy0tZ4l zy5i;QSXkbo+kXdA0LviCb-XGa{>|l9z8J6CPD7*__RuWVuMcT=irYzl%FoGsSCy-h z()#vkZKpBzM?tFwY8+c>(pVNlp&+ICMeR;~^c8Y1|F)P;e5H;{<-VZpgyR1@sPd&c z{D*cY-PajZxu&CXjeJj;oi8byijF~JuJbVehVTewKS4ME^KVJv7v>j)ns>h_ z)Vxc1?=Dm8vjb&H0r)t~FA*Jrc}gfGq4nB4m{@*`7MNcpMPizd34dY!J(Fuz5YfWrJXJ)QvbJEUM7RO_+*FkjdBMvBO1 zVA6P*gn6ED6nKK=v}l0&eOe#E`~j__r>VBw0rQ`TUxoQY>I0ZRqB#}jMdB4<{xkJk zg;H>?gZZy8yI@|T(Osd|LEB;e8}WiL|2NFTFeizw!u$y-O2hm=H2!G6g8KgkwI1rc zK`BfR!hD1J{{}T^_S~S>6Ng}y!8{4G9Oea>L70_5+-WdtU{=6vg?R(a4V4Nv#$ir} z`C6q~R~>{o6Xpq+Riuaw^G29K48EIShG5=IbMHhn zQ!sCXc@E~A1B!ss+&mBFTVS@poC~ub=38N=Va}uV&kUsqJ~2bBzi9vBPMBw5hG_i& z^DdZkFkjwH>lc`BgV{S%;d%n*e3(07z8&U%nD@XuO8Xq7Xb$t4KA5vG@a~7% z0JDzP7%&&WjKQpjxuZ%cqVI#*Kzn~M7ZJ~1rPe!_U^c<527PD_sQrt@#GAuh0y6^h z0op@^`5?6u?Xyw2bhruafBr_r+h2gWoYJ{T@rVs{(FL^+%#GCEFeB9OHz}U;Fig6I z`!dW=Qaghl{XX><%s-(1hxsY$x0}^kq5oz@AJ*Nh=tAOVMHhD6tmp#mKhQqPnVZ$P z3s$S~R;kT~YCZ0%)wt`gR^x76wHkNnYBlZ-R;zJ0>lQW6YH6KL^@8~)RE}HJnq{3f zx5NBXYHygIq4t6KXVgA0k5d1^{A@rG{XeI6h4~kR$1v+?T)?CY>vzFiNc8Adb!!Tfm&f1BEGtfdP`KqKp5&Vbnk zb7q-Z>sFPiHR{bU&(WSH%=0jBp|ugrSup2evc8ShKrr77a|6uTFcUE6!kmS9=Rar< z8s-}?x6M{~vVFF~lby2_p1d|&;mJ{$e@Np_n-}yN^AgNY6W+~H{dIVb>aSySRR2uQ zQT?+M{M+Y<4!}G{bmc9opN_yhPU9AQ-Cq+ug84TvJLjr7XBW(q6mPCtn;wLDhQ=B3 zfpk#>)-K;5y7yMKCOrc4TU1_{--dY#=Iey#U=sg{(uesY8aFV15>R~PWvVC4|DbeW z{wLuX%mCV@7yNBGT~u?sn)7JwF%9Of+g1P2+JpLs)*RG7$8T5tbLMu{Kb@G@cVcep zx;Z7@^RUog`|pJBd0bO%gWhQ>L}EYVY# zuMmBP`9A{cf)X+h!2D(EKbX5Ie{D{}d_Uz62JTlVUv0L)e3jCzQM}7Kn7>N(f%$=e zy0C=yUUtF!b)vU5>f)jan0x=fvd%v~%X$CfcWYk_t5)5I(T;8mi&aaT)(^U?(bTF{ zORJWariRhVFbq?ZVc21^7)Gmx=}dN*j58WdhB@sp3R9zDGE8UK(f9Sb-tX($=f2J# zJ)VzV`&^&j*XP&uet&NEmqz)F_)Ea|WL z;QOp^@B`}D-=w1-p z7cGTgftUqWD{H{(*gwHFU>mrO3)qoz<`E38;o5zqthJKBwP3O`S6KkA zSH3~{z}wir!P~i}2lE;JT$!&5!5KVj0~0x4DjSte=gNGRd>+zfe>hLhj`G1d9QTz~ z;9T}6Fq!>0TFwZnzy)l-Xj#KHM9bM;8@Pe%46uOX6?hldKcj@9;6|=Hz(V#HWg2)7 z#|Q8}_7`vy`^zZlM-ii?|M*5r|EU@+{h@la^oJH@+i2+*{xLGHC5(}AtwdQmM*2(n z80jY!;D>zQlx<^V-0J}M@r*4-7!9^Cf8Zy~7ud@6z*u1{_$ljetc;gcV`ZFd1Mla$ zd#s$PhMtf2i|c=|nDgZMa* zm969CY=<`pRd8Mdw{ac>w{!ifOav<#pE562E)c2$pXd5l*&Qq2mBQmt*IZA>$+|rz zPS)*yWlEf^D>CC`y`B{(>-D@iS+AEV%j0C-UK=Ot^yWBOr+383I^BDLtj`lKko9@q z1+p%$27hC{Tp;W6@bR)PPZ}@l^8E3#F0UCc>++8AvM!H^mvwk@ysX0u;${6^8!zkc z&UjgO`zFY`J7t2by9+1Cdb@6dthc)+$a*_+qO7x1C(1gzXripEdnd}eI%|?%pfpL= z*GZFQeO)tI*4Ggi%KEzKLRnw;UMTD9tczrQ-ExtvuP0BD^>xJ*Sywkrk@a-<6j?`y z`-KsHSx-;)%X&IhneUf%bcwRmFYD=gWrJVV)xlGRAyZ|29jlC=D(mc&sj|*4oGR<< z-l?*V_D+*|E^3<0bJ^2mo@-Sem?rD$?rAdb`KQbLl{H<~)y3e&%*S*YuR5p8comr- z<5B`Rlk-P{thdV(WSnYEknt$=Vi||hFP3qr225c&FsU!(cmiI=@c~@K_`$`@#|-%v zQ8Giut=1VbZgqmo+0I}(>o-vt0j^;A!IexWQNLAynQRyEDn7650^F82m%rE#n%gGQZ*klld!bzRX`S%Gmj`?n$06^I5hsXTHp5#q(u8D*-=Z zd(W3|JC)$aoS&5K^JQM^nXmKN0%80Dnb(pR$h=mhEC%;8o&~ZmXjgVDka@3Xf$R%H zQ)C|y27bfwLKzJnX1pnKwv`Tk$N0hT`97q`H?H0k**`=q6#Bp;tj~qApGX6LVm||a zX8&I(-wv9_fwr2)#?hRw`MU z0-gevERlU`4LBUE1ta+U68UBrvJ~?a*TdiluCJHMS!4-#I@i14nanqM7T3FJ@{KVT zjAH)5k<2f69`l`4(9V zj^{oQoWOi6lQUA!<=AI&J+JhG7x8&z9ykT82mN67a?DrEA9xA#2hIRH!9X1jv(7{9UsoX>KC3mC7`yFwTarm&rrY2d;j`7tw|^+tn> z`FC&$(*u{X{9qc`4K8DQuM~R0%egOBCW6a(F0oSfNd;gApI6qcl>JaAxC#u;kbO^7 zhU|N4z-w3!SIT}Tk3ST|^j68fr+Ag@dpf{u*7s`cXV_m>%RZ<;S*5H7uV=oMJ*(v` zJ2eyYBI^yz1w*gGJji+gA7*~Q67~mWCin>30o=rI+*ip3xb?~gu$22TWjnZ;>4J}O zKX^6fC-xJiA1q@#gHNzufaT0TxP|=#tYE!?Tlv0&+nAqggqh%Wh6gK|uCg6`mi;md z^A_7POU~+Z!56?%Wf{1G@q>S7eP)TxV&=8NEbv9vKe&_eDm%a$=Kng(YYYdz%=!mk zVf%u$tj9H&=U9*6E}nCNuQR+d8+?Q91HQ@nTO$_mf%jWKIWv}1ctjwzE378 zlfi*}PMHM`;`stN7_3xQfni_+IE3+m!)UXSD+~v{U`noh!^{Lv2Ft-ycrFJH2b;hV zU|X(y-;BIj7zLgV#)D_@Tm+2dc?ftm^LY#QKVX@%9E<|n!D!l$+$szOM=>AZSmpyf zpXCC_F}$)1jAQzFm``ZS3y$Y^Z)I+td@CzemVpz%YGqBHe1~lUCxM;HE^so-aU13v zFjbibPGLQQey|su3P#`V@k|3_!0Buka0XZiCW3X~Ot1x<#d-si`2F_|p%nGs{&V^n$s34!oJ| zqRazt;WtX~R?vT!oRbyaCFf*y%KE$Hyv(!Fm=9&!y<#&Ja-T31{FLQTW`Uov-oX8AKky5_2jD^Ww<3(Q;AEx0NG_bu zE)v_TYGn<0nB}KF_fra47V5PF^ zVfhB%0}f}tN)Q*A0sa-t22TU4!4Y5==wmq^!T8Gb9ub=~KN!h$z_Y-7@NAYJJO`{- zHh@uJCpeNeWSg*_2NS?(rmM^aM=?A&hBg4;Sk@DGJ{bI{*uF(7qaGC-f*df8{n zdI4YM`wH%2`N7xN4qzSo%@(n>DFWYQJyi%}!ME7&z}3&3AEj(|s*Kkzr!6ZkvF!RLgL;2%s6>}9`JmOm$UajoE= ztgq*Vso*iD^Sl@Wwt@Y?h$_r4U<`O77z>8d=L;MN7AcFtLG=9s!@wHl0c9IFguY-e zcsxVF5^xy9DQjO4+pCBjm}eM2coKDRIDf!phxn$of&%W@q?E$esDSCuSFhM-{10bI%O;Png-=77CQ8bRK`a)US0 zXHb~|=CU2Yo0-p7Xfp;(-Fdq!tB{qCs@Giy&Ze)DQ6!31g4_F8`gZHp~ zUc)@VaNvFXyRrx@VmR;t`bvTivfjaBrc>wfJj`-~kFfo~O>AFf7WgRZ3oK>6!OiSX z;A6};_yqg)>sbHuy-}9FE;i=fuZu0B_YKS&U?lhq+Z)`<_?6kGn z%l2%*Ji&eoz6YkhjXGg@!1r1Hx5Zbrz_dM>FPML20r)Zh4t~OV+aorh!Hw95 zFn(}9`-?IK{G88$U$7k-<%g*%z&6$!c!=!|e#iP#c7xx8q3_~v?61lM@Cfq_{>1kb z{F&+R#r(kX?-g6r(!JtiTLJzDtW>rs+rb___nt5W{Ehtw{GIQ26Xpk&13bp~X#7i` z+xLZGU_USu3<9gb0bo0LBLDt@*z|jq5y~iVAQ-JoQKo`}z*c2DI2iPQC^ohE$^vi* z*ai+|yv>+L7%%u2uoOHAO#BG@6UGmQ(|1^z3!Vy=D=Wa^^wIbi;sSljNbs*IaSzwYf8BAh6!P#I9IEVTB1p5ru510%# zfb(dZ3@%`Nttcbw5nRZ20vEBJz*Oc7T+IIQsW9wQ`N6fx;8L(2Tn2`JhIxVMgXzpK zxPs;1kNJS*+Ap@!3E-8?{{iejz&tRM^$uRm`uiOF4nC)h0kgm&@H+Mba1HB6S+8sW zv%y|)E%Wn*Falf$#(yEc=eghwU^RFn`|+2UXZUyJWbhWI1K!5|58lD>;GL{Da6OpT zhWUp5s7-!&t{!}b`2e?oO<)Cm*OfiWUT`bx=__FoSjq6pX7E|Q2jFw;XW;W-7g)u9 zd=TR~`z!b&SaMK)@U9emh5hBA*q&D?o0QGqt1RCkpE`T$?&^Wa|AEBFDQ2R~&0 zR5mMHz-B(*E=&MFVm_5U;J?_fzLp>0O95Ls4uGFB-^v2;GuD@~5!}!I`VGcYwjcNv z+Yda*bihN*hq481XMa2_^nzdWy#qTK9{isD4D96lr_2O@VEGQq-2$!Pk4(2iZ1g9C zKQX*A6a1O)2iVQ_0*|tu!QU7U_y^0OYy^ARUf_S(f4{|e%kqQA_&gXi0MCQ{!3r=K ztWws3{|DA7+m#*QabV7O!d!3wpZiXJ;IIQc5ls3X<1CmAhJkJ1Ul)R zKJqRFFaq?0J}?hF6D;f$pSDWy96sMEJ_{Y-Ncu2*s)Wc?`VB(e(323LbkU?$iMUIm8#ig6B%2CoHUz%{HNW%jS)`&9+51v|lYV8~JQ z1?CgHiRA%vSsw5fFdw{?^?Fo%N(Rz4{kZ@2-!p%no#sLV)Ti%w_4_(Oea%AEpKP!! z6D;4X0qXa~c*6CWQ}r3%b#kKm^f7I^7t-bNbdBR|^@WO3pRaQ@PTKm@*K4%;myOjl z#;f02Jbk=q$Ea!Yj*?UKhYp$cR84!jrhT!dO&jdfJYsvzdspU*>9ysX$UH5^Ke~l2 zRsXWf^+yirm&G4eyh8K5Qhn^M)Vybk39jdAEdzZv&hv;50n5VAXQR}wi)Es(0R0#4 z@QDAy29Mn1ve6@c4EO4fHQwiu`yFW8c>(>nv<@EAI(QQQCde_4b#Du8GAGG4+NztE z=<`XtNUbCKnoUt3Gr#(jv99P7!h2mBwa(sGpR|2icl6<+T|0fYXxC2P5!$tXp>=vt zOw24BPTIFyK2|a;cxHRVhl+Jh8%)}})3!3%Bfd?vd#9}=+k!qxw0oybB!7I8zD5f@ zV&lj*qHQBhWN5>f>Jc9ywi#^}mw3cRk!?qxpEQryD6$P{n@GP9+8(kk>B~d^5ZVy3 zO{eq|KM~pzvQ23#xXL58eycrV!^bwJ%^v+m=%d57rp+FINOM&`@gt#49{osYlgBtKF|85KTXi&5#m_Le?#Vq z6I0MUml%WBEhv42xFS+qJ6GI6g0hW}z83Ml2)a|96#36HF5OdsUK;e2iu79ap&804 zzU&gqC^osoP$U-g^$5AFg_q5EwxmZkq6Y*WF~u{Z+Zxe5f{vNuz7cJe=sQ7SK2sdo zMq9!lpCS6X#n3S5ESFe}S0^amC)uIMp(T^z3`3-^Deazvk`0laBAwzg*W+mvuQfy# zGnHbVDPq5wLUE((@nnjnE-{JXc9)n)ai>d6p!iRh=%={Pm3dlp2OV^Y@f3e?iLn&> zpB^a2P#o?OqbZJbiBS|My2MC|GY!#)QPW2;)g?wyT;&qODcIwaN#r&dMl@m_V- zX^oZ-z*b0l=8~I#rh+&6}glv%sIgitYr^5ZXEe1Sp zivf?*<0pQM>v3BQc-$79VjiYLAsu(d%Hx%s8ENH3FCdD%xxjjyrd$bQ`a&MC>yv&u zoM|YwQKaz;oqMv!$%JJ+PR~Pn=!C|~*Ih@X8%|`Lh)x^PmYjCuPD1=p+<>lJz0gdE zU-wjGLRQ)N37DqU4GWEiE9n;~`uR9N@}yuzmW)+cy4Ogk;4&4>gd$Z8NQk!7c1R~7 z0XPcB^;5J$@+%O%sM`h_A{l@wTZ*6s$MuPPkBYJ12;yt#g!F3J@8$u8 ziazWv((HtIn(NyyahBR~QjFg(ai%lmOL+W%iVT@SaTmm*k5%NQa`rgSlh^hyWK?Xm z6XNk~;g`k`#5ju~7Jq4s3{1TZ(__V#l6vME%@R*rQ`(H-f~nggQ+L|P5$)DwNFK`8 znjt5J^oeXEtLC#pa$dk?jUaitU%DQ5wf9>&d99sIVoF!SQ*BPQS1noA&fER(M zo(bO@Rrei2RvV&~&!3N%b5mQap*Z>kxzwQIR1s?_o)589MZU0BoRc6H86mAWr=1{o zCfH&J#XN{5KcJ?L$OzU+@h*rNhG;F}?mI!wJZ#Y_(IzI;iBcUgO7t`nQnB7no%NYu zh)&J(7}tK>=^;ETE&5T!oNT-@?8!V3W`P$G<>k~PnB28zxqXtW_Z6=GSr z{}ny?G^3b|vofMjbOzNN6@3LpE#(*?`#LRzdKC|xtYzo53%p{%(?7AT@?{5N~YYEeuZT#|@P09f~52 zHX1lk?trL`bTx-5_S$jsmWG_OjLiE728veZxg@qlj$lqgW=JO?Q?wGgW}sZ>kaM;< zD!N4HaZ|LWvz-X(KL_QHGN!Yi^hyU?v$(lm8PfkWM5jJaA0)2z>2XGVjx9!R>M7j5_P8GMP26Fp%keYn7R?NFLgt-8g2*goL-7}mr8c5S7s+S4A{p+rb)<_ zr971yB%YKMJsaAjKI;dG+hu;5t3;;gq;858<)kBUA63=OWvN2qQ3=R~nEDbS4>!6HrPJ~!hfex|VnBx)$ixntEr+;#x zOH=r$RwnrPfyd~V~%4Z3BT+*$se5MmDeX)`P_myyKn6ioqW=3FFD_pPe(NKX^R0}kw)e1+ud)REe5=CDh51G z+xyfluE!nGeB2fTUM^mtkv-d0B3lfI(-F-$ZPBUuBM2Xyg<(C**vtGUOniX7Ym7?% z9b(idh@QGlYmIkvi;8V)jkja;5V1|q-(mES zxFKS|UcJM}{G=gb<=(Wz$oxe^#3VjI_C65{%k4hm6KMwXa)TXbrE*ibya4o$MosQD2?#ebS2S3ypk z6uZ|MaYha86Vuh=qW>jB#ciwO(Y}u?{TI4KpFO18qSJ6Ih6ajO!(|zwvktl571GM* zZ7$KuCtpKTbj~j5*5i9xJ`-Ew=Aq)Vll_dVgVE6^bc;)*myj)5d+lv_yx?)PW|^_q zt{y6WTNIsBj#q|?Q&jjc|Gh{yMbPhD8i^vlRIky=q_jt9>5IY2Ge{{kyacao>~p2=GsJ3&YlexzcYtV}YVPe5!<-E`rt!#)MltUl)+Yw+ zB6&GheWFqGe4L(_g{4NE)~s!aR-CU7>k}>e6YF??m^e^&Y!=Zvqdp8Vaub?(ld-Ai z!3$kZDYAz+YlZ@d2R6CZOBse}Wr^Qq{3`Ohj8jZUOff|Itc2`xiFB;X-(pmVb?X%# ztv5#-rf!PPg}nmzS&DJ|Lny`GNb5kUU$X4|Lf>GR{}n zeTk0gu@AfQ$y-Hy*+xDe^!AC)*DHqPeIhCDkhaK>))4eE#Dv`_)ox=5vQEs9>*zhk zp!ym@cK@?abjD9Q-n2LB(&!otR&RO5JBK2N%5F^QLGK2L7{M|jeh?rgw)NVhx99b~ YI4$u9uXrTaZ+5*hw#X9wKV6~j8}WKBU;qFB diff --git a/scripting/l4d2_extraplayeritems.sp b/scripting/l4d2_extraplayeritems.sp index f07be44..0db8655 100644 --- a/scripting/l4d2_extraplayeritems.sp +++ b/scripting/l4d2_extraplayeritems.sp @@ -28,7 +28,11 @@ #define EXTRA_PLAYER_HUD_UPDATE_INTERVAL 0.8 //Sets abmExtraCount to this value if set // #define DEBUG_FORCE_PLAYERS 7 - +#define DIRECTOR_WITCH_MIN_TIME 120 // The minimum amount of time to pass since last witch spawn for the next extra witch to spawn +#define DIRECTOR_WITCH_CHECK_TIME 30.0 // How often to check if a witch should be spawned +#define DIRECTOR_WITCH_MAX_WITCHES 6 // The maximum amount of extra witches to spawn +#define DIRECTOR_WITCH_ROLLS 2 // The number of dice rolls, increase if you want to increase freq +#define FLOW_CUTOFF 100.0 // The cutoff of flow, so that witches / tanks don't spawn in saferooms / starting areas, [0 + FLOW_CUTOFF, MapMaxFlow - FLOW_CUTOFF] #define EXTRA_TANK_MIN_SEC 2.0 #define EXTRA_TANK_MAX_SEC 20.0 @@ -78,10 +82,11 @@ public Plugin myinfo = url = "https://github.com/Jackzmc/sourcemod-plugins" }; -static ConVar hExtraItemBasePercentage, hAddExtraKits, hMinPlayers, hUpdateMinPlayers, hMinPlayersSaferoomDoor, hSaferoomDoorWaitSeconds, hSaferoomDoorAutoOpen, hEPIHudState, hExtraFinaleTank, cvDropDisconnectTime, hSplitTankChance, cvFFDecreaseRate, cvZDifficulty, cvEPIHudFlags; +static ConVar hExtraItemBasePercentage, hAddExtraKits, hMinPlayers, hUpdateMinPlayers, hMinPlayersSaferoomDoor, hSaferoomDoorWaitSeconds, hSaferoomDoorAutoOpen, hEPIHudState, hExtraFinaleTank, cvDropDisconnectTime, hSplitTankChance, cvFFDecreaseRate, cvZDifficulty, cvEPIHudFlags, cvEPISpecialSpawning; static int extraKitsAmount, extraKitsStarted, abmExtraCount, firstSaferoomDoorEntity, playersLoadedIn, playerstoWaitFor; static int currentChapter; static bool isCheckpointReached, isLateLoaded, firstGiven, isFailureRound, areItemsPopulated; +static float highestFlowAchieved; static ArrayList ammoPacks; static Handle updateHudTimer; static bool showHudPingMode; @@ -89,6 +94,11 @@ static int hudModeTicks; static char gamemode[32]; +static int witchSpawnCount, witchLastSpawnTime, extraWitchCount; +float ExtraWitchFlowPositions[DIRECTOR_WITCH_MAX_WITCHES] = {}; +static Handle witchSpawnTimer = null; + + bool isCoop; enum Difficulty { @@ -255,6 +265,7 @@ public void OnPluginStart() { HookEvent("game_end", Event_GameStart); HookEvent("round_freeze_end", Event_RoundFreezeEnd); HookEvent("tank_spawn", Event_TankSpawn); + HookEvent("round_start", Event_RoundStart); //Special Event Tracking HookEvent("player_info", Event_PlayerInfo); @@ -274,6 +285,9 @@ public void OnPluginStart() { HookEvent("jockey_ride", Event_JockeyRide); HookEvent("jockey_ride_end", Event_JockeyRide); + HookEvent("witch_spawn", Event_WitchSpawn); + + hExtraItemBasePercentage = CreateConVar("l4d2_extraitems_chance", "0.056", "The base chance (multiplied by player count) of an extra item being spawned.", FCVAR_NONE, true, 0.0, true, 1.0); hAddExtraKits = CreateConVar("l4d2_extraitems_kitmode", "0", "Decides how extra kits should be added.\n0 -> Overwrites previous extra kits, 1 -> Adds onto previous extra kits", FCVAR_NONE, true, 0.0, true, 1.0); @@ -283,14 +297,14 @@ public void OnPluginStart() { hSaferoomDoorAutoOpen = CreateConVar("l4d2_extraitems_doorunlock_open", "0", "Controls when the door automatically opens after unlocked. Add bits together.\n0 = Never, 1 = When timer expires, 2 = When all players loaded in", FCVAR_NONE, true, 0.0); hEPIHudState = CreateConVar("l4d2_extraitems_hudstate", "1", "Controls when the hud displays.\n0 -> OFF, 1 = When 5+ players, 2 = ALWAYS", FCVAR_NONE, true, 0.0, true, 3.0); hExtraFinaleTank = CreateConVar("l4d2_extraitems_extra_tanks", "3", "Add bits together. 0 = Normal tank spawning, 1 = 50% tank split on non-finale (half health), 2 = Tank split (full health) on finale ", FCVAR_NONE, true, 0.0, true, 3.0); - hSplitTankChance = CreateConVar("l4d2_extraitems_splittank_chance", "0.75", "The % chance of a split tank occurring in non-finales", FCVAR_NONE, true, 0.0, true, 1.0); + hSplitTankChance = CreateConVar("l4d2_extraitems_splittank_chance", "0.80", "The % chance of a split tank occurring in non-finales", FCVAR_NONE, true, 0.0, true, 1.0); cvDropDisconnectTime = CreateConVar("l4d2_extraitems_disconnect_time", "120.0", "The amount of seconds after a player has actually disconnected, where their character slot will be void. 0 to disable", FCVAR_NONE, true, 0.0); cvFFDecreaseRate = CreateConVar("l4d2_extraitems_ff_decrease_rate", "0.3", "The friendly fire factor is subtracted from the formula (playerCount-4) * this rate. Effectively reduces ff penalty when more players. 0.0 to subtract none", FCVAR_NONE, true, 0.0); - cvEPIHudFlags = CreateConVar("l4d2_extraitems_hud_flags", "3", "Add together.\n1 = Scrolling hud, 2 = Show ping", FCVAR_NONE, true, 0.0); + cvEPIHudFlags = CreateConVar("l4d2_extraitems_hud_flags", "3", "Add together.\n1 = Scrolling hud, 2 = Show ping", FCVAR_NONE, true, 0.0); + cvEPISpecialSpawning = CreateConVar("l4d2_extraitems_special_spawning", "2", "Determines what specials are spawned. Add bits together.\n1 = Normal specials\n2 = Witches\n4 = Tanks", FCVAR_NONE, true, 0.0); // TODO: hook flags, reset name index / ping mode - cvEPIHudFlags.AddChangeHook(Cvar_HudFlagChange); - cvEPIHudFlags.AddChangeHook(Cvar_HudStateChange); + cvEPISpecialSpawning.AddChangeHook(Cvar_SpecialSpawningChange); if(hUpdateMinPlayers.BoolValue) { hMinPlayers = FindConVar("abm_minplayers"); @@ -342,14 +356,49 @@ public void OnPluginStart() { RegAdminCmd("sm_epi_kits", Command_GetKitAmount, ADMFLAG_CHEATS); RegAdminCmd("sm_epi_items", Command_RunExtraItems, ADMFLAG_CHEATS); RegConsoleCmd("sm_epi_stats", Command_DebugStats); + RegConsoleCmd("sm_epi_debug", Command_Debug); + // TODO: Should we have sm_epi_value or use CVAR for state + // no cvar + // RegAdminCmd("sm_epi_val", Command_EPIValue); + RegAdminCmd("sm_epi_trigger", Command_Trigger, ADMFLAG_CHEATS); #endif RegAdminCmd("sm_epi_restore", Command_RestoreInventory, ADMFLAG_KICK); RegAdminCmd("sm_epi_save", Command_SaveInventory, ADMFLAG_KICK); - + CreateTimer(2.0, Timer_Director, _, TIMER_REPEAT); CreateTimer(30.0, Timer_ForceUpdateInventories, _, TIMER_REPEAT); + } -public Action Timer_ForceUpdateInventories(Handle h) { + + +Action Timer_Director(Handle h) { + if(abmExtraCount <= 4) return Plugin_Continue; + + // Calculate the new highest flow + int highestPlayer = L4D_GetHighestFlowSurvivor(); + float flow = L4D2Direct_GetFlowDistance(highestPlayer); + if(flow > highestFlowAchieved) { + highestFlowAchieved = flow; + } + return Plugin_Continue; +} +Action Timer_DirectorWitch(Handle h) { + int time = GetTime(); + if(witchSpawnCount < extraWitchCount && time - witchLastSpawnTime > DIRECTOR_WITCH_MIN_TIME) { + for(int i = 0; i <= extraWitchCount; i++) { + if(ExtraWitchFlowPositions[i] > 0.0 && highestFlowAchieved >= ExtraWitchFlowPositions[i]) { + PrintChatToAdmins("EPI: (ignore me) DirectorSpawn(Special_Witch)"); + PrintDebug(DEBUG_SPAWNLOGIC, "DirectorSpawn(Special_Witch)"); + // Reset + ExtraWitchFlowPositions[i] = 0.0; + break; + } + } + } + return Plugin_Continue; +} + +Action Timer_ForceUpdateInventories(Handle h) { for(int i = 1; i <= MaxClients; i++) { if(IsClientConnected(i) && IsClientInGame(i) && GetClientTeam(i) == 2) { // SaveInventory(i); @@ -366,7 +415,10 @@ public void OnClientPutInServer(int client) { if(!StrEqual(gamemode, "hideandseek")) { // CreateTimer(0.2, Timer_CheckInventory, client); } - } + } else if(abmExtraCount >= 4 && GetClientTeam(client) == 0) { + // TODO: revert revert + // L4D_TakeOverBot(client); + } } } @@ -418,7 +470,12 @@ public Action Event_JockeyRide(Event event, const char[] name, bool dontBroadcas /////////////////////////////////////////////////////////////////////////////// // CVAR HOOKS /////////////////////////////////////////////////////////////////////////////// -public void Cvar_HudStateChange(ConVar convar, const char[] oldValue, const char[] newValue) { +void Cvar_HudStateChange(ConVar convar, const char[] oldValue, const char[] newValue) { + hudModeTicks = 0; + showHudPingMode = false; + for(int i = 0; i <= MaxClients; i++) { + playerData[i].ResetScroll(); + } if(convar.IntValue == 0) { if(updateHudTimer != null) { PrintToServer("[EPI] Stopping timer externally: Cvar changed to 0"); @@ -439,11 +496,12 @@ public void Cvar_HudStateChange(ConVar convar, const char[] oldValue, const char } } } -void Cvar_HudFlagChange(ConVar convar, const char[] oldValue, const char[] newValue) { - hudModeTicks = 0; - showHudPingMode = false; - for(int i = 0; i <= MaxClients; i++) { - playerData[i].ResetScroll(); +void Cvar_SpecialSpawningChange(ConVar convar, const char[] oldValue, const char[] newValue) { + if(convar.IntValue & 2 && abmExtraCount > 4) { + if(witchSpawnTimer == null) + witchSpawnTimer = CreateTimer(DIRECTOR_WITCH_CHECK_TIME, Timer_DirectorWitch, _, TIMER_REPEAT); + } else { + delete witchSpawnTimer; } } @@ -483,6 +541,17 @@ public void Event_DifficultyChange(ConVar cvar, const char[] oldValue, const cha ///////////////////////////////////// /// COMMANDS //////////////////////////////////// +Action Command_Trigger(int client, int args) { + char arg[32]; + GetCmdArg(1, arg, sizeof(arg)); + if(StrEqual(arg, "witches")) { + InitExtraWitches(); + ReplyToCommand(client, "Extra witches active."); + } else { + ReplyToCommand(client, "Unknown trigger"); + } + return Plugin_Handled; +} Action Command_SaveInventory(int client, int args) { if(args == 0) { ReplyToCommand(client, "Syntax: /epi_save "); @@ -497,6 +566,7 @@ Action Command_SaveInventory(int client, int args) { } SaveInventory(player); ReplyToCommand(client, "Saved inventory for %N", player); + return Plugin_Handled; } Action Command_RestoreInventory(int client, int args) { if(args == 0) { @@ -556,7 +626,7 @@ public Action Command_SetSurvivorCount(int client, int args) { return Plugin_Handled; } #if defined DEBUG_LEVEL -public Action Command_SetKitAmount(int client, int args) { +Action Command_SetKitAmount(int client, int args) { char arg[32]; GetCmdArg(1, arg, sizeof(arg)); int number = StringToInt(arg); @@ -570,7 +640,7 @@ public Action Command_SetKitAmount(int client, int args) { return Plugin_Handled; } -public Action Command_ToggleDoorLocks(int client, int args) { +Action Command_ToggleDoorLocks(int client, int args) { for(int i = MaxClients + 1; i < GetMaxEntities(); i++) { if(HasEntProp(i, Prop_Send, "m_bLocked")) { int state = GetEntProp(i, Prop_Send, "m_bLocked"); @@ -580,17 +650,27 @@ public Action Command_ToggleDoorLocks(int client, int args) { return Plugin_Handled; } -public Action Command_GetKitAmount(int client, int args) { +Action Command_GetKitAmount(int client, int args) { ReplyToCommand(client, "Extra kits available: %d (%d) | Survivors: %d", extraKitsAmount, extraKitsStarted, GetSurvivorsCount()); ReplyToCommand(client, "isCheckpointReached %b, isLateLoaded %b, firstGiven %b", isCheckpointReached, isLateLoaded, firstGiven); return Plugin_Handled; } -public Action Command_RunExtraItems(int client, int args) { +Action Command_RunExtraItems(int client, int args) { ReplyToCommand(client, "Running extra item count increaser..."); PopulateItems(); return Plugin_Handled; } -public Action Command_DebugStats(int client, int args) { +Action Command_Debug(int client, int args) { + PrintToConsole(client, "abmExtraCount = %d", abmExtraCount); + PrintToConsole(client, "===Extra Witches==="); + PrintToConsole(client, "Map Bounds: [%f, %f]", FLOW_CUTOFF, L4D2Direct_GetMapMaxFlowDistance() - (FLOW_CUTOFF*2.0)); + PrintToConsole(client, "Total Witches Spawned: %d | Target: %d", witchSpawnCount, extraWitchCount); + for(int i = 0; i < extraWitchCount && i < DIRECTOR_WITCH_MAX_WITCHES; i++) { + PrintToConsole(client, "%d. %f", i, ExtraWitchFlowPositions[i]); + } + return Plugin_Handled; +} +Action Command_DebugStats(int client, int args) { if(args == 0) { ReplyToCommand(client, "Player Statuses:"); for(int i = 1; i <= MaxClients; i++) { @@ -673,7 +753,7 @@ public Action L4D2_OnChangeFinaleStage(int &finaleType, const char[] arg) { return Plugin_Continue; } -public void Event_TankSpawn(Event event, const char[] name, bool dontBroadcast) { +void Event_TankSpawn(Event event, const char[] name, bool dontBroadcast) { int user = event.GetInt("userid"); int tank = GetClientOfUserId(user); if(tank > 0 && IsFakeClient(tank) && abmExtraCount > 4 && hExtraFinaleTank.IntValue > 0) { @@ -704,18 +784,20 @@ public void Event_TankSpawn(Event event, const char[] name, bool dontBroadcast) } } } -public Action Timer_SpawnFinaleTank(Handle t, int user) { +Action Timer_SpawnFinaleTank(Handle t, int user) { if(finaleStage == Stage_FinaleTank2) { - ServerCommand("sm_forcespecial tank"); + DirectorSpawn(Special_Tank); + // ServerCommand("sm_forcespecial tank"); finaleStage = Stage_Inactive; } return Plugin_Handled; } -public Action Timer_SpawnSplitTank(Handle t, int user) { - ServerCommand("sm_forcespecial tank"); +Action Timer_SpawnSplitTank(Handle t, int user) { + DirectorSpawn(Special_Tank); + // ServerCommand("sm_forcespecial tank"); return Plugin_Handled; } -public Action Timer_SetHealth(Handle h, int user) { +Action Timer_SetHealth(Handle h, int user) { int client = GetClientOfUserId(user); if(client > 0 ) { SetEntProp(client, Prop_Send, "m_iHealth", extraTankHP); @@ -723,7 +805,7 @@ public Action Timer_SetHealth(Handle h, int user) { return Plugin_Handled; } -public void Frame_SetExtraTankHealth(int user) { +void Frame_SetExtraTankHealth(int user) { int tank = GetClientOfUserId(user); if(tank > 0 && finaleStage == Stage_FinaleDuplicatePending) { SetEntProp(tank, Prop_Send, "m_iHealth", extraTankHP); @@ -739,17 +821,21 @@ public void OnGetWeaponsInfo(int pThis, const char[] classname) { if(maxClipSize > 0) weaponMaxClipSizes.SetValue(classname, maxClipSize); } +void Event_WitchSpawn(Event event, const char[] name, bool dontBroadcast) { + witchSpawnCount++; + witchLastSpawnTime = GetTime(); +} /////////////////////////////////////////////////////// //// PLAYER STATE MANAGEMENT /////////////////////////////////////////////////////// //Called on the first spawn in a mission. -public void Event_GameStart(Event event, const char[] name, bool dontBroadcast) { +void Event_GameStart(Event event, const char[] name, bool dontBroadcast) { firstGiven = false; extraKitsAmount = 0; extraKitsStarted = 0; - abmExtraCount = 4; + abmExtraCount = 0; hMinPlayers.IntValue = 4; currentChapter = 0; pInv.Clear(); @@ -758,7 +844,7 @@ public void Event_GameStart(Event event, const char[] name, bool dontBroadcast) } } -public void Event_PlayerFirstSpawn(Event event, const char[] name, bool dontBroadcast) { +void Event_PlayerFirstSpawn(Event event, const char[] name, bool dontBroadcast) { int userid = event.GetInt("userid"); int client = GetClientOfUserId(userid); if(GetClientTeam(client) != 2) return; @@ -800,6 +886,7 @@ public void Event_PlayerFirstSpawn(Event event, const char[] name, bool dontBroa int newCount = GetRealSurvivorsCount(); if(newCount > abmExtraCount && abmExtraCount > 4) { abmExtraCount = newCount; + PrintDebug(DEBUG_GENERIC, "New client, setting abmExtraCount to %d", newCount); hMinPlayers.IntValue = abmExtraCount; ConVar friendlyFireFactor = GetActiveFriendlyFireFactor(); @@ -816,7 +903,7 @@ public void Event_PlayerFirstSpawn(Event event, const char[] name, bool dontBroa } } } -public void Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast) { +void Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast) { if(!StrEqual(gamemode, "coop") && !StrEqual(gamemode, "realism")) return; int user = event.GetInt("userid"); @@ -853,15 +940,7 @@ public void Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast } -// public Action Timer_CheckInventory(Handle h, int client) { -// if(IsClientConnected(client) && IsClientInGame(client) && GetClientTeam(client) == 2 && DoesInventoryDiffer(client)) { -// PrintToConsoleAll("[EPI] Detected mismatch inventory for %N, restoring", client); -// RestoreInventory(client); -// } -// return Plugin_Handled; -// } - -public void Event_PlayerDisconnect(Event event, const char[] name, bool dontBroadcast) { +void Event_PlayerDisconnect(Event event, const char[] name, bool dontBroadcast) { int userid = event.GetInt("userid"); int client = GetClientOfUserId(userid); if(client > 0 && IsClientConnected(client) && IsClientInGame(client) && !IsFakeClient(client) && GetClientTeam(client) == 2) { //TODO: re-add && !event.GetBool("isbot") @@ -877,14 +956,14 @@ public void Event_PlayerDisconnect(Event event, const char[] name, bool dontBroa } } -public void Event_PlayerInfo(Event event, const char[] name, bool dontBroadcast) { +void Event_PlayerInfo(Event event, const char[] name, bool dontBroadcast) { int client = GetClientOfUserId(event.GetInt("userid")); if(client && !IsFakeClient(client)) { playerData[client].Setup(client); } } -public Action Timer_DropSurvivor(Handle h, int client) { +Action Timer_DropSurvivor(Handle h, int client) { if(playerData[client].state == State_PendingEmpty) { playerData[client].state = State_Empty; if(hMinPlayers != null) { @@ -900,28 +979,11 @@ public Action Timer_DropSurvivor(Handle h, int client) { return Plugin_Handled; } -/*public Action Timer_DropSurvivor(Handle h, DataPack pack) { - pack.Reset(); - int userid = pack.ReadCell(); - int client = pack.ReadCell(); - // If the userid occupying client index is diff (or 0) - if(GetClientOfUserId(userid) != client) { - // If player was not replaced - if(!IsClientConnected(client)) { - PrintToConsoleAll("Dropping disconnected player after inactivity. UID:%d, index:%d, new MinPlayers: %d", userid, client, hMinPlayers.IntValue-1); - //playerData[client].active = false; - abmExtraCount--; - hMinPlayers.IntValue--; - } - } - DropDroppedInventories(); -}*/ - ///////////////////////////////////////// /////// Events ///////////////////////////////////////// -public void Event_ItemPickup(Event event, const char[] name, bool dontBroadcast) { +void Event_ItemPickup(Event event, const char[] name, bool dontBroadcast) { int client = GetClientOfUserId(event.GetInt("userid")); if(client > 0) { UpdatePlayerInventory(client); @@ -929,7 +991,6 @@ public void Event_ItemPickup(Event event, const char[] name, bool dontBroadcast) } - public Action L4D_OnIsTeamFull(int team, bool &full) { if(team == 2 && full) { full = false; @@ -938,15 +999,6 @@ public Action L4D_OnIsTeamFull(int team, bool &full) { return Plugin_Continue; } -#define TIER1_WEAPON_COUNT 5 -char TIER1_WEAPONS[TIER1_WEAPON_COUNT][] = { - "shotgun_chrome", - "pumpshotgun", - "smg", - "smg_silenced", - "smg_mp5" -}; - #define TIER2_WEAPON_COUNT 9 char TIER2_WEAPONS[9][] = { "weapon_autoshotgun", @@ -960,7 +1012,7 @@ char TIER2_WEAPONS[9][] = { "weapon_shotgun_spas" }; -public Action Timer_SetupNewClient(Handle h, int userid) { +Action Timer_SetupNewClient(Handle h, int userid) { int client = GetClientOfUserId(userid); if(client == 0) return Plugin_Handled; if(!DoesClientHaveKit(client)) { @@ -1057,7 +1109,7 @@ void GiveWeapon(int client, const char[] weaponName, float delay = 0.3, int clea pack.WriteString(weaponName); } -public Action Timer_GiveWeapon(Handle h, DataPack pack) { +Action Timer_GiveWeapon(Handle h, DataPack pack) { pack.Reset(); int userid = pack.ReadCell(); int client = GetClientOfUserId(userid); @@ -1071,7 +1123,7 @@ public Action Timer_GiveWeapon(Handle h, DataPack pack) { } return Plugin_Handled; } -public Action Timer_RemoveInvincibility(Handle h, int userid) { +Action Timer_RemoveInvincibility(Handle h, int userid) { int client = GetClientOfUserId(userid); if(client > 0) { SetEntProp(client, Prop_Send, "m_iHealth", 100); @@ -1079,11 +1131,11 @@ public Action Timer_RemoveInvincibility(Handle h, int userid) { } return Plugin_Handled; } -public Action OnInvincibleDamageTaken(int victim, int& attacker, int& inflictor, float& damage, int& damagetype, int& weapon, float damageForce[3], float damagePosition[3]) { +Action OnInvincibleDamageTaken(int victim, int& attacker, int& inflictor, float& damage, int& damagetype, int& weapon, float damageForce[3], float damagePosition[3]) { damage = 0.0; return Plugin_Stop; } -public Action Timer_GiveClientKit(Handle hdl, int user) { +Action Timer_GiveClientKit(Handle hdl, int user) { int client = GetClientOfUserId(user); if(client > 0 && !DoesClientHaveKit(client)) { UseExtraKit(client); @@ -1091,15 +1143,13 @@ public Action Timer_GiveClientKit(Handle hdl, int user) { return Plugin_Continue; } -public Action Timer_UpdateMinPlayers(Handle hdl) { +Action Timer_UpdateMinPlayers(Handle hdl) { //Set abm's min players to the amount of real survivors. Ran AFTER spawned incase they are pending joining int newPlayerCount = GetRealSurvivorsCount(); if(hUpdateMinPlayers.BoolValue && hMinPlayers != null) { if(newPlayerCount > 4 && hMinPlayers.IntValue < newPlayerCount && newPlayerCount < 18) { abmExtraCount = newPlayerCount; - #if defined DEBUG PrintDebug(DEBUG_GENERIC, "update abm_minplayers -> %d", abmExtraCount); - #endif //Create the extra player hud hMinPlayers.IntValue = abmExtraCount; } @@ -1107,13 +1157,21 @@ public Action Timer_UpdateMinPlayers(Handle hdl) { return Plugin_Continue; } -public Action Timer_GiveKits(Handle timer) { +Action Timer_GiveKits(Handle timer) { GiveStartingKits(); return Plugin_Continue; } +void Event_RoundStart(Event event, const char[] name, bool dontBroadcast) { + PrintDebug(DEBUG_GENERIC, "round_start"); + // TODO: check for any non-assigned specs +} + public void OnMapStart() { + PrintDebug(DEBUG_GENERIC, "OnMapStart"); isCheckpointReached = false; + witchSpawnCount = 0; + witchLastSpawnTime = GetTime(); //If previous round was a failure, restore the amount of kits that were left directly after map transition if(isFailureRound) { extraKitsAmount = extraKitsStarted; @@ -1179,8 +1237,41 @@ public void OnMapStart() { finaleStage = Stage_Inactive; L4D2_RunScript(HUD_SCRIPT_CLEAR); + if(cvEPISpecialSpawning.BoolValue && abmExtraCount > 4) { + InitExtraWitches(); + } } +void InitExtraWitches() { + float flowMax = L4D2Direct_GetMapMaxFlowDistance() - (FLOW_CUTOFF*2); // *2 to calculate (max-min), save a minus + // Just in case we don't have max flow or the map is extremely tiny, don't run: + if(flowMax > 0.0) { + int count = abmExtraCount; + if(count < 4) count = 4; + // Calculate the number of witches we want to spawn. + // We bias the dice roll to the right. We slowly increase min based on player count to shift distribution to the right + int min = RoundToFloor(float(count - 4) / 4.0); + extraWitchCount = DiceRoll(min, DIRECTOR_WITCH_MAX_WITCHES, DIRECTOR_WITCH_ROLLS, BIAS_LEFT); + PrintDebug(DEBUG_SPAWNLOGIC, "Extra witch count: %d (%d min)", extraWitchCount, min); + for(int i = 0; i <= extraWitchCount; i++) { + ExtraWitchFlowPositions[i] = GetURandomFloat() * flowMax + FLOW_CUTOFF; + PrintDebug(DEBUG_SPAWNLOGIC, "Spawn location #%d: %f", i, ExtraWitchFlowPositions[i]); + } + witchSpawnTimer = CreateTimer(DIRECTOR_WITCH_CHECK_TIME, Timer_DirectorWitch, _, TIMER_REPEAT); + } +} + +/* +Extra Witch Algo: +On map start, knowing # of total players, compute a random number of witches. +The random number calculated by DiceRoll with 2 rolls and biased to the left. [min, 6] +The minimum number in the dice is shifted to the right by the # of players (abmExtraCount-4)/4 (1 extra=0, 10 extra=2) + +Then, with the # of witches, as N, calculate N different flow values between [0, L4D2Direct_GetMapMaxFlowDistance()] +Timer_Director then checks if highest flow achieved (never decreases) is >= each flow value, if one found, a witch is spawned +(the witch herself is not spawned at the flow, just her spawning is triggered) +*/ + public void OnConfigsExecuted() { if(hUpdateMinPlayers.BoolValue && hMinPlayers != null) { hMinPlayers.IntValue = abmExtraCount; @@ -1199,10 +1290,15 @@ public void OnMapEnd() { cabinets[i].items[b] = 0; } } + for(int i = 0; i <= DIRECTOR_WITCH_MAX_WITCHES; i++) { + ExtraWitchFlowPositions[i] = 0.0; + } ammoPacks.Clear(); playersLoadedIn = 0; - abmExtraCount = 4; + highestFlowAchieved = 0.0; + // abmExtraCount = 0; delete updateHudTimer; + delete witchSpawnTimer; } public void Event_RoundFreezeEnd(Event event, const char[] name, bool dontBroadcast) { @@ -1409,12 +1505,11 @@ public Action Timer_OpenSaferoomDoor(Handle h) { return Plugin_Continue; } - void UnlockDoor(int flag) { int entity = EntRefToEntIndex(firstSaferoomDoorEntity); if(entity > 0) { PrintDebug(DEBUG_GENERIC, "Door unlocked, flag %d", flag); - AcceptEntityInput(entity, "Unlock"); + AcceptEntityInput(entity, "Unlock"); SetEntProp(entity, Prop_Send, "m_bLocked", 0); SDKUnhook(entity, SDKHook_Use, Hook_Use); if(hSaferoomDoorAutoOpen.IntValue & flag) { @@ -1427,7 +1522,7 @@ void UnlockDoor(int flag) { } -public Action Timer_UpdateHud(Handle h) { +Action Timer_UpdateHud(Handle h) { if(hEPIHudState.IntValue == 1 && !isCoop) { PrintToServer("[EPI] Gamemode no longer coop, stopping (hudState=%d, abmExtraCount=%d)", hEPIHudState.IntValue, abmExtraCount); L4D2_RunScript(HUD_SCRIPT_CLEAR); @@ -1435,13 +1530,13 @@ public Action Timer_UpdateHud(Handle h) { return Plugin_Stop; } // TODO: Turn it off when state == 1 - int threshold = hEPIHudState.IntValue == 1 ? 4 : 0; - if(hEPIHudState.IntValue == 1 && abmExtraCount < threshold) { //|| broke && abmExtraCount < threshold - PrintToServer("[EPI] Less than threshold (%d), stopping hud timer (hudState=%d, abmExtraCount=%d)", threshold, hEPIHudState.IntValue, abmExtraCount); - L4D2_RunScript(HUD_SCRIPT_CLEAR); - updateHudTimer = null; - return Plugin_Stop; - } + // int threshold = hEPIHudState.IntValue == 1 ? 4 : 0; + // if(hEPIHudState.IntValue == 1 && abmExtraCount < threshold) { //|| broke && abmExtraCount < threshold + // PrintToServer("[EPI] Less than threshold (%d), stopping hud timer (hudState=%d, abmExtraCount=%d)", threshold, hEPIHudState.IntValue, abmExtraCount); + // L4D2_RunScript(HUD_SCRIPT_CLEAR); + // updateHudTimer = null; + // return Plugin_Stop; + // } if(cvEPIHudFlags.IntValue & 2) { hudModeTicks++; @@ -1491,12 +1586,14 @@ public Action Timer_UpdateHud(Handle h) { Format(players, sizeof(players), "%s%s %s\\n", players, prefix, data); } } + if(players[0] == '\0') { PrintToServer("[EPI] No players online", hEPIHudState.IntValue, abmExtraCount); L4D2_RunScript(HUD_SCRIPT_CLEAR); updateHudTimer = null; return Plugin_Stop; } + if(hEPIHudState.IntValue < 3) { // PrintToConsoleAll(HUD_SCRIPT_DATA, players); RunVScriptLong(HUD_SCRIPT_DATA, players); @@ -1512,7 +1609,7 @@ public Action Timer_UpdateHud(Handle h) { // Methods /////////////////////////////////////////////////////////////////////////////// -public void PopulateItems() { +void PopulateItems() { int survivors = GetRealSurvivorsCount(); if(survivors <= 4) return; @@ -1806,18 +1903,16 @@ stock float GetAverageHP() { stock int GetClientRealHealth(int client) { //First filter -> Must be a valid client, successfully in-game and not an spectator (The dont have health). - if(!client - || !IsValidEntity(client) - || !IsClientInGame(client) - || !IsPlayerAlive(client) - || IsClientObserver(client)) - { + if(!client || !IsValidEntity(client) + || !IsClientInGame(client) + || !IsPlayerAlive(client) + || IsClientObserver(client) + ) { return -1; } //If the client is not on the survivors team, then just return the normal client health. - if(GetClientTeam(client) != 2) - { + if(GetClientTeam(client) != 2) { return GetClientHealth(client); } @@ -1829,14 +1924,10 @@ stock int GetClientRealHealth(int client) { int PermHealth = GetClientHealth(client); //In case the buffer is 0 or less, we set the temporal health as 0, because the client has not used any pills or adrenaline yet - if(buffer <= 0.0) - { + if(buffer <= 0.0) { TempHealth = 0.0; - } - - //In case it is higher than 0, we proceed to calculate the temporl health - else - { + } else { + //In case it is higher than 0, we proceed to calculate the temporl health //This is the difference between the time we used the temporal item, and the current time float difference = GetGameTime() - GetEntPropFloat(client, Prop_Send, "m_healthBufferTime"); @@ -1845,15 +1936,14 @@ stock int GetClientRealHealth(int client) { //This is a constant we create to determine the amount of health. This is the amount of time it has to pass //before 1 Temporal HP is consumed. - float constant = 1.0/decay; + float constant = 1.0 / decay; //Then we do the calcs TempHealth = buffer - (difference / constant); } //If the temporal health resulted less than 0, then it is just 0. - if(TempHealth < 0.0) - { + if(TempHealth < 0.0) { TempHealth = 0.0; } @@ -1958,6 +2048,7 @@ stock int GetLowestFlowSurvivor(int ignoreTarget = 0) { } } +// Get the farthest ahead survivor, but ignoring ignoreTarget stock int GetHighestFlowSurvivor(int ignoreTarget = 0) { int client = L4D_GetHighestFlowSurvivor(); if(client != ignoreTarget) { @@ -1984,4 +2075,63 @@ stock float GetSurvivorFlowDifference() { float highestFlow = L4D2Direct_GetFlowDistance(client); client = GetLowestFlowSurvivor(); return highestFlow - L4D2Direct_GetFlowDistance(client); +} +char SPECIAL_IDS[8][] = { + "smoker", + "boomer", + "hunter", + "spitter", + "jockey", + "charger", + "witch", + "tank" +}; +enum SpecialType { + Special_Smoker, + Special_Boomer, + Special_Hunter, + Special_Spitter, + Special_Jockey, + Special_Charger, + Special_Witch, + Special_Tank, +} + +void DirectorSpawn(SpecialType special) { + int player = L4D_GetHighestFlowSurvivor(); + PrintToServer("[EPI] Spawning %s On %N", SPECIAL_IDS[view_as(special)], player); + if(special != Special_Witch && special != Special_Tank) { + // Bypass director + int bot = CreateFakeClient("EPI_BOT"); + if (bot != 0) { + ChangeClientTeam(bot, 3); + CreateTimer(0.1, Timer_Kick, bot); + } + } + CheatCommand(player, "z_spawn_old", SPECIAL_IDS[view_as(special)], "auto"); +} +Action Timer_Kick(Handle h, int bot) { + KickClient(bot); + return Plugin_Handled; +} + +enum DiceBias { + BIAS_LEFT = -1, + BIAS_RIGHT = 1 +} +int DiceRoll(int min, int max, int dices = 2, DiceBias bias) { + int compValue = -1; + for(int i = 0; i < dices; i++) { + int value = RoundToFloor(GetURandomFloat() * (max - min) + min); + if(bias == BIAS_LEFT) { + if(value < compValue || compValue == -1) { + compValue = value; + } + } else { + if(value > compValue || compValue == -1) { + compValue = value; + } + } + } + return compValue; } \ No newline at end of file