From 47a2f113a14e8d372f67df2daaa0d4ef1fe97db8 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Wed, 6 May 2026 16:03:37 +0000 Subject: [PATCH] Autosave: 20260506-160338 --- assets/pasted-20260506-160112-7c934626.png | Bin 0 -> 276782 bytes backend/src/index.js | 3 +- backend/src/routes/gameplay.js | 58 + backend/src/services/gameplay.js | 1108 +++++++++++++++++ backend/src/services/osuCatalogSync.js | 773 ++++++++++++ backend/src/services/sync_jobs.js | 129 +- frontend/src/components/NavBarItem.tsx | 3 +- .../OsuHigherLower/AnimatedCount.tsx | 32 + .../components/OsuHigherLower/GuessCard.tsx | 212 ++++ .../src/components/OsuHigherLower/types.ts | 111 ++ frontend/src/layouts/Authenticated.tsx | 3 +- frontend/src/menuAside.ts | 12 + frontend/src/pages/index.tsx | 388 +++--- frontend/src/pages/play/history.tsx | 298 +++++ frontend/src/pages/play/index.tsx | 768 ++++++++++++ .../src/pages/play/sessions/[sessionId].tsx | 294 +++++ .../src/pages/sync_jobs/sync_jobs-list.tsx | 199 +-- .../src/pages/sync_jobs/sync_jobs-new.tsx | 2 +- 18 files changed, 4123 insertions(+), 270 deletions(-) create mode 100644 assets/pasted-20260506-160112-7c934626.png create mode 100644 backend/src/routes/gameplay.js create mode 100644 backend/src/services/gameplay.js create mode 100644 backend/src/services/osuCatalogSync.js create mode 100644 frontend/src/components/OsuHigherLower/AnimatedCount.tsx create mode 100644 frontend/src/components/OsuHigherLower/GuessCard.tsx create mode 100644 frontend/src/components/OsuHigherLower/types.ts create mode 100644 frontend/src/pages/play/history.tsx create mode 100644 frontend/src/pages/play/index.tsx create mode 100644 frontend/src/pages/play/sessions/[sessionId].tsx diff --git a/assets/pasted-20260506-160112-7c934626.png b/assets/pasted-20260506-160112-7c934626.png new file mode 100644 index 0000000000000000000000000000000000000000..bda6232bec2b59920427bd2d798dacecec8891e4 GIT binary patch literal 276782 zcmV*rKt#WZP)8wHm+tOPI{{G<156ZKX^?J^5b18DL=-zHmG172+xNbGV&?xl?+aH{ z+|~Vd_y2vnoc*17=ggUT=9y=nn3;1~S*5CV{}L)xt6P9SYFMRe-2(hko!jNNCGfvO z0@Z3)D!?DwLj6irucJWuk@+M33zQ$3f`&I`ZnC(7t_w1M$iq#oZmPq`?d!G#ZcE_* ztORZw@c-GVyUqA*2@rDIfNyKTZ3+Azmcaja0|o=Y{}&0~?)0_<{?AL`w(CtK+Ws8=@q%r>X$N82>#0xvX;W58t_Z;?{d*z(aZ1N z+`0hut-ei0047mEOi5KtA}AHADpQ%FKcpzJ*&K}8Za(+It6Spcu2A9TM?r}p0h~+1 z6q>}SA}cyK0aMWYd|xQwS0ttznrS&wrWsr}g`(JGA(&~p>~6xSpj=Rc!;I<8w11ta z+#>M%^w+iiTc7>|#tqdiFgAjR>(d<>8MF@SVcD4kHCCA6iMc|sMRx5WLdE(c8Aru zFwu!%0z7DjVY4YrqJ}VJs4(RmjL5Ribt*~V!6w`FkWK^$*a(VP5l9N-Pdg`fal`94PUPV?7o#*Cehl2qv;PvO{!Jc8^SFc{u!a*t^ z9E%JiNTXD5r~hpdz|?alu8*1%1~Z5Pd8o92`BF6y(z5e%GcvCEy}70y6ddt@r(eC6 zpPQ}uyf#VJHKE$wzOa^^o2&ctB{QrdqL>02C^!*R%FXv>WoKn)Wcqx*^z z-aJ&!xOPF2h^nf&`9AQO=gT(@Kj9&iP!^3&oczs;A(|0l2}0t;(1oG%un~H?bLY`x zCJr7lx^&63{G6QpplEZ)eZ%_qERz}|3FB`Pv|e&b3Sd3o>VE$D=c`t(qG_7o!WHAu zOx^Buy!P6wHEUD>KmMRzvv%EymnQ}u$47m5M=8T&%C$caY zG2jJmMgDf#f4BrVy;~mbhZsdjav`Ur7yg%-q=JlPrp9o!6Bt0AyCMQh3=f3+V zPI!Op=ura)zBgvfn7XxU=jG+4mMT7E^vG%zDv?0AMU$ozKKNkZ;6eTR_Zc^Kc#GzZ zb%S!DP^w6hN@X?6>#bI!#`p>21`X-^_M6=lA!+%cZe3p-H+tB};k^nM@?6W#Zr0}R z!9$0S8aupk^O{T!!TAW75aqB14D)Zy<#jVh4M7=aQhp$O|2_9MtY3fH^f{NWX1>_v zxnhM1b$RBQyY9NHYQ?fPNkBZP{FlHfi7-NtDQH-|YPHm)WJ5Qw4DtH|iOI>xb?x@@ zcN@MpOtVzkGS58o%ukztShaM~r|Z_7KX* zu2~Dc-1p!EPd)d1sq*DZ7cVB8=Ai?JmoNKh<%*BL`s$l9rPAVJoTjOn!s3rH+0f0( zm8!IB-~PLAzFNL`QRRviTHblr`Q|B&E zmakYQ6bfk?Mid?6-%1(wyOMxuah;JMVX4K6w{G6-lNBqsZ29^0sf!g$m8)8<1^{ z>JgEr_CPr2TWa;8ME1J;c&Q8rAnPTKmBg6-c_pB z@`trDi)WcA6 zo2*nSTjtF1<0lUvhgp`aT)s}@hHF3i=;ZM;E5H27Rk)m8RVI!YvUT&$PuG2ulkKfk zv7$FG-)^^Kj0O0k`GxmFxVGMMN=zy%4maUK3xy|)8{e!!quh+F`^~^1gD+pbBH103O1pRO{PD-l?{x3gZ}5oP^&6+> zWL2wKIVRS*{;O|JpS@VALPa7>?26$~!1h0Zo7*J*uStLkf<>mHC|9m!Oq(|K+`01} zk5f<*1>Q=+6nfaM$g--Y7Af4cal@0xk6z8Zx@^U=wvV(MG<0~T*Sl!Nl4i~8*R5M^ z(V_)}5!H?pEN&WxM6CEp5Z45UU}U>1rAV>+@4NTgufNR8%b7iQ*2Qb-un6cd=-X6T zRn)kcn1>!}yLJ2SOINO;3B%4%Kts7KD`!rh{CM@sr=EIh*oZMlkDXq!WKl5aFP2s! z5Ykc#l}Ju5tTO7b%i&+-RgXjqUggyS~ zBUjI!Ub$$&wQJXOlP9GVlVt~X3pTs*hm`)}3yD&A3SBqC;V@%TOiWy2Vj>RvLZN^p z5xBj%iAM^S{4ik5{nnP=FPp9 zm#fC4RISO=Cc!8mCq@j=$@PU>-gQ3=;lRGVt{A7& zgNWlon4wHqpp-JRVWaA)g=2sGX}ir9$GA#`3?~8w<=k+%9I>&nmoqa@WaJbnSE)>D z;cwQhedw`{?@#&g;X7Idu3px|n$PPkUAA!dcV1t$a{ca|Mz<{tpF zh9z{Img$J}{$MZ|2m}NEKu%T$H*~Mh>ko!u+vsuq7vGGVI5{WJ+ool!#L4RIeC;<2Zp+F#TN1NuGw`{<2 z03V*HuokvpfKbbo)URK!QPZaL7cL$#a&%61&O;C0|NXb$KGCJi$noR%?D{!B^GarV zPTBI6-+aB>*I#|MaPe~8kOZd^gWX19QTn5saWG22FF_**GyOSNzxn3d+70SI|H|`S z-+1NJ#f#ZK-y`iF!T~^X(c*XB|8Vu1wV428f?!K5tcG~}8~9Dfj8JBxEpd6`8#HbD zXvfDMeXMQiQl;zGtocN{_GyI+-E;TdZQ8V{QKNe2Cp$gg>9M!Ey=Zr+7cX9{S-JYe zF%t&#d#`uDzLzeiw{8EJ%LxLBa(quc*`;&GCoY}8P`^p*M>;-d>UtXy=pZ#e*44l0V78a z8#j2!h%1>nKmWLA>5?@>$V8F^rG!yNg+k1?UwJy&BmeZ%me{ytO=owuzNb@%hf9|# zT(3o=<`3RSZ0h5WJy|-f%!Y4&kg$408`v%3gb)N_hr@>Or)x%+r=NND@kc6`F1B&= zhMEoP-Fe5|cfsh}G+eQEnJ$zOBPSLsQaCR^=jmrV*KN{7QSG{JQX*NP)~fx{ueKKYyuo>9Tf7iFe0fNDjL?bLRA~ zzWVBuHS6*+b5vQ@f}w>=mj1MLyR68eX>$$DcTH zLb1uAfFBDa5}NQ8d%`4>O_yu1}I>miIfuK^zlQpW=_t}&$o<ZKmA}88ihfS7u@7y(Y#!OQ)i>0QnSh{%qmtVxhB@{1F z9P8@&^XBZ_vs1RID^{;syY}NEg^Ls}THF=m*0>={f6BgY7%Wy@yFocYD)pTi-5JHv<$64}21Mk#8W-28m~XLIMy zojQHyj`0?WxEm{N{JAL}}`0*2G&YZP&?OKP!VNekah0H);+onx>4(!V} z!@8lvo}+XS9Ry)teEH>$9lJxCE~yH3$LrRunL2gWlEo{hOrEuJ#mBkcte>}T{ORW( z!vQ~Zl4B_!nGc4RfJ9NaecO)dGiSq&zWL_c#DwInTeprLJ$m|#>4y)UPKYlQ2L8{(I9fnRLT8Bh>yV`BfzbiAWMg1z8kIelerD000mGNkl)5a&mHF0s^oVfho1v`Xi!$qdXdfQ6VlqE-p4UDJjM6j>RH54k0)p-V+;> zlA0158|!ho&|^Y!lEdwaPl&h7)@DPAB2kD?PzE0cUxO0@LO7`1#($dx7-JG+*pDd+ zi;anQIy{1NNw&g+B?<&2Xa)}_CCA3cL1_ymC#5DOCApkVRaH|{3qhBl%!c4hmR(Ml zLslKCEwNAvXH=FXivpV8Am+lkmB&)afZxxB25WF5?7HKN7D@AXVi_ZDw*&8CFHmp8 zwDxsT3P^Dr>w*r)C!qJl#02QJ5Ii<6wrttbi3!OrR~*4foXnDwW${&#)bSX!3c&5L|$^!L|hGpLeUJRSdV}uNQUDDDB=~CE+|KJP)7PE!Lh8l zAr8(BT@NuFKnNUVS%(cE$PtuH6Pa)bCGf8Tg2r0FZgc8kgE6KVra#~}^&o@A;`=za zT#w8M*Z`tzAj2dHM9c`OXkj!(;qMWxhVp_8^8Z6bySttKt0jPGg04dQDU~=5pN$}9 zUqH{$aa5lXim67K347p{W=T+B0M&FII!3~#p~$ij2mp*x3IxI-ra*rz)dCrY_)7@I zONOIu!^CG{Ri%`oIb(_}sfK}_vLu8E2L0i1*f2nf$dXk;Zd};t;T57fTA3yX14u)m zfY+C2n1)0_1Th=u(0;tarhsz-Z8WgG$7}N!Uw~c!9PR>CkOExi^+tEse=U-R0Yb>2 z8SDq<1c3V}uGjmEKOl(Z1nAt<4h%5Zb65*1Op*wsWf?k^8R}r(ha|~(R1_PfRt5?qF^M6n5FF0_Vm7E_K`^TVNXRlW zQCN`;wgE+?RCU-Tt2LI`P$kRAtyYAfCW%~7LMT6gC(2N4CCsuyjwcjylYmvIqVG2LmB3d_zX! zIs;51x}g!y?KTB+*951kY*SRqIpt<37*uRFEI*uf)c^_2j1G?x%jbc96j-jHCOlav za_NT7&0kfBRx3#1ATU4xnS#RGng1ISh-i+WFd$Bl2Y$sjC)A*n1%p~J5ay-`1cK4` z{y-o-JsrxdMZRA`y-^MuNBHH2flnk7bdeB2STvkl#F=CWVuej_9;K2*5Vv6ns2+x{ znuL12exENwE*LD(B{TTydg47kBI6~fWr2Y6UqEhO{~sg(mA^3^40CbQ z^f8MYYra@GBvi#wBCS}RdezfPq{5`3uEmO{)vI5(S(66Ut5!;gcL#j=gwgoq#Nuhi zVjMQRjBTUNMI_?ks7z2HxMp(2<|tIOaJh2jB*IX_sU)eaa)nZ;uj@Q6A*EiU#^owj zi1#>!5u#CjBi8;d7}h;5cZG@-n>22mmR1rL6j^AK@|7yUpek3cSgBG)K^40*rc%X9 zO&T}!#JGeosRV7Mf<}fC;l;|`>Sl&SOhzy;NCA7&d|zInV#UWznA+-&``&)5$3yqt zo8Y#+*{$m{ot}8{#jagndf8#eGD1fm7&bZpqHS+QJX*%0KS%{G7@Okk-T%Ei?`#ze z=7mh7Sg8_ky#AcqDUKaG{?W>hkDoZp`){JGPIwXhdrK*-L_$NTUXX5L9 zc3xf%mN$Y+fshdh__DLpL*aZbLXZQ-^b6ntG0xlg*Gqs2#!X_HOc=zQo1=yO&bQgbgk!j>kJabLq;pcYC}$aA4m_lgC%D zRjqr^9yXiw@Pqdb8#dyR_K)V}dK)%q*zdgoW5>V2$-?CNn5hI6n ze6mwkPEN%N75nw;Gko}v&Rw1nl1-!Zjn}&M>)oeU&pwGMsjk?Bd+vLnecOkI4Cwd7 z;~gZK!KzK`q=6Ag7;OEg;(y<`xG*JI#;yw=GTwdXtukfPd_J$DDA1W3%)Y7a{L%0h6NVUZFFD~ zA}gq0sX~R;En05cvRPK`Hq{Xd8IM2mIBK0ac>;k%lIWLTe%-hK(CIU0HLO>oeCgtZ zTB=JB76o>;8kFRN52wHNPWNGhhm{)NV^=A5&t4}=smNzoLz-s%s`cM{K%e+B2Vk_(y6_Y}Bb=4zH$%1#_doI2gAXM* zR67^@cJAJ}XLp->?y6R;vdoAuISw15O`<6koLK83>j_p|Ku`~bC4!-vXU?1{Rk?bn zXPzxvCN0)uyPSD-)6YL@dg$Q6gBv$&-nnyMt!mXfJluBUhAmru`sw)>Iu%OxZ2Imy zQ{!h&o&Wm#O*{71)&NfymgD_@M@<{ zojQ1MU$GL!ZLS!?B&d`Fm_AAlu?umYne+WYQ{L_Pd{0` zbn&w0t?%qJU|_pPI-EOuZqKfrzP$VkXD@Epu<7{mW0fmc%*;y9&CAI5=E6G^N=@Ck zX`|QcKXc~%&Ye4tA3M%DR#-GXJ_#F@(`V1brX)3P+GNGDrH2n5n7??5Q0z93D=Rzu z__PrWsabPR-DZFFn6?*WP^x zj}yWQ430@q5WQ5%Qr%we)}qy2*REw+i}u`1Zs;#O*QIa&{&(GfuTKlXrrvtv%}yOU zezNW}gOk+M6s+V4;ot<+B8X&vmlSkly@3drB*}`Bl9by2-S@s(|9yON(#fkAb2R;h zZm*Y3D>P;Na9s;i%CIUxYPI<*H$-EYrmCuWIT@u&C0@96;_|huT6LReUdj*VnMsL- z>`s@-F?tpXX*QcfmJ}nba}y%Knj!?N7O-2!!kUI{3Xv=}98Me7;<5&)~i|9t=Mcbe2o$phcD#u@r9Dz$uale*SckkMh6a^IC&x69TzVscR3s} zHb

k(F`ngDF!T?zqREdbWG-KE(^A`t!2k0$eVa>T!BQK}AriVWq-i;$j6CSbZ_Z zWLc&+U4KO$x9k4n5@1xK3_561W@csP>6#TVNo0)%HH!kX6YvMp($d~|^$jTV&L4L= zB|3lBtao}0=-GdGrr+0R;CuJpf1k(gdFGjC%9SfuyLRnHjT&KQK^dIodhgY6C}aHexuzV4gC*Hy zM95&yAR;9-;pBmX!v>6a4;RqQj;iz8E`hWcNP3C(WAH{+Ukhgt&yn#A_$c zy!zaWP_sO$pU=Ez$dpTzV2qT)n-Bq01c9PN~Q)gBRm)gP{p29s3<<|1%0{KGOtmIj2}O?U*F!th7LP; z;4ro{x^5;WBzwKyfX}B$@|kmI`wi$nZ1}JmRcoddEtZp!dFS2tVi#1iYSmbmE$H=u ze?bXTB*ktc1fLc{U=^9$`1eb|QUKjZN=h0sbO=s#p)Z!*SvH5U000mGNkl_m|ifpRPBuQejqfp_J9#_oqBS&Y>nze7=UM%HwP1AKF91de3 zL40#!4C-oVp*gc=?%uceT4uIs8ZmD7&fVK)%$Sm&pNqHxza8+0;^UM1_3r0Tl_`@a z`9dKgI}k7#3`)R0gkgwaASBC-5yS4XgSan0A0I>w!DHfL>(r@}my>(!$dRBQ+8sn3 zZq&F@c2;IU3rjXTrwsLBm?YwukpDfH!5He{oJrVg8hI6*f7e&;jpRc2#j3kIRX9H z*-H?O;&h(Amf8Nvrv~-!mFQ6)e(0eA0|u2URcg%GF`b|3jNmzO;-scco3?G+79}Op zinVFe631yUBv8ZtQzu4{>$=_9vC9kN$4?wHWN4o^UjKacsy%ymc*DVEAAfq+eGiQt zIpXz~o?pIr$%S(lXU(0zXwjmnQzn!zQ#>~#ef8>(>osUNb;g`$pYK|-WU2Av#x7Yf zcjBm#TfX^b{mM_4%v)N%YV{AMPJ85@J3g8@Jsj}od;MW9h^z(ze#|-{B$^^~8~;`b zM0Gk6ml`&#pIRuHM%3Nn;l?Y!&urYNRZ>!Xg(_v<8PKQS$f1dai@x)A&ymAN^zYH* z_^tyh<}N<4YtQP{YoHQm&Ya!3bI12T{6M+D>d!Da3|NHy+qZ66w0QZ7wd?ln+qY-; z_8&L@uyNCOAFWxnYR&2^7cZ?}`&rm$R;yayrpCVV@|)A9Ol#D*9+!m4IQGESl1-;c z@u_cie`o0Efg^_X*t>n>XP$$kI*_eYEvGH~E~+js5>h4mL+ ze70AQcPCGo+JE5CwV!=q3W~rEhersH00jOB7>5P4Kn;jSl_eeyZ2bPar=NfE=$SJY zFP(q>`DZu${PWr`zZ^Ycc;D{t4jDLT(ZYpi&z*aJ-246d_I>r0u6_IU-n)O_4;wa( z95MQ>H{a^jyZ89<-wUlOZ)WdJ$}rn_j>jGWc5cjMaKU&Zu#-8 zx8E5(X5`1K*2Fm7~?zuhpN*84pLK6mn>b z<1byhI(6!Y!-o#)-J|EKk5*G6xjml5`1s-}h2Y=6{`UK##Y#%Dq{<36Ii+yUMp9x- zQfe};FTVI{^@^2=2{ExT&Xm+7EEtCj8=jl*J9X;RbI(5Czu(~T?|;yzPru!}ck>%8 z;8&GxxjFeW=gb~H3d%Kf`A16`k$(7o^RQu~#*G^{a`=d|Cr-sVY(H+^`0NYMVNw0T zgb(sEb7fhz*=#Uc3KN6bz=p`JFD9Gh`YADNohpP=mrcbwHh}%RVcMMz-859YjW8Mr z`*m&vG}ELif;PU^{z6i)Xr80PU%>DfEsvzwk`Teec1agTfD@BS%%Kp1JU7F-hD9un zl=ZNN4KOiHQx6CI_%=&5O$!FGyb-zi0TVUDVZ#IyCKa+UsKglwhZVyB1Xj`p4~K)` zO;Kb8izSXvgJ!@mazlPerf#QQ59;Bt84S_LN}MRNX&46LDkTyTEa(dwprCP^!>QV+ zs#r(#et%F<#uQ1B1tkV*8l37HWfUtSe2p|Q&)2~*W#sntZ;$}D!YpT0W0(<1Ws(Ea zClN^^lyPRQU6jif>*QQ(Pkct;Ltp&hXtkirc`7!t)h0OBJIVq9`(4{1U=%lw7ZGQD6}|5xS8&x0C-L5-_aEv8L=7wYk9t zCp7YwV5aakGE)?V7I1h8-4PTzVEqxF#EE1wJPH!6$*@mkf{;jkMl3y{ctmH^DufQ> zkrQUp2wC!*ixFsuRaWp887MGPt4E70vGUv^Wbp%wV9+wq2Rop7y*Wn#>R6Qi;0Bdj zzY&xHAW8|O5TPCE615B3FhKy6{0^uB5UZSWuuFxNC4_NGh{YVqD4A#zctV|7i4rN(e5 zDE&iVsDJnl!-IpsYfhM;sL2W8_(94403dK3A~FCj1Y;7G%>IBkJ13J;8YOO3LJbjp zB7}1EPOe|vdK3tU)XJa`g9nhYs^JF!0i?HaTLKXYP)@B-#PI-~LIj3x!|4+kFm7s< zGr=g{p$5UH8SK%pG&Cbmza*$9h!q=9lM*9B0dFNDBKih8fTh@xN4&8fiJ+j21viJk z;OLm*MHDxx;VDv+fFEjwOmdwFDgbzWYy9e+-G2T5iq_}%=i)FsD=QcXazS%_T27un zKPOiU_+f04By+km|`R_)cU zFTC~IE2T@ON$^wXl~UBl23VFW@Q;#KnNX8 z1fx0?fl$bsmqoGHG)%A8m!6xMo1YU7Xd-N>ZXoOv!laVKO=cJ(J0~k6<63TBUPgAd zAqbI_aKP~9dh>Iy1_RkR(+!15PIg{ic8;b8tmUL&L?B|Lrhpbl7{ghM>CMg-dRSFe z=zmsrc2*YJ&i2pYQW}!926Z!bpJ*qsT&}1cf(%XRA1Rhr?lX zrfJ#>FLoV1dK}Jd(~1^hhW75;Z;l>4X557Fci($YFc>gRLs4Xh!x?S$=Tn$2=$odA z9em-0*mvK2702Cu`}9qSje*Hs&CF?a=RL)Xr-2PfK{riEU(t%2leo(yeQ1a$?w&!Ww_>*{9zhJ#_rI_g{bWZBG9@U$<-ipOk=M7?i5v zFtjNU2^iRg!Tf$1i>@1m3Kj0vtJepUCcO6AtI3J+fq+-S_EuG1d9z!uUOikkRSN|> zba-Uk`x8cv8CR`ZB|{5Q$`skgDc5w(G-#2+#rpT}HEhJdapT7H@AsbD8JC@vQ>jvg zabre~8#A_TyS8u;jhZz6;Dbq{MvZFIx)m&tT(>R)F90w`d;$MG_uMyf_^^by7_Z;o zplRb_!-tIW{K`Uq8QYDV zwQz^7M}hq(Sbn%&yQ z#TWZ_?aEBgD4Uj+k`R09__0kJH*DInMKCxgh>4n}f%Uf4;BVh>A<+t!C3CnpM&*zx zs#mY&GR<`h7M(qH?yIlA{rc-K?JieLe6s5FXnNQm$Ws;N(Z@T!@z&cNpX@Yj$N+qc zZ{Diqdjki*_S&0ozV_yz_XfnqdFs}y{p|By-g)O8Pi#D6tW4Qbx+(VT+xzpjpU#{= z8}0UX`X4L-OuDY~l;lF|)~#*SxItcCjwH)Bk5^Ho&p-cc&YU?rckJBs-49i&RKW_f zWcl*<+;{J{-+q^QEgh!Sv{loew*I(j^QMcZFC@mt6e(I5WFy|6IUNpA3x~tOV0g=x zpT7TY!;wQr1(jO0X?^M3Nk+{w8XLxv5waPj2s zJv(Jd#^NLt3UOfqf|vk-i54K**LCZ)y1;Q0BZev~VZ$_So|5INo;`Rfcr_>9=~h(* zpTMXhnR=MPF=zpsEV*JlM~|O;vFj_{yLZpe&u!VFNlt!N@w8%JtY1H5;Gj59d|I)z zX)~uyoi!bw@~ppVG=gi_tO^PH*eP?~>iK4|;t8gyGf4^tgHc`zQXV-%_C7GQ(d2;RAk5R$EnwnWwO$B-U@h3iR)~RNigVlxnlD3LTw*@;{4h4 zg9nc>SuupcDfZwN1T2dX%a97_-pKr_Pza8=3fIxOOXqWEPOV(NG%G775HdnR{m9|t zpRNDWW^=S^)jAXk+H5vM*KZK{Gr#zfMl>xXF9ot2 zFPtAacH)XPpC%?J_v_a?Ce|Gc1e{K%X<{?+XE?lF=l_@lWGInh%g)N3F?0I4bEh2+ z2Xy1+F)${FLK@VpTep`{cj3at_uO-Dq14osD^^RA43*Oi(`4k?=bj7r@;_R(^y0;f z2ul(p2)aU0O5g>=mCKjr&RMv7*M6_p|MJT(HK^YJr%kI?tR6FR^pvSH%9by8@X#T* z%ROo-F@Iy z*RBLZ`96Ox5D5COT)Dbn!Qy$d7ugk0g$k7@#rlIQs(LGaZkPQFCGc+`&G5~KVZ|mK z4p;T+Rp8CBC$?sslF0JPNs?~p-+cY`iWMt9`}7l4mQ6hz z3Irv^=8jA72mCQ^Pfkwen{U6-vsaHVzxpaCC;Q6PE3&LGiNQfoDmfiaN?BHVhTreQ zx;5SUZ?Xi!f#8?xznMF0-qx)Lt5&N=C7aH}O&V9r%s74U&|VlkngCHTG7EyU#Q_zVPD1?H=y@^pn-ARIgpLR@(>etz5BO%hs(r zJoY$~;QdI|%9ZZF_nwNCtJ>}Ml$4aD_(V|93`4Qm3Z)iq``|;ZTDD0`D~;oU#!VX4 zZ&2%rCpx_R@{1iiK9QT7d-lwE^az+Zh``Tn{KrXva}Lj5tXMG|FV(GA51~(yl}PBj z9<{Qwyw5z-<;f>IUcPd%dd*r-KizrRqJ@3meRoj5_dfsZv%FmIl4VP`{`ga=5~W{x z<)ydZeJc>sj-NbjS5%Xmszr*xjG=hXJ^%c3&p!83*RGeZTsnIA;PK-}AARD9yB~P4 z>npG9+O-3^4OMK~sByctZ4c}}v}@-cITC>_17Va?hHdae4?obfQN!YCCEIs+tY*y` zHLF&6_2rjd?e<2yc8~tFb!S$Nw`tSnk3QCJ^~cK$L&HP~!A;Zp8cYd^g8aetD+5*( z>rbe^{`%_~)2775I1eA$KXJy)d_v+2rNkw<;$p;{>F=LBe%S5ugmi;pgjmosjM2g$ z(8sQXqYo+=pqmCGW{h3RPQNy2#QTR&T`XQI?ZSm~Teog6l$;vlp(|I;KX>t5$+BfG zo;yEf@&``4Y8b|tapO;(ySR79u8&u*WQt4}4TeJ?RlH~k%^&)B_2+hH0$55)N=i(M zO)Zp=lY4c@kU?458H!>f1fBl|f5hqS^8Z^BuryCm>BUQDCybwb^2AxY-5%D0;+Ko# zTgj0Mzk)D}RqD<-7_(Uf*%9J={`Q-5viIk3A`jZc+E`eqT`~hqjlarH=9zQvD%ou-O_9tssfBpTYD%ERk+_Z7dtl2Jyy?D_g zX(da*aF#7wsmL}$IiUvHLj80TY_Q^mQgXAi=FVGScgA4b$Os27g-awJJh*qk{6&Ti zdzI(RUVu?3b_Z4vCW0xW3{3%HaRN7S%jtn~|59!kIu7O)MgHmMpJ&aQ@zJW4euMio zZRWf=lRx}m`jih(96RzygnprNQx28U0oMG;M2opF6>dnv@cIIamo5Kr@`qo3`DK_J z-+ce=?3pvL>z*-d&g^;fO|JjA;fLuTPG0%ZvdusKbnNKy)2GjF-mqDbW!a_@iG_3> zr;Af2PhGNj`RrM9A-hjL`FQ56=^uVLdG6e~aK=QS=V+g|)Bi*XSo4dmqP1ULxpMWT zOII8YJEhU(=JoN)3f;8vhZQSU&7Z$$@`qFBEtsE`l`T=>R+K9j&TiWBV^&UHLPF}k zefww3_;BW&nVc{n(irDQmIcBHai%+K)~x9>rb88F#%!u=SL9_MtsFUa!kV?~oKD-- zYgZ>toH%pl44jR{#U<)G&Rn<nO?4z;okKew1$NmHR#=SrC zgUJ&<{&%Y=;At({Vg4Gxf0EifH^zrv;ftDk~WSkO*t-lm;dEBu{ z32{k@TnI^06XOz#q!x>fDI6DDn8Pp7-_!XUC7ckzs=y&1%3-~d&=kfK6XUUcSDbb( zG0ACn$HaN!5|Wcr-L4ocW6*z$+vSX0cDvoxpqW z3l~XFPKi%UOiWEJ;;_frR1dLYuhr@8`#)O(*lote#WTht;U}tTP-a4?AuGB&#+HTyiSDGs%i#ntDQFoWtRiBm@@+R`m#>R(nDyXAac{YAGoxiKrAG z7ZV>(WfqqJ%`cRilA=&*li)VASdW`Xvh`2l@Pr2BmkUk__~rT6ITm@0ri2@YO;N!y zAcWAv8lzO0CK0A}fJCHVKqHpti!{2CAi4rKo^J6gC@B~cUJJ;Ga#?0r@NhvPP=mwi z;0+Oi8^V+onH#32>sCX~!Avj^4h2zQsy2MV3UhAC*k=ghbl`-5Dykd|hENSmhQqqk z;gY4>2UnIn|MPF?5`l)85|g2sk}TakWL1@+KA})3tZ5uMO;c4>kr*?DjuOHGp#Vfs7)ncAFD@!l-oJwApN2Hyk#5C=`-aXN)I~U_<~RL@<~o z6$Gbscmi%VB0NTcIsoB>5y508NnjkdAxU;BJ0-49TR-02vvs zilPb50J#~K8MUi6SyFWaW@~aT07@lFB#=W9%%4(G0D|$|0GPie$nER@lmsH$%%dzT z3e-bp5{o|GNLe^+GNv#IMkn+@$Sx^nIAH458dHMVF=z;7vf^+-%@L|lUpF)Y`&48H z5ekVI9*(<(Y1kchm&0ag8rHZ5G>n_DKt@$bQ3d0O7m8hB=uCngL1$45(Fo?jRK>;# z)pViZt1A~)K&BKb&8P%Zr<8(u9XhRR&}SoT5M6hwlBpZi(rPL=g{gpCWV|;(f)#i^ zLM22~Y*X?5IyWa5-pFdmArgZd1~)k#Ax;qX2g8J^RARawve|4gF)^}4DFcU^X&97R zo)VRbfYc(e9&X?NB@%$1AeI0GN@H+nBx9T*02PcMZXIgHxt^bw$%z)${IV=Vy|c1% zOkBaBFwvA}XM6EU62X&0|4fY%DHJq_utGYCTvU>AWQ}jdPM3or(keDZvFnJ!A+N3n z@_pW*p=*Ze_4;yi(oHi2g@nmL+pX4=OOmANSc(fR7zze_l**`UBkH^JL9@a=|O7Vsb8<#I% z9;5JUA<5>}3|6GDb<}3nyiOT3E!>i>^&)ClR*s11s(=v7ahWVWHmO3z3U%t%s#~vS zQc8SK4{C-+1(S$`1p^h}82-v|**$i}E@NJVs8p%aD=)t~W9H2J?!6Zd#Q-5fD5K=| z^Oe3J_ zropRKs!*>+*>WWd7b;S`X066$%T=yhzd@x+CJZ2h{m zRR+7}h}-GuS1VVp*r;&>SeZAZyW`?(RpTv&u}-~W9Qh$H*eCSMe|0Dn!4R?&N*X*QGvA{A@CD&)8;LE_3iWQ(@#r;YP!H)^`#e{>-tic z#*ONgEmu0NSjlEhTQ+Up;*LA+7&m70oo!kn2+35Y2u7TSbZm4TRjXHf<(018-+H}p zYKm@BNwIb4(BZXiFE?-Ayk_k>s?G6myGOdd_+pFZOo2iy4DFOS zrr1r5Q!M;V0&*rJ1|=|K)gK;4X#bmYz+O<<;A zt`890-92b<`P-EnqA2M zga9HIxPC*z0dhjl-W$*voJbXNwIRtX!ga%EWGxqcN7?JE6?1c34cD36_VYz%p;(ZJ z&L`!`Xfov*ttRDAUk`vc;jkGJ3*vX*fMD!<-%Nl0OXX4^3ANEv8&H(YE)UBjHaCLE zikij6BO*Ymj$aM#n`wS!Gh|}1pk_} zdrzA+4To_i6&5)>aRTUK%SY!+O_9l3Lr~K=z|a(F4ru*BM*m@@cekZMQw%=gH&EAH z$)}%ijt4v?PqHB;`xl*{P$*b+R(M_ zUB2~m(v-xLcs?FtnK$@!1Pa3*P@6(*FoM-CW5-y2=mg&#w_0uqS;B4=C1Ym`dIg>p z%cQcrIbUpP;MwyE1m4;hf=+J#jJbN)ZOop>fxr#GEa%y0Ma91JnXyWrCy6t5sK&|p zABI*%o>9h zUMkUz9DtZZ+5E-Qb}w`{6B~|$P0fN!cEVuLxf*Zqmjj+F9A_Fy z5%w?L75KFsjM_CyTA?Z)ZPv7cla%yF?ER2~Dy{ncbhk74%;9$#nkIysMe4jE zWLAITA1THyzB~k|1s#}|H!vCWhRPV*O2zUi>wz!hlM6xjz{sO-kS0gK!*kQ`Q>(|> z@nv&c`{njMiNRnz$!x{9To)YLzd^fO+ce029Z%&U63pUw$U99-c!abJVQV-LO@pb6 zJu{1&l5yw%O#J_lM*N4L=6vS*yhB2Y6zT8xaN*W!!M~#h|Lb$azB?mpTI{xSmPYyS zXA+^sqy-GTn7|)khvtBQmpZv-MP$I%No)1ltXlE~5eJ(N> z*=0HnQVHfXN=c25%a7L?8u@vPVS15M4V0AbcyLsbbkpna2W2#{AyzP^PnksVA8x%( z46i8EdExFXW1r0Q+a+5PAPAZ@>H}m$N$EWHQxf*1NTcIOb5(1bRZZ*9+bcCX{+-Iv zSI*f?hA!nCatu=GmEaay1{B0p%B4*5CjkfdH7*{hq<%WRd8Ww(oR z%w>Du@6JN^kn=(|bhY=_K~o0rIlN+N{+PQ`uW)40J~cftpF=|TIdsLc&k}T`KXlUZ znf$1xwa^&bCyx z44p#H?BY?KF))YQWjC~7)7k58k_rMUK~%#J@ECI~G)AQVG-bcb_C}3~Xfu=2tmFL7 zS^Wnx(okYZ4UcTT=H2n4iXw=w5fg?M_j><|&u$K2V>{hj>LD^+AM3v;tVWW3PVN@r zF$lT6FMn|zu==+;zP&xH3+DxOO2rfKu|?`k}YH;2aqnYWJ2pZ{&*zp4^{c80~QpvAWb;|_n9kDRr{f^NG))Ttr$ zV7Ef&tvNFZc%f_AwlV*p3+T``p_{q-Via*Rx7C*<lLYp{;H3oDXG2|p@lY}M)u=_t z`SKF_lMEUWujf;}mM%f%$M%kK$2tl3VFzG0z^3@Pgbd_MMBbmyR{)uMjZ)?D;o+Xo z@=;O09LJ#|;3d~7e#0c3lF?zw++;0Y3U)EHygdT$AVoenMIFj~0K*hozbec9dlvii zXA(U(WdU|Vv>U%eY}!~5fSS^Ra)rzv4-=>cjN9Ek_fHu5I2H*c)!q2TWSYquJ# z#VRy4g+yYA_+KVdx8#@f@l^J`Fb>!t z6Kwf5`Ch7=bV?k0AgJSh5O!1+uvqghB)fM}5&aAdY@(i+YgV?#0q28eaUImL{H{!|d+A z=TY7z{Oc7%(h*!RN_yt-U9E%~p4@_mk;Lr|mYme*_ZC=Yxz_wL#!$bVIV^OprUF%A z@|_H`Ve&|BVcfZZPACy*>1Lx7Hu+7mGS;tM3_8?5cnb4kdIYA1+ySVi}8AWkTu)6&REvw`GD;}OQ&McD9R z^hw~3cc^%y-i=;If?1Y{74v^Zni*rGWcUvC9kqo`I7cYEkIz9s&hY1`pYEV)Nqg7= z@@t{6@L?>(pe4m=Qe@}2m6Yf->sq3sVX|y79qYyT!+ubRQ}K8s7VMNne+^}ohmz~X z2{b#0G3Vj_i51h-1>ME4|FJ*sL~8Z{_sc3nE>&iVN+d*vwY{HB9V%mkyXzt9c@gn}FNLG+^2aMJs_BtqMMu9h(cGu#@-9B6@}pKprS&8{dOGxry~O z7&bAETOB`tHT$fY$n$AGyvhTL2kny^I@2C;`G0kvlG35faFzJ!#L4^AYhjARzxJj> zDAq18@-q5~wx%>K#VJH#NHt~iNUhk_=s6Bb91mr$kQrd;)Csc9K0}2eR7l6kdzfwrD>3VV4jF?1gE^nI4aYds=_1CWx>SZgi>N^CzoJG9iy&8L-uPN(x2gm!KSii6*QA>C_NwTs)RbUgUI|Qvr3+Oy?wtx(wp7*yIq(j&+8v zcOnWqAIjLsAqW{Q|Is$sc<`q_>RF?+>LGlSHcet4ry1uTR)T*&^@FbQDc_ZpVytQz zT%=J4qAMY>NTI5s*htNC^z25_m=PY4R`;;@kK*#|7QrcPE*87pccmK-1U^5I#i(Op zi#9?@a#9; z%`J)%BHBzGN3l@2f(mxD%748P=;`ptl$(YJeeALXSSsmZpHlaOrNi`-G1Zgw&y*aU zlW+#20KVTwtQnIQ3U3cAIgISC7$r$h1B;n}V)gr5cQV>6sC(+JmT;k&wld05ofYvm z2m1t}r3>cpYJ9#&IQ@rF-746>Yl98MzCa-$kg+7NwB*yWKsYH?v6^-QOhO0|5-c^lxBRcV5$45k z6U|SEzs>5QEfI&L%JXSgQ_B#b{o}YigxPi&cYMh$8|~b5N(Xa)MIna$`LAlF(P3#d zEUzVh1Uu6NK^iywj`(O#hwx|x^m?de@EXLrNIGHI|4}drlzGG_tdD8#qWRw4^ zI-h-W5#o)7di>Rd9rG3eB4YW;OwJi3I{-h z0(PrYW`#^zm6Dt6VbQb9A)~H=1UQ$m8zFmmP+A4*(lJs|UyGQPTDv5G%ln2s->Y~c zu%yaReh@yKMwR0e-wK|*7*wZbW258Y*}7X4bUVg)l<2{1RqLgg%_74lCQV?%zJc?n z<#0L5+`oIVB2rWg_YW}64WZ)KnpZ*`Lxm5?V| zTDdA{urA;@#=BYwldHPZl&P)zEnO=qJ)GYtBC;@5JCj3`s+Tw!S{;5 zWZ;Nbp^V~mk6;<9t-LG6T(3MH$OWrM%VAp}zdG>~CliK?A4f=I#Z~!qGp~4zYc;Db zi3Iq82xq&z9u^a^E$Zq{?*|MZGI5`I{QEkp4CG6U>5BtczeN6T7H}vi{EYsYw^e5& z&^n%t~;(-^yPSVaK_DTU5D6kB#iIjyX+=d-9(mQCUsCDDf)g z$HIFM#S?LPuBNMD2>ZuR=7y_rPC(fdmJqtsA+5D~_+4}aetN#^Y*QNbcgizs*q4Yz zl?e4}^hXrAv|7Z8RdBZu-V(N2 zH_ZbM8^Gj`RMhJDYWAD4f2Z3KHo!K?3HfYqf-+`-Mg8t|vBEE`iN*q@%3G&(@cZ>L zROy!l!>h7>1#Nl*^*TynCZlS9{RC`la!q=gGV}iH`Eo68r7BDPrA(d^%?jfd?K4I^ z##AQ#MjQIdQd~yOeAoWQL>ioJoF1>18L4zjOsNsPuW!<6)rN+(-hm0d!zv6MTDw@iO8*ZGbime(7XPz%y@a127tO$LOB`})U2E<0PZ)ok)(YlV^%@ra z+W{rdKHf-*&*6`k+~aG*3}ig{{}_IB86nNo&@;YF@w(h@Uw8ovu^Zng8w-aMM;G)}1qI|CM2ft$&PZK0U zm1Ks8f=OrQMnLDhKr5rWWM(15t?J_j{+V zch`a2G6S#Ex9bWr#$+}^e2Ya7$Y$@RAtKfSTH0*Jrn8ZV&;ISw>=^4{3yJ3dkc4r$ za)mEewO;tGm6W72!K~l$y4vsN;;B-PaA&I8AMxVdzM{e0Lw^6=Lm5)PIqs?-;o=mK$I+Nr8)=4A zc+T5Sjsr{cIdyzd<(5gC&1NMF`JW%i_7h>mcps?YCy*% zV7^i+w!pUE_x@=Cc7?I@lE`p$r$8Nf%^UPD=H2aIlRZp0l(&wf}o4vuz2{PZuA8#+7jw|m;vs-;rijZKm(20$3t5!Z8 zaT_a;@W-j!w>VOx2KNj;DixGpdJU-ojmM)#krV58-BjOKL^IQpc2vKsnlmCoRm5*v za|WgJp`Pki)i?{Z2nar$uK#sANx8L8oDJZh+6l+cHE6ZDdV5&Cc!=D_*%l^65V0zz zrv8sXotc+65FjCeWNxOg{rl-AZ<=G$1<~>uC{#(`BjRF(GkoXB-x1x z3|n0LryyypU?N^`*#|FQQeoHjjo?m>tE-4I>w~aH=YLj7Tbu!bPP&Vz%CBZ52{<9a z9xMhOt^lt7Y2DB1-!F<yRbT#4g<|5E-#nV#@ zfl?BEZr#7OW78H~Ox-^pFkd;S1 zIWg>HWL?Hr*YQjqQ|ojS3VPpC7$ncOF|w)lr=D-QXJ9b4sN<^c>0*ffV{iCPu7A7d zc=^0?TZg57W(g2kyw_dgv;_iKU;J;wddifvse4@1fos0`>iOTZl_hgSxBbZ%=NSZB z8u>Z){TP^7919w)ru!oS>(fJtAI*-`a)J)qJ@IhQCf6(uoi1W#WkSI^C~Y zd6=}qaa9yXA0l|)ntiTjXav0+*$lo^DUaL5ly_cPPXe!S{Ip;H?uye!QduhKdBy*s z=~A`sjXQ$H3pFG-LbqO5$#~Cxt2G@l)pRVM{n3dtCg4;3aPHnh1API(a@h#OA9PD#QU_4aBeqU zA5Ax~<-S~PG>!;6oTMVWSUjqc!kFr)*> zzsZ*-OMI1sRK-7LErp!gKwbX2g==B{s*LW0`}bn2Pwa6@d2kA5T>UBf+OBdN6URVO z;^qRx7)&N>hgw>lH;{AsD!EhQfr7_)eakheRhhi+jwwIXSk^GAQ~flsazWkKAND42 zwj%oaY*3TNYA~{2%OzJ&j3&D=(4_;zD}^WCTUngK+~vR2PK#CnAyI&pRzloM)yDa6 zq39qdXm1PQ90>8bx9DrF2(OjN)|q37JZ`#83cs8aISnvPDCGvs*R4scwR(;ZU!^gb z+yTC`YTduhan^|i^q!Js&iwxSuL8pse*1d|IVY=9+YT@10f6(bTLMG)S0-`LqEXdF z=gS0@ABIcU(%rmcP1l|DbW!s6tiQEU2tE0=n3u4Xx>t?BlhYG_>t9%bxc~j%wOdLn znxN=MZ){EbR6ay_5dGrS^fm0<>5i1s{d8t8Hw^OJcr+VFBC7np3Wsxmbt56KsTb|$ zBl6<@20&AZ+c+v(LTzVc-P#H3xBP{V}Pp-s8&v)8t|XP^7l^mEk@DU(;5K=}}{M z!@7%5-z`oLe@Fn|{)Ns`G1#b)X*Iexv+)KB|1tUAUcUdy ztpsppL-dzt718&tm!BDW>(e_Th~eX6Q=%Trk$FMy+j}k-D*yg|C)#dj=1@RSrN@kA z;dqCOUafwPmxsFg?}VS=A28*-3db>^U~YDo2rZD5qonMC0H!vF1rVV~SB>*A^Hh=8XYh_K&p4Rx`sr?Q;sc@RB!jsq61*1^E#!JxnpDq%~t;nzILS^5hrTQ z&1a+&`AVvS!Y4?wns@Lt-vO9xeiJ>Qi7tl1TOA;xzp<59V$gjNw9P0Kmx&&L@>aA z>6#~rcH;HEEjRGp1z)lE{1*n9NW1CQHr!1r$*Py-%l-Ex(e!rbtzI~keIjXoTH5{X z@KKZlHr*EYr^zf{Qc>UC%V~?Ozo%QP`;!x|)^CHp|Jc;(T%TkbtjEE;eiMrufpiM> z>_`V-L>ve37Z=x+`%j>E&M7b=cPnSmjV>RlqTLUklD3b}edQWzeH94f5 z=5QTM1YK^;;n1n%@(0=h7-L0h%~Gq+L7Bz3?ug+nd{hdkF?=D`t*|#z%nMPRkGn?t zBp#Ms_ZU<1gA*rSV}%DnV%C9wXg%GSN&~&3@3&{=T4a+sEzUDxgj^+)E$;WPGvO%K z%GsPwTd$w!ROC470C%YV)pUUtQ$Af3{wSbzfY3ziR>5u2T0v{=nfO1Sg$OW-fO!Kx z-i7Ow2h&bOv-sTZznzHWa@tR4 z9QAipJqJ$vW#V!b<@M^M8Uis6Rq)lE)d)F&xJp{5hf>F9wC!NZ^>>*O-T5d zBDAzEOD1{8M?}jQJ5@B8cn+1g54Z$KL;^5SEr&tkw#^Cw+^XEe!Ele0YcA00# zu*quzp^JiMvE)$wFUt(Xa3aO+f7t^Aw6rw;dA68q&C@nx_BIN-z;E^TLAf+AAKE)sdzRo;38C8m%x3g7K zzifT1n*47HEG2Bj&ZzYT-Kp2fLp+OD{9jqD%ygPsR-hk*p>Dx$3VK!a5=dQNi86?m zvOa%wFc;${qu7~I6j?xe1b*kY4PD%&!SHaH$`#=11s8sfR7rgwRn}R;E3ui zs2r-Vjuha?!0o`5wql00JfX4sKsKe7FVE9VoI+Rm{WI+{d^1*zJdah1RZ49N796Zq zq?WhK`z|UEr45bQ17%sz4XP+#Gjm&J5!8Uq`JPyA&NI->xTk2P>el9<0gVfJDI^|% zaGWK}N`@?p;iab}so5ZgGAOE@#T3yirVtdsB;d-4lZzSsMl6o`h5I#Q6YRpBkKMqe z9N7<5jC#TY9pV`qhH9+@g8-X@HA+AstJSMTX?b0Ng7>cm*->b<71v23AM-CE*nm`4 z>omq8bYX<^U$OVgWVoH2Cd~NBeRuyIsFt(DOgDH~nmkNQiQqrZ2*)p30JbfR&x?Pa{tFPm+1Sk@ z_UZhJcr$a7V%!m{oPbWb)INVo zcdk>62$-)LT&QL+?7CB-K~RYJ|B1yJpz)w>ArT`|po(LmLa83mF7gQH*;0I(H*2Lf zFW$yb!u}o@Z!#YdE!~E!mlkm~$|#k#Ra24YH4KSaHx#lNb)rKHaZyYqqPcvSI_u^ALzHR=A~Smh>Cfa>#;;65q0F36 z*PA#;QDZ3SM0` zw8Vr%qIiNfA>W)u%N=K>SVv~vJAgBFF&m!@mkw9%COtL_h=pStBaITGG&3!L@@5U* zxM%_;{ZgkH<#w2A2CnG0a1ttlLX5hsx`)cX~s%DDM?f79$w;W_F~n>Z|k4>;V8wFkj zazh;5LIYFEQ?|G9#)mxk@dmmP9fL!0gjTT=>=O9E*bbkrZ*F4om=-Ez;`hh1y!?Sk zSFS&{alZG}_C@=R@(OUg;dMw)OhlG5+X_~V_H^cz{h%&bKnWQtl6fCzvHXepCETlb zu!xZB+x9NuErkZL-iKU$Q^gy;JXEFzyB&Re$qBnu7#TAN+D14SIg0RXS%lN`^e~dF zRq*YYMy^hD=_x!e-mBW6Xd@?Mm~;% zaoNjFL5FuuIZWzf*%u0YO4(6E1RCrNgtzmVOO=7WTcj zOr+*ou8?`q2Bd(~nRpa~pteO-y9rzQO z+2AdT$NW_o@%{h|kQI?ra?Hkzk*V(^u#4I0W}Av$MyP`cI*Klc~-&;hGIX4Fe^ zAH~4nV9-_n!5tCrk2_z9dcl0>go0=(_Tc z8Tzt~QtXCuxqA28e|5+66%|vwDgOMMDEnO%Lz`02IlUrp{>kId1r7lkcjwuzK2>?zh z_6J&#?x(v~>3v0ykA0=OT zkGx@63;ymn-PJqs^z{okJJcnNSg- zuyBeGVBG3*dht@wm3#{j*%;!m0N`BD$!xDNu*ltVze2|13ocOoWZKwr4p1<@xHXr0( z0E8ltoX>iG>k+)@JlP$_0hHfVVL(^Mi+>) z6Px6x?eHJB^~2Tm*sfm?fo1N4k-RlKH%-nk*LW*Rz7A&n*QecDO=QugZ{-A zVyz=yFpLO^Tu|koK}Y&fphf5r@B8-*|EJdMc>UGT-(WDE2d51^I!V+Vk7RA&JCYnJ0qI1#`I2<;o_>BFUCVyd#pEtKz z-`Optu{x|=exJH{bGS(jK0ch;>(`AuNcbB+U#=!tfu52Y>1+f54WV zD-z^mcXf@YkS6GN%8tMPr;^Evsi@=0y6K{8<#9H3t(-XN07c|O{Gb)hEvZ^?kzeOm8zC$VJ zvsqcY(&`;pdm_}alGYhJT7C5WoQ0kXLF;-OIKiLHUTU$Q1oHBP__;8mI43R)*cSf@ z{&pn-s=oMW$kW5<&20c%JtP9HO1=2=efJboAG{d5Jb@H9uK<2YG!!%94z@?j+Dg;= zT!qd9@MT@1UR=Hbln>lya5XutL^z2?|jFbpKrJYu!KKi^&aG23Z6SqS)#D2W)AfX(Y{p+KrZtuWF^X|iaHHVpCk zEy@lm+E6I*UBnEIZ7TOaWVysf(|3Q`X)G#)RUet8mIjgT?ZBSnNdw`>$2p7vntsM4 z5%7>!R$qGbo#22i)+YEmitr=n-ASRF&~o{HD^h*iutHS7)%EPlR#c5@TTcK+6W~Cc z#Eq{ygJ9gBPA5qfeXI3YWS$2znUj6ZAUQeHo^+*RB=_+&u*Le}Q-7i>s|-iacQ~CVUlqm7>1e|9U>X z{OM}gD_|hY5%95FDpye-)z09y2!uR)SO>Cut_;-h`F8}KjqJ5~o$~|l{Zf-abQ-!| zYOuwkyb^<>A2*Mi1?fs4J)I}(tFvrz7Zyous&3G`1w8@ahY!VK_XFwYn|fP zs&fSV{(jqdh=~6zY<^igI~YepJJ7Z^;T?~2@ULN?MNyGuMDBJw%5G}+_SU`-@T=WI zcm)183*fhz+N21rG3iQ$VUblC z{yenN(PVVgbxK~ZQjeI1nbu)v2_nbDA)CZysEp+1LiD5=S&J!B@1>?;BUr%lV`y=? z5_RgZDfnG(o0&*$X4PvM{#91ebcwk+BK{Q2Id9D}T9@9lBupJk`{6ISbAK_L<+~jQ z#fSIGReyN(U`dY;vd9d&k$$Dz+GuZi^Ok_YBo+tvefl9ZL8Ikjei2)hD|Sd_h-r>Z zQO0>1`Pmn=V&TkHY2h?1(Ft`dHm_w!l%qlT|W);40tZB(lIon6dE%` zInN{F6%}F*A`pjEf&j(PwPn8m)#s1BvN91qo2V z|8&ik6}N)5)Y4ETys#t;1qFxB%U-~;qSltgJ4+=vD5vOZlx=5`MW#`RtHug|RMo$y z648h!QcJ6f6{PjCh*Y(kW?EzG(pX6*cBk2z&was{Zp4KA2g)j8ZKhBwVb@Ce-d9ut zFqYUOYDI3BRoC1^_z@ds}3Z>(j@3A`jZu-XKn26X|Z z(czaShVrr#efHq8Fe3_#aZTLeO!u!I8U)}_#JrO)hxWch`1k61He0p(80GbqwqQ2~ z;sq@VOAY+YI{|4~UdlqgpNJ%2#IJCrvSodmQg`-dhe?vZvCtV1+hHm>A;GSpOSL_p zN=TD&e?!N0ZgT%-{>m4ghi!)KEhcg4rci6c;GV4klRb-Sl!_-Qo^@<4nSe`VoB=b2 zX-L3mqh^i;=>MpFk)(rd-s3ecf22j&j?@#+^wNeYvwWfVY9lErTiGH*o3MmqjS6;A zIMhtAM8hIl$Nou`k0eCTtLNP3mf|+cZfeoT9X*L3wjQcakNb-d4gMLC8RLdE!*wG@d{mq( z!VZ&Wz!CrLNq0yHkASf-5-t~EYsw}@iT{_oUQw$pBonJ!Ua1!j(X}_5l+TJBL`Y+1 zq=74!zDmn9$8HrRmWmXb#RvO|3d=Q!<7u)2o#Mk+6^yy*OGv9jnMkPyH{#$t%g&wx z;))rjz^+bDCy*}-`J4_D7qNP-N~pna1;!?Qdj4EYL!gBhW~N&KGe^O2hPp(R1wj_za?QcEQ#DD5I^OMN$0An zn*G66<(kM>!(GdRHp{!@>o&!hUJSwhEjWh#E`p0})|8!)U6rNV7;C@2dfN{8c)+Kp zU@>y?QB^xy%D03rSC=G-yw+->h>WC+?4%3}nk9k9d%&&|`c>5XGRxO3I64{{ei92^wOM(o1ckDx#zO+c2}-A&grvx4PdpMDDT58KJe$bb&&ejYTJW*59E z=i}o7U+{dQARxCoPB~p=5;)2{=dz7bNF31H|HG6in)l>x#`t7>rtfRL|EFRd%q-{z zd;MqC|Du0XXJ&S`p}zi;Nbcmt!^@>;kw};5#>u#ZnzeNaeoH%X6k*};$i(&DH*CROvFzc%(NH@- zj=m7zALRH2&K*7s#u1rRI=hychXaWoVaL;d96JN?K0&Wk@gk&%+s>nLJHKTMyMAqo z5&hZHUlyKo9815l80Zvr96JQmX(I26X#i05NAjv5;y-%z@;-%{F5_bLC*zAw9!t|) z4#25T_NB<`=084SG@N9$e$u(0i8L`v@20O&356Tp4RlEkfaEKS-*I>ML8hHAFKB%E z?%F?aZFk&&FPHZX;#wTzLV8b4Bl2?16rQLNN0aK%ve=KGMzIb5!q?_VtTkJ-3hIo+pTF5&~qRw|y}yR%ucln4Z2v?5SR4Szf5 z|K9C4@yc6_e9pacTT`tQOxTJ-3NJP@Rr4Fr)IDZh`EF)p!D|cr85dm-j^=h+Oj=;} zqflTOib^Elx%&7(7W8^GwmKHMBElc|+NTDQ#*>$$6{iBZ_L-SunPF)x^h#fu7t<=H zI|IsGi|L{x{j=7)0T8J{nfQ})cYK9Z?0-14%HYTM$9oJR%**Gg99LF=mMkE5lFL z-fSd1zrgv@EAmIGdOB=8_3SQrW(o2vi1=)$e=40=uv;G4Q`M6DXJKy7XNP;>s>Q1H zI+b&Fv#)4SZ#kS`F-Q~lPl12$OVW*dv2$I$Q^))EI!RWkKYxW{_;GfQ53c}Crz~^E z%~mat67lk@_?Ay;McqGLt`(as&cR|ZSDg4Cb)|3ifRuWy260|S-^@ppQ=vBF3(x1I zUz~Q{qFI+pnUC+C0SLg2_GOJPE0y)5(QZ6~PMI`Y;9DjaO{dJpy1w#$<-_2`QfGx@ zM+tc8GtYPZB5(6qYY%LTH4uWm7F(m=!6MfIOT~2F9aX&Ww#%s1NJ*vfAJhHHGGOK+ z;<`Jui$O~!-nv+1$r1fF0wAx~*Vl+4q5Z-UP)wcZxbOHs#Jjcz6`6f-hZDfq_6<~q z$OBfin0^#U*&1tPbH_a2r|*91C?vC})fw87q8lo80alhdy_^4n*gdor{lRqW^FTW( zP{$x-HFKK1a*sx|%2p*=A7_+f*CbGhmN0rQHb)B*xf%n&4b4i;zXktoVu;=zLgIzg zgsL>l8n>Z?Jok?G1VtZipFMI}!Gc`@Z3qT`ZLrNgflYH1<j?biR&5>3v`K|nW za_@$0zKwTmvYfhO&ckua7>J3GFpbU1up{y4&SZQT1;M|CaFLUfvoAGJ6;UQPhFGPI{ z17IE*QNCR*4cd>Su$Xx*am&~2`BHp-gwfMoS5uv8AUEBp*KAXRypDnJP!3GmypL8c z`23r;BF9cwL7>Vp)FR+zp>y6|5zcmKRA)Y4S2(y>{o(+mzhWp;7!2M=Yxpepc2k&= zN)S4>@*Xa?0I~Eb25fu15}I94C5Y(-<9yxE^df;u#UY-D73 zVrZ;qn?Z1AyMHt=NOrc7>p2Xro_Qztg)}9w*k%Yo?%6k}X0429M z9e#kK)RBPpuL6)C-KYx~Typ#NN0om9$L;94SgS&NZ*NaNWD}Ai>G+$r`6=r$1uH_l z2RL2z$+6&qIeq+Rzx?5xG^x^T%~VhV{u?_O8(w>3byP185`N9L?@IMSkJ#{_zt~9x z1N5~EweM?i6st$I9{$@`&=+@sM@yxNLZr<4Q4UTIeY2r5KYg2CD&{Lv!t0P8Q57+^ zuz3_x7)TM}^2a&QWd{CKWDY~-v^({8i~}MY+q&+ac~IIrE1!RUes*oo4R|dpF9$kF zcn~KDsvhI1INFEf8^Og4~0-WNu+`b#$vgu!ljbBS}lFX@nDL#doPFw7OS*w27hk&39&-hH=ke+;LtwQ;a9U(8yo*?DsEO}kD$Ry{Vx(A zb6l=#DY$F%hvFn;;=gaSoJ{3QnC?j96MsrVGFwH36;G#@()wN>B0lhM9&|gZQFdLedPvzduEP7n`eM9uKUW=?UxlBn9LAtC@F8;5(>rYa>gXQP@HBi zIcsbz#R6O*^>R3gT7KFJKMYb=8anMNjZ#hhXy>W4?ChY&$0c>ViavbCKBd227w_rK z{Bm08WCFzaX~B?05<$<4)w-9%X^TsK^!Wiq>l{v6X!3DtB+kuS3&8a1{X z+cp~8ww=akY&UA$IB9I#wr$(C{{3D2w`XLWtDL>x_gT-HQJ|$qEfX6+HkXg zHW?-_)M$IGpztJxE`9FCaLsinh5$faLd)val>AfYVox1eT!Nwia+ey**0V{k2uy}{ zVD{3p-g0LZ-pOxTpRUxNh?r-GCtM%kQ*O`O2NV1q>hWs5&FbV-VaeP1!5Hxf^(fGxr}-rR*Vm(-*_g)Ryzh&Z_)6_TW+@47zUC7{i_$D&RisQODsezDjtJc{dWz~^P zosQgSy*L1=zGFzgnaOSFxjl9058ksw&uzWc!&oB2-qhIS*o5xW$!ZM0b|+v*&7NXZ zBCfBV{*@7Ck`gb99`Y@y(}9alhC$j!(?^%f&G%)Nd`zSK#b``Edil2Yj`Oqn=lt-^ z3U>fb!zuQ<>Ny9+n58~Q)Ik?4YQir)P6Y2I#j>ShOx&{_iX7EkT}2~hJ7gp59tR>` z#=Tu~ktOHbj_=&Q!t3VK?OkRc=aGPjm=EjPk!0W5VrtL-bT(%4?q`ksI--}Ryuzzh1_)(q{$0VIx~Q=obY@DTu8;O6@}V79eit#8qu zI6Y#}B~fJ#A%lPqR-vFG#pSfstTTU*Ags852?Rt*W8>qi*B?*T>J@<|Rf;7}y24=4 z`aj$ttsJOX`54g^%|bN6K@kGtELEXB&rX2};f=>2j%rCH<4d7l6K}kj3qK zIKF|jx$!!wPODMH{PlZ$LiJNMOT~_ik`ky^1+n9rgv6s}UZ(WVlQ28hNKuEYn!}7p zU8_}feVQ*-R{do(Sjd&;&dGqORIc?}dvuT_WU+Av{51rg#{s~#Ns)@0pP7I1xIO*%xt>0g;|yKJdbIV#FNnJoakJ^w~f0&YYk zqsncbAJfZHwWc~AwcjLo+n;yu8mtyd4Z3FbV%z|M;+0dL$7Coo>$!P3I5AP!>yhAx&*{62p244(XnOtJ z`$#>56F`p#d=Qw25XP>i9*>G@%b}BRL4XLQqO82Ti)yA7PyN^9($fXt-(5r}>wCXs zL9MA*X+5$Yn5>Dl|AL zIiIkkMDHOCEKlc4KXj8BfSE>xe%a=p0{;MY+ukH#SKM$~xGm6L4!*3=dD2>`HQVxe zx&V5&u9ve1a~6|ETBe3)a0AGL1#m}zX?WRhy89^wrbKb(m|2O_>dp zSeVkKGheJ1lo68@88p}a+U!NMP+-vR__2|E6!lOX4-1+D!_#XBq9^eTzrFr>Ttmtg zkiqVCyJ(yKc)9g-vuaO9{W)7;T~{c#(dGPvb;d7(wqn#4AIERKIDS_&S+4(y@`(Ef z8|kk&U9DXhdG{D|AX2ONU;}L)r7WNKxonNF)R6+g%j4VC9vWJU(PS$3+4+Gr40Xs| zEikIUaRu4{&CS6VxST$9mvcY~1l`z?M{gW`%de4OoYA1=bNL2N3=LI4ztQ0<3)o~Z zrPpnbfW7~IRJ~@VrLK0cKav2(&-3bQ(JaTy-_?vbmji`$pzi zS)6QYZ7dg2z=i*2#cae4oFyxZ~=t!^tj-VW(Ck>SJQ zl~us_zh=cEKYBnW-Qg!|IG$M(a2q1e*qMFx=He4n{624rkOWfdJtt@imtjL`tIHyw61A9E_dDK3pw7b_(&r>*=BJzjE=Cb2Duuo^ zpR7?XV}B=Di+1j&B3|H<8MGeb^x{0Ys(+m*d&6pf%-j-ozB}!OUKvTYR<__Z@~t%< z#J4v?5V7vDM@Ec2JOTwUpXaJn-j-LLc}l>nHDBh zwUrv5r+^QrnswB~pqhg*4Osw3ws^i`Eui0KGW57oXEBw+?0i_R^@emF#%FT9jXe?f zxdhf4VPf&j@7MkIa&$J8*+w)LKT+r~$h@Ic(|rn{PBzNFv+`@VdXLl=upUmzPmOlJ zK=U&PvsaeZ+8sM2wgGR?cGJ(&g|R!QJ2P_)Rg4Mn9uQ@{B@8jlIP0y?|JK`vNbdL8 zt<8aCrO0}bPOH&-bCI9o7kb>5%9z+I+r$y8a2>InrRXHPX5_5=bGNCtz> zAC#0!dye*-wJ$(BC>YarxjJA3meOXXSBwhynwP)=na-{DI2qOIGkzlBJtQ=2u$tZU zYUOZct_uGpti2m_2Ic-e*Q2mom&!K$OKdNA@qmjPLgiO9MpzD;L|A#YBAEuI5T^`? z>J+XRns0b19Gsvq6f#}e|p06 z_n8>~({prP2>px`vC^s{LJcTD3z4#XGk}v)4n{@+bs7)M-M(X7YJuDXbr)rz;3TdW z4j+Mmxk<5e)1||727r2~`;L<6kL(UoEa+tYP6HM+CP_~L!Br4XR#IwJ zM;%cvSvyX4jOAI6T=FO&Z7L25nLFzu##S-_|Hlh77V-(3{%9RJ^v~SeZyA&ITdv^r zVq~Fx=J-8q2MBC>Ll1J{a`d31#S^T6;^66UCMwX}2U0n|1pjF0a)O?Ls!e^rKb^J8 zXY|ie-RQ!5f$4!M{nEj|Z(*#|8+0~f5ADb7V?S(PE{=30LC|``{W}e?oc3RmJynrG zrkG$r)C1aMu|pVSWX-G1iW|QTVw<7c!x8=C_=XfGn-5kll2V8{8<=Rg;o4!)LzM(W zr=o6Z{*w)xxcMKpq&=kh4_GN<)K>{%YV9D-?paym)XRrQ&Zc%X0?Zz6b$pcd;_eWp z9hdFg;s9{I6u6}jYA&o;3@+5&n1(ON=&lWmb`L!*Juor4)878t zfEUeM9W9oh=OcusgISOm&41W^AQcjM8q2+w2quGCABqeCHdYC=94FW?kXZ3thX^Xd zV_UZSnz|e!jz+PxI3zG~D z2~SuHS_)QK4g15Q{r;dSs3Hb&u$?7{D*NrAbiHEt{I5TNyl7C>Se#xy7rj|+Z!r20 z#qesNBCBPa1Weel<2X|Vbs!qk?~HS`CmQGP=0E0Mfx8#596=_$MfQpQ@D>4V_|W&A ze+H;FO{MvprqwV|rJII$Ke>}+>b(%Pz1JlFc~J_~Ofr~t z{+nU~M&jNMXSJm^j}b;54gt(gu+z0E#>eSlmuKt8^;E1sGT7`N#ol~o3X+vA3Ry)s z6pcxkd2uF7c6nss9l_z&dgNa-gp2P&GEF(MODFymMsePWU=&!qDuFDbgmc|Z;G?ok z-7u`w=L1-g1)Ja6y0l#|8!GAje-#Xu<6?^sQ9;>`Fc77NTk~B{m`0s zSGF#%MlSSV5O;DEBTHft$&iRdpdbTv%`EcQHdwlJW3l>Y-=G{Wu%a7*EriQn^D5@k zjYIDH`A@*;1vL~MUZ?^=WKK4S%Bq`fBSiU>%?`kPen3804Gnl*OO*hVsRk=`8WjpP zR%eVhUpwDP!|5si2>&>qWfaZeAk)1wLEq%wn-$Y zU>V4Xni;Uh;k5C)D29QW+wf&5OyLnAL%$(N{~jxaIP`+Fe=D~r!!x$9wB*ySgROOk z=ms5Plf=}D1SOAtMx${}uxMM)21iq2cz^Idg;;91O&9;)4_yI@|S^OstU3Vm{c zY$Yjnwp1>icdcHM7F8nJnpyFr8V90Jl^W;To5KN2lic$&blaph zC|SK@boII&p)`V?;(HMdgCZ(Z)!^*9QSw5ihJxd0F{cLj5uLTKpI8f@lXCpkCWD~$SHLzGqC?g^)XL+Bwr z4iesUo6Sis`Pg5tCbzEUX7|aKg-AnTXuAvLYiLa~(f7ZE*tVb~?A=q0zyH27d}H5s z8|b3;M{t(BN>Ylsj6$IJXaYewoeFy1HJ}cdEx44G1>FhS9KB0oTN0Uga0u<=YCsuzv z3$DRj#gu5~{Nmc@L`cx>qKh6K8Ed=CYLkd2xB;rx<_BIn^({cVP9H-$`C_HWBE3y} z&8D#^`*IfOB)__x!5^>X$!f=)$&m^O*N&8ayi6*%`W}XRM&mvba21=T&aN}9@!wCc zRdvi18-0wb(XcH1O-&C|smTd~M7mho+H=s1`y&FAV<;FrO-QDWozpA*Esp)LdZ3^0 z?LLq4&lM1~KFx=~0T=N3f9eN+UCIDhnraon6+Vw=j(!lur=Va>N#ZB|ta=Q3&2Vfm zC?iM!EQ4@sTmm3k&w7jK=M}#{;Wr;YW;UU8cMjb0tMhR9Lb>W(c$yASStwmJn)f}p zU64u;aJLsEOwUv=(I!TI(J2t@9&>b}wfp76=dGpp0nT}d^9+Ua*(V3vE+uqGNbyi* z^W2rmVIGY_fu_cpiD+TG)oBmNrh2cY;EZ2jlR(N*B-axOJ*!1zquz#dHrAmbg7m#N z+*`*~!k(_YpC&XQ;g8$wzp`Ac`EfW*r`PzP==48MDnGm?Gx#o@xX(Fo!;yEmbWofs z($ut@Ebr$O1kCmi1~3&`x;}ygyk9P+`GY#&T~*F_uc~x9JXc6Uyq?b49kvDih^ovd zP9ZAjw()|^ULMkb9fV3fyY=Qz`}?c2j1%Zs(<<5$t+Gd;*)~kC3>F@s!H=LpMiL+0oH5?wC-;d}ij`uK=K2Pk4b~ddiRrp2>xISeNWmlVbiviN zfM1*gMsv|j8_s<6=4XXbQ0UD~c&i;Im9r`VLDSI~y?nyng@q6=O(-A?ZXqq?&kCNwrNZxYD1MyRd`>2-2r^1 zrN*RoDUdW++mO))AFzQR9i=K5vLeliFk!uTEL&Y}S6(I*1L%xzc3Yc_o$q)%g(bK# zKxQ3MIYk?R2OA=YX}23r$#vWWL&Pz> zaat^<(`?5u#D$Z0EG&#t@xtMHNGjpnutkOB{RN-RW!}mhfkPn=m6wSOOx7 zT;zD6GT&*sTe_>5!c!==+_ojVK1F~^fJT|;Mc8U190Yis`IINHA<<;}RdNVubQig$x-p= zkd^Hy^j!Z@7yyE&q>2$2t0?0q+YbBMQ8bmYT4Nn!etYHjycwYx4{o3BUA|HC!FzY> z3_T!K>0(G-R!Z$|V{?8t#edYu9jjiVT;N%;3fy;{s1S+All9#{_h(3hBm0G^r+z%W zLlMdo06m9HxAhHR9R5r6`Xs@aaMH|(X^u|0e7}%h$H1qgOe8Mafol5!m?$OZ{Bzx& z-WfY$6j-gaeVP3!m&Wc@KbN4n?|Qjjpn5V3?CZrLjfcWSZW3yfa7c3n%$Y_KYf-+Vfw{U0-%8CGi-SmOf26 z>AKLGRmi=B*Ka<)*Z)q`ss21ZFiI2mq*H$#-W+N)-F?Z!2sRkHr~Pbd+a3J#UAxZe z#Bln`fy?gN@FbmXrFo=x8C!-&g~{dp{)AL4l5EjdSHK1*8fRf_SiUPUZXw^J45H|E zrpz)0p0@j947Idd zWK&rNBE8=RG@Q++WTr+Z?+!^HfdbKMyZ-GFL)2+<1Z={2Jd59^aPR(1p2U{R5$82nvEs@0?b9RIYEQb-&JzFUs72uoa{j4i{9>2;nJJVtu|ga=bPQ7 zIA0NtIZdB|IaeqqOKn$_jQ%GEbq3G1{pq;@v;P-Y8vJ1h0!U zqL>if1<8JEr$@(U+f}F6?DLK0^g^kg+w!qe4Z%=ui1V7jtkLNGce^I9%k`B4>4FB^ zCnm(=*(&{@R1^~Dv-j|CK}K`?+TC3bL-g4`oxVG}1(Y$FKLC~3jgOawY?fk<^a6}Z zAttSo_vd;l01g0xd>n44{a`6HM%|JA#=p>*Nt|eSUW0tRjf^@sGtP`IxID)DCv!zz zFYkBs=^PdZkb{0q9nQ%`0@|I&YxbQhwLj-9tOWq|P*s(wX{A;Z11)Em6lUBRX?T2_ zT7-1>11Cj}ta@+2dmI4Izj(Xs2K7O_+_J_Vyicv$^elS&CnWNUgq@Ol#z~HwWGbdM zbM6Vn$t6BwZ`5J@S0hh$Nj8k8&GdESDEskZ?LWO3kPD^q`I!srj<+^g1N#Te4#VAX zc@#$n$0tiHulFb6Gp#15hYZ@x=I8k)UaknoH{wog^O{m%H*h-Wv5w0iXXPwNJ-;-Gv(D!K6y{oMnOY=x*T3`o(>f7`AXfUvV7hU@OXb(O`8UGvze0odkm&hy;&Cc zxCJH<7d(cBU*B1aP{c-&eu@l5`88d6b-X@&-5h1Bg>C$-OP2hj(B*DEd_1$hlh28Z z)z}oM*b4`up#~yePMe1ME1Z&oixg5>I9D2tI_Pvad0R2U(YVL+HKEC@Z>daKs5+xi zUG^|TyLkq#$?6})pDU0vV$VEA8O(?g&}&b!8LHzl=8`(atg`d#o4gY z()@v8E~YLj-UD}ti)M#E*C;9d?|)tXnrUM*i(mo9637j7qefV$VLPDXrGj}7pYlKx z3xx@6?}az%3#v*8?->Di6ZHj&l>YxLK&y1v zFcz;+EbiJ;Vj8(D_FWB5n0H$oX|ZYn4iumE%fi0?rB3b3x1&onDA3CvnO3D6k_F_Y zEcrQ%AKIC~Xd8*AkC*5*UThujHiaf1gaS$M(EQ!RW?gp2_0xb3)DkPQIAZ~+eEPM< zCRB_r49yC;7gY9uKG}VSVmb`W9}I`+gLYe8V%mE<*<6Xh*W;6wyZ%LueU8l$5pwZh z7y}>D1o{e$dX#;F=h>y01AbeB{%aQeKsY5d#}Uy3MQ)Bd2_f@n8*lOqEs$l@K@iED zN(A%h+Ps?wY#i;{GebH)*og_^pAJ(v`r>bRWx1see!|sUVqq72$?q zod9(5nNZ0*L3UM;+|={)^H@d@sT`9`Xhq0tOhKRgYw*IKNqZ>xN;DFnyItSfpY5;L zaGJ8eY9RpZYC^6c!S8tgL2bV}|0dDlcxojy*dV-7qrQm#C?@$*Xno~eRMo$f%p#*gdjEyXAK?0 zAW3QEr212f_qm^ziDFDN9)kaukcDh!X+#3^Hy<%tB9YVq80B-4QcP|%+Q1h!eNn|?<0#O+mbPTf6-nRYQs~NWZwHZY^D$t2EQ3r?9{lz;-s{#?9qLu`_+0`- zWi*sv9nI&6vQbPecG$=$(u#y2C@ZgTOm^6qYwqpQenAjmTr7xTa(20l3=sbC{vJZG z_|VVo=0sC$V9(mASn#ib`h4e8M-VeLydCh%Fk_>V49Fxk-wQD2>u!tiH;3GH9}N`@(CYihGc2FQAh+i z#Q2RGJeMCOd>;B!R3?`?5l}F4GBX#5lU2o?sSgX$6gRljwoF_Tv_PfYMM#gv*L3PH!6L8wuJY8-?{-ye(U#eQd zVt1c{vryV&sncl1Z8Y2e3BHAUz3DGS=nc{l@kk(tklB`zrJ?U}(DAehtWuBv6AA(f zi^n(ao)71&zVFSKd|OodBx*~+TNd>;Gp`>{Ta4QIR7Vu^@U6kfV4^4M8BQtv2pg@Aa)AS2!YLurNi^h?V56D4A2Y}0c&LP zMjyhC)AHV~@$~{ID}D3eZy^{6c{_tIZx};X;p*e0J?5Jf`tX#{2Lz}bDll(%@f zV4zQ(rJie(%BF%8=8`9R0=)OnvzVPnYt6r+?@#9AM!uO-Stji0;SLO$*KZ?Xk4iOIX9-kFqO$GKu&&8Bf+z* z`tq=(-}V;p28TtThKDB6n?U}T3#-|f5R%7)tP2U{+lww&#s+}?g%8-{g)Llt2%oY&L(v~_(LC(FyFFD2Uq z!nrG}%(2}^Du&PFB4)I?f37Z+0UO&|Eh`$cRr8fFrXwwLW~eqTZrIP8+HWqD!n z#|s}9VZ1*$oaR$b%_0}*G z;r06bXM@+3kn6yKoZU+IDi0%4-k|0AW079Ih_6D^ajtt(9u+KI*=w2SI?mbo_76UH z{X6Mt_c_gkzJO>AK{todHBC+Q@diJS^#CgLn@%Q*x&9zfnq{Njqi=X7Pd<~^Bn1a7 zQ_iJ%<1!kT^YQqmQeYog1=q@&iln!!BG|ytYJZ+BYo*3vw_FDHemS?iZMOnME`a@j z9w-9Xee;fui-VTCL&=D!P0~NH5^kcZxuHyH4VHjNxfu1{aT@S>p1Ri^M$3{GkH*g( z^h);3+P>G3{ln!M2gh-_7)?SU70>wL(R<)@(hBoBO+$i>CaRQFFqWLjwZoBL>nX24aMhXgp#-;!+1wm-Y zSFg8Yed19qcb8s1`h=7I)Nv+zXqP{It`6V;IfTH+%8@l09f>K%nKV>VDs}nP8cLn8 zGm-E$Cd}(LlYVqpT548 zQr}mHQNip@k7T)*U>i1~r6#t+_@sWRzp%hs!T}fNQgi zkJs@_J|Ws);N$sbBP%$i-EbH^wit##s`_9gt|i(p4Fa1zq_9?zDz?pdponrRUuK-b zL2DGIf?|0{T2(=h_#wH=}>s?i6``^8b^@nHxI=za%f`+S*g0ru>7l@0) z>?4=1CL{UF=JltJtgMl+Ar9THXv%o;R63{iU=%Q*BINg|yx3Eyw|`UYP8Y$xczng> zkj9+IqA!tkS;1HtG!^4S2tuJ@mTCw@?jN8Y4BRpxDsD)LE{uw$DqkXKLq*)*GkpMT zAb`_^^`k{iCW-C6(^n+4{r$C!kUkCf@gSqkTdD6>Seb~nEV{wSpIgERpD=ncWKi@%|Tbn+73e%Hq}yATbQn=O=k4_03h~m z=fe{tw{IWuHertXEx(vi%8ZJ5w~=0ggy!aLImr2F&+Z4Tmuf#WD$O*193JhN#M@1i zkk48zl`{j~Jz9-QQ&UqE6`Bm?^ZD=uyP^)w8{y|>OvIip8f=s#j37Aq)XMZI=IR^5 z$S*?h1hR!`7cC_`M5sU5XsDe zi)`b+dRfZ=Rw~j$0n&R@kqQs`Cl?1|2$);FU8~R9-!TmqVaUC|a$cj?V!h;}-et7sw&k<8P|1kL>wA8>5H-Zh?54-?{|r;Pof->S1?a_#yrSgBMVt?KxCNh)p&O|-@Oye z=`Y*fE`g=EtF?}@1HGq?nGS^^30?{hWBNj>M=5v-tw2Cz?&#=PQ&R&YMJ>OeK6&%cQl_T(87-p^l1bcg*k)baiiX^hUpAMSwMh^( zw3)O$9c$!Do&dC!u8;S-B$-6rrpq_ii)1*4_5Wu9S(lH!V^#cb>n$R0tPB}_0byii zy<|0Z3N|+JIa*(o-JyjdsU+PT&lS| zR=HtOI}XD%QsV=>|A)Kv7+S=ETRYwHCws)tjxZB_TfMY zyp@&yDB;0?|H-N85ea~5PnNG$pVU=#T>NI7znuAlPiU(_#@^Y77Sq_A7tQd@2!;af z@plK=DH2_5$y&L`Ogz)oWo~f7WH4HSYOBTKseHw`=0WV2g1qc%i|x^Ps&lokxZuvb z6?7d$ImYuAtKoe>8VCy}gwDs!YC_TEvJHot5{6jK+64=#wK~0k$E&EUvW@v<1F+Ob z)Ze1#nC~OD7SPa(>M~?K1wW`jQb`NJ=*>b(w7W~VGY+nxR z&-dp3;18%r`V0Z2El4bSeUH!g1+L_yGk}|M^RiUBF~M!4*&y!o_IV@)@)&*+YsSsW zYJDBsBN2n|!mXE9*mGS81t$y$tWr)Lxq+MS%SDV%MmWr8^&qzM+P<|0qx`esdjR+w zzUxBHD!Nn}kI8EeS`mA1wJSz1gqa?vsaOMVW~dQY=46FV(_|JmDJA6^8t&240b>g1 z*>g!kE$l=?Hou3};{D1Cw=c~IBuYlldp9&?;+hTYICd$O%xG#|5v4+!!{_>oNZ6n8 zG?s(jm%7Om%?Yx?*bMon)HzCvsZ?L~Gn|1=oxi<1O!?nf(a^j6pv@ng^C0Un(m9fc z>b|byRw9!b-<}hgdcLC>yv&qpv6}ncjug3u4Y3$X+YJvJqv-aAenb3JBaF zEzD}dx<`pDufUW!lgpW!ghFbMl>b=hqw~=l&t& zcgVc33!1l=p{pXf)K>F{R^W`G*XX$c>@|1le%<5_I3LnyaGDLaXS<%uQ)fKyO$o?m zaCjWzlLJ& zOd%?Uuib5_G>JBuUa!;eCXieP>i}q18?<9nmXs}4X12NSU~TyZ%_ybzcrxRG#7O#u z`?)s<1oEf{pdgmO_Pu0nob)Qs;S&P6f4O}~s{Ov;CKR}e7p$yT%t7q3V_cKj2&XyspZ!a8} zx;qTG_x6D3!t=jNbF}4;*1+6^!$_5czz#I)RxdpF@8>6~hRy9bwb4NhR{s%yM}yG+ ztsMEU(pi?5v&PZ5)+%lN1n2=zE{#O2k)c9 z6Lzi}B>;VW)OclBEc(OS{$o!~^`FL8#yKQnTqr$;!2g3}7Ym6B`>#NkXf;oN5TkXpwSaTq|CJu@*j1vx!7UYCuTICYqen!QA{ zWY>~pO)rh8rg9lVLD$N=cI;B!77^vALJPGD*qADY6}5$~chnd@+=d}4$DiLVB_-6$ ze=r!dbsMo#w&8+*>iZY|pT;IW zf4EkbEPRB86m?IX9gI+f>lE4O!&!iY=*PWTj{iS@(%N-mG;}$TUQzUQ`BbvzX$1IC zls_VrZTUfeIZ~)7#~Ic}e5Q&4YG|EQ z{=sx>vUU>%;EUzfux5clj?1Rd^rkf6y@FqmJSsLEee-1Bv&(W7s)haznRdx!q8UN0m)Q|z&N0DbYZ)OIo~RC8$RY5DJ)zhWLIF^j zMu4J#8_zs+^0z+)vMN!beDF`4W@c`5^j`_qttDYOC{gJ+J4E!jJWJr9R@g#a2JvPS z({iF5YBRDE)50|5$BBwCc%Xmn1fR$Pw;5%Fgw8?~&pC>}QNl||J&VGNBO@#9-1AMHpD1?}w!39o*eF~wYPX{w zn%U(UB?PwGcmYC-L1|)|8ZF~Y5k5V)RJ0aig8o%l5xEPohX`u>b+5{oZbk&lSIzZp z2k?^1LXaYR)gxIqPz5^_M<9oiXkjum3qk|54^;B#* z8q|XI{fKfd+eP1GrBvmSpKe0rWRPmAWKuKmh#{h8=4qt`io;;jz#B?*tZYaT`Y!zch^3lZD zNK!B;mJkdmw234aUSVHKdL#W%176%i^BF~g#9Lmsb9wf-# z2)V=gc83RJd0+YID}=)%G0&a2#9;VmrZ56n6SuhZ%!3DyRGYhR!k%1IIY|X=?nq#L*HJ%n{YnRhyfz<*|fN+pBp1%B!Urn9EkEqMn#ED ztnBQ3UDf{}p)5zdainkH&qn{lY%Jp#Qzh+?Q0sU47AIk;0}X%NY9vf6_Y3D5@@_#)X9kcLt9W#{<;-bIT_1uB_|qZUC%DRm8BSiO?u ziE!3vHCJf!;uPNvt89|%PxZSy&fyuG_USAgw!PM0_8vhNs}MXtpMu?fv-#)UVR(sH zwKRiDrPBdRK}iX-8ns$y`PgN#c8%~Drrc$Fp4f*cdjz_4s|Q)_#3UInConEPo3C1` z_6|Aq;IDJnPMsx>blxbE%ymo%9ia}7C^a^gJ;kO5+M08-$YzUanbv&==Yh!4FV z()W3bF$zFdOYJrwT?Ysd&*a;*JFLXKM@#j}Du0e9(JawvH^&O!V<*>1eT1eEOb1wt z;^0qS-1`MUEYrInMJYi@v`ygNYm{lRvolXppr!XAvj3bf7AnJ(vsx+zqGsiZ(*>Lz ztHpf%AaTHIAF1#=!E9yU65j<1zQut{w@|hONP{_SRI{1BpS8U{oYmWH<_lfmw4xja zo9!PaQ>hgKbEp1&R3ms>lImemA3lv50Gm)Ce6vf-uk#*68SOsdt4Bhqb#Y7YEJl8ZL9h$wF zj%=39*UMtU#p+VAZspH0$dFm( z>2D3K`x)`ohM(0p^D3Eum|i)vRW1xZRkMI+&=)9Eb@o4;Q)apU)2PzWb4}mY?Jdki zF*^SAw!hGJfokW>x7!#*;-9{3STZn|ZZ9hJ@GyF^g9;FVBWlf)t)AjB`Hg(m!riN0x|#bN{3b*#e(&s(;yj# z{YK$k0zS@S#r0{V9?y?=#mcFe_$Dt`zqbuH2gOm@$rh&YZvlIlIkXX{52;DCi+Id7 z-Ty%Of&vU1N*DCKD^(t>4pv><_d_bHxYP=SI$m8)o0{LU8u{9~($SA{0v)h13)JsL z&c#F5Uuy>qu0xeW-5UbSYD>QtwpA)(3zM0~`bm7-EiGcpT{na9Lb}|60%?JR8Qh0aptSFoqRWG@>TnjsrOI>Y}c#=XZG&O%_VevlEU~uuQ&m?o7 zy4>JC!bTLgy?CyoMfPlt{z5`U78cZ~A(E4$XYsuM?Q}5u4Gc6w?hg^r^uu-UjeqzI zBUHwF^nrQ`lc~~?`+pYT-6Cx|%5vv~#i+jyj4w>Yqq%+=ex)VRZl10AZO7&i`nB7A z1$1CdW*VW|Oz(&0j7D(g7bVfa(PqB(JnMIO$-NsIiytPrB5iefPLy(Pp4<&IWzSct zAb9@XZg<<-e1G>ghs{YpZUxC;>e|wvqQ04t;KBRhbiW=VQ~2}8^)`5s0>RbGgKQ z%6u|Q?!qc1l^>N(uVlStugIBE_w4oF8EBQu{B{{?J{L_%!z8Iz+fH8Wnh@G3@uzIj z|I-I<*)_Juppo;Al-@+ep(WJf=>kQ(_hJ z+F*@Nn>Y?_5vbB5G?wo)Fsi12$D5U$u9t5)`l!cS>vU_lFd_v5$i0?;l|II-Hf&s6 zTr@ON8Ps-2=-i|}yO?m7rBby#-;dTXBtm-qAN0JuSHp28fEZ%k>$>|}Rh9YPUoQ?@ z-g+0WllY%6o$U#f3T-xz(g$OPoXpmPY<8CD>p|1D?~Dn8K(4>HyGvK-TM^Asw0CCT zmD*(*7o0$znyQ-|l6V|Zrj@6?vC7Uo79om;nvjs7GL}R;w^Jj*;oU?`OFCz#v4cm2 zwNA#9JgQcCs9FGZW!C{X7JEcCoriOR-kLbs^C+ct;3I>Uhw3L%#T}PoO^t`>Hem@ z&pKz~vRgL)dVx({LETMgkwTt>*6a^`gM3N%{UY=-0CiBSY2agRlkdRqmT_~Fp`xcU zb_)m(`Q;W~A6UVLimE(Y@H_FBTUREf+xYtwf7tzL$J5&v6%qn_8~c{scEVtHCB z7GqZu5|Y0HNWj9p3l+Kx*AK4sx>!#4VSXP@|BLql;8|6y)>4bMB-NkG;`8qS93Zq$ zn#Azy|0v+H0R^!PfVO})Y&8oG4j~N}6dH!|-FYtc4w0@UBNX^Gp2r<+I9y97_4k4y z1AwhX-W4yWG;R45nG_9mX7e)Avg=V)ix4M7zQ+ozC7=Cq9!VT44Do?TAdeX{(h?7$ zNvg^((*NPSnn#81h(L^*10jB5r`1FCwB3~e9%~PyqpKw+BLfWkl7XUGQHeZ*LtHnB z6PU58TxXVNk`zQ4OxLL@I|{shheL_zjq=sg@uz;1TLLWkTlI3NeuHs~X4C82RTt~Z zj+3XqF4Gv+y>xAzrL@vuG&gJKcODzjk=g&zbWUNJc5N8Wy5pTMvDbR9t{x2IgRUk*VNb8k{6^^ z=9IZD(1jmeaI|mk0G4XmbyB%T8LP+q=85$YWPr#f>-1Ityn)+R>#PPt<$4Dg3xuP< zJpWXblELMpy9BZaxbAAi<`Mvpb1Wwp` zv%`sJ=Q=7Iua)&zH6+?30#4IZkc1;TEkQ^yW}k5^4+ktqo+L&b*75BD z%uXh=0*1jFDK=>(p9a&I)7A4`!LTA{sZQEs2TI8V6(3M~J}12=;o9H9ESZ$a+@v>ndblk5 zN8Dy3MJJ1d3*S;b-o2c$CXw?F`>=uk`7_#)&h*&RNZIe`QoUUr{&q~VYfTPHt@IkY zpKbT2M#G)y@C*Z6%>KFht$My6@bvVnT9yRv?qcJy{w-&`WWob8lHam6qF|ShC1${t zry7-`87gJ`b(jvVTJzX@2~ZOH@L$BDHfIr9-sHC9BAMdOZNdu1u;Cv1#|0ZZDSFVA&iyJw7o} z+@7jsAv&vZrOB$l9Jlj+BG}lddh5UZUB}pO)}qI(Fel#+q?yu-eV4HrlAG4ZxAC{P1XD;5b)@5WYIf+$xe}#$hxvK*EVQ$* zGL^>k(XhhOvc)+Uc9$x>7989pUkrMgEyeUQ^IKW;6q;&b{WdPM?ZMzo2H=evh95>M;fOE9eVR~+WdlD4d3V@ITP>z~-EH7!Un`X0kb zSrJ}&NROD9CkD;NZ^`=bFUSO+JA59XyX}^m?rDre(a^sD(GKTV2}M_CFr)C)OJ6+; z$|-k^Pq$y=F=tJw9h(&G*Os!d=_iii{Xd4UvkX9njB9?ZQ^;pBg}QIo*Zp1fFE^5= z;PvbY*YUh$4a()q8we+NsKxXi2g?oX2#5xhOlFs>RBxqhFjpGX9}UEO`O277bGTBC za=!jC8cC(VFTmw~y-UN_bhlUXd_5Z|e0##uUG?a$o03gRjZ42Bi#1n=B^fqxXz*O! z;}@Pp@19SVz{3~kfItXB0`6#nOWqTuz|p`~WTSraakbP!9<=_l8L%ZDeE+`L|7*o( zrNu^nkiCeI%jWSWns`xlj@SH95+USzJdl@iUwL55G-UC;srsOXE#UcX?cpZ4NN)eV z;k~5kjP%9q`ar44`eyV?fq)ZR0ks0~bffxixf$yhmBAG~E%I$}lfFKhc)9uP;0!5+ zaijfVvrLWVr~L+C+4LVUDUynOZP{3Hs80KMn^Ch|Kc13Rc{VmbEW{!TCGGL zgs>(;6UHWSEGE&0C<_tyN~$`^vmfAE!+A)q5}^au22eaq$7?>yfOi96#1W58k@8#2 zkIt14tITZtNd*`_7nn4PC-Ae z0YGxdKf56#rZ8#?*!M|tWkW4?hQ4bmX;3qKFq=|6^)03_-rmk?agjJ z`49nMe%_2@giNJk@c8YP?ru`_$}Ri%4L$A&Kby>_vYAThw|iJjo;vJLWM(94nE?cX zjiVVs29^y@-eQ!Mj}YtiD|eQcjb6yH&3j61T*_0E?yl4kRxSn(0vKq#X0 zcYwh#vem!gc@c2_>lvAdZQDj?nPyIySkQSF2!tmyYTE}-ysi>e+;MXpNT)N*o=DlC zr^$pS+}9T3y|jLbsrw?@wk5 zUN+Iin?Kri;NZk)^;$_B`5RkWTDAw}NQAu1mUpdZ><_MXzPz9iv3pH?c@sWu{joq` zNXF^DTvG4_wIBR1(!uf=jESNJ%CvCNwI1E@%#CRN9kdxw>16*82Q)_BBEyqXnoqB& zk>`eY8$;&BS=NK=q3X8_2lAj0-%RN5K@b)64cL$n<0>8~WmXf{2$eA34~=iY3qmiE zptL}jkuC?=-?DY(#`5sW_-!)wZf?PiwQQkiJ8%hjDr?@oW+lVmQF{%@JL)Zah1t^4 z)3~sFTB4g;yPPuVc=AzBB4Xowf0YFVP8ws%%Vj(?&p1u%D`=>f`9G4j-IfTey7%L;@Vk?S9z!+U(k0XcntfKd7aJAo^6ErXY)9 zS_+uDt)KwMS-_mwvcZW6Vxmb>=W27?s(?1<70D=($72`==9v)= zK+5;F>N{|qRuTm+hlplwmXU7aFf0_q4A;t{|3{H0Kgl{fZwg4?x!Y5uSLU9f{@=TL+Qd-AD) zsYDb0H@nCjUubH$*~!sQKj)GolLeqhpA!v*i51`lOMO9z#5^2!cPm#(A1>l43nYMg zXA8sx{Vjtb4qjI^{$0B^Th(yl2eS`-;0R#^>0N8Re3zi# zM4&DBM`=itix(8g43EhH5-$9T?L4DZeC+ zCcjRd?Ds;197NX#bM|*t5oA>Z3I0T&6^R!*OjqL1Dkm}u+R9|jQgfId85@&n_g=fW zOP2~ow_-8DC!`D$jiOkZR>4RO75qg&@~p|bAED!=nvwBXx3W1miSX+DQY3xeyWza) z(*@J?=n&e2$j-=}7~&|ms>NS%ein>I4^aq8mud-xK*e3N$4bU*=ih7UuD!VxZ2kW% zpz%-SK!20`D%#g}-e<|4_nPrv4w^Q8DNG(&E;a6@NqCdS>9 z7UhfciyBGaEu@|rA1$8Pj%2|23{!Wu2*NJ6VaLJ7-FVLn0d$0|JwgN5A+Jk+Gm<4+ z>=8L=6M(|wHtjPSGozZ;Dw=@WqTJWA*wV@|D@;hIVNAN#l=rVL z5E0l0Y8CKtpuuof>b~W1uxGO`lCg7q&c)u-lOjdnFH2ET@9b`}(h#pF0}8ZVoDjue zWWjE-MfUF@CKnE(0?Al(+zY-+Zb*)j*dwEVfSd~scYqYY)#DfD?j&RBXNOuh>ah*3 zb9TNJVZ{Q?hF+jYLVyy;ro)GESrNVRpmJF7F3Z%#ybf-T4IIc0@7V37<3Yi%-VUPP z_KK{r{XwLv@K8LQ@4>B*OrMn@Kh<(HueW2R29usrCd9`JJ()QJ3Na|}?g~CJ@Nf5e z_+o`@by~30c3_z9+J`BAZZkh9IW0}UK}ca*d&1oHi3n zPAuK)cOI@yq7pILq>5Rbt%e_dgL27Zqkr7r?wEImBD2_!cCL1Y=PSR?v7UYi4KQ)~ z&|oHS@gKXmIA?HLU!S*M;4rI}di|@rvomgutVQXcfv;di^?$^jLJ;`H5(}+{1*V zIePUTcP0p7%wfsQ8dyV#wDE;jk|s#Q{DP6Sxg?-8Q9L6UuJw-BffhH}e?S_f)@o~3 zt)wa#xlHx0{KxTE7Q?F2GEccgW`hQG1Tdq>6^3L&Jf;YC5gw8aLeHY$Blk8$Gh>7< zCm%gvnl-VH84B|4GUj!Vr9gtU%FY_1BU+Bxz0X^{<@;PEWKtS!08$mdfJ_10YGiLqiW&g za`CrQjBrw|Yw{-dAKN?I-9Qy^&T^^;o3K|IsMI_Z7(RPvfN;Qqg?WZsP;<3_Ail;kw`lZDl!TCaKSt@1;HhlDqCJY16|FM-H zRxue%Yn~76Ch(P@@~eQBiRm9DbKeg42a!@xN%-83W}l2oAqd!j*HX@B`_-2hNU}2Z zJiU;6;wFcUTFZ-d0I)?O#f--bz3_OM~(Cyzf@80I+# zwbpmZb-I3Ascx4C4-Qa~d31f>dYvR*QOXiXi}Bqc_ZGH#8IEvDfkNsn$j?t^)=kgO zuG-c~a#T>6t14kOxDKcoakO935QFwh61(pYMtu4}8(}xeo=z-N!)1CFI(uH25=xtG zSIW83)~@b)IFE_I`EQ~IzX#Y>-ySub@s3>;IU=07aX-{x2jdCbCkLQfBZ}V(7IyKB@+HclgpDp2OF9 zIon6Y;Qj7C%uxOPX!U6?>34FaeltA~4u&=*Q0(7$i1$GPL@Ph^EhBgL_9F4$W{%V> z1xaG`p=Kf>>amzOJtq&oG8@j#)6O+OK~|HGlPFD?#t8Cyzdn{^dysQ*bV@bS1C6C@ zHp^&xoz?lRyXg!xsW6E^Ml~f`vc_*K#-~d&EI+-yUhWsxS10o6BtJ>fYyMVkmZ}VB ze;^ie=AkQMwU4KZW6&rg!X;(l;S5tvg-nGH#wiUo0R)A(w1z{ z=#1Sxg?a(hR?=!9+WCGQbGn``DaHud5CkJzYhqmw!!O%F-+wf3O@4j{YG3V{iV`Jt z<<7>&aK4X)ZVN}8KeCorzF^Aw8{k15`G9%|z;-3@f-Yaal%X(zKX*xQB?gKGK^FtO zhF`O zYxH|xs|`Az0U%n1VYd(szvouIB;X6HJe{6(shi9aj2d~}jDyacA(xC${J6G79&3Ht ziID@S#`YLfy$2aj?LKtP3oqw&o`xR;L^VnxWP#e+|6KMbcz>P~>7l?(6f3Yokx6Lo z_DP24enLzm7X`3H-Y*MZftJZy^M~W_zm)6a zi{)1DTnA42j3E~5k0pp@HCw2Cq-qYN2^$?AvUy4@FRI%~-E!}4r-W^9L^ymzqx0aq zpYJn@gqZ;?mjuw>GjO|V?dY(JM5+4#*YN9-xk)XZ-aXCE&U$%wTc@`E<87-dDJdx` zHu$39Eu@GfZ$@iM+g*PloRC5p=7Msv>BtY=$7&uQ7Z>OKRL;U6JcOU6+A#9uVri0T z1GQRa)FzB|N$8HxYmSJEF8Vgo>%#jFR=-^!0Zm*fOK`_|m^V{Jl!!W5-jJ+^GFgvy zX2&VO+~}A3cP~v>)>dg=B|898c~GuSS4q2nH!%;-?>f@_QI@cL-uw9pww2p@KQIuS zU-h$?TX*&4?duN2uC7U>Zr|Sb#ovZB%tCNNn#l_*-w}flmAtF6)6$OaJnLOtZaTf! z4*0zfmtq+HGQC}u0Jbe|doAuwhEjt{oew|g@D#?GQqg|gY)>4#mO&;t)FYuedS$L! zhmCV{xfJ`2CVp^NU_WLx{j%@*+9ZiEpX)XjX>{bDE+653V-uKU%k0&#C z16aVT?ZG@c`FP(0dypL6R*x6bx$36T^xr_ZyOZwwWn1hq%~Hees|c1ZEn2p%BHSFG z-MA3o#J<^8o8tPmOoSMDV{*8)w)Am@n;I>p?EQEths$DHesi~I=yQ?vvjF?Y&hdgn z*UhAyK416E-;5CNjfAvpm2&le0P47V;ckt5G^ojbxx#v~QMi)9uy+2c;6*7%=-YM` za|ifqui_sWJScjKC(Z#F&;h0n5%Sq1*!KVoh)F$gr@4Ipo)TW_p#%J%| zSNDi)pRJ_7s7)acaDoq;8}ZOsIzvD7S#&CvD$?p};F)P@H}!fROtky26`({rRSKl4 zyIxI#u8Rmie|uh#oA+6pX63TL&FW2c z=etJ&b=1LRhCbS5=hYD5#jnfv%eVqy(DwUlWq`AGF@Epm!(2O-RuZ;-YOIe*+#u4| zD&0<*A8lx3V*-v_6QfgIX+QRD;EXZmr}mtKEFT}@K5793Ln=;hYhPjgu%ge~5w3L_ zzB&%`KfOA~^T?;0qQe%zgKE^ClkRbs;m|!c`Ny*EdExXQd^E{l&b^VD{>8a^W<8}j zB9f5P9;&or>7_KnWI>G-@*F|8$CnEW7~}})iQWK?Vx{%Qhvve>#GsoLJH19x#Ne)U zzPs0dNFmXg>FmFxrek@iVBV8`5!h)?gMU%{6mI!h_gmSMkc{dO8X{QNSE*+$>*H#% z^4w?SRYOS;UuW5DC2^(F-Yz6m@RPbE1U4C*@5F~}kB17qx};vav+?D096V}PVAwG4 z4RJza$Ge?WZRG;)L{7W?I7>W@)W`tg$V}$#a^vqD;K+S|{t}MOu0()Q`GP z73nqqVkB;VC-fh5L<-8P|CPGy+RkFw#j`gz+DCb^=xi?dDHICBPoQqGpzwYUl7?IMprSxUK$O zzQaB(Qf9HL$opxwCYR`mykWWUgGqs6sxk<_SeS3PxTWVT4I`}uk0TZWI*?<$3p&!q(SVsd&e z*bRIGZSRgXTyPmPxg5MT?f<4P2v24|o#hX17|JO`gegre#*^!6Xo|7QU}aGT5X{1sR&H`H2I4u7>UXQa> zmlS;&9x^vGW7KQ08af5gBU4?;>63U;nrD+A1D+|T{@=s?QH6zFEfwR+(CvnWX<~md z5p&Le8z>;kMq7^PH^Z@iQbN8uP%x7b1p%qsoWw+!lD<^Oc7d6hT8K^V3ACZ`s0b#V ziaA7l5`~3_zKqgTqwR zl$53*Z78+U@iG;-anr$pfwr~mcG`l>Rex5YP1Jt<%J=&KM5xD=>yKrO77P)yNYFoH z9WZws`z2-klVOe+itz@vHje*z{I@YS^OZt&sj}VgZ3U*LCP0fY0m*%pBn>@gJT4QB z6qmTjN|BgG-5>4^Qo#fUUN6$cO^KTJKpt&~5)4zw#>Yosl8BZQ$WJ*AYFUe3T9Sz2 zUq1^E)@jkxiA$tx9;TA3Be(Sv3Ek|?N7HhBDg4ub99G-%*iyI)BWbKyqUKbJa0S4K zRrM58a|S}M#1g^O|TXUIR_Ao?rB!Gkc+L4#6*5N$}`*FJ$H}OhQsIt0kJuva62dH0=0pz$gKwDIPA6QGYqLb z_u*(_d``EX+};4Mb+RoUl8_f{`FyAh5~qlG)_VCRX?zQItcF$#CxPUR18yd@__Mp7 z(r|K2G0LN=)`Hy}_)>Tp7$cT?vbe+$xp#NUk5(o&4;XN0n3;W&gwO|WNw6`$LB(B` z3-UN!pK<#{9a#@fw45EWDTbeN;NZ}~opC#Z%*5=cl>JZA ziJ?g*P^PcHP5}|=PyoAyHje68XrQM#JtO7{9_~IIO0T0ddw*#1ABH^kCH1YFCwx=I z5DGA)1xL0@l89j-!rMXe=4SJzSgOC4n6mwtR46pB1sZ!mqHMCcbHA$ji|nVrimK*} zO<|+Pnt{IBkuqentn!5)XjqbQ=JBTN1&kxm&k(pLS3l;vEhaA zrkoCyLgnJi+Cvs#b=qS?@j^6`kw8p{_`_`#4Y3#}L!jBPk2dM$4j01sR>slsghJ-> zr;``m!Z~}HfFNk$$pYd(xX9RosiNe=O`aSSCkCt|DwJ);IRqGS{beR<0wrlvBQ=?u z`=z=Uzq&;FfM*oD#J*AD%>bqxZ?JMCAb|?2|t}KJX;?$G45w*@HV0 zK!)Mzk%@JGIIBpN(@gO3HX zK{dDU3fH(l$qTf%AuAc*Y0mItl=>Jg)69m z&;!zubai5MTuey5k>+`DR*YlcuBWMyC-Un^k&!)kQT?!6-QDMRr(GU#n#awLs41{S z33efzKy5WOXFU~u0EEB|g8d_-r-4zPhFuhFUynpo!}C>xi-uu^T`ZjuRzc3$oib#F za8}$qM>dRH<`9n^nMZ1u%A^{%1~RZ_hCG0ZO@V`-AO3nOl~JbLIu-5fTA-$G`LU6_ zpTCGK@P!0d9h%5dAlR}1pL{Gaw_gUQ&EjBv<$PX%Xp)$nMs1`hM$IPQ+;5#~p=dy| zytMXll(O~@qv^{WXD$lNE6}Q@*WrXM3;+iq7IE6H6DgNEvP*+^Ck=k?Ur4x8pgKdw zp@xCrd|JXJYVTYxD2FhWy1A3E&ik~xrL3I zk0mO~OVexTtB0TvJ26a`s&o=?F-S`85XnI>ajKz3te7xowB58?wjqSl+W+o0FVXL4x*$a%Mc#S$fV2UH0XHX!XwuWBZ0MakZBqr z9%4i~o=GbcNtvOqVC5U$3{|VdAW(2l+14cE``qSQ*%mg5=cA*T^3_nk#?g3mo9epG zCEMdQOf&%Q-&sGgC^QIK5#kgI0)PHp7y2(TS{f7&9Cbj#J$*^2)JhAtExwDT2M{)6w z@(6_c!`e^M@1W9G$Q%|lTHP)?V6uF&P!0dPSAhW!nLv+4El>WAU||NSlMOc(Qsn)j zNB>Er-rVBSi|)C`Iq@u#^GB`4pY6SKXeP3Oh;E~V>0Y?; z-5hv{@H0N4u^}WrUaP~VNHn;rW)BT?IZY0~e6A7)?$7vck@aA!etpm++E~Ld>^WOT#B7ZYI+xZ$HknMFtySQa&oFTE0+vHM&c; zw(jHe7JMfv{_yha$odEv#06Kad}{%%x_N;GV>417hB6%HtMvH=1&Lq9pjRBjSLU_? z|J4T$Vz}-F5HJ7qKI77oons{d*zSNuolIykAg^Q9zXOWjZDf4h@91cw+sDi66}aMj z*FVU_!ou22W#i|^boxSOWnpoU?lC?8*5)TU2i>N!d2?W4xdj4#CzJeIjhjK2upkGA zu<#}{+L_*@c<@9Ei{>GT15&-Y~6NrF`ge!~qc-?IO?{)T-~pzm#l3;jIE!rt{&ncoIZE z6*QVcJ~8{S+w*?~l4^Ps!cSwi`ne88vWZs8-6}vV0ZRm=kl^Iu5?$s7V&#yCsSr$J}1sN*ARAfr;C6zdY_rwL1w0%5Df9j=>yQ zAk9jx9|P0I&@Z=6tgEn zcQNBYS(3+Mf(Buf>X@tI?7!xO0AUUdgU?sS`<<8>qc^9JMG`Ux?;_8<@fEQxhs^#umT!j8L)qx zGzT=apPuV^y9CJ95Xw)KYaFQS^38E~u~~A=Ko0hrqIpXuz-l}}?fKz?-}QFnd`-xa zProKeA%lxl&}JeQ9H6tl(V_TffoHMSKYd4FWLY$&4&M8HE(|-0GZn4-4m(zZP-E1FFveWcIm|^>-VX* zSK&zHXRc4iCCRa=*E36bT)$Hg9y{t7)tsQ|=BHRAhjTns;~F=-S0pFU*uE<`4Ghr; zJWWu1i8-6<@D`lJj7W(0_>-Pkrv7|zMyMxY3GP-?Lr@RxQJ7&g>Abwp&`zn2Bw{t1 ze{{mO(fDmxG6qb5fxHP|P6IEUXjG^Qb-8WNRSUIWh6GUre|mB|{epjV+EHXtd?I+HnNgG<;icZ=pMp`sp?pM;(O{Qf<<&E+Ay;sWk z^d9E}4Co#881WL$kKGA}4fpI?O^`*Y*Ry#MlRs z;Z9#9sVJpvQI58gBB*4Oj+c&RviN_t3e=Ja*mI+tK%#s}BxcYnrhaw#3S$I^L==ymak0KhTwNxfTs1tBKMCDDf1Zrzwya8QfPy0eg8|mZwkpD z%pK+A2zbBtKdg6o?Dd5&{JwehW76ejGHf$Dx&H>5Ao+C~2297ipY|+Y?$0nKs&t#Z zolQCb9gI3{nazStOTJsD3vNmIxAmH%GMXGZ&HTrN7~yE>cBdVoCdQr0<_%7!K*rCX z+-j5M^Mj3xi}r+Wwtu@Dd;ovAsp%TSB4fA5o6bqonImeRZgA|LKa|6ta*cJ*mnbIP zCNPYZyHCHEct8b4nF#H7rFS;M(7lBqyxuR z%_=QH%l8L1HYW_rK6a#6SXANXnz^G#^WiCsqTX2H&!6|pEOY+Vo^bn&RLh8=7b7!> zXp5k#$jlN|9k#R-e2IB}gLLT0$;vo!Zrw30I9aHC*bE>Rs47*+_?+}xd6M|7O0D~T zBCQ@caPqBn%x*!R=yAM)(Q+x1mX?+(V(j(oa!Cw?*qEK}Yw1l)ByNv!iV`X&J3AyE zEdeWg|2mB28s3K z&Ccp>S!G`OJn68^_o&tPf%Q@;MhkIm)I3%gn7TAeHFmo0Nmk?*Hc(g!3_0ZL#=`7C zNcs2&&Rf$JCjT%>6y*%&ApbuLAPJ9tpu}bJcs#|Hb281A_j5=vlgU#@vq3aQ?*poP zi6fIE*?f0%EEd0h^1eOOB+x|R@c`-%W|jPj#*?qV)hjpe_L}S#w#ODuy5F0)Tb1J; zQ{6%$pJw{MC=p1E$twwZJZ=WnAGDw)st%}=-QoCVKtzBd(5p8L8?0u&8hRI<=sIXr z>P5+ptryTd5b+u`>X;kDVHuNE2zoy^kTIUk7Gc8sOpPkuz;#FfU;HY}jLbtM7&EX- zw=t=i8n{fyZ%VFma}UW9mr3h!+~I{87bZfZLNm|q>UT*raNJW13f4>ArPtP8^<~ph z+pcWpv(+M;FNxDka(m~lB~>(x<9`ihWzOz)yuB@Icr{`L{qC#xE%|<=0xk6Fw7xiw z!_wDq?ZSc2rXY%zqf1@V^rM?=&}SSuDYc)DU*qPv@n)*~@_GG@#xx%@(g?)vYAaM6 zR8VXe+AwvJ5(tIOs3%aXdUuT}ob7d{%4f>R&rq-9UMAM9GNV(l5N6f| za@0A6g@w_mKRbYlpTr|{yZ2M0{2d=l=fAs|rfPPTnI`TEu% zdw{c$8NY9`Nz{nwT&E$Li8wB!w9?_Uvu!TCe4HKyU$R#p@8O2dy3QV^dnT^7T z=y4=#9eK&D4SZq|nGujh-Q2?QLQDl@i4=#!Oo!o-@h*+0NLGBFk}x$pEh-IuJp*jE zBC{ja^Z~#Vt{wcNzbIc!CUND*_CT$5j>1h#L5}Br>qA>t!PxzWcA)VI+Jw5aaXj)M zyI6PyeY!4<>US^y;UnhERON1aeHfzgg2-;dA;3sRjbfJDO%!*h`})SuH}9ius<{T&*K0ZXUBgxcIM&+xYwfhGdou)e5bE;)fqz$4*SkHzo&PBa-RMbhT;-)t>l; zBaI3(a%l;KdZA>J@lw#sOwRQ%9J=34&Iqu9#K*zi5zI29S?G~MVWu+56-o*B`1yO$ z_E58LorsKou$?v{o6pMA&7@%WZ#EfK`TR1gRb)Q%E#*CBvdt+L$KTPN?e})8EuuFq zd1-8HY*Nye@+wX?EHla@?+M%?{jkJ45-`6YCF29_mjJgFh2>P1l<)W3k*gVsA+Niq zuMxN`z_ZlDPuORBAWZkOLs)otJoX^#r^nar!HE99vh&m!_E%9=7u_#^PaJ20t>OIn z1{E_@`)G^gw<%F%bI?c$bMUZ%@F*dbQ#K+5#MloGaDG(Vb|wR zJ7R>gS${p>KDq3#aI%7^Q{_1o(8+0G1Z4lljN@3A?C~U~2JV_r8<#rsn+?d%b7s~3 z0GJqIbKUN{X(=^xaNJqhUM$h@%nFT%TvQKN}aA}vq`qpxS)3GXu@WP#VY?( zBDZ9_92PGA1Xeg4Hc`e3L)J~E5#0`>t3m`d4eiO%Q6Z1lhW%)#woJhJ#}JR<$#mB@ zN)5%w;JYVxSV?U!$c$hx_sUhC|xcdY7fn7H+ z=(kdmZ&fw_5{akQ;Z|moGHM2u4c(q$UKn~tGi%P5P+(iutnhC;WC4aT0 znZ^kkwb!O9Ha~0|KLYOfU~$8)`1h z%1=8c&AP)H<9?|3P3VW_K#HhvSLgy3v>MtG^gxpc@y+6`X4oCLTJ}0M;g{3;uZG70 zo`3zz)Vg}S-8SCewEtNHhP+>IQH#}j?a_{_$Uy+nB9!9{A%VK{S=LfAUPGHsyTc7w zCgYLF8gt3x5zA7_VvC9!_*mGaOTt)k@^iySJzT6{T@d~Y*8t943(FuVQAS=@ zJs#i7y}cL2YoWAz>$&|uU2pfgcBMk6fBVb$5PDq)$pd}U5EEX#tI;e}o&Cwdpo#Ui zU&FqB;v{w}=_k)U-q6bp-y#(J%#S?pNuMqDR}T!`+C=+3##26Stx8IS-AZha7a{=n zlg6hJ-^&eLo)SM15l65LyFCM^1~fFbMkg1=NPCSNaJvkS!8^W|NU2hHpHEeR<<(yK z3;=4(jwa7mVu*xmolcr4zMxd=x7sY!k;V`Sb=*8`G+!)ZB0qCV7W)sh2zbyccgpTr ztCje?EG$w*B&FUTH9&PYj}um-0`H2Y*u1*qKDM!=gc9I+`hK6`uq_Yh4ov~n7V;cK z6a?C|a=F&k6)=?Wc^8l#1h$iPbL=>iA3_@!q#WK}^%e?U@27K(wwiApX9qz@xaYu? z@(Ag`XSqda?++DdM&A;b z--1huhc`eE%n=nImOm8sx&=Dl1yT9*(^4QD&SAxVo_Bh`rCz1{WcK5EPKMGLV&3~j zea|f}^^m)jsxzQP4fHZzd_~{dy&-zv9fwXYXq28z_QHRVSR#}6MBqlVyj;ELxBDEe zbWg#P-XHQCZSE>jn_F0lsFcZMC<27zVOtOO(hW>I5Gfh0Qa}XpHfkH z!bY1TQ76s%UCzd6cLaRjFMYuj_wU}cY~bh1_s%ysWFkS=*XH_tQOh&~Ry&c4 zD$@JOd)=DVyxf$2A=a@_!TD?02mo2dkbqcB7lF&1{&dC-k9vBx(YzSjB^V4S$ZdNr zZT}f4sQj(anem*??WGuI*6+Gr+A@WHxg!?xvTDxm^w#PATPBn7w-SH)=j9UHP6!IA zkm>zTU_^k&1^COFz`LX`GsD9%Sywo_4~OgD@L094wHe6rtuS&1nTf1^e zR5MNXPg$aggzra7=7LcPmYRP~0T+Vz>y_*ugiXk#yv2^H+xveA*WWG!KIwk0*6J)C zepxGyCStSM^i8|jPY?Ge+xz_2r=JM8|K-^b-1k`K43oHRAY`h)8KW`=F4Z{gDWlnen7pZUHK6N!g5Dn-gD+@&Jy2b(Kl;Ocx6#(;aH0L>5WT=+ zGPT#iLormahwk^$;+zlxckxD#cYiQ)w+G$Ajx&zi4SWpIvaLw>7RAu1uruXn-m$Yd zIjRypK6m@m;hilK4UaG@nA4Ow?4S&ibSIak+gV=ojMYah&#w@Qz0%6Vaq}A2 zRY0=(NX8Sf&*0S-5QNFZle59ATBQ`yQXfD-VnRVnv`8VK9XGBs6&m^1scPi_fm$TS!h{(l0ydS&}JdUR^^2V2^=P9He(pezwt)cnFhB4 zmBk(XK>XsNJZOAtDtJ&?*s?qM0`d858iNPjTt?Bou{j|9I9g*2V;&!))om?X=bc(k zg{|bh@4TfGsrw*pe_cwg&8WXv<2~ofSNQ%M(v8+I(23|W;teOW3K7oQj$v#SOs<}q z%Ba@NG(0EHrODGyaME=3-{mYO4@=$B#3Db1_)9KQNmmxH;cdKcL4{J{uz%N%$I{lo z(&qjyUA=-0YZ8`kl})St1LhSnO*xGnK+dK^>j#NU!1h9Kp0N0#kDPrX!{Igy5*6Xy zLB>x*;w?n#2EPWT@_dT}?LozhQzB%rfpA2{;k2>X_nL!FCuefoFuqj6frnj1M%-X5 zsiTn;{8Ce#C(R{;b=c&rO|=%JdqfqfXI0}{vzaUw{2V&oW&wAVHKkBM}X z*|by`f7h|#213!a$YBDqWt7=6Bnm>q|5z@ezFL$E`o?M+ZF~R2|ghPrJ$_v4Qq`^O>akW(+mub%iHaGT{H7>UuS0+T7xA=CzfU&# zp6d!nj34kPRwD$85&1-^RD!MmLqxfKE9&bjv^7LqO$)0i9?gBIt73fU`N+ra|7QV| zY+<93Y`u^o2u9qo+aWuHG}tgAeZ*%NvI+sL#jUF(CJC}wlByaS@xC#9oS(dLX=j35 zqDA7$6Imh8wIm#kcPPnHeJLQEhx^ad=l>v5PbaRw*7>Mlz}fqR5^~ht_`C;aynVyA z3hmj@TvKtb=b+#&i5a^*OilRo2$PH7T>vS24u$;vfLjRiXYwome!rX#?iM$VIfq;> zoL*Srh$9Nqr+R6BJPx=wqdJ=aay3Z{2x=92zbW~VShOLm!bi$PF{y9j^fGmUpRrI2 zF!C_eCkPhA6*7D=0H-i+M(k*7P9e(WBSF z&h_MhK0hS}SU_FvBkx1FLp;sFx4}D`XG{~`9YR=+N5$Hw>-E@yG#rC;n|yrfVtS&Q zJ`Umg2{0N!#XT!%=Ar~o0}6R!y->x_R@hx{8=Cn&jhe{ zsh4s}Ti`$7h+6WhR`2;npx=|NXnB2eqnO;}0~fP(`;z%Ejnj>f;84?(nT}WEQ|Z`H z@Hb;8Ssin+{B;};5Bn4%G7^z|D`A1P}sYc{-6k6EW<-cHed=WUBeF!az1U2tt&Pg4#0H3+f3L1Z<&4s0OkrTb}~u zKnRbBV($?1ORVyzaL{hzdA{f^|4wt>q9OMut5;-dK` z!UuSe;UPYPy?it3n_-q+T2v4S=QpEG0_M>5YN$9pTTFbOvaPY5!xfb)FlthsFG z$9sE$R8-dERSOM?btPLj`n60T6np{3pz$Xaytuv`*Sx5Y{c+HiaSakwFInKr`^$yT zL1i-{4NVG@Mtla2Y%;Sp``OJ@a;4VawjU9|TJ_0GsQpg(%>+4Bgf)xZPoYfFdPcQK z3YqwDT%MH8?hx?flrL5!>Bbu7yVWlLumQG^(BW9Pq`DmvGeEo!i(ao(uhls$EUY)T zTRN`q(+M}=0ZR{7lVAYG6Eoj*eeSWb@W2D`Qlg?pK+rxqn{V$1yM>6pw&Hlfb~C*3 zXSKl>6yj?)0j*S8C3#>lR<2n|;PA0gEUB4g%;VRdU!(Op=kiQy>*lZtg2&s%mm8)k z;b@cIGSlb}ndYQ1#rj0%EKe4G%LOd*|Hso=g~ic!%^G)im*DOefx+__yL)fPM{PaOE#m`7l4;VMs$r|J=(DFkno5?F)jf z>wWVEh<$J31^%xe+15aSvupEGnq1J?W_91h{}vEE_huD-#;ccy%@k0>qzyxan6)Zn zQ1^ix$5k{(ui%fXp$?DZQlF3P$>3IoH&f(B8kO^kU2VDfTO~I0K)-|Txc2z`$HTyGed(nJbHi@! z3}CB^`W`?q0Lh<1$Q8)+wl$F7crLYm?A>TLZ0Cjrx|DuxFBpN}HZ%7rXjl(CJGXI@ zBn!W2&IVJ51l^+jj>2IVH%n#KqVTzjd<#LuXVIQA*;G=D31~WAI~8sY09YU1cPAB< zNFgVBUr}sgQbIFLt<8nU%nSj))^p`?YtJ>c0R#7yL7`6~v~&%0eOUk(?nqw$p6Jsm-j7m<<-?yt+9fF$|S2=^+6P6dWmJJkxFk*!1*}? z24!oo_t>#chTS_gA_Pw28{FLKEEEnIbSI9QVDc}mDxF`YMy<1>w0i2ibxQ`n?N<^9 zKVy({Uv0H3_}ra%bmn><2W-LHF@MpGAZ9JXBFinGnoMI(^MrhIS571+P^0rQ45AK? zCAr*)IG@Skt1{dEtads7jB#Sn<7>-^r_UK6XY9Dyk0^Yy(p@$=$)T9RiOnSm83?<+ zzMf9NFo2J!w#_m{E5)E4oc)R?lN9g(i2!mwAK3U7o28s<%TZ21-;6ehI8DV}UCn`J zj=2~dvQ0>OLcMON8;}Ws#SqtSIKYbk`}Z5A-_1N=5-2JzmJk?16Nhhv^XUfebIwPf zRdRe8qy;?LJ{{E_`$LJ4CmK&6AF+CgD{J{dz7!7_;s5qQ56Y)8)nq%Xhu0zs?WbUe zS_LKC7e=fF@H!4u85x7SY@bV5(hWrBn6JH$R9JMzvjz|2MyQ)L(uzTG5tKg;TGxH9 zeItCFo`by(-mjpmju0~YwiUe9+a!sBr-xIQ;tHwTwwV)LFd%{h_XFZ@&k+g z`zJ@aksle@C?;`}QNhD*LhGDCpbx+<&jneoa*+5KpsPlO^@r?n7%XxT9Q9(t4eijs?3U;B5rG4H?QbwyhRA2d>|Z$6p%iJRj?o2;T&=W^x_+R}=Cz|C z?+MabZT$;2ry(IH#U&?=M#Br|(o1atot*e}-m@DwYTin>oL*cstos0gtKW8q6ID8O z_lIi&?4tj8(c~K8wULtN5~O3V_h$eD%a4^LzE~0gpWWef68`GmtB4kq+XCaHObzYW zz+R*1QWvf>@?J__&3HNL!WKpr!Oc_*`2Ot8aSx3IfAQ?HtjX0CUvE1N9R|@k7{^SOKr=xsQ0brsD4R#7 zub~2a9bWB%VCuxmt*xxx9CL*O_C_ry`5izzm~iqbjQ#C?RJ00LHE{u{k!YSxX@?zh zZK}j#9$R0gJJ4~}&K?1rZzfLRmFuX0z8XfrIz9O&41D4(p+5|H8kq>_jZjs z{ZCI;n(p~*VV(tS<_ZA)^M{`?D-Y6F2pcZ<{iaDite5&2+nKvyaDTztX@3I{-eav! z{s5*+&WV0`3I4WJ3rYG=*5`Bi2jA=}dY`@8=z5_D9#twwr$SqVh3$2TZLQUQ)%9T0 zZ2ItLWOR#Qg#B_KJk8W05c0Uy`F>^8=}Avdr&(>t&cSe>xo_8@6+t^7mxJ-IHC6=^R zwGyfJSD9sm1O@VH}&n&Qow#LCV-Ct z7pN^Pfe*4WazFql%(%PL>-}PV*=F>vCVO4E%r-M)-+?zEExKT&0)GmT;ZCQSK|UE@ zL4e=s@zLH+d*4gU_jJ0|*k?D)Za3<=v6gOlr0e>AL>6-^9;mhZ)c2vBavE}S+Q4#hXT9d zK}A{K5dh^#D3k*1)#W;#KKG7B8z)x)ZG~7bQ}yfMX3TinFzwMr+m_hL zzwJQ^n~QNAyZrieZ%CMY;&4A4}GD-=#v!~%pvt(+FdT9mEEO&SaH)}4j2{wR0WWC^Lz-B=y z>WkIVNGnB|@EFm@#6>I-mBy(#&`2wP?H7c+(7XKGC!Xr$03s!Oe{S6B{dniFhK2X~ zuzlqO1j^DKg#W!Zzs=1LPNs2){Ww~_%NO_xQW1NEBOt_%^V`Kkp(bndeY^tp=DF!Q zfe9IElhg}*03y_|JG_E~F+M6vzT4aHU-ioVtci2mdPF=~o|rYejo|kSfI0iM&PahK z6t>TWIsrNe2>*n`rdg`5oit9S*I`g{z4XyYpY#1s3kZUZS-GSkz!^Zurw;A2XtPCl z4bp4ct2S<(x3Cj$eLvwkxPSKT=Ma708-w6R69 z&DN2O+rB%lmMzTW3P&W}lK%4**d~o&nc%h@U{dZy4qBh<%@%szxolF7nB)|%6v?h9 ziQs8X*hp+w2;#CG_tPFR*oXbPvX4%@7ON$Z46HkO^#1}KH>E`J3-Ip zf4y5f1GI8Mqb%D)Dm23pkQ1Pe^!M^2!rdrrrKxIC{P6?2DrRS|JBxC1T$MxR7#)#> z=(x2oP5=|+7Nx&_i}zhH9S;F(S5{gNfQ$q#I=g=T!=K@AYFu)?=VD0IIRZ{Id$FX9 zi61s5c|B$nC(xMTYYl~4Y%W2=(dpI3?IN$<32w1iru;A)AQP`smB|}@(5JS5*?w5W z0zzln@^17Lg{d!q<6v~Rijd>UW#fgi(G6n1V>9o6CL&jZd%RN$51iCOnMsAp&r^uiroQVcG zk`W5!Iz|l2j2Rit9iKzF6FFPM(tr8>bt>0!`0#Ha_|$bAXV`NI7a!O9T})fLliV?W zVcS*atMv5lO`BG$M*m{%LPh(hJjS{G&oz^~p0H$&=?kYu1$%aI@QYT*FqmfI)L9sJdz*T;a!cI;k+vWH(nZRc3dTO*$?+^nui@gHr zLg`}0q8m@d9XJ{&i#Hg-EzJota++J5LKJM0MSQt*=W|vTg4A|ewH4^RiAH*b#u3f1 z3PttI7!G=#sBu+#Q;23nDPxootDGW2c@ixwULusmoTqdmJ2v%}UY(_AxkF35RjFa6Cg1MYBB>=0)fgjT@3JNS1({L8 zj4Tjdh%mi&oIxjS%iGYS2?MPruiPCHj zL5(VvtjVNleXU{YfwuZk7BLC6h)OgTSvKSFt&iUptlSW*p|G<3XkP+D0-f)Suj(eC zm5~^9MWKcav8Ye@!p4v%g1s4kh6%LSBUywKeG~{G08~6PXetD1*kEhyziXx(BD*Q8 zZegEMp`i=ONF0mcTSFaPG(st1VqrKXEx+@A&ahuFy&ojK)S{aDr!k2KVBF$VU~0?; zW(pET2q3BqGaee4#MJA}E*hOEJSgv=FPtr;qK}{ZbHz?(;=gQgqRXZE1_jz?;3Ovu z7-ncbNZwJhO%TNGTQCohC&D0=N}eE7QHFCqf1&MGBi7yyq}U3D4<6vv3YZJ6O5w$B zzC!I1B5=IG8$Z13Q$>ze;MA`~akC6}hrf%KEy)2? zuhx))Cqkr7rmUc?B*(1vTQinKi)sN1=4l9>H$d8@c=@d`7zE=hyzY1qD@^~}wdJTy ziYEkma7%5z!Qar270&#IVIov+-601OvM90YR4UP za(Ho?0>MeFEDr_h+WrL&YqA^O$7~TAVNMZguIqhx8|VLC7Y1g!}3o0vfa0VEs zsO<|&$Fhp3p49NNg&%uN+Z*vq13uD~I48{>FOc2oktdf=?wZ;t1)k5mqY+uTVZOBp z_R&6@r3AAo+gA*^9tZCbK2&K}YXAO@G9MC}g-#-1w+2c4e9y;{Ll&RRnDKCjDFUjM z8tp(QIh5dNg{i+v;2Nu`TwdY=&cu$3jYKmnk)x6?)fJHEYf7b#gSVsQc1X5CqPs*AJcEx88-4VcGn(q!;@J2$#U#I<@lC z@=T5M32q7WR1t7W42lU*8S`^mWja*I+7g7>DXSFQFoDY3NqS~#<@uHY-e)b zn+#*VKU?ZFindDYr4rNO(C%`L_Y%8c{4=~zCPu<{)tW2(NjY7?MP7PhN^zEH?9#{Y zvHi#Iue|6o^NNELV`H3Qwk~lo9AcDK9H!3WyJlH5!otD~0>TU|!rC6J2K6?7ZdBCW zxbY(^Q~K+?U*DRis!vWn<oHh)ozf%EgvTNLw> zv*E|a6hkabZBK2NHLM_0-8%tsuqj{?VGa%sF)f0kUffj5lZM$?I}`AR zIX#H(|CGq<)ag}yuK9R-{FhwB?t3P;rMdY!aMC?Vj&H3oZtzVU8c;)yJij^GXtunL zN@dZkRG;3B4EyQ!LFx=Lr8HJ0Q}`V6Gzjgd+Gyk2=d`|5@aSV?%&H~0H$VEZd#O8p zPnl7z*7bD+m?r-mOzY$^YtY6a`VKY11?_#v*um?kg6z!ZjVU_)1-PI_OTwNfNDME} z8-5_slr$m228#XYSurm!`{+PqUKC{F5}xoeOsWNDTuZKf9#2ZgAVj8)5CHJYgP)92H-lQk+l)dsna3w1Eu! zY4pP53Jt`T-?ou)M`H6Y#-zxvuU+%J8y5!2SL4a=FB2d%>QVTphtSew-kgj)qJX*$ za6K$t{{f{+YQ^EP#5|SXFN<=%Zb^sckHwsoyf2W|?|%DRjtxY&xY2M~+@dMIC#q6C zJZ!5J?DPfsC6L)=UZ?^{M;_msHtgch^aS$d;DVX+-gi;kKPmkp-nF_d9eT<1+?LBX z9Y$)uFBH(o{q>(03aDwq(Mb8M&#Gwxb&*=Huit zMKZy9uywwl=k5f)zN&PKX z_$eo8@p)HvQUd3FRh>?ap~v2zlF(lt z{PTOq{aSqPy#p5Z$bUSJ7&!GluI1%QjVd#mwERm}5rc4ymFw3YM20;3Z*-o|Tbr;O z6*XfcWf@{A;VSA5v1!QupPywWIGJ zcID70;I>{BU^)FW61$eo|IKfAq9lGaUMK+KzQ1Iwt+m+b_~OGlHo;cE?|J^}wB1ME zX=2n`Uk;Qv4+s5}flJm5O^8vCRQ>)nC(BpNX(L!BI)^=i*@et}d`Rs>iQ>9~_e>V={;wNi1ORq$w0un(DkW|QP zPtq#2D=yE#`8uMw-e~Lg%+IFVXTr)}DgzkCvUp?Tqd$O(a?}-yg1<oX~|7qW60!6RcmD5b6d5;N)lnP-RPQ=l-X0-u3O2mRtK2q;>d;9JAv9+g|u$aqZT4= z878@Jfm{=&ZA4_v|Fi(nhs{Au@V&Gx#8?0a4pLfTK%hn|!`%kKM41q90{g$*RK&%L zsFk{=lJ}mXJ$8p}7n%HkJksCuP2a)udgVCke$25ZilB-?I#7Dpc1r54o`V;lp4Id| z3rn9!ty}HTib&7*qn|14y7o+W-Bk#agqC|EwGcq<8$xoH#8QGvkf0+%5k`v0NXu%t z?rZR#K09B&d}GAW}KK$-Mmv{b;Ep$=hRkBsQ&DFGelWPMJ?kEFCAff!0yQ_`1!76-sKY)hj<7 zofH5)BMm`0qkYbV??n-+N2{%j8vgFB{W+MYR8_NRvso%4LhNC4Jt~zMk3)@@2)LLZ zUw!)Dz3onKr>Cd)2&{Geywg?HB{BkWcM?8FPY@KcYkl;3S+0i;5ql^={IvyPptyza zRv_f?evfqo`#-KXafliS zzj|LJQE>0QnREq*RKhWWQ3mlIx=wIvNgdgcCLNiM^0XFnG~8;B}fgRsQDe zy+3JsE$_#3NF_eAk%)`=PG5hniQih%SIPiL%M?uh;I36@h`(}XLCgXYTY%!bVbFZm z#MG`USL95-SiqmMd@IY{UncFfT!&YwnmOePNx}Ts7OmWgv%(q@{i0BWF~vE^!8AgV z88{`f@wt_%faUgT7wAza5-N7C_*IE95GD)^$bu-1O}UM$1rlG`pmetLy1jCj}Ef#~yhjF*EwxM!cY1_)6 zFVR1fh80W^x!;Oidfz%&CU9w(vL?wDB4KW_iprDh4@;}ZO?+=XeP_7zLU%n#ll znOjgwM)^zSmb;7N@aShk`7exWzZl`@g#{=n)U|#MWgJA6Odf@&rk_WUZQ<=HSJWER zc{bq4^q4eLeOyiUy!Dk(J_0(SL-qL`Hn=S^1m%=~pI}OgW|=a%l7~sBckY0z>6buL z?&Q!gS?d_Mwu&|~$JVAVg}<)%XAeq$2=QqxeyW7wm`U1BlE>#L5iFiHQSgu*HvK4$ z6(k%PnF5k0K5~SH8H35M(^}&nj6io2HpFMvCgbt^ES5pjV`mt5TD!Oe&(&MzX6eA2s`n8$|Usez0Zqi z_>4{hJj53AQ(vcV4qLu0zS@8uf}{}moi;wv@Uh`>|9*cV^*lK5S}SpufAIoO{{SR) z@a&V-$PLr1=Rtx$HJ@n1OFvF}Yo7*Fq~eD9X$%^;&rcWn5cd$51q^6p4P;#af$UGNkorA}BTsSoW1)~3 zpcuY57_{bbdb^w38_Ku;Ilnt3)G0rB2D%g$s`h`H4Pu;$b+{i!A!fA_eJlr$LHzVv zy55@(d77G(MpDMe1T8(ovw%rW#MAyf_3yDDVO+F!@3Wn^q+}uTwpe?e_UUYyqMV{K zF}L|m0%VXP;3Se5?AL33ug1Lj0EauL*G8L|fhTOU8Bwz;mf(=E)OqXO=2vyz^U!Qw zvbrt$_UoC{i8YVs_+`CEl$x4~8 z;d0G9p%Ij!b-*%_NXT{S`P}RHZsVEKj~79J(J>x3q9+{y*9%*HVyHwW>f|X3w953qMqouj$$;~^F-|tRzaIYv_*MZs2k{X%r|;Kk z)5|c5PwsZ-c_JO%*T%DX-RT@AiMfeF1t#w<#iM8^O92=4g$&C1d2f%cVys5krFP8K@PTmHHqT&$gUi+OEK<^QV|x8W^#Pe`O0^?$j9t50}2w0Lj6plpB` zzrG72n#w^c^8D@|!T01pv8p%^5#Iq{v_jX%oK3Ej;9bJ zLmX4^*OgcFG(8VWqyY@){5C`N)Up`4+)9!C-&S!Pdi$(g+@6|&XUSdUIOJcXCES%O z5AZn=^C3p0Kev;D9zFlcz=4HQC;Lm}oknps@^tQSx&*Q}>A8ubKy3H*`5w6M=XtM) zK!kGVs@;v!{a6TS6mmTGt$!Nb?Gbl=*Rd)-IH+luco%j9qjB%modM z2UsdnDh1}W5A^gChkuaDQg{X`Mt29!jMQiy^@zg8Ga4*136xKhlW{Lgm@vX1XX8OF zgr#)Ym0yyWCov)x4sWEJ1-d>7Jbs>bmY)7u@1o^m8aG+bZfL=ibr_4+Hq-U z4+G~aCz{ei;2Nh?N|fnbyvj(uTsmw};N&S(XTPe)*ZP)$v(v1n*y7~9;5_{Cq$Dm1Kr_3MQyqeXuq&Yrtnf5H;dH&*o-hd*<4FgD0P zcOp-}6N6epOLp$SF(Ag?`)iZwAkyDBM?s7A(2XJa27@0sA}CYlF2J*rovJ@o7%@O> z1mulDG7)I16I4z)U|pLw6y7EYPI>G)7rjIXr{%DxDYl0=2SQ6KUI3IiO#!~L7AkzO z6_VA!SyVcgT#;fb{)AA2J(m?uP89r0j@w)aKNZvw`T*5YBTQ7PDb-Jv9aUG{2Juk4 zG}6=zj+Yqrkc~7Fu3=PE)Xc=p&>{w5$1r+e{ZCpUSGO)(+alR!FQckSTwQ5qoi-3usXDnyUXKnhf5<#3HI_07X{B zneL~~-R}F|EZD>rDqX%lqYw#SQ(qdHN))d_K>?w(IQhz>f;o}Qi708h5sQ=cdaWb~ zsg@R(M+i2_A(5U7HCB(DV?1J5ha;kS;|Hnlsw|VPDTvl}2h_;afoMcT-Sb9BNURYj zVRSKDE+5IT#5UC|loBo1k?b(&CU9d_U{&^d{=voNFvQA zCbsRsa4VWrlvhxYx;VUjymGyUksyaK(qkbZIPtzdi(wPU{xM*KM|}wX-gw>U=U*2{ z92W4qpcNs4A7=+{UqBr6SU_ABI(Bfi6+OFDt_Sb6ofZa1k$Xh_ujD!#z-Xk-R%&?H`2VH`39TuzORP3VL5inyz@LZeiFF?{Q@Ekg@9porJ>K{_;f4Kfluln@9FOv0fV`D5KxYS29ic#OhI76Wnu+g3n*Ne$3 zb)Mbt>w%hCaV`uFZQED$+C@#ENleRVt1trQ-g@-_s>z&+4b`2ht|L`{6s&4Ss>3@6 z9!iDsGnfMIB?tt{$pIPGEq&94kyZZj10E<1GT|)9rvJDBBlv-ytb7e*7ATeFG z4StoIr>V}kmjcaOssnRyZ|{jJVP(bk&D4=f*OcfD30k_obCX~rJM*I1$shDaw{vZ~ zAT0V&&jIF8m_VfL684_@&o2~9#@A>SOM>Nqd=|5@3Cit$^QTCLghJ0%Ym9m(i&DJK zA8@@sW3s9@x6zgNY3C6UNTNS%aykM49GjRhYB*mmCK>nzDf$zWQCSLB?XG%GwrUhB z7S_S@>wh&SW!|@y9k20111MHr^o^`~X?nf>Ar#%-IFTiIDw%?B+iBBTPred?VmapD zV-pQ{(7$jkA!KnE8WgBoSZKxYesio3TiCZMHabXV!s z&HT01IPdKx{`DoigiyLMmvb9V*nnWy1%s5^bmFfZKt_p;mYbQqUaB+jSxu3{6?;3F zm(3qz8FQMi+zkb;nPSGpPI5e{6%vZ1eJiq>S$Kbg3n^zkcywDVi`RBy47>P0+9{AC z90#gdUM-Fi3IU@i6I|@~y|DCBUv7`73;@O%3rOKS21E9dvSC$q^r!!kF)a|Sc&B$P7d9a<^@ZrC8{eND7mpw0g zBS0Y5uQk^bpD&UD_MJsVEs|ll1?5>sip(ifcxjo*%o)b2n=Faym69tcVbSzUj)sR- z#2Qvpc@Sq=7nHL#cO?0OX8L_Dmxk0zZM9Fe0vrCXPs0llcPFm4dHOA+0GIlgYYDS| zKKRsmWK;-+ZdkKQpO1;6H0YpT74T3V{jJdIv3F6j)Nf{>7ixFDEE3nMm8A1>*HrY? zT)8R{&E$1>%NeGyPC;`tQ=B;8`n-d?d%r1`2usGVhm=F9a5fNTzRpf>`lPhhF2RYM zET|EZ!}o3F3}CC^%dxAAmLT0eZ{dEzuS&@mK7U3BfEwUK$n)`%gkYL#v-2ner4nP7 zYPAjZ2)dkeL}kB}92!HGT?#|3Nj&DCx*T$Do4zIR%-95Ki~TwzH9bF5VEY;Zi?DUo z=>PheqvwkGjH&l=FFP*2`P-jnQE7~i$bIfYvVyii@Y7UF=J zE8oZqwBX&`xc7oNu%x+3F8-s&dR*Lt`LQe^!0j=B*xtSfMqc9ChhN zaw{&nqPnW&eT-xKMrG0UB)=br*)loaVO(bxA|Vz2{Zp-WjXtl_%2QanF}aYvVCm)G zgA1qY1zDIi60> z^Euq@kqQ?oDyq_~`dHvKYjw|eAZ9U!%h5g8Jp5Wb5=SCf9#D5CViNFr%ARY&p~m{y zf9KHQ_h8oPiTU_SeKN=e5_xdihVpc)KL>mj!HIxK^)$>ui2ouI~p530fW3ql_5v>NG2G`jBZq zvHCklHL}ulh`PPKocr7ZCO;TuMyx-W6vD1A50PEfWDAY%=J05*z}DdT{=C=w)ST1e zU3L;*26dJ$>0%6M6+4;vP|jld*tiQ+)=gkONDY06ah<$s195a;Y~9!{^=V6)-3ec#mJ_|)V*9-Jr@5tH-sBev85AZ2~@wV72B zdt>CeTVHB2UDBw_qZIvh-~Tm2G7TFA@_n0w*bkBP%<>&q5Ex}g_2oEsPxYc7&Y!&ed_Ul_jKN!)EJa$13vto z2S*C)EL!I_^I$=V$a*x5C8K#RnW*$HOgSf>OqLVr$BSjNe$!_PiZOMDwMm?M#}SlA zPmpKl7#$8Hf56ao8H&3%<44um>)sXzqA2B#@n4_sHuqFA`wck*Bhk#RCS5d?eiZR*C?@SM$P>NnIFhDfOgwwn z@Yd7Df_5iE)m<+XBHp|X=qrlldI~Q*_CGtkyX^FYV0>Pg>|FtwXD_k;#HFo)1Yx0`iJT%bYPo%YHrDdii z7kA|TYz8)6D2;CT#L!5%X=;tqDAhP4@N2v)mrG5(I@kH*(9~^g3XL&D-}{5%_h)jW zbKJ%62L_!#x7ACIBO|M+<-z2GC3(Zi;|5P}pDVSP?nl0Hup4$Ey;!g!1z!inhn?`7LU}Fx9Am%BT|)5e>s#x3ugG$b!=!f2jrhe}5Ll;L zx8cV#N4)5pg*-$O?0-27n($rYOQColRe68CH91Z}49ap~ZO|%a%$pm*md%((ygW2kRHoUox*xIzdAkkOI zqg)*Oo6Ou+JqN74j$4C`W-iiLjYiCek}OOZiEvNVXdm@GB{Jm~ziBavc}$h(oRIah zTM*PRxtO~9N|ITA=1eKJvzXt4AD0`}Z#~LLKAoOq16+oZU+xdB-ga568Hb$(XIq1? z%)_Q*!ALdBZIDRoJhoK4a}}jn*U>a)qr;O&9+@Zx20A*`32_5PxTBY->OOVmEFJ&{ zgv+2pApes+2QPgellbR&K^=FrBIx`+U(Ac*nI%?ggBJoU>4&IpG;}EhoojrWiG8WjxyG28u*#S<=}_3dQ9c)O!+;DJkZp zeh95V=Q}+%YRO_yR%x~?DjSDO*kf^}cj@Y_I0?+s_~$(M6^5!o0!y z+}Z1Pp6!%G4^O70DqcUly^;zz8Mj(~wer-KmyZI!>jV!WwWD6RWP=Iz3lrwc)dmGN ze2eWXxbOMwUhdYM=;?>MU;hc8cP}~g6-dm_&yxz+-$=`FAxB9#-M{R+#sq0fX{S7A z3k006*AkVe# z%%MZprhj3AB$D8fk&izZXo%do{AyU)>@s+lZtVZMIFoDQd%5CqtRv6NqTf|56|F7E zgh!a0n$}^r63@}QTCx_g4)(cj0snTurXJkAYWqY1qH6;w*Kzc^uUr{{kF{$J+n-7J z4xVPR)wuH3iZ>=-3Ecv>>}3T2gXGhqj>%%R8g4DoS)9b>z_#mvyA-eEpI<j(w8hrlb zd4IMpmd8218>83j=%%UJJd7^cj?UlF>wB)g`Gw^o4C!vVdgU8`4dxNGmYP%$73Se# zdY%8{AG!o>C-0X{+R3y^qf z!v|hhi?hO>Ozd99#<I{Pr)lXI(3zCU-gQJkBsCs#rO9D_&)@hU+c&n;96FE zt|QM3TCPS*s&t;&vb!$yU5BI#Rr^j|$i;rx1OEs6aJ%%W12KiQo0@ zsuJlQn=Yr@-PAYR3WapmY#z6>d$;{v3#%Zda9gO*`qUkcxeX&UDI9jJffRf}NZ;>M z1E4y-+j$s6Zl@1RmFSPp^@%i*T4wHZD|xSBm+xZIqBvt8 zQL*4F_8na%bM&`EJ;1nfy*{N^VQUMZ(lH{w9^d8n0)T(~$#lpvA2k;{-|cGAFlri` zp6}ZUUA*u=is#a)$*i2@^!w?UOkhApVge|23d~8(KIa=id<*zGEFCX7_9dz^;^{V8 zT!L2Idfv9O|5hDhOb@c1Id3I|MQ9OL#9pbG5d6ly3r)mM3&YEPYikQ_3muY_K_O&H z8?ZozmbLeVL8Fl2qc+8*hG=qLm5Dow38E3q(PF{G5)w%uS{JSBODftMDw-R*Qd9Fp z!tq&+eE$^b5~-$~J_>PX(GMO?P61jHb=1|Vjeon2AJ%u%Iz5RzD~$Qmi0*T(8n&}PKrx8|P)(}kOcJmRI2g&ucEg8} zi{-{$%!DF6+KR9iy^DBN6R^lp)dO>Ia0u~pv7-4evx3*yv-!x#PfZ4x&NK#u2FAfq z(SJd?MG2YVwkR`9L5c$oFtmE5cwZCWTSw`GKg?kBlVJ0cqlpduf-7E$h~VDmZe>A& z1mi$u*<~ej4L2+PngdW|v?CUFDkkPQblk3?oD-HGOj9}GKZMo`%923KSFkFGdyo$3 zD<_!$BJJbkj^AM_jXycv@Ib0QZ>EA9xvrK)04t4+|Naj+<+R)qHOzF>WJpfW@A zM9Gq%=!}egftUq6^xP7ogek%jW~X5h_~JZmYb@0mpud^$+}&_WeGZL@4BMX?6h`z% z+(Y{DTRqczE_9fV)j~gw32IKc-y<2(fr@&vag!E0MZ>0gSSgN@9hse2dO)7jvEKQo z3*wv4N`L{zobc|>jGnWjf$`c|v5YPawM>l0FXu@^NGXOMw+BXm67qyYvJx^aC=EY| ztvPqJtUgsYY+|JsZ?}|nlaiHvE)x-Lty8~rTxq@0-ADi(gQ;x`HYG$`=XNLWwCfeaObI7_VW9gU35D3p$>%czH?)RD9EdxD9F;K}-*m4^wIgs- zfZr$~fF1~y3#9(|0TLm(X)tQepcgEhSulv1HP=HR#4^PVW~M4XKstq5{(iDlI`-Cm9QFo6z;Yn^grpAB^Mw8_ zl~s@EuX<&8Fs-QQV?PEP<;jJ(ygWCSb2QkTQuLi7Fqo6`1GPPsA=D<@JUq(or8JOA zwO@ZqMMjtOId}SFzVH;g$efD#@Dii0idH`$Azf?*oWoa2jbERpNtXP|hy6;TX;l|9 z)f;^WpFH@6xRQk1RWGkBqj3{wbAFxq#ctuE4qnoi;MHoBX~!%;@QCtMkq0+I-qFc^ z{-mU#-!axAPpN>zp}|Ita)yPI$0~%b)TuK5ASB0MlaN5(aLIPb>!dEoG=cWSDxp+_ zl)31nT4&>$#3>cyyukT0!4LWYK3aiQKtPqXL@^bmq#a+p*`UcYm)~L4{b;U7{cuYf z^YieCfX$0|_8q2x!<#rSyC5A38{M4mgm_?4Wq*PMc^pD43BS{7y=G)e!LT27lXN>b z(DL`~Ut1xq9KBnnVrQ>j6M+)RVy(W!2YNoC<`DHr1srRf^m1f-n98Tomd>g#T3R;> zii#(IrxqI4`?vi%h*yDWo-YCMyW)lK{$R1VuqwU7vc11~RwUuXL>W)Dbd~(fnjHo$Y=Y0OsXvuvfkX3AZK2q8zbDJ1E%f zT_(?WZv~r1*7L`$r8z=meG*PG00Gc#cijc3n;M;;`63&D3a<1zRd|%gy<;QC9EmVJ zz}L5+q@V!={3Zb>tagp@c8I9omO4sF3M-%po~sW>i`@O?;po02(bxrs7KiITSWAVJ zht2L*gBF|8Rc28jEVRJg}Q;mDSiUqX37>yON>ODymuSTD3wIK@AMCo zhRp&6PM=!ribtYOkiLiLwP#Le@j2=@$-iT6i1nmL&eTK(X6_dABc60t3 z#l}bIQ{*ZQdJh4l#Qj$6&s6zzaoS*W?#X7f=JuYoz_P8dudx?(p@>i_7GZK#Ge;Ae zXWftc@*68PnH;ZOIlydlWNmiqo}R8b6&H548}plKN5m zaA-*pb#CJ=5D*@lRx)n0mCr;>b>U}X#3V#tFB`63GEt(uvn&ZZXgUu zB}6y#ABrOg7&zYY!WtsKJ4PwT)U|3G1s?zz?leX%&ZX9EE81Na zp66GgG1HW<(XNiC1H+-Gz_P2|L+1l{J8<+M=nY;>R92N1Cj}vX(#_=aLpHhm1sW2T zp9^{Xr-Oq=E}sWUz`o0LY3)|S_NA+Ktwx9Cq}Js|E5FzCT&Da9&u{84%>z@|8Cs1^ zmXE}n(jCtY`Yh!PGg$eDQ88;B-|Z)96iL1Rsg55-N4pve1T;;Dd^hrbC~a?lChog{ z!5`e8({ae4gm4Hz{6RV&g*smkW;c^mfmEh+CmpW&Eec!0TJ+U4U3SAV?TR1NLFdl{XR%nWJs@j{Q0xz zrKM*(2k04e<){KY3+K*aF{=utExibT;U@2;GkNX$MJE+y8csQnKmw8|?kgp>x%?1N z1Y1D%Ht&cJ_|pm%6z+ux$&o6iU6E2Oj=8yz~L56R?qgTbn7%WZ#q~zFqR)KQ>yc# zH%(~N%wG%N1ql#Nq#kHQ=JXBMBv~xd6fc-PX5yx9AVFJQm+Z70v!w>zyxmltx-1kU zkUkT=WRGQn?&XZHv0b8qaWZ@)CY4sV$f9wXN&nxaFm0*KyxP$umL#9+VFL-Wz~>!< zt!}1dG*v2-W{v95i@EeK7QIffkt(hRlBCLrrEjr79qxJxa)LHw4t?L9$JdCotf+z~ z#Z+Pwn@|i2Qn-+HC3O96lv*-KyZ=W#iD67BRU9#Qhs5}uvf!;(<9^tV_frp|W)){w z-^f9{pe@E8+FzbZjLldVUb9W5h@vdGa`sOBrmEwU*FW*#iqVLzSwo)Jsr%V>!7D+Z z$A{;eAq>iJ?(TY*11m+x`Fpe6qs6nG z2+bG#(PS}AA7>WDw9&$-$GEniRwNTGZWfK60>J|+-JoSuUIiDEXJ)R z4c#{<7~KJBW~O zH}_^Ou_d4ans(!{($YTdR1xhe*lS0grpB2mI<(Bpd){Xcfx^4DUeRBe^qMRX$i1ZW z_{d`sArd?2B7!Tw&YG|g5Rw`Cx{R)Fv<`fDPhU(znYvc<&OCG^?95x0}J1p)Gb=Svao34k~!Jm&zQ@&o>C)`_6sBd!tCS%-=izcLI>TWI zXm`I90~CHE(T|bI73&$@)!V&MJx<#urxho{HV2*GE(c9G_U!+;RcTi5F^zS}PWJ2s zIH9V%nl?P4MlkU5>S}5Zgq4Y&I*lXW;ywe=UB~_QTSWDkG)6&_=NpQ!7!79ayjSsD z%kHi{pjZfi-qE^FOrFk0U3>z}d9U_!BrPpk2HiZ%n4wY<8WT?fymiKP{kN zaYl?wrfA5+_w&Ox-~VwHOF52!WB(KY863~Pnm*ET)k{WY9#K{i^3q&HuGCvLuD|@8d%sTvz8T`-V3N}uXO$*ghR$-E%^-W^?N}k z=Avil+dZ8xrp4!TpF6Bncb8*=!J=pOcCZp%afn2|w}vj5TK+x|Y0_CZDPeQ7;_W=~ z&#CKyK)~Za>wKk;v$h@7voru~#5L5A+IppggA{OJ=rx`Qh@%wMsox2x7of@{ELGN4M?$`VU zpRt+7(p@=-)IcWXY^mO9wijACPhf9;c%t+k{*e^$4;$h~74N`MvEz?K6n2t@<8$!- z=4PHFmrtaK^xlv!g;J)JljeGs8cw1cc6mJF`-*ANAI0y+9n zHsT6((9elro=6os>jq3RMHQ&Q-F`^2jiTL2Qd&eb%smaBn8R7Uf@hL9dlxcB^361q zU>xX8Ns?Z2h7|ND=!BN|GBQ+jDy6+Pi#SmF`XJ++lyj6@%vydw)VOI5+dzUE)Wsuh z&Mqyoj%olB#s2U(3K&p|#0$|;yxQs1h~XfcqOaz#o12B{xNk#D2d`j?7!VwA@CSb4 zNd1Py8-$p`00q2%$0Rv&iYEVuhc*%$2vtCXfd~@~;*4e!g=lpv*-UV-yU6M?=7c~W zgap(j_CVH-GIiEp5Io=TI&t`1-^M<6ez0T+zjj^s4q-sCy2O~MSU3j%iojIbOT85r z;VsUQ&7pf#b6#s&LC7z_ci3NaWN|6dDM&+@Xh(r5<;K{4eSbQH(E4(7(!8T%WGWxI zC59*u(ntj9n~*i4BP-#Fh=dM?dGeFNtnzaH4!H8-rKSm`55~eHGsJNC(b|!DvWJ`i z!4n%sm-!{cHtqKU9cVf1KPPX+iHvEkMuxr$)DZwB-2cPUM}!+#zS+0V zTvys|ZQ6Cf!wbr!O6m{&PBy%(5GFHKQUSGEal2kEHu&%0!0J!$7CaV0ArX36)TVa^ z#QH{AG=w;eV@rEF7`PU-S)#>wBn!|x9+LG0j%l|iki(k%y<`quO+x+~+1$X<>Q1gE zUR!%u0mtfS&ln|eIzgtL7%xKrwiuLh)W$;nE0)?$cP6Ie8D)~gS|BM@GrL(73bOif z2&Jt!w%W66KF0`U1K|)VEhBcB4+Ym_=&1We$XPiAIk`|2F_|c>|F-LJj%pP_(~LmU z*$$JrK|JsrT4u8hnh!$cNk6b-O=4rQAk_*1HbS%0(Shqp-6+8` z8)Z!JP!T3Y_pmT?1||cVCv+ik>b&s8Q7m~VTe!Z0d{SnO9GTc?)q%nen2;2=q&k{K0sAN?$4#_|ad-h}> zDOhHseH!R8bSe29sDWJVu(6xBDsq&@NmM`Y-8xFo%Wy#WD+>#*uC8xEDx!7V-2D1w zD(rSyG&gc{swTLJ{sGBqsE8D$Df<*@v|0Sv*sO>~POW6*%=1$h29y1D885*fId4!4 z&2vI4gkzIW6H}hCJY{GEW$1W`Cr6flr69_v#JFcVk%v;ar0cj-aBrt>DgaBgQ?lk-XFmcanu}j2X-=ChCNUk20-B}6Wh>gdlvfC2OcM)B*8;%SM zaIJEn(Sty%?(~QjT7Sr+(C183SV6XPb4-84$};nlt6%Rm^}8+WXJux`A6}4RMS8`* zpr(SmdxHg>`U$b6K%OLgR{cW|@Z`a)O3v7lu0U48?YD2j>`neDrIXkgS(Z@#@r}ts z1e|ug@jdvi(8}3yZ`;6(EUGdIi{SF!3Y#U*}jI07ZEv<}F5m$C%Y~ttP z?TPUFMORdEnc(Z&q+^@;)EqgBz`KUGr_wz8k@v&j1Lr}7$!~W)*L_&QsGlq(8V+vSp6d`{sR7f-oxpP5@b*Sd|Muy}1=j z$K~^w+U0g~xerxWRjDIQwk9C_7_cS`?!F(`$X6iYc2L<7lMOSBt7s(sMYLFd@(+P@ zsmg#_kiTt7JU)(4_!b~(`2kamu!E}&JNvD^>@>W;UGD%q7(k~#DEH<2JO7o0BRIS; zIrRAuaOOQ77J|^+kkaDYWlf-GwZt3mv->Uo^r|#Lx#S1&jOquC+`g z*%XQaUZvrVH$ORZnTjg~#&IdqNtyrMI51O>idk9GzLmGxZO~3PFr@IJpAx{h*B~2; z7fO(3YnR1=O%*H;2ymuJr!SuA&F9(y;0JE8C14F3h^uqetdLDys%lCv(Jv7$S1U7e z@bY%pG-ASnd-+<GkQ!h4g}5uytsp@FB~C!}XfIekximl*j4+-XBdj^6FJP zLIh?__<(V!26FL%;Zc%+R>f?s>FjSW?q^?rAN%f*FwMl!y+!u*o8T949ns z>um|juANP8`_n*gF6>XepO!rR-{lI-Lvdv3E}YlX(i=DCu?{d#4ug)L`W}w;=f=$> zlPWFgQLS^mQTkpyXa2*f2J%scjb>}D-}L~-)7?D_AlrJr^E>sZ_PE0Gu;#OX4(ITd zG(_@^1be`1fZUm$^tJs|AP*+*N->P3T1QJssS2I z*0=BBy%@WpU`5qh?`dvhAJf}lUGuLBHuFt}3xA%LYE|!Z>#ik#3Q(&h;c-KSgVj#j z2)OJxy;tYW-DOf!8;B-g;-VXFG$?65GsF~}aKV25I*gjCea|nGF)IrSVp~;a z&xqZ;Yql%((qF0i=^1rkcC%@Z5o$$*u79F*`nL3bJ(KSul zxgN5uu02e_W>IIahv094`h$*|0W+wKhXtdd)3ko`VRfQRyx#HMT*?1tMKEF_m67;h z5tu*OX#VFuIfp`tM@*<)<^TqMyA~UlfP46>*|C|ypKJ$j?n=mQ|B5bnd+H7=U1fIPS9=D^N@!DY`DCNt3qi49dsvqRLoOhh4=44ar_cg>F{Sq6*(@ywLBO-JIGE4<|MM56uIlvV+ zJ1}E%+{%K&fwAuao=!kIhYodm*o=^`IDC>$w`{va*G<`df7@>qdnCwje{Mirui4?} z#d9OOnuSPYq7aOH`A!uUrt7=K;^ItMW7^0uhrJF?feLAy{ z=iMpLq4$2cVslt+0DuHn+dW^!pf%!D9G%~%){>ni!;+8)!$lZ%n`IJz*{^_mgj7P) z!cB`>eZ%f7Cx9~wIREG0C2J!uRkUzUIXt!~6r$F^w-GF@+H4Pu*jt3#-IxL@(0ze^ z3eSRTtX&J?VzsL2(=t~yBcmDgX-xn0cEF?kd6mKi4}41wN1QmAHQ_Bd&^D<`v+B7A zte^!ToH0O_cBqND>4v~CSr~z1deiw+Na>_@Sqj{HZxS^kY%nZ&u0datdZjN;{E%*& z(e&+sR6GFXuzq?%{OX0xusb_p&~jFe(sxn2(iuWYGef!B)GnUF2X)OcaKtd<4BgQlO8ZFy?j+*K&!AuILtdyH@kTn5NKV)mEWNnhX1-Ur* z87v5TO~_84&UvC~n*TySQycduo&X<1u_$}^*dZG#k`_0NA~y4!jbX+`}YB# z6obv8);+v!*fsi#SkQ7}QJ154a-!SrY+F9P-eIfN92~9L$ab5#wp}tzK}Q!>XCSEE zqK07X{}SewZm;E(k)B>(;Tm>FU4c_HH6f?W|NJ^|cSL_62SJ86qVq$<3lYEt%c738 z{!zPdI$x^BCB#J$?Fmt^iG!t{nx2`NoM0TAMmR03{);b~o6e$rn~IzF?!P@%Dz9Bq zdh*391jvSgUnW@)?_8tPYn|!1h7O7Hkds6zS)suAD=c5Xe&wiARkGv>qW#eou}&)B zelzJ*?zG+ByXL1z>ag&Qw{Q+E23I+UM^&?Vxpo~(e;ol${lLW*v*iUD@9lWwn)$^) zkG@78xBl?>#89~>Ejc;$=)wB%m{`!YAB00i^);*=A>S#?M=lnFU?%MLO>^+7#w10| zdP8uv4j_jB3*PqsRg4n?Zq8-WMvK#Ok;g)6^|y?0V5WSafQ?2Tv-lf2JtWV77Jp4O zRN3S=;RX@Y{;ycWaB>zCj5M!YiY$pq|2CX_0-kN9;|C7%y!UT)6!E#u#QKbeydN$| z5yK3WnAq6n_go!Un=8e_qEXJcXtnG1zp9s`5dO~r%zKT?^|}LVyD!j=O#+K$Ox!HW zR%QHu)+#h#9eW~>NqOe-6Tu7rwP@E{AQSWNx3uL29EEviuP}j4_a-`9vVV~Xxy$4~ zZK^qcZeL2ue;GiR_9Qidqf>1q`eCDCg~@yuIszL^8}w^A_pKxS6L%j1x6D+O9MHe- zhl;?z2$z{|j>p*tdp0OgKJNi;kI=<>i`)@nOE%Zlo#<1>s+xJYGF_rhg|mW28(LRu zK>L<*wYC<$vCClw1_1Zy@@2XlYgErW^^#RpWVVnp!*0AkQMB`&@Oh6wy;$NWpJ=>I zH^goFP3nJ9_(9tHbcTgS3Vv8YvSxNGbibaj{!!nH;3E0stuq}Fjsj0j6ghy5nWk#; zJlEK3ufuU`TiDCyv#eHs-Q#rbp_bcjrGBef@%-uaAB~2v%iGhFu-A1@-L=4a@1=5e zn$NFS-kc~6RANEN@M?;7h@L6 z6+7JjHr4RJwrr>qd^G<4Jd6p-u+3DU&|r@v7XCMaYmA`84dAIa*4&s41vu`rS*FqB zqnW9AvN-~_S%6^Mr$2KugP`E|-Cgqgi<4LTm3rIg3s3&EdV?0#L`uQF59o)oe_I#zJm!>B8xe~IZJ9z}YMD&_d@>76Z2;`Zh6J?thzbDT^W zb$H^KJAnVQytkTuyF4-OeSgWWPOmrUbVcFj>bu;uf1>_|UogD4NOlJc2CI|;!M5o< z!E9DKeumNOCyLLloDN_=X(Yt$#JA014eiSbfD$>1%WoUcBHGVMZjh!5xDGPfs`KO_ z&MG4o@CCgzU6r>~`x~%bM@T}73wz$&#MN#9gBPYPII&WmeF8-G+gG3QZn63>;s!l= zoi3B8x#|NCDE8^^O_uKfSzc__aWd=Jope257a&4N#}Uno2L(f2KVEJCi9)yQ-X6#R zh-^3J;XUz)$LpPX3OF*;V2}&XQgV4*y-|zR#~bWq8guDp^j(Exd6UcKu_TiA#j_JBZtU;g50CZ}jE0h+OPKh9feh`h`joAz$b1H(nrMt<&QAK7k{AbZE5E z^!))4*3*~`8*S!`n6kOQ(op3Ky7_Ov{RAZLMUSmZcYHWBSd=Kb6d6`5yhCrhvtU>x z+>ZtxN)D#^TEjkH)617>w=c}bU4L=cAnDA@(XNe~y!MhxW8z7L;}Y`F^?k;tPwtK; zh3jln7j~~Z8sz!1xF(78rN;30S$Y04qd_~FurMh!&~+jK0|b}#Pd{2wwkt)L zfa@n_SSj%ecv@PcW*uJ##^BYG!LW*{|Iy;+8NK*W$9oGoY~DzrUF+X++%izzi!X8A&~wb;-4}IrRDYFjOK+?UXedebbZ>nRt-4ADU_vuB#9R zGsd-wS<|J%d>;|VZG;A+sv@>ildja6Jbv`RwQCN~aBNySjXGlJF{VFIZ#N<^XeJ{g zV|A5BM9de8K;%Yc-^B-8GOoEJYM1nlJ;4Xbf$nQ8B9tIT8LWh;;IIY$0)%c8BLnK? zm)>lRk9n9)yPJqu^oA${GZ-6>E$q#2FyZ*1ze3Pm_>=64Gfd<#88)2-+kB&A;TX*~ zCUlGo&5Q$KLB$64k&0AhwtAhzk;f{# zFNR8JrddP8LwL!ie6-dIVuXrNXx~+EG?NZl;by21Y#^V9yZg~~TdQxP6iNh=_OX7= zLrkj#Bg_ogO(5f6T6D2NJqVAbczSL ziv|~hyex)BPzV7~HsN=v-Jz{}D!6_ntfZrHLkO0{V!DLD{i!g;Q!qoPcg(5?dn!ty zNX?*vf!E0)4382c4;}iuy9raEZE+fq(bQ)LnHX#uSbYEbp0YNbK;J}U8$aMcA7w~F z2ewwDttzU@DszdkPohzk16d;`<49_9!k!H&R&Xas)9gC)C@vsAzguM#rl{#Aa-C}G z{A9#B7D>aqiekiik1a3_l&%`uQ{nRY>6m0e7$-yWVw=II1tmmS3}VIyEVxqJR;N++ zkm3|mBD;)MUNkspJiXrtt$~m@4J^PWy%o0@!Z2LPgo=u!C=&!9f#9&2F!B(QrkMsZ%<{8AkhxST_E}J<<{0xN;t(+sWNBlV1K$rZOVca|6X~0z_687& zV=JqwY@=&rFq7vnGy_%Ufb02l3ROWPn=|vxPzKgx~qsd85pJ)4jC0;qu5B@8+Dxu`$7VDg%s^3Y^1>iWDnYo!^X`cd~oV{2XjA6)I zgg5Z-K?yqyF2Rl6117yYQ!@{Pkpt7R8i$8Rg}QoHe*izP`zM%cDolkoH1oCLKz4R) zc09<)W#Zm%yL(drnOv3=8}abOhl9NdsJ)Ajn>TR9Vk*%h*Q11*Gy%&cqZo!#j#^~c zX2D^I!I_zVwbkmOpjV^mtV^veEUo``#;L%+7q@?^R ztjvl`FqmoVsHCLiSl7ST)nt*uO$j%TG&wt;cX=|UuAP1P69j|)CuB#3EF(KPhC^xVP(jOM zVQg|-smq^2NM5Z{tc#YV5Uf6eC*lR>gBG zV$w^EYDZ!#go?H4%I&jPWlIfw?aM`cQte*7BX-Fc*9^Y5&JBIPcJd@m*6CeQuGnm{ zWH5M7uh$tkf5K%jdJg(Bz0q>%74Ul*Rq|+am>`|j@GR&UMNo-;yjgSz4$b4jeFx}H zIxYWeR3cVaL*#bcY&YC^1ojc^pG>m7AI>d~4u`3!S^_E##N*xRbJUQ#s=ZOp(&+Uk zoH813qde@F7Bv`0fBoEi?MQ}Bk;!3~2v%@5V<7yhViP^QY$S%KZYZ&gZoX8n&dn=C z;G?}o1!rBm?$J+=EgQ`p4BmbVPNJ4;aa?Kzu$l;5w$Cj2fmk|>uHuFIt&Z=`qj4T* zE9ykiEO`A^Ek?O|@$NQAwuu&qeZfQNO1XT3HzJcMDT7AF{uy{=4Fe}nBg21yZKp2r z*N7~x?<81QqhXQqv3=LQQpBV`8_Y-Jp0-v}#-lCgB7nKzjZVdfvn7Djd+e!ZSKsx% zZu4i@>D2ymg%Q_Sy1& z;a8yNSX(G4WI+xzy3Bwrmit|E<-VM8}?IH1lqxqWdb2ZKk#8b^Olg4wqx}S#^l>5DU!A2_)Bv(2`5|uzTS*t>&)x7+h zQ_p;gt!H`EnHtOtBkf(eiBz*SeH9QBAJ32OYZz^zPAmy=2ev1M;K4h_Xn)#xAW3S5l z3Jl6T-&2eLPbCFkgM3r*>gCFXk3v+zoq#SGUybp7N#WDw9=#RIj!KF}q zw0}C1&|P{&qeiVm;_tq);5!~fq3*$-UpqfvFaM*K@BSRv0A99*!q4j-N1!m=S?@9g z3H?fi8-+Uv#RehDn0`$2rB=7rYQz;M`lN6OSIB9I)cPo zLNf&#J^)R(Fabk>F-HfmlmK{!!_6)v&}OR8{oOgjn~FEb<^nxyNb8icCahxqdU71Y z21DKYwS@8T2{V+YGm~@?$@imq(cOVoPjGI~DU=<_wL;aZ9@Ok`~GJa+AM48Ly3kF*sj4Ee*thGIyaceJD zOlr?4zdGEl&Wp>X(i%0owru)-0@L*DcEbrkX&=af_s6jG>a?ru`9s4iJ$p^G*7EDO z`JcX|p8Gsq5pcMUHQ`KVaoJx)d48eKLB}Ed{ZjsbLa=3hR!I7V8ISAu;2yUg;D6p1 z&kxlb_XKbB!N&NHO^@e4{w){&Xs>ZQNoO_`;%fDDl?!40)rbo9D?gKayu`LEly zcb4#<4>T;8du=STCyl!UeEsyAFWXpE6)MvkXjCH8Seg74;E)cTKSU8WGQdoe#2}p) zO7jtjU91JjND07feS0XKOpgWpiPclKc8f~&>c<6T;d7Q7w9^fzm-2-xdyRTAFngLM zn_L+B9Fe?9OVe1qNN#%Aw*xyuGn5rH#<<57ShBo6WUnzsdT*6_K^R)J{{2F*JE zPw3imrFZw$28{GT6{U&9>f6w0_C7-ElSlL^&(H2=EtYS$S(EVb>xBHZFbj#!pj z845d}$;F^5_dXADusQxb8R#jaiD<|98_ecK_4Gr1>g#`)l?t>oD4|#4?Sr6;+^YoJ zAnt&rKbMx(ORBW#KSd&;%41R(w4>QPR^ljKROzDF*ifUkcbX(8TWjS~l;;hawOSBY zqa8Q=${a>s)%KBiQ7EO+-ZNpHY|sEFA|v5Twz?TlxhAIRc5h5yWGsv>SdYOIy%Khg|pCE z&dgv>EDSqc-9=_ZzQoy)ii&1M z^Hvy*OZ6tdF|7-GeL8jdD*<}u@fXs!`KjHl z>pP_@(1}8MCoP0vB~j=3?}bfP zt|$=+TAlH%sawjv@Oxd?bh6=(krmUX^Cm*1*hU{}SVZZykIZv|2ah--ILeG_*L!n_ zHjE~+V2zy;H!loQ>9VNO=`@Sf%SZEk_EO>Xn%z183`tct5F{i`tDiyBdpKXV+(h>t z1BG?NeyD(g5)dve3ldcY$OU&zf(ZbZMR6fTgSSJ4Vi941wSkRdijygaL{hSg)VG0Y z|Clt58Q_wKPX1Mplkfz_OaYCBYH}e zM&0~p2=lo%vsbxv{izuB&gGj`O@gKJqDKcQhfjkL6cn}K*t?Wy5j)(ufFio;| zSmF;9uqboCDaG?MF}hbkW=_eG-Wj zN^8Beqaz!cZs|a7xe`8;(N@XYp?Q)#+u!)OL3QW{37=7)E@9h#n%LmwZNEq!pZmYx zmHA~y7Stu!MX>~s0f~c+2nbbW;egya*SBLL8w~(^T;|P=V#=@s8vL?*p?$tEC#p26 zjVBnP_rrJ$AqtCuWYa{F80E)+ja*01xxx|Gp<`1yHGyCZyTACAw$jQ5b$TuSDK%rA z`4|gA(k3(=KTR<94tubP0xd$4X-FoKH|(OnCe06~b7RDeXHY~ss2-z%Umv}GtK=M< zJ6XL1OR#eB^8S2|ER;|GQ0ev>zqg(_IXUUvREm2jgj=q14z@lxI|4W|PIo0v`psVL zMlE)~`@nCjQ3oS2r3SnnWBK0OH%HXNBg`3G_L~)KvUFjyMjaNc!SB@+wEnyYjclqX zN_lvzKK*kTSkb9f&#MQy{ySag#f`~3=gZcEU-Mheo*Rx`{`~2PyV%}7=;5wNhQ)S0 zKBF!S)*GZNld1R~e}Nojqsv1m>#!7as8T+bRhNyaej%NdDQlQT$;&*Do?Q>`{Ot=c zAEJ_h_yn3Y$NNHlIx}|*7vA?=$la2TCDx(B!|QUPaf^s!=;9KFX-1$?e>^$qQI)l@ z_wxP(Jbk~$#A4jhYPtaY zzo1>N_fUSLU*B_<$)l~CQ1Vh0eJ9MOKNq+h*WyLeqY^&TwJ>Pv(L(4G`e;nQ>V7@5j}q zW|!8M-jcmkM+@p@mLX4of*UQctmtoS^ZJ;3$uFQ)?kMiys9mS`^K3B+@b5Khv`QVo zu4$(2ToF`MQ;}{^wlPsrjqO0jYnSbjl;?3uo#hLIUWpu-{b{M*ahXQ!|R}`DxHCX9pe(2iBZz{dVnh>8ieZ*Bn=sQl;={$PTxUP zH5Ga6Y|D&RdKPj0qh77@4R@g|6v}^rJ)W2!?lv+i%5JW~zi?RWuWjbwzJET8>x6ha zwK^stRx&yv5D<3}(@~OIZi&I|`?#yl_kXGM1|#x+a{?4$VZg)ItJazZB1ndS^bQk< z34tXNm|T)T&%lZ`9+pIxs8( z)swFJ&BerQ*C?z~<@^==Hy85TdU~tfMZcdFp*RHo0ethWZR~ecIH8I7ed~5|{g-|# z@VBx$s#=^}VKM48D%OmFB#md%X0-el2%OT5kCf2T&?Q8}7)62O9NWQb>34p?yZQFU zU*{S8Th(+jQK}$ULfrR;$@$NY%kKT|+=<`+P!%)EQt$#cBgq{7pDg=w>04Fvoz=3)EGeEiU&_cH9Geu1cn_r{Q z1X7{&5GhLQk`MK4ZGq|cAhnt|DqccPidvyV>6-vCdehHs9f9C>JptC{nz2T1kC%{I8em}f^>n&b{}kvi*y^O) zW_jQ0iRO91Ul5S*-xEVk$pHw`NH~8)dc<0>Dx2;$EMT;X) zrk~)&Li>d}wq~3qMhDpcQGebP8i0_xQzLZ~@?Y25I65D$_zRq_Nsp&bg8IKE)8ut| zeWMq0oG-fW`tiCOK^^1mdHu~qqz}#K5#W;OyDLEb=eX5{M$B&U-|+2@ui*QFayc__ zzc1CHiyuwS&IC_e=g&Mp+LK)fTHK5!4ncDE4E~=MpvGdTn#){O5uBhxTf&MEG9+0K z_%i*wV#Qd%mJJ~u#Xw+*Mhhjzi=C%(cy%f2*GQ#FeKR}dMW-C?P! zCF)idq#rrr^GML};~G*iQTXMwm^8iK)5ol*x4+qT0WkaEsDL+9?`{ZfUbPYUjGb+j zTkqtN))_VqXJ>QW6|;@b=E%lAFlO*qTlWQlMGXV(xmWG$SAJc5?g)3*x!Lh<#+|R! z3qD-9^^x+R=L0z7oka7|GQ+<0%O1dZy|}*}#S(tI zc?Y{$i|<;`JhwX4_lm=zZS*|-DB6vb5NUvIgc9o8z-a;C6or)GXuuBf@SJHE@M4eG zIIL0eSsO+p1bCGkt~lWDpNaNMQ>lFuUf27h;U36>@svX1t&J-!|`%r zu7W|rW+0C-w<{wB!zJ6UnJzvwUrmEeA#Y%n!$2h=9`3+rhTXQYH+hw$fX{l!t4a+)YwNH!7_Jk3pi+WUz@-(XC4q?!Fxp z&qFqv-hQzVAu0_04?nSEluVjqhE+eOn9_7H9di`E2D?SMI$5NaCdw<8tSf&m>PXnk zCa9gbNg;FLay|!D)^e&;rQ89ZJd;iLKZTqLEI8Z1LKqWfi3VZFuKmyA^ob0{Hm^t- zs&7J~YDAy{+9Ffzh#-u~QdP|+vMJOEaTlp-pgOsAP?A+P#zU;?GPtX%IZ|m`bp`<^ zUYJIMkg4nJ2QvnPTQ*6KBp)C3C~_F7k|}}Lf|qV+*L>ler2)|=UrLfb^w)hdt|DOs zrUz1jRSr0s)1s$jhpK6sVh)|zixfz)E!nb4S;{b!NV?LZ%J|5r49}h-zQa48;&Nq@ zDUiX4%U$`d8j=Qc416#BDx*4d18p}*{Y;h91X?BKHsXxx|8?DW51rPZ6B@yaFGNeN z(FEy7dyGU_EYDR z;x}bZ!7`kbf^30y36pgNMiUtxRIUh;v@}J(VJzM;F+v;pm#QF%1j1jHp!5Z2pGAy8 z6)2HLMb@vw!!gViqJHgZ=o$zGJ)$@hKtUoV2?U=(miR5v2t>R51rhorrm$AobfO%*|yu`zm$8-pti=v;6$))we`3sH4M_HPApGC}GU4nlft@ z#lgt@9m0fVPepqd=8g1m8)~k~?3FY>llZICQ)w4ri6{X!I<^FMmx@TIey8{V1iwlG zoT`Qf3{`2@t80g!_vqB;@7cnCf7N%mKd$`(9F{YIvf~sWRB27GuRQUzP(jPg1tE%s zDY;0AFa;k!$*X{#-+u&bMw15$`+t7!658`OI5fas#Uv8O+mKg8lyVyMX^LRcmIsR- zR{W;`cb&9DEk)Ab8sA1=WRAufmULobEw7>^upABIE+4Mr{HqeD$4 zwHIb>ij5%{VT!RPQlBC7fR0$_pp4R7$1oGdh&&C#X$fNWDdNeoq1lj4FhVv+A&ovi z7~mK~A?RRIuB@EpAqEp-FZ{M={{+{hj*3FeT-9$zHCbO3ytAjTf?lQaNnROcW8rbAry2mj}^snH&m8U z$l-PS-$aankg!aZPVZ*$&)-&4Sr3N`vu9aSnR6{fO^(v&!^Ld4-EH9SV5zVXO?g7LT@ur? zzrw&P&Bg8=O{C?r-U4IA<;od6rl)g-01Z%Y3?x#BG&kMQDcdy8`wt)`o*W$!l$9p5 z(LTY5qy4yk9HvB*9R?vhI>(oj1{@}u_zOAc_IN);mXDYaaOEfU)Y`FQ9uH8ndwBdg$>1Sg!DWNYW1o){T46v3Dkc{87Z7UW;S2- zT9Cnh3auaJVR5;9v$?{3GTsCsMF{t)+AmX?@9QP9>cE_GYI62pXMUz%R4}BV8Y(8- zc!9Uwi@(VyeUEzSbz2Qjw^8F`4$Ap#-|zm>MH>cToBVgUm{Pf5EpV%YhVdw66Qmtz z%oS$gyodDMCA{o0by|4q;%LYXn`~xQRIZ%cY%*XkXna*md*y0b&6v^WeEiQAXzD5} zC=5Fjdlht6ysJN_Lb=TVwlH9e?71~8rVL6#b8AsICnYJ`WneZglbbZ)_-OxP3IZ2ym@a|+AsecN!hCfl}c+nDT{ zFxj?k+ch=y%eFPywrzatzwzz16IRE&p69-=>pWfYolgE5Cz(`hc3Bh;#{!4A_zJLf zwK}`Yc2{eFje`o8oR+rdvPPFur~aSh@A6F~b>N ze!fttb)DCq;vj$yBH+JVt1b35@AvILhlgq7@dMj#-b~TbrBZbWUr}P27_vXA3LQ|w+I3CacRPh4_>FhabL~GXF zK}bTQ03KOru1h-6L_!sAojjD3D%5DQD99@8)J*~zd!h;EoBTD8|RWcOUV^$Mbbd zFZjQMgNLs!Z-G~jXUbUIR7QPVnJ=n5FJSCSWV6;fR*^^sq&fc;0%GX>Vc@bY2H4U3 zpH|D;W>ILANkzaBH^qmDV0yU>S{<$q#`dx5^umUle|vA!b-i)cEITYz{A)T}P?VO< z;{6TRz1(CqZ?V%G7!mbjKjDS~Ch@X1VHzHepXaqLy;g5}d}3^7X83u-Tes;%$ipbr zT7#9Xwld0h@NeShd*@uUL^W{j++HtI__sF%gjbi!B+f1Kyxti>Cv+w zlJW8aM9(Hb5ac!@j;3f9Ot|LH%_y*$n{)DvsZOUmO>w}TEq5Xsfrq`z0NNw*;XNY? z0{|APDtZ-gM5z^_)qV#itbKJeh9(t_AY2L@E;_53ZU|taVc#Or9c+8V%N2n+P0_d;)1K7=W_d5MLgZs2U z7Bd-qwl{xMtCySYmY0tH4p>}obvaK~{77fgt5Gi`#elHtbr@?znRz~2#N#AjGhb^} z88~0A99MUK@6$&+p5%ABVn><_$&l9!k>Ou%I9AH7e@+iR4UOiq-7o{V0s@9!R%-{5 zkJpv@g)XPMlDp5?4lS2Gk>Ej&(%_;htF2Ct{iDXFaroSUO!X;nvfLQtq)W9G6-0h7 zUpk7K>gp*qnJnsEepho$w_-ICG%%=?Yz!JHZ+fPb3JVe>YYG~<||sy=YV zO3g-coHCliS~g0hMEL&IacwpXvn--3D{GxdIwXflGv!+O>l6+=3=!J(n!)e0`~5nf z^Y>Y0GPFM9cr68vau!$lagX42OLs!iH$8z=Y zL7%_PdydvmPD#@M<|i{r`c=-L+YK=K4WF(Q73mHhZ5*->C(?j5O@$1Qcxr~e%)d< zPfJHPvJb0F3mN1G6Jw%=U&X-0*Yf#Ea1Ym+kXbyUM9s;;$XKgToo1u?N3X++K$VlD zYI$;UT+r*mLsT?qs( zL=yK42HG-1qo$9UjJ)4-*SFi@bt(hYW{o~YnV}0Er!QZ?59`Ewpl6Y z)2P;zlVx0}oFF5W2Ms|55yF9kWYljxp}E1!ImCK#ZeYE4VpUU3&f#37;bZ3HWM~o} zf;04QyXtD$7I3*)0Vg05B`$z@;Sz-;jao;M{HP}7ADY6{&?uyy%4)jUwih0XO2y-- z`o3^hqNE%ax_x0|65Kvd?e?9?;p?&((BT+|m4pQQ%HEGCSi)~1{H{QS3uRXbmT+my z{d{|DhLksOvGIPm{@>f2^WW;^+juU-2;~P*`(q&vC2=)?l~L$ONk`*S!_>rf(0P zIHwQh`Akz|V+=Zt6$87ytcj{n+bpzT@+dOck@YIKx3{Rt6tZfl$w5$7vnN}ipYQ2R z8o)DMs(U!CmPXixRXfc2;J1w-g!^bceSg31s59&lRO0`)Us$_IZDRXImnM0$&G5a> zBTS=#E&-1d3Xk#WGM0q9Xk%t+t|Cbi1wxoN!#*kbi1%>zs+tPOESIZRy?1(FQcBA6 zd_L+K^<}Z>ZZGa+c~O> zOo2{WZUA`hkGbyER>$R9Lqh+vOqG2p!Ml}#ZQtibV5I3Nk9Q;6qtEA-)04wu-Lg8VsIn=zbUh}}A z5$x7VhP3dy7um(4#9MnQ>|S z);PU)*QuB+^E;e2&k;TD?v7_NJ4}}qOHwT4bKTwsVa;HGHIey$6Xi2GKHs0nKmao^ zO0}X;f}`v>f} zxAcekO0~q$?K+d!)oU1te>OBY2^fe;|2(Smh&t}L*`5aN3n>UAxljc3sP~`mh}=#G z;-XGq$v-kh!YTR-CK8Y&d8Veu^*c{CoA9_SUOPqDQVbKkJ-(U#D_0P3x>MH-oWX)I zH@DR9@G{>GTJHbRFtC5iEJ{9Y8&$OuQ{ARDtdQ;c@KEYpuE^-;d-W)nzFecnWApU^ zxEz$yeLjZfW|C1ID5I5>;nwz4}^Q3KK8v^m^^%!YP-Taaecja->bEJXsX?USz?`RNW_yu$$!{L z#OP4aFED^qwzSc)K>0U&-lr)EYB!vATsvgwwfJoU>0Cfr^9dZJzdL{9iK+(wNY-I| ze)`*^S3KDsf}+FRXmXll4+MnH>w2`CU0zq6%hAyGpNV+BUdI;!{xk4NJB5_3vorP% zcJaD*Z#oiRT8bs;c{d3-icv(p`CozJc6elxIRz^lifqFH@|)kQxx1YKqiIqZO3y@eCf}()8(7%IcLrGUlJ}p@A)$OTD=|%sVfCk^^=VQEC40h>~mVhQN2{NzJrV# z@)1?~JKU+)t&6i#qP+*sAj#HR#3>9jn$L)S}@hS%u3j-n*0|hb5{c95o zcwcqfzLqhp3x3(+m^?0&41T^N`FxBeaa3#eYg15)8+JQ5eumWv>b6@S*Mh5DL1;JN zg$3^V!zGT@*d3Xr>!>=@Wk-yA=7HCD!-%P4%a#1&rD+ z{;~XnZAbc2W-z0cKm6M(`t!u-DkR{se*LmH%%w3-iy!^wcx0HWq>RKi4i3__oFGmc z6Rc3oOx>eGBVbvaWU_V*y<;#z&D1(YAWN2>f`Nf|9Ou$as;xLz(Oq6XrE1)+CEN71 z-w0KOJZkRLsRV-&9RuyyLBd%MhQ7qz|62_|zz{5?-q}u6tf;tHUlA)2TM$>|H@AdE zNH5|Z|A`Zi8mijf-u`C2qlygdBx5<2qKtw}RDA5P)##N2-{wC@Scf7<#uhX_q|X)< zHM>u3RuWXpC>b+RHPxgfHMJ0O`6`}Gq;NJ~mTm_h{OS5>eNJ%OG=@Lh1&3 z89<{+iBkzBVayDt-iwOHNX?4mmqW=7E@?*_W%ijEN75QO^Qn?VejXO)i;*G>4obCk-?g&OvfRO2UDPPq@KdJ`m6$AmWP8uUG)`Mob@FT zF2oeX=_9Hp%LN&ovp|@th_;f0X`r@WNnJ=561P)E;K1~2D*y7NMsHZP#ZRQ;BCc;Q z6pNy_BHzGOtTfI-@r24tDR=3-G!r=X-k?Y6M$1@Y~tC7#)s zV;Us~5rq%=hPjw7Ga?R0jjl?sk3X$RX@m2{oH5g!k1Qw$189qqiIK*!QSZCOEE zdJ=)i2U3E}Ktu}%4V6QKb~Pe4%nYvPr_f;x9NHQaL^6fwPwJ9jr(tY-4xJ3qHhTF! zM75)^Dw_h?dOiZe{25{r(oEDs5~1dGu?i9zO4Bm(3C?UW72BjL?oF0kCNA8otuH$K06mFb6MDDU@hF7Dg9Hsb)N$aDG8u4* zBszeArn_5`0u?N63PW-c(WL&X!|uOTc@e;V#2HQiniUJbcz{aLe|Li~7FrMk%IDmE z;TCS*;d+kT-8x|BOJ^d^svwDtXa%)VXZ4eHpa3DnIqDTQOinzB0tV^c6P{erR^Fn_ zVI>FZK+iZy?x=w#1gYWEOE{go23#`e=Qz3ug(%1`;$FDF);(YKd_=j5un_Ki4ZK;NllEL!-?SfLVaf-s%2ry{YCLM(J}xI0!Q~ zjd4b@87A-8j&1~%PZgmETh*x1QpJ#=jQN2w3X@tvFV=?vHz<*lVux#@u8kw`Cr>ekn^@#@=TdsqEdBb z*&4_Ii2^qHsm;BfWbm|FI1+NG#Du?*Y3?NK{NTwE7%8$17@?3pelo}M$BN}*jw?VY z&cIKQH^c`td_FNX+4q%J(7@tOd3G3k7oU%sPF7tVp%C>$TSP>}O;OQJQIOR@u^f*N zaX^1Zq?to2G(i9?3kHIiSVW(0bYf;=dN+mG9SoP1 zjg7U=P(@>P*U8(*Ab&d9&WCpNd<@^l5&n*ifWtU2 zxUY&T9e)fvVi^p>gCmvhnod9JDcll56su3RYPV)sxS4srXoigS&D;PDhcEuYd z;Lpb75dgDkJ?w{K;!t?LF&p^SX{_Avj&Qb6&vb6!fHpb`m(OJGE`CcPQq>3aGZX8b|9dZbCsG7} zQYi?KyAW|tgrXnH&WRrEhIas=f>HGTHK1@`mc3zrN6g|%KO#;C$z^0%Fo3zU%lN_N z5a2XT-)6F6$S9hCki1_a5kmhXGYXFlJ8X=nM69P=^K$R>6cs~cirfFN3YS2?#R?5i zFP!|?!ZH;ga!w4yyZ971yRfIs6UStfk#HxH=lt=I*R##_zOq^^(#Y2QjmP!NI)k>P zQ6?Gc^4ead+ozowe6{UWA}aNCsY?pTlmlb>;7RyWbaaPd8XtHrbdBk;`xHiv+pqU) zoB3u9ADz3!k8=zL`7G{Tei z&xJ8oSxZ3eh;fsUM!(zox;r?VqepA`V@B|6luVycR#EAC(_T6C?(ny9!wz94@eko6 zkOnWjf3dhNYkem0HI#O!11L#m=KwRkMT(HsQyQytf-GJTxGwe=!vZAdRYQqPSdtCBlpyHrbuKJohPM4PS?x(g!?kuvqE= zsjZbHKtvp&dhj_dB@`e8PAv+u(npj7s~jjduR((Te~C+8`3bl0%;}D%vf>ajHc#&$ z*%72J4jwVgERTOCL$jw876@IhX%uSP{}2PEx7r(x;T-#ngo5t>B8RE*80hbjZk z`NN&@E)HH^vl0je%+j? zd_p19sML6jp8wGYY(_IZ896yR#gc!%KHt{}WQnnj#CBJYClmmvLOR_(ug1a9>NU!|0BW_8D!)>_UUm$X0_x#ftnVq7BiBG84u-lFnaJ#zzDo4Smll=&@eBZN5=&KGU4xW0w)jQ27 z=qSj#8?07HUi)WO#9&spgV99o{|t#(+;)ejq^dc7DgS5Cq?0O3pTXw3QG$cz{F%$! zY$@5RLqw9I`Zs|UbUo~if!N*#{OSxrTDL*D2$O< zZ`bjIQzrgzAYX1+rn)MV9L8y*n!TEnMfoFeClt*Z6rY#&yywknIOdc}5r3=w_rwKH z-S00eXjawzk(gW_=V2g%R8&-)=uO1t_3OVf#C_Bxg{n9BAOu0ZQ9r}K_u!XDQ<;eg zKPyyIb=1n_vsnEG6VmgY9B%@xUgj!J4{f&CjPE8zL*azJABs6_)I}#<{EzJ}*Esk4 ze2}mT(MT#&t)@p%FV(6F9Zv`>;{*Th8LJU1^v0T z>HQQU3aW-oK~dIdy?*unXMNhRo7_Vh*#oH4Wu~UypPk&=_k1eulAdz2z$$|3!Q|9b z5Z_=P&*WqaxnBh>8vstQp;u2F-Ih;go2`CWG)oJ;@%D1f&4xo+%5n;Y3~on2ClHv> zBcC}3CCW!D0mCBC!O8dttPK1f7aJVW!e%^vKegGcZW8*QopcAQ4aa9cKNWeeH!>vU zWVyettu5LBUt%}kvnf|JNH?QOM2GnUiAj251<{WT_U4OL6P7JBoIx)`rIgc~waM7B zc{S)hb%#MmB;MZb!)8ahqhvCZ<#Dp@KLPLONF^CswOV>7#D$%vYOQET9^J;@YV|sc zug=Hayk3(4Y~B=YuS0O*@R&h291$-oEAMGxUn!T@>!Zoj8DDWk!1XK?A(>?&&q%Wm z5{yPd)5OF?H3^M?lZKIT7$;ZS{5X0>favZ3k%$)}Jm>4v;MVgFtEYpS?b+)yEY^sF zLR$mf+b*yih*0YD3bgvHHk70s^pQ#K+`rh=b!h?$g)0HV0pXRpGKI4z-@_pex@E{t zoqb8y;-cT}D5nz98nvoh?5;8CcDBP?D0MBTsG&>_y7VzBaf2?(TpTaCa(FmO$le{>;fqc^frVYV7IRzeO8iWo0zw z4x+bnieC=qMWvRA#sJ!FUO+!;Z{HM_1BrkaWv+E1x0h!(%j0o0bnH;ocm#ODcxy4$;rnzMsK_=BU z52s8~IxYI!Lo){LHg>K94w^BBQK~Yl^aEkH?khySZihtXwJOi(hQkTV(9VA{w-QP7 zdg@jSHI*{r^E$3Yl??A$&u@=_^^uHD4}hbJo-jAAmQ^5ij8B1ZCh?l!vqVzBmwPs_ z;j-6QIu+~vBURMkb$#3`?abNu@Y$^6(I~IQSv+6x_=p^_P|B#^AIZ1jtZ2Gk*&^cl z^xz)Fpjy?H}qkZz@k$h?M!aGk1Mlb6_T;IPvZnpg#I*duf9z+l(O`o^=)Yj0`%P~HK+Lz{lkA?0E z3|SE`v2mUM%d=Pv=n^*Cy2Qevtrsfly`PcvmpANMzz)k&vh_^RdE4x-1DF1+3x01n z0}FqrRRTxHTSEVvL;$3n8+YCP`t%Zsw(aw*541~x4;0t8$+3-~jhhQhoCvTVOIS3j zDG*)RoVFf?&%GM~tGj*BcXw?0J~ih6H2rO2%M=Jrv~lRCP~K#@id=AWpZi7l`WRmu^pciYr~ zi)BfCPKBUQ##2?$(xtS&hT0JCaNHAzDv%B|f+A3F>{ zznwf+b6?3t)t;tRBG-L#eZ2S|-S&7E{vbet3I?P3r445VD*n?UwLR6HI4vQRik)3Q zjiyL~q}47f=coUv@d+=~+ozxp15C(+6p?SE!DiM#7^2R{R!6+Rt8Ejm>)ri52{sBI zpCDJ|_#s`o!rQcD(9)TJne6R|8hg0 z*V2v7n5%ffgU2J&ryJ4$TCm-6f9jhnw`{AdLgkY!@9WEL`<*k5bN{XOuAhYuWZ_6& zojR(lNF||XOLgu?UftoVp=SG{M&yG8r9;XU=k_2>^dLf@nwLxQEXG=q79M??>2zm% z_0Eu)ua`t#%1&$7_FI#7cOMru3kzo9>l)<-n@*{;=UJJU$qpCkpUy{2lldDf?p@|vFn`B7gY)L|I4|`>+5=7!B@qQ#m%*VmJ%`gM_&Z^24qz|yJcL#4&HrvYP^N%< z!SnM!lUPZGtiI%J-SV<)udspNe4bx>LGJ19{vV~7Q@Gyz+KwzV|NeynvZ2LR5i*Na zU%P;j260CgV;+CXnqb5S9>PXHBO z%w(X&EAn};a6l%7)aUXOLU|aLOqnhP6NMh%!8CFgFNDqq8Ee)+J54T~F*iM3tIbKH zBmxTQBplSf8;D-+QvyPVZkN+JJ|bUQK2w)}PKdbz^oYhx@y zsBw3qPSEgeD4OY!Rdjf-Wm^Q*Y2~l66!L}P+gNzS{JlW;pYhG(lxYYVIdvk%Wza3Vs7Ne^Ld5?GRL4D?kMjiFn}OBHG8-E%mo2l?#frh_ z+b0m_ELX(8ewNJ#G)n;2?BldE}y;0Gdaw@lap&Z`MH0h3o0J}RkdylkIV1X+rh4C>5&xIX z44OHl%TUA5i~nZc9!`U6)&M2aa2!ss(hAUyCIATWqlskOUgr!0%(Jl$KMGD`KP{#QB zk_@0@9nT&z>lAZ3Jtvm(o4@!SZW8KE0sTA28{h;0n43bsw>E%ryzzi!|Ln)Z{L zZ6pqtrDldM7#b13?YpFRQ`ZnMf%CJ?{Bpgss=-PgZz zz+=V~vp4P77!3tB_y1WwT?pV};1MCb!449jNDAX@{xu%BDGdJc{Y1p;G8qD^#blVt z=eo86{CWs@f<`9^6m&h@fS9(`(e&-{8v19CT`r1V8VweT^T6z%Z*vKs6dZn_h@nC@ zqU7-iczxZ5%R6~%-M2x}%BK9xZz6D?L4(_=8LmU&sw%wRJ4H42g&n_1@=mF`hUORU;8Y zG|`qdBGpM0$6!tf{bCw(5_$my|0xG4984kA91XYnr^ZQ4P(&UJz2Y*vw#pU$yZd=e zR7M82gd-khDvmp~dUIvfCQWtK)M*H4j1#x%hKgdx=AqjU$sbFk4~a%r<}|G7o5t?k z1a>WWPjkBtJF!( OERFj&bezcnSHLgZZH8ux9|tZEBu=L7hRh6<#yLnZiFlRQRG;uUzIvedcVwE!T3pi|KWWskv1+})y z1#$nSq^e}YNxJ#b0*BZ<$LPAkH~J?KxNv_MJq*`Rh( zU7KLs0v3MIkqUpvRuECeHW_(@5l`?mQi%T0v44`nf0K%$+z_8E$0nc%+o?p5`~We4n~;{L)W#0!9g|>dr3nEc9G0L) zVTVjshsL5L!&k$GVrK4BDS|H#f;WayCL}cfg{z2jG7QNDi#2Fci2`MjXeRSBw~d3w zYXgk*U$*d-fqyc1j)@kGB~(Wx&5Gk+Oj6lO7djtEOR-26)YFvQU;S5vXq0aON6=^Iv(>jNZFWx=+*i;}}3;WITD{ozW`3D9`A|1eGr@E86ClbcP+0?7hV{y{1J=15y08RIDViZ};J zVr+yj3w9pDDC#f)T@;`KAB=)M^N&&d1qX9+XYXl zj)9UHo@i^Jwzv~AWBm-(Ga47oa8@T=f9u|Z`yna<8&{Z}ByI+)CpnFH5ffYKX6a^=d zA)F%kP|T1+bhdN>QFsszV3R#66#V_p(g}zl(p|6+4`S-{2c+`iFC2sn(MFqp8AWU6 z?OVad>djDBM*qMw+4a>Kh2+UG(^od&%I(>)5-&zbro3X>5QzJmB43yyj84`yDB#2dH zK{x>#97@!R;iMcQ%gSjQQS29#l%@31WsyHN44%p9W^5k=dgh0(j!WLCsh{8<=ah%EBd zm|zj&GO)l+9*hlY7s5>rX#&@WrK}o>#)A@+A(}$Jv(OKcSu&Uq3Oad03^Tn2f~m}cU&jdD@~=^+DAj^8jwL5e*Y$bsJ=+sYySli=$CD-x>4?k5|V z;wJn2+b;c}T4Q%0_k#by|owhl31qK;5f$mKNEDSyvC-{Mz53yn_66*OOJ98-Ji zoKtI#4kz;W*-KeP8v#hX)(<(S`+#zj@a9!MSw=i5!o;cc=Phe7Wn4b1&3K8`es~;y zPDV~h%<_wt6f(h_{qRC$X*AaTTchT0K7|Z+a6>U*nobCF1XqYA4KYLkuZXborzE`2$nn2aj#Ngv=%CGS93~44|Gn{8#x*muy(-BWDC&O9m8yqn&<-;#BJ| zOA}Fq2cC`RYm5xA02WbYMKeWgW#7Boj_a=HX)*l{j$dmVM000Lf8Y8+NkG@hyQ6d6*&%#48`2UlZ%i!JhH!VJ%%4&9=xnc!a zRP@>#r!J|~234|6xJhU7N=%LJ$8kXE0xeZ=xmxRUSixqYM!XNuzxKh8K<1wO(%uR57YygBmj;Q2NNzveNWQ zeieG&AJ^$VAByP{)hZX-s;5jCr*G>p`@b!Wp$r8H|9#(ATC7s@zUc+sm(=z*LBTjo zLr>j6%B!z|>E2H3N#!51)BQgDU)Cju+t2enO`vk@7PkILtmoq6VE`Gdop6>z#6Nn^ z&>QKEKba+!> zhwFcSpI$Vu^>&dY*B9_mK7Go5c5#KFod*6EieHE4o`_i+*(uoGJL&o%xRn0{c(l4a zR}H^fwd12=<(T%w#|;mG?>IU+v(Jh3fKnv~Q>^?GOcP{uTW?2U8qVgTXE>^(_=^#` z*M{$4J%!s9gGt5jcD-)7N`GsA>^O$BDo7tnG!jihIkkZclc_r?QAUh%QKo54!?`Ia z^_&Y^T(wf2mV?581QJKhWc7F_XXLY*u%w-+6;$Q&9uix&+>8kTl z4zI7{#Iv`UASxEo@2s}KnwV-!Mg6JP6WG@jYRl6o4J1Or)h4;;Cx$GWZvNbJ5)tme zYH()7pJpoLK81epy-^N$BoX!;Q+It($0Rv+TK8lM>f{0mdf0JyYY zwAM=@5jnT#ENQCt(_}GtYkXCg!*RT>@MR_gbu6!Q#vM3TYkEdLd?m=v2} zbv027lHA6&VCD*Vmzjh*IUp*Q|4}WajjAzW1Sv!7PpE(i1)H=AF1B9pY&yEl7x0c^ z2A-Kj$U<;9k^)@{Apwzok@&x)Az3rM>64Aa!mD@zi!42ONZ|m;-p3IK-N1iRFtt^* zf?8uqoYpJ*Iy-wwGnzw`Y0)zDRV&52zKNWi2y#oeJn*02kVf2kA>kzMK;h$=B~pdw z6(Cq0Ez~$FiMVOTOeChBS8B9$Pn>d!imVQ!`(T%=Cob^Ex0tQM9na`1Mno$q$d7mV zZI+FqQiw2+hy1NfTEFCXIf)oK?#XgYbs+h%SSIP}d$78E+?9%ZsCT=i%P!>p&&GZ_ z>-#En!gJvL@sB|>1O{(;4jVXe2rT~(;_rQ|6+iedqlS(t|4Gmg0ZNunk~+0TI44%k znyQ*!};rfMqAQD*+zA;UEf|o_2$sOQ8zG#c>Q)#{AcvKg(MF^%tKrnkluKeB)Op zeF@}^%-AtMt^P1CZDXPo<0)`EnpVcJxT~wr3!N1v)JERP;tah zzAF>~UdD`%gyCtNzOLWn_qnpNVkBG~!zu#uGr}lGj+~3@`t9-DWAfSCxf4=r+EBf% z5lHqCartVMT0HXm-#FR%ITea((4~JqRX1T%QxEjPG3tq`Tac1#-3fFPbUb}Dx}HA~ zti$YLOlbYu>Ktk&Sl@a->Ef`_YPMTN{e(uudHRqOSgz47wmF#0jD{f86t0q=hFta( z32ag9YLDk%x=fDW`aC*+Ofs1mr&;-!f2!;G0!mTI_5c1^D&qGor!+3G55@p@TdNzu z>G^k6_$j~tH>9K%jI)8k7T`U)9VHWRx)*ggs(ZN7CTF+;$R9p;w^uZw@B&{O&d*KP zMz~;aHZ8iwu#(yac}~@LmO^$}gmuvWQCFd&;bEX*z2DD3Uo>azig~f^WilI&N3bM^ z$KqTsDwGS9$u{XQAzujD-L(eEmACkJHJh9QbSaFl-SXeK<%hKDw_cx2{P!LsNSCT} zbNRmYmgh%PX!`(n36b~W);rfOe8M<7&XG4q{kRZivdPSTY4@vp015&BW-p#r{t8R~Q|$ar5k%*QJ3RrmMvPJn`nLXLZ7wRogczE5X`%BOW;0rVAglvJn$sbYCv zL66nMk*`;`Ubk&q6^G5^xe)XI#;N|g-`S_^Hc7D|gIfDWx}ksRpu{8YhS0mtQD3e% zcKsl>^(1#U>x#N=4VCz~MlFZK%IGc`R6Op6^Y+tqi(k*02E#-46W${1uCKdy}XuY3sw%C#$ zv-udKSH0M%HkkAXKHx!i6qP0QPNZwPitum2s>8{UnDU(+LnJcN|6Pt5{R_D$FG zZapA29gU;a^Ln+ud_2|ea&(Xszm?Bniu>?=Zr`2F@2e^K|@^!h^@`c|M`swrTEami= zNsnw$=PRFK=jz=bU}cnnI)a)151z5&-@7{yUR+cpT8N?p!i`fXE`EA{VA$bvddan= zcYinxEFfVZwlaj=frCTaYo0{()@sW!)+!}~Zv91aybzY2Xb@a+g%SFxA*o|BGv%?j z!2b$>?S8)d%XnM54{mlAOMLbWUnY-d0d_S8El50Oo3jo;8D;u?XCS`iqftR~hsS<2 zwLmW|wX-wF)A@-0{o+2xh6iW40UizxL98Rsk>gxv7_h259cC?#{`7tOH!`7B_XHIj zjm5Op;Q60P3#2GidGA0$SHW34@!i_l2t+c52KK>8VDPs8^JW-YT?*?YVzCmHmYEPSfNs0N0@GXHw><=EtdOj1x+=VfJUf{UNaOm`EVmhIcqI#bUZ z=9s1bDASnFe%K>jIuoDgMaj4sgOK-k-X@iz;gK~0I#gmEMQsqQaYmR@;^RflM0Hx7 zPSf7RRQ9v7h5OoK&4o>N_j;%8P`m549TG14zSHm;lcw#@=f^~`a!x}*#f^$nIr3C;?ogUZpdoGp~$c72bt>5CezyG?tj)RBC z(QsmkORE&H=4_+Ln+!qjJiFI*(PJWuqWu2@2{NkWGC>kXOXC!@38KP$UO<>SK}S7@an+)QCQ2*~ zT|@OEs-~)8)1qY^NMYjDxAH-`W}BpED3mocshglg&AdSU_^Zqc$wh;BpFBJ=+^(;Z zR5G`&`$+}RojKH^tAYq-qDz9F0AWU^G_|N6YX)k`&zA$AmIfeUq9X6F=Og$rhojJG>Rdh$m?hocXs zx9aoi+JXzUwt#BKLQ1xtvSux+mO}O)0+_O@UXXGePa9@80ty)f7FXPMdt9CVE>>1y zIMaZz9xXE`!fsoClWr)CAva}VhgDXPv%J&!<>vUe08+>^t|w-)ST;o8Dpb%o4I5-A zyS7Pz%|?KG1V#vKG@`o62CAeS{VhTt3!)g83-RF80e!Gps{TTa~wFQs-2#c68;GS5Oj$k3T;(`ePMx!mk&bSQDk{y>aRopY23i< z$&4}yP>*J&{@sG=XhJq2J##-CA6lq^jx8hlg!~iB0728O9_}APl>PVO9q?yVq}P5Y2+1KPG+P&DG`yrrWk~S z#RO@fuK|w;0VY^CGi$tzUs!PZjOEeUMlAyF)_;6^WM*y?Xym6@ONh{iKWZGd%aE{5 ztI`Jl9f=RReie`F5@#CEyiOpsYatw zW*0P~($CdZt%iFxg~0)bt{^cmkyK-_Kp8WNic>$IpnvRrkbx)g&%i%T)RcLT8O$9kpjX=p=(>Rt?7^W0e(19juqeh!;XCXLHcr+$f&T6R$!?;nk6i%P$ zY@tj6Pa)W99+u>ABGqQKfr3!aj_aXW5fJ_X_0*HX@T`_!pqs`NN1)g015l*=I|{sb$~Y2-@AfOFSY?wA+^d zkEe5t3anwfaQ0+QlQG%0n{3;*ZF92inrv$_C)>7N-+6w#-~U#tTCF-~-`Bo2kY;TZ zj|<~*@wxkj#mZ#P$Hh1e{7zeUj7tm5H1*Wf?08!h49;M)ICSlRdk58H=!F5~n`d-* zYYP<$GK%wo0(tH?{YWks^X)Eo`$;0LN;AC>pd2=?3%27Ez`m^J{$@!G9-K)6`o9N& z-yxsO;CUHjemG@w-~tR4<+DIA^tRgKTkCWLI3Wx;Qi5*f0yb8JRrdn}10R7K=H()7 zxqbQ19FK0DvyvOv)vJ)<@gxfEyBw&G(AenMn4R_b z;^uMtI}C@NwV#XsQ+e)ItDW)MKBO@Z(=|;S0=X-}y$r>#Wd3*3IS4o5tRoXMka-H0s)NJ-CzM?Lc zM3)egX)~VwnOn*&lgLPsN7}l|^fH ztuEC`GAX`nZoA7YKzH0)>PvJcDNI`L^ES1*P&u09?3s6$4-f^?X^r}QfpRG{<*E&u zFOmm8Wis9mt?a6F>#AqF{y6e}f$SH_Bq%sTGcTq8WdS9!>DRA;ON%z@dPV9t zv3T6HAMa6|4SHIg&l^rhbp071;Ek{*zPfxo@=;!yADt!*^!(F9X+#sDGMVUC*{c!q2HeopO>S+L+rh*7HEKU_rWsMbYm z7aSgk=k&u<{L3G8Kk>W11_KDfFI_lw-eU1(C{<5;BLD-go`s9vStQ1IE{E^w@h6Fk zrE0UpVPBB=>AdCjKX`hz8b#JNdCi+!lh|w?OoZ2esEMu@%R39g?b3UD2^s8w(Lb?d zI1X=oe3VwVhysD(fM@I=(xJm3P9ZMdspWn85ab||m{Z492MsX{a2AJ12+biFs}l~y zE2_u~C|a*)xLB$A-C?v)ix`%aC;yTE92wnHtI@ewI6EjB&smE8SeW?k^$|@BqrB_e`^zn_raD$uHLC9^DKX))sBBoLhak(1* zg-68PVD4{hoo==_Rnlp-XN|L&8CFcGf9cX^aX0%tRp&ae^@1#rCx%xSK;)g!gEnT{ z6ZGteSBWsIE!1D zZTWyPy@DItQa>+5^9(UcCyp#&c#!91fA8(-A}T6s$pt)ENst&M7as0h9t6z z&|O+i=H$b1I)N;*TD?1vB68RM$m`w3QVoTt_2CF_s*FSE&$KM5H>1HpK_nLKzk|Lo zpt1<2nP+$ahgfx@Eye_UnScc~mkerio$W~6- z1}lyLs2L27+$3Jvtkr48a4qv&*OC%h>4O@nzEBHY^1bVAgCIe%5>k&kwIy{mBi>ho!yOPaoTOV`5o;RM*>#s%hfLGF}xO|>76K?bk7k$U%E3fQJG=z zgUgeYobNkcM)7%63oKrLw?rwdVmexA(7U#*+El$w%$vi@reW^yKQ0@HE zP&#G1-0HiOgU4_E(dK>dJtPX#rS*bLGBsYAlAZc(t)>Tv)lJ72pA=Lqmbxb&DpP|o zBV%Lbq-cQ$5Z3(l3aWFI5RH0&!#IU6E#=LNce^prKIOl39Iy~w7AGfndS2f$ zV+VgqI|u8-FbfzaP*KbNJ#^&Ic5r|ll^A}+n}_28(m6V%YUd!aZw&wq+u04w>2Q+X z?y=)u(0R$j3(87Usg&vTEXDt(e>&Bw z`t>`QV(GyuJ&tFt;VVtz$>kj3t*@;(;6CZMTV1 zDO&+{&UCU`qwXHMW;)zygx}`#Ci9BT=V4FIip^%t=Y9PH$px1mxH9E~uQgfUKdztr zN1kOy@tJSE?7;2~o0@35Ulp={{P?Xn5sxz0&U4+XR+*Z^>*Ecq*~nzD015YO!_xRh zyW5cnb_!l&bI8VO7K4FX)E5V$J*d^hw!-b5)9xNB`ihwGewg#KT%vrCymDasB4E3y z8yGehNDMwp+1v--l!*!dW`kKNG#8)&OK`%X`-aQ- zx`TMJnZf^)dHPPVr_aap$@8YIl+Cxv08qfq*qjN#Dt;mmj;fA;zWL|m%fmo#$ML-$ zAEbIB;c)`Vqy!qdG>6~o{V~zNe-=Sc-o_QcX3+I9 z<#ko*8a7UjE4cN1190&;Jhl_p<44n-b@rbvTi!r39t{K6?e;vxZS%u^r$59;&%@-t zb@l`Lk=yrPT~hHjKsXFIk#l?QU$<;}lF;#aZiKqfKc29A-&X?0lePB`BsS4(e!ovb z?I36*0yb*^*k>SUH+Ywt|Aa<(^@|bdqfHO_IdeY)q~r}o!*ngDjH_Z;Erk zp^#qPM~4#v?Kl2W>Vq@-uXkpRqWwhp!QtM!ZQuj_O}EE2X5#sMNe`FPa4ktA>N%`oWinqE0Dc%pT*5qS`{}x3Ru`$42;RTR=3wo7gyF3oUCgHX5ReL*TE}aU9?p zZnARru&a<#_3d-Xyqo)UD-wKJW@dnNbmn0&7(%5fvwg}S4@GL%NEkb?9g4_-TgTz@ zxV6k2_#N5$rFqfEZIC3F^jTrUH63K|ykS8U}6Tuf9% z6StubV+30!@i@!sL2Q(i<8YDu-w5nQ3$u}!6>B!ETMiNR24q>7Qe_xnB#VHuXLU8} z#x*=MHNu4n)6{bTEW9Jdjfx_s^tL@6>EAlD3X#M{76Op0LtvmY@*q?_@F-4Bd&z^O za|}27=3GmHpv*VG$bFVlA6X#Ol#EUobps`pG9K@j=r$B9Bcv&_jMDa7Lb+A{{BP;Q ztXJV*(B}E_0tOu9mD2e?z93LRdA5;YYeOUvJ2v*A5a>p(U*O7SOwRmZFpFk^dIVdZ zP72xFYYqHGG@~`X=_^)w7x(#A0(hVnYQ*FM%Ybc*(N&v8lYkTPy%03%kaazc0u_ox z0{RBaw<+P!@(_g5xtO{N8k~H>Au6_H2aQ8ujMIY|0Zp^$glKM1Ylo78VOvrf6YeCk zz+7-+zO_7EfLf`)t=i(du&d-!{^k$bBoHLD!3>oYVRyUZEUmG>*b2sw4|ye4TnZ}O z-3quw(#D>=g0k}r$bW4~78QC4(Zl$~KDS>N;K#~Hr6NfUh;@z<41>H7Q1FH5MN!Zf zW6}DhW!US!gLR>iw}CRC`tzq9h%rN61e>?V!W9dF=?91uK)F@0(F7S;s*+h>b5O4)8ZmBVimQ&1VA!C9b>IuYrk1eb$y9FgY-3*}#b8^?ix zVq|6BeuRZkODP~FOHuNgnU@d=sO#s4Dm%PL1vEkZwrSFV2JvOvo(!ZC6$UU=Xah6X zkkQB^{C$u@3ZK9i{euBRgUvac2@}&+g1BC*34UPEjOaM+VIobWJP%zPH7P9+MwSP% zyR(xgvuGEiP+ngc<~&k10+b8K6PXxAlo++ayj`$JrR(jDe*%oHImH@P3BAMEF}%h2d#Irrp=`#Munb9&6`L12Q9Q{IWm07D zfqdYaKw_1;pZ^F^b>ug=Dl5S$m(02H3b?FX*giIzHNpO1*j7hbl~&?@Bf~9x-%1L zmDrkRq@O(;dfkSfBumVkgx^?^|Ev#*$A(x8DC_e#cn(56%9js!LWKb&koE7nart2g zO2_1bNu~$;$cbzFS{|6;ME6k{ix}nx|zQfTBp~OgvI4BdhN{oHkzA5&0=G;@1;)s zDVM|Tw==MT-=Kcy75*uSYmIdDV|A^ipi|h%BDfrAgB*VwaJl=t z@%ANwsLqE89|ST$rfwM;wkAMi7Oa$@wk;zmm;JW74s^7Mxsv*6RNE(#$`eauGnW1I z`8i;z>IMgcBWhwZzgEw&^n4ll`0yjJhm36vwgZL0P5SqDNW`P@`J~CiAB&3i=OOQo zq;r{E4<{&rqD|wt%KfWtqF}gw68z0z;l>s~bw#&1WwO|Pdub_0 z|16bA6eH;QlKqphz{}@XI)yZy#fWRnv)Gh4#uA(+BoK>YY82qM`)2boWF`A&VXQv- zNu@${&;tGG-Ws=Ll}sQ0SuNZ zxUax%2O&o)DXgsf9(!hJ^!L=W8?;Gohx^*AmUBAo0-#7oD zd82@bAo6v2*p{y=tesK6(&w$x{jb&N6vea|hyan8a|*q>XzDRcQH%tv z=5wEaH+fAu(owO{?$Jq0N*-{z%$KS+3dQ26w5!~g#M{M(e}2Peuzz~Y)%E;L|9j<^ zbT*eo_fys|*pe$u>Gya_C71F3%=7-Tx*9q&X%KggU)^+0E_)2Y!d35%PaN+<5-}&~ z>G8e%((!X^|4B$zWDFdb8`wvXCeHdVIXTJ5*c?8K)mxP<-p}*#VoA&gPbTUl`juiU zGnHf`Lqk;5geXkfZui+YsZ^Sd9-F)G$zx%Gy6zp^t`}-MLwFbapHKsKc&=UFlT)cwFxy{NJ6ozQ_i)0glP>8c|F>0rcBSO*HrT@oO>=<(R$b$Mg9@yg z-0-?w-n;}xYrMr0l%~K*{Awv{UfR;MXC)Ed4Mx>H%UK1)5r8_tfg*PKxF{`+MZ`5< ze&oXW;qpV$b7z-mV4hWGE+|37L`Ae&qNxqD=c{k?1KL>sh#ax;^7wdgaKEZ*y=c%q z{Wn<8)u$|8R5H!yT$~n5Pww#{?GWr34w`(r1+%GcN6y<`iHs(La)F3~q{I`@N^&~9 z4-ghFBPD5Lc3V7GDxG?NzeALh)tzl*G0pH~5P*?)5CUnD|7`BBRTd~(LGQ;2iK~^R zxjpYCNc`5abV;U;euA41FAZ3+J}#z)FH}hP?)73J zObtUZ`0S4htY_Wc&jHPmCqWMf!J;6b{XHT}8-ic3KaiziDlEPaUXKCJw^zjVo-YRN z6bqqU929wjKy3BqL>Il9?wmxkh7J{t081i`Alt3m4dL;v zUNsDRBv2$}#RxO(&|!sSml-%wcD-8jxqqevZly3#)~M_couW}&@ma8Tw68Q%hrU4P z=f1!EiKV>f`2&ewyL(^WMw5`RPgUSzTNEM@d(LGJGxL~zqB?t(!gDi)mOBGbD_J=C zJieGoH)Yx{YRgH)nkn1NwFe1161*Syubm{J3-xQ5OCm^q%7>-Xz|=c|2*sN%I)K2K z6Vcrh`Q*YMnpCSd_aB6Jns|;B?xZiP)b! zHD~*e=yZG2iB>J*kV$Beq&Z@EHfX;9SCk?gJ=n|WcngoEscGm&K9iJFo$fk_hyv+f z(`-1IIpZWIja&Ek1uCG3-Z>x0S#z=8jpu3DAeGtu;d*j3j!EPFW;wI~7*WE6K&M1^Z)gxc%(*|<@11&-gr#Y4)-#Eh(CD=lBtH2dkCzQ(q$u~U~6l(6x*Z723rS-DuwHxW7-dK2uDHsv8>@;Ac_t>$8XVN!}r2=X#3h8?!Ort z?mF-9Qj$g6hghs%zxsH1ywn%iPu1v+H!`cz&=GyzHtiFKB(;`B;iN`k(vy>_u(3 zqB9!_ZM67s>u9zv*DCbxb)(%ID@Oe*#UPpY)m(PWlPi}%7FIwNNz<G|@%;z*$0IRp;w3^!j8qpXXcdi1CVqn~{~}eLs>_2qSib%r_#YVIXu(-OIsX1uZ?pjW7E^6360(dt8#pwJjYKqpP!Y*x!nZ!URYgs zeM?*3xcBItY-WqiU2g|zBC^KR#DrNWd-OApJ@b$$H&f}hyaiybcMBV@dPgA99R|l0 zV|03)TODdWLC~=x;^NFh{-DG$s36~#oG(s`#|eC|Z-&QHj?kas>Z^Tf&38(vQ?j~z zUt(G|`8%6H4iWfHJ>0O4tNOlQaw``|NWh9FCO%zk-hCcPT}0dj@1UD~a6(7JBo=ws zn7u}yNb!B3uT%ls4!J+K9XSdL4be3|w?B{o$dRJ_-#g^pf2iCUjz*hD8(+;50|J~4 zIs^o=AuZhai;g~d=Z*{>o3wCp5>P1tJwr`zp4d8#trv(c)%#6y=luy1^kQIq2Ld9ow?hF4dY;er_7$3(?3 zc0KmRN&DqxXLlh`gi87KRPxosfwsT4A1WeaY{hQ3l973pXo3OXRoqopS>b5E^@#zj zmS41N`L&#s(yLa%LGeTms#WWB8!n6iI_qDN-|%+<;kFdNUL*}ty`gNXQpz7A=2VJg z<5HcFVa>Mv27;b9(}5OTe(l@Q1uHC8-de*+HQ-YoxZ$#|ke&Ihgu!P!0HcKs&~jNb zX%i^x@ItVcUfYAUM)V5NTs*&2yKO_~pEE5y+JND`|%Sf%xxa1|$NDV7JB2 z&m9cSKP`T{NY%gMM*a~$@KbR%Z8AtCqz{t9R~`Ai208S-b#Nh&zheo)T77SZ?N(!e zt%n4W6-h$zhgv~rr6b3@wRRHYEGUc!9JHlirQ~E|OQEPAnvAzywvK%+8rs z_$Bg7SssQYk!ZrUW&FeuEW$EzmIC5X<)WEl!nT1Du{2PHboeJA_bT{#L~b;ZKo{DL z>0i4AS(&(S6`QJz><>gtNj(2tp(g>_$kfk|S1tL^#?a|yrmO~gR>n$mg3MkkzV-zdtU&7!odf>Cb zOIZoT81&m<-GTKev?JBp`^?9Yz3dT*;1YYK{fmv;oeP&l-hGco~MSuWGW`9xV$F9wr{-nhL=k{wi|E z07vN@QB=ib$e7sJJ;pwDP1Jpj(g;-`#n?Nb4?M(D0k%e;F3sgpI6EKD2PAUe>1)(Ts zMg1bvHiWx|UN1y#>aEy#CsKnZ-;;pplexnThTf!`0nH4U0?G#cyel#`;s>rv_TRun z21xb2K$zHaKd6B_dHt8+4KUAF^1j}NAO%SSRPftXrsYL~w1fw2#{voM9Ry zO!^76AY>O4{`L-jG{{mL}Fu|n{tyX5%vxd28GA-?=MN$N0ZzAj|6BmWRc_P1KmMFOg2o99d0z3CFgpS*HUfl?FF%78 zp#V0CDvsb#d2%XK-kNF}gsjs5p+3T{M^M^#5-37+xb5qzFsUKyc8RV}LRrERlz3!h zg(HcfMFv+!JMD`)2X>fw6*wmT^<@5>AG^=qr$aG8GSC<@RP{wU+lg8Nhs-5 zp;Hc$(_>?|(BA$6&tv10ljGyD{&MhOfr9je`hSoJ&;vDlb923T>90I(H(ivmcYb4R z(tbff)AWU(gO820!r*c?v))=;5cY{N2Wk4C8~l=I?Wd^o=v@BRWBYN@HN+W4HSqBY z&Nmj1!bChUK(>bxCTNn#h@jRA>H;D!h>ZUR_QK}}s;o9AGZHI$cP6dKZLE&QC zuFmkpL=x)>5{&V(%ykl%{BPTBVBbAz@#$hk!EIh%fdAouMwd)wGk_!4=$1!TD+t-x ztgS!o?`@pTSB#a3g;Z0Z7SEFg!e_*%E$15z0}{kW+m!;q5=UUZ)-3Y7A5dKT9Pfm+ z1NiDE;vdDiUEYBAw84GP2V5*EsU{<>)+XZ!G>sW~fkfkClPJ{*)ZP=SRGSzKC0T@23?*<(d!|!hJ16u3m=awT zhGHb_mi2b?z7B9*ph`mYxK;j}o_h92qrr5^7Kz0|TRa}QQ0TV}vK<9BS>&jVT7xjz zIPeT!UM2Ia!^E8b5XfdeU$!QUcU7*WG9r1CU_#*4y5?h(@pn)ngMu)au^Lbeqk@_! z=7`HtD;ErWJZ&tsi&|PrMkp3@@h%q|4Lvgd;+` z3>d_f>;74c@B64!rV49tw3Hm{{p_MnqQ=8T%S_Q6!N3@XwOMVv3I9ESfB8=V6^i6X zRsUEWi$=oH;85Q@w?El3wv1ptX9hMdua^7p(0KFozCs^Py}CYs=K3Da;%@-z z?)~;GSLo|B;@}{XWK!FD3b%eEIX-6h<65&^U+rU0d6J0okk_t%N1LG!hK1S3s_o7v zSf1TUx~;~Uix;}yJ2w>UO{ygJ*rtR6Sdue@$XB{udNeBSB8G;YF%oqOb-*_qpLLYu zSKt%&79LMlpaNt;dQ!$)xB)kD>QrJ5eRSgF9u=Y3Z*xhchfkRMraE(A9-n#aB=q79 z5*PTV*NcIiz)>=j;Vxzu!zzg?LAH~VZs>d>U(!}IvMuLga%{4@M`k>Y;>q8ju;##X zJcY_aX{9{|S4y?IoMVs6*of!a2zt* z(GSJtGWcEY8i~_MP6RB7YKJtf@?)aXaI6z)V?%XES3*BtJ?(oHYyfW{hc~ZXpS?yp z_{t$|E^mlLE5UzBz@|dP-?IZ92j)p@Q{ksPJS`nBR$VGo%8wn(52#W_`L_4V_lhG^ zd3+vE52D|J;SPHeXIf?wdivoj*kjP_%trOP1OUtOJNv^PsI7Qj2QYkHo;T~wxqg(I zoz^S$7*r}0Ev^SxgdH-&u~Wgp#Kn=ux*hf(nquV%Ca#y8^rKVXSuOXEOdM?WA(Nuy zf5k<}Mn=jiqhn$b;3lS#l4_)h?S;B%u~;oOY5>*q(dV4qN*1_!PIu6!pGWr7cfF1=VHsW zYP5?;a6Edt;OgIfB0^t1c1?mB`&{c|lQXdZsw!9R?h(nzs^BLWI~scqYe4#?(`=nS zxr3ZE!p8YWkt279+gTkDlmiiHEj4x#M;04LgFXWc z28ZwcaY4)Gkde1`R$tpBhE}I>`mO~f09U>q&zVeWZCs5`ws}8_SmvWIT(W?9j-b^h zMG~tAeH{`}6=Tura*$QXPDa-Bw3%P_i~juwKfJO4bl06v@8z2+Sb@eFSb8vw${)=p zlc+@%s-+pBkqTH1)w)po)gRBq{-Il7y6?@f=hq(f+>PaHdAh|dsa3z|75;eF?cSA2 zcRSLm#mL@1$AiEG>LJ{~r960DYelo?l33Q@dII`v&skKUfjINo-Te2TA}Pt>Bw;=b zE_y00ox1+12$f>HbEz%T=2o4}+2OZ!L{S*cGJ6NV5vS92*u*t!OXc)k(Kx*22G75# zpm7>4vb4hR*yJ))+Kqylhlz)iRoZ_dx2{r6aMpTdsx30A&)B>j5>1E@GKndr#dHHk z;f@%ziLwC)vSHj+Tj^pD65mXxO2ctl>nW?HcDJ*^TFNB%6G4?~DcylkL7-wj1)Rw6 z;52e55jt#N!U19$4Q!-Zzpa`K@3y@9O+kp?i;3Rfv1AAmUAusCoX~u=YUPGC;SFxS znQrYDMK`#08NQ9KFHY#Rs{TzbYfrJEbhF&62B&F-QWDLjK%um(G?C?Sd1sPs_%S}H~&g{4LZqn~m3oYjEeFy{LbCB^k=J2Hn1 zT0zSBzlS5oye80gN$FnV^BS2-n7q}hB&+WJmQ}9%p z<8C;UCwMTPy5usRyt|MK*3kfMq+XSjo2%Djdy$%Rantu^cd>jY1$-#2M(5xFl8Z-~ z)l=E=a}NCzok|7zRN}GM(Q=PsDk;uyUZ`E_=W1Rr@#yb>Dy}sM8ZpG1sB||TT}yt+ z82^`qeKwB|6(1)pYnQ!czOy_3S+UMalbM{gw_}UA=W|egfhc?`o$hnD>K}5MEX_vs zlLFDmx4^!C7*toQ9d`d3%YlRFL~F{PYAv!R3wsR(o-jTWDCA zMn&uW7L&uPC**v6&pcgHQrvwrgquh%#V+yIQI&?w~art=03je|J_@0RvoiE8TlC z_O_DtN75lYedMiKEaX!=0Ei?l5mP@p57Qg@bv;lbg~gmTMG>Y{#~D0cj83Urr2P^p z5n*9q>YoNYQgVQ744CoIodf%_sZ_9+DN)|-)}e{VHe1h9aSiEqE7k#gY%ZUZrh@g1%2+Tdqk6<~ z*>jq?8Otq$v_!PjSWgBho~@4`_v8$Bqj}ZQ(Q`PL=_!zuPQ>wh{^aAO`~_}4 zty^SY=!HvK+K%*N{nDNRG{4c9wI36|?Ze0-;x?Ne$lMKI;5e5W#?-3TkCFpEpb@@zAvz; zwJ@a1txl7(xJP45-KVkq=K5*O2IUVQmM>$j$MIDsY*CJWpZ6! zmO7moFNV|I7i*0jt|x}Q1d8Wu_Jn(5$yPWkKjm`imAe1M6Aio~VgLL5li9=B)Fgt_OeA&Gb#EXMPpY>sM;>_EP- zm@bE#>x!Awc1(-S8k_gv46qG&9`wW?imP8=amFx~VBvV~aDqxkE{&~JWWIxZG$0;p zxxAgT!dxo;_iqoEiDkMXnW=PULQ+T!kF$G_SPTtV6#+P7oh`Sq{;XGS zx23+6o&sUr#SO2?MDk@^o z1&0LH+P{QB8ov&4ON&89#KgY5C(5C0$K)^=jigBoh{<;590Z_9%KYMVJ0I+@>l96| z5F5565A#9m=Te6`6SLEY-P$&_1DR0@T89|vq!Gyy;eXrCo?fg@T<5?IPU-0}A81#> z&vom6z9|fi!{zprG*u1QIGK-*?~?&0zt8BxY+n8y0E?RR*7!Iajhu2XL`2 z3Wi6s;4oZ9-#h)wj7C1q;dax$cF^v4a+@SEM;?>Q==mHxie^fq@qWV%zlmtcLr%v= zq^a>Z+CkuROR11WWJsGym`aO4j+5gL949>1TCRr8iaN8ZG!lOzUh?PJ^#Cq&S#@lZ@6p*=gZ|mP;u|ib7WcXqlh7#o-NO`(9(i9 zK|vUtD{8vOD`rR4!nSJY@KHoqLiSX_`lw%)0~L$|P_ekomV>RZd!>^jqmw*dug5ce z;NsEPP1`X@&cY?q-p_rzC_&yq+@w(0<+VW{ZG2$$Wc9h-e zLI_iOF?o_bKB@#9wa~+DjZax{3 zEA0}3LR3kvMA~P9-<-#mxp4?FLd6GC`THTN7R4}7Dp--2amZNA*pwF)bdAudAG_~J zV;RN@u44evp7RG?rlnFjY5wf0jM6W1^Do-jER-|3R{vnFoOA|3Y_sTbwuJ-vZJ9m~ zXv1$4xap9*--rdBZ4Gx*Y>2a9|LO3fzfid+H*m@P|`1J7YWf5!bev@P8@aIUDPSim{3CoHy6x{y7uIkz{2#&caT zXxY0rX=zgc7x1)0_2>Q>j|?A91`AezL?-a|Z5!PCRrMj$|8j_J<5QS`L@-7OPLfG{4of8)Cy&A(pz*hVsKHDl21EUcn&ybxyTX7vz+wyP%w7+@!|vDAiwts3-^=n1gv$J-a?fuA z$;b{g9;E8Y?@^dtz&H;_7x~n@&FKd|2}nQ`@C{G#xt;l?0>m%VX#Z07B69l^uJSe; zR{!9Ty=~gFnLP_^04gC(E@%|JZH!Ri0uKMi{<6~C%s}c*<~U0$Xg)K-HYt?YM*p=L zMj2GQzb^bY`0#lWGTjeK5l3bISXEIG@FG2TAoTnvPx#l;%-o?Pb|BgY1PrLBbfUVy+HnvHVkw%iyf~x=H6EoS z3>N@(m>Z)uA_zdjGD^t9A((&q^hN>-N_6ZYNU^BQAJjL{-U0rpaQOFc-hy@kHH7s1 zOAM@ioKW095amP1^dK$e^WlN8ixoXD^8DJpdgVt+5mOxf_TBz?^e-mF4MYu9eWqF= zd$JvC;YvHvG>|eRC0ZOeF=5 z+VFe$^TOVBnfJxd;p&!Hz7dz=a$O531c)!Oq)Q;PG&=R&)jQn;3>~#3^%=AP_g`R# z9X}2lV_zq*B!E79aSQ!;U4oPXg9Z|0Il8u>U}6eb-u&QVKu1SsFxHfQrlH+_GP0D0 z<^h~AeR)W5)@k_aKfp~xK+v|QSU;LSE0+ZJpWen(sCgaduTSPmNf=YJuP%~;I_G?$*5nwp(G6WO*e7Zo|@&GyDG0UTLd zz}Ny=vn-Nk{2G+y$7TK?HHE%Bd~tE%()R5; zi@VL|JEc+y;7=zjvyx6ultNEubaTx;%1H#ys1&K&+Z4_#rVV``EEfNa`vM`E%_cox z%S)9-JuY94%%-w9T~-@$m`(E(Tjgf~4yU`r{APWHIoIcsk=%-CBPakORREO*q3jEP z-LO9*6nzgE{D(UGy9g$F!mqKLM{&V9zneATF!G|vfE@V zrNT=trv6~ezzYo2ug&p5tJ!v~NW*DaRE*>MY@+(}pSO*zFGA=~UIi_!xcwgOKa$1E z*r^t6G*R+WJpGmvGMhz!tJAZaw9-=2yOW)roszQ7?aNoo?fiVnP2gsi4Bxj^>uizs z=D_uR5Vlga#`7`a=U6fwVk*TNGHxa^Cvlz3)(3;Z`yk_o0DY(!w4p;QANhS(hm=}Y&UDXu7;8M9F9KUi-hptQM*^8;;<0 z+WC%SBh%S@Rukp;|CK9cG8&0tQYuyfZ!*C9ONDOfC7K-H(%C`Id@os95eQb_>L-^v z_~qy49w!KN=`!ADo^q$i3*fWYt~71STBp&d57hmR$zR5}uYu(aOieI3I$dXjn=MAF zjAK04tJP@ZqoI{DH`$NY0|A6ylk36>wOU@V1*1ZU(H_c@;`ZLF7YM4A!O#hR@?8wNyJ5bZ};0d@`Lqw-k z>?7y2Nr*v-Wv2OwAn>^z7`fpKUefzsRuPGvryXHP=x|i6quVo0E+xmaV)Pl<0xTuB z3CIf<#W05NDSV=}24pybg;Oj~Zf3unlk=R&Zq#Pl5&31u z)7MW9kb`*^yn0XIWe+syjf5dOGV<0F+>H)j;h25P*NK-~Ts|U0c`16i=vmuNH&Yde zi}5^e-$jKT7`W}r=1OF2=F4s(3WurHDE^P9b8xGyf8TcYQ1Sv_U z>wo>0daolRoJ3ztJ%M$7OIpws{ZpgXg3bDJ9nduOKE8A?{$#Ux+-GInK4)MigBWl- zM7rLzf%*njFJM}LY8OnQcpZdI^`OQ$lNJrGmwIP$JH*uYylY<}Z3m5D`uLzn!J$8 z`2QUNgKoFMgP-ko8r2(iM=3(lB&s z#9FW@|5|L0=h{QdJNyShq)!5}6!+I6IDFBx^`izHx_Rh`@-4xiiW^K^8q5gG{( z>;4cl9u^0q#P31T= zhsg^qs&z>v*-w^lc=J!DnL(Geka~zZ5NALeMHrEZ!nsyLoEMkfCMi9=_(WKg zh=SDp)B)LZW}UA%4Zf@A=Sq7Tqv`Wqm!R$I&e5dcVyzZCpwH^sjESkD{pDu|^?+LP zcRPiu?e~~ddY;imJ|E4hdZ+xtM(3jggWh!8_xm?^44VC$m-9<1cU?S$kb-ci`wPH3 za?lpyffp8v{2P-BlqT61GWRCAOyF)Hny|Zbx!^Z|hwJLlZ?fFk6_5UCat+_Wo($o$ zSX`&{;(Hw)SOUt?+1y3TwlEt;k-xtyg7JWqzmvXK>Zz$ccbDaQ6`GXE3naVwo{xdn zA<(F|J&(hnL*3_b_=QX&Y%klkRt@a4ye%yIi{V=Zet?LbHqf!cI)+eBC`yZ*&yrFK z>c32G&n92i=#U=$J5e_Ki-^V1aq)3sVr-Jl;H~WiXA-r|#vmY%6p19Lzw{DF8TN3t z(L1fO=C@M+HX3-0MaeGGDko|h*Lmd;`4ulembp{Ixf`{}YJ#$}s5m+PP_TS-i!F6V7#&%r6o+VV|pBprCfUc(&y`>egm${uJ@<$=7*WY>88XC?5)XIzb(u)q{Syc|9u@^9k}XWgqX2n>>n_ax$g zneU-%)nbi)=izv)!QM>oK{&AR)qPnQuDk0N=ubEW3lBgx{1%!9t=YWw1`B3_&TKy8 zZ3H8y6id6raJlB6f|?~eK`-d*y?s1O7jJ*|D^H_N`(yBzZ7<$>{KN`CWr;8xDwcR8 zfgCAf+8Ypi zrd_OkH=pBV5x-q}CH>a90m|MvCf4$EX|qT|epPK{9$X&UnP)$T_leG+{&7uiix*$M zb6uFR!&122LpKy2;&B_qSYzwzeofYxulegq}e(7pTxa;f#b>*C)* z6`YD`znPv+uk}l2^O^hkN*&ilQek-mi6dD4K!XGq!q&h`7F_2Yc4eeQINDj1^N1KP z9z*zABwF2uokEO)Y>bRD2JbrKtJt(@OeAO15ID+9axU4ik?N z*^v_mzOWZHLueR8;(0s&r0%bY(T(UL(;N zd^FJNJ0uG{A&2ES5dBTCruE9Lns-WPkkd1yXP6}nsUdPQl+sh4vXsqs3K-d@wG6Dh zZIK{ajuy#!5|%yHko6k|i6+qoUI?R7;$1-44$zhNOtw8fK8Zqfncz5KRA&hPio3W} zui?i^!0vgDZg)%?g;!GyQDk;pj!m1SlsBZhrJ|>zWoZA4y98kvTm0%t+Ava(lZuX2 zK(yi$WF+)s=iwN}NBhPP`5|UW1S%n(H8_?|N4+?rG%+3k;`CL;9-4JYMdEA6$u!JG zT)N#SO09yW8kYrzb)icM7D;;@p;V1*Le+sX1=CwY&!#)VD=P~#pX7ks?_eZniWP!N z3tFl}9JLUsL<7OeE?4M5jzWPl06{6nB;LYI@$%uPiOd%?3zL;m4eZC#GxgN4ND%}@ zs7gY{jD*C~e_JJi;B5bj$VYH(Qc)#|zrWJmzkC1)7PVBeg+b17L*H7oev#SG6{83d zC5Pbt5YqgDY@2Gc5*if|C^jIk#4SanXJen6ksIUT%!)}2_`Z#rdS2PAJI6+xrW+z2 zse;J=4OW_s)l`H#pCqaJj6y)Rg2J7s7{RL4iY97uo5g}7f3Hu3`(A<)N~wHcUQq}b zC4O^VT`!gT_*5j?HUlzu)ak_OFxJFVa!`&KVNwWEp*|`Dh6r?kd9|K*4PU;@D6=7E zp8#5z=et70fU4c7TW8kZFqxY(NC~tSa*1XLI~@fTQKwBS7g02@k+3dZphi|? z6sCFM^~{x$SVI9bl~hTEk~2~hHZTlQ^TSxO;OuQAQsrRqlnvBm21*V z!Btp8#xlsLE3MNm8t6hD;iV%Di4cnD^EppInfpxGKjsKSz8>EIQM=jzKNJ|K0a3mc z&Q6FE4GJ|cFE1w}B`2o}JX9Zw3@r?1dKT)03+|sfYXpUCM@=R}Vf?Qg|G?pZ*Hf`q`@^b z`Vc4x>rct?CBOx+BMy>_+yOs)o-dzZ{-cD~kj}M7`Oe4&m9mqV_drc))G&}TUX+rX zl?|*OA)2}1H*5ns%R_*ZoWNCb6=Ao~4tSAZfF1p6b#bFGE>(Joq=-`<4mU{d^) zKfE0>K6cSb2Xc_|YMWK#V@`*9h59(fTt4H{-Xx=H@pTbDft9;K7C^V|#Fs|~HTbr` zo{tg&0}{La+?}Ld>Gvis7Mh>0*<7+IrbvSP3t1k--DW~XLEvR9NkQeGa$`dyui%U$ z0E~zkLs5}nKCq36NFxRDmqiu;pAl9Z76#UqAQ|7k1-)B$qd;gn6+5-QBkhB5q-aTd zgfBCpu9y#prX-)$sJEXE>JeBkR6-g}9K@V%?%fb<5MI41rY+Lz%mZ|fdG@Z;QKFQg zfgh592^k>!)hVY&ot&KDuQvNPt(gEz1ThvE92uDU&JC#wYWghBsCYN4%pI4G0(Q%A zRUACwCOXq!`dwnt9JXk?DqSy|=~&)N;k=tqh9kg}+8P=AF+7Lm%x{yCxCh*MjTDEO zxc)EH5b7T8ejTNd)qf=fo}7p~Si7&~5Z7(l zH4^6rcm)`zaH6~)P7O{+#M*;!7MLS=R)FwzQEG6$M}&8O8jfy53gnGsNkCQ?Up~DW z66H5lsn_6e+GQ`Dsgakr1-kW?z6BBIl?9-XqO-6Cd-H8(XJ-=`wSOwQ=_CI3xNGpu z;{s6 z7m}Y;3@4wc!+~(-e~%lF+L8v>CNWS>Y1(A9g<|m2WFzh|hnMf!K|`ugK8ux_o1cec zC-f-yWVHfZq!E{g4tZ3%)aW~duE%pkL5Xy#w5+Tmm6{nf4}-8H4{wwI_DflAy?j>~ zc24>~|Lg4n@V6A*#=H@gTh!eE-4RMTfm*xs)PX#lTUrPv`OrEMNF&#&0$MdZ9?l6eK$L=dfo45j4~9flb!GKtnDFaU9gZV(6E^Bwa?%M z9)Zv&|LUKakIIdk^*cs(%jKq@X?6hcugD=@%OH z+4+N+>)S9gQITvunTc@_R{;Q$zWhGOD43-Ky8w?0O2ehKeF)N*REc3F+=93^S^BTs z9)KWo%3isD@LdR_f(WEK6m1LxZL8vLa9rTcXR-Q((C1xg(%brPOpky+aNhkd7dLV= zo%?z6X1@bl-KHRfqDh1t#Nl?ac<^3ww@1;{;c>J3;q7*GVA@@OT$AB^L~l^vB|D}J zEYgaUm%<4q+T0$1f7B+3>2hi1GoR0%>L@ictpD@Ph-}8^_1&W3Odb}YLA`P_;D+nr zu((4nlcKTT+ zvAxn7m}U$b)nY}jhOMkUH(nZzs?$3!!Ov$CpM25v!ZRKgYZ2v-PoeO`Z=LQvS2aii zbNl6K27aD*3W6~?EW9v6&B6>@e3N2QUqDG5SqUb?W7>lY`|_nlq-M~&$%a)2*-FN&Ctp$L{+I4CNj%>mG zL{QpI;r``c^dK9pZ+n`wV@}4#gN4RNegdahYZlmmVQ@AQ2^ls3jf+R5pNu_C?>IKqOT9J7c!v!N4K?ni_jl z79KO7$RaYO#m!BFnQ%{g- zwVHtR0}ajt@x8%z&i(9>kpFx^4shM^QhHykF1$Tmu6S<;0HT@eXZ>D)ps%uYpHHVG zW&kk{#P`y02)n6;!NBdWBjUZ?nbAzWo3BsIB+VKaw;G~=1eDyQA+;U5kCm(w*u0?+a+ z8RhXb+Ld-0N@D6L{tnZO+sP~rfA5{MH@6FtDE=yMQ%X$3ge4wZ}bk zvW~{vMpkE*R@;{fm-?ifRl#&m`lIu9R!3%~%v$&3nF6JvA6LC!1R?{Yef|Ze?s3fD zz}srg%sGB)KCOhW`8HT?_5_D_i}1J}uBXy26(+&iZn;LFiks1}Qtt%8{(xi(0af7I z0i!~3u>PL!1kR5EVVM5BNt-UlXfXMFuzliv%3(EId^qc?b9c)Z!tE-G7&g(>1-3Dd z-iazQrHB-k0e^7RK*lUC;CIu-${?^>Iy%!YG=q=v2PQtsjd@PYMT`m%f16ZJZbQKL zA8sE5xX9;oL~GjyJtM5LoqL&bP<)D^S2%~@q0ZJX0mOGkT={D2Q*X?6>`Bc zBF?whNR<&=rFw5f0*-g{B;LdDhbpM<+uJTqOpUs&`;uJ7o%7XlqdC8i@Zli}!P`-j zZ#W!G2;ZE_B`2<)7J(0iT`JB4jRxVX)7DU1N(+*J_D60av$PAL&s>hH@ zv8>y;sGi5+OVFs6>($Gi;Oq1%#6(hrl$4}VX;<5f$Rm{$lLe!SVKOrVT8!Bwx)pqy z-`5(7Es+(Dbk)Sf{xd3_v&`ZxXs~d(d+cmk`D|YMHHTi zM23i*4`^-kI;h+tw4Q7D=A^-u^Btn;oKJAdy+j6mq@ETX&iCdIrb?OoM#I68?;D~e z@m`wm8>3!39Ryn(R#>3QQ3V?1NIXuX?OZ(c(>X?_-~O^AKy~dqN{x(&b%XX%zid)l zYw>-1SOcaVQ+l05!-^D6XB{<+t(l)%2O160MHCTK`qj&+6KCQy>VBSm`8~e5&Q&hM z@0^#mvwnY&6do_&gkn!oJ$iSElEsmp~a}K~|c4p7DH_!=;b;p=)w-G$w<& zxjBKLlgoI#VE6R^5YSXzyPe}u{8N2#C|mdyBkI2OVd2oXDx>(9SRZ77%jj8TwoB_y zgR<-Ov}(`&V*O?1D6f6v5)dwlV7Xnb3}Ovp68$x!$sfEH$s8oN>iD{7{hms%WWHEs zQi%U=sJ$+=T(3@}cSkfV=5)Si(ju>`@#oQ^v&Hl$U~v%qXgW9sFwsv}&>Vm4iju@o zNTrph9;!_!70x%`;0vErM&fe$+^#zbd%mpC7!|tL?dS6~g0wKVw4Z;3MyUZT6YVb5 z6Hsudd(Q)mgbzkh&3?PM;Uwe~67TuDgH00(Ic!#=f$~JsI=yb6!}FKVk2fSjHp|Ni zD={-3(p0iJYF&vNQwtEe1{`GlXuG7~r8tpzhkOX}UmSO=D2LZD&gwqnM`2>&0 zb-;Fz=Hfn}4r`t3#ejBzg5pOE|2SQcnHK!o1>TFs#>TR9Vx+Q-YN$ci-*g0>_DB6b zUhUVPYvy*?WG~(bd%PbOA|WC5wSH|da1x*Y@c%2CIbxp1U@(Qp>hzvoFnBbPZYKFJ z4jdXl#c~@TM<|j0$mVjx;<`Y5Z#0R*o+~rxbd&p4(~CGM+K!KM>YcyK z@NASI-~xIYdA%bet_-kJB=X^t1*51Xm4&Ba3}Z>+u-dj9QpzA6DW)oFRw=ydg>G7f z9K4Z{q13;be<0XNyJ1SuDE-*0v+uDr(OfNSy6NPW{Y*2fTlKDzCNQ*00_M){KLA zW#$`~;wEg2@-Q&914T`yYUV(|H3SvbYoQX(51E4(UMLhn{z269MFW(q;d#hlwnD;?!i17!1fU*64(0J`pvE)>%m{qC+Ty0wYNU8MgQ>mR zhQn)m%(MZ>P_zROgFEV|5Uy;Q4vq+`L#XG_fT~pL_Ggc8Mr~IIf>Sh8D_$z z`v&6i1nYl32@f`n57oS-4>6Ns#(*P1+x?x%f$!hJH_9=bG@J`Sts#TmXXD zw)r5wJHaD#wvYm(E?6|t{)Dt8%0M6@$q=k45}$S>Yz(5{jvurkQEvIecXw3Jrm#IJ zCQz-Ca$y1DJ@td(cqcHT?0&t_ogZ%oJCpyBZTrn z%|xI4Ara=po(qUNO4w+4IIsrlQz~hEDC*T2`Y3)H&r{E9aEf+(hdBY@MtvHrh-wsc z6GTX}Tb~`@>Do4o`9u9V9cQw92WkLzsu-f-7O2r*|K==9 zh>$hdkRh-jcpdx5?vf6+!g8Z%g?us8AT1a)9#E!V#MdEoU|6lXSOl=8zh7BF$<_y? z=(%I45G9_0q2=!w&XB>Izj&|4upE>KtYENAXaii3`B4H?_I))K_IzKVxLt((K6LA9 zFh-~aQhZb*0;C2Opm{K_6NY|)OEZ#8AR41om@KKXQ-h>jq`Es?gT~hK`3NX5y`7E7 zDImxqXg|6^^8nvZY<@AS+>=u+Y)}`L<4O^_IlkP3p(IAosdkpz#oM>zD~EO_MZ@AD z+2jl!%z>sA^1n=crl&ZNPRa0Sa1#Tvl$!Ew145`J=qXGj%$i&j$FXPTp^}ME_kf>5 z7%$;>GX;lQ{a)S>dgNG)WC)9+H_AGb8HH7#A<_1o_g%(z3b*OuJQ$7>Gcmtl`GHn9 zr05tiyDo+*5H82CEEaVd<|z!j`jKQeikm}~O34olOo z6V>A+Bh;L57nGqk5G2T0p;0q;@8FIl7$x%%ws&4W-YAol$Bc2lQCz(pI z4DulOfg0KmzB1+I(S7Sg3II{enk&A&HWD?L%VF_; zoB&#|B&Bn5dj(S$Te@8C18wzB^ObUt!Qg{b0r@eCCnra_Ic#RP#T6=)vYGS09ruQY z+8j;76+B!4yVvl;<1tckls8*~5TmQU z^Z)LF?f-D(VwT1-xi*nIUEJz%y*j>umm@7bGTFFez{}zDJD#sV8;Q*+FQDxwUNn_O z)lCrWAo1f;-kgQ@&56?}$ z;4!((Rv!1$=le(#r@LF#1^r6Zn~;zYoM!75>kS^@c&+>b2h?b_+B9#VzTs>v9rnCF z;6S-v#8t$Ua5epJ7C@r*y+^!SrI^63P3Qf{IY611nf9l#yZBPI8ap$!I;WiIQh_+K zoLDG~W4Er??SX)N7LU_)Uta6g<;}!h<@k+Z>*K+ASv=mN{rYc>X}oUPOQw62JajZP z=l#({VNs~*49>5z8s6&-DsA>OpEk>hs^srIo%@-T_dZt|aJO|27Z2yaOvdZsQo_Xu zO=Jh^&`h^Pw^ph7?{F+GrL3=tTS@c9OovNG@#Ca5LpH1Ha+}p-v51@w2dz5W$?;C` z-f$dixySBF8JX}kcL?$n_4d_8?1P+SNHgZ%^$Et!C@zzdy8qGMF(#Jw23d z(%z%HALtHO!U5>;?zs~Y3yKfh)ch1Rvd?VbzPi#YsFrX^7a zd48{Bz)la9;cp7v?7@zm@7vReML_=6Qmt#1gGF6(Vs!$rZ_FP~)ljgclOXJ&qSORlu1W1IJD)xWOv%alO8{FR@Z@!MyDj?E+AYY*8}9Th3kLlin}jxsOo~9k z@36TF&`XHl&L2921ic=>r!nfcd9dGUk2xI}qoVy{)F})FyB?;t3a#lSMF=HBoa?7b ztDyG1J)sn|U30pf&j^-4#H3b^kZQ7=9f%?eHvI3T+~ai7P$DBZJ~p=5ZK83r`=>r? z^!!T%JMk75{NoeE1hq+K4&3Z-ag&{v`(106=V%4Z$;-=+X!B+yf@fx0-r&EotghuB zu|_+%SWj=rez??tF>YQT2GOLVtx(^u=|b?_sgny&lZ!#D za;cbX?_cU!S}g!bS72=hMwDb^Lx5koT5`u&3YHwu{sLooiCoV|X0C1~QV-3GKp~5m zCfg13se5cu=zB((!?*U_bak)ia%%X)NxOgf9YnfC-;jpgcex!r0|tvAsJowqj(gr! zYE{f#wB&k`1o+4zISpwm0GhKQ)!{0M`6u=4Pke%IW1s z=U~bze#?B*{PHpc1Y{B!wzgv8aYph;x1WKFi;cd%zL#}D%062^Hdrq3PNbwDgLnts z?uFIF=+*j)Z`&fjy>bkIxBQ)2bnDR-0jM)NX=GUL8Dm1l`DoZh4Qlk%dL0Mu+`!ecUY-%WV~j5+=H&D|t3X*iU{=W8bPbtb{L`#Av4P-D=@K+Nno^jp|s zI@`%uX-c&1M*1u}4#`w*z=QTOOZAIUMRg6Cs+N^LtAXp*0bFW;7 z+w}1luHMJMe=hoBXQeC_+=+TWem2-`bW~!{E>vjK9>e|_8A8P30!iv}T9E#!A2sk# z?CjCqPj&~QFN7Uy6>JMDEAxJyHQw42(?S8;k^0I>5#yz!*KrQ&2r!LsxxO+UR{5nt zS=yVD(7?=!rcLGYyWa0FjAv-DIGbtQuhyvx-VLAyLqGZ+u2|IRj(7MRXzRu&bWf_g9ZWZ#IV{k7#jdzr38SYUI2Z0N~ouy+T*7I@RGi=ox%*5dYdKaY%$ zjF*Xl$MTb~Nio%c917b+#!3enWQrr;Z?TxZyz*cDm6eQk)dJ~MceT~)J>FsqJO|H+ ztY3#&MiBBiI2>fAQd7@X#_CRv!NL@he$i=ZVF_pOvfsQ2@B`EsLI2kf6%AHvcDu}^ zecjg6yVfneB*zU)tunco9ly`WBNW=Hbk?VVR0Jx>cPh=dtn%;l{&1XPY)+Y8)4ZRs1)Nk%;8M4|kAkZ(YtJ{juU3u> z&N&?v*WL)8kCRJ+HYwC#E?u|)pjId_4gk_ZfV*fWit(35jjHF+?;R6~*wZEZ>qJor z|JD1!Rg5Ygm-GA6p)n*kKL-GtMjSit22Gr;7_8Y6AP6A+Y;~H8L!N+z%4aZ?!C0Gi zLRzrt^D*-tZAx8(&B-Zcu1Bd(T5VXV>*ZpzLa&CM%JtJv&LmAfKIJ4+tr`18-<95{ zfJs3@K1YhT`wUsN1`Ay-e$V&kWXw9=-Du=WMH2AssB&jk!Qm`L|V`mDwO_CG(=F9EZXlamv<+E`oe%N&y6WZvCsBpRi!z*k4} znc&NI^7Ha>W0^d_A;tA%OixGJ(t7`R%9;XlcJyaBDp)ajL{yRa?-WMcXLTTRA82jD zWML+hAXrhi3Ojj*U2muUVc--fP)OXmySJ&0jC@-bM{&W3ozZZJPeK)B143Mr)6}DF zZWnz8q`(>M+jFpdr|%eLUiH@XMrxHOtHs2d=Ng0bOvWzBs1R(y$!Z3xg?tWAv-{O% zMx!|ax7X?st2`dR=Y{m)QJ(M3<}OkM%B$bpuvQ%-pF8(mu)CmUuQk323umMlnT!Wj z4?@;fjTXQ4b;L*bRCZ_5MZ2Hx)>IB4TH0)}wLdIzuA9z!++);PvVXBVE=TEfzZz@v zdH`ZFT=j!-AkTGsp0}6`mP9){ezM4RShEaED`;hi_*`8l;dz{Xy=H@HxXz7t47uFC zhFgrXj{9$HR6p9@dNrA(6G#5JevHoUy=)RCV+4*$+>MBHKjCv-|A|V?>Ujg|-kf@! zzv=QygnmtWSSzALY64AENhtoO)f$>n0$>4Bwgo-BC?^H<}@* zq>ws;Ry&{sNU4x5Co4&^1OGReHv~<&$@lH?s%NbUXfK~v)3wsB?%maCwcp;6=UuF} zLlaD0H1X!N=y^ZU>$N+L#OX=hz@~FLJ^q3TB{WyX+i0~vYRT(ezXm9g>NR?eQMki@ zWUzm#`?tFt-12v}jua0O3b?+n$z}Dto}MiLI@HfUEQl6zSgjF;VoZv+OFJ6f!l0ZJ z<>gf28<$Qz$;rw6VAXJx3T1N@R+-Ol-*@Ge1K>Eq`qh=BT)CJ-<$lTHL&NV+iPYEE zGdse<MR8hicDeph~Hx0w&*%jyFO4&l_?9=2?@*WxbZ=tW=2+ zB^_ZU!+pTW5y1&kF~Y_L@Rpb& z`CyY`Im}@assoMN^4rO?Xrkz9&C=pwPXq9hbQH8yRM(#LQa|8}af*ae)jrJ%{`A4T zO9vWh*l^&Eg0WM{4T88)NEsp>_mOV0h?gdbVWp}R-`tkEpj_ln87`F*j72i+Q`1(tyVLOg^C z^9bC$uRs@1-dR;N#W?InzgP%tLvFh>~h(jpZ0#@@2D}N@K-|eD0sh zh7tqLicUWKPrAcD4suAw7@p}HN01iOCFvypO-kTH#?;g%|BgMre)JpW6LBK#paliJ zzjpyz?t-CDP${gfjoqzi@MVc}#1P^_?be83K9jT$zvqs{`fN4J4zpWD|VM3Aze>(1ZRFlLc6oN3^ zZsZg=VwzudGqvJqWpYkjMJCDcf66edHVb1znmRbA_a^Ifo23DlXRgJq(OKUmb&}CK&{XBzgYl1fTOFB%i<7m$W9~hIxhHS ztIhdywc7b;3XqNh5n!I4a{ikkH2Ta|5R$-W_}0#A`#w+@1|ktjG1P6?8_62=2!cxW z@=)J8wW_IPg-6S+f|6>X*J8vALa*XAG$j6Ic5-?K83MMiNndzP#IFB z5typ+?%wK#|5h-7%RbxecDvv~u8~fqaRmgY67d8;6Gcu+3b>drgYhnBw+>6dqkF6M z%Ibxa=)-n4R%1ER+^t5m!8Z_6LpcD-wo$2;b$nb5fVe8Ol7}lz1y*aEV^34}P*L+d zZdXcUv!3B@>*XQ96Qu&ckSo5DQGL@%ShZ#$0CC}(a4^)+h#0FmF1MG+ocWW$$3$`} zjVgjyS4lJmF1Mv3U=={_ZnarC9V^R~mX~vE%LekiwYv2reEu#jF4Gpd)CQ#xoQ6j2 zbhI-IhLZM+g>s6VuZYL-3ewHi8WJWR_SN0f=#>V(H znVg=dkp!~pgcmnrt>HX7@WL)O@4zMLxn5_Lx^X-qm*#(R%ClCZAs3Sn{P39`$@K~w zz{)6X{t>vK`2;jZdbxzC$rl+$LqorB&+xbagp=}6}vLi{3@klC=}J7F~}5}GZtQV)kx#OS%5*OfG?yUT{(m0 zK;L8MpV*eu1xkK?U5db(8Y6 zTTJIlshG>AzrMcKad1{@l-V-Eg%PrK_H2PxL|;Sr?E;Ms$xQ*DBfz^*OPyo(@a>Ewlg<0ng_ z1pnQDOhsrCuw1}GcxfL)Q3p*Q3PFa6L?YxB`1z<~-~A!%6V$0T4n?0epCM?n3Qg$u zc)DL9cdAzOqraNl+5KXr*Zyj833F=2?|J#aXZmznAWzVBHRT1~n!`@L)RI^Y=`Z>( zJi9MMBKNv4UqlD_4C-vy$WZ+(!6NmV+s^>ZmS+n5^?bS#j~8ffzDB1POlR{ckGt;a zss%e7Lfp5hEc=OcR`>TRv_0M0%96j5fUYXCe8{X)Vx{<5qLbh2a6RLM)q>9Nt0>R? zyl!h-U*##*+jX={yzWo&kc2olCS7{(b!_V)W4iz2{cIkGf6WQ8ESyqE3}~B`2!N*A z-~n_BCvz5d&rT}(`oeB@!;~_cKs|4@tKFGVuj6(hEcS}-)ABH8h1c)X@lL@2cuvSg zs}9BCLIzvf3S5JWX=i30&gJ*!z`8FhrWhLOXcpQA$V@w=Z`!RtZziG{m-S|vYV11Y zkgTE(UeohI#E`I_j)>aCNm8-yFU}8QoKmZR&ggz8;}W`D+^grf`{i;7P^(m~@~UYz z@Y!kLol{BDbIY2$bm-7!D4UzVzcm|QuvP5!DY=EMzr^YkRWnOYcS}W;IxcN@{}Kq_ z*l5to8cQzI?QyDC)aIFpt~l!#LQaIGV>JR0^95#A8~_8I%j4S6NjZDFzwt=E6obL( z#VM?esLbrH^z!(*JbjreZ3Dk#xv&T?pPHi9!TPm?c7?mW2hQwoWWv^r-$Q*O5T^Ct z1yPPc*4CTbLD*Tmw%jZL2||sPZr8V0SN~NYjL>G|-dL&ZpV+$xr5O0c)ZrcONpprBA`SSvTD@SI;E&Ns{C6`5TWu}@yvpbL zx#(N`e7Qa*HSq9_cz9s(7uBMnTR#|Z>v1P!UNye|i+7CF*BB0Y1a}ttb!Vn?wuP`7zy>Pv! zwpdUx-`*YOetgS4nSIzp+T?M0cBtw2mV5Scd&;=9r^ReHjNG5(8zP|)wauoaV-;zsMsGgv;o?*|-%^e;O73X%3d@LN7dldam#?OP`? zJg)C;6J-484YZX;IAX>fR;K0#SzHGT$&~TzHZ#ZTE76s#nP@BXBC`x-*3Q|T4k)Fw zL+J?*Z(qxAa6&avwqF@5HxKTwcpaT8WDrV<=wguKVvrb$LP95(cE}hgvge2?Ntc(G zhb}(dCWl{ZTf|p?ymxw@{IB%$)*dE-o6sZ>OHrS+5u!)^H$Z$37dluHMTQ|2*Y0sp zxZ5<2s$1Dc<1%r|_`H?S_n-;y+RS@C3nTjt<->!PZn8MY8~?Q7PqhE@r^LbzpYQ4N zLG)2V1U|2$`Or)vX?U!nO$%k7t%WiXcr~}8c^K(ub@c=|G$QHBW~;Y-u3)QFV`(hT zmZ0aqd2AI6ftA;ra6&&ae)>kAm4B|*i_0ChWyQ;eEF$S(+Emr>Asp3POlGGk#G+w7 zpDz}+t9`#tW(%%x7o zj$w8R7A@tbT*4GAF?Of1j;yWX#oczJ!(>|6T{o}|EYt=ud?Mr64UbKv#?VK&8C>7)`6t(X{HA!IOgt+uFE*|xZ0^ucOm+MEN`xkC%RY+cvRNsxv5(QAU`q+-FWG+_>b^fu=52lVyM9K= z8AC8sHgd8gB^FE46fqW=Effd5Q+`{%u}_!$5Fr2?D}_p_TYK+-pTEC$pu569} z`>apzXP3N@6a*|8$(kBSY$u59!*`pqL8WTV`f;lYwW=krqUiwrx+iY;n}53ozxcNb z=0#wF&?j1fTEqNFrzd>u3(-YImU?#6*`aGZps#+3$^ren*00y2?)myoFsOeYMIyT zb7JUKw+_(0Rw5lSH9M%$YCV}9AsAd~7R1^XE3X`YX!qIqcSAbTB)NT^7<{%=U8i63 zc;348M|gE!3Qf=Ms7cG7f&vpqz$0M9DmuMTV+-^TTnQe3*VhejxgXEmZw4x?R47hk z#M5n*wf4`(nms>Uzw*-h9>{0d_|XwgIzVew)n3fy%M13Bw^OXSc9FIM8VpePS6{=pb!BB1J)Hi+F`Snr zX$F@s+D{{SmhIOc?iw|^dJU#0#(&^HUhfoovWYkg(W$}@i{3T{)GqHjrDCL#?r+MX zy}CE;ugfES!(#AxOz&?7E&N`rrM50VejwrUm@Mvh1t>JEkcQQc!eqeIiS2&hS820_ z4Mt~@6u~MG*8S`PwkP;pE(iuLIUIMRJ9;J*veUO&E8H0X-f+F$qIK?K76Gl_8Cd7d zQ7F_)wFCfNg1`H|Z*H9!L$1NnFlv6Qj$4vHs&4#$ zfGzVV{X_xVaagR{*j#S8$lo|zWTWTdk%%0nVZQ6M?(k+Q*j5#aH2l=2EVte(peO04FSs3^TC*OS@IWg1tY zqTz^dJ8yN_@>W-Y{G>l(`JEq8g+(G0L6`)Cgt;X_1-{(+_iO_sqj zhprnRAARS+=U5Nx_6KnA89K<5!_Mu9P~{u8ifSX4#VQqyas&)%8vFRzWOH(JW4}8H zcQdqmNW=VZ7J%u5oJIR15uc!wbn)P3c-V6nHK*3&EZ&4<0i_`y>rMgj>v1l4i9%C? zDxLt*(|9lEQWN7QZDYoQj>k>3UcYtxKweVv*2|<_J|BviAe?hJZjdINRoy{~1g2k6 z&kj|X9JU(|F}!m5LOyNqg88cRxz6p2B&Mj@eFu{D|gI?_p+3M=;8z&7B~ zkdcH~6^?-gjqNdT#VnGEjj~yfF)6^O!(ihyj#12go5D7M8vGGh2!RXo(bO5Zq^}m#zz86#qoNLg1pNUq`Z1J12Kj$9ol{_3T^mMYCymjlv2C|8Cbo^X zX>8lJ?W9p-O>8wzW83zBzKcJ1xeI3I?DyTzv(_Jua5Ce2Ju3`~0s@4;Q5*_PapjDV ztl+qOF$4(JzHN*S?qD;7N90~ut9RHBT}&g)J{<;7L6XDl913x)-MLZ;tz4F}|D9;e zU_OjTP~RIeBx*Q5Kc3Pjt4vDXZ_;tJ$K6yJBjJ>x^7^GpSV1rmXeAcU(C*WEs#tSs z*ku$+|GoqO_KJXSjf})GXh`1m=L=yO)Epz!%WC@=dTd<8so&Wp91xA!)8&FbucFA6 zR4eruHEO=-yj|=+gs!oAe+$pc5-T<*XM>aJ$rhK3lJc{ofrdo2p-YE8tV@%FHmtj3$qYE6r31ptvd`tFm~|Ahc=BvFd0|>fonhA!Q|H#gKp_CdDW-dHRy*r2%`lhREeQ} z==(%9oAtIUL-jLrD{HP%1 zX!7SFO!&Mb5W@NW^uUan+aa47BdE~di3h%;oerxo(c(`t{thg`DDp^Az|_hzM@UiF zX2MRBYD~fu{k?@i_EpRshfybK6FT`DC@_Pl4!7)Y>Rbf8Q3zY23bYRMh_npdkQ@rq zk6NC&3!<+l+{2q+jedS*wDqSuibq#DkzRV{N2=__2ibw3Z#c?um=KM3k3lwKXBV0H z$-QJ0nA~^L5Z#E-=%B#fR_#PG(GYu+!^3KrbavjYh27xs@Xrg3F4w-kimx>(AJCY7 z2@vmA1#Ylkrpb{Jj*0#a&_yAUVx*B7bsCR4BdOxfshC^UZf5E1L;Nq#_$XCitD-t?M_RxIOaaFUB-fJ#I!^czB+8TK5qPcBV3lc#All z&h%DwH@RCU^nG_dV=Aq($zyFi?*Or&mswo^Y-7jj3n5RIkmq1acw(FD2^9x57UYg` zJxUHlmexMJXftd;I&^jPw{&L|r3S0;@Eyy^G-1o<276!_pjU5WOw0m4+ew7HrpL>% zeyCSwr5=Dk-r+6Avp8K=htXJ^m<`&tqxd*Xu(pG1rO2x+FL(g!yGo_bK(oaZKBv|6 zG+7_8xFA3a{eC-28i6?ykg4+?f_1%km&*vbt6yS_+0Xjz&EL<)Dh>5>_;jHW=9u3q zH&wObh5?1-T_(4q%B+QaAelk&kL;0I>L?;EtJTAN*hEY&YmHy@#z`aejC?#(hWSq6 z-xH}flUghN?7%(r-EQ0voS#~krWrkm=7t{CYY&D#!XB?d5nL5K zKc9`34*o3T$S-zt`^D*ot%5FXk9p;duH&ZwuFdr5H5IA5U-2uAD9B$}n_TYu;32Dd>CeVG`r6;JE&Xm$Td6 z9@p(Z6a#z8hkh#If5-NNyFG#MBun5*&&5;=P&zH>t=TXYl)?M!w&f}q3ETQgiDM0r zKKHcT{@ZN(u2H2?Y|s~ia4S>C*3+^2374_EbQC!DJOVf^JZ6LA^7|<&8fxHou(`4Y zJ0IQuZ~!rKpjbDgTT58PwK=v7+*8VkqQBp-*aDiw&9TT$)nB6ik1wAWCV1_wrv_2| z!|GgC&H-ZBD9X@PeMMOSCPZCzrPG%tFyzTzBdJ&N_Y8b0zZzFECT!8qVu9}+qw@@S z%zBq&HC?rQf+9@IUTnImCVDYiRD5KTY|dL#xE{L)dxVjiRoYEnSJbFKPS+ZQ6S7r{ zl)g2u_{Tm1jGq1B`mN6hSiAHzi-WHx?*~Z`GxFLR4G1iHWsfTt!Nun8pog|?mJnEPs;=x~}f2(I#Bv)!6@0q>5 zpRkC>FWN4rC+SrvtVwcb9w|kCv%R&pQ(QB$>E?V&zGY}_T@JB%e)~4d8pK+o%MxJa zrDF1Oz)vLTvOAg_8DT7o!6YEW!NY@xl)E*hzGK1w0H9X32bPZrs?(N&`gdm}B9xY( zmeBXts&V(-3nL*v4VKOBNQ$adDa}xP;#_a_ehIlFM8;({C@_O1mjQmTp1AsBl%H)j zhen_63O__D+2Ev1hwH6f`9b7nG6S00eVkZWSYkRbSEQID*TK$#bmAXdm5PQwfJ7Rr zRB)jpm;}jYqxE5PYX<FmynTKoNzWW!ty(stJpVv^T1C~b~(vGF#i`x7^I9LZq<|6abm%fMz|Lj&u z1V6-|C<+KP8hfO#!2Y|J*7)@i+Xl(M=8`#7ezw)bkuEKH1<}7kTrqw(dE=eex_{SD z)Asvp*P5!L2+7FU+g@c2G7U}5a;?i$ooP%_QRC0%Xd?-y-#9JpM!X@~9I% zge)IOm`>q8zTJNfYu;6I!pMty89{U;xXZezxmrKQn!HgHE+gwo-}|71lB5$J_8W zpy}Iuo0_Q)SZ;-s&`6`pig0Mw`MISFKIHFhC}VWrF===8olni?Ht$^;ZvbVXMrU%D ziVdaigWsCuEDo6URETWE(jw@`0(O*m|J}tPO}0|XEO8j=Cgga~5na7_bwx!*b+)^D z>Q~pBGY|=QRe6;c3?Soafn9!i=m3B(8u0smDiGI8X3!0>hqmWUI*{tEQcfV8nPGQ$ zxZt}4kUc;wy2>lKULo_d`S!DQfub*tuL`0x`+y5*)+w~_ziL-e5vBYrrFNIFzJiRN z32;p|0n~e*-kLXkZ3~9n$b}Zi)smD6&!yk zg_!_%azJIo+i38OJRz6O;yHn>sOTSDV2i5iI@PsyvQV?!h)l!9tQre* zA{BD#u6y%LVS0-mN$54R!PijCAoWnzQ4B}`Lss7XQw$kFCS%hmF$;%;Zdqs zeuG1ceekeTxzmXi=6yTgxJkx|^kq~k8Lg$WMI+)gdo7D+GkDlG^s(p9va7rTrmEQi zd5uEJ-;mJHF`wDoMwgWLWRqX_O9#G{AQWKslu?Bo@|6DEd3XN!Bje`~q%EP28Vvvt zx3k@C7phf-up@@YUG(1&xEk%OUKS=$FMe_wpSG~Qy^t=q{d!3GRi4TYEFN6P(-2WB z7vGKl;@xJ<+sWFwF=9ObNUiqXIOK4j3A&X#NM+Hl_q^zWh&&PTI3CUqj8f;c=Yk)n=U!`NcDF=%1i25k0$}73bHd`nqLC3gtX&NQus+a#h!I@cU5g308aS0 zBISJ|TyQ4FcpOhJykJUuSy;INqFmxFTFnl7N#z_Yh6*3svl3wDr=wRuq8m%Z*YeR_ zM-jR|p5}PjZEQ{W`rh4ws9H0YH}9OEp|?bp%HL2yt@puf>oHRSmTt2c%%{kGBWKT;T_x zCCQZbFu6QSv*G!$Heack%j@oOzS^w$-lg+ZyMURL7+uGVI$PNOdM4O$!}sOx1sQKU zil2eT@?TafVe>gqe?RE}l*C?Lkpu)v?WR&_V4jP$U%E|8>V)K^Z4CAD=&H&|k1Z|a z!I8^hw<9m4S$v)YN6`ZI&*K2|smXfva&pD-y1x2!xzll}EdC`HBdLw}|GNO9=kqZZ z@Z0sQv^Y=8CMHKWBElLfs}B};ani{?U?Kvp(mEXmo=JV*e=SGseLqS~sd+qW9uTov zYv7wCq`(+Ol}CtxF3oH+_^tBo9j>}7Z2jv7D@x`>N^*9c*AolyCj8gnJX9l>V%X*u zFEis04ew*{x&p8yDKg@HuEyK;z`vip0Y(|Kko$ST#1`kBojCHDpwp>}WVL=ub(YZ6 zO9T$M#-Pza#@&I zNb+>|uJO`lCxh~lzB(PIFU-BP3G$ir=6d|?4(aB|QydQMeT0!uWaksI?p7%zrJ8{m(X{8PhrbYl35x2Q#HuYXxg zPLp}1=_gpE+q|F``B06+mTgEN;XvJRfVR<(Ok2uIv!!)t z%4KFc7xffkZbF4xeFYj1GCU(SxQ~U}TZ>pTuGhPlMAm z_O&{Dwz@jR$FGI7b6aX1_6F8W+12IETqr}5BhxyNBi>e_7Y55?V(FT1PNwEH7Tn#X? z(_j+|B*$v|k^+rU$05&?1OYkc7nsaM!cG_t#74MXglD5{Oi8NrGNgerfLW*=!bv4c z;3s=azezo9)!V0ijwy|)ZuZUJVj^3KvGf~4D+8MU2i_~Z>}E)*hB}TcLzOKpr!Tp* z1k+}lIINRQeM5xw+_O$3+&43?YCw`*B@xtZiEKrVk(4({t4^t{j-v%7!7hW4#8gGr zH=t`H&Us3UI_b~IhD*%w!!C(KRm=BT6CHO=E%S*bm=5uT<#dHgrcs-I!rn%KHvf{c zo>7?|gA7ZoKrexn|1>U~c3yz_dZ;y``updu-}aMN))^TXu(PbdAP8+50ip`-+n8>b zTd*YvL>KH8&_gt@i}qdcy{_S*BD{e1X0h}145nybq!tI z6g~4R3vVE8K(|~RJb6EHG7Qu;7drVrlg`(Z2bu&wql^-Q692p6Bps~22rM~LkX&+0 zIJFl1UxY@r;4f}k@}Lwd3H7UMek~`Iz)WhYEDUHJkGEt>-EYCFCaS0PjH=&2lfN;8G)`I*J+UQ=VmV5~_fHz}|Yxub*=Sc4%jy4AA;y7C`T^`hVr z-~%)Z4*G|{ zGsEn&7)hYh;Z+ovm_ULzj6=a#35<4(`2=m`7?Y^-G-S~pmhGGEx&$(%tC<0I`_>4K`w*9Q(-89VIm-C2ay1OVmI#LfW1lwESpL%RWN)l;PzD zjsFL%?DVTNCAn@0)i<_lNCt)AbW%bk`tk77<%=6bU{&1dB@=sS%;dnwBt%0az%vV# z-&2%NfBHj9RO!n!CeVmWPE5zWJ)p10LAX9qUPC6*RJL; z4IkQp?45X{D~{+rUaVOxnJ@(c+wbZ3im5Dy-)8Md@;i8ZjdK?_5MZHr70fWl_5Cs? zn2l@5*ha8Z-hiEV&9iSc3=ucsmf9kxc046P#!pB!2H$99f3c|%WNvG_DaR?nC%sTS zl?3D>Y+68n_~P~+Ovu3`DfsM=W40Qn) zkNh=`=?@pC3=y>|D`k<%Y}%gyLRdw#BU;(`^Ymcm03fr?k5-hb0gQItbE+x{{GE@z zJBq@}c}hLCAsyL^RXS%QH2(zGOQMTpFNN_REs$Idzyp5rSmiBIOrD}%4tgf>G%G?c zR*@F$h!3a#^0zv<)GR^G=QSIyicDKmF0%D~7NJoP)X9)fDlaeo{(f1I7U7x!qMJ)^ zI*+gssUBB*sqI~_*5SP)?CPy_Pp@57tG88Ir%JS^pWx7&!SAQD_Jtt_`}=hD6M()z zc^Y+Xw?l4`Sw3TxW{i`Yd(y&@jT)Y!XGC?-_iC9uU0J5YC-+n4eHG)_R4|m!EH)2T zxXN?oJ@A5BBNDSTGRM2W^_?|$^fgcyVes{uU~IyNZr5mkZD#b zpA2XkI<}kwI*PNHy2>WJobM}F=`?xi2&_*kth}ymYs7}9YE@?GNL-&?PJ~)i(zi+G zqwaXOO-+%hDQ}Pd7K%P04anm97Aody0)z>T;`-`fdu%G?C1q?{_(lL_jCLrnnbY>b zf9le_rcKLN?z*UnY1)BPp>aOXp{%Di@t^3#ZF}fcC)~5Mm(Tw$uwf zfUK!i>_)}>$b)Oek}NCY81rM$taiJ4O@|Ie1L}@6=riWa+$R0CN3$j4S#K7>vN+b5 z1alX6ng(Y&6(DW-S^G865+_KueCpt3Kl8!@kWqR+H$)RI0<}B$%gr7pod#(Ig~7Ir z5VxyhJj1is>yu88NuQhFaM9<9l!%eu9NFOGk5)`SG?+j#d5-NJtc@%I!sDdW$g{My z2#oFHhJY=*vo>b{G|Tb*n$v5MNxR-^n)GW-lhKych41B2@eSTWl|lHSD^4c5S)RX< z(bcx$M!Jaa?jg{RN4;ouU3qrC=xX0QYu^8@+jZKTz7rZtWg$KEk#o%^=o$$aLItt(SWQeLMjsVQMLm*=OKi*pgLs)bI}Yy}#g zO>Ozd(i1;29PM(Q#(#aEgl6j1E3a{6NrgP@);nOM_~|vO!ej`7)XG)f>OwCz>fHNM z^gUOEAAnb5e05-F<)1fzzeEpN)?(z+zP9I}B4=!#Iz~3O)Q%(>F6s90odB9GG%=*lyMGiHt(UM<}e^Kv66Tju_`nwwD|e{ zuKn?xQpEFK?t1&v>hm$V=9z7y__sHhsNVS&x^iTAm=y#lHx*6BPojgr~Gi49y{vQW{hrL&)ug&%wx2xGPfQG6UN zsQ7g`b;=~vAyajQk)*19;bXR$ZF6SOsKKeIG}w8;N=Qs$dYX?4!ux2VWMKFsz6JGO zb$dHErmfAl#TqkS9h0mmi(r#hLOBM|dptLL;NvT?>D3U%5B49s9lxL>1dEERIC#4= zXfm!eI=(zdXQnXfpS!gFqEBlLRuk?4kACnXTD3{iIWDaM^Q6aKvgZBy3NaRz>1Q|` zA|rVzRwC{Tq1un#ky#+dMXOXc9bYI_ZXxN_)Bgx`YmTe+!QYw$7{`B#$kjMy%ZyhK zi@n^UnU%hES+}kou?4B*t8k_E)w$eN6cq&t5}l7m*ktJNlB0Xt)520<~xJFHkd7S)8M?256s!Jk4d)_P#4tAw)^m#(FwVjctEo$w(Y&$S#S z+OR_y*c1fVHxnTI~);emxXBi4ptz zFmcW3r))4w68kozy>WJuid9mtHvXB9b^Q^AX0p7h4C>|aNl7#9G}Q*-BQmfNI7s5X z9^$ispR=?hCNx=YL&YFhZCaK79`R*La@QEVhG|7NV4%F z2Q3vtuSU;u(eNE9wCCr=;wkV4YeUL2@8W zYA-bW7Ub?Sp4z(kU24U!SQfRsufa$-agjM9o*oDHzw^Vin?M5<>hyiK`qJ`aSD{8S zNm_<|MhQI68`ac|;k#f6=G5}trm^`7wWU9n8&hCL?K-D{=QQ{B%b{OD4m<E4iTb)^SgYjk zx}mGpsdKlwst3IHx}G3H(7)q^!+5o_dS9Y%SvTpsxo4Rju@)n%?YB06niV z<=_A6D5Rjmx|KOF_DRj^m5-a5(2-q2{=W;bQC1@Gp+aw|F)oDke!0Dv6{7n4Ho3~9 zn5&TccHg|mz~j~VBKP82V|Y8yGe*YGjll@=7#QbZE_hB(o812Yw`toWZ5<8pAIpWyvo|w1D=C^14%*@N} zk!qy|lWe&}u0xbn2B2sYa=BFtzMg-+J=r+9TLdnDRPsezx5VHC&K$f%doM94Ft<%= z(?^DH?W@H_KT{-OBKl|h5t>2z!rO&vLgM4HidF~Sy&Aq=feG2bRQ$3@-23oh8n&DU z-W`F2&rsFm`;H1#1o0vV=9u3IRIxJ>Q*jU^P$ntEA!w5k)DaRXM;%#mU#|N#Ax z;}By-rmuJ0FD`^!s;tj4G*xO&m)cZKxcid)M`$PDjU9ljgLAuL4*!Q+JD$fa>A#9I ztomrRaxJH|464wW+*(g87-PkzAM=H?H>p#(K>A~Xy!lXs`yRs8JB7UCX5aC{}2m+7c7mUkLOPo%Q>tcfvd|9vc8YYo!G#5*2J`t z318##r3r5{ZOQ59tJ2)(`!i(IG!92eR&0kh(+48nzrL5l$`qkKZ+ql{qY$!`^wRGG zh@b~t{-?7=S)bpcXYF`OzB{eaTt|0AOBLQ(kNV-AAr*ND>pWKC_-Zq zcAsv%dW?Y-4H2Ko+-1C}WV8<0hPc&7`P`wk_HQU|Z4RJghD)l*@OI)Zq|KLFpLhD0V{ML`s( z^QKomd~Bb=^?Z=$`?jA$-HY-jhLuPF*TjG!2eNr6a91O)5_u>r9ebz4;eEX9?|?1!7DW0#=v(M;s1b?h$W4C`)0U2cWk$vzqtOKC>GEhE>fO zcJ`T>&`%_+#;a-eSk$N_!aw>3qyLLN)#l!bC_Wzzs-udNy*S;b3 z@o(x$;=6F%p+i{EQ&6L5c+Rcn?Q2I){cA;LPuVtfu)(Gsur@x?LLmjx(sTL>rTzH* zs9&j=xk<{~$IimSuiQEfK;j575q(=x;nB*!>eouNdV(CnhBD}P_!spJKEdE&Vd0VH zBDD6sbh~=2+QhCzVu_e7HyyeeLD&NF7xd<^0DTJ zs1@ISIM7Z@I{2B24hN*o=g*ZA6R`5)G%nSwx#uD2{+%Kfi&}_VfRt;s9r^SXVuu1} z8Owx>ll0oN6!1)Wb?>)-Z_ZI-H<>mIP|7&8XGht^F5-~l;Smzr{#iD1QsVAzTz7Q^ zOPKcNqwhz3L1_<|Aq?>+<6{f#5!B8%8en}~iwENnmSnQHa_)$K?x#v;56{yN#Rr`v zP|6@!lft00cG}TKF+(t-c<6_|CP9M&jP1tw77HkqAR%(uLNEjNOC-)bhJ4jpZ6LHH zfAXND?WO zW}R?4*Dragu??QC1jztOQy`DHU61U^v{GMbEZ18!~ZLeDU-Rt8I1^b#*iC zUTX+D?nN@vg9|zOVds{oU+*v|vqg61OT?!5#=Tms2-8N@8Uk$2#4*ze*fEQ2%o1%1 zM)O36m=-AU((Jfm@i^l8X|#!yPG)nMFr6+KqLeaFdp}V%FRZ|5U&093sHgE5Do%)A zXrMO6DeYiM>J(f4F?qDFU+p8U`=L(vXjxe%P?fz(PQ&M6#L_BH!J~u@o%k`g8MFSx zgcAQsPl}3Awu2+P386&xv;}ox1A!Y4iHfiZGXX`DF*geLH(=-k$?wMNu?GF=V+L>I zTU@M!42K2cC-q@eDv0Ay=b*vviq=iEcKy0?y|jw{4(6H?1CrDPH8Q>i zik1U0j58Mvribz*!h!q}Vc0iVgY$C3 zdZQ3c*)dYS`o)}A6!?8E#P&n-Si|iWMCav4sGwJf1J*`JFb*(vZnYV(36h8?8+>_q z7BO42?GlR9*S1h;ELgiucL zVFqHC&mO5^1CPL755B#U+Hy2zkT`qXfXQgW9chx3x|-m7G-vNtZE6}TxQ9{B zM#ppCRZBpvAMYiH3Up#IzX>sV+_A%q?I=8sN+A8JAbNKpNII`&kjRw2iTOyx<71?_ z-u_f+KQJI#1vl&ey_8KLj=Oda!*A=6AH|=8LNA60;gU$Oj-Z!-7GCNmxnir8K1Z{mqV*ccZ6t;?1 zOP&`&XQy5l8n}9Nxru#yMWa)YYzXciT>JXo-{aTf%w#jv4Ynm5M})wFiYzJb+2r`+ zm`9U@B!-OTU}|F*kihul)uqHcoaR@S2OS?qg7!UMNjjmHdC5GaMP^g}8)^y^hJTCs zM87OzS}ksXD2q8?l>|be4(+%z^tv9$Ejm=oY&kuq=^SUY60H?JTw5lb;J|ztM7=94 z4+?%^0GZuJkxU}n&frAa%VZpesS0KyI#PMRj>y&HZ8;V)9;i1Rm-XUD)X6Y9x)b7> zZiAZ>U^Y-KoyubSbscq-2pH(@yh>9A1Q&&A81B-Weo@B|q$b66%Ol9*C#8$0MFsK6 z(CHO@)n{_f$ru7; zlLm)|!8F!6s$BSz+4a{Kf~3V*8ijdze0UVFiO{N6qiC5Y2uijBNLMs;@pN`MymdrJxXli-I8E zM@EIkD8RwNBLL6YXorBGzPt>JjLWE8&_XHG+U3WB4y3}A)^r-Da)iTe)0B8GxlHeeQ}v)Ju`VFzP$jJxp*WlBz>dX*M1Fi?thAED2hK@8ItNhnE@w~-)1 z1hkRNfe=tc+u{7fa7B^rW@gzP9UPsl_%MqzLtdN9d(U*<(IoMMbst5e21;=L8qbB1 zVGW|B3;*<(-Ji%)$S8NVdgwnrQXP!K*Zw2fJIZMhUw_2pu^x-&XM$nZiVUzQ-WH!A^V*XvnH7X@zE zcbujCi{I<>Mrr`Xk`CQrf;ofXiO}O}aKmZU*xSqfYLlby5z;&ev)os4ekf!8V<6zu zANHAa^7JHe1RnfIgcO39eyY+#zVtEhyUEUTWBRi8JiR7Ef?nBGCn_P2by8d$`hqBx zY^v42s_%WzcgQ7_G}JWe<;tA^lAcNyw?@5PazteSM>`lc;8(<4SY()utW7L~utC6O z>$H52S*!aW$(M&;nfLpdtz(`!bDmkHl_2!ZAnbbob zVbs_bw*PkhHGmDG_50V3m91<33)}ZiAndl0`H&-Ggw3o{a3nS%o66vASm?RZVDt91 z5KfYJH#*vOxx)Fsc?g$<79>`ZP$XNc62Ml7m7g$onveUN#Jxeg(1ZK40_|>BsZ6$n zA>;E|^9JR>pqYfa5P*^P&RZ61JXzB%mpv=mg-Ra9RmU;D>DK@^D}(ez%eSc_ahX*L zb>^v~FPJna34RchroLK@X~YU&OM^r~Ux>ck+NL~Tq(1mI1Y;BobK8tETY{dD%=Jj- zIi2arOtH};zm(7w`R%*qn>JU?aRkD5K0j&ZHd)U~M#p+r%MD!@Cq8#Pulg;%T&#Eo z0f!;kwElFH;q?FshWnE>*SCwGaItB-GK_Qe>Nf?!CaP08M0{4$Io_VRC$B1ACiMb? z-nVn_TZM4ZggnOc7lf1+JGDOkj-PG5;}xDP{3aBznCb4p0?l5XawzWa>ZS2}j{-ON zxE&8q&<`Ry#U{l7=kIj2{@3nhKAF&5>&aMe0#oesm!zQC6^N(6$hFl;+B-Kvy|50! zj{!MNl*!qdYPXI_d4RNZKX71^sZZ9txv~0CeH^uY`xQr=dJY1HTvGaA9sj`eH;GQe z;SPlqT17>`M_LuRiCh#FWogIs)BMm%L!@i#^X(y9t?x!rP`?eZyyErIdwWI|=$va@ z2K<}Y^qgLodG%BgA^=-vF{g7(v*w@cSJKTWeC{gs6Yd)DUmhwt0#i1V5rkDy5Wguz zxJo$IpqXn_v(^>)S&nxb5GV+c_3_;er}+mW;(2}_d=UP-e+6KrA?q9us^v+&F4vzQ zq6maK-2YHlFiJUc^z&2`dWf2M{oNk8vagi>D{4NL8Y$1LS8ombcrl7Iy7ti>2>3G_ z$4~U1A*>;Bz+PJjjCP+@}(Ru!v zs{)TnBZR%tGS=o{9^9-KEDIfqDyIM{Xp?jj1CDEz6>E~%N9hMS-c`(k--aqrnF<VSv8k3;)XVmz9l2 zUQtHo35af}sZc)wAbbs;Cm}Um&qV1*P4bzYXt66t`_w%# z|A}=uIOKV%^kN+pKuX5=NeKH75)L;3+S;x4JJ4-feG#g^eR?e(C^TIouA8PL)=Z%Ef9v_xG8aF`rmDX*PK{ z<{JuD!HH;_50&Wc!_=|7!7W=g8Jdn|=x9|{me)3i*5Q-*?$J=48#h{Sx(ZpTsI4PPHsy^b8RJvy3PXG;i7haQO8GWuy!e(QK|biL(v zfYFP0Qr4S`%xQflpU81P6qeZcj(ooE)Zuq?r-$*u(B%pUzbBo{%fu1M}jy?#_D~&delfrm*?zV|ZeXnVCVG zllx%Q5l}uAOE`7*L_1x10phln7M9fp%^rute;wC9DpY>IBnVa4iNS%=gl|+d^5(^2 zuZ>_(PPU}Q7q7|5M$XFg!ROUXCqpp=Y$t2(K7mBSZf5tp1S{NU)8v9l#B@n<)2CgZ zNxeBer>A>X9!Rgu;nha#*=txUIKoRTOTLR9j9Is155NRnQO3vi$>}*|h(Z_j2-KhhtHPfr6@r zs|`90d_C72im;~!opl4;J9OqVY$wwBtn40$+ZS^LeA$`F=!|}_g(FUU=3MVIM#jfY zf?y>^LEq@^-P0e_FnlxFtOqG-^v>97oJqip<(b`^oL*;(@e z)Y^#yHm%b1xsyzUJid-sRr6PWC{cvwS%Z4FE2!WIY?O2APX-Zw9~)jgHpi zDN2nN3XRq8vA4J9-E!Fne{TDJr@8TPA~L;o-J)(;*E=9s#|F~qB&oqg%G9Y{etT&2 zsCT|92v*GD4WZ!C=P=hsd#q2VjFVtZKU-}bxR?S2Ix|5ds@sW}DoB)y8LaQWc`R4V zsCWckxJ6$Ke+7&@dilsC0E`?TAbrMAUXC6dZeH6GpuzD-nEmq;H<)zfAD|@KpF(c% z-X7U)S(+VEVD|dxGfb^{+#QoJXGp47f<+RgZDx!2*m^y_J25z%F<*VG!^9y-o!z`J z!t3fmVVMF^F$>6CRzF#N% z@=uPSFH>qj~Seb`sj)1=2oKWe#?B z?q9&+aMmBWlo^LE!z6AqeRharMzwA{bw+iTgQKiJ@2gT_=GJG_6SRWG9*?fIDN3kJ zIQdVNY7T6$QtB^gM1o%1ZZ$bV^7@}%0-=wN zwRm}7UfqNE)j1+Ud(Cp6siR0ugvCnr-{=UBti%$^puVprupw+*4c$|Ff%Ic)=oAI| zU0!S)0t`YzLPTh}e2xnTHxlIWb8`&5l;SL-FvW9tF~csF)+*LNj`v^`K?CeKfL*lF z{6r&mMGOHWfWj9Sio?WTdI{$QCnLw>T=agAlUh1jhfC3rS4^hNDZRir@Jzs^x^JvT zX!)FP;_|`$O}$792wMc;{>X6Ilckq@c=5Ig)#aW*E{!qQ=VJo-8VvK8J=T)2xO#P+ zVdZ)~v0W{t&z5AuJvL*ENbKT(tK3T77-~AXYi%ZUh;wZ+J+7|PRZAVc-Iw31RPhw~ zSF5wCYURr&j^`h*`*?hxt^`UK#mo-&7_?y%Fn9FtzerA#^Dp8Mas;+^jjM&rq|R2O z5VCIq!AGzCU}h0UZPNi<(A@@{5ywJ(1}8Q3)?eI-2wYh<6fvGM1@**HqMkT*DZOpz z3DP!)<7pN{AAyffiDdc>3WvbDC_GwhUp}7s#KWxw);jB~i~!LMY-%DT-N&9#MWI=n z(;(#v`rOVqDz?S3DHqx-Yyr2!ytkp)ov+WUtsI%$HtY57x*i@CYt<_0!3_wdt5CfN zTi<-|Cx2z4S&KMbS<^Rhe4bkSV>>%ZywX&)Q7CI~Uk6Jmb2fX{7&WH(9F6b6Eg-KH zPz>``7s8dwG|Cm4)G=I~{1f+2Zuj2Dzl9;fv*$;-T_4(MW&o{pN@S6_+$dku;N(d> zv-Db^duvbgy*R-UqhXnH{+ye)a1|7F*CJ?-Eb`pDX|@`Kc$qOQN7*m_%}69IlM$sI z)FC7Dt(ULvJ_~JrtAP&@i2cM30FlmU`(# z%#w8ZbhMI-MF-nA>bX5~WjfTgdbG^NkZQTN8=cAN-tE`b7m8M`1@wc(ZKiDznC0q8=8$M` zh*oVkr+X+2E;znmE&vIOyJ@jcz&XDf!1Kyy3NP7i0-qwVY_7gdEIYD4@`G9yVmX(= zrn)K)7(|IKK3#>n$tHS}TCs~~(Gn`vqY-`7z7J=M3ZdTD4Ki==sHZEwcHt^}?;>Uf zi;G)^<*ab9W?7DA`~d6fx6W^Rc8tfLRZw#jxdkG-y6ra3h0oE0u>@>xo72QAE+k8h zZ$R$1^W~O=|A*F^=LysEHbWv?pAJuDC7UT;j8Oq5ExT?+iL4LnZk7EA$_F`Kn?rIfDM z%ULt8F7VAE@P7cp1G&lZPbV`QcDsL1{oyIKeHx`6`~%@lt(Tbmkkl^Fs;@}S%+si= zsAvQ{H~iNuCy5{LUle_wjKeYFCUbckO_mdk3kR!pz-JCW+HCL>K+Y5Hc&qRbkTC^}h8_YT7P#lD#PU5?M{(iYr*eb-l+_%9Z4w>*e9q>gp=i5SsVP z1m4X)3$M>Mh!+1D$mjdMnio$H_&z_@X{!zn^|#q++3%m0Czi&vn_}hs_^_@T>uZdo z%!6Ld`!bSN;(NI+Aj159cl-3`o8fc0DLjpWr{hJ>?1^TT$3?cQ15_(bP1cI1)hCl{ zsa&5%`>~ub8T5Pb^J`@A1rx9PbHgN;M7-~-`<3pEh@jo+E|9`;lFwv2Ior^*6?T4~ ziBBBjxN%5hY|mmwWRtejP6_Dh4mXvGC0%ng`Zz!O0~A1lcWOffA?hE3de5xbGeOQ0Woi^*Yj4vNa0|Xfb;bU3;5~kpt$ZTSQKOS z?D8~CRDOm6J=m2lhQ2TN{bj9`jFB5cA)mKry zyb$ugz$0Hz(Efht0&MvB{_>;h=SORz{!8c8*ad@Pjxg-v>CFM~>2Tg1->KVVo5g2& z{*1b!KJZIbC~J6etM{ovzx_U|)opinYGbALdnTw;DmIJP=l1fvlTi54%tjiyYQ5Ix zav0-;$A;JU^|r1P-so22wnVQx1HzTUIP&h~u>vZ+3?7Y0tIO+X+Yr3b;a)hgwMDJp zXtGy=O4w|@QfIRFPssDWJYsFSm7HNwp!aM|4V*|{YVkOJwL_zjGqjvmaS6P3vISj2 zWMUYO2*xzta_~@;!pRyTm_VN*jm5q2ShAMgjdH)MI%9Byyf3=?2nbryLh)o;#-n*- z-wx~g#!{HHTdm9YZ-U?ah1wsiLhK)x{z?yneJ{@Sz_BCTB+-eu+M@L{D$Ta*w?IJt zwaMuzg-Lg_SF>8H%Y7|mA`_4`zbPI}We4Sx@cHP}wX@I8D3b6cU=uQMH~?h$M9Zo6 z&bkBUq8}kK<5}pBFmW)f&1=R%3SNg8uyL z=mN}W@VqjE^T^FGl338 zmm+<`kWnMBD$jd5Nidg7VGJ~5ZT4lzQ;Rsvu(tH^T~GPF;^+uP-y~NeQ}FW}qGgbP zdU(cQQ}#>O^VK5P&jna0_lgNz6vD~{>&Lsr4dAp(Oo&A>?XNQ?g=k;Ktv}mjz5eDUXn!jFk$4 zCh20O*>`UgU=DrMUu+7Cl^ziQF{NtVHm9S6ViCg@H_5sYDMg}<2Je%9cPFVV+VwvM zF3=g(^tIw)=i8xC+zX+JeowV5Ok>qQ0;k-W6K76s#0sfvearki_Fq>D;t}GS7X-oF;YrK<`kkW1{H)T3d_coh`8@O;I?K1&uh`Y(jL|w(493KaW&|wjpy7KX2xJWn%oY|i* zX<0_~TIVUY;GDzmQlN+(x};7J?>KpyVz)zg>Z1*OPi3oKDaQ?SwOQ}5I7?xga`LKM zVbIq@d&vqWH75{vp(Tl3JBKq=I5AC{@SowV!=0ORs->5Sz@iCKaP=}tphFl=Skcc4 zNL}eZv-{9p!GDbkhgBzv7$fX68=%A0>apuoTM}&1MrB~sl$EDC3;ej2mlZ~68Lh~$;^|*pv zC*B$0cYx%FdLlOK4=R@PRV{dHGWx!Lhi9aaVt&e$w;jY9PR9=VrjD(xaS3xJ{Xd${ zF*?t#;kL1DJ85j&cGAX1W1Ed_tFdicjg7`eV>>z5^PTbj?XPw;x$nK#UTaP?j4)t_ zCD#OY7PEELP^U?O!d{3ICxZj^>xL!)L0$qz9-(inIm(IlmlBDmOF)@R5R_LMl2o?ih0u&oXSLh%ikV1F;BAnZvr?Qg(+LFygCnL#y$Ho{>~3sC9xE&}mOsb|xX zRYnT#MWB9pqDFxtQGi4wPTBYCTo+0Y%?82?eR|B+?E;(`LM}HKZ9AgjzX8q3!u24D zEp`;LfZPZ!z5}B0XzKQVuCag&m@bs#|%r3)dvS=-w zqQ=YcvXpScMIPWFV803_X|}X$(Ema#V*rrNc8JU^~Wm78e#{!t+C#m6aFRli>T~Icdc6f^9M) zuEEiC`&{HJz`5CihnXi4X($gjnB^IwS?-zV?Uf;@z>hUHM_na9Js~mdNpM3SR>~dV z@L-_c1G1%OOGCs$Q6Ix@!FGkI&%v1sP%9Gfu@bg7-#b&^ABE_R=s+s54@Gnxa5Aal zJ4wMY)yeP*@dD#uttnNgAkmXq826JHFr$qsL`%d0Pw7+JCX5maG{rRZ>8%5*gTZ!OB=WPc5v}Vl=hd&T zrhJfK7#!Hp$Yn=p7*Gk)R4dq$Gm4_qfIK0b>4gUpb7Z~%LE#uNQUhuXpsX4wrhyaS zs=^p<`5mHA{Pyi5Add+R_B1p#DJcbb-@7}01qU@CK|u&^&NCNhH_-pVeX?M*B8oMD zmjsjHz=6SR#HEa;fDA`I&<;x651agGWk=~ylaO}&bog3;J=P0>lK1BY*8`0@0%&x;kV|0M#t^PYQH*D zL}BQm6Gf=n3RX?c!w~BKX*9CI%_yj6MWHo2?uTCd_G}o0w^f6q#Lb2T*G?E1=54ZH zc^pf{98VFY06|ITUxHau|Ni(Qs#scTQhE%0Jy!sdk^1`IQrf_QF>9G{O=tmlEei%4 zlTS7721<61;-#@lTxAA1Itkg4CqJYeWYUpZ*b(@K=?kEWTk6;G@@aZzwfc zuHWWkjn%VsceqDIMbYWC=&opVV$#PG#2&EF?ikwLcTHsGA!vCp@@u*Qw`VR+(jMz$ zjS7uw*>uzNeoAutuG z{U84x<1N}3&|Y3{>f3wR`<_@$jA}n!F0}4D6K-&F5G+@$RBe7{{IqckVU6TR+AMIJ zC@{M}jfKB&4}kxXt$5ti?frA|H=pG=-&rd`wSG^gfUyrSXV}2CSIBxmZKPbPQj_8m z4YeHj+QdP|{e#Hru0FWCew{#Gs+7xXGSYN+%vht_e3Vi8`|;S6(^mI*vfaesv#!hO z;q6=8@B8UVt=flw{}fyvJU$Lt&_fXjw^}FYW|VRTdUOv5nA|M4tEG-_G3DTmd9&*Y z`MO!n7g6jW>iKfG9RWv{Yr<9E5#+J^&}=W)yurpM8R&TVWc!XfH^Jj->vqQXPCK)z z=FQ9Ga0=AOa9V0ui00QPPF~;h)$_m3LNEXBii|@X(KcQqQtAA^4!b>_d*1FV3p<}w zWRAnBe*8P5*eL%KTbk?VboE(n-z~5Y*fQ5U%u4D10y17s`%eIeTk89<^pt_y(_;I( zC(-XQ$KBlL>mjc4M@<-{s$`ikSTws9I(?VjLIsUlNjJ|&(9{_cyUn%mU)EyTWSW+} zC(2XHzt7@R=?FibF1GoAqdv0GvjcFkcu^}9CkssI?6Ny08Do9)kVZP&biP`c>DDcE z3!;olGyi$4+mTF!p0xAeMM^Lv+)v5euW+YGj(pKAeP7l!sYH;tE&gPl?R`Pl&5WjzV;uTUdfZ=mr*PA0ts0AlYc$D zIm`T#;*z38LbHve*LtJ!32G{VF$;oJEAY@gYq6nMX)s-xCM5Q5dib}!QikMRzb9e6 zRKenRzUq00tzN0G7Ak|9&5W8fj+Z7-4{J7oRjJ=Re{z#_-23zy6oZE=Xy9Z#{{g&# zHhn)MlaQlrC=?$iqjV5(VntRQ z&n2yw$~=`~w2ch(`;8$1?#)4i%wYgHZ?0g2*++*0r%o41Lx1(;Agl2zi)!jgxO#jq zsId$>fL{$YBF%J~l{))jtvpNj^*C4{hrQqfn&b@JP06?4y9%@>N?R}1Isq)c@T~t% zUjV=XJ^1@LgGrx`cKh;?cDMY|vYdOd?tkK-SVKect%ummTyJ>_Ww&1wTfp;n_L_z5 z(t0a1;Tk))D})@10RNw^l$VKW65DTN70$0=u=!qw_o##0PFRno%3s4E2VBQ#@pK@( zj_3!y?F*_TvL9?DTsIDEdQ~f~ZS5aNyg+ZvfopM14rURflw$fV=y^2c`@~7FmnS}5Jh>MlTNb&$Ztr(K*Ln2_4h;;A%p#ma z@Tu6?Bi?uvXw)YeleRV9m)oU!zvH{P+I}Ug!C!22)XHaQGiVEKzAO=$jib&C8?-qyc7ekWfO(B5Lt=+COdPACNxta}No{)yvS1}>gyy=C$gV#`TKclyv5xP&uM2-CSyd*n@G~?7OaztXJTgZt5be+P z2Xx%OVB56@g#{O*+b1E->$7=E>B!f6&%z%Mc$^g-Hr&d^oJ**&hTjSdE9o4}G2yJd zR+&Xf5>!cs*%87PjvQ9=JS{+(%~hlhnV#8XgbNl=9bjbT2gP^hToBhL(u-%ZH7Q9; zsP2FMw!Mmpz~%HZ7q{`*-ejHC>Z~bPzoj<7F> z_-~QsAPXR6i9{KtNO<1c=b8x*Sl@m*h%0f z%U%BqX21v3zj8T_f3c_u{tG#{4 zB1{t;sO)Ggkrs!-E8^w4&OgxMDNZBuFc$;EY~qpat-FIauq-rVjGY5!`Q96m6e^{o z3Y1zZnxeXsp$hnEA3Xy`&M7o%v1N%<7lB2Xom0C`veB5-@rfwtSp;e71r{`aF?I4~ z54UPv-j50)fmp`%iieq$hY|yB!0e>sGpy_5VNXZ|taTSPY;pr8Y`0S@fNWUs)4}M& z+xo>vWK*0v36e4x4B|h6_&r^d=Qh1HgLbe+>L{|$NlN^mqG889UzekD*i3138Y~3!vMJR1Bs_CxF$yv? zCr#_J7<8)j#vxD-003nkV?^E|z;WOUQm$wCSAxe*)cJ=(mfO|mxb0=`(89#T)(WIO6lMK-SHyIfGPF)j!*^{WB{9^f>fe-7Wy_x5Mdp%KcwBP;9 z<&Hmnx69OfHa2(~f%NHi>;1_kC>ocm-XmYs*?3SuEF6F-k4E#@vvHS0UX)3CD-)%1xb2UC8 z;z2IbsJ&cTG@gLh>NP14;|cn|j2|}L?}|ak5waL>w87fn6Fv`P8<3w4_a#!~cQI__ zS@2-4^60{kjf$t%o_@A*9|v^5eT&Xw^>{AZ-KRR|bBbm@-78*Dql)A8aS-YiCt`LRmoHGU-sk5* zCc)R8sn)IH$m99LdzC>c2AvKtqN8aEaFGoxyUdBNw0~1UpK~C8_-Y1;cQ@pZk6wv) zzkasDTSs=-@nR-qWvq3toawk-I=qlr1r49nTOFaT%%hf(Cg%{sW(K zte6MzC(sCZ{Dvpt0Fioi2TEQRa$ht(`i-nz9`&@`GHFDSh|^_pv3vp6sMFn!Sito9 zx*z=7<9^68Y&0h)iOq2%8Ppd#nm~YTBF(6^5~@L^LO5)flY$nji_3l|?{l9@o`Bin z&mR^OBw|5+yZf>PAg93P?Arbn02n{Dy1iU;1%08A@o%R2u1w9%jTmr>slOn9k=U(A ztrODr9jRX^X02fEJ9?g%{jCE}W3j#u5Gi;+7EYMdgz`a58VpUK<<^t7s*7^uA<&?y zgme07lZctYDjmQQc-4l4%?bhpLQQ;xC%@)*o7Oh|6cTc#O`JZCbn3C#Wo_EJbLZ%X zP2e9c zsS`|%)o>M2Y?E1ORYXxf6!!57!DhZ7+Lpj`KCxh0!#|Ryzi!XoRjyk2G&_)1UXRpX z-)`65gr+uCX{QV5tXKyqtu)lLs$fRAjie(YFmvtibLVCFWbf_*3@r}v+{srB8W)WDxHF6Yvy}lomyWabp)H>i+ zV3!7~W{7WNXb;DO8YnFpZ21prF)#}(iw13&ZO#jmnkxhanBRBL}sr)DKPcUuWH@ZjK21Rc3O58dP5@%W#sN>*Gm=sg35*1%a z{A_3Ah(NU_Iocu{JTL+%pLSMCPM;az_YgHQE-?8d`YbVD4zDyD4#`CA`}fc^bqtqL z4>VWl#SzG5d6ei7`ybEmv4??XI$u<2JA1UhzUht1bjs35=qVdlQ=Np#8`W)eoo{T& zFGMpN|6!$|?4wGe5W^vXnu(E&kgl*T_8YBC@LKwwTblwRn_)awro1dd zs9o~dWYZB7Jo>+UY0(7gW}uDqqs`8^A14JO?Y@pt#md4+%lw3_JaJP2bBQ7wJ%&zN zvN^nb5Dd}@RGAZ^6@6fP|cd9uV5 z_@OPRa~nflmQFqeV_KB6A|+)3euJ?Zg-o*y)ek_|Q# zfXj(CdMy%|1@*1p5GVIdULZJSR@5*NKNP89E-&~lj29N$&hX zS07|T2aKw~%qD|{3#*x7!$Z(Gm?rGS*;fnXgNYF25)X07bs@;{B;Lb=VM~W1yMJ(n zFEVqRu%pe9^R85TOt ztg;Vwl!TFs!XF+MNw5o>S-|dH@q$CxWOO>>uo146i zsBC{=MZwXFug3fW@RT^;^%4Yt4SEtYX?OI>&hK8FoLGZIh|NV{bTtKq(foh(LBOIS zfDFQfpFU(g(4Gj`^@6AQ7KuyIKZ>vsFC*=xY9fIuv0vz)~S)LLe6>iITuJ6OUI6&1HL#$ai=EIqSsm=zD89Ra2oLV&5JuAfn8qVG~;eKpt|oYVuIF9q3q;IAY>Q3DHl|Gz8% z4K3P8oEB&FPcjCB_C3%BC1kUU+(f-wC67~QGyq`RKh#Q#+i4gtj;|Cjt*7l8rb zndyGI>;yhu4l8xQo#_G)x5iiZ$#F! z*ITN^6MN2{Ie6bqtqtTLDZ`~9P&Y1TU5H?z)oOMBOifQtPg*>z?(229eT$UEu$)Yv zJDm8BPZ-1Hc$SHx)zF^+9jqp#=}vSk%f13n>sC4dQBELg7){7 z+Rae+>6)i7gRwhQf4?FslF8?O6%4q^rqH(hu+ZzllX)OPDNNKzk1g2qebRE1ojI?VVv)j0TsmQ<=iOpG zmN0GRnBcE_gLFQ{G>5%Sz)%sIzQ%t@599-J`D)z^)rtx#EcyOGG{*3N6PjC3=w?1> zH#XXPOwKC&ktn8a_NQw1@wD0|tIex?hdQ6XPD!H*ID$?G5eucjF9a+(7h(|0=~0in z4i|*DBpjx6m3H&Le3Me9V)GgAvx^t|-iOVVZS^uu6=OKEF(si7Zlk?mfQ!DdQZ|RK z)S};FGuBqW@BewqmGw{c`&%YQWr=()tJlDDP#E&2T4~AbAOb4)ICQD_ib7JH_BqexuS#Bq9Sg8>N@AA8mUa7>zlVb^U3tCle;)#uQIKOJ?7SV zAQa94AXNrFFO)}R&gezV24qzxokc^daAtDj4HuJtof%utQtUQe)kr$2n6W{(qxe9n z?4ogIBf9G5ie3sw;|S7O{3e0uLsc~qV4gI7&Gt(W`;*CkG%5)_yf`Vay)SRz0@Iht z2S|wemQHQ%tASxPVDR*{8+LV7t`?Pk1jJtcIvoVK9O{qnA&p6;3Oz2L8=tJ{oQq+($+83J$D34_(z%@E-JUVQ}?nNav`4!fc&HG1wg+jfN8I8c5lF|{ zqELYq+vL~eDfv2#{&NP4UbRTKzQFQ$#-J!oZse6SctWvaby@79_^7BUfE`_5(v0OtTe_e0fuPc@o%Z%VyB?gxJo zcpA5D-VGOM*nS?EAD5}KDkMq8fCXO?*s&On;M}TyR{^+PTt7!PfL@cpdcCjgZreTl zanHNU95A&d{GDE!Yg>E9Yld+1FE+H^XMHL>TO~%h+OU7X*Xx1c?^Vi@oZqwODb!EZ z_I|O^p0BMpX?t!i%E5mMmcur4G4SYU5JKZh>U!V5@7}6%Q0)!C(1Iz%o8qBU9pJ0O9 z%W4}>BeBQrDbkF91~*Saz<1c#XvcAR+AMJ_6hz)%paZ%xkef0zDdWky%+9YTpda5w z$n)z^*fHQNLXBwU%UJWZ1HfRFsU%!0Icw?HdFGf5cw=^iY3|94sqZ%#rJQo7c7rZ1 zNmfa04@xGa=r5bY+hV*G+Sc1NCfCjI2qoQmpVP?032eX5{gKVEN{zC-;16rRFWd2Z z%b$%twU77(ChgVSvGu5dG}!E$*wpG>JL#l)N(5{7`wfVYa?2j)yXM|4RbQ@4YZWm> zWeasi!xbrjy7pmCia58!v%2*U)R3oD?1dQ}LutI6W0!dBh zr1jCz;G3>yce`J%x|h3kB-b#PF6ZS%AqrR2v8Q1eUp6utv$(ES8_d>IqE36du50u< ze|wzgTcwNxM~bDqhJW{dADhTCZWh}QDbw9v54X@@+kQ`aZ$E$I&i498NfGs9EnXqR zDZ+|mQo%z` zR`f4EUCzEK5(?}&ts9%X*ogvKWO`YM?CddQ+vkke`OL2RMPnvcX!7#U)LYVR}8wEzyTWAWs={0x1ojEV9>;htG@%C zhAv&_F3)6j9GK)$%k?>*v+w;}Vm=3lLdxQ_9iNm*vI%~_|Cp)Rv`q(l;e;~5T1h?3 z0~4Ou1}(BQ<4_mwQa8^Y6VY1I-4d6ONi2d0BY_Bhh~3s?NJhvzN89GO+p=op|9 zCsx6T>?Q3f^mEy-FSpoc!J?0{`(J~mO~9j%jZfNsteV&>ep0-5F0)^De=5l@vUe|+grf*Mg20z?9ZFkb^)uiI^w(Iw! zWX2#R<8Zl*?{RD@o-T#zys!M?M#W%KA)NQ}-uL$?pBAmTtw*B0t(OITk8Vwrn&@hF z2$cq{=FD7mUJtR}_$}%DuJe7M0#6rPKL1wpVbMpB@%V9)y1zc(`Y(l`%hqgnbD!S1 z`tq_>Me0>pEM%SXxwf;vSGqMTGs~ApBUe+QQnfUb(c||#RHiQ4ZUqQCe;i6O@M+~{;{y0=<_l}h zes;v{UVCNv-DZhTgAE4ymrLG%{-CmzDA~^E^>Z2c5FtV3;e*I>lk4skjYj3*Z!gRq z$)7AY&J;P4PaAN1@^ZM(t^(}@`6|8q`$)-Igb7b|Ah_oK0dQh(Muy^qf`8UX?>IV%dS zifpZ0=YAG!qlsu@Oc3-_EI!}q{2_tlg*G?ZalQZDQh|NXi}`4cfb(|tfBQ}V9_}|^ z1dGk2>)6?4Kb_HNc^8U!#?^B-&9~lSkIP~841C)*ur{Lh`5U~xy>e7a#o)Xgu54FM zq4|X)=Eo4{tP0%@cDK=5)~%Nt?cP^F0lUR+?Ro4CK8}!& z$87ChE{)0mc`ghnSZ_C8&3Xg$`n#hl^l!)^gZ&{_OxibZYemn&3|XA?&pRK$SUum@ zTTt)*W)XM6?ecF{LMG^-e!JDaj(u;Z^^86N3XEE=&{g$S?+4UdNDiMnFqY-X%@uOD z+`)j7q#sJ5OXKTawLAvKBa9Ar$r(E$21oP5LeuFy`+ajJ%10r0TSg_+@yWVP%5%U+ zQSZZ}Pu8Fb4O_GljG}z7OPClS&$~}|Gp4i!PJ{3H;``^D z{Ynjh3h(vsd$TiPicAiW591;Lb$1Tj)6-lnE zXVmdKvueFY$A^lCpVPYBe(##h2SN_lBra*Hu%RwDdlE9KE%xgX&Q)|8j5$2ctT=Fl z0$#=+z#}u49lz_*{mb1k3(62QDvXh6xH$Z8ZXbt_BL=x2HF`bf`=8`evY2#>55w4) z5+AN(s$rXq@|%{e7u%iQFOg$iKnJZ%H1OsC!EtHQBj zj-damjk*4GkJuX<>%1bNP-3Q=<5)v(tNnVL$@(&;+z$xf-F>MU{f>Af)Y8(@%k5UC zZ+!RyT=r{SW_L(`j)A$*;I0$zYHBq;u*7P0T;OyFxqw=QdjEWr4Ht!ROvw^DjB%2W zLK{1vYUvIz-0BCHYGl3Rex&r0uoas7UlssC!}v|(PPWR48)K{68~ITgpVNK?!A^t1 zDl{Ay>FDT^&x0C+vra6U%5JEmEJeDsSZ`z;Z2)5!X~E5VaiiffmhEhj1VkrS8LsXvCW8x-^1Z8))oL}p-zia%J6#LQbb!ER(yYZ zx`>OC+1c1=F?p+KwoYYw6Tpf7lNjAD>?$&3yl>}sZf?53{{8!~hl6 zB%=`|Xo8r9LqKb2IKcJPG01C1pR3Xq0knAARv}2sj4Uwp6HXe)JiF_O+zE;s*6~6- z`R%@cpB+AR05g?Qkd+mcs!;x05-2Sy+O>Y@$eWWG+@sIzmV@qLuv)sZ@8oH0jHVh~ zG&1t7#crv=As`uGM4rH#a7(0^N!^#|<71vF{u2qoJd-eE3+s9J)5VfKv|X ze4%mRfUtRl42yXpau|;#@lk<3UQU9){!+jhz@LQmL7}uY)wCC51s%AvDlX>-FO{cL#1jO{rxT_Z>S0 zhzw~XePS|%?f}y2Y_^fFVtt_-- z?1BJAdyvC)qdr-aRYD~XJe&Z`08;($@yvI19xAL%j8bYhnC<-=4C;6=c8Tu^{{2#Y z@3Tm7AQ8J1IM%j6*bG#A>Ch0M^1;MvgVY(AYSXlU4bm$rZrmZfv$Vs*k@5i2e#ohz(y97-w=f*OrR&z?X5 z3GYk@LmKFO9RU|ADUn!oW`9SgD~{8+<(yQ}KrfH7h-fMmEh~?ej@zorA<8|Aptf(W zSwIzy;`@uL4=zlYLc&OXKnfNS+(``tMoZ^r-vXy2zA*sMFZDz8Fl$}#{|;Z9)~h8^yeBmIk0APR~Uu4 z=Hlku4H|@-%e}p_!%`cSNHR*F`oe9(x&Sp!V>k1pRuIj}l_uPbC(xOczU}idj#g6~ zhWD!)1uQhbLRQoV3@I39xPr}slOK*8iV~`mMcOa!%gNIfE8bQRMNtIZHTmG5Dk!ut zvygDp2j?(x4;aI*Jm!^km$yn912AS$u~vS*!-0}uAJua;oXG8B@?(Ib%x*; z&h6IG|6#7y4AIy@B$;US83tL?11)g`CoYsl$cXrzkpfAal$8a493VMDO+rpi&c=2} z%bASq@UTm~$@~j4u&-=q+(ir?($|aP;O=m*34u7N4mw;m2{nr3n@Ucs>`282qNVK4 z8GUug<&nt|`GNaHEt`kMfV7_sOe$g@Ph9Yn!_Xqce)6Ho=NElHD(Q4!&4*z)+coOXu7etY7I76Xad~^?qpw4EhL&;@(gNwoft;azAjQulplJv|>uhUyfxK3;`J~}QGzz+~`er{upN^?9JSXs4k6SEmj zBZEdDc{rY8aJkVurFH?Fx}}j{FyXGm2BGX1i$p%4no*lkI&Zy2uvOYgLHOUrluiHc zh{iu&E?)(6W28=(Zz%X_eDa~Boc1y<6IFwN-!mv;ys}W<AuPyACo!)9>s3Uk--fx%;1aHO6tDCIq2?7hLEp$dDj`J9M z#ZhI<{zWZiP75B~*%+-6H3;I?sXd|)I)ZsTuSY!*hEjd{_AX3EaIVHyjv-m4&~7TN z(_M)=J{v%{)oT}T)%GqozD2>YmHqntD;csu;bCM1$k2pEY{c@J`H>Heu z`|G@_E?w@fG<`3})$oMIpEH(zU%mq{Y_f>pV%v6A{6akYxTRm?CfGG zCgNd93`kaUmaCm-b_=DBn0&r~jG0!iguCHjb*LzosT-Kx_XADr1|0?}w20ur{28Gy zpUW)!I3f-fg6Iu*`%T-d6(*0TZpgc1-~x8K^9c^D2LRRAc5sPO7VpzkJD>Y`A9cbB z59*I#P0~%^Vm8=hxv=G9y|pDaYQ56^tz9?(I+H`|_n&)n;!wpu`id=+5C=BosG^9g=U3N%;vJ?+on;{GMfwK98VU9sK7 zHr&Ur^>HxiceP}5xQPBiVTAnAsw=$4ng--^1T=e1W9gkDz-uVUp_NHAN`H=zWm1z+g&X4QZrA$s zu$K)OGM0eDx|%Ql_?>gc_*;lDH(9gS@1sRY=s$&-iA51lvTQbUfI=0<0lm-T`>=F6 z)d5}mG< zE^j-=ef^j=XX~N+INPj%S5m8$@#zT$-71eIyd}6&is>9d0Y17oHV%NUf`folGEG6# zi`}m0)Ak5=^S8nY_^9;P&4Zv$ln<71S;);Ql}5up`mLwq_j;2>J{tR8_k4`kY<(f* z;Q%}@c=EKR+)vQ-j`rD7BnQ;x6qeN0kf&Fe#|Qn@TpkL0>vaj0L5pJA!3tz8(3 z2;B6RyFBl@y7*zc+vItIj%O(b&WQ-pdY;c0iX)4B-cMU8<$jpy`h4Du5*l2((FmNi zBV8yG3AkMM^+0EGUd%Vk0shoJcz9BWWW?WBSgTWn!XYY=w}Wxm-7FR-PjaaM5>Dp4 z3)p4HAhhU|#!8@@ct3do><%;>Bw@o2QPKg)VA(49D|6!?0tU%cjgvS;P-vyxo*Zqc zbMfy`*Ew1x5C4`!5s&+Io_)oQdX#s70X!>WfNfn#28cug3)cZ83XANl1Z*E}p;7wI zBk#^qFH-A$ux1Sy<^k_Upc6Fm3&kf9s%Q^Vs(j7ICsERdVnwUSo6ttEAqYnhQF@68 z4qG__ia2K(n$cs;rWY0WpLoGq-}jH&>NWSvwbPK>ko|3sX6KbOed_eY#oifw8kw=w zc*rE`o)@_UX2pO%@H4GUKl&cF){_QH##w8o-~wsA-E?cN=XJ z7)2&d=WtyETtq)-ygPxO!``MojWJ#*sp+Ym1{$whVN^v~hf&++WrNwoa+O{okQ4&{ z?U}thAEqiWd+)V(HGCSL*jbH&oT>3<57!l6jU|+>O9Br9Vra~O0jgp{> z&)8%yNo}pww?Mw0OfI!Lc%i{_kDNCxoZ$H8a;v>kH6&6Ylf6d0+&Bp;W;$0eL`fMK z9`CAVa#&Y%Yd7Q9mMopQ{dL~&4sJ~T&-FN}*tOPXW=&m13c^fh=U7Q51Hcz-7VCE3 zi2d?-2|}W1knYECUT?>VR9o-Ii}fbkl~lq`@P3lxY?;Ie{Nr$=XL=V(^0xq~ zHJ3BKg8*{|T}5r+6t`sU&+By)Si-G9%3;6UB^CF3M)2+ZsG4u<>)NDsA;Mm|V<AtFF#T0$KuUXw9SSi8#rb?(4xY;4l=wfmM25c}~L{a+U&elqDc@pUV@M~|XA z-(M%ZTuqWE%4Wz?W~kyd6Dv}GjSkLPlk%cPkPz{ibsVJSc0QfHz5Ws*mqgm`b#EO! z{M?@IaKE>6Z3!dngC|LpuDodxnC=1qkv7 zibO%enF%KOo&O!=8IgxY<18ElpAM~dF6}viDgaUa{p6z=YOoq@#W zTkTKqtTKd>gc-?n@x(+`_2Gy(^28$L*c{B%9A*e3s|vV?n;~8TB75DcO;CnHWlsD; zq^!-|d)1Nxc=nhqsy}llkaupL0AhnNYh0JHv!IM6w#~yGZ8u**47ga!~Qqa)uyvLgo-DY-aLp=B#oE3{i^#4gS0L}+e#8%qD^Xu32)S!72wp;lRRLU2MGWABq@^;by znIJXQQ>}`@an4cOhX38AdowbBF7o9LAv{g$s_a#N+Ni zqks!RC|0Y`q@&=>R&2jqSslM4ErTTMGT=gUCF7vA(yBlpK(!UiHGSk_tLqNehZn+` zGYBIt(zkKafyqbcB#J`D^r0lfh=T2swD4AJ22k5p6X>HT(*Hl2&M7R@u7SeYwr$(C z-DEd;vTb9sJ=vOUO|HrIWZVDq9sFlq9dzY)KWndb-}N?Blm!T4$6;_FHJ%b)=qzN~ zIGL?uu-uwmTpayw(_ymZv^11xFK4gHi6T9sNxp=Ax?nI%1}bDlR8o+Mp@oj*c%jBz z3jY-LV&O(;$)H95PSDP@Huq+7U@)&u*!;s#T`Y7$^_Me-|2)i0?q(@%_RA12mFak#!a zwRu%ZG}oe^&n!qU$jBIn!-2--;_GEXo|Bu7zaSpI^J&b224|_S1Zli|)yxYX^wZ=z z_P*MYN2UTM+!;Kmt9oM+80L5WVo5$LO-xL_xO)*{$3QTZ6fYz>UFGGCl@)nAtzvd# z)Nj%Kt}t)ma=y}Y26VOP)JruKs;Tq6T*vC(H9xcEK~9fccNoOyI1@7yEp8)2)%BiFn<8w?)Ox!`Yc@)DGFqsN*wOOeTR> z%wHPOYXJ0vxE8e|gr9GtFB)#R0Vs07qFde*@|`$m^_sm|nqoAm1b4VE?)8(01NdCO zqswldB6l7Fg;#8kSjV`)p-`YeEA;*je?jcK<1gE&RiW0TQLz_{Cpm$^tlr+Z=Z?W> zSS_~dJoDS{HOL3=q`febS-(^v445!KCrT6dA9oZk)~a`Fj}1&^?R&43tciR1ubOn$ zy@1a&2fSANR;C&nhW7RM{SnY%u&&!;0|^e=_M81^+Mp{556SlVAY5ONT<~Ea%q7dh z7~Iaw{%mJIoa3|dBU=sxUKU1xCmDx3V;*-NK*X~)Fb#36u#C+(({kfZ#MEOOo#bX` z@?FO*ZyDBK?^5SSI#peDv-?bjTDxrde|`E~wU;@2{c;BO8Go#S=g+tZ;va@xcBEq# zj_evm#{Kv3TH%N|z$NZn*?RBK9Q~bCEhFoVwuZuNCnwk}3pA=-@*v3&GUobAx6=i? z?Vinr3Uwpj_KApmU!4xuRqS=)m&GFFS43Q$W(Cb-$Hd?*CWCw+{PW=R@VEZ#LWXHY zH)-___JS{3aQ`6!NCKB?G`V?MX;~?G*NMFJ~sWz|iIdwf=Ia$Rvd>o?eS!ozl zR~FD^p=>vH77dxVToc|tc~Jtq&zn9yf7@35O08E29npm0)#3R$AdcK}%x`S0A0(z} zyErvAzR~8cXlK{OO*)sIqW#rFwVHYIa9P1=G1=DmosN!5eFqw1rN_2jyLT%J-lS>u zC&;~b&0AM%saB1e_sJ=yzllv_*`|xZc8<{7gI4FuturYbvKFIbkxI(joJc$+Y249_lD(*M`OQU-;7-K6yjc=HuZ|fH=>Fylrnj)HX-|A zI?J}e9cH|J9`CK`zkNJjn@#b4`@_P^Z9Y;DiXt=53%lEiF^b@3lJ%{VBJ-aCe`$cg zVei)Gle`E^5Q7qn4y*b+ll#?@%X-=-S0?~B9zjd{CO>d3ljzX2Mk*h>TMq@r5V?5~%dFof)6Q1%c*UQQ zqTeR}B$Pxi#7Mo;F5fy|yn6Rw8fB=SK`Ea`EFrC+au$*snvc*Y7Yw~*D3IwE`$H_B*H}v{%3^PFeq3VY?-oF1R zOAv#RP1_|0w69H8b45q_7xg=v$Q|x}i$m}h+QBK3v-#pMqoSG?znRI&`DrOv%ii|j zhE@%xeXeSrF5f*m-LB#dm`0Lt^m=^TH!nAOT%LYqvPY-UIUR0lJ{w$Mr}YES7UjX4Up&5>LoN31Y-@o9 z!%y=fK#$k^e}q?`Gf2Dc8bgAZCmI{_awJig{y6ZBPuzA}5j^Kr}i7bmmiq@ z#iYs^PG#g$Ug%iX0=<1bky!la)%U` zAWOWzzc>DqpXLsUImpu3)THi|Cgpf-e~^9C%U9R?`jH?L=nTi63iFpXo&DdObT&3! z4$e>^^>myfRevocYX!q7wl#2*LY;8_axu!h{kAh$L`ko~p!#|nr4H?JvEA-cCad63 z1RaD83a-E|N^{gmLCo)en<%ZzY5Q5QzHb9$9zZ>RO>ni;v0sdQBzDu~x!&TMzC!E0 zo!6Vil~NGMN%b6qw831A(a5Qu-ac01(rLA}h_6SzyWozrrt@whTmbN43sCQ@T(p(& zZLh$d(W+KqEjnWw#v;Z~M~B0q+us-pf5!@e(ECEL@5d&H`nCFRj0Y8rN9?ctKA)g?>A+z!z~lHAi1Sl^ zf!S+S+qkGO!Eontb@-i)OjKloLjj9+8-?CaKPE%Iw~0OC@Hhf4=lhi#Gpc64B7;;q z&5`)rK=pcE&a*(JcIWSW?%w`8eg3qxVSH}huu7nJ!K{NZn|Tktx?i~zf#6z_-%x~N zFqpW^Mi3b6S#W?>btqX3ly=vvc#x*;GUtyq*Nu$1VyXDmcC)9{3F|>9WL$om`+Hh; zjZUA{zp0gqBkA(yv${Nc&Ak4fH)X2D(u14807%6uG1JAOb8pY5doCvXA0Q~tV)2p- z8&6$pb@+O<6_ih<`P{f8^m#a;pFo>Z-mGD5$AbNM-e-Q=^w?ej+^$`7K3CH_oFu9tr$E@j-cM%?~;3#nDy3fU|!m$B`Y3In>+pWvNKbq2h)r`6}p zIq0MD%9%VS%kjC{Ty_F&Un2JIm$4@-G0zB0grRkSIimd|DJxVH2DnvdpKLJ_Vc)u9!)T$P~cLGLyK~zYrAyk-`hij z!=ynOo6h9*DpEPzPoL@j+cdho?biuN2Ws$J^Ew@2D;vE&vTll{{azQB-;fAXs||1| z=j71@MlM!6zxoz39WGa!p5_yT-)}l+9vru*iTz%dvajsdx-4!N<^aE^Y_IG0y_7LM z5Bsmzvl%S^w!qbMRHgDE$7Ui*7i>rfCvZK}$o==p6Lx@nz1`;jFs42_$VWZ-+j6F- zrE2+nt%aPM`w8lCbNRRhUKD5j94LnY-&5X;@xxybbrsU_M7+Q4r_%PNfex5E9RX~X zK%>W1JZDvaa&HP1>R7EDP^8vwwMYDo1&BDW-^8U8hyZf@A3hRKSUb3+%;av9vwz!Z zjN2VQ=#lWdS*L&Sy8{b4_rbL|OQk$s-~_w&fZuAr+2b*jms;hI4B^b}V2Dh_<*?P^ zbyxaBuXSrN^i%B9C>>;jfy0oSY{@9=DWX6>yztP45=MNu5KU(f01xZ7cyHDccDB^l z;=YzLW@`c6JCpqpdhEKkb0!Hpq;<;B=&C;2*G5PC%S`l9@`1j1yQ5kIAh-j_+=Bpn z#QFC2kyxM&peX_G{IS+Uh*urq<~vcKF@6LM+iv4Q!0%2F-QhBd)lW{8PJV#wu-)PJ zwlsyS#k7VYtGSR|rp&0> z5-juuFoA=2MSvEI5Qo#CV|#ApxE+#@op10cp*VyKZ%(WVg2ja)L?nx7`@~svLJauR z#w@Ffa}b7uoxZ+)@aDhf^<1YLC&N0RDMn2(gf?!rfBhF99UC7#edl2WZ9wFLj|3m| zK)49(Pu+w3%8w?k4C~fY7)id)yjAOFZd?yKEX_h&XHH&*DB;!6F%o5)o57 zyPQGXx=Nym)5sgoT>CnHE`WVH5j(h5B$822LPrQiCYDi2huabKtjj{nOG`>h#WaSA zF0YAy4@ZYbj1NF3GNz!CcQ;<0O;)8+xRoLSPiaREn&$w{h6=9i^$6uK#fbO59UQyo zO5DU@8sT%Oga`@<<|nr6xkGA*>UjH!BVYLtOezaH+_GsF3u*G%H3os`T9&(OsfW?5 zZF=qg{WJhZtw=i?kjof&#fQ`eD;rF8r+oN$!un+>ORfMH7MxUc@Zv`$Y6(jS8MZ+X zJN6P#2c!Qdn7yAe6R#8sBH2YUk@u)aL?i(F zHP&daeO3Tw+N{^g{|t%_kUPI#Xtd42b)%>1t#P7@MD~J3>Ytrf|5|{f{$=4wL*rQ? z&MYOJz&HcT4Lk@UQ_YFIu`LR`(c7e?V(-_mqD~b16yX8ry&Y6-3aGqx?wbF?OS8i_ z4P#a`Ia`hl|<#c7^m?Ys_O2QsJC z2PLCHlLQg}LrGe~N}r7~dz>-~e%vm4I)f@w%u3EKsj^KR6&1nOQ7Kdo1tN9{#j?!IOUT;JS zApwBHS)u@#N-E_@JwuK<7>Ht^rili(B2^V?2+OdEOsIS?3#lr4ra(DsIbu4jN*HXu zDd;YQAuF7glSqt6FqVq!Zj!k(+MJ@~?;v=Va%&TKNChL}+*@C@#$Vxsc&=bDI1qtw z$9k0h3wZD!3~jp7XZi3D0MwIY2nFM{hfG8X_UPeDH)HL0$l8k@}wg#nb z)(!G#7;PT6t1B)8Zb+d#2(g)jjTIKGrIII8We#mR4I{NYB`X}pb|=tGk|LvM z42M;b5UeZ(?ipMTmJ@>YJJ6rYR&*nMKK<&K&YN4Qg$z%I)4+s8 zw)A1|{~}oTSP(m40s-C+oFQ|nCt<{hB^B5+%(-FYXC`H4l#rqQRKA&HLYROBwr_|X z(A5OEn&q%0k7u@f@$%w+iWn;OLDL`NO|HVgv(I07$hgDwpG7enlm<_nm}rs?&_;*%1ldTiho~Fuo64bx{>{lG98^@%$6=g>Vp!vhQG`qmT$jq#aGX%Kg zk|^8Y01av4_tHNIB@FNuH8gT^6^Ht;qj3F5Q6LFeFmf!|^P$Cw=GjFjyN*0CQz{qH z5)@H?c2GEA>`73=j8&8yEL8e929hKw!@p>NDrrcUq= zRZ7JV{5 z+v8?D3?Kpl*GxF!7Pr+o=gs#MUS7Onj-(Jhn3m?ha)o`MMg>DnOF)dFK=3?31J;AG zEf#Gw`Q1-f9#U)LuBxuYN{A)yZ|IWC1-((`qq|j3c`tf7PCS+ zl4!zZqS-5=md3DDJtNNj(rMD-?|q*IS44xO;06x&R=zoQR@2%JA*G6HXnRv4_45?#v8>_&U3nkhK3%0toN+7$mjAclIzO2@eo|ho<_r9vTzz z4;GXdBkIpg@Adcuv%5Kk-N2&u;3)*TW3paB%<*@p_oGi$C6FPK(6bKf41xg@iN<#h zo18v*xUp31g)G6_ohm^-fM>-HSUOpFXQn3auJ}Z0C+#XfhcFCzaRim( zLvWZEjYfgWZtZ60DD_a-d%L{ee|#RG6&L8jl5nL)R3OLYMjhZy})LgFVd`!uoMG1dtD=p`pP_4v>;# za1D?mBJmU4L=1k)Q2Z+9EDB1omvA*Wg5pN3&4f5(R0zQf4^&k9)J@Qm8^4`2`F|FW zPJ4NG1T_$ZRwCcx(<7*~4)&>{&D|0iRU3}Am-rNqhEcUd(?wkxGrh34_H9D?TFuz`+5PqmUqiYUfdG zqsI;cMPjSlwX<$R{}#PDu&`$1KoxK@%21~wxG}8gjNClifPi8j;M#zY-=jjcSgKu( zGT(ZBq_&(X{itNR4vXHf(tXn#nd=7`tGyOxc9C3VFefA=LZ*?>8t{lt^dm7lTd%_A z;rEPSc1jLQ(O00{usl53lYenQfAAQ<+V!k{5Le)8pUuFyc&fvSg>@zj9n0l<`}BL; z%KZ8qa%$qb;#DhEz%2^_+G=(aX{o&**MoK2AKs?Rtl9PGO5`SlzeS@&X*O`=KA{Eb z-*t8wOB7_BzuDJ|c6&c*F$)IVUITqL*Uut{)=R+*Y*+xz7TiNJNkY$`&GPzsCde=F zu^`B4vkO9M8VZa6LD^H-EzX~jg}y94iHfyRl6+hQ5uD_2OLSVWE`I<*qOWMoUrd=F>irW8L&`GQ(-x?2yb&PbGH6&` z_kjYW1|nXIjTKlkxl~z`#u0PQ2j?Z1i?v?Cql@6MnB{7(tJsq!D#fgYx`6HHXKm2b zE_vyA*iTE)6f9Xq7BWf-O#guXbwoT}S=>|#@zRaxffV*JY#1(^mFK-1b%&Xp2jEFQ zokp`#p&|+Re_`0*{16tC-fjXMy56`8)6!7?c#*30iYD`Ej!$I@T;4eZ=(hft@pHpp zU{V(vKFJe4s|m~ZrR+pcR*N1`wclv-e$2_d>bl$dUE_nHgSw*XEXq@&UmDEO-Mh3a zuD6}{u*BS3O=r-}SJa(!n~;1pT%CN zNdPtB?)vr+bCpB;Dsu*I*ArT zS*nG#e2b5W7a+pSI(JPF#Fr7~anrR+bmPc7f0yO+>Qq~q)W<5;ojLII!F3ND##h+jK`|ZjhD>>N=W((L5<1JP3`@A;ioOd1ZcQ-pftX*z)%;fU( z;{?wGbq|8Wd@Kq(bC^MQDO0%>7-`q3A+C`urdGJ16Lz|$?X(ZwBC8vsx<}9Q?-QD5 z%fM6m-i3|>KzwfBFw7=1iwGWWxh@ulVA%jS5r$#YfrWJQ736b2P%(73NFWk4^gKEI z0Ma4>PZlAn-_8$}%D;ci-v>oF-qWa7$^aMFKd*Is@_`+eW|d)yUV`Bhr%j{l4VvP- z_^t>E&a7+V1w0icB>+suU{tGoF#Dk^{HURCr^YeB8an9936AW6bnc)+sl%nvB$Yb; zVEb)asql($ITj3wJ}BpSU+?BCYEP=X$fT|H%y>Nd=t#tCK z;%=X2k|9tnAN=e4_w@~;&DoIt0%jBm`mqg;H`u-)=iI_Sb55kit-u!L_XcW_v*Q!iC5IJe~*?@ z{zMlgJ1qQ(Q&x%TCt7}6!16TkdpJZ*jmh}!`R%IrNmAyfaS;xiNw-DqyF~)6QK5J6 zeAD|;{?Ck$t^=(?+Y)$8uHgUJ9G-jUCw0AF)?Y#MvF&tPHTU|X?spb5yl&4d?tgrc zF0Fx1+>9X*Hqv3jJj49=Vi{M?wf|WLUL8iEDr*J!WPRJuZ1vpFU3di-7BG`#H^8Dp z7in{QJYUa&7vnQd83v8x_f&Z)n!Rrrou-68NOEK(L=YYM#9#-0V_6ozJ)O%ST7Qfv z`L?(my`3(hNC^AgocEwd$ZOCUlz0y}-@^}FU##@J>ney1`XWZp_EWBJ#?_rF#%hYM~{GP81T83UF&Y8|D4+Lu-2RoPQiJUK87tHQ0tG`DeJe)a-=pvR8b9iKPU#7M+{9UjIHFZh}x)@76@rWIx+ z%U6A_MP?UVqi}M-U!;`f&FsB93^Y-&5Oe~f{>DOlw0mLFEo=P9lcA}G{1}LJwD-MP z)G`}Ueg`YZ@O$0%sqi%$P)lN={Jfab zC;rvHfq`yDk`SlaO>YF+?_mt1qDP0`-QF^l82%^tM7~&WGFwk;`*o1^WBu8$XYdWl z+`=4_{@dQdO;e`zD&SB?cy?A4RZOU&J^v+7ElSZNA+@1rNkenO; zn9X@3Qb=BGJYfF%2_Av)esV<2C-^0{s`h=b-;oDJ6fTNC_3ne6S|$M0LL2#I+xMya zuu9AFyFRbeGl{^9*^hNj|N4_5T6Ca;`)oY_Mht)xH0iaJ^7#Dz?4WK3e5v1ICCJP< zfM|{WB51fMNjJPX4D)%o1SZ!Gf}PzqT8B>RWtY6Z&jZ6QN6LiDVugNh$Xy?gzAD;n z*C9YP!o<}TJGiJzukCvfDlD!UZImoP1FX?$@&+K(K-c`Y!?xkDUj2)ivQO@#G_m*f zLFz(mWDw4%stOZMtHl@e-~b2?tEz6PWX7*@HqP9Q-qTj%Zdyrvq4!_wxKDq;k-5sX z<~hKkWFhyH;jm?73z2w@lhFYAos68U`)I1HOnk{{ZQL6kx7F58o)jcnQisQ}tM~TY zN}JeB^OXh*Wuadum);}M1Olv0GUQwvi)Q9aqjNM>2}Z0uPn(b4L@6QxU6cxCp@i2k zCNX}pMzuC;>pCG^SYx9zy+*l4p|4kGCCdoGBaRpWnrhdUwx(tn%E4O6IGes(;`6VA zp&>FzIIINurN&z%BA$2G&PUp@v8Uy_{GG-y=O%(maW#UJl_WEDJG^$sTUS%(#EUni zYMoa1qv?y)lk{5s4o{{BxpnuMI=!YKoA8*7xU&U8kJsB(b!@!FO4pmoIfQ`g3MGTR z+`Lg@YbRRj57%#%{G>s;{o(7Bl4)%d7Ye-@k3g%o#jn<{2@6?XgYl=n`B%>%;6NA@ zCEoxQ3o1bmMkSU0cx~Z*kGc%Ea83?$YZuu~B4+X|v#*g83gAjFr-g@5A6JM%(|lAr zg$eZwgQpzgyV%tyhES^)iAov5s9V-6kWkgjStbb{+-GN^p-wt+{4>e%yV@u}Jz2L> zKZ>%7do1sHvTFlCT@Cx}mH*^aOkvXMky^x4#N(_ms_XCBe9NeI9uR@}`(43u(p)1t zDvDmMEppx(J~ZSSL+1onKK(t5;HqKFcQ|^R{#&J5yLXAy)8dcUK0oOMLaEX6(*7is zZhm9#V)c=NdEg=V>Td~rd~V^%-BGvSq1@?t>lUqM?Rb5E2oThBeeEY0IKjGis+*)e zy_T5`c-JBK(`Zsuq6vQ7hON3BX;$g=e)aWh(rF0z9rwMUQ~z~wCeJxIJRsU=WuD4k zFR`2fZu5-)33j;EX_Z|<10cTjx`{l`+bDmBd(HZ*{nBWwP^MjF+%mG9Mm{)$VJFM${x0(1yDCqM*yb$1c zl_w~dN}HLQ-C}!`r$XcWILRx;gBIG&?+#c6ZJwrcv6XY>Iz0h`LZ+A+)Z^8e^NK|e zFSixWy88tZ8}*3e-Ja%vYa) zUv=|;Eo8bF7+rkp-Rg#Zyl{9~*=HmU7=VDpOGQ46Cd<@!cye9u2Zt6|x}5{09|SzE z&u3QwJ&v>w!%EC^?5-z&1-siuOk3cG;CS!y}|8*8rX^qm*`n?N!BH-l%zlR7Eb6fp^p1!47!b(vKZIOVUV) zK6DIh6f1#9mrlh@SO>g<=*h`w@KmeaN}C+@GpJ$|R8(RROIs<~tgNiCu&^+NId{es z2v9Wsp~je)IzyhhTxHP6J7%Q)_Kqo z{Vh*1O`Bt+u%OJJSfJg$>L7{{HZc#LyMY|^Xyf(?@@W;-GWMG_7q}SDVf#Mr`#MHeHrS67lOR9DK#{p-Cl|{-ZQ)`Z z@8o2kfGq$j`prCI^B+`asH3E$`JAZ$lR^Z`Fn;oJR8%r;RKk;KyQ!I(L9O;6N*Y^G zsxW^>>Bu!^a`p`@q#Y8sS#)J(%6LW(NvyikgG%gt8cI6Zy5LO|q`6M22Gwfhd`XAF zA4Ie{I-9FkQ52)mRQ zVZpfe{Lqj@-LkC*55$p(IK0R=j2xXnFhgDgrPlQtnlw&>E1y=(5tw!)v=R_WlMd7< zD^hJpSG;dOGN9xTV*B79B%@5)tc%{4LCnbsnz%wsCs4S|2u`CGmN>#pY)s-*WZ4mN zZnM290-Ft&T@glUOfZT8n6l7K8Y|q00$Jpc#$qFJ@Civ`R2rID(j+8%eXA(Hih`oC zHk7L*rGlx3aSP(SF`N(~SQw51yDE%DF_%C#m>zjnfQbYT`!jR1SuSL8xCkB@3QNP$ zfj;(t1i7KpfH@sIxFCi=md5g=2nm7XsAs~ZaGT@Sd!pIsa~#Yco5Fe%$9`T52VD#r z(qlg5xa+{4V7XEdW>pkCN+@m?!6LeND|EOR2KxZ1oisl- zQAiVvJvK#{NccfCDx_kDK<~aN+r*#o;P`Y-A>vtSl`Q@3pqW-#CU7uGXyZWNKe#)2 zvOsm9gJC?@kq#jew=e9crc^tNQ!Tv&3kra*9yCcIfN1NBd;uX4Bmm8V_*+_0Ntc2} z4%TKZ*BA=t4ay>L`h^*I^SOU10%GhQ7!doiefO0Gt*&I!f^E3*`0utN}I z6^<|Bz;{X#3OY+$LN5(LlAmWH_8r$)fo>4mQ^)q3pO4T4N(@sVcp!Ci!MDFb_`80* zeJSi;e8b~|{zLrbeR!(D=zEs_#ieU%A87T!1osDf<;7IY1B3|Fgb~ak>uh3Ta{3!Z zsT!54)1r4BySR*oAApU*tRJijyaXXK5VL2Uype${CSW)M@7IHeArDTp<*@=4C6V7C z3zJUXg}o}~uCi%4x{Lh=AGs(76W#_ZG7px?jzlma3Zu=;4f{=p1dPN(Y%A=5pfrXG z1q*B*lLQMg83iPZ)jmaBqn`o<69t9s@LJSUo<$TS>uz&MbE~Mh7`504@@!Z6ImC|C z*F-j491Mhk28)TfyblbW%p6I1if7ar1&LNeg*ccZvThHQ{B{FElkvegH&UW&n?}7g??fvb7UhRCJW8 ze4u>9Dns2=tPZk&SD2I_aAA%Z4ue7MInLit9qyM*%AZ&n0X}iKsAS(7$WmE_DkWZp z6zvVR5nOatg@K?x+Hosz$l`LBU@TNl1Pz*78Y0QT_3R+Y#l3%6RY>1JzcId=k$E@W zLkzSby~OEj!;e+e8=?;w*Mev>9F0X4PQUj9?gg3mbora22ZsmQO2GS32_Nn4=IPI@@3MJu2G#ItOsCSB`br{+IOtzP?Vei*lKMOWKT|h0fIR^>1{{usMC0DizBLmDd$jYc z%md%zH(PY6_#8ejwQMeB2;ZgN&*W6>`!MqM!i|D7Y6?QGtBD)P+hA`Rj3C5s;cyO09Tw(i*A1IW(s301VvW$If?}UAo4Yk_TN|Aw8!B-J4a8@`}7By9i zgdDJJ26){@j1XlgN*IA?z+2azgb+44Ss9QGZ38MGLDDg-VvJ-G=n~`^qi$QZ@z<7} zv}o}H8Ky2Le8>?Yv02e%CP^$Rv^JLdNg;eK?WR(Q_-s!1^|A(zwA;$w}|Aey5- zAb(7KB!QUU;&?|?vuep|{oe@?a3B+MSuJEFvRh0IvC=6l10RJpYIvIP%l-r;w_()| zpUa+r$NU;N>-d3wxy&>Rdfo5*F)5~s&0h!*2>_5IEI8LMzLk|UlS#{jNDxy{5{XV) zyVy=})T&J`Wk-OiyV-noyi(Ivlg5Y-XDm7{p~A&M&@m}JTeHz~&RtnZwblEfKp0u2 zOevQ--|FppFkxuKJEUJf2QjdK1OYk}HKf_+A8*bBA}-rOjmMVl+-b!KvT%}G^@=z$ zca?7YUWg*za-}LeKR-JuY3+qNux{=8o~yg4Acz*1tlAzjD-3R*IV>zr7Wt)xTDLVz zzMZD>as~2piW;03?Dp&%xl{v@3Z!<6@Y4(jf@TBsN7m+v&B}G&ina#}28zClzh((( zSbc5xyK`9#HdEKlt8G4`ckeLyRONE*;=fhPfcKXpAeY(u^BLxTK@m?G@}MTBO~IfL z(sS(_p{q#`AUsDWn0tU|u?o!;9qRF<`^S7o*}4$xkF_BYir5Xu#m15kqbtI{EoDZ> zB&a6jDwJSwvw9mHy-WMgne%l|mmh~mMy~!RB{=ExXYQZZ7f;7L*5e0+{J#S}7F!3U zVoz4z9)^404_wQieZ%67bM+sn3Y^Lu-G09uJA(5lqvw!M$s-?x!p=6}SJ;^gu&9y%}H!C~@U_zf@< zZ((ow1U&UzeKh4=ou8j)vRh8)Wa)@lYe!dx4(^u5;gc7BTxQo97`9sL#;V?Tl#7>x z%sTUuMD8I+xf6Eagz>@~85y%Icl*6=`@bpnizt2I<3IR0vhc_%%A7h{p5fzh`5Vvv z5BJI_?1BzbgTNO~yT*d$9#N~H#ne%TyW{yRF15I3PO ziU{fNDhd|SkdCF0KwU`AQ*H2?KMQ#IjIpZMmWffbmNO3{afKAK2PW`tm%>dTx1LSOeyz;oUCW^b9|o4b|K^=TC_w|yK4yV9!q#!ET} z-ws3TB!bNTNI?N{A8C@Ip)#P4nv6c>CUAG}bJdMY!}Ja?9h;hN>w0UQUK&fVzn&ly^eO55tkr2Vhjk(`!^pOxuTewqM=W z&$z7~XJ=JmVFB!M>I{Fn&++w51Tik`BQNTXfb?DUpVPR z&SAfjJVEPwzCwE-K#&ZG9sfh|74;V?dPU^k2uz@VzK&zwXKIZ>uhfy4lMJ4yk}fWk zAt}*#-EAuSxmKRVWjb`-y6x8r6lEv}W#r3IdSI6&6DMJ$GAX;1u+=?j@Jt6t!fWw6 z4s;=iZ8vZDTkT&i?`9(I0}d{@g-;hdvws%exyQ^i;7h=+RviX}Lg1+5>?4)oAwezG z8X&h`xmInmt^Gd>u10h@C8?|^w7yiDVOi%1lx#Nul3_0%!n$D?kqaS=(p!fkpou1>&M>~ zy{DyWm6zo!?9HXpLG`=*g#GjLIdRB28PfA`_#vcUX&N*&_U#P{Y8z(`z1jFQr>+kC zzC3xnM<_gad*D_1CKz;6HFh&uz`b-HBE^r^=Swm2>=m;vC~JK zXJHgXV|oRqhW0-ePuHlpu@1jedgk^U|KdSm(&~sEfY~r#n00}JpZ;fIwEb%=Dw%q% z#TI%T*wnn7uGcZh7Nf%d!l?DkVG5h;+Bg?6nL}LWr2RAD#B03|ygDyP%eHebuAqYE*YgE*0m<=6w2R zSA;_>S1IU*g-LF}-hRpSDZX3S_h!s8-%qVh^kZS+o}4=VYOVcl=d(K~m@IuXZdS8S z2{A!Sufrzw^ll)nAV*^@OmRof|6I*nVkvNY8@L$;!k6iM{u=qRPAq1_95<%AJ0Qk% z{BX@c4w!I4Avl&Qn_u$%Y z@IGYZ-u%3GVczyy-n@y5;!CAHoVX|C0D<1IudIIEJqq3k9vb>pmY+G-?SmchFDgd) zJHll+PTGkJUu;)!-S$_3(>~Qcl_2Y3lnFKRk1;;~A_ci{GA{un6g0wN??irDr)d`# zO99UB&ymorc3a+iE4XB4v>bA1Re^Uacrwvhg7|L{r<%`C$${3ml9G_6V}Jk3^^yVn^ingcDO7k9{wC2dW5b4znQur}%8{j z1VVuMYjc!KsWJ>Emj7da8EoD&+GzhTJP-7FMHHWTSWRUyhGJ9v~R0 zG3a!E7{`RiW_o{}kYp-zIC`u>ABmfpU|!mQh3S>}lZ5)K=9qG^mys4H=}5Xk0o_>( z!|y8ZhkBV%1-|nrz*VDG_%l7G-*^zg3$(%ZmFcM!Gr5jVc!7mU9?x#nu)P0fo7aTP z%rt+xm;1}#@4!iE@AbiU+w&roIxoYMi(LyY`W{~vT#YIpuo3cIFXZs9yW4%e&m&{^ zyu7|@+HUz?)BwS(Ah*Zo?jW?0;q_jv;M;%HQj3ezy56_Puyn(zG1~e=Nf^2Hq$ocV zba6X;i*$C*&cVg)uOx_{j%42t@umPq#g>u**N=^~lne@rlwcUVd2Tu$&Yri|nD&{e z?KbN-pR2C7Pdx{kv14M$~~jFN`n(-nV({c(TZ)m|1) z?0>nc1FY>9;%3!n1iFt$hbR0$t^46!;G^OHYtP$%oC0=3Q_(VXpROpDzBgV8p3=#v zF~0RBmYvZ$U%Feo{DeHVB+~~4i z2SgAF#JqTPG(26F#P5G@Ic=3K@-@4+HiElyJKbw_T5O&!yDgP0aXX9^NRv#`ZFM^a z6eE&}_`O_Lqf>#w15AYYT;SJn;h?06%hfLWr&z#J1$)1U@nTlX8MpmPy;GC0vDGvW z6{)KaQ@M;yOt9R5By1C92}%7?Z)nn!*2EVhtV%p{rb5&)o8!C0Hx>yVEmUwbDvHpW zv|!y1BDl+~mVm|6sk5c4Kg=*<;7)3dmNR*pwp=+vxr3fjH$U&H6heRUY1QmYBh?x7 zz8v46Gcn&vs^(-jeg6o5(EEJ|35FEr5W!dr3^3L~#WvGa2$AgeL^50kXdzWlk%%_B z%?8&Hfw4?9oDK$DjZUleYGccURvo-VQ2`1p^nZO0?H#Rh3kd`iA}T`&KQtw(?3<%r{3!d|gFVP=&cZ)RG(*pY=em5E2kSP#zf% zE2aV`NlJYa1*aVdg?<*iBLWu)m0Fe3K-LVVabb|jXJke#;;#>iKD)GX>vbYggcdFK zZ>`z#{#gSAbP-fO8#hSlT24G>|KsVLgX{YKuOF+8oyN9tW81bH+l_5Cc4OPN+L(=< zG`9UapJ(R#{ChL^&ScKn`|PvcYrU2iy}rGqoFX5BhfuVMInk-Go&RKn{_1pMKPs3W zBdm~{NTXiVm=Kl>G;xgVSVR|Ch)_4UJyjDf*>avGt?TkZoQvn~H3uwto>#Jrb3Hcg zzG1J4O52RS3_P2)Nct0xI0bWGF=@m*Y~J!^cycmWz%?w&f_n&7qoV?` zNgOJHDU2yHt+2Flh?7KHbooOsN1*K!gyYl#4th3Cva=D3UUptxAbL~3J3J^b8NTAm zCwt{bc7K;?o+ES~jov{rUAB`1W{M-U5Y0PeD+|o$g2Zxe)`$Pxjf0^45yp?MHlcdS zBgj?8K4@PJO!b2a=}0_pGJGUV#N+}dNTla^T2a|{jER=-j5u5gC*=#mn6Rowz1cP~ zG%+k=^lKQA@}(gWGV}raNMO5Ar9&`r-@#K)ce7Px{^T;&Aw^gjoqbS+_|F8?`+HZO zc3^hmge92Akj5mf*pG}fi01hAp5->#Y4s%nku_pDw6H{$DO?JCRp6vLfI`VA%T=%3 zB1Z=kf+9l`txthDg%dCil#fN7HV{q;JAO9`P zZ}$+~Q!JtYEqMADZ&H?94KdSF9l0h!nDi||RKs+R_{9_|ck$4EaTDX+tE7i;WS)Cq z!ghoZN^as!R8-^CugS?jf2JonQS&iNjWWrxpb#`^TTpVcX z!`#CN5T@x0u3*J)z=b))kG4g~lhykXj0UM6`soX=6sVTLiW@7zL9YGVw74jlb?O`~ zD_vJLh#Psy|mvGV!pz#x+r1J9W!l}9#y`KwVM$^jSsURQw`IqI@F>_t& z5o-;>FNul||sdQJ>!f2L=X| zn2Sih+hmGs6JyZR{#Jzx;*7<^5>P$Z-#0?o#(nx^t&{Z@x!+*`n$Vc@KJ)q?k?rOm z2uX{2+n5QsKe}#rA~BbS_uJg1sL-%P#v2 z-eJtusUq)326mWgH!EGSUZgl z85G*h#N%+i6QQov>=g!FdW86_ZT?%ETw6X#d2((YLg3vfJM!~0?1nVMA1TdDCWK!WP9&u)U-I6uGPM;l-)^lllp?0= z;t>{TW?Czr@BR%%mLOHlbKl{5{&7`j?6K*2=y3KS+q{K)C5{k8?I&tA|IqWwvzc_F zL3Fm(F0!)kLp~Jjv478e3Dn%(9;+d%B0-SAvGaZ0 zcwG1ER6k=f?7o039086W<-~%G)ELxpIMBm>{=`NZ=FA~ZBB7zrFmotm*4i+pUl|b- zqa+F`OhXF81aS~TNb?<&ZID79cXv$&*~ye44cg2A;Jkfzaa-HWjuL}0Z8q$iA3ctq z5HpU5_!7yAka7aihVTrA1~dNs+8%7EaS+mgtFp2(2p{-WEqGV(RrM#sR3UmhMtIi} z@K>jO?0t#ChtKV-`b2$35{woo3~(k}_%AGZuE#OL!7zORL|#T>Ije|d#=bM#0$%b zCoaqSf48?QB?p4 zSWwF2k(q^J8jPueFg}h)bGLjCgO?0E&#(G@d*9wv?|C?qSXs>{f8A~lgi6NY16&jq z6&=!PI_7~|Gwoh_?FOU%AgWTqV`OMLHR_z)tox7GOCa0PxaIRHWk)RYKP^DMyrDQT zakuwn_x2F5MLZv3XY=`Wt;BMjBoND~$*|!^Ii8fM)sJ;Qw)o%PFKzzVi;Wk2?*iuI z92FY1fYw~0UI`fFGRW;)ZEi>89lGzQ)-8T*wmHd9>MY9q2s2Mnt107~_L3&z9SR*x zA7N-+UvOC7w!!SV5lOqh^WJZ-DWF$-|C6% zx1u>G{Fax+3n>yoOJY{Q%-y}BC?TgT9{To#)aBu@GAC^|mtCE;$m{WaD`;t}`#8@1 z{+mHsW;UnQ+&&eh0<~ejZQ&_i%lV7|2ZQO{K6feWZ6qaGLe~zY7sK=JJWG76diLfA z#5_~+@;{tZW1!^3T{~LJZ#AhL~5HA9^H<84AX8>Xj`l|Dy-&D5BYA-0OhOI z)^n7BYirw`mf*sw*LEdJT#&xK@?fKwO(qs+_4Dpe&U}f&FM-z#dESS|lSiS=mAAm| z7oXmzQP?oVdus*U*$n7Ib=Go#Cz%PQr%<|fUXrX@kUjnfNt`T%t$>*Xm7ambPKh0h zDEDZ_M?P!a)uA#~Hr0nH+3TlP$wGdN*Kav#`p`3!S1}1VuyR5X$9Cs~i=NJVvcYha ziqE#Er7{J)#oiiVqa?Vn>o(t*)?O)XXqkYAZ-X>Z!_W6(pL)5hIS875(oahIP~z34RQvE<;QuK)BJ4Z3qV z?-V4zocTv40#vL{iOJ0N_V)5(SyYME%jGl28>~r(FHj=+K@jGd=~Vp*Xk;Mh#5>*m}iFiO2P(SFaIT!T1UCf7s1pva)=oV9UYt5Cit@ipI zuFghDJ3w%k{NNC~-{xYgmkOWbt3gxuGn_mR zD4m-)aL%3Ndz=wPKHqGnBN5nSha%~%j={iKx2$kiZ8Qh{=JUIo`Dd49%#c)~fcJ70 z3;?B?zS2@CO?lMQ=Tlc$Wlq}n&~S5XTq6Ii(3Z@XX{Jrd-13nHVJv0?-j#goAtLI& zJOmHF_k+h6Hu+!~^uT?&F)2`k_v2F{W$n9&nGJp=5U@-!A&AI7y{3_#0%_DoaP8LBm^`g!<<1DMdixk`4?Vi+K?{eN)m0Dna`)D=r^ITkAv~X#7yj;so z({yw~JF20MLMf=LyZS?wi+B5!90UQR*9a5pK1+#uJ#F_Ruyg%SOTOtYI;?|gnQdnJ z?3+*3yl!JdJ==|Qxs(y6$|Q{Q@Lvx64>#hm{H~zmOx@4dLeIcxqZ;YR@Q_X=#JC28 zBEz=)_U@fbbDti<4Ru1FnML$*HI`Yjy5BY`!g(YoGQd6pH89 z31U#IceoBCUr(_a6hK6!eL=QVVATU=5yGCEpX zT+BA*ak1=qJIMunztz5b6&Kgc{d^T2JMCux#(4ffZ8DAO2|(;B8FuJ;ZkaQq)2P;H z1_>Tc{6XLTzSzN0sZq7u>a8g3lrT)A`hyt_t2gUtG5pgCzVC}H$-s_K`5f+L&+Ua< zY!*}yxcb52a{!`jSo$CC%az-n0-@QlMVp`V9T*IFNY#2R$#h+684X)Lx09YeB1IVa zMn6@eFgmiwy&wA1~!MH?S|$k*B)iI`yT_^*UM{*|2oO=6r$PF1a1 zLwCt-JmTi|(1Ma=;5=@t%jtDzF#H>bb)EUSPEmESOmR_hF?nezMQNIhydosK?K)JX zaiK(Po@wHM5+kd#S<2Quh6-Mo)BGft;N8qmV`M}r**Nd_X0Ei_^_SuJEc=ezU$bO{ z3&Gk;K*o6Oo3nMnMsZDpePa$0#M`Z!X)>2TkK5Wdp40b z4SQ8W(@Lj7O`n$L2D2pu-ee-ynWS#~uj?xgz3(mFkM{gt_u9Qq^B4M^w+#wgGf%5F zSuJht;^P+PF-%z}go4k1B)B#?eU`~aA1>ctZl~Wq`Z^eRLwCpMs8@S@c|pQGzWcvf zWH5UL%V<|y4gGI#rv>@1X8NXbc>V65HFdcz#(0uEj{1zp=Q0X(>3{GXPBebmoGe># z?1MzUKbgJHj5;v%zrY<_7?u06dp#pp)soY|EfvJ>e+kI$%y*p<)j;u#K{hPyKqv0+L zeu$8c6(l1}Qy5bp_vnhV(E8Z-p%37#uZ}eh|5j|(sZKM#UtW68GsGHrT3xiWt^DbU z>E?apv|q5?-WGmzx6e)AXBVGAgP~%_`ZH9`V4ut9X$`a&_Po7RGWEU+kWk>_ddIGE zJP`7%mrKU40?h6z)lS9U4@g)f#*}T}gW+dNb=R6eMDa}OS~$Pbh>C)~df)d&O)|-t zbY{Q1uET#~BB-UjADzSFqYCLf*861B)49R&Og%D#l(R`P5X53Av>*LtedJKk=#-q( z3s>0h9pA6X3MJ)#3D`Zv90OOz!*j#XxAAD)0h^o8X}O1oz`CvODi{c#yVCM_}pDPnGzD+uhKD5Q4CcZbX)I8<~mPe zav)~oX8)OZLtuM8scdTlwHcftB_^T?zCRVB#`E#nucw>IY8Dlz_+4%w_kMoB)+n8g z&@^JGbNlR1G~p`7`|%J?cwoV zWncc>GaZ@uVU5+J8iW{$h*LJS4Y*bbIc;&&fKCwo&9=5i?GoUw z@#LAi&KYwNdkwC7ddK?>NEUh`*475~{_`z4@2`)(d)-S0{s$|;uklQ}J<@JGyXbt8 z((s`5K^Vwa4@DoeMLjXr@QR(RpQ?-OlUA9_i&?1@*YA_3_Y^}EUVH-fmp|QFM}b)# zJLauRA2{1s4xZwb*PN;f8XCHu6QMu*wj=K@dV(d@_FIrNMBm-cFk{Bw#S;K%{+)iA zRY9IDN@~1Z##A!~Q^Eus5+vl$E7Uu6|D~#)69Jv-vc%zhAU~fu65vO-xaimkbH~ zOHXIn>Dgj9hZT6S66ol=D)Wg+^K7hRsj8TmRK~~Ue~M*GZS08_@evZ1A-~ATAxsG$ zBW!yR{0u+pK&l3!GZ@D;6gX5^EXB<9gTx`*wi+nV#7y4g!f*j7NC7M9j)@7(s1O6g zLIb38KL?Vdc9qn^jirN?!bJ~$hGI5{L?#;;ub;d2JiMGn1m^l&eXzOw>$-XAT=Dc9 z4;h>_E_({Qa4iQ7*U_WGpIW*BA}@8ekrnl_`9dn+Zk?4*m{mdODx{H?C~M>wQlwDP z?MOIW#Jwv)s9jXDDsF-pR^uH(Z#3fY9x&@yx%E#lK%AANAPxm%9s%uXk%rP~mCAB6 zeTy?-7tPK;xXv;4i+1`ZG2oal!m zHA;|tIq0OG)Lo+%6r?Ol>ZKZ}1t&;q@?GYsJ^RK3rivCJ20=Isp~5L`ey5olRSqW= z`kadtMlVOYP26~}MZ174DW>mzIiOT9jv9`0loRC%+{d{GB6OTlbinDo$U+LSJWf zjIT0Ef6f_=03L+GXsbnmp|neI^#n_-S^G%?FSSe<8fBc%koGSzRjqD9%fX6DMlNc3 z&Jp^=8ZHPr8B0}+TJI~xsI>?YMyNC`IsbHhq|sOgMfv#g9qgNZIPZQuwU(VRkD7Qo zCA&mC0+~#glXRFk_(0+ep*|W3MH%xS90{r*Q(NKtGR!+{Efp@&)L@=HjAfp?nEvVz zQsHux#bc8wa}@;9##eN3QcWnOi>;mDcqM8myB0|<(R5>W>r!eJ8FjM`LXxx?CqH)h zZy#hivXN0=AUd@A*DM!igUE4sNQ9@aingjt!Ikd~S%nTSP1Qpt`}$Ij>WNwxy= z4VJpwX{y>4;vW<}_5OH!v1~@z6fHrt*pLWjeWafWcW5JJLRG_chv3%ZnXgBzn~8=WfD-@F;Px)E zcX{zcwr>YIf*&Fv%q3+z>;&+vd_un&^4 z#k5ZYw6^cvWyESyCNeZX(JSQ!J5)_Ny5s6d7ELr6? zW)RD>%rOFWks~b)h>6oHl(6n!%b77#$g&;P)!V*{c(m)|&8y|JB?hD)cio=r20yF2a z=`0u@F)|Z>?Udo}RSvFtwKJf3Z@oIE8c92N{x?d=vvmPADY|UbdWEvp-sd zGuL_;eVd!X?DMj78ze*S!kV(!C!QzSYipcf~zT0cg=i=8=C4}|HqbnWG|8dQ47R|go2A^JW+ zB2Q$pn!O~k0ccQtJ*|b}J^ue(Y@Bwh%gSVlzV>7xcASZp=mwDAsgvwh*EyW`f8(;5 z$9{Vh^OB)O$7-?heZBXyzhEPih^sIt{AG5d93SW7e6kPdbRO^b@*L#xCB=@RQdh`$ znqa-Bzyl|n$)M}U*%OWFh=9lL_afiUI4*WTNHjfdHSn>&3!#!#uiEH2-v}Jwi!qZ4 zeA|LC(O&47U@1-xG`fn@&El|AvN~A~r<6~>+OM*R&;BhfC%4w>`TSe*)xY;&+C%qi zjaJ9QKZ(f-^)i_|$4kcZ)>^|xkHgJxS)78t4{|C68ufA_|Nf9ED&)QcTtRbkkng_* z2S0-oc^O`pv+eX9QGvIkcY*iU67%orB1Z5m1<**56sBOv7Lc28=Hs%z(!j88NF8Os zIWx(xYyxf@A#cP%TdwyHy(HjI=2j#n+AtnGKJpG-i~{{;8Ca>jBl3~pNmArDo1H)y znA7=aW@pRyn!jOfSE@WbpF88}-$?tN%nTL^Pos*u5dIsDIVb;ET&_RE&%ZKRVaU}X4qId@?-KgT*CV)PiZBhM%w z&W!E!X4zVYaF zcdX09B0Vopeja89@X)e`%`guaTcNn{VmmhMN7_+2$c$B0Hvq}BT)p$(tm!L&*^`7f z?Dn!7zA@uR!do1~kyU{pPV?~cGu&EsKnyJp|^F%px!U)=katxQ`jau5ZCq&TM1)T&iHOMT-c(hCOeSs_+d;xwUo zQ*p5`8Idqo{3~Gg8M9g|BR;j!sFlgD^lJ3l0TWIOAlQcvL&uP2BRC6yzGQdpc8xVi znV8JEEpfg9fvbkwFYWWHTHg)5$Pp;OL!-eUAD(@(xa|BsyF=%q5OCc_yt6iZ#$QtC z6!H18Q*~AkA{Axj-FZ`_Kq4W@68m@8WQ5o~Qt&2p#4;ij%G{HallQN|sQR`Wjl9Kj zI>iW92}1p*d!rslv*Rg=8uc2J!22U1tzNNAbJ6}jD~(kYN~&=m6eFuk2BtgBufd%@ z_|*JUpinwX&_gCAD)N-8O264SiHpAwaB_C26?-O0T-&FRZ0ZELz&L=nB@YPJhzfPo zymoCC1MJ#|`wGJMu<49jTfh;~Sb+K+Wg%rG$0}#F<(_+aGx$}&@XoIIWHJ1!r{&b`q>7ZRW>D2ty=M9A>Cjhrbw zx^6ZB_+o?uek8l0tMK}2(XNdKD}t|z#t7I5DN%V7MskkRbvyAruTykpW0VfdtxV;5 z&tnHNxcP4sbeb*4?uKidIn$vxGMdzE-VgH!tYi4g?SO&$gc&jP22>lbpI`AY70|pK zIAH}PS*h_rG;{e^H#4ha^XbK0H8)$Ev-*xraS|ycD9gi^*NsP2>g9#^ z64dnzkAqg?-l+Q}7GqMs*cov+AJwEH8#OW~n3N`vj@#>Qf6akGPLb}5A{Ig@$Rd@3 z8QE4sdf!jpV9Gq6uidI-SXRJ@inO`6Z=h)$#d%Oq8Bs5kh<2LMr2^tqa~pFj zNC_hQ?G)f&CBj@GRMX~2 zIgOC81G5FeVH_qJ>Vo%0ei}I`JAJIEQX%_2zH_12WT+GunbGS$47SyimC9#ic(Se) zgNlvA$nvubAY@(0i_$8T+R+juUXkp^H0bHnif7%HEG&NA9Uks9D*N@Iva&}nA9@3f z2*Xxui!2R&8jtk3WHqHwr2!_0vp3RYI0Diq#P7Daeg6z0{u}5lVD<}^{=nRuM#~#$ z_^PftV9X{UP_LTiEt^J15OqY^l))-&A_R{`iUtp$enwBD4I6x7=TS!y6aD|K??6(; z;g5^4{%*@tsrzDttDHNUlAD#2;mK%y-SyU&k(AMX=AgL(+5L(r?nY4x%6`ab$qPdHCdAA|Wpmk+1FYoh*LQgP!@v#ic{(*0ijwfRe!Swb zBZ~%ge;`gNDx3O#B7Ieo@(1K|lPr#FOJySV!MEhU4$=972oAp7AU4jctB}jGw_=fN zzt!`uY3TPyeRMBAK8wfdWIs~TcD3zz>A)sub4W=Hy98Pn3gzg?5BY>s4kcTfm9&hDlYK=~<;$ivdnv2~^geI68TG>ylsm(ps%ZTtB=8(Zx1Rh`| zq(fndGi0DX^vx6i8hnW8tYB5MRR(S`>&wHr%hgQ2{wtD9#Zc$Q9^p3*tAUUVwqFS1 z_eB10k;`G4B9UT+$|OU<$O51rGsF%eH+>|?0HbXXfb=$#OdK~_#D4pHnl%moTeJ1! zGgy>L-fOpANL{_eS+x~n@g!^%Ib1?n|0vxA~;I=3RwJm7Z1183=#A>nnqo^gai`TGU(wjVFsO&u=3DDPW3e{zv=~kmuXN1g^_Kf|Nvg za?$rKpgpqJ=lR6<^}+XPCmfwp-k`-;BhCBoiZ}kI%vtU}Z!NH3qr% zB7ByTqp)#j`?AVVuo$U{hJD>=@C;u%9SIN9!r>Ft4;K}OGN{`=nC^WW*o!91)@ALm z-n`Bym-3c*QJur0oZVYer;FXkDK0WhWN=bg?q&lqlBNH z{fy$mST)oq35AlJwtB7B_hUehCa+p9YB4a;1Ax+G%Qs%#%T{`;2T>=EYAOhAe*hmJ z(1_?#;Xj4pH;t_EIUwA*YD@M^&zJrB!Ei@fBW=p{*yNk2 zr?*Rykv8m|-speoJQQdF{>YN9rLyoa(Z~dRXOH2tH?WXO7|>&NE=yBD6S2ITPD!~W zL>9oMZZbX}xwnZ%2u8BN4+J-a6O3W89Pjak{ad@$W_J28sr1rZ*=275vaVjK^L!6O zlwdz|dKGe9xuF=>qz5{{LPiN-#Tkr`P118jSiu@@fEds($ zNTpFwSuEmOeGTA^!?FDfWxn}-sAc5XJ0@hb%Pu1Mfs??P1BgM#YjR8$bAy_@48jW> zpGX#u(URdJX@eWV*wEz4qQ(!vp<&aIvU9n!QB^zm?UB>(ywH7|q@C>5^P~P1WkOm$ z`E9#$V?v8c^P#nkd;x=D4C?-|ACCqmkjV%^$P`qgizPsXUP7H|wOSL%3ey^^4l6%~ z1NOTt4eSJ4SOyRB74eE`Ks=-}WjrO|yO_zA45pac7tX5k%p@1gXhcx&UlyG}C6s84 z+;p(7W89mpjJv*5As|f^6|_SnY4x-AJO`G$+uR_IG<1DFgWA!(YaVqrJk)lw`v0F1 zNc`ao?<7D(rWS9Mdlm{!Nj}o4N9Z_!iBLxq!15}=XP^iGl|@7nMct&LmHyaW2 zu1fnG8odmSaV{85!i^TQ23X1id|$Dvj06oT;~Tm`J`)%wUushtUjg)Quqn(GnmXzy zJo&||-#8ZaG^?iI@hF5gv^0U*5RQvrBj@Hb;6sj|T9%m=)S%~o>0o?cUJ4+8;xvxd z$)N`X&JYB+gAvMt-A9AHMLX7CTOagFLe!B8#c0^ZVvK->Nm$ZAd7&lXwuNX5i5SO5 zU$0w(RH%8?3`m)srt+m2!-G-zSjN%|ggU{poggN*I^LB%{k?;KvFPQgdgW)RjHOrG zQ`Fk}Qc`p+N4bKZHeC2`fCK$KCBq>Lp)qjzYp9Sdl#D2$<9QH@0bk@lpOD1*Jn?C_ z@#XNzWqisTp_`yj0_5Ve}gjLs=7@7R`ZW3M0KXIaw}wRjpK%zQneGPm6%%VvOa%)3CVK zE8(NiSpJh3mt{5~WfYtre_o_;qd$N6g7?Aa?Zan7UcpgYwd)w9LYZ_(DnaP3&Vow5 z^;)HE$iY`Z1P!AJ5nOSTRlv&Ajm?l#H|JSn)I!zIVC#f1ra>4OYv&VmG@Y-r7HF`4 z&-=p;<*JFG51XFK961S-nm|GkvB*RLnJOm}U@BupqDA5@F4QC!=vz>e#fj4a&6*4k z@fT!D>_!vnZ_qoFFNRXDf^el68ZkK&6JbeS^({XF7YTPqX@Sy;&2Ee7mFlcLKTSSG z3vC28i9MvrRT@l8ht`}JUPpL7HS~NAid+{0D*i~Jjy8(;;h3G|L02Tbu07?50`3cp zXxkYpPUH#1XiUBkOCPK2YgcgJ_#c3(Icgr%kk^)%xBMZ>{S_xPDnuiWHT9hll^LzaJi093C9(qJn+Y4x~tfb$I2AMkeOPa2O4Pxnt(0)RpWQ z5o1t)h51r{7e>ee{Z}-Q>2OZ1=nrEV7LU+7SQ!{Zpb#@!oWx+NS)K#+K5|$TM8C*P zj99hMGW7#2_Z=!0yzLQ5v%{0HA|sfq8j8tC>MvtG61njPIaLX=mVZ#efsVvDNH7@` z2}I0RYs}PosLYf&3F*uwwNeE_gHSLOMXoC>6b96-Xw-pPW3 z)UOR!H%^_ui`)nIJ95j#NN@mb#!{OUW7e%Exl*TD{dCO-USZdn-EQ`6)r%vC^+coY zK+2Vx)>6g<45ySW^j)TDAQII9r?v(;k?F^__oFwu1bEt*)wCwv#Z(}x$lgYj z=g~^&v9(CcO_R}gmK`S{kJsAqED?`+!14uS;jc>i&$S)IFhoTkku72O+LxsT1%;dS zjTZT>!0t=`yi5L^RbJm;b$NCd=L@Z$eORsQmJ-3Kq3S6VX~byPf6(}F7G*W5T|7E9 zuHgkjua)|$w0g!isxM=1t%4$Sb=G-|gnCJWVeZaW-g~@x)fE`dnaNW^RA4@8;nM3~ zfoU@A6$TpSkVom7n_;{?@>kz7uX`Q)aPNJx!IOouUnxmTrCS02xC|UZgOwylO#Dy8 z4Mu*pxDpfRSGfP8f$OZ%o)>;Zj)}gtoO)6w8wCtk)Oa+1ML)W-tBiivp7NM}jT?)R zcngIdLgVR5ZldY?$;?j+AG{|PivpcwUPX=5)3Y*(J`yK=H$nh%J$fmbv|gx~@7BE> z!>l~o+3qG-Ywqqe6Y=o@+G-=%of}wDQz1V{mv`)1Ihm+wY42bWL=slrPUUfUYwRa8 z`z`n5{(3aGm1jgqL`?eFk`D}oNipb`_=dN1dp}rewKBGKy#LKwYj*J6UC(GpspPvm z`u$WC68P?2QZh`$@B7eW@V?g4&D+1%==O~Dz6A%5BqmdKta)N({K|bTEGhAsX4h|GL zoXR2cI@+1i=XvoV9BCuuaB+zOiWTNn(TVU`m5`ygeL>5xp3Y|2jnoiKrbB8G7i#3C zsrC_^=a;dHQabfsIaAqgCmdz!oX_Wn7QN38yer($kL#Y{;W!9pVbEcil$dCZ#z3g# zi5JT#0~8lr8zm6~&^5UWZ{!Vi1*MSMkm66jCl zwA*BBloWW&lbt0d1|!2ts^914q=r#}GmAlJ?erYyo&E)Cxk^d<&;D3?IK}I?E9U3- zF)gdHZMxB3HIIn55LyhJ>t2rrk%5?T^`pQWIbA8RX|6UnozvC!+`Oz^zFpm-C0Tht z61LY|$4bL*8Ywe&!5*d;5-$*)zSs=b#CT&mkj;RH(Iv< zzhv%CB29(HI9l|W}!`*d#6Xu=hI-k zpLT=o{J)LlHicZi+nr88GWFgGC-O}I+&D?!?0>jyb`c4@?yec8akjs^r#P|U$7+L{ zLakAtE*A2?-i7AduQrLp0dKPh3r$1Af=sl(k;TZ+(Dj?mH?R%q{VsE+(cBMspPo-uR?#nj7uJVtQdY$>rX+(p=(#NJ(QuGkv*da1gw4jnw zxun%l)r|konb=+p1gdiVI{@ogZjObiq&T%s6sMBfP80DjBVHRBrXcZIz zMfUaOHa_jGW8okYIh4$=w-*SQF7u$te%|dp@-N%d(rW(vO6Sj|5Gf@yChLTc6mGRD zP~v{x(dkYoFGqXsep6Lt+JQPUVg!_i_cH2tcue=VZuw0UQLlD-cvN<-3cg(x0#3Q{ zNnY76zMgncHUq?M#=(6atU^wibMiC?i5Wum6IW(VVetW z52IT?-{$l}Dv(Ny=xLzaFjc;PPqv=P>*rX~OUlfQO8pcZ@VA@#N!H_x75*igFEiK0 z`Zr{J%~r$GfdaF9|4=bYBnThm`_p6H^RPV0qQ!1aqgQy+`9OB^*SoEPJ4qos7q9Fi z?Ae=wx?JdUtdvgq*Czk>VJ=ZZ-1|ij!LJu9q2UOA&u-Fy5bj|6*W^fa@W#bC9-p7p zZ*B+>gl1miQt<}5>+Y5hEiI$fHZlhnpD%a?Jx^2azj4z10)ena<1M2!wPH{=m?2VW zj3<;@bnV*@CNkJY;|N2I=_(Ksj4T10p^}o+;6;#%t^nOm9J-y zKq-Qp-2O$I0~W(C=7;NjC_`i7bagGMbHP~>Vup~^+jl!W|Jx*-;V|a7M${lTNCgr! z_}>4j>-?{NC8w^Po5=BdT+ma1IHP<%?;ok+bG(j=p}z<|F;g*lTtPxQSUIUO<0mF( zcons^{X_{OjzL3GRDx-Fe|{cfw)tD#YBoAm`pe7uu!bN+3sm}fmK1*|z*QEU+^3pRD_X7lr9$q_=jmRJ4w3tY6r1hk=@_x-1{c5QhfeH&Q;lpa1CXK6&=!il zH*at1r+-z$J3+S7yeLSa{ed;S7;eWmW6E=x-lE^xF&_d6~vgu-TYo66=7m4EqY#QSwrSXIuUP7P!f2_*m<9)lVV`+`~ ztFqvRNoNlquy@!*X4}u+o}Qlcd0XMw65SpqWSM&ToNo4y=P4Jfl#7kuy{0EU&38tL za(U9+EH8hpyI4R7_ZDy$C*yRtfo7gMPEQsq{@zUK9`e1)$yk>I9{WuvZ`meONV80H zaIL8b`2r{-Al~=q)G|QMj-S7k zO|ks$j!Sd>2@t{_E|y!IpQA)_7CTy2P&V8CNRbDBOE?kSf+`!Dz1KRC)hnU8y2eKA=9vg^&&C@}x*Iq^?d+@j#uyQtHG1yzqwb_=thD+?N z%dnqqHCcJ*crEGZ4XzWbeI+L`q^+@2+dG=&uciO7S2&IR-eui-!Z3_W^PB(u7)Z$0 z?Ms#nq;#UMPgPfH`nFxo2gAluQkF=`tV>^;RcO!}wyOY6{N0TUP;IH#B%ZuOd%a&_ z7$&XSklyxMjpbwwsVKx;!zcVsM1BgR>UC25rqx`Txq%;}1$lYB@dm>wtnaF^z)>$2o&$eEFb9|Qd4u3G z+9SzegC~1zEY|v07}v&3p7cB61`mdLE}zpKimmtS#d~PoBFw$UM+3 z8ZOI&$aWhI_c`$b1xQ?)YWs~X$0Jpbtgx;f8!<^j%Etd9(X|g*`3W`kvbmT9{pV8& zydR0Snje{W@T8RIWn!WM527&WtIyR=zTjKi{>Gz#w2ZX))zrkq*fbNG3h9y=THAz) zn7Uf5)_=Y($y{G|!}wnWt1aVvzBlVDY~ILclLBd&@Ta*x*BmZwNoZ)Tw(IK+>Zbzl zFOO%7u&>X6tPM{C^Ki|_@5QM}VjDxIqPYihN0xfLWV|4gf5uQ?Y7nP#oOG(bG6w-}u|2X>a_4%5$sB;jm9r?^3DD{Z6{ z9f`YQ=-R$U#T*a`-raOMTd7L(Nw?R7r%@lVE%_mkHQ!GN=J#HId|GBXzifX5u+KmT zbm;UUSwwkAC%=8@_?b%vm152+K*{|eSZl4`YBL?Rue+X^A>pvrSnKw70G{N4%VOcs zsRQ427I_Q%Nt7p1%VaH&_^f~>Rc_l^MnYJ?JS2#nTnYU}1QD^_QbxWYlqLiz@ z-Qx0rWlu5|hxeoTadRo#VC4Mz49({gQ%l7F3I$3@x+uBCN`;nS!soOZ`t^~JRL+>) zb$h0!b?bG%aN6%}|C9(yHB|hos-VZi&>a<3OcwJ;{p_CL=Ps4FJRB_PC=wAaulqVs z8VHr0t{+%L9<&=qvMmPuy>Zr*Fjrvj&mVNEY@pKc{c&rn$)%Q!(f2fUV|wDpzopzX zzV`_>bSi~kpyxm3jpn(ar008VLq)vTA;7dg8jt&a083Q$=5}1V^+~_cW2F2sL8C~o z-=k8x4&f%NB!VF#==Hd_NT)$H}tDjE!YBt$+1! zF{mA8CO#l;PuZY|@9*>x{iMd}@)A?7N_oE3`3Q`E@VKz_CelI1FBZ9e&~yG-^+p<+ zI}YSvZd?;(gT@&9xdi;?bEyok>WfxcRn;g##tvjqP25bpHV;)68nvrO?%stRb<~OS zzxE$;1pK`Eb%~&hBr?p8VN4M?O@!%4)f2Ol?%!NosN%Eu9y1Opk^o?{1@m}fl z59`f*^ip8lBGTS1FpoidXvBs$VxTF!X@QDxI3O~sxaspcah>Gp z`K&0&@A7W~Ae>Em?M6x)`aNT|IJ^AgYqUPF&O?=8Ae9x8g6GkMnusg#Kj|-5izrqe z01Y18^Y9bauAPE+LSe^X9rQwBXV zbvfB97OWA3m+#tSmGA%#Df|IywcH`bdDePa@x{Y?h+XBEb;iA?hKpf$sE>@XIsOfBU+VV0p%33kFYN!h%R7%86tHeqc ziERK<6%y~zwVe*BvIzTtT7eUcQU;7sR6$wA0OmJpO=?Z<39LMnF_P5iqI4)s zaMquwrbh)%u400}#g=z~@)Y}QmlDgUlREeyLbI~6`e>KV92S^NmKw)i3@8%pomTgQ z#M9QlUpN3wJ}m4ELw@n6@3PU(U0=v(y|7M6PC1ye!I8)PN39e9R5qfJjdLvSGeM<) z7T?B~4M0Sy3Q;yevqm#PKww{sG2L5{C8}J8E=Ci=DR!5nS_rd_5rL*rjTE6NO&+Kx z>q7~O12d5n20@WGLSgIR6yo#z1{pupWILNc?))&pKih_m)DEnB)f$3W7MpoR2z;mL z$%A4`cK<^j0~t2}1D;~~$v+13+WH9=Sr?8numD~XI+v`H98kTRYLyNHW)Uf(1!U)~ z+dc#BXq@PoLVlJ|)Tv82Q@~$=s|+!YLoh&&_T|B#3^W{PJx~OKfqw+<3VJtr8$7*3 z>d`=lMN1UkIn?;iJf2jJrv*@$oYthhd4dOVbi<{Z8Rt{)3~3PHRKpLaG8?TW8jo0h z5d8j!qcikV4ecnp<}^WS-($lzh{Za>4jb`R#F3Ee0?eL*t&vi6Q=Oojn8b&x$b->; z#;oQmy6Avz*~Ey^=;)+}Otvi)xFF#zXn85jxqT;CQIbE=&gWNN!jJ*ZjHr^Z4m9SS1N(1( zuSj3@QG)1`@{$~e!HlCgM||)I8nOYvbux|~z^zTWWBqL{8@t|@jwHJ2Gch$Yz1gJO z=c1$?EVk^*pw*utR3`56D)52xK|uIs%T1n|4=czq{6Lw;85JrR5){hIr7AU%A{!l~ zf*`|zDq+l>g!@Sg9sVGyze>x1*pWF3N}H|Olx>miM?Vb-Ox&JfNAI-#8)l8rOhSx9 zXjpVvQ3$iiS7q7jh}d$KWL2kqg`h!(sPX`Jybv0(znJW&9BC}ZujA8#oMj&nY3W~M z9H!RnEX5WBqZJ<3Y(6j^nKXxO1!#)5P{HXXLthbLf)r9&Nthw&x1}PSqq>Kpzp{pZ zCd7yTBAQfDz?D6f_q*)HS0B(7qojUC4i!QgM8j(DAN|-xbbj;a>sP;SfyskFWmm&C z5;S~Fr^J+J8fM$;L{P<~mGfyP)^jaa2&d@(6++Go)66SGrzRfi)w^D}{X zGvP27Ax4ijqyHzIKAUwa9Rne(N14B@BBKrlr>-28n)Z_#bRbjoA9OcwCj9W=mp@(Ku@R!-44nz%JxP=DZ{eVAd78Z6suycJOBmSYNAk8zrUaWz<^GC&F#$C@OT6I+4%2&E&){%yOon|JrUy@Y9&g; zgJ)U=HL|6jotvfY&Ny9}{rf_CT0I4j(|M&neev9}9RFl@Q?Zx=yn4eRjhjClB~~ z3cWu_u$hR<_8mBIf+dOYZk9|7eL)K4IHNShxmg^RJ8e{HOqi4_t+u@8W49oT5@g@U z_h=OwG=5rYFnl-U65fjc*=<;f{HDk0WaoJYD-MX3*51=n7GG2`i_K~{`WTp$;VuqG zf93c5XQtQM@?E)MUDWbB0972l*y)8yDL1AL)h*F3HR$F&w{zy8;#@wxqxKn$Fvg-& zuOl^19V>6jMhFY|qhx@V^hZi7#SS-0R9asC^uR?w`iS*M@%dg*p2R%Ozt*0}@5DQkY-Kan4r6eHql_1gObAbmFhv>ym#MDT4Q z3ki>7u1dL6J#zu5#p>P;xNk+#SX1LzJG-9(Cx}$~M2n*YCF-;kqmTt zFCR`Ekk6Xin<7w;IwDK-llBU-@^dkQ=NEDV9(VJcl!`e#PJ5=CzAw#58X9&RuZP%t z+@=ex(*mn`0=H*6B(B0>XftU{pTug7?t4*`wU5cgT>jfX4nxNst+p>G`*eKIONB#y zq^%eS!sU5}es5=OfTLS6`xnk(=gs{pmnM5SqTgNt51<9}rPoYs}K!uYionM@ZSPV(x;oHhQC$^kP)*Oh23Tv4Rh%`-LrYzW6{oM@n!uU4=NQm6tBI?Y5KRBo*4BaydQu4E5701CGw^w zo9F!gH$Yo)y2km8eUZcJ@%Fa-?7~{R)1rENfKb}0-;pbWt$X`DAH{Qx(2VJ!$^K<9 z#PP1Sda+46(HKQ=@5W=9?1|48h^e|QHniD>~}Z5uj1ozE#|gbfO95W{TDnWN3Mt)MOuMPHuXgR!flwnQAAu zi@d`>i){W<_31IQ7fP7NT{LXi!)B05Mo?GXQLRj+`N>KG3#V{^MTE9$A#2(VL*jq} zj3X!Yt8Wky4E)dJ_sC1Wj*bd6x}BXgHDU7Oqn1n+b+5y9eu%()5uvUy!9CdM_HMP^ z1Z0PRg{H@8KLcEaudY62p5x`)hd4d$tB_`K939;X{7RJ8)EO6`yC?(rMp|0D5e^q6CAy)dX&FN+bZNe_=)&(3V<(gTl)KY@uO^rF2F5Nf`+r4| zBS4(h@f8!FrJfp$oCm~3vb~M&IX73JjH^an<@FdYwu8e_2>1(l)R)>jVVZ*)(-D1^|tTZytC-sQMGiqfo%CkJ*<-#nm9`S%FNqu%`a zag9B*eU(vU@M@~(0pTIi zt;=&REt1IRYEqtFC)&e^80kqim1h6iv%KGtJmptbm@mt#vW!erNO%z&JA1QFC_>}m zL>ki-Xo_H2+f$3RYRvP1q1#xUvA_821Ibkae(QJO-;WDvA#;%CH~+HllNm^!?S7N_ z#BlV>vntZ4n?;0_{c~y$`~;ogemRI^apYNJeW#Evz>p-RC*voM>%Hk?jl*?lap5*8&w z4uR(KZ+1QI|K;H$P(zDJD=V!$7ojM7yjD(7ur(t1s@FIZ)5>PUP!QN@*L@5CMLcY` z;UGsFq7cZuaEKZ)(03UAwyp67(?DS}<4AXzVM5!l)#ZC7S5)gXJMyf%)>tXkJ2fX# zDI6YRiOV@XuW?@){uM0RWUejmi)rT*Xyeh+@bM{_-X4N;i#~UHVJiuNCh61Sa6@_D z`OX%_TH5~#C1yY6>1S6X>zvGB$isRn=jiCTu*~|KLA%RlWGV`)0yl-v{alU>mxFYs z(UKJr;ig_arJlS(ZP|&ZWj)OEVDAczjPNU)hfuD-8&JqpoSGIFg3{a;l!F3TS@h%A z&t2=Cci%K?vW#(%!v_phN8tmA)r&;ZTu;^G6fa*JT-y7yN-#&_0C1blYR|fN0UDVA zb0{ioAGGtxHu8)pLvqi{jO4o4gQwfQTyhj($w~iZnKOQk{gQ8#e%KJ4K#l3Vx-bb` z;bJwZ@o5EC8RKUyBe2Ohd;5m~x<~_u1$|-KJiEKaabU1$&@lD&`ARZ3B)Bi?_&5;U z<-FW3_SCZSY!ukr8dB_ZUbI%t1FuP@JP;w_d(PEL zCCzEhgmZxKFz7j==uzN25^FA#oWtb!T1|fee=HHR(p9haFXru4H8X}#DyHM`un<$|;?I(i*i%i7B$q> zx$^wZ+YcQcANCSe>-NNG(G5p>G1z5U5Y;|(A$Q)Olj46j)feqsdzz!?eeOxuDVdOB z^G^w7^G=La@a2RL;h8&6j;T%^W6A zjk}6Pmvf&@;7NJV%~dM=mO=FUHxn+q2-*t@nO>F<5Dh4i&k3^K%5H4|v`ix`C`1Cz zEdFb|vj%C*jV4*{qos!aAIk+!>Zkm7Yp>y-Ty1K521R@z_$FU zYj6HmT0u!gkxH-2!A^7BytuLCzGtSQlkRG>;P*U3WlE*+d^8SFy9Kx0xR7QCDPagc z*aKSW{*3upEKER4#Iz8Ek1W34o4fXA-H( z!iqTE*H@D5yLz^QQ3QECDV>4TWu+#AVYkn6qN2j4=a!O%!h6`fjbRq&L+H~@JqQ&3 zhWMrH_JH@I>tow8u~hEkb(~S;y%)^g=pfN;eOG}st{EDH{Z5Y5uoKl+`ZSJEZO#gkfbb*`q>Jd5BcAou!&S_LP#yx@R#fCCjS-7 z0%(y#P6PkbKM5Fr{YT4+K9^G*M)kwDjAbs^J>qX)7orf@Y5FOghq2QEKYj~7JgC)b zT_%b?UuiyEq!46$GQS$H?P_s-K`x_H8I$D(=#n=8F^J9TA0Qs|b37e(g?qTjet4}k z^lAS-kTE|!ou2Hxvo~5eG8~=R=CWUbBIxtbI4vjwPUiYSH;Q8vmHO}5@(w*5mPo9v zNmz%}TZ`4lo`E7X@n3S%|_He;gcj1D!&3!fY3}BB+O!b079;UyKY&2>`il}&F zwt*m0gTkT|0PhmIi4`*H1RXV(YmJfvr#jmN6>bdSTBHBwy*}InSii+*d1jVs7XzaX z&Y;_FvIqKwU7Ti&ajDJoriGxB!*0csgO!(p{rty4LU!ij#cGT5OKf*$s~z39iMW&P zvraegT6b&SAAlN?mXw8x1iM(RUGF=70CY_b4`JcI;MJ!Bhu%hVi0q&%Cs`ahX3_ke zLP-UQ{{C&H^f5U~ux*`fl9;MA@z!SRhg6{8Aol|gW&xc051mfO@#nkMRlx8ui0jW6#5p;m*Jx`y9JKz)KZpkVrNEG%HD6hX;?tPP$QZ|vuBhOOOtJ`)6hhF>4GmUgaw$Y|W%uGbsvzqlG1bP-=q`x;F|Y{%j;2^-Cr!oz+@=08#-b;@C?} zrVpf9_KDFlJ!qIgrJqd!;YX_^4D9(u0NUyb375%i9|oF;7T0L-UfM8bX%Wnb#St|q zAvz<4h8`SGGw_vka2!ijYP^oG!hK+6(niyksgNhO93BgY=+HRD4m5z7()7(*i`@D| zxvC-%hR8tc$T*9aX^cIdLw?(dIv(ppMQI=c!Pue3#7D(RI!yC}G)d|4C;I7?;x=Q4 zzU^~3dYyO_Y#0x^F8}9#>U{i_%G2+|POHP8$@?+alS)9dTVW*m{kV&t2ZB?oU{FD!R zw+K}GRYvI6o~4qJgj(S+#tqFBrO8o1PLaC)TkK9Y=c5HPzChMFtz;B)GN&%7zn>yB z31K&*pu+!g99>P1{F9+HGw&y{5+#e{k{VNC^5?9Pgcd|$I9;ufIvnq<>LREd5)C|z zs+HEt-yf{#y%|4c)j2tstGawsnGl8PRk_%(50&tT+10fM^LerLfoa(}0`&p7SK950+7#AcF#3aiV@}0T@ZorE? zgsYYd6R|wNHZU4-m_hnGBIGAo zAGm6*e+_^w2Aa^Jb)f1>8wrVMl_ZCr>M0o5`6(#$WS1~UIr!4L9d{r@AA}s3nL|(I zaQDH>Vf94{CED^f6~@LZi4_1_{oHXL-Lzc9opeuFs;O*5Osp`d(1?5Fa6~=;nG6FB zIot398Egppa67y9_g@S*H%mHRX}5X$S9}}rTO;NqmHtE*V*f^Xl1L=sAH&5F%MCb z6w+FYn22ol_yTFZz850=h1Siy)r+>mI^tHJ<6B^wCBWzN{g}mE1dU*MC%&hfkigCV zBhZ%(PDMoI+v<1jin)cl?`#MvZ_mg$_m=~$?DpGto}I3p7u(wd9e2m-?N0MX^@b-0 z0H~c6XvlT0wzzWPQxtyKm`A4MUW`)@eL*iSxH9ndMsD{PO3Yx#;3in>Y$Pej!3H@_}C zrzQ8cx-D(X6O#bo>j(`khIp0<7No7Ab<`Ijh(ldRDr~IP);|+(Czd8XSys$L;QM^1 zF#ZSr6EqI`p;ku?UddO4@OpFR&uEcHCFYONp%T=jNLGFBQYO5TMuwpuE}%g@ZW07y zRO$d4T7Yz7Cmts zX|Y`{XZF7tY?QYcYqIH8oTc^;`HyoCAPXX?L>ZNgYl5QhG{Ri;8KfJ8bcD? zn2ZwFgx1RBkME#fg{{9x`bDLdK9_yriw3K8Wpz?gAt{?BuqeRPWei2&acfplU~-D* zX1w-iV?%?#*6R&jZTIuZY3&G=hfHxPOW9s1p+PO@Z{iPN0`Yu18|VLgzS?N1`0;q! zplfHN9iRGf{rZHs`I0A>&eCkHVWsww0qpA;wJxVhkZfo*sf(RtBLBv~H_4{SX;t}# za}2$|0?HAWy9)Nxg(`XmhWFdXI743`TD56-^a}Uqr=K`fP?C`M4)y0B z)Ax;$@EI615J%YBGZ%XMpK9yWcQKZ4&ht8_LR-5JGa zYHVDx2|QS42I=%&+@0<_qea4RE8)=tERKVShc^eG{mqkx}K&UuXcaG z9EX2ejshs?(S_=)pF^y>J@5oiaFd?ukHOo-kq+ADk2LGu0}_+uS5v} z)tcmVbad!538+qGCARSeW^RP7BZoI62{o#n_tl)6b=E_*Lw?;dF&)6*#`Chz&r%_G zt;f_GL^+3!rN5X@4tQG?LS4Ea7Ls6Ee$0l=RW!HStLoVg8xkEcfR_W#RN9Z?E!xZ%$u1M)s-L7o2jZQ-#KiV?;fehvrJ6R?95sXUdw zcv_=hYLTteEF8nNlTx#)Rb#R&Daof-?S&;iM3bkJWcUayc`Pk*_?>y^_^ZJS)vFlj zzbNH0oZgT)O$y~gv0{&u^`%H0(F0Ka@VcFu_T#)?Lc6aydTViJ+1VQizyCAD&gF64 znQNCT;l>Q*R@>v=I&#N1@O@NFf(WH_Jc|64>}oexrVPv+`cicVm>4F+i7i6Ngl9!8 zEH+$Z8>`l;_+Q*sH=Wi&i~6ft`QNOgWacYGSwWa=DI_dm@+1#%h2`btt(!|`>(|BG zWuIXtQ{2}b-A{po$5OM`I%W8{FL)1R=Dav(L+q%MY*j)>2ua&r&1ypa|d&ey!_njesJlm)m>Zb>u#q+j)v5qUJOSK72e9Lqhml5IGg@ml8jajb`OXAG*+99ptG@L;-DD zWKdo2*F>#LbX1Q3FE0JD>egnhW;=al>H@ANg4GteY_9!L8df#SHNZ)B_Ha5^P*LH8 z+)SEu=@7!vb}+oxR&<8fQeHCqSr!{xaWd=jJ(Y+mwKkq$yBm(r1^jnGlJL0k=`vws zKyrkl7({|89(adX^v{b8KbDZ!jg*1md@0hj9kyMXCUUjKHj~f%dCqFOs7SNzZ0ZX) zZ0SXN=^M}ky?M5=KVNRlWd2NVqDrFaRWHjM5IGPIgtLwcFS_pTv5EYx!(y5Nhud7F5&PH`q;QeLw;l1=zAFLb?m-y6$Uq^7m#OT_$;&*u(od4qUjf~fn>QHCWTHU~ zWD2+)TtEQA9ZuqC{Ldecm+Dpkny97+w!}=iT%Bm^FKT+eJyTaoYBib16?g8Jir-mZ z0}p?p*YWU)1hmW=WwstELW2=dU-Jupv?FA9xaeP>MpZd;XHdA=iOspP187&^)u`I# z_@8Ct^(z_~L!V})f_&;oYN}xs9(rJ^3M{m4KLmKwzfN_eMrvqvZC!>lhHNBG-}|f? zaFTcImz4a%v01SHzPP>7CmQz6u;*3oApO%Fp7Jwqi}2y~_WuL2s-O(JVgbg&$>lZ> zw7S^vuK1(q80CHNIO@%N51zF@s&3r`@rLh9S@~DCXC-W5N>79_IRER+$^~BrFMY$>QvL~4Y1W{?FnYYFUi^MNsAL>lC}Ta^M#Ex}>1MKYbL=H*D59Y*fCeWjId6LtWplZCJ^tCA zw_fmge!^ByZ9Vkm|8#e}{FHO>o8if6VED}H>%80fMrK07`{lquhx^4l-iW3_u>9MC zwA3h$GZ+4q0b}Ey4Whwn^MwPoi9#mV-KezcNNgs{K_rcR*Bf%N!w;3&rcJMRd87jb z;yQ!T2(u&y2@1}Mi{Ebtg|$7H(R3+yPcIkmm%EEVA06QSofO9LarnRgyy$*;pDC0y z@VN?YJe=}c+W=DbhljcTJYKg)MWcxlf*ei&4Dhh~@_ISTCkucJ)Db@Qlf`{De4TaY z);lpBI0d>xnQVyfpf6ww{Q>(qeS5%aO%*GcBlf{V`Eq3dCZm;Ao zxkDMZgYBwRXgH`7@^vCm+K>oce*#gPeYB!cCo z+@5{vs72rlm1)Uo`;=GCZL1`OgxcJJBhJDMZ#C39uo87(fsKf8LGkm7vJA2Z5d&`s(8pcG)K@l)kdEqG|ckzMh7##&d10mY2n35%PVKB->z$ zT|#|IEml@JxsA)-$A>Q{C6rNI%tPN1)MI9-7j)v5;$ry=LI@6mEp-*^P(0#FTZJW* zYS4Sf*U`Z8*D9JK*0!|E@Q^o#59qtxB_(R0FU8yqCjzlkI%;Bnu0tO}BI$5?gsolR zFnL&BYC-?=Uq7qy+*6?lb9PkD090Cfad-w860zYjWvj(2DGEvmA2m>Z|ECZ;h!dE& zFOm98`k9GZFGD>r@Yox}=N|M*^~^L=EK1!7A5;_p>R(_gU>_F`ENvEta{3o|tW``J z(j=0p@eEia`xmsn4#e?`XhII2L+xqtlGK0UTM_c>WavpAvyZ{HX0brV&Zz+#uxwmB z52g*sF~J288-b@w|fsuxCFvTDunzK&qu@;$iNj@?~O3oqg0nJop+*S2(rB{ z6MYt8F-p`h~(G|O=%%Z{=uMUw|q2Qb6xw$_a!eZRw>$e{h*BA9?iiY zAt2ZQ$$%zT#mHkbX~V$tU+A=7v5&-sN<(_Y$qka{YMYus`YVT|vw85nO*28t^pr5H zeP47SzIQb(ZqA$9O^~W(jkK21%fwTdQ`}EPtOt3TV0QK2Dw)7TctOhiEfZ^uiPQxV zzrN>qzf{KDI`U00M%t9$-xn* zis4gK(~VdeMS`3PrVuNdxC|;e2Kqq&Tqm{{;?|Z0idf*+N_1h!hQU8)Usip}0!X1R zW2K`*I_v1ZN9F5TISQ}^VnA@bMLSb|vx+Q>N5h!I;Xn_f`E#dlFpu7+)FiZh|NZ-j zjkiyxJSjZ1Q31ym?4Kc-m*Nm4Ntyvlm?TUX194}YiCv{NvGNM)IX5p28d)SS5 z#KE)+oZ`t zNvzOixCPqa0Rpq3jC`67lT5v*rEuFyB>9uEG8Nzp5 zv|ySHGc^Zk?Icw)Tm2a0B?sy$uDHc=mUVcc4_7OcO6#aZX9n12qOa73 zOt>#+=I=O{Otx)bAh1-lzC^=gbhWCMDhj^TIR<;_Wrz}W`0ts<@iW_c#l1uOIy$B> zg(Mw?_N2mIN@Gex^GFZW!K;&{NfKishdDVlMoT3*hgb0QZyVVeCMKXED&x95nQP+tf6wO8H-mX*8YHu4Dg8mIV?a+t!Sv zBoNzqJzj1skC&>y`65Cq-RS6lT&bWGfoHqgC=n35wIG& zed)Mokw0z#Dp> zO+K`o&fWC9=;2vnvG~l!z>B22BNV@(UB;yuVYs#$Gb-52bTJ=SnL{;PVb^<4tDAY;jDw*PkjSWAQp z7i8I6PBrN2UgsC1)my?drThx1XLiIw8;#oQDJHJ2E-oz-fyd>rb-&&jo6RL05{VB% zV?&J@;sWf3EDp4@euayY(46)9_Z*t9!yGx(kTz-5D47E?5tpu3`E&#<$(T&F5|LzJ zhzVq(bm>{wdPG+V`GH<@67JpOQI4-yDy`;0!iZ#YtiyBGjA))hwG#aq+bG`xC$)3oSq^A+70+hDfUm;O@*)NR#w(O8+vM z@$o#nW5o439%a7yddcs;b%Wv~B)x-RhL`v6@mH4xQ1}&m({e5sIbx`_d6^=}^?CN3 zV{*S(PQ^*xa{I2Q93?6dqjQJHUiLA-X(&s=N7zalVe1FuzCVB>u+(kyunevulZ;Dc z)C^NaXOGG17b*GvhqSS=v2fcV2DceFngg~N+7Rh&$)b47;g?M2mCyRaamIRyv^>sG zFsg`%h`P;f^~9$WHuem2KIJ7-A|!=s?NO{b8O+D^;R+XY;+6_jmv5%$nbwwm*UI*-8gq9)I*>mcm`N#|HDjaEu&|zVG7gK|PLeX>Pt# zN%vxY(TvnBOfQXdKi%*?8z#7N9PJM{esB2;m70_wRiv{oWBzN`-A+3gX$62%XI)(> zkA9YAEw@-js%O-yEx2^x>T&`;tE&|0y*Ue{B_~e2JFNKUMF7s=zY_2At|i-$DY~C% zBVMrh5ZuH0zpMf-H5g7|*fJ{>9@W_j(v?jY)%6s2{omlydGRNWvoNH??ptuM=rcZV z8yU{G*R7jr&NIGya2IEW!RqC1t3k^x>aLn2I$|b76wT7B-a#Db8P5Vpd}Q;uo*(}` zzuX>RudxC$W{igQD)ZLK(-yhDZ+Du9a=98D^v#OX1~U$Ww!BPIw4c!T?Zx~w8x5CB z-gU`zihNrLuMdH|g@T+sBF>j>86BOKCYrW~{iV*A*O_)U z*YJCY=zGvw-tPbw?S4qwONa=JKqE&Dixj3Lp?m|t(&S|Q=IwUNGjt@qd!NPiB}@dv zakqKCFwnUY0P)kPxX`EYnQE!_hNMZ=s-3)thlBNgU!SEO!VW+dRA`SV5-hdc90iJY z5CYLx+qI&;aYo|LFQcdnFT!7 z68zVH05KA9w+rWk^Mf(rMcE1nYU|B@wfUs+kH9=ytO{cKau7nz1WEI!KMIIR!trZZ zLQcZ_UgB(}dNnRW7|w2eF{Adk5^5bMmFq1M=++;rK9@(#6=e#o-u-P?zTUSLI{E#g zD1sh_wRUOpa;D(^=o92{mfOG=BEowI6Q`5-7ozip!j~9Mwqrj-$-!TQzTVSm{G}FW z9l)sgc%^(`Z2$Kj78Y;U)l8Z3mM#WXf2?{Q*)tN@UH;8$$uG`hZ)TfJ(sOs0&>LLO ztvH#(Vvg`@4M5ZREykV!<4Ff#mgazHn~=xflbMopsHh4QSpHfjb@L-m|(S?8Aw*2D_(U6h9At-yZzK$}FAs zvDjd}VTmK~2i~a?M_AOuFJd?ibUVO@!6V4iY0R!SE9Uk+&(|-xepb|Wq-~_!iFFJR zWa!TIBd@lga$*VyWCn<$*Hj}@kVo!)uR{&tutcRoM zCiS90phnV*)4o4d6lC<< zZC*rha?-5T;`cruKjk?0yl8GU^lB_771_?`5RO(9^x# zN*haD-!wiDaJ3oFE~o-uKiq?hLcD2kMh%QqYXIz0`&l=`?Evt-0l?7d^R{SfrKE|^ z{7Q6KbzzK+4urra`uK_EDE;vv(U7Xtt@E}>L40{efs16B!;KefbOCB^E*ui~a=bDS z>jLU`xs$*;O_=-P<>&pyYNziiCG|}S0WZXk2zAgCH$HBxW-LB`o#%K-H{AW%Qlt0u zdv#3zMTe>uwbpnTOT^t{etM2&!(qGL zQdm~@eY$5|*L`b6U2QMCT%vGBR8pY^fQD}M1ZNZ=D9}rgQ+x)&fK&AP?iOW0;btG5 zcbFT}^Y{$4tLZowHy+(My9nP`%jA?8B4psTcm=-{evurDn?4V-!{IRzc#Lg!01NG4 z_$Z_fZ_k5gLeHXbiq#4(y}B+N^jwuPuZM^nfJ$37q#{Kr%VNqg%;xM` zXSeqp9hHjOxC}+I7$a9Qq#Yoa7f8Pe?pIXsWGjfPD|vOd902XkS`;i49k$PBnVcB7yPB;mr>G=(aauJdm2R~CcyMAiSPtvvkHzg}mW9?3`h1iJ|`TnCTVoT_je(H3^ zR8f&>@6Y#+cKqrc(j0_)@>gJ1h%s_R5Msk%1xn%bKyMzv*+-A;-RcABd>#-XJ91F? zdid9Q496wMIo6S}*x~68-SvaOPa6CyNtUF*3&#%h3b~cy!tdlru0~D~u<81~3k_qo z3>mNG5gaYLh!lh>nN~uRBm<#|!(!rt1(AVTVtx!kA|DVf9giB;leOxE*_Sh4`K@qvh4M%(1)TBGiAw-^k2;E_^~Gv5sp3`&%O;I zTY6CblwQsI{(4aT4S6vTRTiULm@6b9{Ww@E=4*#nBK~bqvfI6A{UY=lfs;_pMHt&5 zP@8?~sRPE^@S6A~II~)$-;Cirr-Vi#(wR;5lri~qQ>s@Fr3dXiAT4lA;aehxdztf- zLxgL61X53w0?bM9Ric7x1l>ng$Kg=lZ1xH=E6|71Q&USNMJSfGYKyL? zWyRcdyovrd3t)mO45fgMFQiTS9!4@{mP7MxVw&*}Vz{Wok2HEQXta-X;t3Rp!cZ=9 zbB4HDg=`(Mj11@<%`c$qimnlV_lG`?Y8fKC)zIA$) z#9ap#ZBj5%V@P(G5iuT8iOpus`};aY-l-Qg{?z#NG@mo2AR{B{B^i8W6g2PBY$?lC z8ST>A8wX+<8z!Fa0?dUjjh5V8IGs?-yDZsj~SvF8eM=2iVnUXDz*#&0H z7Nk`YSO2mi)J`BPt~l^!NyuVH@G%! zku_1TTs)d-)NEI=5<$rf(N(iqzpg<(TVWw(8vT8w@$U(R0w)NPH9IflS#_*kl=Hie z^>QHer_GPvE#m>g|Bf^;`KNWLf5z_Bipbr&g=Ch*V1D48|7ELwj=@DHx|dQhQJG_d z-%nDJAV`1*8Z!nTJ^Vx-c^3hJ-Mfi9+h+`@k7u#z(ot30d@m`e5HxZm^0c6UCDZgM z5w6mFrsI`rA_iHp;v@=z7fzkBw;V+_z0eP4kP!&-!-Grg_d>M}Kd@p#;q&m%?coP7 zX<#>R`k!}atVWL!37qS5b41hu0>Q`-ML362==Ror<8Q!HzZd!;4xhWhY8KCUV3EDu z?lA&wfY6VNf*W>ZY7kwZwibw=0vUurlkW^vYG?{Xn0dPaQsi@`_O(C{1f|^{z`bHN zNs_6kcR#GHKHsm}t6&!E%aEj;h2jt(!A7Z~C6xmH-L|knIg5Req<+gV}@>65nw_uvAM6l*hB*7J%$9{u&l2 zX+`9?o%}Zj^_#X1sS>6T4gGk3f)KS_alinv2pLoDkJY;}3WMfiFc?E!=yEt7}b)03lNoD>i0iB>?uCn6NW;0uJX4%l_ zlR+ywB(k{e%@7M?tY7s}1BEs+ArU0J`uCeE>iAq)pOXUNtH*X_ZO?nnY_?vH+>;x< zuDplOT$^&-RL+}PoB@CPN!$5zi6THcd7k@97KRj_B&uw)R2bL&Iu>Nm-3clPHr@Np zRhxqTwFfmxNFp5h9AJaFZ@g^1-8MCt%cKHt4IcrJZ-hkrCikupC*eqo2&5@@$%IFLyS*Zd`ohu;d0w@e@zM|EgOe69$ z0sG#A-|-1)RiI(|awcTi5`Wh>yJtN*GFMCRpZ6^iv9X^@TA~VY&X_4v-Yu?NAQEs~ z87j&ICEFmli$L2F!$X0?@a(xf_O@*7d+JS=uL0aVp0fWu?!Hb-x9`&lI~)qZq8ims z9{|7u+<14IhTg7E*To`BkyLIGVaA%^CE{hG@!tvLyCO=FsrS7l#6x{bKw!hZZ96Qk z=e7Tz8knno2E34;E%>okOQ#_tua22%n3Tpu((+b#BN&9P5g;6j#XCl-LZ%`e>8ATrfZxl5 z?V(JP=;i%IoLHhPK+)(AY*{2UQyMz1Y_jy(YOQH!3jv4S2B7npY1o$m7I$aBe`~qJ z6)$7c=~RBwuH2w|7#RO@0Joom)^&qMjWfS)?~Bz&o8AD()s_pNqwR!9&}f_>2N;08 zB$g`R^1Fds&UE$cG`a9``5c7iWv~wU*jaIh5(x9t62zI;0QYhdgo1l$or#RS*}mCn z2eL(hGH;>?u_!^nKvDFqO4LD(ZfT!>>qgIBcm=Z5vl(B=J}#z}GNzTAt59yV-}D2N z+;?93DNOX^2l%t?LVHdZa>+dZP<{dvG8N6Pf{v9sDW#3Y~t5akI6JzfM1r#W7Ay-(jy; zf(L8q6MsaAnxHdgpbm{eX=cE?g zRdR-x5g2iJN+u{_Eow|a{_GfRbHZuA;IndDDx+Dkknfz@1N~e|S<1)bGZ@eptRkCA z$YUZle=;AG5Kj{CxwNY!{lmMV(*Ldy3Qsu-%>-*MlE2^&U+UcsBBPwQQ`GF~kL8o8 z9VygKhH?Z;Z6V#k%rOCSQL^D}Mc7rfl@Q~F3+o6c*k6fypc zBSd7;V$-)lIhtZS;t1ho6ELytFS%K@tY3o^T=sT;yDN7#s37RTx{>3j=ge9vMITaT z8k!18fUHU1W;*;0@qERlVr5#8J`6!Vo6GpHrJA3&X|vOp?p}NK;f%M=fAM%%@>P5& zNkxG^OfI@SsWOWu>*D}6FAC@=L!gJum`eD+oV5nSp`33t%N8T-565_RN!AJ+7mo?m zBVPZsn98^t#J~{n_;@RkuYGvt%L8c)K>?df@f;U0{XN^EBLf z(bLSNqvYca-7>U_!zdf=UV5+97tNWb2pJy#SOLf}SeCdtOvuh;O_Zq)i4mPvNdn503ZzaMFH_K6O zCdam|!#w+p!I~soF)`k}@I_#BY8CKh7WJXAQmvyma!+9m)sxEfe8W9gtz(%shIFy* z!E`*MVI)~T=Aq1D#6lBz5s(GTCSy#{g^-#m;^M)tRy6~u+2r0Hd53)i7GWNX=lUj* zcdNC*hLHE|$*%VZYiFMIIl#xWvI(#ZO<3{2Pnl{cmtZ9`Kz$n+1h1H?^YU`#KMHDj z?av*(YS04erY6^ul=j|L$`Tb)UT3?FP9cD?BjmCh?m(C@9o47$B!Jbi_}&(&S*rRy zA_#kYWK6jB;_q;ZJ^!k&E-^R-eK)I zbs*|W>#R*mr2B`**^>3izn_4i`sPaQasCwSJXx^Qd)tzc|08KC zL_ST?C;r@%!Jr@Tk$|OWClcxgk|7#h0B>MrZccL~`l9ngo;Ky!EhOrP>%kbvq;uPU z&DUYE`Me-@9WO~V9U}k(dV2Q6rOAG_*f(|JYZ(M|I-K@e%6bZ|2RlAmLq!=e;5!8jS zh}}&Cd|D-HuY0{ZJQvI5G=pva4mq>V<{x>UCf)}N~MA)pCgD7Q$l=qHGidE8B%})Di z*8?ty2N#DaX)P6fk85kaK6ZN~;Nz5-3?IGK)t~Nc8wJ?{mRrX&e;Jc%BrmGJy}4C) zJ_WKsM#(O+3=DG)oe*?8*G z(hgP5&|4Bq8sK-jvqP)owet%td|UcC;-@a+qn~gf+2u7d%eL;<kT7|Uy9boykXIr((5dg(PxVVg)WP)G;NsSH9L*lvhsLF&iO0vZ~LSUWqb4yo4Zn&iWW z=Qlugc3^;ZkhTPwBBXxm4GN*kiKw8sn7SyHo~h*<#sKLj>+;#2WSCeTwKSfI#Efj* z9CXqH1t(s^tO{&5mfNm;fgiXWa#RB}-_x;06)Eh|Bl9$7Yr=Cip?)$b?nz=jB1jU0 zoyUHnQy|phf6ogZLheQoWB&q84?_}f8Vd2!AzF2=T1FLW#&-NC2-Mt-sA!m|E=^&G zB$a2z@ztdYiz_X*H z27?C%`KecMawi0%$JTInM2)qJpbG^Zo1(csrwzq44$OvaK8+5YMT(fk;vB45D6B;u zRH@U6dVT@ni!EQVwdx3;CtZdC4-@D+Wp5~g0>*SmVYtm0C#;<$5(W@>wrA8KQ}DpR z<2Hmcl~Bc}qLdYf`I3+Xkxbo8T^(>jhX9$>{t~7B9!lW*5++l>#PrBE78{;WJEbqK zrH-xxV}{!YhK1x3J>@F?*_MR+8v*CLg_+D`0%qbSs<|T$r@CCYlv)c!D(h!TSQt1` z>Z0C;aI+o@xv6;3y2>~4>WYUz7DQFL5fdjEA@Pb159;S1@MP@1c~|ln*hOohq!0?R z*OTAxF$LR$`D90!-KY}MX8zH%!=uZ=4nTCj2*fF>AF^T{+-O^|#~++@T|m=7b~(P3 zsBmKiiuQV$B9o<=N_JP->8Xl^<3MY^Pwh;`c4K&?{qcRfvX9^-$9{q3LikC~&W+Td zgdIvx_boh?+mTIe`=l0>4oWks9bN`tgiwg>OT58sd93GG@Xcq%%f!^1Lp<}$HBH5g{<`p` zFZWvK??>*>cd67gsk~Sr*G$HcaVVul9(giG$mx~f(5I!q!9)zKrLX}6^rl2Yik}Sf>)j z#?UCU2h~X;yr%4LuW5ssiGV#G(2FLI5N=JFZB90A`T`|x$BABJP!^tEWzDlJ30}k3 zc+}lPLW0}t#Ks=s%WJJ_YAfmUz35sgylPl1k0H5vJhl9$lF4QdrT$Nxp)DU{K zgI*Jn?FPOhrIC0QX-;E@v3~taS~$b%{xUX2iim@a?IImzo+^SLeK;+viH!?WV>CWF zjtn0~keXt#b>nH~oV!TMUJ$CGRcN;R&2n#l4+j?;?o}#Y_0rHod9Ef)xx^wZ+BO6h za+dwt<{sh4N5Uz zL#lbwXj6;uEad3PYQK%N;a~}zhmq?SKl}s9g^@k{ZIG(p1nJWVT4n%@q!!`00 z@x9+wE8!M8??)|~~X0LPBzMV^-J8%m5az71G;c1^(%(I66>B+I}?VoXnkK3_ZY~R_Pm!DGR8qkm_ z01lz6i>GkPWqG5xO%10DftMY`7fNz+W258B(GRz0E1z}3P>Gl8TkDk92p>E;JqNC} z0B%5sMFx_mVc?g#V=abgmPlZ_u8U-7hBsn7wO z1j}n{ty+8ZIKH>%$tIeQXPzd{Q8#NOC4F0uK+yR4I#3BJdJ7t|lX8aFL_PDLXL7Y_ zhU}o7!JqlxU?zz_p$ltMmA(&_`(x+Rl_$Ze#=rI2JlZ_YzD)-B+?G!B+Bo<=tg-5g zB6g0Rg=%*_?Ptcu;ImoJ6v}IruXzs{y^9CljcEC}pY5Z;VTWRZh#?8;?xk%H=foklyE~4Z4VQzT9qpF#mjH7k{!M=&;T_@Dbl$W^ zNvu*D>;BbrED%G7YQvM2wNpDg#(4{{>}GCK;Bm`x@VuD*va>%vq(bxs<|s@mL=N=V z;F7w$SgexGlKR`=hf@vab}*S-_!fDVvmHBSyzTKE342XbG18CHw{ueMig&I%!nqc} zqmj<)(7Bg#zSde~Q3yaUYCP;$ii(Ov+&<#ylYtb2w^E&fKHLu-Bsi5hl5HUZmCN(~4lbyQ`um|A^p(7erkG`lF z=t_nutkg*pa_ju%A?& zrdFh1wo`&eB-}hXSNZeA!?I9|5-*sx*oqJid*#T5%$%C$DL*t|x1Vott%JWFdGG7_ za@)|RO(p-`7R^6Kqm0cf`_;zJ8=hLp8089!@O(KbNG|UQN%&xs+1%-Pe}PFN0rbYj zL1JHeEjm&ZTmh~@5F>7L@Zvv)z*Mgs+RI7DQ*~^k1(d$#y?ui?b!NlIpkA%faB1-# zC&>!{;B+&|f`2_V<4AIRI6_6q{4;D-UgYf7yiWSYXCTH$U zQmS~pxovxbVI8~P?qfw5tF$U&%FCy%ZZjP_)A?KnrwfKo=GyibBN726-^I?P$jjlZ z$_&ShEdY(J3HZ^p;dN7%UgvSK?*4eW)$!s1JiI{F?2M6~K7nS|eU`QV8mCK8z;mL! zp`yB_n1tqTONO)qc)(2ppOP2Os!)<*t!U38F)=+Zh`|8eObM4UciehK&)=a9Sz$XUT7jQCxZ0qAUy0X;NB zriSY4WAjxQ+F6Bqo?F4mF>N6YcT1yO7HteW(k>>161jzs{_?G!iV&N#jT-A8m$%|p zloK7g)c3&(7U0$Hs%6k%Q)VXZU=x7+yCC3~^y6Q<2b@3P$Ry0zVu!g(qnD*cty;e& zpi-z+p46WPXoh zF94}!qh&iVM4Q5psaETEglFOfq>GkRCIW<^K~^~dAt5255llsAj)x&9lYPO&Vxk*x znx+0kvYHdb%3L>w_qBE2fPSU@Bqemn(^1f8*DfRyrC8DTdQZp1Vd)RGET1M*c^Jp! zHwr=abJ2&wdT?zbNzThmyF-Uh?<2GnIZeHQgZ)zFsDII{!Y{%2^my$~zmPv9EB^F< ztGiP{Kg9!4l@pvDdT`J*mf~JsI-dSj#0tIZs;h%Iet-Ri%xSxv4{U{ge&*u$er=Y} znqi-5cXkHn@#tX3fRV-wLjna57s-S8h?obJ>_YxkE+x1(LVOcTFT#vKN!`?Bg^h9` zxUEwWmg0Xpx7@&ilM3E8eA+?lfO8{d_q#09c!_eIR7DgL66vzy93dDT6MVQF}V%|WnrGbS-uOP2eJ*pBY$z{% zp%ecv+tex_m)<$Py8YADR*RWK4B%2}+~EB1Jxm(qXyITiPbe$i-InJk0ngpAwF=9- z#ZtJ8Oc7O)x}0gBCK*kRYjhu7Lj9*)5G$rCOc&UOCVvyT1_7 z)r`ZFN})jf;=wZbbm8-U1|0`^Z!15kV;Wb%bKZF#io3w`yUl-%UfF9X#>n$Rc&hBn zfyJoy_W)j^q#1by1r#ZY1W=yo?s=m<`=rJFsoTXvR3~-P5G|F3z%$s4LrSX_X4FOxW3RyybCw4IL)rBes~U>%wbz>QM#QY;NHWUVkLhs~qY-m+g191B<-xZt zS%!J@wpv|pF)O2~)#0--+?D$C6&shs1a-h!PE}RcD@3C$@?C@iG7`mbm?Z5B+G{^} zs6wk6{}Y&V-d-K@x|ePy5(R|N@w#N%KNf%PwKZ*$PI z@64A1lEz0HsSZpL?=#p>`<>hjBv3%`AwelX$5%2G{Hw95CHL=e6 z{)shTl+pK(A^)p^A(r;`&9)2N@hr9zfaEIR@%nf;Bm-2gBiZg(>uv({uWz33P7XwP z9uA~L@&T-S`TkYzP9#@F;Jdps89x40bq+?v_SwzNKKa(i(}D>SQXL+nm-SmHld{UH z&PHI{WgnWy#nRpF?-E@9hqX+{4q>~;%R0-+6p)tBU8L4%DvOZYqtgRPhkPpi+fM$4 zvG?9y?GEj0s~vS#=?IAYBgFb$;ZMu*kqecmy%Aoy`9%;=T>oP+I@sS2sEC{B%*p%s zu#&agGjoIktp3eTGCjE;0kQJV!^}yZ4kv?N-zIj(GkWdEx_=22Fq{11bzu-Fcr;brSuN z5;?L+f-m+GMvD8^db@yU>}58aVjt?j{I-YJ&A`&tZvHg0TR&&yd;j`+1HkFK4hK?A z^gI319S+mj_qsTw>kUy&%lot0_Q?^y_Nt|&Ock)l<@ny~2B-x%Q?HABYB*pe%s_mb|k25pSvdh^!QJ2b6IHlUwf zA33-=k}mWMxz^Kb@qIYosB;BW2`lJlo~O%L2r#RtD7{Z@Wk&WNCdm+ecqk(PVsd|f zU#7QLTgqHMqRz;g934q+Ed0ml>FMd(3mP%Mn`#<=Log6C;P-lboK8H*5+>!g3YW%% zJcp1}&gSbl*zD-s-b&ubJ&ki&GkAsUpoP?0(F+L3p-*ablg69 zE*PjJyv-IjDJYrTzj*z7iA&&uL&DHV*XnLI(-W6SJhP~zJtmI)1w4TT%ahwbzI^(z z1VeOW+z>D45cW6Qg0O!SUAwaGh*UjUvKU0D14rsvB+d~-t-ZD3#pN}M=(avPch15? zQ7mI9;QR!-G?5Z@ElnkjD{VC`Ej4`R34F`AsFCK87LEB!ZFhdmo$b{3)>~kYz}dCa z2rQ%oXlW0YS|-K*qBf0gId8cL7<~%E!o~`JgXEQV?uQ_Yrq4jiREbns1-jufqyf4O zJ`Lw+FeE6^uXflE(6pII%juN2e~T4LxTlr|$Rfx$qk)*F)!a(6K=7 zyLb~hpb3wN;}q3127k~sxI#iIBgT(bvO_9#KqMq!iWby| zn16IP<)as~_By+&j+m*XD!i+B)rc-$jv^cXx}RHJ-7Z~8E=7RHQ_PDjrlY^_%yKP+ zjb5q?zU+oCDrLa_#G3CM+P762!<^&y^mMyaXQ`NZwSB|#-7Mdw4D?AdZUY)mfwuN5 ztJFX?HWuc+BJ9GPD&4O7yqC%9wuQ)K+RYqLCysZ=!+FBO#AH=4Bjl#H;8r>u0vh&v zDBPcQ)=z-5SPar5%qzxA*Nz@5mNnPd?u7TBmO~*my0kUr6b%7(q-C zR)J!5LAOKMfgg4lphB|fVvD306?tk+YA|`b#>g~cojU$dJ5^noc&;L5TAn$<9A~_V zZm~rM#%Opc(!0jmdUJF%`!He|&WJWexs9xuUNNit>`Vx{lU1%96{Y5;2IO}(W>B9l zNwv=QVjM!#LZ(`$n~x2gu(sG?tF>v0v8SL@xTZO(Zk{Boc`!mLq96o<#IL2Z{6gY7 zh+LfSI^0tUI#v*iD5>w@Gvc(hg?msT__PS2YhK|nw|%O=@NAvc@Kd-F_|>Cl9l~R$ z$jD9;tIm`=pJ`QhAb|HnAT}CU+etC#LzKSayi$fv?);cDf#RF|91b1spDc^Hh_8>X zgbvGu@YxH-Ne-er3I&OArPe$KbFwz1y8@X^KD@wJF6yVW8qTAfJUY~wa@PfQ1k=aO zGF1BpL+-G?+9)r32(_jR#T&u@ziK38Nh^)cTJQzY$C9V()-BxQUB@7&KG8imm zq;S3^EAZl1x*}DN5IJSoBAC;od&^HG&<@;`lm2)Tq--H9=R#j=I!AT5GuA* z0mi4QWEKMu6DT{KoC2koKJs`fWQ@)TH|HO=bitOYzP|k4NHQp-q=0@F45<{isM$ue zTC{YI81o%HT3S8@p6k*YA+(`Vt+ITj48NDPj1d9*VE;fyT#X~LMUqTKxokvl4&g}x z7AzMn%1fnG)~!p3)mWrP1B(+Ut!5k_a|1Q_CKgC$_`6&)4bFp{n+MmqR6fK-4pDfF za1m2cJS~p99;Jo2p6DP)JdN-{R-(rfGFoHCNK4ZUaSC#U+w`i?pGUOs&*cEBRcp}! z&VERrn3fjkfQVv-N!jimUxVo{GS;{9ZldlAbbjvq$o^*R3xDcWT)XtbLP{;78ll@|Adnz?I}h-5p-E8B=l`0mGkAl(Wa&XEIFKW5k7Wx-nQ2sEj4+L! z`Z}QuUx4NCpx46oH6wT9%i)20t;l}{SyPafMWK68YyPEZ*^%yi^uP$qR z^pK*@;%U*K$o)?ty*`}L7UpTyD3Vk7D!O0gDB@)+{#Ay4A^`tXm*wGXDp45nCG~x+ z^+6&0&s;gc#KSR~FNp~51x8zb{)wTyhFnT!CnVpbVeuP@^QfkbCgvU=lVXV5z9q>6 z-p!+#Jf)R3{pU9^iK%e2lMd{;oqNS}!78)9<#*Nip&e~(UA)r>HaXTnR>X;#TQy4Y z^dkBMc5)otS|=YH(eo|SI0R%Y82wN91?Nd~>c9A#+}pZ;ECG|u6^BkPOa$?oJS!Ll z2tDgna>h@}HNT4q=9}}al@B{+kBW6Ul%nwYf5aockOsrhI)$T#0VQm}(?h`FgDnka z?QmYlh>a=NYb)-m=`JY8)+m-##cZpYcQf-=$}$i`_b9~3;^^gDhe|}+pE3l_ZP@h3 z>vgl?GNkP#8t{Dy#*W*4Xd;4si+vAkD-nmd=0TfDPH^p1bN*S|N7j0 zmQ{e?wXkTkcU@>^`vM&0ex;~2{v~xQf8BzI6L~)j7ck&#Iz?6sOES#;A;zck{BU8= zVIxIRSj<29^Pw`q_}(7{8c+*D z?wA&ia_^bzoqz7+cX(f(-x`#?bGvigPanyd5xx&^{DeRaczESOi>pq; zY(r=oooo@el?{sm6u4I=oeR4tV)&?!g@7UuknrpjV65(c#vObP<-NHbE^j#TJe(c=^G172~m!f{5kvwcAxRjaU7(pWv?8iC)z(d7v7bjLYPXtkQ&6C?UvOK|Rix{KB z6Qc}&iy{#Y2jW7+wajGc2~ra9)$yT*?xf;ZOBw%wO?bo)ZGY@%MEq|Szz$!`tf)bb zU=21lbS{&W0FdFww?`WT#FmXMH&s={tP*iaM?vh#%qIOx)_+=Z-uOfXwsCS;i{PV{UYC1YY6HN5Q_P;04IioW5AnUQ;!6F zvV2Ln`%EE>x&`+En0=<4j_CV*wZMk_jAJggSp$BnoeZ7sB2}1*N#m+l4 zJ=-f3w=yktt$GbCNG#QwcEGlw^V4BvD^NO213$6F3liegqGtILR`0!prDv@`>*<9RBYPDFCH!@sq(S?ukWw#(!DU)rD zvrqR+kD~R*3S4g^=D(&%pr&xOZ6c&R`6X7E+xs~Bz$BnSYsCYj zk9FJ%AbeR0-JI4RsU%mbk}y}QY#6(K6XLSH*ARNSLp(C?58wJSB*^bFS94(Eb9L@P z9NZ&2D1ao@9#HPdc=_fm@Gz#+wMvM?3Hdq zi^?Pc&pD#(X%9SHGDD8=x6^P)iDx6vzPo8FUP8n&W%r|u21^%LN2?jx4D#?;xqh@# z45G$p>4IXAhWd=~qtllA0v9tg^B@MOC;^N2vls$e=i`QiKaCCb9a_T5wG<8_q#XKp5=&I}|ga(o)_z%DXoDoV7x z3kdw$Q=Uw3q*2|&v++t6KA3ei46+z0vM}7poxW64Vf4Crqd_6$SPLd%1GhT`K?}ZX zeDBx#c44>W|0}X-@2v9W_GqQ-#$T>%Pcw`bG!3%o-cwUZWlm1?cDNr)2UamFo||N+ zvqfbu9v8vFI8RYn=mGBJjPVHx>UoCg%L{WJKC2`pO=@eQK!5RQzTn06=3vcR=Oo$% zXS&uq5iY9p^|oz5!C-a1^V^-x-w+a?&7QKv;t@vrP>Y=(Xc*m7ax z)Z5RS{~KFcT57QvEu8eWd9K-_j0~Rck${5@min}wEI-HyLXVxB+hy0HFCyiy*J3|+ z9^$c|+MJp&S~|EkeU${Gk*vDYcWq{TcDRzsUodo4G7ivIKGzc;8v}-C*~8jeo{E2U z?I3Cyk!_ioj@;YY-0hma&HrI~iD|)Phr2xi9t`I%w4L|QzH2@n3d&KQEnI!90O>?Rd>zI!dGqspark*Whq#|beD$}c zY?g+nqju{j4;PY5WV1Lcv^=5*X?Z@sp`882`Qr`R29e+&pw@UOa;(N+_`2Iq+xfb6 z;QNB=Ok47=t(b%hN=2DuQgi6ce%bwG9pLjmT{&anws%~n_?}lTHLE=(%~2Y78X7!g z%#Z45R%j0HXwyuj1-y>6{ITFD<;+sfa%_!6`qAcj(ea-0dF_h1^fSzG$S+=1IZY{` zoA+gZiKEql)E>!<-AfUdTrqVnAJx$(o!$blhICaQ)VZ1jxb^QWm8kqSYH9cUfJFQ0 zg*~g+V(0AQM^w*4#9^d0i}W^-elXG6aejLXj!xPQepQvW*#kNOjW+W(%fGEvCNnk4 zd@LSsTN_S!d{t9%}mY}_aj=6le2*;`N`O*ghZH}0AK84c_DALhh_yPyp`REj} z3TiYlq(7BlKdm0QxfU}&?~kqtcruzaJeN>+k(uxAeHFSt{0r2+)M(=MRHe-fb7R$< zmeG9UQb0<`3PI8~CN68wT)^~id}26?uy~~m!|dQd7M1#RP+t5+`PqGEWH_)TR9p>VvW#IGGB=qBNNFo8|Nf98AR1(s_pZyvPyqd5#;t zbOnCN84cyyW%?cu>;9pdzep}#kVUdY9;okMV5RNUaB#l&rlONZFB{x8gCCc<%Bvpl zERz{j-`>LROOlnDKJBvTweH$!pI>R{8M>b>cSMC>exW4oEYXlrP;Z)q-e|RXic|s! zzDu2FH`SfO0jIl5bxTvzKmf8uNO{0xF<+7qXm@YP_UE;%0^lir_7 zNK1>VmzpuyI6%~V0xzrA7G1bF`=kQS<%S{G$qd?$&eIPVMs`cJz8mp7RlFNpKj2YG zR|B~@7&vZzlc1RUBhKg34Cb{G}5p8M}Qg61jwNRU<8Ro0$d&` zV^4v*z`;!r7Cj;azV2*uAz0mFI)LMDI;WMyFHKvWUjwrJQInlLjRsA`at>Xe~ARza)V) zXcW_;v41=K;@@KR@FfS?cNvQBvX4e>*IY?#v08E2E&dm#@N?OZcG+WaZ*D3W+8Lyf z3LYpc;3kK>*yrizSlyGMGameHoJf8c zWk05I>SwO6jk#k~Km3#^Bc-@LA%_CIs8|vq<684%`ege3y{r(#Ut?n}RdRJ^XrBaI z9bbBWz!Uu7n7@_PN?W%jEM_yO$XP(++AH@EskP4k>&^W=va(=5CZ&~R~S zHD&jXoDW=H<8w_hOH7LUwx&cCx9Ba4L39IEdip8Ghb;Bs4(Vd7PPdDQ(aee@7x#(* z=1B{q+LZ>MIYWBzi@y(xDJP=5MB4n0z5mYG#j7e>O}W zJwlGTNI&xceGd-cGZ^&%5<+HqaD3)>6bGAxyhcY%Rs1qVCN!rZHWfI zpb_D7+bym*cDyYOkxD>w+b{j`S<|nwIXiFR;o>WE9~F2Y=1V$wK$fQ~s_hBbdEpTc z)F@y}*NBXf)S6G))f5f+gVW()Ipui4Q`L38k9u}4r=%RO&QF9IhXEFQ*?eN3aR%~` z+40%g+0FnNWI)OrWL*ZH9yb88Wpl!XGFnZaon0O}-+*v1GxJ3FF-h#_Hmq6m2sybc zXJ>*k0;v!wnOLG3PA;L!Bx?kDkQ;HnWxx6K-_ZGrgwbUCjSiV5d9CFJdryO#;@(L0 zDukEO#JH62e%;a`fI2Jzvts@?VGfL|>l5_5_hgq>-%p;0qXianK12ypeqe!&L`_YD z2z5ut#s}po8j-uGhzX^2*nC-@#^T!X!Ladz-hz7)}Q}5t~L5z05>f<@zbT&yX*<0 z5zW%YGJjtN?BHwB(_(u|d3AAfPNLNsXIJ1wQq@xI0F01m_>GoICa7pi`23wwt7YgF zoqcN50bV(MX7+xR%5Sxjs@b!i{vLyLb=~G%683beU?c<#YPY^WW2Gd(qVTmhgp||H z%RazZ*epp^3-d2gXQ(Q}AIHf?po^KxWKw%)RH>zWHNb$5l3J|^na9ga&PPidiw^fk zGni!B-3!z9_HY{IWZ~m!NNR5+3CI@xn;>qhw)If}ib(5DeRo{+TFZ^r{<*we8mY<= zW!A(38=lMp4*)5(91B$V9N^IWzgd7%-fn72Hk_=AjNL@3ena`to|T(Y$J{Pw7;T>X zosYBeWDL{Eg^fF{uqXgF)qnd~^hJYUh_nc7?iB)JXu65eewRCiJv~(U$ z_sU1|D2Fu1BL>n{$812cBF|vZD^fJ57$h$*@8UX-?R0N&!J?L+UYIXSKzjQW)4l6=#1oiH22p_hY#9wF->WC^2b#K-jFAxJax+zq z6D5yC`5KF!hYr9V&$ek zF?OL!<0LUwL}DTOO5M5)n*?4UV0SZI4Y{`NG$GAO^?_e2O&%v6GEv$(7k`)C4=-yIX(yD@xeK)Wj~l^Gv9MTrA}B+OQI1hsQTmRf<-miKsd@joik_UL>|&+W|GCf_CByh$GpCdF@Xhyu zuk@}@r()r)+4)RmrGVThZ*?zsDE3Um`>yZ`;1wjd4!eWVq{31aPHqOe6wQnzf8h-~q2EDMf3W#hZ!(k?6v;-rb&{BjgzGgu z0RSh{Xf+Lg61e{QNZG;csQUKvC=u0hlHcpF|BB=3g!}hUY3Hkh#@Jl8_pX|aBt`sU z$AeIuHnWfocxDze)5v+Lv9e7e7*3Ihp9&_Jm4e`lq-&gLjg!v5?1XJPKZstv#(-Q3 zd9b2OS%rxH`)p`stnhS+bqBxWWKKuG85$|GQ4Heo{7ZzWnA7{HD|JD!khwDGK=I1z zTsFXTW1?f+z+|?=vs&Q%upSU5ENmD~7b#o-_rHMWo)h>72k)2hh1i^N-_xZ7jO3EZ zEZo|{0U~hlkHSrH>!^yVfZHtqE6um9LceiS<*SjPaen--!T9X?a}$7nDLc92X?%a& z2@!d_ou!NwbeT_90t%jP+z+3$G9Km2NUwnyI4Jy?rk_83Uz9s-VN* zQ3&{&O}YRUl${#br2qE@^{bKt9yj}-n?w%R$(}@546jj@73Y}b@6A;Z5md)i$p%-w^lFMRE z&xYT}__T)1kV^JH @}FSKLXY#c<4JAfH(n}Pylg;K902%z+wPC3 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�XYJX${ouj2F9Y1~? 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 x@^5qb{nq~v00960cc;Hl00006Nkl { @@ -146,6 +146,7 @@ app.use('/api/leaderboard_entries', passport.authenticate('jwt', {session: false app.use('/api/daily_seeds', passport.authenticate('jwt', {session: false}), daily_seedsRoutes); app.use('/api/server_caches', passport.authenticate('jwt', {session: false}), server_cachesRoutes); +app.use('/api/gameplay', passport.authenticate('jwt', {session: false}), gameplayRoutes); app.use( '/api/openai', diff --git a/backend/src/routes/gameplay.js b/backend/src/routes/gameplay.js new file mode 100644 index 0000000..0f222c9 --- /dev/null +++ b/backend/src/routes/gameplay.js @@ -0,0 +1,58 @@ +const express = require('express'); + +const GameplayService = require('../services/gameplay'); +const wrapAsync = require('../helpers').wrapAsync; + +const router = express.Router(); + +router.get( + '/active', + wrapAsync(async (req, res) => { + const payload = await GameplayService.getActiveSession(req.currentUser); + res.status(200).send(payload); + }), +); + +router.get( + '/sessions', + wrapAsync(async (req, res) => { + const payload = await GameplayService.listSessions(req.currentUser); + res.status(200).send(payload); + }), +); + +router.get( + '/sessions/:id', + wrapAsync(async (req, res) => { + const payload = await GameplayService.getSessionDetail( + req.params.id, + req.currentUser, + ); + res.status(200).send(payload); + }), +); + +router.post( + '/sessions/start', + wrapAsync(async (req, res) => { + const payload = await GameplayService.startSession(req.body, req.currentUser); + res.status(200).send(payload); + }), +); + +router.post( + '/sessions/:sessionId/rounds/:roundId/answer', + wrapAsync(async (req, res) => { + const payload = await GameplayService.answerRound( + req.params.sessionId, + req.params.roundId, + req.body, + req.currentUser, + ); + res.status(200).send(payload); + }), +); + +router.use('/', require('../helpers').commonErrorHandler); + +module.exports = router; diff --git a/backend/src/services/gameplay.js b/backend/src/services/gameplay.js new file mode 100644 index 0000000..69937d7 --- /dev/null +++ b/backend/src/services/gameplay.js @@ -0,0 +1,1108 @@ +const crypto = require('crypto'); +const db = require('../db/models'); + +const { Op } = db.Sequelize; + +const TIMER_PROFILES = { + normal: 8000, + insane: 5000, +}; + +const MODE_SELECTIONS = { + beatmap_only: 'beatmap', + mapper_only: 'mapper', + artist_only: 'artist', + mixed: 'mixed', +}; + +const ROUND_MODES = ['beatmap', 'mapper', 'artist']; +const RECENT_ENTITY_COOLDOWN = 20; +const CANDIDATE_SEARCH_PLANS = [ + { + limit: 120, + strategy: 'strict_session', + }, + { + limit: 180, + strategy: 'recent_cooldown', + }, + { + limit: 260, + strategy: 'recent_beatmap_cooldown', + }, + { + limit: 320, + strategy: 'open_pool', + }, +]; + +const CANDIDATE_INCLUDE = [ + { + model: db.beatmap_sets, + as: 'beatmap_set', + }, + { + model: db.mappers, + as: 'mapper', + include: [ + { + model: db.mapper_stats, + as: 'mapper_stats_mapper', + required: false, + }, + ], + }, + { + model: db.artists, + as: 'artist', + include: [ + { + model: db.artist_stats, + as: 'artist_stats_artist', + required: false, + }, + ], + }, +]; + +const ROUND_VISUAL_INCLUDE = [ + { + model: db.beatmap_sets, + as: 'beatmap_set', + }, + { + model: db.mappers, + as: 'mapper', + }, + { + model: db.artists, + as: 'artist', + }, +]; + +function gameplayError(message, code = 400) { + const error = new Error(message); + error.code = code; + return error; +} + +function normalizeNumber(value) { + if (value === null || value === undefined) { + return 0; + } + + const normalized = Number(value); + return Number.isFinite(normalized) ? normalized : 0; +} + +function isProbablyPlaceholderImage(url) { + return !url || url.includes('cdn.example.com'); +} + +function getBeatmapVisual(beatmap) { + return ( + beatmap?.beatmap_set?.background_image_url || + beatmap?.beatmap_set?.cover_image_url || + null + ); +} + +function getMaxStatTotal(statRows = []) { + if (!Array.isArray(statRows) || !statRows.length) { + return 0; + } + + return statRows.reduce((highestValue, statRow) => { + const totalPlays = normalizeNumber(statRow?.total_plays); + return totalPlays > highestValue ? totalPlays : highestValue; + }, 0); +} + +function getMapperTotalPlays(beatmap) { + return getMaxStatTotal(beatmap?.mapper?.mapper_stats_mapper); +} + +function getArtistTotalPlays(beatmap) { + return getMaxStatTotal(beatmap?.artist?.artist_stats_artist); +} + +function getRoundValue(beatmap, roundMode) { + if (roundMode === 'mapper') { + return getMapperTotalPlays(beatmap); + } + + if (roundMode === 'artist') { + return getArtistTotalPlays(beatmap); + } + + return normalizeNumber(beatmap?.playcount); +} + +function getModeLabel(roundMode) { + if (roundMode === 'mapper') { + return 'Mapper total plays'; + } + + if (roundMode === 'artist') { + return 'Artist total plays'; + } + + return 'Beatmap playcount'; +} + +function getValueSuffix(roundMode) { + if (roundMode === 'beatmap') { + return 'plays'; + } + + return 'total plays'; +} + +function pickRoundMode(modeSelection) { + if (!MODE_SELECTIONS[modeSelection]) { + throw gameplayError('Unsupported mode selection.'); + } + + if (modeSelection === 'mixed') { + return ROUND_MODES[Math.floor(Math.random() * ROUND_MODES.length)]; + } + + return MODE_SELECTIONS[modeSelection]; +} + +function shuffle(items) { + const cloned = [...items]; + + for (let index = cloned.length - 1; index > 0; index -= 1) { + const swapIndex = Math.floor(Math.random() * (index + 1)); + [cloned[index], cloned[swapIndex]] = [cloned[swapIndex], cloned[index]]; + } + + return cloned; +} + +function serializeCard(beatmap, roundMode) { + const fallbackVisual = getBeatmapVisual(beatmap); + + if (roundMode === 'mapper') { + return { + name: + beatmap?.mapper?.osu_username || + beatmap?.beatmap_set?.creator_username || + 'Unknown mapper', + avatarUrl: beatmap?.mapper?.avatar_url || null, + bannerUrl: beatmap?.mapper?.banner_url || fallbackVisual, + fallbackVisual, + }; + } + + if (roundMode === 'artist') { + const artistImage = isProbablyPlaceholderImage(beatmap?.artist?.image_url) + ? fallbackVisual + : beatmap?.artist?.image_url; + + return { + name: beatmap?.artist?.name || beatmap?.beatmap_set?.artist_name || 'Unknown artist', + imageUrl: artistImage || fallbackVisual, + fallbackVisual, + }; + } + + return { + title: beatmap?.beatmap_set?.title || 'Unknown beatmap', + artistName: beatmap?.artist?.name || beatmap?.beatmap_set?.artist_name || 'Unknown artist', + mapperName: + beatmap?.mapper?.osu_username || + beatmap?.beatmap_set?.creator_username || + 'Unknown mapper', + mapperAvatarUrl: beatmap?.mapper?.avatar_url || null, + difficultyName: beatmap?.difficulty_name || 'Unknown difficulty', + status: beatmap?.status || 'ranked', + backgroundImageUrl: fallbackVisual, + }; +} + +function serializePendingRound(roundRecord) { + return { + id: roundRecord.id, + roundNumber: roundRecord.round_number, + timeLimitMs: roundRecord.time_limit_ms, + presentedAt: roundRecord.presented_at, + expiresAt: new Date( + new Date(roundRecord.presented_at).getTime() + roundRecord.time_limit_ms, + ).toISOString(), + cards: { + a: serializeCard(roundRecord.option_a_beatmap, roundRecord.round_mode), + b: serializeCard(roundRecord.option_b_beatmap, roundRecord.round_mode), + }, + }; +} + +function serializeResolvedRound(roundRecord) { + const winningChoice = normalizeNumber(roundRecord.value_a) > normalizeNumber(roundRecord.value_b) + ? 'a' + : 'b'; + + return { + ...serializePendingRound(roundRecord), + reveal: { + roundMode: roundRecord.round_mode, + modeLabel: getModeLabel(roundRecord.round_mode), + valueSuffix: getValueSuffix(roundRecord.round_mode), + correctChoice: roundRecord.correct_choice, + winningChoice, + playerChoice: roundRecord.player_choice, + isCorrect: Boolean(roundRecord.is_correct), + loseReason: roundRecord.lose_reason, + values: { + a: normalizeNumber(roundRecord.value_a), + b: normalizeNumber(roundRecord.value_b), + }, + answeredAt: roundRecord.answered_at, + }, + }; +} + +async function loadBeatmapVisual(beatmapId, transaction) { + return db.beatmaps.findOne({ + where: { id: beatmapId }, + include: ROUND_VISUAL_INCLUDE, + transaction, + }); +} + +async function hydrateRound(roundRecord, transaction) { + if (!roundRecord) { + return null; + } + + const plainRound = roundRecord.toJSON ? roundRecord.toJSON() : roundRecord; + const [optionABeatmap, optionBBeatmap] = await Promise.all([ + loadBeatmapVisual(plainRound.option_a_beatmapId, transaction), + loadBeatmapVisual(plainRound.option_b_beatmapId, transaction), + ]); + + return { + ...plainRound, + option_a_beatmap: optionABeatmap, + option_b_beatmap: optionBBeatmap, + }; +} + +async function loadRound(roundId, transaction) { + const roundRecord = await db.game_rounds.findOne({ + where: { id: roundId }, + transaction, + }); + + return hydrateRound(roundRecord, transaction); +} + +async function getPendingRound(sessionId, transaction) { + const roundRecord = await db.game_rounds.findOne({ + where: { + sessionId, + state: 'pending', + }, + order: [['round_number', 'DESC']], + transaction, + }); + + return hydrateRound(roundRecord, transaction); +} + +async function getSessionMetrics(sessionId, transaction) { + const [roundsPlayed, correctGuesses] = await Promise.all([ + db.game_rounds.count({ + where: { + sessionId, + state: { + [Op.not]: 'pending', + }, + }, + transaction, + }), + db.game_rounds.count({ + where: { + sessionId, + is_correct: true, + }, + transaction, + }), + ]); + + return { + roundsPlayed, + correctGuesses, + }; +} + +function serializeSession(sessionRecord, metrics = { roundsPlayed: 0, correctGuesses: 0 }) { + return { + id: sessionRecord.id, + status: sessionRecord.status, + modeSelection: sessionRecord.mode_selection, + timerProfile: sessionRecord.timer_profile, + sessionToken: sessionRecord.session_token, + startingLives: sessionRecord.starting_lives, + livesRemaining: sessionRecord.lives_remaining, + streak: sessionRecord.streak, + bestStreak: sessionRecord.best_streak, + startedAt: sessionRecord.started_at, + endedAt: sessionRecord.ended_at, + roundsPlayed: metrics.roundsPlayed, + correctGuesses: metrics.correctGuesses, + }; +} + +function limitedSetAdd(set, value, limit = null) { + if (!value) { + return; + } + + if (limit !== null && set.size >= limit) { + return; + } + + set.add(value); +} + +function getRoundEntityId(beatmap, roundMode) { + if (roundMode === 'mapper') { + return beatmap?.mapperId || beatmap?.mapper?.id || null; + } + + if (roundMode === 'artist') { + return beatmap?.artistId || beatmap?.artist?.id || null; + } + + return beatmap?.beatmap_setId || beatmap?.beatmap_set?.id || beatmap?.id || null; +} + +function dedupeCandidatesByRoundEntity(candidates, roundMode) { + const seenEntityIds = new Set(); + + return candidates.filter((beatmap) => { + const entityId = getRoundEntityId(beatmap, roundMode) || beatmap?.id; + + if (!entityId || seenEntityIds.has(entityId)) { + return false; + } + + seenEntityIds.add(entityId); + return true; + }); +} + +async function getSessionUsage(sessionId, transaction) { + const rounds = await db.game_rounds.findAll({ + where: { sessionId }, + attributes: ['id', 'round_number'], + include: [ + { + model: db.beatmaps, + as: 'option_a_beatmap', + attributes: ['id', 'beatmap_setId', 'mapperId', 'artistId'], + required: false, + }, + { + model: db.beatmaps, + as: 'option_b_beatmap', + attributes: ['id', 'beatmap_setId', 'mapperId', 'artistId'], + required: false, + }, + ], + order: [['round_number', 'DESC']], + transaction, + }); + + const usage = { + beatmapIds: new Set(), + beatmapSetIds: new Set(), + mapperIds: new Set(), + artistIds: new Set(), + recentBeatmapIds: new Set(), + recentBeatmapSetIds: new Set(), + recentMapperIds: new Set(), + recentArtistIds: new Set(), + }; + + rounds.forEach((roundRecord) => { + [roundRecord.option_a_beatmap, roundRecord.option_b_beatmap].forEach((beatmap) => { + if (!beatmap) { + return; + } + + limitedSetAdd(usage.beatmapIds, beatmap.id); + limitedSetAdd(usage.beatmapSetIds, beatmap.beatmap_setId); + limitedSetAdd(usage.mapperIds, beatmap.mapperId); + limitedSetAdd(usage.artistIds, beatmap.artistId); + limitedSetAdd(usage.recentBeatmapIds, beatmap.id, RECENT_ENTITY_COOLDOWN); + limitedSetAdd( + usage.recentBeatmapSetIds, + beatmap.beatmap_setId, + RECENT_ENTITY_COOLDOWN, + ); + limitedSetAdd(usage.recentMapperIds, beatmap.mapperId, RECENT_ENTITY_COOLDOWN); + limitedSetAdd(usage.recentArtistIds, beatmap.artistId, RECENT_ENTITY_COOLDOWN); + }); + }); + + return usage; +} + +function getCandidateExclusions(roundMode, sessionUsage, strategy) { + if (strategy === 'strict_session') { + return { + excludedBeatmapIds: Array.from(sessionUsage.beatmapIds), + excludedBeatmapSetIds: + roundMode === 'beatmap' ? Array.from(sessionUsage.beatmapSetIds) : [], + excludedMapperIds: + roundMode === 'mapper' ? Array.from(sessionUsage.mapperIds) : [], + excludedArtistIds: + roundMode === 'artist' ? Array.from(sessionUsage.artistIds) : [], + }; + } + + if (strategy === 'recent_cooldown') { + return { + excludedBeatmapIds: Array.from(sessionUsage.recentBeatmapIds), + excludedBeatmapSetIds: + roundMode === 'beatmap' ? Array.from(sessionUsage.recentBeatmapSetIds) : [], + excludedMapperIds: + roundMode === 'mapper' ? Array.from(sessionUsage.recentMapperIds) : [], + excludedArtistIds: + roundMode === 'artist' ? Array.from(sessionUsage.recentArtistIds) : [], + }; + } + + if (strategy === 'recent_beatmap_cooldown') { + return { + excludedBeatmapIds: Array.from(sessionUsage.recentBeatmapIds), + excludedBeatmapSetIds: + roundMode === 'beatmap' ? Array.from(sessionUsage.recentBeatmapSetIds) : [], + excludedMapperIds: [], + excludedArtistIds: [], + }; + } + + return { + excludedBeatmapIds: [], + excludedBeatmapSetIds: [], + excludedMapperIds: [], + excludedArtistIds: [], + }; +} + +async function findCandidates({ + roundMode, + limit = 30, + excludedBeatmapIds = [], + excludedBeatmapSetIds = [], + excludedMapperIds = [], + excludedArtistIds = [], + transaction, +}) { + const where = { + mode: 'osu', + status: { + [Op.in]: ['ranked', 'loved'], + }, + }; + + if (excludedBeatmapIds.length) { + where.id = { + [Op.notIn]: excludedBeatmapIds, + }; + } + + if (roundMode === 'beatmap' && excludedBeatmapSetIds.length) { + where.beatmap_setId = { + [Op.notIn]: excludedBeatmapSetIds, + }; + } + + if (roundMode === 'mapper' && excludedMapperIds.length) { + where.mapperId = { + [Op.notIn]: excludedMapperIds, + }; + } + + if (roundMode === 'artist' && excludedArtistIds.length) { + where.artistId = { + [Op.notIn]: excludedArtistIds, + }; + } + + const candidates = await db.beatmaps.findAll({ + where, + include: CANDIDATE_INCLUDE, + limit, + order: db.sequelize.random(), + transaction, + }); + + return dedupeCandidatesByRoundEntity( + candidates.filter((beatmap) => beatmap?.beatmap_set && beatmap?.mapper && beatmap?.artist), + roundMode, + ); +} + +function canComparePair(firstBeatmap, secondBeatmap, roundMode) { + if (!firstBeatmap || !secondBeatmap || firstBeatmap.id === secondBeatmap.id) { + return false; + } + + if (roundMode === 'mapper' && firstBeatmap.mapperId === secondBeatmap.mapperId) { + return false; + } + + if (roundMode === 'artist' && firstBeatmap.artistId === secondBeatmap.artistId) { + return false; + } + + const firstValue = getRoundValue(firstBeatmap, roundMode); + const secondValue = getRoundValue(secondBeatmap, roundMode); + + return firstValue > 0 && secondValue > 0 && firstValue !== secondValue; +} + +function pickComparablePair(candidates, roundMode) { + const shuffled = shuffle(candidates); + + for (let outerIndex = 0; outerIndex < shuffled.length; outerIndex += 1) { + for ( + let innerIndex = outerIndex + 1; + innerIndex < shuffled.length; + innerIndex += 1 + ) { + const firstBeatmap = shuffled[outerIndex]; + const secondBeatmap = shuffled[innerIndex]; + + if (!canComparePair(firstBeatmap, secondBeatmap, roundMode)) { + continue; + } + + const valueA = getRoundValue(firstBeatmap, roundMode); + const valueB = getRoundValue(secondBeatmap, roundMode); + + return { + firstBeatmap, + secondBeatmap, + valueA, + valueB, + }; + } + } + + throw gameplayError( + 'No comparable beatmap pair is available for the selected mode. Please sync more osu! data.', + 503, + ); +} + +function generateSessionToken() { + return `sess_${crypto.randomBytes(8).toString('hex')}`; +} + +async function selectComparablePairForSession(sessionRecord, transaction) { + const roundMode = pickRoundMode(sessionRecord.mode_selection); + const sessionUsage = await getSessionUsage(sessionRecord.id, transaction); + let lastError = null; + + for (const searchPlan of CANDIDATE_SEARCH_PLANS) { + const candidates = await findCandidates({ + roundMode, + limit: searchPlan.limit, + transaction, + ...getCandidateExclusions(roundMode, sessionUsage, searchPlan.strategy), + }); + + try { + return { + roundMode, + ...pickComparablePair(candidates, roundMode), + }; + } catch (error) { + lastError = error; + } + } + + throw ( + lastError || + gameplayError( + 'No comparable beatmap pair is available for the selected mode. Please sync more osu! data.', + 503, + ) + ); +} + +async function createRoundForSession(sessionRecord, currentUser, transaction) { + const { roundMode, firstBeatmap, secondBeatmap, valueA, valueB } = + await selectComparablePairForSession(sessionRecord, transaction); + + const nextRoundNumber = + (await db.game_rounds.count({ + where: { sessionId: sessionRecord.id }, + transaction, + })) + 1; + + const round = await db.game_rounds.create( + { + sessionId: sessionRecord.id, + round_number: nextRoundNumber, + round_mode: roundMode, + state: 'pending', + time_limit_ms: TIMER_PROFILES[sessionRecord.timer_profile], + presented_at: new Date(), + player_choice: 'none', + correct_choice: valueA > valueB ? 'a' : 'b', + is_correct: false, + lose_reason: 'none', + value_a: valueA, + value_b: valueB, + option_a_beatmapId: firstBeatmap.id, + option_b_beatmapId: secondBeatmap.id, + createdById: currentUser.id, + updatedById: currentUser.id, + }, + { transaction }, + ); + + const roundRecord = await loadRound(round.id, transaction); + return serializePendingRound(roundRecord); +} + +async function createLeaderboardEntryIfNeeded(sessionRecord, currentUser, transaction) { + const existingEntry = await db.leaderboard_entries.findOne({ + where: { + sessionId: sessionRecord.id, + board_type: 'all_time', + }, + transaction, + }); + + if (existingEntry) { + return existingEntry; + } + + const metrics = await getSessionMetrics(sessionRecord.id, transaction); + + return db.leaderboard_entries.create( + { + board_type: 'all_time', + seed_key: 'all_time', + score: metrics.correctGuesses, + rounds_survived: metrics.roundsPlayed, + best_streak: sessionRecord.best_streak, + achieved_at: sessionRecord.ended_at || new Date(), + sessionId: sessionRecord.id, + userId: currentUser.id, + createdById: currentUser.id, + updatedById: currentUser.id, + }, + { transaction }, + ); +} + +function isRoundExpired(roundRecord) { + const presentedAt = new Date(roundRecord.presented_at).getTime(); + return Date.now() > presentedAt + normalizeNumber(roundRecord.time_limit_ms); +} + +module.exports = class GameplayService { + static async startSession(payload, currentUser) { + const modeSelection = payload?.modeSelection || 'mixed'; + const timerProfile = payload?.timerProfile || 'normal'; + + if (!MODE_SELECTIONS[modeSelection]) { + throw gameplayError('Mode selection must be beatmap_only, mapper_only, artist_only, or mixed.'); + } + + if (!TIMER_PROFILES[timerProfile]) { + throw gameplayError('Timer profile must be normal or insane.'); + } + + const transaction = await db.sequelize.transaction(); + + try { + const now = new Date(); + + await db.game_sessions.update( + { + status: 'abandoned', + ended_at: now, + updatedById: currentUser.id, + }, + { + where: { + userId: currentUser.id, + status: 'active', + }, + transaction, + }, + ); + + const sessionRecord = await db.game_sessions.create( + { + session_token: generateSessionToken(), + status: 'active', + starting_lives: 2, + lives_remaining: 2, + streak: 0, + best_streak: 0, + timer_profile: timerProfile, + mode_selection: modeSelection, + started_at: now, + userId: currentUser.id, + createdById: currentUser.id, + updatedById: currentUser.id, + }, + { transaction }, + ); + + const currentRound = await createRoundForSession( + sessionRecord, + currentUser, + transaction, + ); + + const metrics = await getSessionMetrics(sessionRecord.id, transaction); + + await transaction.commit(); + + return { + session: serializeSession(sessionRecord, metrics), + currentRound, + }; + } catch (error) { + await transaction.rollback(); + throw error; + } + } + + static async answerRound(sessionId, roundId, payload, currentUser) { + const submittedChoice = payload?.choice; + + if (!['a', 'b', 'none'].includes(submittedChoice)) { + throw gameplayError('Choice must be a, b, or none.'); + } + + const transaction = await db.sequelize.transaction(); + + try { + const sessionRecord = await db.game_sessions.findOne({ + where: { + id: sessionId, + userId: currentUser.id, + }, + transaction, + lock: transaction.LOCK.UPDATE, + }); + + if (!sessionRecord) { + throw gameplayError('Game session not found.', 404); + } + + if (sessionRecord.status !== 'active') { + throw gameplayError('This session is no longer active.'); + } + + const roundRecord = await db.game_rounds.findOne({ + where: { + id: roundId, + sessionId, + }, + transaction, + lock: transaction.LOCK.UPDATE, + }); + + if (!roundRecord) { + throw gameplayError('Round not found.', 404); + } + + if (roundRecord.state !== 'pending') { + throw gameplayError('This round has already been resolved.'); + } + + const answeredAt = new Date(); + const timedOut = + submittedChoice === 'none' || + answeredAt.getTime() > + new Date(roundRecord.presented_at).getTime() + roundRecord.time_limit_ms; + const playerChoice = timedOut ? 'none' : submittedChoice; + const isCorrect = !timedOut && playerChoice === roundRecord.correct_choice; + const nextLivesRemaining = isCorrect + ? sessionRecord.lives_remaining + : Math.max(sessionRecord.lives_remaining - 1, 0); + const streak = isCorrect ? sessionRecord.streak + 1 : 0; + const bestStreak = Math.max(sessionRecord.best_streak || 0, streak); + const nextStatus = nextLivesRemaining > 0 ? 'active' : 'finished'; + + await roundRecord.update( + { + player_choice: playerChoice, + answered_at: answeredAt, + is_correct: isCorrect, + lose_reason: timedOut ? 'timeout' : isCorrect ? 'none' : 'wrong', + state: timedOut ? 'timed_out' : 'answered', + updatedById: currentUser.id, + }, + { transaction }, + ); + + await sessionRecord.update( + { + lives_remaining: nextLivesRemaining, + streak, + best_streak: bestStreak, + status: nextStatus, + ended_at: nextStatus === 'finished' ? answeredAt : sessionRecord.ended_at, + updatedById: currentUser.id, + }, + { transaction }, + ); + + const resolvedRound = await loadRound(roundRecord.id, transaction); + let nextRound = null; + + if (nextStatus === 'active') { + nextRound = await createRoundForSession(sessionRecord, currentUser, transaction); + } else { + await createLeaderboardEntryIfNeeded(sessionRecord, currentUser, transaction); + } + + const metrics = await getSessionMetrics(sessionRecord.id, transaction); + + await transaction.commit(); + + return { + session: serializeSession(sessionRecord, metrics), + result: serializeResolvedRound(resolvedRound), + nextRound, + gameOver: nextStatus !== 'active', + }; + } catch (error) { + await transaction.rollback(); + throw error; + } + } + + static async getActiveSession(currentUser) { + const sessionRecord = await db.game_sessions.findOne({ + where: { + userId: currentUser.id, + status: 'active', + }, + order: [['started_at', 'DESC']], + }); + + if (!sessionRecord) { + return { + activeSession: false, + }; + } + + const pendingRound = await getPendingRound(sessionRecord.id); + + if (!pendingRound) { + const transaction = await db.sequelize.transaction(); + + try { + const lockedSession = await db.game_sessions.findOne({ + where: { id: sessionRecord.id }, + transaction, + lock: transaction.LOCK.UPDATE, + }); + const nextRound = await createRoundForSession( + lockedSession, + currentUser, + transaction, + ); + const metrics = await getSessionMetrics(sessionRecord.id, transaction); + await transaction.commit(); + + return { + activeSession: true, + session: serializeSession(lockedSession, metrics), + currentRound: nextRound, + }; + } catch (error) { + await transaction.rollback(); + throw error; + } + } + + if (isRoundExpired(pendingRound)) { + const resolvedSession = await this.answerRound( + sessionRecord.id, + pendingRound.id, + { choice: 'none' }, + currentUser, + ); + + return { + activeSession: true, + autoResolved: true, + ...resolvedSession, + }; + } + + const metrics = await getSessionMetrics(sessionRecord.id); + + return { + activeSession: true, + session: serializeSession(sessionRecord, metrics), + currentRound: serializePendingRound(pendingRound), + }; + } + + static async listSessions(currentUser) { + const sessions = await db.game_sessions.findAll({ + where: { + userId: currentUser.id, + }, + order: [['started_at', 'DESC']], + limit: 12, + }); + + const sessionIds = sessions.map((session) => session.id); + + const [rounds, entries, leaderboard] = await Promise.all([ + sessionIds.length + ? db.game_rounds.findAll({ + where: { + sessionId: { + [Op.in]: sessionIds, + }, + }, + attributes: ['sessionId', 'id', 'is_correct', 'state'], + }) + : [], + sessionIds.length + ? db.leaderboard_entries.findAll({ + where: { + sessionId: { + [Op.in]: sessionIds, + }, + board_type: 'all_time', + }, + }) + : [], + db.leaderboard_entries.findAll({ + where: { + board_type: 'all_time', + }, + include: [ + { + model: db.users, + as: 'user', + attributes: ['id', 'firstName', 'email'], + }, + ], + order: [ + ['score', 'DESC'], + ['best_streak', 'DESC'], + ['achieved_at', 'ASC'], + ], + limit: 10, + }), + ]); + + const metricsBySession = rounds.reduce((accumulator, round) => { + if (!accumulator[round.sessionId]) { + accumulator[round.sessionId] = { + roundsPlayed: 0, + correctGuesses: 0, + }; + } + + if (round.state !== 'pending') { + accumulator[round.sessionId].roundsPlayed += 1; + } + + if (round.is_correct) { + accumulator[round.sessionId].correctGuesses += 1; + } + + return accumulator; + }, {}); + + const entryBySession = entries.reduce((accumulator, entry) => { + accumulator[entry.sessionId] = entry; + return accumulator; + }, {}); + + return { + sessions: sessions.map((session) => ({ + ...serializeSession(session, metricsBySession[session.id]), + leaderboardEntry: entryBySession[session.id] + ? { + score: entryBySession[session.id].score, + bestStreak: entryBySession[session.id].best_streak, + } + : null, + })), + leaderboard: leaderboard.map((entry) => ({ + id: entry.id, + score: entry.score, + bestStreak: entry.best_streak, + roundsSurvived: entry.rounds_survived, + achievedAt: entry.achieved_at, + user: { + id: entry.user?.id, + name: entry.user?.firstName || entry.user?.email || 'Unknown player', + }, + })), + }; + } + + static async getSessionDetail(sessionId, currentUser) { + const sessionRecord = await db.game_sessions.findOne({ + where: { + id: sessionId, + userId: currentUser.id, + }, + }); + + if (!sessionRecord) { + throw gameplayError('Game session not found.', 404); + } + + const [metrics, rounds, leaderboardEntry] = await Promise.all([ + getSessionMetrics(sessionId), + db.game_rounds.findAll({ + where: { + sessionId, + state: { + [Op.not]: 'pending', + }, + }, + order: [['round_number', 'ASC']], + }), + db.leaderboard_entries.findOne({ + where: { + sessionId, + board_type: 'all_time', + }, + }), + ]); + + return { + session: { + ...serializeSession(sessionRecord, metrics), + leaderboardEntry: leaderboardEntry + ? { + score: leaderboardEntry.score, + bestStreak: leaderboardEntry.best_streak, + roundsSurvived: leaderboardEntry.rounds_survived, + achievedAt: leaderboardEntry.achieved_at, + } + : null, + }, + rounds: await Promise.all( + rounds.map(async (roundRecord) => serializeResolvedRound(await hydrateRound(roundRecord))), + ), + }; + } +}; diff --git a/backend/src/services/osuCatalogSync.js b/backend/src/services/osuCatalogSync.js new file mode 100644 index 0000000..3ad09f6 --- /dev/null +++ b/backend/src/services/osuCatalogSync.js @@ -0,0 +1,773 @@ +const axios = require('axios'); + +const db = require('../db/models'); + +const { Op } = db.Sequelize; + +const OSU_PUBLIC_BEATMAPSET_SEARCH_URL = 'https://osu.ppy.sh/beatmapsets/search'; +const SUPPORTED_SET_STATUSES = new Set(['ranked', 'loved']); +const DEFAULT_SEED_PAGES = 12; +const DEFAULT_INCREMENTAL_PAGES = 3; +const MAX_PAGES_PER_JOB = 40; +const DEFAULT_START_PAGE = 1; +const REQUEST_TIMEOUT_MS = 30000; +const IMPORT_JOB_TYPES = ['osu_sync_seed', 'osu_sync_incremental']; + +function syncError(message, statusCode = 400) { + const error = new Error(message); + error.statusCode = statusCode; + return error; +} + +function normalizeInteger(value, fallback = 0) { + const normalized = Number(value); + return Number.isFinite(normalized) ? Math.trunc(normalized) : fallback; +} + +function normalizeDecimal(value, fallback = 0) { + const normalized = Number(value); + return Number.isFinite(normalized) ? normalized : fallback; +} + +function normalizeString(value) { + if (typeof value !== 'string') { + return ''; + } + + return value.trim(); +} + +function normalizeSetStatus(status) { + const normalized = normalizeString(status).toLowerCase(); + return SUPPORTED_SET_STATUSES.has(normalized) ? normalized : null; +} + +function getMapperAvatarUrl(osuUserNumeric) { + if (!osuUserNumeric) { + return null; + } + + return `https://a.ppy.sh/${osuUserNumeric}`; +} + +function getMapperProfileUrl(osuUserNumeric) { + if (!osuUserNumeric) { + return null; + } + + return `https://osu.ppy.sh/users/${osuUserNumeric}`; +} + +function getBestCoverUrl(beatmapSet) { + return ( + beatmapSet?.covers?.card || + beatmapSet?.covers?.['card@2x'] || + beatmapSet?.covers?.cover || + beatmapSet?.covers?.['cover@2x'] || + beatmapSet?.covers?.list || + beatmapSet?.covers?.['list@2x'] || + null + ); +} + +function parseDateOrNull(value) { + if (!value) { + return null; + } + + const parsed = new Date(value); + return Number.isNaN(parsed.getTime()) ? null : parsed; +} + +function parseJobPayload(rawPayload) { + if (!rawPayload) { + return {}; + } + + if (typeof rawPayload === 'object' && !Array.isArray(rawPayload)) { + return rawPayload; + } + + if (typeof rawPayload !== 'string') { + throw syncError('job_payload_json must be empty or valid JSON.'); + } + + try { + const parsed = JSON.parse(rawPayload); + + if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) { + throw syncError('job_payload_json must decode to a JSON object.'); + } + + return parsed; + } catch (error) { + if (error.statusCode) { + throw error; + } + + throw syncError('job_payload_json must contain valid JSON.'); + } +} + +function getDefaultPageCount(jobType) { + return jobType === 'osu_sync_incremental' + ? DEFAULT_INCREMENTAL_PAGES + : DEFAULT_SEED_PAGES; +} + +function getNormalizedPageCount(payload, jobType) { + return Math.min( + Math.max(normalizeInteger(payload?.pages, getDefaultPageCount(jobType)), 1), + MAX_PAGES_PER_JOB, + ); +} + +function getNormalizedSort(payload) { + return normalizeString(payload?.sort || 'plays_desc') || 'plays_desc'; +} + +function hasExplicitStartPage(payload) { + const rawStartPage = payload?.startPage ?? payload?.page; + + if (rawStartPage === null || rawStartPage === undefined) { + return false; + } + + return `${rawStartPage}`.trim() !== ''; +} + +function getNormalizedStartPage(payload) { + return Math.max( + normalizeInteger(payload?.startPage ?? payload?.page, DEFAULT_START_PAGE), + DEFAULT_START_PAGE, + ); +} + +async function getNextAutomaticStartPage({ currentJobId, sort }) { + const previousSuccessfulJobs = await db.sync_jobs.findAll({ + attributes: ['id', 'job_type', 'job_payload_json'], + where: { + id: { + [Op.ne]: currentJobId, + }, + job_type: { + [Op.in]: IMPORT_JOB_TYPES, + }, + status: 'succeeded', + }, + order: [['createdAt', 'ASC']], + }); + + return previousSuccessfulJobs.reduce((nextStartPage, previousJob) => { + let previousPayload; + + try { + previousPayload = parseJobPayload(previousJob.job_payload_json); + } catch (error) { + return nextStartPage; + } + + if (getNormalizedSort(previousPayload) !== sort) { + return nextStartPage; + } + + const previousStartPage = hasExplicitStartPage(previousPayload) + ? getNormalizedStartPage(previousPayload) + : DEFAULT_START_PAGE; + const previousPages = getNormalizedPageCount(previousPayload, previousJob.job_type); + const previousNextPage = previousStartPage + previousPages; + + return previousNextPage > nextStartPage ? previousNextPage : nextStartPage; + }, DEFAULT_START_PAGE); +} + +async function getImportOptions(jobRecord) { + const payload = parseJobPayload(jobRecord?.job_payload_json); + const pages = getNormalizedPageCount(payload, jobRecord?.job_type); + const sort = getNormalizedSort(payload); + const explicitStartPage = hasExplicitStartPage(payload); + const startPage = explicitStartPage + ? getNormalizedStartPage(payload) + : await getNextAutomaticStartPage({ + currentJobId: jobRecord?.id, + sort, + }); + + return { + payload, + pages, + sort, + startPage, + explicitStartPage, + }; +} + +function shouldKeepBeatmapSet(beatmapSet) { + if (!beatmapSet || !normalizeInteger(beatmapSet.id, 0)) { + return false; + } + + if (!normalizeSetStatus(beatmapSet.status)) { + return false; + } + + if (!normalizeString(beatmapSet.title) || !normalizeString(beatmapSet.artist)) { + return false; + } + + return true; +} + +function getUsableBeatmaps(beatmapSet) { + const setStatus = normalizeSetStatus(beatmapSet?.status); + + return (Array.isArray(beatmapSet?.beatmaps) ? beatmapSet.beatmaps : []).filter( + (beatmap) => { + if (!beatmap || !normalizeInteger(beatmap.id, 0)) { + return false; + } + + const beatmapStatus = normalizeSetStatus(beatmap.status) || setStatus; + + return ( + beatmap.mode === 'osu' && + Boolean(beatmap.is_scoreable) && + Boolean(beatmapStatus) + ); + }, + ); +} + +async function updateJob(jobId, currentUser, patch) { + await db.sync_jobs.update( + { + ...patch, + updatedById: currentUser?.id || null, + }, + { + where: { id: jobId }, + }, + ); +} + +function toRecordMap(records, getKey) { + return records.reduce((accumulator, record) => { + const key = getKey(record); + + if (key !== null && key !== undefined && key !== '') { + accumulator.set(key, record); + } + + return accumulator; + }, new Map()); +} + +async function fetchBeatmapSearchPage({ page, sort }) { + let response; + + try { + response = await axios.get(OSU_PUBLIC_BEATMAPSET_SEARCH_URL, { + params: { + m: 0, + nsfw: false, + sort, + page, + }, + headers: { + 'User-Agent': 'Flatlogic Osu Higher Lower Catalog Sync', + Accept: 'application/json', + }, + timeout: REQUEST_TIMEOUT_MS, + }); + } catch (error) { + const remoteMessage = error?.response?.data?.error; + + throw syncError( + remoteMessage || 'Unable to download beatmap catalog data from osu! right now.', + error?.response?.status || 502, + ); + } + + const beatmapSets = Array.isArray(response?.data?.beatmapsets) + ? response.data.beatmapsets + : []; + + return beatmapSets.filter(shouldKeepBeatmapSet); +} + +async function upsertBeatmapSetsPage({ beatmapSets, currentUser }) { + const transaction = await db.sequelize.transaction(); + const now = new Date(); + const counts = { + processed: 0, + inserted: 0, + updated: 0, + skipped: 0, + }; + + try { + const osuBeatmapSetNumerics = beatmapSets + .map((beatmapSet) => normalizeInteger(beatmapSet.id, 0)) + .filter(Boolean); + const creatorUserNumerics = beatmapSets + .map((beatmapSet) => normalizeInteger(beatmapSet.user_id, 0)) + .filter(Boolean); + const artistNames = beatmapSets + .map((beatmapSet) => normalizeString(beatmapSet.artist)) + .filter(Boolean); + const osuBeatmapNumerics = beatmapSets.flatMap((beatmapSet) => + getUsableBeatmaps(beatmapSet) + .map((beatmap) => normalizeInteger(beatmap.id, 0)) + .filter(Boolean), + ); + + const [existingSets, existingMappers, existingArtists, existingBeatmaps] = + await Promise.all([ + db.beatmap_sets.findAll({ + where: { + osu_beatmapset_numeric: { + [Op.in]: osuBeatmapSetNumerics, + }, + }, + transaction, + }), + creatorUserNumerics.length + ? db.mappers.findAll({ + where: { + osu_user_numeric: { + [Op.in]: creatorUserNumerics, + }, + }, + transaction, + }) + : [], + artistNames.length + ? db.artists.findAll({ + where: { + name: { + [Op.in]: artistNames, + }, + }, + transaction, + }) + : [], + osuBeatmapNumerics.length + ? db.beatmaps.findAll({ + where: { + osu_beatmap_numeric: { + [Op.in]: osuBeatmapNumerics, + }, + }, + transaction, + }) + : [], + ]); + + const beatmapSetMap = toRecordMap( + existingSets, + (record) => normalizeInteger(record.osu_beatmapset_numeric, 0), + ); + const mapperMap = toRecordMap( + existingMappers, + (record) => normalizeInteger(record.osu_user_numeric, 0), + ); + const artistMap = toRecordMap(existingArtists, (record) => normalizeString(record.name)); + const beatmapMap = toRecordMap( + existingBeatmaps, + (record) => normalizeInteger(record.osu_beatmap_numeric, 0), + ); + + for (const beatmapSet of beatmapSets) { + const osuBeatmapSetNumeric = normalizeInteger(beatmapSet.id, 0); + const creatorUserNumeric = normalizeInteger(beatmapSet.user_id, 0); + const artistName = normalizeString(beatmapSet.artist); + const setStatus = normalizeSetStatus(beatmapSet.status); + const usableBeatmaps = getUsableBeatmaps(beatmapSet); + const coverUrl = getBestCoverUrl(beatmapSet); + + if ( + !osuBeatmapSetNumeric || + !creatorUserNumeric || + !artistName || + !setStatus || + !usableBeatmaps.length + ) { + counts.skipped += 1; + continue; + } + + counts.processed += 1; + + const beatmapSetPayload = { + osu_beatmapset_numeric: osuBeatmapSetNumeric, + title: normalizeString(beatmapSet.title) || 'Unknown beatmap set', + artist_name: artistName, + creator_username: normalizeString(beatmapSet.creator) || 'Unknown mapper', + creator_user_numeric: creatorUserNumeric, + status: setStatus, + total_playcount: normalizeInteger(beatmapSet.play_count, 0), + background_image_url: coverUrl, + cover_image_url: coverUrl, + ranked_at: setStatus === 'ranked' ? parseDateOrNull(beatmapSet.ranked_date) : null, + loved_at: setStatus === 'loved' ? parseDateOrNull(beatmapSet.ranked_date) : null, + last_synced_at: now, + updatedById: currentUser.id, + }; + + let beatmapSetRecord = beatmapSetMap.get(osuBeatmapSetNumeric); + + if (beatmapSetRecord) { + await beatmapSetRecord.update(beatmapSetPayload, { transaction }); + counts.updated += 1; + } else { + beatmapSetRecord = await db.beatmap_sets.create( + { + ...beatmapSetPayload, + createdById: currentUser.id, + }, + { transaction }, + ); + beatmapSetMap.set(osuBeatmapSetNumeric, beatmapSetRecord); + counts.inserted += 1; + } + + const mapperPayload = { + osu_user_numeric: creatorUserNumeric, + osu_username: normalizeString(beatmapSet.creator) || 'Unknown mapper', + avatar_url: getMapperAvatarUrl(creatorUserNumeric), + profile_url: getMapperProfileUrl(creatorUserNumeric), + banner_url: coverUrl, + status: 'active', + last_synced_at: now, + updatedById: currentUser.id, + }; + + let mapperRecord = mapperMap.get(creatorUserNumeric); + + if (mapperRecord) { + await mapperRecord.update(mapperPayload, { transaction }); + counts.updated += 1; + } else { + mapperRecord = await db.mappers.create( + { + ...mapperPayload, + createdById: currentUser.id, + }, + { transaction }, + ); + mapperMap.set(creatorUserNumeric, mapperRecord); + counts.inserted += 1; + } + + const artistPayload = { + name: artistName, + image_source: coverUrl ? 'beatmap_background_fallback' : 'none', + image_url: coverUrl, + external_url: null, + status: 'active', + last_synced_at: now, + updatedById: currentUser.id, + }; + + let artistRecord = artistMap.get(artistName); + + if (artistRecord) { + await artistRecord.update(artistPayload, { transaction }); + counts.updated += 1; + } else { + artistRecord = await db.artists.create( + { + ...artistPayload, + createdById: currentUser.id, + }, + { transaction }, + ); + artistMap.set(artistName, artistRecord); + counts.inserted += 1; + } + + for (const beatmap of usableBeatmaps) { + const osuBeatmapNumeric = normalizeInteger(beatmap.id, 0); + const beatmapStatus = normalizeSetStatus(beatmap.status) || setStatus; + + if (!osuBeatmapNumeric || !beatmapStatus) { + counts.skipped += 1; + continue; + } + + const beatmapPayload = { + osu_beatmap_numeric: osuBeatmapNumeric, + difficulty_name: normalizeString(beatmap.version) || 'Unknown difficulty', + mode: 'osu', + status: beatmapStatus, + playcount: normalizeInteger(beatmap.playcount, 0), + passcount: normalizeInteger(beatmap.passcount, 0), + star_rating: normalizeDecimal(beatmap.difficulty_rating, 0), + bpm: normalizeDecimal(beatmap.bpm || beatmapSet.bpm, 0), + length_seconds: normalizeInteger( + beatmap.total_length || beatmap.hit_length, + 0, + ), + cs: normalizeDecimal(beatmap.cs, 0), + ar: normalizeDecimal(beatmap.ar, 0), + od: normalizeDecimal(beatmap.accuracy, 0), + hp: normalizeDecimal(beatmap.drain, 0), + last_synced_at: now, + beatmap_setId: beatmapSetRecord.id, + mapperId: mapperRecord.id, + artistId: artistRecord.id, + updatedById: currentUser.id, + }; + + let beatmapRecord = beatmapMap.get(osuBeatmapNumeric); + + if (beatmapRecord) { + await beatmapRecord.update(beatmapPayload, { transaction }); + counts.updated += 1; + } else { + beatmapRecord = await db.beatmaps.create( + { + ...beatmapPayload, + createdById: currentUser.id, + }, + { transaction }, + ); + beatmapMap.set(osuBeatmapNumeric, beatmapRecord); + counts.inserted += 1; + } + } + } + + await transaction.commit(); + return counts; + } catch (error) { + await transaction.rollback(); + throw error; + } +} + +async function recomputeEntityStats({ + entity = 'mapper', + currentUser, +}) { + const foreignKey = entity === 'artist' ? 'artistId' : 'mapperId'; + const StatsModel = entity === 'artist' ? db.artist_stats : db.mapper_stats; + const transaction = await db.sequelize.transaction(); + const now = new Date(); + + try { + const aggregates = await db.beatmaps.findAll({ + attributes: [ + foreignKey, + [db.sequelize.fn('SUM', db.sequelize.col('playcount')), 'total_plays'], + [db.sequelize.fn('COUNT', db.sequelize.col('id')), 'ranked_loved_maps_count'], + ], + where: { + [foreignKey]: { + [Op.ne]: null, + }, + mode: 'osu', + status: { + [Op.in]: ['ranked', 'loved'], + }, + }, + group: [foreignKey], + raw: true, + transaction, + }); + + const entityIds = aggregates + .map((row) => row[foreignKey]) + .filter(Boolean); + + const existingStats = entityIds.length + ? await StatsModel.findAll({ + where: { + [foreignKey]: { + [Op.in]: entityIds, + }, + }, + order: [['createdAt', 'ASC'], ['id', 'ASC']], + transaction, + }) + : []; + + const existingStatsMap = existingStats.reduce((accumulator, statRecord) => { + const relatedId = statRecord[foreignKey]; + + if (!accumulator.has(relatedId)) { + accumulator.set(relatedId, []); + } + + accumulator.get(relatedId).push(statRecord); + return accumulator; + }, new Map()); + + let inserted = 0; + let updated = 0; + let removedDuplicates = 0; + + for (const aggregate of aggregates) { + const relatedId = aggregate[foreignKey]; + const relatedStats = existingStatsMap.get(relatedId) || []; + const [primaryRecord, ...duplicateRecords] = relatedStats; + const payload = { + total_plays: normalizeInteger(aggregate.total_plays, 0), + ranked_loved_maps_count: normalizeInteger( + aggregate.ranked_loved_maps_count, + 0, + ), + computed_at: now, + updatedById: currentUser.id, + }; + + if (primaryRecord) { + await primaryRecord.update(payload, { transaction }); + updated += 1; + } else { + await StatsModel.create( + { + ...payload, + [foreignKey]: relatedId, + createdById: currentUser.id, + }, + { transaction }, + ); + inserted += 1; + } + + for (const duplicateRecord of duplicateRecords) { + await duplicateRecord.destroy({ transaction }); + removedDuplicates += 1; + } + } + + await transaction.commit(); + + return { + inserted, + updated, + removedDuplicates, + processed: aggregates.length, + }; + } catch (error) { + await transaction.rollback(); + throw error; + } +} + +module.exports = class OsuCatalogSyncService { + static isRunnableJobType(jobType) { + return [ + 'osu_sync_seed', + 'osu_sync_incremental', + 'aggregate_mapper_totals', + 'aggregate_artist_totals', + ].includes(jobType); + } + + static async run(jobRecord, currentUser) { + if (!jobRecord?.id) { + throw syncError('Sync job record is required.'); + } + + if (jobRecord.job_type === 'aggregate_mapper_totals') { + const mapperTotals = await recomputeEntityStats({ + entity: 'mapper', + currentUser, + }); + + return { + processedCount: mapperTotals.processed, + insertedCount: mapperTotals.inserted, + updatedCount: mapperTotals.updated, + skippedCount: 0, + summary: `Recomputed mapper totals for ${mapperTotals.processed} mappers.`, + }; + } + + if (jobRecord.job_type === 'aggregate_artist_totals') { + const artistTotals = await recomputeEntityStats({ + entity: 'artist', + currentUser, + }); + + return { + processedCount: artistTotals.processed, + insertedCount: artistTotals.inserted, + updatedCount: artistTotals.updated, + skippedCount: 0, + summary: `Recomputed artist totals for ${artistTotals.processed} artists.`, + }; + } + + const importOptions = await getImportOptions(jobRecord); + const normalizedPayload = { + ...importOptions.payload, + pages: importOptions.pages, + sort: importOptions.sort, + startPage: importOptions.startPage, + }; + + delete normalizedPayload.page; + + await updateJob(jobRecord.id, currentUser, { + job_payload_json: JSON.stringify(normalizedPayload), + }); + + const totals = { + processedCount: 0, + insertedCount: 0, + updatedCount: 0, + skippedCount: 0, + errorCount: 0, + }; + + for (let pageOffset = 0; pageOffset < importOptions.pages; pageOffset += 1) { + const page = importOptions.startPage + pageOffset; + const beatmapSets = await fetchBeatmapSearchPage({ + page, + sort: importOptions.sort, + }); + const pageCounts = await upsertBeatmapSetsPage({ + beatmapSets, + currentUser, + }); + + totals.processedCount += pageCounts.processed; + totals.insertedCount += pageCounts.inserted; + totals.updatedCount += pageCounts.updated; + totals.skippedCount += pageCounts.skipped; + + await updateJob(jobRecord.id, currentUser, { + processed_count: totals.processedCount, + inserted_count: totals.insertedCount, + updated_count: totals.updatedCount, + skipped_count: totals.skippedCount, + error_count: totals.errorCount, + }); + } + + const [mapperTotals, artistTotals] = await Promise.all([ + recomputeEntityStats({ entity: 'mapper', currentUser }), + recomputeEntityStats({ entity: 'artist', currentUser }), + ]); + + totals.insertedCount += mapperTotals.inserted + artistTotals.inserted; + totals.updatedCount += mapperTotals.updated + artistTotals.updated; + + const endPage = importOptions.startPage + importOptions.pages - 1; + const pageRangeLabel = + importOptions.pages === 1 + ? `page ${importOptions.startPage}` + : `pages ${importOptions.startPage}-${endPage}`; + const nextSyncHint = importOptions.explicitStartPage + ? '' + : ` Next automatic sync will continue from page ${endPage + 1}.`; + + return { + ...totals, + summary: `Imported ${totals.processedCount} beatmap sets across ${pageRangeLabel} (${importOptions.sort}) and refreshed mapper/artist totals.${nextSyncHint}`, + }; + } +}; diff --git a/backend/src/services/sync_jobs.js b/backend/src/services/sync_jobs.js index 0b04fef..eb62ab5 100644 --- a/backend/src/services/sync_jobs.js +++ b/backend/src/services/sync_jobs.js @@ -1,36 +1,107 @@ const db = require('../db/models'); const Sync_jobsDBApi = require('../db/api/sync_jobs'); -const processFile = require("../middlewares/upload"); +const processFile = require('../middlewares/upload'); const ValidationError = require('./notifications/errors/validation'); +const OsuCatalogSyncService = require('./osuCatalogSync'); const csv = require('csv-parser'); -const axios = require('axios'); -const config = require('../config'); const stream = require('stream'); +async function createStoredJob(data, currentUser) { + const transaction = await db.sequelize.transaction(); + try { + const syncJob = await Sync_jobsDBApi.create( + data, + { + currentUser, + transaction, + }, + ); + await transaction.commit(); + return syncJob; + } catch (error) { + await transaction.rollback(); + throw error; + } +} +async function markJobFailed(jobId, currentUser, error) { + try { + await db.sync_jobs.update( + { + status: 'failed', + finished_at: new Date(), + error_count: 1, + error_summary: error.message, + updatedById: currentUser?.id || null, + }, + { + where: { id: jobId }, + }, + ); + } catch (updateError) { + console.error('Failed to update sync job failure state:', updateError); + } +} module.exports = class Sync_jobsService { static async create(data, currentUser) { - const transaction = await db.sequelize.transaction(); + const shouldRunJob = + OsuCatalogSyncService.isRunnableJobType(data?.job_type) && + (!data?.status || ['queued', 'running'].includes(data.status)); + + const initialPayload = shouldRunJob + ? { + ...data, + status: 'running', + started_at: new Date(), + finished_at: null, + processed_count: 0, + inserted_count: 0, + updated_count: 0, + skipped_count: 0, + error_count: 0, + error_summary: null, + triggered_by: currentUser?.id || null, + } + : data; + + const syncJob = await createStoredJob(initialPayload, currentUser); + + if (!shouldRunJob) { + return syncJob; + } + try { - await Sync_jobsDBApi.create( - data, + const result = await OsuCatalogSyncService.run(syncJob, currentUser); + + await db.sync_jobs.update( { - currentUser, - transaction, + status: 'succeeded', + finished_at: new Date(), + processed_count: result.processedCount, + inserted_count: result.insertedCount, + updated_count: result.updatedCount, + skipped_count: result.skippedCount, + error_count: result.errorCount || 0, + error_summary: result.summary, + updatedById: currentUser.id, + }, + { + where: { id: syncJob.id }, }, ); - await transaction.commit(); + return db.sync_jobs.findByPk(syncJob.id); } catch (error) { - await transaction.rollback(); + console.error('Sync job failed:', error); + await markJobFailed(syncJob.id, currentUser, error); throw error; } - }; + } - static async bulkImport(req, res, sendInvitationEmails = true, host) { + static async bulkImport(req, res) { const transaction = await db.sequelize.transaction(); try { @@ -38,24 +109,24 @@ module.exports = class Sync_jobsService { const bufferStream = new stream.PassThrough(); const results = []; - await bufferStream.end(Buffer.from(req.file.buffer, "utf-8")); // convert Buffer to Stream + await bufferStream.end(Buffer.from(req.file.buffer, 'utf-8')); await new Promise((resolve, reject) => { bufferStream .pipe(csv()) - .on('data', (data) => results.push(data)) - .on('end', async () => { + .on('data', (row) => results.push(row)) + .on('end', () => { console.log('CSV results', results); resolve(); }) .on('error', (error) => reject(error)); - }) + }); await Sync_jobsDBApi.bulkImport(results, { - transaction, - ignoreDuplicates: true, - validate: true, - currentUser: req.currentUser + transaction, + ignoreDuplicates: true, + validate: true, + currentUser: req.currentUser, }); await transaction.commit(); @@ -67,16 +138,15 @@ module.exports = class Sync_jobsService { static async update(data, id, currentUser) { const transaction = await db.sequelize.transaction(); + try { - let sync_jobs = await Sync_jobsDBApi.findBy( - {id}, - {transaction}, + const sync_jobs = await Sync_jobsDBApi.findBy( + { id }, + { transaction }, ); if (!sync_jobs) { - throw new ValidationError( - 'sync_jobsNotFound', - ); + throw new ValidationError('sync_jobsNotFound'); } const updatedSync_jobs = await Sync_jobsDBApi.update( @@ -90,12 +160,11 @@ module.exports = class Sync_jobsService { await transaction.commit(); return updatedSync_jobs; - } catch (error) { await transaction.rollback(); throw error; } - }; + } static async deleteByIds(ids, currentUser) { const transaction = await db.sequelize.transaction(); @@ -131,8 +200,4 @@ module.exports = class Sync_jobsService { throw error; } } - - }; - - diff --git a/frontend/src/components/NavBarItem.tsx b/frontend/src/components/NavBarItem.tsx index 72935e6..fcbd9b9 100644 --- a/frontend/src/components/NavBarItem.tsx +++ b/frontend/src/components/NavBarItem.tsx @@ -1,6 +1,5 @@ -import React, {useEffect, useRef} from 'react' +import React, { useEffect, useRef, useState } from 'react' import Link from 'next/link' -import { useState } from 'react' import { mdiChevronUp, mdiChevronDown } from '@mdi/js' import BaseDivider from './BaseDivider' import BaseIcon from './BaseIcon' diff --git a/frontend/src/components/OsuHigherLower/AnimatedCount.tsx b/frontend/src/components/OsuHigherLower/AnimatedCount.tsx new file mode 100644 index 0000000..8298a6a --- /dev/null +++ b/frontend/src/components/OsuHigherLower/AnimatedCount.tsx @@ -0,0 +1,32 @@ +import React from 'react'; + +type Props = { + value: number; + duration?: number; +}; + +export default function AnimatedCount({ value, duration = 700 }: Props) { + const [displayValue, setDisplayValue] = React.useState(0); + + React.useEffect(() => { + let frameId = 0; + const startTime = performance.now(); + + const tick = (currentTime: number) => { + const progress = Math.min((currentTime - startTime) / duration, 1); + const easedProgress = 1 - Math.pow(1 - progress, 3); + setDisplayValue(Math.round(value * easedProgress)); + + if (progress < 1) { + frameId = requestAnimationFrame(tick); + } + }; + + setDisplayValue(0); + frameId = requestAnimationFrame(tick); + + return () => cancelAnimationFrame(frameId); + }, [duration, value]); + + return <>{new Intl.NumberFormat().format(displayValue)}; +} diff --git a/frontend/src/components/OsuHigherLower/GuessCard.tsx b/frontend/src/components/OsuHigherLower/GuessCard.tsx new file mode 100644 index 0000000..65056b8 --- /dev/null +++ b/frontend/src/components/OsuHigherLower/GuessCard.tsx @@ -0,0 +1,212 @@ +import React from 'react'; +import AnimatedCount from './AnimatedCount'; +import { + GameplayRoundCard, + isArtistCard, + isBeatmapCard, + isMapperCard, +} from './types'; + +type Props = { + slot: 'a' | 'b'; + card: GameplayRoundCard; + onPick?: (slot: 'a' | 'b') => void; + disabled?: boolean; + selected?: boolean; + compact?: boolean; + reveal?: { + show: boolean; + value: number; + valueSuffix: string; + isWinner: boolean; + isWrongSelection: boolean; + }; +}; + +const getBackgroundImage = (card: GameplayRoundCard) => { + if (isBeatmapCard(card)) { + return card.backgroundImageUrl; + } + + if (isMapperCard(card)) { + return card.bannerUrl || card.fallbackVisual; + } + + if (isArtistCard(card)) { + return card.imageUrl || card.fallbackVisual; + } + + return null; +}; + +const getStatusClasses = ({ + selected, + reveal, +}: Pick) => { + if (reveal?.show && reveal.isWinner) { + return 'border-emerald-500/80 ring-2 ring-emerald-500/60'; + } + + if (reveal?.show && reveal.isWrongSelection) { + return 'border-red-500/80 ring-2 ring-red-500/60'; + } + + if (selected) { + return 'border-[#ff66aa]/80 ring-2 ring-[#ff66aa]/50'; + } + + return 'border-white/10 hover:border-white/30'; +}; + +const AvatarFallback = ({ label }: { label: string }) => ( +

+); + +const AvatarImage = ({ src, alt }: { src?: string | null; alt: string }) => { + if (!src) { + return ; + } + + return ( +
+ ); +}; + +export default function GuessCard({ + slot, + card, + onPick, + disabled = false, + selected = false, + compact = false, + reveal, +}: Props) { + const backgroundImage = getBackgroundImage(card); + const wrapperClasses = [ + 'group relative w-full overflow-hidden rounded-3xl border bg-[#131722] text-left text-white transition duration-150 ease-out', + compact ? 'min-h-[280px]' : 'min-h-[360px] md:min-h-[520px]', + disabled || !onPick ? 'cursor-default' : 'cursor-pointer', + getStatusClasses({ selected, reveal }), + ].join(' '); + + const body = ( + <> +
+
+
+ {slot} +
+ +
+
+ + {isBeatmapCard(card) && ( +
+
+ + {card.status} + + + {card.difficultyName} + +
+
+

+ {card.title} +

+

+ {card.artistName} +

+
+
+ +
+

+ Mapped by +

+

{card.mapperName}

+
+
+
+ )} + + {isMapperCard(card) && ( +
+ +
+

+ Featured mapper +

+

+ {card.name} +

+
+
+ )} + + {isArtistCard(card) && ( +
+
+

+ Featured artist +

+

+ {card.name} +

+
+
+ )} + +
+ {reveal?.show ? ( +
+

+ Revealed +

+

+ +

+

{reveal.valueSuffix}

+
+ ) : ( +
+ Pick the card you think hides the higher value. +
+ )} +
+
+ + ); + + if (!onPick) { + return
{body}
; + } + + return ( + + ); +} diff --git a/frontend/src/components/OsuHigherLower/types.ts b/frontend/src/components/OsuHigherLower/types.ts new file mode 100644 index 0000000..f4326f2 --- /dev/null +++ b/frontend/src/components/OsuHigherLower/types.ts @@ -0,0 +1,111 @@ +export type ModeSelection = + | 'beatmap_only' + | 'mapper_only' + | 'artist_only' + | 'mixed'; + +export type TimerProfile = 'normal' | 'insane'; + +export type GameplayBeatmapCard = { + title: string; + artistName: string; + mapperName: string; + mapperAvatarUrl?: string | null; + difficultyName: string; + status: string; + backgroundImageUrl?: string | null; +}; + +export type GameplayMapperCard = { + name: string; + avatarUrl?: string | null; + bannerUrl?: string | null; + fallbackVisual?: string | null; +}; + +export type GameplayArtistCard = { + name: string; + imageUrl?: string | null; + fallbackVisual?: string | null; +}; + +export type GameplayRoundCard = + | GameplayBeatmapCard + | GameplayMapperCard + | GameplayArtistCard; + +export type GameplayReveal = { + roundMode: 'beatmap' | 'mapper' | 'artist'; + modeLabel: string; + valueSuffix: string; + correctChoice: 'a' | 'b'; + winningChoice: 'a' | 'b'; + playerChoice: 'a' | 'b' | 'none'; + isCorrect: boolean; + loseReason: 'wrong' | 'timeout' | 'none'; + values: { + a: number; + b: number; + }; + answeredAt?: string; +}; + +export type GameplayRound = { + id: string; + roundNumber: number; + timeLimitMs: number; + presentedAt: string; + expiresAt: string; + cards: { + a: GameplayRoundCard; + b: GameplayRoundCard; + }; + reveal?: GameplayReveal; +}; + +export type GameplaySession = { + id: string; + status: 'active' | 'finished' | 'abandoned'; + modeSelection: ModeSelection; + timerProfile: TimerProfile; + sessionToken: string; + startingLives: number; + livesRemaining: number; + streak: number; + bestStreak: number; + startedAt: string; + endedAt?: string | null; + roundsPlayed: number; + correctGuesses: number; +}; + +export type HistorySession = GameplaySession & { + leaderboardEntry?: { + score: number; + bestStreak: number; + } | null; +}; + +export type GameplayLeaderboardEntry = { + id: string; + score: number; + bestStreak: number; + roundsSurvived: number; + achievedAt: string; + user: { + id?: string; + name: string; + }; +}; + +export const isBeatmapCard = ( + card: GameplayRoundCard, +): card is GameplayBeatmapCard => 'title' in card; + +export const isMapperCard = ( + card: GameplayRoundCard, +): card is GameplayMapperCard => 'bannerUrl' in card; + +export const isArtistCard = ( + card: GameplayRoundCard, +): card is GameplayArtistCard => !isBeatmapCard(card) && !isMapperCard(card); diff --git a/frontend/src/layouts/Authenticated.tsx b/frontend/src/layouts/Authenticated.tsx index 1b9907d..73d8391 100644 --- a/frontend/src/layouts/Authenticated.tsx +++ b/frontend/src/layouts/Authenticated.tsx @@ -1,5 +1,4 @@ -import React, { ReactNode, useEffect } from 'react' -import { useState } from 'react' +import React, { ReactNode, useEffect, useState } from 'react' import jwt from 'jsonwebtoken'; import { mdiForwardburger, mdiBackburger, mdiMenu } from '@mdi/js' import menuAside from '../menuAside' diff --git a/frontend/src/menuAside.ts b/frontend/src/menuAside.ts index 49b1c1a..e35824c 100644 --- a/frontend/src/menuAside.ts +++ b/frontend/src/menuAside.ts @@ -2,6 +2,18 @@ import * as icon from '@mdi/js'; import { MenuAsideItem } from './interfaces' const menuAside: MenuAsideItem[] = [ + { + href: '/play', + icon: 'mdiGamepadSquareOutline' in icon ? icon['mdiGamepadSquareOutline' as keyof typeof icon] : icon.mdiTable, + label: 'Play', + permissions: 'READ_GAME_SESSIONS' + }, + { + href: '/play/history', + icon: icon.mdiHistory ?? icon.mdiTable, + label: 'Run history', + permissions: 'READ_GAME_SESSIONS' + }, { href: '/dashboard', icon: icon.mdiViewDashboardOutline, diff --git a/frontend/src/pages/index.tsx b/frontend/src/pages/index.tsx index f467fae..8bacf29 100644 --- a/frontend/src/pages/index.tsx +++ b/frontend/src/pages/index.tsx @@ -1,166 +1,264 @@ - -import React, { useEffect, useState } from 'react'; -import type { ReactElement } from 'react'; +import { + mdiDatabaseOutline, + mdiGamepadSquareOutline, + mdiPlayCircleOutline, + mdiShieldCheckOutline, + mdiTimerOutline, + mdiViewDashboardOutline, +} from '@mdi/js'; import Head from 'next/head'; import Link from 'next/link'; +import React from 'react'; +import type { ReactElement } from 'react'; import BaseButton from '../components/BaseButton'; +import BaseIcon from '../components/BaseIcon'; import CardBox from '../components/CardBox'; -import SectionFullScreen from '../components/SectionFullScreen'; -import LayoutGuest from '../layouts/Guest'; -import BaseDivider from '../components/BaseDivider'; -import BaseButtons from '../components/BaseButtons'; import { getPageTitle } from '../config'; -import { useAppSelector } from '../stores/hooks'; -import CardBoxComponentTitle from "../components/CardBoxComponentTitle"; -import { getPexelsImage, getPexelsVideo } from '../helpers/pexels'; +import LayoutGuest from '../layouts/Guest'; +const heroCards = [ + { + slot: 'A', + title: 'Blue Zenith', + subtitle: 'xi · mapped by Monstrata', + image: + 'https://assets.ppy.sh/beatmaps/874923/covers/raw.jpg', + }, + { + slot: 'B', + title: 'Kyouran Hey Kids!!', + subtitle: 'THE ORAL CIGARETTES · mapped by Sotarks', + image: + 'https://assets.ppy.sh/beatmaps/102120/covers/raw.jpg', + }, +]; + +const featureCards = [ + { + icon: mdiShieldCheckOutline, + title: 'Server-hidden answers', + body: 'Playcounts, mapper totals, artist totals, and the mixed-mode selection stay hidden until the answer is locked in.', + }, + { + icon: mdiTimerOutline, + title: 'Five to eight second rounds', + body: 'Each guess resolves immediately. A timeout costs one life and the next card pair rolls in without loading screens.', + }, + { + icon: mdiDatabaseOutline, + title: 'Ranked + loved only', + body: 'The pool is scoped to osu!standard with precomputed mapper and artist aggregates for fast constant-time round evaluation.', + }, +]; + +const modeCards = [ + { + label: 'Beatmap', + helper: 'Compare raw beatmap playcount.', + }, + { + label: 'Mapper', + helper: 'Show mapper avatar + banner only, then reveal total mapper plays.', + }, + { + label: 'Artist', + helper: 'Show artist image + name only, then reveal total artist plays.', + }, + { + label: 'Mixed', + helper: 'The server chooses the round type each time and reveals it only after the guess.', + }, +]; export default function Starter() { - const [illustrationImage, setIllustrationImage] = useState({ - src: undefined, - photographer: undefined, - photographer_url: undefined, - }) - const [illustrationVideo, setIllustrationVideo] = useState({video_files: []}) - const [contentType, setContentType] = useState('image'); - const [contentPosition, setContentPosition] = useState('right'); - const textColor = useAppSelector((state) => state.style.linkColor); - - const title = 'Osu Higher Lower' - - // Fetch Pexels image/video - useEffect(() => { - async function fetchData() { - const image = await getPexelsImage(); - const video = await getPexelsVideo(); - setIllustrationImage(image); - setIllustrationVideo(video); - } - fetchData(); - }, []); - - const imageBlock = (image) => ( -
- ); - - const videoBlock = (video) => { - if (video?.video_files?.length > 0) { - return ( -
- - -
) - } - }; - return ( -
+ <> - {getPageTitle('Starter Page')} + {getPageTitle('Osu Higher Lower')} - -
- {contentType === 'image' && contentPosition !== 'background' - ? imageBlock(illustrationImage) - : null} - {contentType === 'video' && contentPosition !== 'background' - ? videoBlock(illustrationVideo) - : null} -
- - - -
-

This is a React.js/Node.js app generated by the Flatlogic Web App Generator

-

For guides and documentation please check - your local README.md and the Flatlogic documentation

-
- - - +
+
+
+ + + + +
+

+ Osu Higher Lower +

+

Fast browser guessing game

+
+ - - +
+ + +
+
+ +
+
+
+

+ osu!standard · ranked + loved +

+

+ Guess the higher hidden osu! stat and survive the run. +

+

+ Two cards. Two lives. Five to eight seconds. Beatmap playcount, mapper + total plays, artist total plays — all decided server-side for a fast, + minimal, anti-cheat-first competitive loop. +

+ +
+ + +
+ +
+
+

2

+

lives per run

+
+
+

8s / 5s

+

normal and insane timers

+
+
+

O(1)

+

gameplay queries from precomputed totals

+
+
+
+ +
+ {heroCards.map((card) => ( +
+
+
+
+
+ {card.slot} +
+
+

+ {card.title} +

+

+ {card.subtitle} +

+
+ Hidden values stay off the client until the guess is submitted. +
+
+
+
+ ))} +
+
+ +
+ {featureCards.map((feature) => ( + +
+ + + +
+

{feature.title}

+

{feature.body}

+
+
+
+ ))} +
+ +
+ +

+ Round formats +

+
+ {modeCards.map((mode) => ( +
+

{mode.label}

+

{mode.helper}

+
+ ))} +
+
+ + +

+ Included admin shell +

+

+ Manage beatmaps, aggregates, sync jobs, sessions, and leaderboards from the built-in admin side. +

+

+ The public page keeps the login link intact and gives you a direct path to the admin interface for data ops and QA. +

+
+ + +
+
+
+
+ +
+

© 2026 Osu Higher Lower. Clean rounds, hidden answers, no extra fluff.

+
+ Privacy Policy + Login + Admin interface +
+
- -
-

© 2026 {title}. All rights reserved

- - Privacy Policy - -
- -
+ ); } Starter.getLayout = function getLayout(page: ReactElement) { return {page}; }; - diff --git a/frontend/src/pages/play/history.tsx b/frontend/src/pages/play/history.tsx new file mode 100644 index 0000000..aac6e67 --- /dev/null +++ b/frontend/src/pages/play/history.tsx @@ -0,0 +1,298 @@ +import { + mdiChartBoxOutline, + mdiGamepadSquareOutline, + mdiHistory, + mdiPlayCircleOutline, + mdiShieldCheckOutline, + mdiTimerOutline, +} from '@mdi/js'; +import Head from 'next/head'; +import Link from 'next/link'; +import React, { ReactElement } from 'react'; +import axios from 'axios'; +import BaseButton from '../../components/BaseButton'; +import BaseIcon from '../../components/BaseIcon'; +import CardBox from '../../components/CardBox'; +import { + GameplayLeaderboardEntry, + HistorySession, +} from '../../components/OsuHigherLower/types'; +import SectionMain from '../../components/SectionMain'; +import SectionTitleLineWithButton from '../../components/SectionTitleLineWithButton'; +import { getPageTitle } from '../../config'; +import LayoutAuthenticated from '../../layouts/Authenticated'; + +const formatModeSelection = (modeSelection: HistorySession['modeSelection']) => { + if (modeSelection === 'beatmap_only') { + return 'Beatmap'; + } + + if (modeSelection === 'mapper_only') { + return 'Mapper'; + } + + if (modeSelection === 'artist_only') { + return 'Artist'; + } + + return 'Mixed'; +}; + +const formatSessionDate = (date?: string | null) => { + if (!date) { + return 'Still running'; + } + + return new Intl.DateTimeFormat(undefined, { + month: 'short', + day: 'numeric', + hour: 'numeric', + minute: '2-digit', + }).format(new Date(date)); +}; + +const statusTone: Record = { + active: 'border-emerald-500/30 bg-emerald-500/10 text-emerald-100', + finished: 'border-white/10 bg-white/5 text-white/70', + abandoned: 'border-yellow-500/30 bg-yellow-500/10 text-yellow-100', +}; + +export default function PlayHistoryPage() { + const [sessions, setSessions] = React.useState([]); + const [leaderboard, setLeaderboard] = React.useState([]); + const [isLoading, setIsLoading] = React.useState(true); + const [errorMessage, setErrorMessage] = React.useState(''); + + React.useEffect(() => { + let isMounted = true; + + const loadHistory = async () => { + try { + setIsLoading(true); + setErrorMessage(''); + const { data } = await axios.get('/gameplay/sessions'); + + if (!isMounted) { + return; + } + + setSessions(Array.isArray(data?.sessions) ? data.sessions : []); + setLeaderboard(Array.isArray(data?.leaderboard) ? data.leaderboard : []); + } catch (error: any) { + if (!isMounted) { + return; + } + + setErrorMessage(error?.response?.data || 'Could not load your run history.'); + } finally { + if (isMounted) { + setIsLoading(false); + } + } + }; + + void loadHistory(); + + return () => { + isMounted = false; + }; + }, []); + + return ( + <> + + {getPageTitle('Run history')} + + + + +
+ +
+
+ + {errorMessage ? ( +
+ {errorMessage} +
+ ) : null} + +
+ +
+
+

+ Your recent sessions +

+

+ Review finished runs or resume the active one. +

+
+
+ +
+ {isLoading ? ( +
+ Loading your sessions... +
+ ) : null} + + {!isLoading && !sessions.length ? ( +
+ You have not started a run yet. Head back to the arena and launch your + first session. +
+ ) : null} + + {!isLoading + ? sessions.map((session) => ( + +
+
+
+ + {session.status === 'active' ? 'In progress' : session.status} + + + {formatModeSelection(session.modeSelection)} + + + {session.timerProfile === 'insane' ? 'Insane · 5s' : 'Normal · 8s'} + +
+ +
+

+ {session.correctGuesses} correct guesses +

+

+ {formatSessionDate(session.endedAt || session.startedAt)} +

+
+
+ +
+
+
+ +

+ Best streak +

+
+

+ {session.bestStreak} +

+
+ +
+
+ +

+ Rounds played +

+
+

+ {session.roundsPlayed} +

+
+ +
+
+ +

+ Score +

+
+

+ {session.leaderboardEntry?.score ?? session.correctGuesses} +

+
+
+
+ + )) + : null} +
+
+ +
+ +

+ Top all-time scores +

+
+ {leaderboard.length ? ( + leaderboard.map((entry, index) => ( +
+
+
+

#{index + 1}

+

+ {entry.user.name} +

+

+ {formatSessionDate(entry.achievedAt)} +

+
+
+

{entry.score}

+

+ correct +

+
+
+
+ )) + ) : ( +
+ No leaderboard entries yet. +
+ )} +
+
+ + +

+ Need another run? +

+

+ Start a fresh session from the play screen. Active runs are preserved on the + server until you finish or replace them. +

+
+ +
+
+
+
+
+ + ); +} + +PlayHistoryPage.getLayout = function getLayout(page: ReactElement) { + return {page}; +}; diff --git a/frontend/src/pages/play/index.tsx b/frontend/src/pages/play/index.tsx new file mode 100644 index 0000000..853b08b --- /dev/null +++ b/frontend/src/pages/play/index.tsx @@ -0,0 +1,768 @@ +import { + mdiChartBoxOutline, + mdiFlash, + mdiGamepadSquareOutline, + mdiHeart, + mdiHeartOutline, + mdiHistory, + mdiRefresh, + mdiShieldCheckOutline, + mdiTimerOutline, +} from '@mdi/js'; +import Head from 'next/head'; +import Link from 'next/link'; +import React, { ReactElement } from 'react'; +import axios from 'axios'; +import BaseButton from '../../components/BaseButton'; +import BaseIcon from '../../components/BaseIcon'; +import CardBox from '../../components/CardBox'; +import GuessCard from '../../components/OsuHigherLower/GuessCard'; +import { + GameplayLeaderboardEntry, + GameplayRound, + GameplaySession, + HistorySession, + ModeSelection, + TimerProfile, +} from '../../components/OsuHigherLower/types'; +import SectionMain from '../../components/SectionMain'; +import SectionTitleLineWithButton from '../../components/SectionTitleLineWithButton'; +import { getPageTitle } from '../../config'; +import LayoutAuthenticated from '../../layouts/Authenticated'; + +const ADVANCE_DELAY_MS = 1050; + +const modeOptions: Array<{ + value: ModeSelection; + label: string; + helper: string; +}> = [ + { + value: 'mixed', + label: 'Mixed', + helper: 'Server shuffles beatmap, mapper, and artist rounds. The label stays hidden until reveal.', + }, + { + value: 'beatmap_only', + label: 'Beatmap', + helper: 'Classic higher-lower using ranked or loved osu!standard beatmap playcount.', + }, + { + value: 'mapper_only', + label: 'Mapper', + helper: 'Compare total plays accumulated across each mapper’s ranked and loved maps.', + }, + { + value: 'artist_only', + label: 'Artist', + helper: 'Compare total plays accumulated across each artist’s ranked and loved maps.', + }, +]; + +const timerOptions: Array<{ + value: TimerProfile; + label: string; + helper: string; + icon: string; +}> = [ + { + value: 'normal', + label: 'Normal · 8s', + helper: 'A quick pace that still gives you time to read each card carefully.', + icon: mdiTimerOutline, + }, + { + value: 'insane', + label: 'Insane · 5s', + helper: 'Very fast rounds with no breathing room between reveals.', + icon: mdiFlash, + }, +]; + +const formatModeSelection = (modeSelection: GameplaySession['modeSelection']) => { + if (modeSelection === 'beatmap_only') { + return 'Beatmap'; + } + + if (modeSelection === 'mapper_only') { + return 'Mapper'; + } + + if (modeSelection === 'artist_only') { + return 'Artist'; + } + + return 'Mixed'; +}; + +const formatSessionDate = (date?: string | null) => { + if (!date) { + return 'Still running'; + } + + return new Intl.DateTimeFormat(undefined, { + month: 'short', + day: 'numeric', + hour: 'numeric', + minute: '2-digit', + }).format(new Date(date)); +}; + +const getResultMessage = (round?: GameplayRound | null) => { + if (!round?.reveal) { + return 'Mode hidden until you answer.'; + } + + if (round.reveal.loseReason === 'timeout') { + return `${round.reveal.modeLabel} revealed — time ran out.`; + } + + return round.reveal.isCorrect + ? `${round.reveal.modeLabel} revealed — correct guess.` + : `${round.reveal.modeLabel} revealed — wrong guess.`; +}; + +export default function PlayPage() { + const [modeSelection, setModeSelection] = React.useState('mixed'); + const [timerProfile, setTimerProfile] = React.useState('normal'); + const [session, setSession] = React.useState(null); + const [currentRound, setCurrentRound] = React.useState(null); + const [revealedRound, setRevealedRound] = React.useState(null); + const [history, setHistory] = React.useState([]); + const [leaderboard, setLeaderboard] = React.useState([]); + const [isLoadingState, setIsLoadingState] = React.useState(true); + const [isStarting, setIsStarting] = React.useState(false); + const [isSubmittingChoice, setIsSubmittingChoice] = React.useState(false); + const [errorMessage, setErrorMessage] = React.useState(''); + const [remainingMs, setRemainingMs] = React.useState(0); + const advanceTimerRef = React.useRef(null); + const timeoutTriggeredRef = React.useRef(false); + + const loadHistory = React.useCallback(async () => { + const { data } = await axios.get('/gameplay/sessions'); + setHistory(Array.isArray(data?.sessions) ? data.sessions : []); + setLeaderboard(Array.isArray(data?.leaderboard) ? data.leaderboard : []); + }, []); + + const queueNextRound = React.useCallback( + (nextRound: GameplayRound | null, nextSession: GameplaySession) => { + if (advanceTimerRef.current) { + window.clearTimeout(advanceTimerRef.current); + } + + if (!nextRound) { + void loadHistory(); + return; + } + + advanceTimerRef.current = window.setTimeout(() => { + setSession(nextSession); + setRevealedRound(null); + setCurrentRound(nextRound); + setRemainingMs(nextRound.timeLimitMs); + timeoutTriggeredRef.current = false; + }, ADVANCE_DELAY_MS); + }, + [loadHistory], + ); + + const applyResolution = React.useCallback( + (payload: { + session: GameplaySession; + result: GameplayRound; + nextRound: GameplayRound | null; + }) => { + setSession(payload.session); + setCurrentRound(null); + setRevealedRound(payload.result); + queueNextRound(payload.nextRound, payload.session); + }, + [queueNextRound], + ); + + const loadActiveSession = React.useCallback(async () => { + const { data } = await axios.get('/gameplay/active'); + + if (!data?.activeSession) { + setSession(null); + setCurrentRound(null); + setRevealedRound(null); + return; + } + + if (data.currentRound) { + setSession(data.session); + setCurrentRound(data.currentRound); + setRevealedRound(null); + setRemainingMs(data.currentRound.timeLimitMs); + timeoutTriggeredRef.current = false; + return; + } + + if (data.result) { + applyResolution({ + session: data.session, + result: data.result, + nextRound: data.nextRound ?? null, + }); + } + }, [applyResolution]); + + React.useEffect(() => { + let isMounted = true; + + const loadPage = async () => { + try { + setIsLoadingState(true); + setErrorMessage(''); + await Promise.all([loadHistory(), loadActiveSession()]); + } catch (error: any) { + if (!isMounted) { + return; + } + + setErrorMessage( + error?.response?.data || 'Unable to load the game state right now.', + ); + } finally { + if (isMounted) { + setIsLoadingState(false); + } + } + }; + + void loadPage(); + + return () => { + isMounted = false; + if (advanceTimerRef.current) { + window.clearTimeout(advanceTimerRef.current); + } + }; + }, [loadActiveSession, loadHistory]); + + const submitChoice = React.useCallback( + async (choice: 'a' | 'b' | 'none') => { + if (!session || !currentRound || isSubmittingChoice) { + return; + } + + try { + setIsSubmittingChoice(true); + setErrorMessage(''); + timeoutTriggeredRef.current = choice === 'none'; + + const { data } = await axios.post( + `/gameplay/sessions/${session.id}/rounds/${currentRound.id}/answer`, + { choice }, + ); + + applyResolution({ + session: data.session, + result: data.result, + nextRound: data.nextRound ?? null, + }); + } catch (error: any) { + setErrorMessage( + error?.response?.data || 'Could not submit your guess. Please try again.', + ); + await loadActiveSession(); + } finally { + setIsSubmittingChoice(false); + } + }, + [applyResolution, currentRound, isSubmittingChoice, loadActiveSession, session], + ); + + React.useEffect(() => { + if (!currentRound) { + return undefined; + } + + const expiresAt = new Date(currentRound.expiresAt).getTime(); + + const tick = () => { + const nextRemainingMs = Math.max(expiresAt - Date.now(), 0); + setRemainingMs(nextRemainingMs); + + if (nextRemainingMs === 0 && !timeoutTriggeredRef.current) { + timeoutTriggeredRef.current = true; + void submitChoice('none'); + } + }; + + tick(); + const timerId = window.setInterval(tick, 100); + + return () => window.clearInterval(timerId); + }, [currentRound, submitChoice]); + + const handleStartSession = async () => { + try { + setIsStarting(true); + setErrorMessage(''); + setRevealedRound(null); + setCurrentRound(null); + + const { data } = await axios.post('/gameplay/sessions/start', { + modeSelection, + timerProfile, + }); + + setSession(data.session); + setCurrentRound(data.currentRound); + setRemainingMs(data.currentRound?.timeLimitMs || 0); + timeoutTriggeredRef.current = false; + await loadHistory(); + } catch (error: any) { + setErrorMessage( + error?.response?.data || 'Could not start a new session right now.', + ); + } finally { + setIsStarting(false); + } + }; + + const activeRound = currentRound || revealedRound; + const timerProgress = React.useMemo(() => { + if (!currentRound) { + return 0; + } + + return Math.max( + 0, + Math.min((remainingMs / currentRound.timeLimitMs) * 100, 100), + ); + }, [currentRound, remainingMs]); + + const lives = session?.startingLives ?? 2; + const lobbyVisible = !session || (!currentRound && !revealedRound); + const gameOver = session?.status === 'finished' && Boolean(revealedRound); + + return ( + <> + + {getPageTitle('Play')} + + + + +
+ +
+
+ + {errorMessage ? ( +
+ {errorMessage} +
+ ) : null} + + {isLoadingState ? ( + +
+

+ Loading arena +

+

+ Restoring your current run and recent leaderboard. +

+
+
+ ) : null} + + {!isLoadingState && session ? ( +
+ +
+
+ {formatModeSelection(session.modeSelection)} +
+
+ {session.timerProfile === 'insane' ? 'Insane · 5s' : 'Normal · 8s'} +
+
+ Round {activeRound?.roundNumber || session.roundsPlayed + 1} +
+
+ +
+
+
+ +
+

+ Lives +

+
+ {Array.from({ length: lives }).map((_, index) => ( + + ))} +
+
+
+
+ +
+
+ +
+

+ Current streak +

+

+ {session.streak} +

+
+
+
+ +
+
+ +
+

+ Best streak +

+

+ {session.bestStreak} +

+
+
+
+
+
+ + +
+
+
+

+ Round timer +

+

+ {currentRound + ? `${Math.max(remainingMs / 1000, 0).toFixed(1)}s left` + : 'Resolving round'} +

+
+ +
+ +
+
45 + ? 'bg-emerald-400' + : timerProgress > 15 + ? 'bg-yellow-400' + : 'bg-red-400' + }`} + style={{ width: `${timerProgress}%` }} + /> +
+ +

{getResultMessage(revealedRound)}

+
+ +
+ ) : null} + + {!isLoadingState && lobbyVisible ? ( +
+ +
+

+ Quick start +

+

+ Minimal, fast, and anti-cheat. +

+

+ Start a run with two lives, guess the higher hidden stat, and let the + server reveal beatmap playcount, mapper totals, or artist totals only + after you answer. +

+
+ +
+
+

+ Choose your mode +

+
+ {modeOptions.map((option) => { + const isActive = option.value === modeSelection; + + return ( + + ); + })} +
+
+ +
+

+ Choose your timer +

+
+ {timerOptions.map((option) => { + const isActive = option.value === timerProfile; + + return ( + + ); + })} +
+
+
+ +
+ + +
+
+ +
+ +
+
+

+ All-time ladder +

+

+ Top current streaks +

+
+
+ +
+ {leaderboard.length ? ( + leaderboard.slice(0, 5).map((entry, index) => ( +
+
+

#{index + 1}

+

+ {entry.user.name} +

+
+
+

{entry.score}

+

+ correct guesses +

+
+
+ )) + ) : ( +
+ Finish your first run to create a leaderboard entry. +
+ )} +
+
+ + +

+ Recent runs +

+
+ {history.length ? ( + history.slice(0, 3).map((item) => ( + +
+
+

+ {formatModeSelection(item.modeSelection)} · {item.correctGuesses} correct +

+

+ {formatSessionDate(item.endedAt || item.startedAt)} +

+
+

+ Best {item.bestStreak} +

+
+ + )) + ) : ( +
+ No runs yet. Start a session to build your history. +
+ )} +
+
+
+
+ ) : null} + + {!isLoadingState && activeRound ? ( +
+
+ {currentRound ? ( + + Hidden values stay server-side until you answer. Pick A or B before the + timer expires. + + ) : ( + {getResultMessage(revealedRound)} + )} +
+ +
+ + +
+
+ ) : null} + + {!isLoadingState && gameOver && session ? ( + +
+
+

+ Run complete +

+

+ {session.correctGuesses} correct guesses with a best streak of {session.bestStreak}. +

+

+ Review every reveal in the run detail page, then spin up another instant + session when you are ready. +

+
+
+ + +
+
+
+ ) : null} + + + ); +} + +PlayPage.getLayout = function getLayout(page: ReactElement) { + return {page}; +}; diff --git a/frontend/src/pages/play/sessions/[sessionId].tsx b/frontend/src/pages/play/sessions/[sessionId].tsx new file mode 100644 index 0000000..442a8b2 --- /dev/null +++ b/frontend/src/pages/play/sessions/[sessionId].tsx @@ -0,0 +1,294 @@ +import { + mdiChartBoxOutline, + mdiCloseCircleOutline, + mdiGamepadSquareOutline, + mdiHistory, + mdiShieldCheckOutline, + mdiTimerOutline, +} from '@mdi/js'; +import Head from 'next/head'; +import React, { ReactElement } from 'react'; +import axios from 'axios'; +import { useRouter } from 'next/router'; +import BaseButton from '../../../components/BaseButton'; +import BaseIcon from '../../../components/BaseIcon'; +import CardBox from '../../../components/CardBox'; +import GuessCard from '../../../components/OsuHigherLower/GuessCard'; +import { GameplayRound, GameplaySession } from '../../../components/OsuHigherLower/types'; +import SectionMain from '../../../components/SectionMain'; +import SectionTitleLineWithButton from '../../../components/SectionTitleLineWithButton'; +import { getPageTitle } from '../../../config'; +import LayoutAuthenticated from '../../../layouts/Authenticated'; + +const formatModeSelection = (modeSelection: GameplaySession['modeSelection']) => { + if (modeSelection === 'beatmap_only') { + return 'Beatmap'; + } + + if (modeSelection === 'mapper_only') { + return 'Mapper'; + } + + if (modeSelection === 'artist_only') { + return 'Artist'; + } + + return 'Mixed'; +}; + +const formatSessionDate = (date?: string | null) => { + if (!date) { + return 'Still running'; + } + + return new Intl.DateTimeFormat(undefined, { + month: 'short', + day: 'numeric', + hour: 'numeric', + minute: '2-digit', + }).format(new Date(date)); +}; + +const resultTone = (round: GameplayRound) => { + if (round.reveal?.loseReason === 'timeout') { + return 'border-yellow-500/30 bg-yellow-500/10 text-yellow-100'; + } + + return round.reveal?.isCorrect + ? 'border-emerald-500/30 bg-emerald-500/10 text-emerald-100' + : 'border-red-500/30 bg-red-500/10 text-red-100'; +}; + +export default function SessionDetailPage() { + const router = useRouter(); + const { sessionId } = router.query; + const [session, setSession] = React.useState< + (GameplaySession & { + leaderboardEntry?: { + score: number; + bestStreak: number; + roundsSurvived: number; + achievedAt: string; + } | null; + }) | null + >(null); + const [rounds, setRounds] = React.useState([]); + const [isLoading, setIsLoading] = React.useState(true); + const [errorMessage, setErrorMessage] = React.useState(''); + + React.useEffect(() => { + if (!sessionId || typeof sessionId !== 'string') { + return; + } + + let isMounted = true; + + const loadDetail = async () => { + try { + setIsLoading(true); + setErrorMessage(''); + const { data } = await axios.get(`/gameplay/sessions/${sessionId}`); + + if (!isMounted) { + return; + } + + setSession(data.session); + setRounds(Array.isArray(data.rounds) ? data.rounds : []); + } catch (error: any) { + if (!isMounted) { + return; + } + + setErrorMessage(error?.response?.data || 'Could not load this session.'); + } finally { + if (isMounted) { + setIsLoading(false); + } + } + }; + + void loadDetail(); + + return () => { + isMounted = false; + }; + }, [sessionId]); + + return ( + <> + + {getPageTitle('Run detail')} + + + + +
+ + +
+
+ + {errorMessage ? ( +
+ {errorMessage} +
+ ) : null} + + {isLoading ? ( + +
+ Loading session detail... +
+
+ ) : null} + + {!isLoading && session ? ( +
+ +
+
+

+ {formatModeSelection(session.modeSelection)} ·{' '} + {session.timerProfile === 'insane' ? 'Insane · 5s' : 'Normal · 8s'} +

+

+ {session.correctGuesses} correct guesses across {session.roundsPlayed} rounds. +

+

+ Started {formatSessionDate(session.startedAt)} · Ended{' '} + {formatSessionDate(session.endedAt)} +

+
+ +
+
+
+ +

+ Best streak +

+
+

+ {session.bestStreak} +

+
+
+
+ +

+ Score +

+
+

+ {session.leaderboardEntry?.score ?? session.correctGuesses} +

+
+
+
+ +

+ Status +

+
+

+ {session.status} +

+
+
+
+
+ + {!rounds.length ? ( + +
+ No rounds were recorded for this session. +
+
+ ) : null} + + {rounds.map((round) => ( + +
+
+
+ + Round {round.roundNumber} + + + {round.reveal?.modeLabel} + + + {round.reveal?.loseReason === 'timeout' + ? 'Timed out' + : round.reveal?.isCorrect + ? 'Correct' + : 'Wrong'} + +
+

+ {round.reveal?.loseReason === 'timeout' + ? 'The timer expired before an answer reached the server.' + : `You chose ${String(round.reveal?.playerChoice).toUpperCase()} and the correct answer was ${String(round.reveal?.correctChoice).toUpperCase()}.`} +

+
+
+ Answered {formatSessionDate(round.reveal?.answeredAt || round.presentedAt)} +
+
+ +
+ + +
+
+ ))} +
+ ) : null} + + {!isLoading && !session && !errorMessage ? ( + +
+ This session could not be found. +
+
+ ) : null} +
+ + ); +} + +SessionDetailPage.getLayout = function getLayout(page: ReactElement) { + return {page}; +}; diff --git a/frontend/src/pages/sync_jobs/sync_jobs-list.tsx b/frontend/src/pages/sync_jobs/sync_jobs-list.tsx index 799bd18..d673a1e 100644 --- a/frontend/src/pages/sync_jobs/sync_jobs-list.tsx +++ b/frontend/src/pages/sync_jobs/sync_jobs-list.tsx @@ -9,83 +9,93 @@ import SectionTitleLineWithButton from '../../components/SectionTitleLineWithBut import { getPageTitle } from '../../config' import TableSync_jobs from '../../components/Sync_jobs/TableSync_jobs' import BaseButton from '../../components/BaseButton' -import axios from "axios"; -import Link from "next/link"; -import {useAppDispatch, useAppSelector} from "../../stores/hooks"; -import CardBoxModal from "../../components/CardBoxModal"; -import DragDropFilePicker from "../../components/DragDropFilePicker"; -import {setRefetch, uploadCsv} from '../../stores/sync_jobs/sync_jobsSlice'; - - -import {hasPermission} from "../../helpers/userPermissions"; - - +import axios from 'axios'; +import Link from 'next/link'; +import { useAppDispatch, useAppSelector } from '../../stores/hooks'; +import CardBoxModal from '../../components/CardBoxModal'; +import DragDropFilePicker from '../../components/DragDropFilePicker'; +import { + create as createSyncJob, + setRefetch, + uploadCsv, +} from '../../stores/sync_jobs/sync_jobsSlice'; +import { hasPermission } from '../../helpers/userPermissions'; const Sync_jobsTablesPage = () => { const [filterItems, setFilterItems] = useState([]); const [csvFile, setCsvFile] = useState(null); const [isModalActive, setIsModalActive] = useState(false); - const [showTableView, setShowTableView] = useState(false); + const [isCatalogSyncing, setIsCatalogSyncing] = useState(false); - const { currentUser } = useAppSelector((state) => state.auth); - - const dispatch = useAppDispatch(); - const [filters] = useState([{label: 'ErrorSummary', title: 'error_summary'},{label: 'JobPayloadJson', title: 'job_payload_json'}, {label: 'ProcessedCount', title: 'processed_count', number: 'true'},{label: 'InsertedCount', title: 'inserted_count', number: 'true'},{label: 'UpdatedCount', title: 'updated_count', number: 'true'},{label: 'SkippedCount', title: 'skipped_count', number: 'true'},{label: 'ErrorCount', title: 'error_count', number: 'true'}, - + {label: 'StartedAt', title: 'started_at', date: 'true'},{label: 'FinishedAt', title: 'finished_at', date: 'true'}, - - + + {label: 'TriggeredBy', title: 'triggered_by'}, - - - + + {label: 'JobType', title: 'job_type', type: 'enum', options: ['osu_sync_seed','osu_sync_incremental','osu_refresh_mappers','osu_refresh_artists','aggregate_mapper_totals','aggregate_artist_totals','cache_warmup']},{label: 'Status', title: 'status', type: 'enum', options: ['queued','running','succeeded','failed','canceled']}, ]); - - const hasCreatePermission = currentUser && hasPermission(currentUser, 'CREATE_SYNC_JOBS'); - - const addFilter = () => { - const newItem = { - id: uniqueId(), - fields: { - filterValue: '', - filterValueFrom: '', - filterValueTo: '', - selectedField: '', - }, - }; - newItem.fields.selectedField = filters[0].title; - setFilterItems([...filterItems, newItem]); - }; + const hasCreatePermission = currentUser && hasPermission(currentUser, 'CREATE_SYNC_JOBS'); - const getSync_jobsCSV = async () => { - const response = await axios({url: '/sync_jobs?filetype=csv', method: 'GET',responseType: 'blob'}); - const type = response.headers['content-type'] - const blob = new Blob([response.data], { type: type }) - const link = document.createElement('a') - link.href = window.URL.createObjectURL(blob) - link.download = 'sync_jobsCSV.csv' - link.click() + const addFilter = () => { + const newItem = { + id: uniqueId(), + fields: { + filterValue: '', + filterValueFrom: '', + filterValueTo: '', + selectedField: '', + }, }; + newItem.fields.selectedField = filters[0].title; + setFilterItems([...filterItems, newItem]); + }; - const onModalConfirm = async () => { - if (!csvFile) return; - await dispatch(uploadCsv(csvFile)); - dispatch(setRefetch(true)); - setCsvFile(null); - setIsModalActive(false); - }; + const getSync_jobsCSV = async () => { + const response = await axios({url: '/sync_jobs?filetype=csv', method: 'GET',responseType: 'blob'}); + const type = response.headers['content-type'] + const blob = new Blob([response.data], { type: type }) + const link = document.createElement('a') + link.href = window.URL.createObjectURL(blob) + link.download = 'sync_jobsCSV.csv' + link.click() + }; - const onModalCancel = () => { - setCsvFile(null); - setIsModalActive(false); - }; + const runCatalogSync = async () => { + try { + setIsCatalogSyncing(true); + await dispatch( + createSyncJob({ + job_type: 'osu_sync_seed', + status: 'queued', + job_payload_json: JSON.stringify({ pages: 12, sort: 'plays_desc' }), + }), + ).unwrap(); + dispatch(setRefetch(true)); + } finally { + setIsCatalogSyncing(false); + } + }; + + const onModalConfirm = async () => { + if (!csvFile) return; + await dispatch(uploadCsv(csvFile)); + dispatch(setRefetch(true)); + setCsvFile(null); + setIsModalActive(false); + }; + + const onModalCancel = () => { + setCsvFile(null); + setIsModalActive(false); + }; return ( <> @@ -94,12 +104,21 @@ const Sync_jobsTablesPage = () => { - {''} + {''} - - - {hasCreatePermission && } - + + {hasCreatePermission && } + + {hasCreatePermission && ( + + )} + { onClick={addFilter} /> - - {hasCreatePermission && ( - setIsModalActive(true)} - /> - )} - + + {hasCreatePermission && ( + setIsModalActive(true)} + /> + )} +
-
- -
- Switch to Table -
- +
+ +
+ Switch to Table +
- - - + + {hasCreatePermission && ( + +

+ Use Sync / continue osu catalog before testing the game. Each run upserts into the existing catalog, refreshes mapper and artist totals, and if you leave startPage out it automatically continues from the next untouched page so your local pool keeps growing. +

+
+ )} + +
{ Sync_jobsTablesPage.getLayout = function getLayout(page: ReactElement) { return ( {page} diff --git a/frontend/src/pages/sync_jobs/sync_jobs-new.tsx b/frontend/src/pages/sync_jobs/sync_jobs-new.tsx index 46a6b38..b1a7769 100644 --- a/frontend/src/pages/sync_jobs/sync_jobs-new.tsx +++ b/frontend/src/pages/sync_jobs/sync_jobs-new.tsx @@ -193,7 +193,7 @@ const initialValues = { - job_payload_json: '', + job_payload_json: '{"pages":12,"sort":"plays_desc"}',