From aa7b8569d786e584ccfbbcf736eb2cf30c23e1f1 Mon Sep 17 00:00:00 2001 From: MasterGordon Date: Tue, 16 Sep 2025 16:03:36 +0200 Subject: [PATCH] updated pixijs --- bun.lockb | Bin 293552 -> 296462 bytes eslint.config.js | 1 + package.json | 12 +-- src/components/Board.tsx | 98 +++++++++++++--------- src/components/pixi/PixiViewport.tsx | 121 ++++++++++++--------------- src/themes/useTheme.ts | 12 ++- 6 files changed, 129 insertions(+), 115 deletions(-) diff --git a/bun.lockb b/bun.lockb index 1d4fcf70427cb446072fe0f22e768b253eb071e5..cf944d5a457b48a93d4f0b92aba45ff650d04f73 100755 GIT binary patch delta 65163 zcmeFad0b8H+yA}y)~1apM43a%5JH1??L<-LA}UFPQbIEosSst(lG7AI#ta!#LdMKO zWELXxWhUbJ9BZxJ)pfnT_xJhU_x*dG-#^!Wb@Vxo_j#^!ozptkxwqZ2=d;eD1r3&T z>0sJ6_sy5ViH9%Eo|fG8dE@Odbp}3(vGG6i*`+*a@}aWJGm< zQXs~+pmd_kP}Du4v8Y<2j?|Gz8iHSd@(qJFKs-JqbR3=O5aLESe?n-~fKZi7wQ(kx=kmO+g!h10^&@K1x4@UsQ1!V&Wc+g$8VdQn_z& z9C4E-;PG(I1E4Yqheg#ybt(RZ40J$fP;^k22@#UIs09txJAH|y1@s2A88i=ypM(vf zrigkC(-jO7{=^;#oTTo1|gm&ma zDp1`sa>UfKWtKvL)1lPz8|XPY(J?4ZjYd|&oZQw+NZ$%hJ=M@!Xvll00pcQP>v%XH zlmc*8NhBDg1XCzRJK+#G)qE|KhN3I95wtm!hUz+$Dl`X56$ydTiQJ*ofWD%t`UvUm zMSWu@Of7B1@su&5udps%g;I-;L22&(Kt^g&Z4^X&sZ=PqyMs`%X^82B9s3D!eP}bp zKaoxqjO{NhE8n3smnT4J{d0v70@_yUxAA{$C$ zxB^N&;wV{I4H8apO)gwCL6H$A0YQ`fyABr0ABMGxu42E4h{%{we~E?^{ZBRe zj0CzG*9{RgBG4y16wK0D7!o}w4as+uKwW+pN@Jcc>N-(pLaE{bP^$0%QM*B@;(AaT zDk+p2{3?E^(51zq9usw&sLP<#Rg{l37)o!qIV?|yoBuDP%3t^&*YFG+$;Pee4~OUj+2D=2p!@ErH<$WrK#9i z)W)JpM1AQk_7fES5T9^da1yeh)FCTGoh@ppsGg!airQ1u)}m@bsht&L1${2+4N*@( zY3}b4buF)0HWr8=R@Cs2i4&tjvCakyQ^g-jQ^5&JQ=u!Ara%Lcf1e=C;k!_NDv7!V zYJhyxp{=2wqN>F7X3(~{P7=Nc33Kxfv=!n!QPZJRU?P-G>?`tqV%!NzS1CraLeVll zX^JpH@1P3cGBLg@>O}u3lO=dvK&*}QasK|HCP5LBDTwPMo&=@iN}`3>Iz}k33$z}% z57OzHvxXW%gCb1EPYm&u?26^{#V42|p$;XCpBxhIk2O+^ap8_LL64SA6VmU98fr2z z#Lp)ZwU`(*DJW8MXS$Hy7{^fsgX4q>1pCK;NF=3*sr-P6K9Q0B<0Q2}sp9?-QISCt z<0CL9!=n7dVNJbrF-zzx?8{70&GG9I(-A%s_!eMa z7i5A>i$uM>Ix<^0(*`KbsY5seP12arLdhG&nj}GKDnvu+jJ@Ux8X)E$07VPp6ZBEd z+Q={xfckJove5Ji5hgJ{lO{@h!pDdDgh%*?gHw~YrU<$kN(GzG6S{y#)@Ndbq$kR0 z4Bi?_UE(lbSiWi@#<>z+L<$uXx)@hebAWb8h*&60Y8NP71r3(2b`G=49?=DU@jBmm#97rt>@QH{FLvMup zM@0k$#7Lw|g`PM8r4!fVgh9M3=2tJUKXJ0wNPhyQ7P>4GVlyZ$0~f%lA?hCJ3{DlM zS|@{{gHObuKMr8`BMnBEqOxfY*r0R_+`dVm9{tM((Nr8!;H`C@t)lqQ`n z^3e$`P!THd3u2nI?ntMW+Cz1rW>Ct93qRa{ynl2%#FRfM!Y4f3Cq_~aabwzuecmJ_ z49gTIjT8x5$oLus)8sq`r55joQcE^MX-HC_bb{$n${!A;{GL$C?*OHSm_sSwiLF8d z+aaa~OQ5>^96(E`#&@A~g6+^|(4|mnQ3{4gAF6&^Rk%Z_XbzO}|NU)Nvz@{T)o-uV zZcMbWeXY-&m6zU<^ zj+h$eunPT834fn_>UX4npM-y(WWjrc<9(sjwZow_*6PV7Ofu||r%pD(jUhrkx72fL zV>~87^~t23JnBjFm&t;HUtv!CySbuX7sCA`LMBe}m&lF_3)r_~LXW+K(p46YIYmPp zAC8MV5;sWBY|e~a45|M2Phq2DROoC;}gOpOg}>=_~9J(POH=BzN*cSQaGF;&R1P^h^Ll#Wwx z?bKVk|F^B&ac`jqv!MKk2P=3-k}zA;P*FWabriLysI5iSf>KNWdt10acW?n{SR>58 zgpqKxtF=VE_fwxhsOg`3L3M@ICl>aGe>Onf1L}sTdq%yvRqr*af$@!SV)dR<-BR`L zSG^fkcbU2eUgALhHY@godM`RrB8>5mo5IzgED>%(2GFKBPc2d3-VzqH;#*jMX=Td? zpvjRb>LO?p#L-YX(Ksko)D22=V+fRH?=zf;t_Dw>n0inJr8&|QO6jNC2^BFKBg~b( z_l4s_pme#m#rgS#U`kLVc3ywJkNErh2lXyny^B`wiq)Ikzwf%$yKD7s`rJcdpYiw2 zaRq*Zd#>Ist9Q>;yKPjGX8no>LQ7{n7d9+j(AMC+p)H}UME>)cQ2s+` z3-II6R?t<@_R#ofIBnp#L8*YbD43SU2|jRrxeQ8(td~t1~CDEtOJ~(#qxkjG6v^1uz(tKrL zZTnhNYZdo%^>9yLG{@fCvv~BE*$12(PC9vM>BMURFSb2%pRw|O)RvSt{_TB?`+u#| zdw(rXwe{WfQ>y8tiOqgjs;Oxc1O?aX4+Yme-zlae09^oCyzV3*U@S7CB*VUz?3(?A6|X1rCHdrHf|47%8t(N{j-hRMg6vuDtivL zdcOPj;G7PH^|Xgn?6w`TGrCX2l+qJ-Z>{gh+3Fc+&UT85%z71-#YO8GYYq)ha`O!< zc*7mn({r2p{+303E7ybSQoM|8PJf?lC==sLx8T&V@ zJ5B7Il9)9C$qQyUWuAX>$>8l31AldA?sL?)tkKPU^VuYabob~R6OKR(x?3$@%pghrPvF;e3!?~;4 zx}@CP)zWQ1?R_hZa%B6wI|kO`9Fw~##^Jj4#x$wL*(F;j?jdriikxxHTUSL35t&y- z#<*(wR7DdI^{$GxBf`=lmZ^PNBL_kGKIjM<-Vml(Ms*Fz&Syn~nTEYo5 zxB@c^MKmHM(qx>}!a}hRQB_XaS1m5Kmr7w;Pa?rWg)DYGEoA=nIIA8i*|K_EEaXx> zE*D}|pR0hx*XOKysuYj0vk(t3wNNz1f=3NP%@DaEq9#Z=yDUo$1Xf&SPo?52c>?Zc zA*-#!<(jGFLAbt$a5g4N`4f0KepP2k z`Ac*K(Vs19*s^*w>MzmizeEoa{dvi>!cC-S)ft8(vOuKCNqbso9YNF!5w0qU24^>{ z6BpW9Q~nv$o~!JpRP<^s)D_nTX6`&hBas^suA4`QXjaR)#4Z+!HU`33YH)U@7Fr__ z*&t1V7tWN%m#f2p(v?P33bW%(I~(z5yi6%v+-#*n(MBk>CY?hzunkwyS0z6L=)hI> zRmvK)G%T?H`WT)G5Rt_pz*LGYiWO_R;7oyRgt8h>$EOGawO9a)% z!Vrjv1{iBbXA8w~MAQge*%lTunGsjfPbHt$Q6d?`*$lAOfMds1_EXCBJ4qzYyf*>f zVBR|f&x!XWor%Q_u$2zw<28tdlrne&dDhKD?M;K{&a)fva0E`&MIs62(IR+JyjP>E zL=wV#;qb=u-fei3c&{H?Bpi_qPe|1>#rrBgH4&b`%Hat|xOP_`alFdw)PqkQW~~7S z9g3Eo$6OKG*ThUB8O5{7@P_kV0X(6N+PJ!ed}H9b@~L~PyjqxJ0`r8|pHJNg&z1&R z_Sk~68m5x9wd7)lspNYs)uq?KT;zL8Hl!D4<*brl0C3`LoRxB8Tr&O1lZ9Au70xQz zQ7g{MMI|3^Es;#16;jav6V4k$DXjnDh`jh=#(b1rwc)IWs}vC`iNv=mOEDtKA{@}e zR+!wvBAtS07}8{10aoMNwp{E8m7-N|;R=)zl=~s_FCY zx8rhMRq~C112`KOrD7!J*^sK!ZTd^}0THbULRC8VMO*okQ$e%(a#o{oO94csFmLT# zEMx}uT<$29%*&puK-y;esvC@ng{<73i*-{ehB#C;2yl}FR{_`$YYkn(LKD^?8o^bL zvetw{bwhJ;QRLy|=o=xEtd=8Z<)M-dbmU?^R0<9YnG2sYafF59Eh3@bSOa9nPMppO`J)x7%ISBiW}RoRzmq z;o*#{4OygI;xG$E0V2Pus2w`Xrz%Q9G`1>w`j@Eh@akzB5RIwI`5V#bs>lPkq^d}M z01cv$|P$>>$0l^9+OkP=yv0QAhO4fHQmm92-r(oPiaQVSX`F(gpc(0Q$ zbsw>*Ro=-euRi9DkUF}`+X8O@f5iJLPdN@73ZBiX@-9?)4e|b1NF80}ZLIQMRe3!E z)cK~t>&KT@zs!Em+ z!C6JCWWkYKEM$KqmkU`ug{y#ko5ESes1)6&3bO-y4HFCbWQw@T2};Fwcr>Fh$MKfq z4kE0hwD|VGMk-oZizM`RMDB(N{g2z*T6i=k`Bh2&91(7Z!D$t!G(J|Pk=JbEA0eVVYJlhb9W2tY(> zHMvA)sfmCJ!Nw0O;vZrXu53hIrdMS|G!cZn6kCH{ttOFd$~Lh12r<s+u zV&|w7R{^ojqsn8bHIk~9K%CYZ(J-V5b8`VAPej6EUY^9|&Q-~~%%R$}Be@7#t8waKkdVRkb2`&AEsE@i53fp<=%Y{mbL1clndi*5agJ=*U z37uW`a~>DFKqd2-&*d&qDK^a)_8I7!nHGvSh+L2pXFxxDEKt`IA85$8BJ$#FqLuQr zg%XJe@4bVEdofu5MRehkw-6rg%F#+iDLkq@-eFX=o>| zKKT;$jfGM%8y-zX z{^lt^fykD2sIo>&xr$Vktp8HZYN<*Qw-j%>_!`lD@-iZ-JHN+~wcz*-u^%VwlyJ2L zS;#g3aw_>vz>$2*!4uk5JO#(ItWjfSZ2t8m@w=UCZyP;1$BN z;%t^G6|!|gA0w}Yr3M1rc~Qh{c-ZTr2wb4@%an<-%Qe^2Dn^C%gNJ*452a!$JnCrd z$=RudieDk_*rrx9vw&uVSZf`VSFC*&B*N*N-^|lC2z&u}SAs>OL z4|Sh>IXsku4!Z^qR}TiQ{Z@5<6fCfiPe+7iOi;?N!o#N(fl5WAZNhcUFa8Q|M0D-) z-J{t1XN2==Y!~W;H1zEtL|%Mdx5IO*s-0|yu+PTlgq9Za@rZhJHXcg(J$TqjqfVW( zs+A*)%;Iu4VNVE1U4jqz@HVmIPO2y!777nz@1a!eg4azr4HoPNi0D?rS4Popm(V4` zTfqs4s=7BEGv6$?$}EM^pD2qCRv+S))B%#TJ!p<{r*!t4e-p z4~@J{ic&7mrkRQ9A-9Fc*He)MPv|(h4c(#~eC-g)b@r-TGYTGN4|X$);Z@~OoI^yz zElfY1eKafS1I*Fza1D4^Yrw(8H&e>K?&D&2sN`Pz`KgVe{0a{X2HH3LfUx8VL%Fyr zqFdnwL_Ki^A?^2Hq8 ze_`Mf@rH+qiC$X|k4na^A;?1hOvr)rTji_INVm-dM1zn^xD8!I9Z)F@j!Pr~LQ$A}a}ind<9zZsS8+fk z(=6a}y;L%n05#fC-s`vsP-3zhDz<`>ZB2MeYLU?!wi&AgHqwW?YRH$B_?E)>OgRfmO z`Fz*lIq_bz3ulEUR38xuJVeiyr!4<4{J~tpDJ%_mG`d7Grvq%Nd6IP z4Z*@_Mv=DWL`)diKz=pGk)L8X{_Pq?7)`4?{6hY>l@{Xq8X9+!JjCF^;gtAIq` z=d3Q_qt^ReEadlnE*H|{0apRp{(!T(tdhNXz{Orx$=f~T??6~=tqg>2bF z&gzOv{swR~XLCgUbU8%aj{ozHOkZloP&qYr!Ohx+Ryj_g}3fG z7BZg6%O#R=ycYz|oA=Ja6H>drpbwwv*p=|Gg@E@Jo-gmYzr?o`gd^Yu@}B7{u{>GY zE9ypt=4)Xqz<>Uvutem9&cn`psfA(zB6CDYTVpAG&BfkQ$)s<%+*>O7u($lj61SA{ zZScl&`S3K~(FY^s1;Y#Cy&Ld+c+cz)>SRh?0#C^I5uR|Y%X{iZO5F`_6nV0yAGnI1 zDw*2{F89udc&UWHGf8SdN5Lp|gK5INVf6Cme+x?a{KUAr630zKQVTXoOs}p~?qrcy z(|CytFcd}^!eAP(C>Xs+<*-;7rB8#=>)$EmPk_~g&4JNzb45)SH3do)UO?YIq1OUI z{-RW|MKG$+QWzD)!RWx{FygCV#8->)Iw+-Y5H(Ze+n`k54l&*hrQ`O{`RRatFsgYD zj56kmihDhMn?!;Yf#9|K?Tq^2gC>{S)RLp%o#@y!fW1jNy8z@!40n?0k zFroMge1cK|Uqt>@)NfE~@lP0~|AN(lDX0|g(#KZ%P)Tiy{;u5pk4@sKaoR|wVQDPp zA|LcQ>d>Y{`;g}OqCkECCsk~>N&;dXp-aw6Xczes&W z^%HfRsQ#h`h&o=>Kv9E8xfTyw>DNXnQ$-prY7Czm_pk|nUB!uXhNuMbgDs*k7_%tA ziSJp`qJ zIU=SXgVKwX_$eq2*m)>b;G!5`gVsa*2ukHX5%n3AUeD;yYbfCb03G;BOduuqHGa_v z-a{$hCn(LP-%!dg#jl3YMo@|y;}@+gEkvb1(V`X`Q=+I;PA8FfjTaNTil7G+WlMTO z=|r~B#!y$N7StC?OWp)1ek2p|s{wQdluk5LCdeqG=Ko*N`2Wp`X+6*sD^A)Dac3y;?jk3pInzUoNof?#gt(vD`HRv4=3+)m z@xXtlQf}u{3-0GrO#?bog(FC9#Un{6?hTc3Hf2p{9hCH?RIbGjA+kqQgNrL`r9)|s zloL7tD&^A4T1jhgJAX9c?`y+|A|FH#xzrmP89_nBrqT^87tp~B@9Bmz=8Fj$O9sp=EO_+Kd{g^20ZmC6YdIVr82)1lPh1Spl8 zSR)v}c}F<$EHPoWs7a#Efzp~kA4&x;6!{`i7mK7WqN{#Cv zYG){&z(kC@LFq+G`FcPJS%|R}lum3d^4^q)S8tl{d0lnSf`r8%JmrJm4*QV+C& zq6|rUC{@rHO0R#VR89w^lXeuflX#p7#WerAz@ZcM6f>AXsb$t;Yy-uQqz`^kOB|q7 z0VgQs8wRC{xQOYlVmu0pABiV^QTe`5I^JK5gQ2vImP`~ALPQN0HA>WID4lS+7}FaN zDrlytNl>cD0w`5v5tLq}lrL3`t1F#%sa(P}e67!~`74o!&XF!^hNziPDr2h{XF=)M zolt7jJ}B+mPm1w5G5tIgKawl>Mde=}6eJB^#{6_%vBBg}KqCORQb*0^I zg~H{~sMF zW$7AHBmRDAjPuYO>>!?xl;Vz1niXB4biY(WseURby{ap1>xYT_zoEih`EMM+pZGt? zPm8vPSfT$~d+_D`2O0m&C*w^1Xys3_7mBBCPmp+;|KrLP{Be?B(MI4b)bsy*3RnHp zIDTzLuh4q<&!=$zd+ac{PQUs|F-F$PvQRg6z-o-;r{s)j+VrKK85?=d>BSIm;dSU z|9lGfpMM(n&!=#hX#eG>cZXKilxEe6KjLYt=+N_NmzIvN>`lr_-WTp$lxX^7QQgt= zl&9}C&)XDsGD((=hb6%Wd*A$upCGwzv};j(#O>5 zm&P@Tn!ObWXb+97H`}7Of;E)(YWo-ZGpGk{FYCz zxB2my#y__l+fgsVc-HJWnpe8k>uA<&$Q++msV*tQCd8K4jz70^1$})-T|NGvwZ-~r zgseOmS#xVo`Ixgdfm&Jq_oqZYzi!{_l;oaGG;rY1iw5R%s?S`~y{<`Um zcHi!QI_Q{gz_lCK*PUjI-Ua>|zV^(+ zA6;)cw9s{$bUvw3zd^cYMq%j@6Ybsi`V8BtH1_)u(?00v_2PtT)oZ5iI;ckDrfq!f zu40Imf ztD-)>>j&C@(T|?_t+LniKKW~=hG>V@h;3hENr1j>=-#ASm)?g@`TEklSD#Ne^FK;H z2eOptW$X>A$I6;W2TEJ9#3s^FY^#n`D}MhpNqxsf&PSIx`t13BrTIDSkTd6xnUDI| zdYF4>yHfXciD&2R@9zJ0%Ld!RC1+N*J>flc&3+?E+`_5H*Y}uW=#W^gz6RCn+w)Dy zr%AG)b3Q);OEdCwajf?yFc&wSg9YD)u3NUdeB+>p;L|+ zZkZa`eYRG5trfKs8nM9*P+ybAsBc?V)EM>EY$(+l6ufE1r0}(#$M5wEEa{Wr*y+_5 zoq5?#Gi(Y9kNd5y)R|@Lkv(AGLnEi>SuZ`(oKKwJdCH)qXXW0#{l^}-xX$EVMz#7H zvQj-1n}cFm5}n70IcWm~HUikG4bXvoC!nVbFh&QU6WgW(P)I?QbPb!c9=j3ffkJbda$5I0Lgj)mk5|KeO&-ceSkP!01I}GKsiACpf&5Z z969*lZAiX$cVAtX;3GSC^u6Dq(-o6xIn83$u6K*t*yuv@8S5(>^yu<>gw%3qvxz@u z-1Rv;>7~c6bceC&!ngf|#iCdB@%i<5$jC-h>OPxsxt3#jGut|~nhc$D$$m$J?^f*o z3!SzNPZVr;75ub?{_2CXPOCfzTh+L9Z?y5z8M`&-=S?w-mDQ=w7By8U*{v)Ez*2j*I2b7etb@%vRGg#H6#@^D=^NfqiRy`clv%}nJE7O~8+h%9_am~?! zmHOQte7bR{*YZ?r=jN)9oeoc)KF1{YeUkU^JobjF*C&74#`Uf18INigs7hP)vxQf{ zoX^Xj?D+k|tGD0&(|sC*@Bi`j_M)Bb&XzB9-JbI@!oGix?%O})#tnG(AxKufrFXU7 zv#nk|zqmW)-M{SHrTZN_kB_sT7 zJUB9Kct(Wb?O*mY9ZhtmwDag$(vqb&NA()Uw7ImT@MTEj0IlB9u^%Rc8H|{)VC03o zr#Br7f^$~}wQZTP{iyA`W?naf9m_sjy6AqqSGxFp+gl0K6pwHD*8HPd_3WxwufX^5 z5nEg5#y@Ku_%>wyO1(*yb?!She75LtfbEs*eXcBz_4vcqHR!c|1iLU~_|ch~XIjdV zicakcHM||y|G#&^rT z*)<~z)@-b|wCKZ{yvs#B>u)n}ZGL-BUvsnTxA*FA>bT(1m8{CKyL`O^D{Zs9{_vP% zJAKF3&-+;=Rj;))a^4%utZx<@+I(uUT4UTI%Na|N!-eUUo;v_+fc#o$K8VZd`dt*JjNP zqs|#WW;c&@4877`cXIx~Q8qm|*Twq1rX49MY}3E-T(0#x_j_LZ4h46>3Y20I&33j# z^_t&3W1g)WR5o$axkBae&MjBmo@8zOCEPHuRC>{LP1g-0Pbw3O^*_4w&vWm+CDPF3 z>*$)!cdxAdCOg(OzGsp5!)n#*U%h$ z!NBvkYiw6;JK9yzOuy0l@fn8BM;>g{Teqi1qB$9l}-=a)BT=?mewNfbf5S-#wp7(7Yq$HSiLiAY@2uOn!Ns=HF`C- z)K?PVS!P$hyIS>}s#mYU_OQ&6frFlX$XzpNpmNzBgUxQA+GK=St}CkdN%PJLC)*YY zs;wFB`p>@2OSUgH=gTDg zbxwc%WVrjOL5F0AV+ZC%zg=sRSflTNz9W4@ADbmN`;j#2B{#8VPLoI7>X_Upy0t&k zv0C*8R%RyZ}D`aKDzpCvpUAGe5xKdblg$*@OPh-Xtnwy){$n?uJ=w14Z{zlow+^#)h3Uh|y3 zr=~ZJ)A&`V@yougLcer6*S2-NS=XF?Z_Al}Z}Z4UH)EgFjL?3suc11b+kb?2^4g(K z`&R0QMZRyp^W8A%mao%7*NC!JPY1Y-x@P3E z<-@fJ1FTClliCmaawelvf1pNay{xU;{%hYp&kCwPD6+-uYSkNBy?Vi|)-=-E+#r1Y zw%-mPHW+QLw9zZxw^(u9F}vZG8n-TaPg!>5_1MYUZ9)%gA-LsPkg**u=s!my=J~HBhG8 zUey|K+AyHJZN7_plS@ji#rL+Xymwf?W}m33mK$F0N#8oYmOz=zimNjdqJ?s#> zMAaK`_et^+mo48aXUEjcJ1%d2_Ya?b`@DALcr?#AfA39U51pm;%PLR&(77mweA!|Le6|2j|QiJNA%#s{5o_;qB^9t+VRu)w`jdEUqo8x4+}3 zb7k91-*i7*5TgAp{lfCRM3;V~28OQ8i(h$BxQM?Py{j!_LA-;|G&Ry&OiUMlb3=I)^#Lv;1m4C;2( z?DCIm`)BX?=HmE-JF~d_=cg_;p1o!Z4N<)dC8cu~c`Cm9G&uRje0$c^vU4rZ{QBL= z;LyA?mCje+uifTUP?DL`ropOiyA8H~c)Gx@uIa1p3kP~%Ntx9!tE#^|y9EGh|NsyyqV# zjPCjN`SqQl{rZi{Ps_8f%WT@CdTT=le9^o%PHwGZtvyc1VoAZm$TyBxj1A7r9v-@6 zdB-N3lD%IzYX)Y1^x1B-aD48A5vxMxqz>~i{}34ZV9wML{J;2%Z>`5vuil0=%ez0> z-{x3{_+cf^t&Sd-Sowb(Q4!wcu5C>v|#Fphfp> zBenHLb=ntqKWX(8_J*qWDYM`BIr*Qv^%^MG@VFB2OyN5=^M=C2L;uQ2%O6e7teW4g zr^h$9h)k8o#(STK%SzhY?>-cJug{fL{$VnW$fYf-_1@U()tl45$33@8h9B5Mul5VI zhU|=-FD>`}W4bD|pXai&;Xjyd*to`R#@XnfNQoGt^!a{!v(~$#Tc$jlHud^h)sja8 zC+=YBMyQ@q+iNvr8XEQ1{KF^3SZllwXfcfJf}IcG+iI8S6MphZCn4m ztnY-GR}#ebT^k{-2OI&Qa8JGZ2lK?CQxX$DsUj_iH-E9%a& zlS|8Pc1m28zmZGRPd(Us#3d_*r`w*+wLWRzZuEWFkm1K~s+!Jbl~ld4ITMp=UMM^f zf4^aA;j;_UhURW{ZTd_mqNSlPLXSI(6e0?>)buGK_uhxyOy$HXP+1Ec- zGIWa7*b!RQs>gpROst|tSlyeoujke|bu}d=YS-h1>-?=`i;PRX?ZWm}+-l?halwqm ztLwS@jL`o)KmcvUCuh}q!- zcU!gHUHb=MP9^1=q(ZhS`caCq|xkqut`&6G#q5UE?1BOLBi7js?*Wb8ou54nO ze!f9?kgNMrBb^cLXL)|e3~72Jv{_1q;jVNxrlVAE(A}4djfOt|Q8>(3cemf$%IB}+ zE=06(*|W%fOYN)Xy&h@?76i$9_ zf|#=r-ahMf!u#n1MtDCR%%sKug#`SK0Vc6*0@0lTbUOfqFrN+p#wGx#34}47jsPVD zqB;UZumS?fT>uO_0YtH|P5_o&0g4GsWd@xA$_XTO28dxr1XgqdFf##|#u7~c98Cer z2*fedE&$&Mq;&y^XQc$Tb_a0i3XsTBy8^iN0QgK`7PIRHpxF~3vl~DXdru&TfU7CM zT$W)95NHM6ihO5Qs7Z;8+2HM3~PYE-T-nNfNjj#20+ga-~fRgOsWDXB;c@1C$Vm>J6}u6%a_a2Qah)IKaZ}04yB<>^zAfK7q1AHTpW)E^MT zz=PJG8#K^YRz~VH+24KJzMRZPwLG5rl}F9H-fUR3jhwX@f@SWM>*TyKesf=YD)$bN z_zvzBGv?!`d)nd09vSb<(QWB`)MrP7fs1c;iS^dV{hps#|JP=DN!J?S5p78*v zY{Rs;WS3W?_2;kHw5r9@d(*!^)ylj-B%l6#R{crWwdw^okFZ$ReA)Qv$IrX|95-l3 z-CI+}a9jHJ{yyf%mUdnaCW_k=!%B7}HO`+jEbhfHvuU4Ow;flIJob!rtF>Eqd$(LI z{CTtR5!H2xgbjZzb(P(auklQSg_{Px6#Gxj@QT2FWw_o#Z)l9u6sI z+elt8=?KV6=1%g8Ws|&S3RlP*=0oz99VU6lbVg#f8M|ZpMUBMtd(R38ln^i+1@MuD zjRHva04OH#nHjj@$S*90H*+51|ZD?ppumW zNPn?jqanXpDnurcvX`T!BV|%4>*EQPN!cpW8dCOwR71)JjDgCfYy)XcDXSo@C1oyN z=zdMM%?qU|m~0GKDupi}{e$V~0uVGaVm@HVY!rVFe@&n7%KhAqyjE z#LkiEG6O$IV-`cwgcXtKu@2)P`Ye&8DZ5S5jG6jFnzIy=7Oa${CF>OcX~j}WTC*1< z2Fz|eqzzk1(w4m^X~&!bA%-l2q&@piV#J(-AjWJPNe3pK0O`owNjkA?lFm#K3^8Fo zBwg5HlCDf=BBUD&A~9tJB;A?*BuEbyM$(g=BQawJlOg6ThQxvuL0EYh4QL34s~1ZQ zp#cr20VSYhrlB;T5j3Eo05+_Yz&8R8VF0!)H4I>DB*13^cFZmuz%2?OGaR5Vdrv@f z3V>?_fCI~j0LURAj|Aw?oFf4Orve-x;KZa+0D92?{!st}SvG+}0=iQG1~Z>20MRi3 zrwI&YI#U6RV*#S30ywh*0wn|tqXCAquxNnfX#m9pT$w=(faP?6q!@rvtcXB40kc>D zca|6nup$nijKFASIt{>a20+?0fHAC;z&8R8(*ee^)ad|Q;{iSs@L_gw0B#8YnQ;Jq z>^%X^L;%+r0RAjv20#u0c|5>)<{S?YI1}IifgmPL0MMHS;GX~x%(4j-63|Tqn8bV% z0itIEoF)*$bY=n=Cjmsw1PEgV1WE`P&H{*FVY2{|=KvHFh++n_0W9YN;0-x#y^08w z6EI5xh+&CI04tIK$_PwjrgH!sQvlND0K~CU0^bNY%ms*NsdE9g&I9;NAd%T61Gvox z$V>*9#oiOpTmayj0+7TqQUG!Y$mapfWzO>e0v7@tAdteO^8xf00r<}cn9s5a6cW%~ z0I-nxEC7gJ3~-vjVy3eYz<3Ej)Ixw%RzRSHfZ-wlj)g4(NKOSPCXmJq76Vu=1xQ*9 zz*rH1asp;c09LZZB>*cpfHDHBnQ1D3<1&D>RDg6=O5hs-hou1PSn5)Mt!V(C31l!k z4!~_WKqd#Uk-aCN$pBoJ0c5g_WdJz@gNz)t4F0HRj`oF=fF>8t=SUJVen0w9|e5GWyFxDsF=3tI`0yau3{zyW5k3cxZQ zAZZoAAy!17oPgPCfWs_tHNc9s0A&R7nCTh-$8`W{YXI_DDS>YU9MS=fvD9>ct?L0k z6DVMIYXRIc05aDCoMi6_Xl?*-T?cTQWvm0pAs}B5aF#i*2MF8-J4jI#lvb^*L+1q4b6814r6$ij95 zB<}?%Ch(aV>;bUc2avP};43R4P)@)s8{j)j%m!GoAE1oD4`#X-!0`Y;+FpQ4R!ZO- z0f&76zgg-&fUO4sJ_E?4GS+9mbR=^-1d_QQq=t-rAflNA;(7o?E@K-GfaDO79|Wl- zV=f0l0uO^60HN)}Ar!2a3*dhUpbpC>P)I;G2SAJYM(!~ zDNiGDqbP53fDt{Wl@*F_iX#o7IJb`ioCT9S8v6wRe zE6xMlC!k~<&H^}I09beyz=qu>@Qncey^%H{DTUb2^k$_bcC6PqNFSC;(wDs;v1fMY zAr5RMNk8_Uq(5`I0C8j)Bu?x*$pGej5i*c%BN@b`mmq_gJIN51O)``zE<=Vf9};JF zn8bzYT!9Q{K_nws0f{TqzX}=2!bnE3b0luepa|m5Vn{q#5y@!Q;Tpt~C6bI`w;}A? zO={wGG;u6Txeo5lN=bZJuNx3wmP+EsUXYAqcEu2Xwvr@(y(byZoNht_Sq4cE`%W@} zIp2Z=vuz|3nY08liMf+ZX4xbmOmQ0$%6v$|*kO`zrgH}p!GcI4Spi8D)4vOu!oo+lhh%MwZQ*lm&{%=8l^pQVr-Wu+v?Sg+5J<1Ce= zfW06&!R)?3P99qMMLMeidt@M6kN;;#gSA%3H0AdAM-?qrR9kj|XFtIjhkNpWy_-OP z)1m$!1}}NC%e7@o`AmCiBhzOu;Xlr#OzQv3(sJw}WNIptKM%wsIS!%JD^hl(o~*TO zOXQ&k^<-~lGRp*ZSx44XZkd3Gc+hzdQIT37W(xoF;ZJBiI&h1Wd4H8^$R8#XD6Ji=hS!!fGyaw(syU0c~!8MUFU z?4?w0iGPu(LuY<2qdq&rXIaoerYRHpq6=T2s(wJB{0kq8NS+5CdeA}UC6j%7bx74& z)<&vjgn!n>A4DhA{D8-EQM3E=M{^6hwEOo>_$T$B9{B&K2XL`;t{r`Zt`0og?j&>H zCsWebpMU)pUW6@>N)uej^w+pEWx&f)%tL>bPmj8yS1*y#-=k}Z%t~bR9EBqyQ-a}# ze}2a?Fgm})287b-!6PTcjJ?H!>2WQmL}n)*Ob>cGBeK3?K6>WCd6C(JQAOwh1sWoA z6py8cImksefF2qH&OdP?mmItXL8%AmL4Nd@EwbTY`gZkxIuNhvBGZF^P|OzxM$gTpuQ}%uqyAqFh#&r0k$K|5>Eglkh2sK|trhdp zvnNl8Y`w_no4*@Hwn03WPDIaup&{HT=A(+Ifzc4sv-$X*YmI;&N@*m)xGiiJ4K`k9MAi;|q&UWBMP>*V1xDjvD6;l6|2zQbbq1fy;?hEY$^>#=xn2l({ND0)2+Sx5L!Q3#FoQ;~Io|4pn+85n-(|4EU2=NU?U zE5<4jip&Bm6O1O~CoufbgU9(}X)=Bh z^U=3^2zOZ@XkkEod!((Svjn`d$}}2|;_2(W74)<6tVp zL1eD*TZyb67?nK|W+1YGVAQ%%FzOjP*cHy4XuRvgv|%*P4cPrWnV%M(x+lql(cLwl z4L%}kqIC-HX&Buf&$6&1vWD?ABWu8D7SfD8hLh6+67pfR8=yPiQ5fCr=E3L=w+by- z3ZnWM9HivD?mvxP&ub4W)2EYcw2EhiyhQNlxhQa8sOe;nB7rXt9W{B(r6exZfQ7d1Z)({ z1?CKMg}K4pVIyIFu(7Z}m_KYBECA*W8xQk^`M~J8Nk*{tFnyRF%mCH`)(X}X)~qI$ zrPgp-!kWXH!05qPw550eD?)$Xfzd7IE{twTH(_*pxd*!jyAQhsdj_Ms$paYOX&%C^ z!|0Y(0xO3-g1v;@fR(~-%djjJ!=Z;_j)VEb#>2+IM#E_S(|mV>(S_s!ql;_^Y!Hkt zLPr=~$aLY_!mMCQ7(Kg`p0LmvW&-O9>jpE0(UahI!FIR9uRSo@8|{VNgq6T(Z<7N% z49jDc$1qYG;L^?mPoR@On_#i97#M9D z==r->U{_&uN26OO-BRg>LU%{HU(j9cGYogec>Y#McQ3jN(H)EKP(NUF6QP@i6h`-2 zy6w>&=pbwbY$+@QmJXvW*jm^+*m~F+7;Tw0z!t-n!O~#MVM}1EU@KvZXrve%4wed= z52F>$3pN%;s}-$WV_>ve(Mm;+huMznU9tToI4hOM#05jF&N1L@ac zH(}RclVKsSP*@l}qbnR10gHr1!KT1;U=3jO#q6Cp=^EI6*Z~-=^&4Rfwgk2Zb`^F6 zb{uvCRsg#UI|nO<-GrToU4h+#mB4Pp;;-S?Mc5_SSs2}=JaMs%fzi|5N-+oUWIzc$ z0CoZlPln~6N=xfHt@lG=!(hE(b}+hgnZqn#(@+*VnBV7h#r&a%nqGw!!LGw@)WFTN z7|tEoUD$nC8SEMCIjkJ^0`?O28ukYE7WNVL3HBNGg*l&)HH)Y18$I}vwr7Q~OEB7% z-GI?f>=w)#?HCQC4N*VDv|pk93GGMbps2a96d3JAc4FlAzygrBGqfFy9z^~a$3KAu zBhP-YK2Y45fNG;M28kC`UIh1~9>h(MBf(zAud42+_Gd=KmfegJZTAAz5My}%LRXW&=hIB)_u3FHH(fdb$ha1po+ zTmjOq;s34!H-JKbG9*ff$Oy`&|Em%ILj%%`3>mNxl`jT*07v06%FZbpr|i2u%D9(w zuZE1(^;T&^(f|L|RsUq@G#E4kT{snpMHdbQ;(#I;`zP=Ocm+HFUIR~oKY(ZS51~E; z-T?1_V&EVLm~|E+t`|9mL?Q~%QIfIXlAY5?>qK&e0X45jxvtulJ0 zw3M=WafKY&{pjD$fU~5~wSigy7j(mYW56A#2hfg$7tjEptrEKT z02%?F0BwuVvmd}|#OniS^~(J5OmED@+kh5nV&sBEq!#klkw=;V9q$mvFl@enUfQ%tJy{ESWc*VSo%l6mdBUyS?=>d=q zuA2-YL(?Mgf7BoSfW81J?gR7&dI8d#EUx4QO1~%u=(Rc=pm(88Ku3T!1-Jp+6TCty z=OAM!7L@0Kl2!CT7IHy;E-(gPqlLQoAo?Uvhu=BipGK-5U1cd9`F$;IFvlZp*`cY1gTqI|v#z=KvskkD671ipcH_Qq$6Y z!R=9i;`Rt|2;ep!R?7J^@#x1tuP8W) zt8UXy;F)@Oozxx|UMJP3D?-gCHaUi*uIDCgmi+2pmJxC|{*zBBkoup6;xhnE3KZc5 z%JrObJ&)@J;4N?&xCFcao&&|eQ{V|u1Uv>F0S|!(zNUNMI-s0}KWR0+B#} zpdZi|=mXH!9k%t-r2ReG=cD~T+WVtDz&1cjpanpG!;E~>9M@1F1PBJ20YS<=e{O~6 zFrYO+dx)fu_6%w7unW)?pnXI7duY9Zp7iyj7j7beXkY+9)d z7y-}*2;U5$PNtU8{s--Y@I4Xo&;)=yNXBzdk%#(|OQ!?mfhoWwfLfjoOa`U_Q-QC6 zZvhe_`fPx@ik{a3)Y1%K5wH-L4=e!Y0doQBQsSj@Dx+sY8nu=R>0vQI?pp(71IvLd zfOc$`02HQ6am@sl0aWQqUqwzK&n%RYV%>7`QWF8O1B3vm>g9b_2kB~RZ3_R;t!tB8rNq=XAn{~Nle z;L}ygE27w;SRoqSzXx6cWYimg_=<6T3_JzWp5Xsp0~AEm`uhMeJ;L=*;34n;ASF~z zf<&Wo{jwJ*dkOGLJiz}9&r}iBLyarK^*KOBfDfDJ@{Pnqf+R#`R1rN>WppKBGOj*` zV?BVPn77Uy&vk)1fUW^bJ zmOs-R!COw{G*6HW#SbZ_dnLl9268#-I_eH;G?g8v@lVXWug~F`m?)?yh`1nCMhZ!o zXk;XTcy$e>XWjt1Cr{i2Xv(H~s7$xZ)2NUloeSyT({Ph4h2R?q zPD?S(FXRPz4nY4?-%((YYpMT&a8F~H`j`wNX6hcIQ}^@*bSotfk}`Y5ZK1V*UsrhjA=o=2Jer|B72&(Mp?_|k zGjZk#!8kI&)63I0ckmzheN3R1?(r@VJ2uucF43s=$WMM9o7~?nae4cC`bcfHg#6Yw zbH@)kvEUjgjXnJ!pL0*h6WHKKf~_e<;ZJP)L&3(MZcmiQ)CrM>eJWP2^?G!nU@S?1 zat)NKpnN%~{)@xoo7yN8*8ibk-Gf8X zVhf55WS(Yvvst36KUcc)y->BH%GQ8+KN4)3P%W(?;RK0AN2{mj-|E&(WjYFq9Vmms zuYH$2EAp{*iRqr^Eboa>tsKb*n6vno%6%(yw&S&Oukc8995KgI08J+vyXV(A7pzmq zDHKzWw43zt?uxv|UTW=^&Dp%CLbWui;|{niz!mG~@-8vv!%r&LGlf!h zQa*q}eYJF$c`LIqW*1dT1ypDS%3jmkx5w3Ps#Pg=pjd-4_UNyL2lMZnfKq|_7bZNY z$Z}o?c3Q*2FCbhK!eKr7_E|pX>sAO3F9ejgkCD=pE~Lk>S!GnN)Sa9#0+JXusq5!& zKjPR>((LW+>BX#`36B1TeW5m&Ne#oa|a z!Pbg}hvDjEmGNA#6B=5v_L`q&RoRyrt#u21u5`2Ut)+q0x0wlXtz_uA^%tink|T_{vtr zGM}T`la<+yF0h+dD_5g&LOhY9i?%mgS#5U@cSRXGoHHs)S@;WR(H%c!j2UU-(4QXE z(H8=3z4Do_So9bW8P*uAz!?e{+kj zD|F3NWF>Pvs>|lI_}s8y%@22e{~wy8R3#a0xKkA)q^|#rim7P_riOm3)jQu_ZCZKE z$B5f>$1fMv>V5N@yWAxGzEZSFbsE-IM#CjX9k*lYkCds`6NZp2uU(JbpKD%so;q3T z>s2ZGU87RY!G4+;tS^sPx_{`st}3Nap?F)|=@-}B4O2$rX3F#zfci;j{lPmLvlFdM zRiRd((6F6~kO{I0k+`LzdRcoWR+<$mk<>=vu^IxARJr{AM0#nGNQ7b#6> zsK}qG^INffndaus zK11cYwJG;fs-{1x)f)6iwMtRiD$N~+>eJ;Zqi)>^T574`+H`$ms5YfsN*)d6E7*rI zn6Z_SIQb%hLE`i+a%GxwPTV==^7M>L3|4yNc%FV4(>A5f!%J_}AHVu*yj@7vfGH_<)Hsh33CWRlLrkYlx7`g2 zGDbg7f1^Za>Fh|l)7Y8r+LgQ3Ns7yS@v$}zZWe&0mZjQ>)y@2<`IBq0w;zQ1!rWRc z@1tO6KDU-U{j99T!afQ9VPM4>12ls147`m|JId8&A3qB2Ce@4;SyxpS zITtvN+@6&&a;|T=YR2_ZDg7tQ)HgSCl}?_d4|HW-pOEa0bj@x5NzfQ;_kuvm_f}d~ zuh+5PTdJZ*70QI7p{Hh4d0b1SoN{GZp9MS3WpI$|lVi7?Z__&Lh01Z)l@)+P`w|?~ zqc7q*EpVQGCr{-tc9SV5?E@U&UiNgY22Xi=`uce`wsK=N|AO`!;GhL$fBx>U@=L?| zsj>~-Sl7ScsvvOCEL^9m$>r?LLwAr4^gN=hvm48S4(%Xt(3G1#AY!iB>H;^p7H?!f zV-<>Z#{ukl*X*XM_StUiDaoz^2iBu>)1mE$->lf+Hpx=jg!g5I($30gL3o{=U#j(< zb6XsQ-1f2C;-2CVA*Al&1EPL zLFF*3$E*ct_k#k`zJAD%ZXeDa#akk`ECLiPCFz%XE&0%N_SHoyC8ZvVB-zE_AQxZh zUUk;qCsnZs+ugNerekrG(UHo+5g%Z~ff1qPR*BF8Q(|Q&jf^ zT~Ev9cjn7`?t5cbT@^9+W6tGJU0uBR5XYjS1%)H8dk;`KT7g2r(tkR?WlnaiSmV7-MQ=lyhU=iiT4#LJjwyC^WUpN%Vek(6J3)Pyiw|F)`6e!O* z=1p0sBU-O%$}DYgZPb)SRlv1nQx<_|O`oRnJacKI)1Cc(o6#%Ym{1{XG`cC9M-pE* zWuu&N&2GvHD&m^kloeNnr>M@S-X6G6!eXAlBYoj1&Tc z*u3hZoq1r8^kFLfY!J&Q`tu-`URi8K^gLV9r-ZJQmppUZ^(+v)gISIR^mGYkH7&}h zN2ZtP|64tZFW9I`V%Xn|RGP_(D~SzDEKw|A1yu}7D9!R=;TB>;uJ&(r^R~!sEzMj~ z-IM0{w+7I_56zjUwP>fYZXtJ;{j}aKYnVo2=wkVkR$$&)by~2A;1q&euzlzx{Z1=! z**{jR?|<2hRwZU7wq%+rVh7E^mU05Wv2%^HSqskXrRCHU`-S)d(2`|WLG}FlkABmy zj(0b2lYzEqd|JyRtkJivPdDx{d#W6|Gzsek9(TSg55VV;M4FR+(xKROv<+J?8SX>d z9D2h=^AVi19!8k1q52`R(NLZc?i-v0xj%4a=`C`Ur7t zGVEa5_%_VJPHbg94FcGxN`Kde4YLy?%kyWJZYPG7dU6o%w#6UL(UF15uk9g|+D=|o zNX9|XbF|Q`JqvO`jl9$O_~1>_>(Y{@{QvFBCGDBD239N9YIe4l*T?(cIz|`|sAD5{ zA^d9e-#hzcd$xsi^4SfYe@mlwVo7J~dysqXzuUxp%WKl}aY;>_kJrHaMi~O7=1(4z z|2I15f3R5ncefiDW8L|j5u23gF(h_W%(#4ZH{wuMmNaIhxpzFpm$$;Z z16~}Y4Q2h0Cf4+6#Rt2>#V%rXO(0F(=S<~fz3ZKI!xs(Q-VpG%`F@>eT*D-pA;2?`HGd#f7s0~LP7Ik#RB5fS)Q?P9kTg6_42SkOvqGeFTZ8y3^!ygy}(cn1AWpNp>DS+!dEK8aE0>4 z7~}R`US79WDQTTqCz4$R4$92q*9HGLdBWorD#u1p=w)U?(ZFJhDH~U*l!KjF7GyOS z6^{2ao7YY~zcg9pc-)y4kapv6*$*4{Mm<_Rc}R-NVFwB&NgBs@Gw=FZ{iag9!dcBa zkZlhR%Ef+N^|_$my}N5nq*Mj#l+h4{a`C%i^A0R~7_3qzhqD89Vc80BP`1`~)S6bG zhnw6`IrfLM9B3D=g|m3#dzHAQ3jsOR(zpqDSOs;0W4%=P`dS6Ow|1O(K ziy&6!asAkJ$ZEdsC%>T{PV01g^v%7Ikfj_5Z}$uPG3$Crg|qsxpnBpc0nc0Np?}Kv z&;6yIC>U$%_Lr-j->C2GI=h<%Rx_@G5(-(L{>*wRScChs&-KwrE{bc126&E&Wa$lH zcwD4hd4r3q6V49*E<$RW^yOsy0QsH2u<+pW%|81BDF}W1DUqHvfSo4UY=z@~M$(Iw zA+PtU96J=sp}X@pRIT3TjY>H@fN2_{(HFo$X^2;g%mKOOtnlv~bM5yBuyAl_-zyw5 zOtuUgP`Sxim7`LWEL*;EaDyL>7v-xI=O~so1L*>|_P>#J$cbd4S z$3m5o7sW=A>_u=;|1=z4-R$L&xGU0j=en* z84Y6DEIez%V&y4j_g_UX%pFd+nHXbRNeat>u`CZ9+DQt>Z$5kfn*E}evC6R=6q;hn zC7l~Q;`B@OE|=XK%Pbo~_9{4>z!6Y9p|hp+^s_3*J5aE_lsxxCl^>}T$2b-N zSxs=9to>edxAK3sY;{!Sh=^nJNc%)^I73I{x?2N$J`}*qy#6duTtIOfGBt9_wP(Mo zl>Kq6kYukZ+PfDXTsi&KBnOq_9VqsY4KeF7Bw@z!!78Q7aMsWZmNgnKXG@d6STX$Z zM)M9TN4w!H3LM%PaL^0*jD%%%Z_H>{N#&Rf3fbJ^fa_}4RrtwaiOnYyS!fH$-bs|} zA95w+yB;0^n1%v8{iOZ6kD!q3vHa7I9Ks_#Rf;Bw#W%+k5}L&FLq)sbE=ls1)A=p>H_$<$Ad~x~E__g*GbvF_-mBX8GQTt|7@8K2R|hjI=A)ce=~?z}>HZ zmKnA9c03IfGOUUB7u_8u-6ZAoQ5iGo>SWdlvYK(qd>I@m?7Q%+{7r>Ji;um@tXvb( zhwbt~K7Krz75HGs;Q|!WTrg+lcRfCRb*2Z{;WKLKgJf3I7m@!enFaV_E6gl~<IF+x}1dHBfC6( z8V?RE0yLGUq_CRszc4L@9q>c`ax#Tk_(S)#6c*|ahunpvIV1xzJQleesY1HFu#XEX zpD8-?Ebnh@^Zj7zDcY9s$I%j5mg~^`T}P^->S*jc4_> zu;S_j7D>-{C$OLWX?4t|Fn&DruTi_6Gf5ki-L!wF=Yugwa zW~Z@<^bB8SG#2Z-)=XF48*n9$L?3qfxy=%L?EJy|*cHdxlEywO8gLz=v7Ib$rH0zv zT+-xVd8$*{3K%|_r3b+OIa6e-IyE}H%KpTWYLYI=s?Af_X>jnRT4n*e#PM2fyT*Z3>CoJ?h1Wq)XHbL7bvvYx@UW%_w zAz=nvg*f|%?oOS-iiu;{H?q#nF1=U1pZ1q4bW${<`5V4r!A()C_FLIOk1d?-D^7Ov z0f+JpqV-Ic(DWZ`fwS|PVsMAdVnt2G?wWG5WnJDOYuqMIsq7%>q7zLc*(ccI3bHbk?;8RQDY*rW~);E{!nUWzcdpaG?&N9ectEb zQ`4-%Cv>2KItOe@q-w6sm0v|>4qmi#-__$Z*p=ky@m%H=3@b27+Xtg_KFnpQbd{4P zJ0W=<%LiSvcb+`sne_JQeyZFinrf79FO}wJgg^lQx~X3Xg8uJSQB4?UMu!)$tPoUX zxsd$;2~ERAvY(Ik@p@xE>xa2eNgrL%tK7eQxGPh)rtC?T0>OU~8$lC;(i1}0MJy*& zov_WhNAD!Er=hS`ujdqgY=@Sf=u71E_*rpt%#GYkPE^eNHzk@fSB=KhaM|p?nIUvZ zVnHpjQ|iH_Uy7#ZF&2qu?P)yID-Nq2((vl2X7-W`rCIGBD3qx@Y2L55f9Gm}62+Hx zjXp89r6pWovxMD(4w`%3<2gKFi9E=(c z3A1aBo$8+;NnaZpFJ&ECLsQ$O^1L;77>r@ z>P%Kl&)YMZd0S{cn8||M;`w4G3ndc^Gg)d3u0@$_7L}_f%3f!(Jd|jSm&tW$JB)AO zx#Ag8Ak1lv4s`2)57Y#EOMsh1LZV3x-Mh4#)vk7xb+8<6__Th?%Y0lTmCS` zR777ZP{_XlHY0Z%;S50OIDHPOyav3XxtmcMdN3liqxMAnscT_owma&>0afr^}NGCSD zVz7|4&0@vTs9$lvb_v{G5%pKR@@jGKA1Zz+>5%qchc1^F#l2%6b-5h&DMZnZaf~=i z?~3|sXUnoifv-|lwV63Vt)FZ61PA%UX3kib&sR>-M`>Ex(1yjJ(3<}!dYfspq;>e( z#@n5p%~El;PqQ5y6vbkXG2hMhX$*Tp_OqR!?`1s=G&0N5%tvg=kwqT5;Fr!uVs^;u zftK)5$j>9@R%RA7D&;|CV~S2uV!K48zNo&+wo5aHAVR#1xNb05heIbnp7?r@Xk#XA zLV!a3t>aJ0IAx&ofm|4lMMJ+9Zt$OL*tTBi)PFr{sR>^zr{W2pH^2Yw_gQXIw@Y8x z_zWT&Ds?|^q+)}h;{?fKZjO#$rEF6)Lalj14 zw-}Mi#H~4qIff=xyJ^Rk9_YRCj?yp;RGljLERUjjJrQjEH?z=KT-BnkD z1T)9rEO4t{=o$n<6yi*nn8`dN;ZpxQaEJE4)lWr_l~?;*lE^pmN$)4&dgic zq4Nd$2Bu`?KW=7Ty`lRUIOwJEVWmN}6Rt#kRGUS%M<77ZLatWv3Z^Wj0zpwDHS}MZ zKWt$+ePxaE3auNwG(BYXK^yo<=qg)TK_9G)iZ__1FI?lem30^ZCcACy^axzJ|G0&6 z6(x?K$$fxHG3Chc}?Sr@T`JjSro;IWMiLr6P+Qs&wvTRr<+Nk8T+ z3*%`s^2!^_m@}n9JXs1f6nHEr8smo#DxN{{zTu+*eaw?*d4kp$_{9ODQkmQgo`cZ1#D4EqtW<6y-Mi}s++hLa+D92hIJd-;&xRVrj(u$@`=QL>S);Sa?%>;O$>RvZSrRE zciYP?yx<)+Q<)4f)|7t!n?k($*_!zA5ylrH<)x4)JV10>$zz2tiFz#5@rDyuF03Tf z{v`=D&sX^Z%O`if0P}KQD<5utBQf0cOrX9{5}lG2;|E19?t_tmdi zE|(VAe<0~(#!`E@(@VNu-yELQa-GV$u6cA&PW4yEr6iC0+^>c-Qt`V|FQc~yGZN7* zA&)sE;w#0x2S~!KT#O3AnPb|KTML%Wo-B#*Gu_C9wM(~X-p4{>n{Fi*KM)e0$)`jUH%$>> ze&bPp&tF*hcm%)@{DWrIupSL)o0C7a`Vo3l#fCiX>x>75wzDkP=dbO;ZVZ$H+n;vU zuKvQZA**=~4*L9OW7)3npkbGqfCFdcDcf%LD?2wHJLiSJ${x+IPH*npe_LxwJNDqb zjhY=}&J$37+hg)V_eaqlhdk#`XC)5l2<9vt2&e+>u|EZE@GCd+9(}_0#_1z3qwE1} z6v>u#>_Fx?tjKCR&cYsyJgmz4MX}(C)GCET_t=3f8=+9HO&JpAopJS$DjOfgW}$RQ?=JB$C4d+Ey^Wf)d)S|L`00OBd@0n_QBEyA!VTmRacEWn6!U<+Nvw zNb&UXGwKZr4g0W7e{Iz4Y+0cx_$?h1!;*-pW6mX3 z01oY1aL}7!_SV7?@1uIGRXO%6l;`a__1|O>GDW3ayu@lwg6vap*h995#lvYaea5#@ zIm|B0``jZtX)PuvcEm{?Ua!k#HUhGmrr@CS7|qY!Jd)LK-8hw__hps?4x#rYwr7&) zqt*YZk$e)?2Z`+H8*=!sKDlJvinw#Jf^lj9J}lsUw{CwHG#Ryg2M+R3h0#I3JnE8( zbLFX+^t3ny299`ewDsvPbEN*5oOmqYB7FviZ)x6}UMRnGjHvgrLW4RVnP5B)CG_oT z39d9DKJ9VG#(Ig>5u&gHXcNX2=02J%nwNDz>?(w4p3^xXR(~pT5BWftO&}&~!)L<& ze)NL&&CrcTS7X^0oHr};)DQv=v4C?$x4@w->lBU5QP#;HnSzr)p3@*(*0~~?V{a^y zXf*44Hqgwv)&Cqp8TllDC^XY zEQ_;HpGkXJXOd(NoDK5%TJ%ZleNR54GykWB`%WdcF*7OY$FZQ$i6>X@E}kv>?wPAn zGC`>WirwQ+se z!8H7daa^7%TYLJM)z;t4C74iEQvB9G-XldiSj&Yyu3V;CS(a*_CiInO}<%>f6sJoTFcfBf;| zTWKuI9GgL*8RB@k2Gc60pTSu+E_?I|8%46Wz(I|%_c+&W!=7b(R1W&bMM@x`T4TKmNG4O)i>hR@}|C?Nkhl8O$)@DCP^`4lbG>Bu_~LiKy+dE7l_r^)(v8L zqE=#-3q=Q3VS`wOt)447vYZVl!=taFAz~%A%q2?rYOx#}xKeCrCFu^O!jRei8W+X zV-rV?9vC|!CN7cf%o1y|Rdyzh%xk$A$zElN&14N-v*8ula#EO^Ay&aZPjMnc3}iQ! zi7klTjP=bDo3IPZCDQ%nVhnT268&;TCSEmRl6y{<)>3|jXe}$%%8zO5 z;P27v#oBf{-bsv4h)s&|fIDJG4Q0*Oi|*{xx9Fy8>%{6MS}d5^Ds+=%DYVorxwBwS z>){Sgu%Iq>s-mNQXhL-Su-HL5UhBCQeX9x_gnVTkf%t@&_~-<-(#}L9w{Fo|(biIj z0fEI_Tx6;_%U&&7=xCd>Ks3wPDB4!i5deP;7ZYb$TLHA`@V6;xC7NZyVmFA@opeM; z#w04CLw6nsf`n+DrWC9eO<1Qj2xYYoQ6_ocnYCG1+VJT3c=pXgM8boGq7^e+B-Ub0 z7Ku@8>mqc}g&d5OdyB+BbX3h-ESj^nE5wGS%gV8w(q-v6h!Ts%usnNMEY|SO zRuwE>!y`*AyHdK$c5Nx2TC9^pSn_F=ApBGvN5W{T2^|wNaA}nn@=~!jO$jye7uUbkn$)H_z#3D<{3T-T8l@W!J+cQpq#yOO+q*;;2VFmbLGl;q z*!*C|eN0?f=fNiBXri%Zzt0g}nRX*;(#o}lY!b`mrfw9U*0YuV4Knh3LQFJ#n-GIZ za!@SGnTtNpJ0q5JQA$QgttrKXBGl*04%INJ#SYBHj=n!TyGeBM=D*>ARs0rS#JMu5 zeC^)sd9sr`UJ2Y4-wXAqZzw9$RsZJ<3+J^`||M#qvJhLL2f%|la21o a|DyN{OK)dlmiw-)Ns&Wt&%q{rZT}bE19eaU delta 63917 zcmeFad0b8F-#)(E+O#8tC{r?K2$_nq36T;qmN|){PzjkTL^5W{Z6UzJgdmh$(-)m_vvt|_A`oVHe?dtWu zw~lMn?$qLq9-E{VufJ@a_{FP5yX7Kdy7lCD^A>N?Rv2Td;b(thcUx_T?TMq0L=O)h z9b9{GgeJbAMq{hd#5~q(G#21hU~};CLK+Q%Vj{ysxf7MpGQZ6tFe;M-h#t7Brr1=g4pH29l>S5H&AURbb@aKF0Zmq<)do&OC)APGQn2h zG%y>uP37}yycO_^MI&Gq4e)rdC3rU?z>L|Xa)_$;RM}JI#wwQvvxSAg?13Lh#~ym8 z@**&PVmjj&^REhKh3rik86?eC?xGSJPZya`}?un*V)Tn$_UYy!qlbWCOyjix$;tzbq>03#qK0E{wX znyP*YFypk!?|?bQj)KdA*MV7~S!#F~xE!Zg7umqnQP~b$ z5)mt-1DT<*XLRt{vbznH3{QeNm9C=aSkPfG2cVCWIzWw-@b%EygS{Io4RdLt^mrL? z1x_(n1lWNWyJ$2O!DGP~q!<(Eta-Mx(xNCZM|L2XLsbsptk5O+*5JKh7PJb?2Fz4B zzL^p}TxBOPr(zFqG$S5tu3TiL-INyV!Ise75rHl0f{fS`b4`?t$F)!@HWoe$9MMwo z{lJ_%t--9|iB`&0-O^nta0h%|%*(;dw@z#HKc;g`JOpOsf`qtWWBMRtUfomMC@r?~ zPzv}HKF9C@*aqyOR;VeM>F%~w3aa6$RNx|fUVO*FTpf0+ya|l!F(y1P+CN}~LvX}w zFXiGeMMkXQ2dr&OxV4?a5kdap!=bh9pbSxUFo(z-YzuzTUYP?IRNktx1ZG1j=W)J-3t#t7dl`pBhPvtdWcHJD6$ALK~f>iFJa!W9WFuj}70B88@ zp@_iHk%8eFO~9~_VIWP5Yu%Nusp+e9-FPq~+JV_crx9)eUW%UJn6CCy)++&~p5Q0- zFe@Kz(^H9V3?4WjnAvNF4~rNP5D}pn+e?Wa24=QH{f7<<9-z?#M)Z#i4jG_{>8o@| zFqr+&8O*8KROME`%vZKo7!E9$i zl|T1Z{KqO^0rOfos`3_@v5YKLh3P7X4+{y2#GH|Wm8mikTn-6)fH@VKgE<8%sk%9s zbNWS)I+ax31h#`d6U-?Ws&WT4ycW0;F0dGL7+gM{4^rmjIh8kq%R`?FX2B7v-d*)w z!MtiQl1z~avbW*$QW+2!I2>1yW-5GMG84dhaL!1@ z_a3F>*9=@3dN{&)Eqa5oq{jqDI1CCI)?agYv>Y!wrUe2x1A_+*9Tpy_(KxC8z~G?+ z9MGd5qm=OHDi3!E85ZC_0<{PU4hH>mN9GiC@bbG77JEP>0(?>4iG9sm^@vX)B#{#1+~D| z;8tK;a0M_c@awEA1)XD5XqM8D{^9-sfhcT>>YoD_MtJ$zO1#j(@Iis~)X5f&fWKxc zEg$F~F(M4T5gr&B5j-$TQ*4gX6IZ}2*fvoa#20FO;{t1e22?=!A4tp=2Fz9b)?h9J zx1qBk#vW)2ofYP+mtI&@j!v1ctb`qeGWPEmDl2-2MM{AKhlM)?`UeCpU!a7aLp*lz z(8bCec!cX4zZ7`2 z%5&B5(O^!xvWUk54X6k+{H9i{AHuESdx5!ixq=xF7k+r)puo{J;WK`4gnxLrf0V`w zen}q8{#vO7bYG=R8Z!iNa=k~!+(S-++2UPbwqygCLox@<0w#eOKMKtF0bs^&2WCT> zf*J43TBU(C;j_U7z*d|C@6Zy~_yL#&q=LCpE(BYH=U|9zz{cCHiz!M)4}%&1*W0g( z8!V;5@QeA{)YZ%OSA|m1vcJx4M4_h$!0LS%-F(T=ZJA`sP}O(|EIa| z>rmvG8_|C|IgE26J5}k*&fAnOdj)2TJ8oAh*jin6HaE-<|bT<&6J$nqy z1{#MT6+Ro*ZUOqA0l!W@@ru#k~~8vP+<0sC=K>9Mz9US%UOr#NY& z2f!!>qZ^n3ZPfr{gi1%0$#w=@9N`&BO1!FwNB_W4CH;V50VBeLhXxjg&Pn?T@z}HX z!1O0$al`cU8#Cjf)7WLk!>aN0Ydo|X&zvC`OOC1QRb|$XyQXY5{lQ$K zJyfm(=E7A{icopj}$9yk@lHfJq65xekUKO*!oCDRsR^VPJSib(j49Agw zMAYy=jR8I^%04a;o_CXe^(hQLOO@t)9iBV~l5G<5}5ww%(6=a_)QHR@zth zv2r{q3a$YC-6Q2ZlL6+jWiuFUi%A4?_YVi#g4==lu%iYTT@zytX8Oj+*OGhS;NTHx zt41?3N9o`Z{=@zIhXiWsKT|5u5*^77fA(A%!HeKB@V9|k&|EMx90@K9?hWS1H&?@} zfEm9am^0)L{Ug??+`-Q?+(AKrVapDtXqy;X_M7FWE=Hu+fj^wZhq z)#l`+Jn@^b@J^(ZSt>qy-L#j1RsHSTG-|r2L*$l$nV$+a-%;ALeAdDs^Hv2$6}Z-~ z*R`G>C-3xW-L;3`(pghl?bl^xMOAWX)He37$IFj6)y>H^@BSm@kK)BckDs3#a(UqB z6Q}MTKKIl#xPjf5h`>MhraRf6t9sec^y`*pT{eww5iv6B*sbd;YUtJ-ept3ZdMl}v zjh%Hs$6MQ$&FJ%da@)uezdeuqEv?5Ln+n$~MoG?`#6O?UD6ixKw^O>X{IMc;Ea z9m3;$`-dHUSte{=Mc;eV9!tY*tfR*)HSb%;>tMjLN@Ze;glvdv@x9ii)w>=(81?qL zQ;{ZJch&MMXj$>&u)ARaHQpT?<6>2z#^8s8C%SfNS}1Dsvk_^I;ROqfYqRZfwAb7G zuBUB3Zkl(ZRLr^iotq9E`SQoTOLy13TI48Zt45A?)xalV{3Tw)1J3J z1&!Txd;4pf>iO(Tey`|$c*~Vpg*IHe)Wmd2kbRTw&Lg|_Iyf_A&TF&PYh7#a&2qf| zDIr{{U~j$Mqgc4zxN+M=bcs#wNW>U^&8#}S1JMoEd=-_!^yAkFJ+FC96nFNABX z5k|KFW|XOv*tzCh2Q!Ox1vQ#}KZ*VIg)paFf6@@KCB%P8eF38LFEOz-aPbY)E2{yA9NMIuQG;-1}g@?rAZuBZW%0J>Aa(h{v)h*a{R;?Cw&Vn zEOlkivW}BJ99~Bytf7?RW_(ZNaUU0m{PfS3@Q{}R*UImCbIraC1g^F{`X;1Wu+ej1fk5LuO<#K(UZ z(-sTxzYI%Ph`oMIo(j?TS5c4kot^qqK`kM6`BfBuCqDmGlwz9e3t-1}u zXAzMj^i$!buoZdyD)#+5aUH~;%fU3wg4p`kI?lU z^1>-s`frl^|DCwz@5G$H6CJP^|I6eFh4|~-v)Bmnr%P0>=dU8`S*fgYjpcT-)V!s> z5X7I`zF*e4Vii6b9ey$H99)$QW zW$UqV{#3RUvrumak(Y~3@^N<3CfQ2nZ45e-3L1^OWYNY&+pB_<0AU$~X0mXnf@JPt z&=#?iJV8-*QUd6tosh`SJ7Uhag(h8SU$3~1D3aJnN-JvWZCkBrDy_H2U&ZP8(OD^M&l)G zV{)xDSbnlrzNRrnD6Aopx2LNqj7VvwS2L4ga+CwLG@3z@g}1Az1D-y~(i~VrWb02@ z2t;lB*TxN+Y@LOrX!YtCQ!Iz2q%cQsC{`paCBFx-(4)wuL_K3${9$#MwLP#p%T~eq z#@hCPrL=h+tgdqCU%8e~1EaPURvU)uU&3mJuFof78Q0coD0y}^XhR!H37rkPuMJtk zOfOecT(e%1cSl!~Mv`Y2gU-r{o$TGkMHddM4K3|nC&|34L2KqLd3H7EQX6YDgSlhq zdo@w!qr8mk55Vgqk2JO+*V2u~~d zAbF*xQbKowKDeneyRqpxI_WmS>m|+X?xNKjBu`(1zPllJqe7Zh1}WXwpnD0?Q}XWW zqF;g5x6du^)lZ%)Rtr>Et;$GvZREmH747-vl4lQtzLuNPf0(*mowP&Tr1TyJ-Fk=~ z(#&42W-xf=$ZgTqYau1{H0T#VQJaK~?NtlOyq7^gr=?M3Bc8zPB3blw(Ko?$%j%)U zxHNR`%3`H7)dyZHY33$Z6L%@0w?TggK6e3JINhD}&RCL_%418`hPReH`xx|ZAfoB0 z5Dp01+HIutJ_g-lw5pACzK@H}5i3-8$-A42E*@4Vxdu03vCri;=xVf;ubW;j`bb#L z&`pfW|!^5dyu#>Ks z7d&ZZjElCDmz2K8pk3l6neR2|e}~R~G?jd|I-6nDQl~7YM0a@1&WsaSe>ktF)p<+l z{SEpdsKX#cK?^#gM0f$YUPCm^Ki8WNuWzpR;U}+)Pu{TY@OtOQEQ)ULnd=S7>*-Fy z!;z`Ki>`cUjw-EiSe<0+1gws-Rica08jx%4$hAzn%11Dy?UZY+fYnY;`y$tJ#>`T* z$*@{8RDT1OI_PMBsqTs=_rJD(cgZ~1pq~%19vXmyE2d5sJPwM9Wa;UoZ;YiGvk`VfLvpPhxz=B~ zR;vNVcr#$Nmh-!uYgq>xwLZDlYFMr0c-gsDt${{uc&@cWwk#r=NrfU^b=!k6{UwV? zY%zl|g=K3PENp|&PQ$_`0;}8*W9VpD*mj_ug@r8{mVJoPih~s(YuT`roZE&Ptqri0 z6a|LLn<3H;g%v2LxB{!MY}FfPv=U(<#TZvp7)qtu3^xX@g{5deU}0B`bkTMTlM==l zw25I-I%r(DWIooQO$(PiK`TZ`2_Su>ls?v=ZyBjf53Jm^opjOkB#Y&)W-vGfH9URj zpTooY$Jy)Tq_00xIldyv0cTS<7?|2F`Yo_HC9#KM?fwi8TVgjCefLqu5^z=MBzUcO z>!iItN=leu(3cvGfB8T%TxGauron3jPnp+e;BoFM=ObN|a>=4jxY%04Yk)8vmrVUA zH7vh;leZHdbJ5A$xycwQA;zF@HbzOFUtS`|!{b#YN73(u#{~K0)%c?t6Ai@L++eKI zcx7pw0*_U~N{#*G*jUMPqCxi!qCv8#^lmi_OAZc@FULs< zlMH%?@k)MJC2+$T46h*)m~%Ar>)>(M!*Uerr2hb~2|T&M+D;Rs^vMQo+yu!y&Y<5j zL0PKID}7>RjMqUBPZLJz6rKf`bNxTF40XK&^7%$y=5@wvA$x8l%Utk4%Ht z0x{)dk^U?^b{RZu!ewHWwNkmQ_RjT~E?V_aag>k_uNBf^i|p*AD?AaousZtIuvoGw zo35QaQ8J%q&}Tv9up%iYp4BAd+Q;tnhSw2c%A{NhuNORJ1^+Th@=P%3noZVdTqFx8 z7yTGmZgOOwdQSTN@Vdg2XPLHWoa8y(pzR(fC4ds+q;$}=ILUm5L0fnVuM&OBDN2v# zlNaoj@Hi4m)4#)0Cn@L0)Z98^0*AnBF2`iwr_qxetBY5X(5x!haW2WMd^nw=ycKA?rcl6y$ITaprl zL8qCA>dNa}6Ig5_Dvquh3a=SF%vXOW{U&%E$)fUg_y}GPcxVc?<%vm>`9gy}d%p3A zi*{>!2q|HqL1((ic%JM7i(QR*660(JhgTdXJhuMZi=>1_27T$p7&18q9!lxs;qfX! z)6tEO;Gx=%E;`R8JX?7$b2Ww0L^?muMXz6~^f*qvTtDG?GL5dt zGOldQ&>L1e`N~=di+ztG{hf4o;i32NEUdwDW6LnUx&(MQf+6Mauy8MeIaY6lv2k1_ zM#EFew7ltT2FIXe>fof)By*}FiPkq+N?&f!ZGeDn22beTz+#^$M=tx7#yq&vgu~;7 zsSNr0m6Ca~L2t22i6Splx*_nCQ`UZ1Ef5)7jjxmL8$4IJx{X)Mhawa;6BfHjUaCI~~bJ!7?xd{Z3ds z7@%S}ML&kuB)80(zbSo!FkJ3o@YMdA=xho{nI#1_DedG!=xho{?kW9jSn34CJiY<1 z1ys;avL59d)tO+_u_N4))E;d)1|OJKE=+lb3X`#n`M-)ztY zZsY9c2!4l!bp$=yW4p2vas-{ta-9rJ%**f^AP;45^Y6&(HG$`<^eCz_5*`kgn_cv0 zV0AOZiiv zAfN-WSoMU}m^jWajM63kUo%Bve zj8_n^k0^K@<=lB+e;XeD0RdI1aa7p~v4vvbhQezvPo@j7Ff7Qm^f9Fyl?Hc$=d08b z{}8bOUN>nbu1n2vxp8B$P9B%c4`LXPOP&V}dcz6j+QT_vkCT2DJg#F(8-It_R<1AV zq;*V_JP#SPQks--$e_QNmb(h$#?<1ZWPaG7b3Z9RSUc>Zn+FRI)?j7jTD4D6JAd5O zR5loR8kUzFt@vsAIV7}Rxz?Io>s7AhbjBDjCf7QXYZXg3hW3PoCw9nhWv-QzYt=n# z3>^gvk7W_>K(1wS&ZxCETH5L7r1TR8{RIdfa+f4da?;wKmps!9x^Cw=!ro~vx<#C46x{b1o%9Qkd4rNny&ONnQ=V$`O!Qo|J0}>ep1Ia`SeSm$^w*76UszpaZF{a&Ad}Z6vM|-^-jEV57_>n*r1T58ow=c0M8%~HUnlKXg!vov4R0E6t&l)B1fDy0 z0`1nDQo==p_Q_2t9aQ6%WPS<%q;^a41f|}R5 z!reWrvJZ{9jD>|Km6u#}$6#T>gXQxW>zHiqhBZL8$~?hCXW1GHO9{<_g-6mz;q_Er zB4MS#>Mv^rv+)<7N(xv(vh@&_oS(K$4!cpmFGo27;FN{6_!+#m7)Km(aS$>*%RPaG zI%!8dlRR%4wA-Ia2{#Qo?F%+#=1t5cSbb${AFKe`D)*Az#n36R{AKGYEc7z87O#x) z*1%HIn!aXdGSnYdcUszWulWzUTJtwj!ku@~3ILM;hQ|R6 zp8}Wy2>?H29WWbU_#A+r|BM+w34dUt$q!>Oz=TUwUaImka6TXz;O9SM##=4N`g>;n zYt(Qu>p71u&N&g zGoNEDpT=>3U2+;=hFGv=KBqDkOWD5!W_&DcGGpPAhXU)3To6_T*~j%LhvOQQ)7=NN zArAo#9j3D!?wzd~n4)q3rjs1;jjF!|vtl0sCj6@McQ8L>hUY`A@=FKr+eWi`1@Viq zi-605Yf}7$Db>O+Hn%poG?-r{q289iRHo^v>Ru|hQ`uYP_9}NU!NY0TnvSaAqjD#e zJFDD9<*sCDd{%c8bE(_|rSe17uwg0>S2;}OaFrv#?9-88e#mU}7&V+<%wfzCu@fR)%KhXr!kr^bZ5rvv?5m*m>mFllm!`G|40n9PjqK0n+^FyY-8_dh>Aea^4 zcckd2feVALfLX!c`BaR?4G8>@>E8x3;aycH)4YdYEZ`BC@t%SUg5QA|{||6+Z~-{< z_4vgFrKrlKz-(|C29l#;Fr)HnKt(lx%!pON$Wv1d%!2BHOM*SX7T~U6GjMM(el&gY zs~9*8TnZcyX8LIi{2PwW8^DUpP$T{wGkmrhPPT!+UiJT*T=J(3Skn|_Xd+oWt|PBh zo9RK_q83A@zg6W_mA9$99n4Q&rnD2k$h+~2>G#n2g{kj_&VE0rRaZ(F^5^fE9eq&^ zC)3POeKIq=3}(MwQ}w@NE(EXD@c&@B{eKsL*ngYge^}?#L~g1TTXBaKv@%rSOSeX>@v$aeCBsBu-*yv*25RsHXn;Rfac zZmz~7Q+Fdvq1mORCD~?njL}*RX`{yciKR{1wkG+cJK46pOf~HghiTfYX*w{C^ewv- z;yC1#k|$diHLNSc@F6ozcUAXQbuw$@2j<1nTlM>>;r|VemJ8~qW1btVpQplbLRq>XR8hT=oBs85EIEz1Skuh-79IsrqCtzcFC8crut7$Eo3D#-FO{ z@hVSKIRVUlV>X!a5>*cEm3h&;%mXw*Q@Es^f##d8<_F7fE$4ygE<*rm}0YKMlT`YNAp(Y4`9~x zE0_ttsZ0^3#uUr~@~dp7vN@Rf6$EomSc2ITHemKZRWQ@n05g3poqGM(g1}E+W=0Os z$+cCkqb77z{d!;)6qttQ`rS5vdi%bYRx(AkkS!1QaX@yPURfjLPW!Q3I6 zf?3_>V1Dv45B!}}Jr65WB#$5`{Qtt|D%~r8OSwE4{}(KEeQztD`1`53B9Q%xwqN75KeBDk z{wX$>XMIh4v*AReJ??ePye~%B%xFGw=6L>vKBy#KvU)z- z9b)aOovswutkH=aXSa_Vs`o8<<59o$(fw)`i0$rNyZiJXPIVuc^)EaiT5^4UvBjhC zc2g|o{U=dGq7NfEPCXVg@x!9$d80tZUD9)N8EK9O&(QYth+`t?!DZ#Z9cm_);cb zCgsGLQYPJnZwV6%;b0BHRzz7tFtdVihk~7`ZUbQtg_$-GDv28uf=WVYS{gzXF|9NN z>rxP2Qm7^xmw|Aa!qPGjs*4;7qpcx$mxWMMEG!Gb-Uh-q3Jzkg6@*L*Ramh)!m=cU z_|hg8?N%S3P-pG@i66=wv-GI*rgPbKyF5$gZ@S#>lfG;Iur~Fsm928rt8Q<%yS-i= zsJbn%R7#TtAvq-*wBPu&@Q0pHFSL!z(~*uMwFI(tE`xFcOPF|h*U#ItPPd-s432o* zzv!g>D>_*mYI}3i&6kH7oG-e|(lwyonFp6oWzP8it;ti@HTv@};#2lGZ7G)u-Z{S3SS#;(dOK{0c(6 zrdL{7@OqTpw)2OyuQ{jm zoewX5oc;4eQ&*eM`8uw?=a&-LsL#cTIn4vtri5l%#ngV6U@w}M!)&khCir;uJqK@Z zvzRq>cptNd1u-RBrk zr{a@^NPFkmk~#*m7ADw^JKw3z2;ph|Lu9k zc8gPk+t?JzXq(Y9d$@c4mtps2FKd7A`To<>+vh8%4;C+3y-U^Jyjj$7%IVa#2m1G4 zFuHcL*eB6WHQL+mxKb+SLfFnF-*TX}L^ng7-!fe}o z8tR^>dicBb+>dEaro$A6jeA@DNP70#Gqq*Q{nzJs6giAYXxyb%fvij2-NK_64lk1Z z=y#`iuO7v(_qdgobH35ps+O0=dM#R$Shs6ti_YbmIejrK{NrKa^67W0h>d4%1}J}* zsjRe3b1R3n!mZBT9?KsbI@c$9T#wb)ryP^6zxw*jt-$(E8ADG^Ykc8s&isg0sXroZ zcCWUsoVx$@iZTPd4sWov@-N!_$*%aWvonedZ(CF^y>`ErY(jYSGZ@`t6W2wOj6cHYZQ- zHOpJQE{k5i%o*b{rES~b^3H*8HW%v=zo%hG>ox^OJ$xAGlQk`j*p$g5F7&AVvEIoUUmMig ztzT_+AmjM8T_-0U`;Z+!V(id49wnkCyc#vDZ{eAS8Luv;Je%-p|Lo<~d8+4@w|WH* z7u|Sa_3pNg%dba31>-*k+-Yal-N&KL0?Q>=wb?VWeW&c70 zyz>3Nz3+fUSNt6=z4dERX7R}WK7qq+D?OzJ^r!?oANzHIcd;_hzT<=yl4UbP}`p6=;0 z(DjCAu~Kzfzisj^_RHw}cF*69b#A@$?a07dmy#=VTa^`H^LtiAct#jZ-^qJZCe=v1!N4qoUe|9D6vdVetd!uKd>G zuW}c6#vK<2S-p90+EqJ$W?5p_ITR0eZM76)SES^MDjUOmT}#)V z{@0tEb8JUnI}?<1Wp|$@W|f94S@F26%`&mK?6lgWtaqLG^YV`)eK+145#!_dwAIB& zBD4~!x1g>0nS!tD?J8ApOphsVzxWn2-?iWEdF0Bp(%-J;bFXyZdXcPRWmZ(r85>r& z;=o=FiX16=UfMCg%jt;|y44Q1+@JT#^~zhle$!8lO#1zE{_5}E{L#qc%%a_cx{SC{ zqgspQ-v(xN{XigJ}v zy#rUHUz@$1b>YR~>nB&F6gbl%a)9Rhi?-*=me^Zrc#>W9_7!@0O}{&{;hfm_JxbW! zsQ2Seb=$%XX2tjZ5x>37k}GHP^qzO#>UI7aT2=F6!o}zB9Tq*)EQ96%?_dAkWxa)wD8Pm0;&K}OcJoV#h z`^hFx-+c4>Vl!iY-I4mc_D36x?b-fR(>{&e5}F=sQeokZ*iOiYo*}zl{RVx^BCno5|68ZoZo&?JkVHKsfWTyVp^^00NT z4NMYjuIi5%YL;#C?!i1!=i7*4B`5j!eHb}w|CwUKp(?6Z`SHh>4Z6+rsWdn%Hl%Nn z&WG=3?<%#d=H0l=8ea3NbaDA$mT{%YfgiIY%2iM6)}-vhrm0^dZrQ!+72c-IojQ!WN$s>o(wjBG>_d>zu z*Y0|?o)&UtYqh=yPgV*DSo)w;yT*M?r-Z#-79GDSedxL^rbj2->3HNfsd(u7yvNF} zd8^m!!mMY$F^dORF5e}^=Z;~~BhC5)nb~bR?)-B@m+!mY_?~Lf;>`DvUu{|!ezxJ( zs39XhkF6C^*QSQlB({N7_M!qGJjBdusNRzmL$<`Xy<5V%?h?m}Eha8|?^x%?{-A^V zrp~w(d~ApPgv%{G4z;Rg;}sBb;NzaBKB3D>Z?^Mzv+wbo^!jNdF8I94Gq~OJR&V%* zK)=lJFQpc^YY$GlK7HN>lgN5ahnE|1@BFGBEsn>RTCwM1FTaX~Z8i^Vth?vjy~CFh zkIqKC(TRy?uNSIyYr9nq(bOK*yZ6y_r6v9|oi@u_uCCLo-i&^2=a1^Xb^FPzutB%? z^?Dz(_DSoEziKBQxOF_NROJ>^C(I1q(DKaZQiOlZo@x0J<>vpj z>&m&rr{Djux_AE3hjMj}baKz|^4dDpeDM84UyAH}Q?Zk+%~6Lc=HC_{@4q~0|43Am=7uYmS*T=*iX|&F^NII_H18!BuzD zZ+O(m*x&9NJl8ndmuPlo>CQh}?sE-n*g9$RhOIVNvh!50XWr`RZwGc?yU%u9i8_UJ zJ6n02IZ^yo%%%fAlj=>6xT_D>8g@N$bNm`o%%=9tfhN6PyonmWcF?Ah0iLs`L{6&H zG^5M1#bRl7RPSm&x3E4Q)1LQjao?mvz|}Mt=k_OxJZPJ8wC$r-`}`)pZ`|Nu3DYzi z^A-NXZElS#l=Rvq#}NA9%j4uq`mcSPeN?^_q+A-k^H%S{u2T<=T^#g z<8%Jqkd#lZ^`kC(`CmxiwR*{TRQb@9)EE8;BlF*J0{fG5Ibgi<)$C6_ANd}KXLw-FV&_C-5*Os zZ}jWDxWb@Je?42T&!U7KnR_!3{7XIxZc(jF(Mq#h8^oH=6LZml@{o*Kv^_~!_w1;p| zgtdp@>jmK&g~P(G0|c{n5aK#OI4UwI?4i)GBZT83wj+cfZ#)zjSbACSqb=Ou`kH^a zZ8J1B?fk_ORV}W5u3lP?WqS()2hE76?yx5X6+vZI^244Vf6brVbLDTT;#N@^5v>kon*VLbx3yb z+R6CO-UbY*)A+*vg}47W_Pywm)`t#^vEAQi@AGHfR%~v1JpISFyM^~XY*8w?cdzl` zQTa#Zsotr))qByrfT(z?(z2wYQ$3&V-&!ss-EKwxp^+D-Th#O0wb4yV2-+~LV|+=Q z%MBB|>{+xc!q7Xa)3KB5Dp>xQ>NulnPPXx((is;veR;TWYqtoycJ<3mh~3%bSx&w`8}GiTU#R=*%Jr$Y>o|Y%-E4F7RC=6K zR*TCEUZ)pnWWA_tQuPj>x)jnlEEAy}@PsZY-NZ|KRwEvyn{*TQ9WnmyXEFZggkx-Ei9cf?WBU18$~x+lU&_r)1fmayvqdLW`m4@Cy)k*MAi^jO4_ zo`@Tyr^2xpC|gV;<%lfOGtsy==($KFy%0I1m%^V5|P<*Do5;zd!o*GnF(de`-Xr z04VGGL5U22@=YU-LD7EKh|&YVKQtm7Y@!io1|UxpVHXI}iYQV(kwG#Q)dzxfB9@e2 z+#nSYj)OpEVj4*=vPkBlaS*7WNF)^!IV20=77QvZ7LtmHx1^$??O>3lNG25%Ur5D; z&k#@vkwUT(CLy4b!jDu+q>`+KJ``jl{7I$7UQ!uhITTb@1e3~%qone}W*Ep;gpn$U zGbB4DK&F&tzsrje?PEK&{8I095tB$8^09Fl`@ z8v&{<7Lw|Sx1_qFZ6wH1B$MiiFQodyXC$bBNFg;8CZj-&gdfRCq=JM;Bu8^J2D`EF z9}VF%g)|B-!ZHfN`jH&VCh0s!D zPzZ{G&~O|CcM&@dg7p{(k14bfj^iPmrjRrqLR*nVVf0uC?h_z*iNpyI?8ia)K*3wM zMMKD>uqGNp2l19d{CEgmV<7m55I$2#qtH`WPKK~P7DD7?2))Ho3ceE|REdMoSA@kuFq;J78U=r0 zHwD5T3UN~)1c(d@L6adgoC+aO#7>1^9S7ktg+anG9>Qq~N%0VZMHYq8Qy{ocgD^xS zPJ>`S6~YG!p~5WzLMDYZ2@r;fw-n;zA#|M%AxtDshu}O7f^G(c2;nmWLN#(APGX?0tiB+Qt+4$!D=Cdg~ER!gwGVxC@dD1iy*8Q5F!^rSSpTE z@Ld3*%3=u1Mc85pW(y%)qmV4@mO$7;A#MqTRU(5z&>{#8mqJ)0VwXa&UJT(eg>}Ml z8HCdml9oY85m^*QFM;5`9KuGCxEzB0QV1U?Y!YrOAY@WlvjV~v@s>jTG6-FhA*71r zWC+g7A?Q{@*e-llLdd4DlL9(r6@&#VAOx<0uv?^3@JNPWwHm@+;lCQfX9{T)_6y53 z5Z14R5V;1zL2;CV?i59fUm;;?_YpE;1+tt%1;RJ%lt7 zyB>n|S_qFRoDz;H5KdD_N`Y`jWKkHs4ubmz2xmp&1_<`+A$*{4Ubt<9kV#?9MhF+h zTMF?h5W4;bAwwkp2Elm)1l=YGSA@?d2-y^NQn)5eHbYpj5klZ*2-ig_1&`k#SZ#rD zL-=oj@R>pyg#=QOFW@+aT7h7+aS2_gz#J>?u1~!9l{3+ zFNNDK2$>Yt?1J!GyrmGo147r`5Z;R9-4L92LeTAj@Lu@rfsjpMCxs8fWG{pTyC4Ma zh44wFQt;Rf!D=5*3nrrfKAsk+q*3|PL=@Z4)50Dok^6aCFcHV7`0j;LY5UkQ5*a-hL2%jmWQ79uUPeNFK975zt2<604 z3ce>GR5=B~R)n2`V3r2q8U;IHcN)ST3UQ|)R1z5!f=)tccm_fh5qk!L^(hFCDO3}V z=@3p+SjzJ-{&o2*gwdxVc%OrSe_cKY!Tt<{ZxkFv+w%}IDQr3qp^o@MAwC^K?+Xwd zMal&T&SxQ5T!c_x_+5mMP2nJghC+V{!h&-ULN7sZ5_>6loQF^@143gFoB`o8h4U0# zgw16L>n}hUe;GnkafX8LMF~i?*4d_9B_oL3|-~6h1dVJ|czGNtoOO zbryc4E+UoGRp@Vlx(R<$cd?h`D=cq={6sLRhd4^=DQxb5dWkSnZ*c}Bd~dRechSVY zBI+*mejT4ahKgj;F!6;nT=+Z!g^3hWxG;GPiV%LJ5h9foDfCZ3BZWU{l-NreEi9jc zqC_xhj5tafD{Qhs<3t!~yf{OeAnbBXx@)7gVs0ng8^mbEGcZmGQIJh0iVV^uQT-Wc zvWO+ci5nncosG_E`W&4zRZM#h;WUMp6sC#BFCdK0fw1%igy|xOg8efH-Y+4{6boM> zt6AbLX|`zl3N%L~lM=-j(p=&58YGDn(mY}E29zZHNb^N1NeKO0&;sF4S}69C775FD zpv5AXv_u>wEfqHJLCZuKX}LHrUqRbN3TcNh z`4hBL_>p#rRMKvt{|mH7_>=aEy`+7+Ex(yeDmK@_R2;F_n(4aYxwwVMve%x4RNjB6 ze@N7rK+U8c@*5yx_-F4UgGU7N#{O;(ao1ium(h&>v2=bscf}iqnK*spEx-Gv>r zg|&!hVf?S;J`cpZqIO$4XfK+Gt5(_yx;^12mBLf4xNogBwQD;;e%D0|3*v_b8~@8+ zIgC}@%{=qPD*wx!1-LM?SZ5+L!KzPtKQmt(xqDVh+_V8uhf>SU}NkLxe54%M>m?>ws&Bc zh<^3a=^JwJ1@YZzQ5hCzVf=r?_uwUNCD_n5yYDy9E{-#wqrTW@!9HO)pmmA<{zLgN z|N7`6=FgtuC$G;}xbV|JjYHQ`)f%cAzkq&3)fz!#KKy3zaaD7MK$BmDJ*jBX8W%M& zzdL_gjp(W-<|_x%Rn4Hr(?h$UYR#arP=1ToOx0SdY5A2~y{fsZ8o!==2sS@$zy9g8IDvnel>r$8gCS|^6*Om`&BIo8h-e{ zLuwAFX@#1Wf0TDj)uI=u5%~(GTZOeHk3CWHl`tI6>7`LPNS}O$CUts(4t9Xa{X7y9J*ks#X#9Xmvb~s#+yzQP4Qn z$5gE{Z2s{yhwC^r_EZ&M9>C8HHC|QNj;0uYer~E_HQ3q6kmGtw)$C#ar51b}8h$j@ zfp4mISJi4j`>tyDRjnqpAFB2M8i%tMAdfldA-^$B(E;F#TKIXSYJ3aKYiOK2k5#P> z>_ck2C#qH#+BH>ss%nnVZmL?gs?~$`5E>_5j;clT5A`0Y;xkoj04)U?C*E^t_~Cz` zASY&bzEtBig3YwlUa6WB?33tzPBMORj*W8$dP3tId!uUnW3=9UIR(YH5b?uTBg-x3 zgnF+=ip_yp z>Nx!gfwgu6CIbBYrD`o;2dIg^sai{D{MG`8;X5?^@QwVMX3*ph@?{ct;13ua22)jQ zjq+uY-OCk>5!n_y;C@flDi} zm8!LaT^w38#gY)&<@{5Rl4`{IYQ*-?tfBGK02ty1ds-t6v=7Y;?d_|o(H(iT?9BW3IN>B_--~XYy5gHm%$?dw=^z)+{I=A+_|#R zf~P<@> zoPowb6Tk&<6qP%RBfkTK01o32fMd-+F9-zs0UyY4y>3b4YK1uPo^bbOZc=E9#;ifL{`B25{YI z4Acc20j^72hZ+KWInowjt4KMmEoikJ=5^o(!1K~xV4pa1T5B84lg%oCr*>Mbzlm>gU2f5o(!x6mHsi@1^|J;KwuEB_aGn`Fa>nLHWbL6t`BBvUx2R{ zdVpcL4}_xiLxB*WH{c6&2RZ{?0PY9wKy!c_5I3AT$ctw@zK*Uw!1w4~1+D?n*YPV8 zxB=V+?g3dq4)6?k4!i(f0A*~27LbZA-T|ye+*JTZQ4<5i z0uupSgp~sL&fSN|^ARu%>GnY5n=Rb{GvwQ!r(B*|ssiRfA%LfoBt)1G%m#KL(PU)G z7lYgZxD8t%USXgJz%#%?XaYzCb|ZdSXypN0pfa!sI$y|G6}CN49gyJHiN@GQz!(Vd zHs~_IyByxZ@Q!5-z?+I>fHxAnao~+Y48VJX6-c)jhyq3eJXr1p_5+E)9Dry3hX{KN zJOQ$SkH8ExDtab$d<~fgQk3U>C3(*bD3f_5%ligTP_n6mSMO3!Dco02hHv zz-8bn@H=n=xDDI^?g96KEZ_mhpT{L0k5~yFt^eIh{LfSX<8Q2hK;a7kKOhZV#FWT#JDmqp9#B6Zvp;|fzR=!k2m*L=9S8&h1Ax8&Pot$omCM?QXqM3%;6as#+8%%(z;byr!^3VDpcKFx z9^O#%5X-}CbHE+oVbuoUO%e~XJkauB>jd!bj0asFczN*UttL0-)<7%nIxS(e0Nj9P zfC1p$Huo^zv0DQylm(C*0QCW8-WYHO>H>{`GJr9hS{Y1&4XljI3^my<^~&m$QJ>(^w)IMf-3Y=kje4l*^P zZ?ro?Glm&8P8L=RdUWp0WnkXA8fO)C4m^F@oHd*PoQ+0}mEx?)tFd5XI4i{&7Xb7F z)JM&rGCzJ$><{?=6!7B*{*L*YcB&;W3>{Dyhyz0LZ*p2E-6)tN#g`0irN9uX|JxA3 zziX>S|2xIZK~;XLFnkG^o2QBbc0Pd1!hF@<3SJ2$1M7gbz#3pRumV`l$J?u5ECKNM zB{#Iib&Fvx5^kB=;^h{>WWTa#X0rl763sGTsT>>s#>AMSU8dFy|FpymEEvO>YK4*~ zrA0K$=vElb;#D@l+yZO_SgRCZJ+J~W79*!B?wGeGOlHjgH`uHlM{+Z;Nrh5wmAuK= z0G5)sgl+KUW|wJv5T>!acESEXb=gjYv2r_r++HiAr?diCCO0_x0L*;=C*odUH(;#u z9#uE`jFZ>ipT{@mkvH5}%fpDr2CV>C{6c{7@cDmg`x1bjvbX=bw?ZmO5x!_4gj6a; z$d+YDjD3j^G9eXX?`zKpfr5CzquXE&olGjzB02I1HFp?GWC%nKPC8xQjBmJW~-a zm)X?VQJP+uq(no-z`~3$4@1*}^L<(-`6Lvd0FDFS0oDLdLfqIDfDnL(2_B0=fgpf~ zg>QgJK+F?7jI;)t1I>V@z_)-6kPCbdJOR!EXMp>_Jw7P>olafFXRM#_{v+@Ma0$2w zTma4k=QQv$=P`|Wn3rW(_A>ArzzzKe@BnxWJOmzT&(DzN0Z##L!M~A~w^UA_9F)Iu z^AZ^^falcozT`FLsiE1Yjf(5Aa{9 z;lEhJyYU#HFVF|*4fF)M0$l+9%Qu~XjsXApoN)eJ))EgbfaX9`APi^%@QECs%<;(` z*OgD|_{5G+?)U_cPxAOgkDtXm|2Vxd&d*EfR>}zc$kW z51oM?KsSJ`?GE$;IG+&(3;_BA{eWm-Ai!r3gMh&Rw=&mk7!U^x1wH}TLx});kc}6f zVh?rUgA4|Hfd5#}Sb%HJhnW0h@reK*Y)%5E04&7x=>Rtszb^y0rt^Whz#L!}zz3r# zz)XOflzBOy^Z1>S%(dlAewhcb`!azv;B(+JU;&T{aGWkgx(HYdaG@Ch0qFqCEdiDS zUjS25gmr>w8jPYg%p+>Y3e9<@A&(WC=ChaTN{AOA z0H_D}1HM3KZhv>wsuo_@t=>rae7Od|BT-ePp1=*zHUg~dFt7=@4qOAa0bby}iu4L_ z8K{Z(YQP~p{{;L1TmsyXcM<6Yz#GpsQ2u+X&+{Oh1GWNZfiu9jz-eF?uopN5RDs+P zq`ANe;5*}vFNV(AM0M}->miHynuYnxk zD}asI2{1p)F_@oImf>es%zAlQ%?7hh^MW;cvcgc95a+QASph$@+u5C*$7}H#0DHic zCZ4%@m{;gv5Aw4x)(y{Gf#cl%LWmWg1S2cw=kM{%g$OzehypoJ80Lm&=645pm%)Z| z?U;x2-Lz*BH>{UE{UflG`#xL6Oq{xF%q+<5FO--+bMOhnxVEAojvbB_rtxzg@DSj_ z{{Wcpcciz0UxDPi_Y63%Bqrg6S`-hJdf07M}k;QtNp zTo9Mzj`urA?*VKC_>wJHhy|F5Qx@VpE{NZ`Fizb8HqHax(H-C@7PWK3J0D(F222g8 zgm(i_0$_b?Ohr6%_v7+vpnMBEWC-in6BY2z?Nc7<8Kf@&3D2&;OFY{mwF0;%Y}^rm zPfg1LE&v~D^WpY$|BDF~A0}2G|IAF&TYOwf-Ga_JRx|yW0}La!iS2H?6k9Kw%`m zix^--xNEtCm%U}`QDHncHCKR*=OE1E{%=lX!~eWpf>VVEnx0~NoU z(36!~@%&r|$OW-BQZcfb3;SpV2)a<{hC+E_GEtmwEKk24ptI3>zZcye?ayuI2gTfP zxn0@K%*;)~?&c=x1eg}eUSngpK&}~khTqM3xB{I27W`e2b^+=G4S--Ega?Mk0Dl4F zFJYnNcTcM8*9MQRfmT2`&=P0?GzXdiO@T0=3D5^+bfbm$qyfSl)&gGuYk<|jDqtm$ z1*`xz0ULoWz-EBI)$ms-{%FJ>nsxy@fiHm_5)K8o<6#@H72vu$-ogX^D?Tg7`+?L_ z!jISDA4%ma`m39TlJLUN!GCRTiU z(Po8CIR%OfWF9Z^qq%a`K%H_6l+vIK8vW?q&u4F}(<#qDsRGJp$I2OVZ+_fJqf|se zP9@ZWK6+{sdc4Z>EkcN^>})H{@hU-2@+9YaY+48;u)8)Ulq@!()sDN#LIQg>P}qRl zJxZ4Lcs}BWLZPL3QpIEzTmmxwXZ-Z(kM&D6=<<~=xEk5Epgga7{I>ki&F6g%0%TBqDCL2mCPXQc{x;IfD6W^ZesUGvrLTRPV}jk4Uc;^b0s8^`Jt zJJgJ0VB9j>zI8v^KR~Bc0HqWty{BHTb~ZNaJDpM!6h~0T9Q*FZ!Q9`hKoM040g0V_ zbx*+M8V$bdq6@XvDDD5aN%qe(8|#!_w)8|)Ax`7!kTAV_|B;6u>0A>v${DX8o|JDj z)mEp>2gM0x9_SrV<5lmoc{(Laqg-rtV^W>jF|Img2PkDALr3FZ&Y9emTU%7&8;$f$ z&+FygF4=#o3;hHN2luo#qmnj17`0iaJhJ`#kgPU>HF_Y9ag6bw77zO^VZ#WWsj^17 zaN(1w6W$&0)G75f$`?74>Q*oDcbZO#1O*+zIQo|(SAWd%Hfi`zK&b@EtF28sZyD1p z5i*`y9HoH79qL{CuWKH6aE#E^tu8@fuOw$14tPXPig=_(?H>f*lYdEFJnC$2I-VSB0{reF=XI2!6=71p52<`vf35(37|`t()~I#w)r;D^LP_Fl^Gsza#@qcrFD<6YS|wFWJQ! zCwIr~$=F?XmCo6dZxqri_GvF9SLru5$WR*nk>mMEPD*M<@w>r_LVs46 z;7CuB3Yq{5DeI-=FU@eI<%2*M1!xMdXw`qXwb4rFU0rG@3jKWQVG?@Z5*q%uR3WnH z(75NMY$lE2U3&IdHh)G7D1sM#{QND7!C(%Je!VaCdOmGeN394{+S8dTTf!wUpJ^K_J}BBM)AlRsS!-9Nens2& zAM0o8tN*_BmD0^8dfkWru5{BHYPIUX1F09rF&=qF4)D%9GOnSEuJ^yLFEx2Bl~<}) z14~byY2Cbs-X1z7w6m`Cf8F4U6N=VbbTzaR6?yZufo@mPnoS+|t_0nDt<8ClZ0XQ5 z$rM_R3XgwvFsv^)l8hm@JH!u)*QUalC88SFtlY4|28?lm}JlCmY#c3U?#BVwkfc z-DrL>xki}I@gZ3pY(eYMU*@I_TTsu&+0q;4@qelo@2VZ$mE#ZNW~96T+WB|oE2+li zUpreiZd9MAev2IUoNL8ogJqDlhic+p`=vFz9lzCFSLUEm#y=cV zO-M8jsMD|egy;>DWj&t|Uej0{t4hmDa%teG0S>#dL*1KPI`pT`;f#X~mi={a(!uJ# zIb#_vWE)kZhmbW400#~qjn{wJwrG2qhkxlDv#XJt9kg!)2Wt;Kea^3%i|0L^<0nn~ zsAbKzJ!&*{wobA1qTwuC9S0}~Fk_j}m)U>(dH-bZDya~HLHp;5dW)|j6A-2atM zDOH^s+e6k1m1ga~{j;?0M|Uq{Pc3A_K;f-Rk9Fy1zW@1FPo2`EI?aWwAztH18rnW@ zbp3-r=p3`E(;;w3YpUm5v6oj#lDi*Gazt_U(O$ey*%JGR<#dtG8pT-3X;sfX zR>gJ7NI%MjtYJPl*q~9fyIh=`Iq-?jvCc28G?X6(g8>Z9qwH^FZJjn)XSfauzF`=j zbiUc(alQSWb;@hMoQTqLq$P)0mJ`D4+d$QscWXO!DL(aLMXW>X`QYFLAIk#iv6I|R zdKN^XWn^!uWPKV^Ms|~;>eFnz+m@`au3$R{(}6Om{GedUs)BTEFu8dlofk}x`F(XT z<$5FC9ZX@)NY4hR)k5-nFzsVD{Ek1h2C7>rMBTS-X`eLfN#J+aB}*LM@RHjiG=vVg zfwNBtU2~SBq^Tj~SWb4eoeBvb)Usj&igE$HVFOC7DEm`n71@cIe5=U*`Anw7{7hl8 zxh>-xT3EP2bA??eY{nn&_z&BH|AQ?{8`8G2h1f8@A^De+TZm#snqQLUlr&d4yny|h z2k1^ExpuyQW)hwKfP_}#e2)|;Rn$wZd_G@(A@!S3KLb41vI!lkfHvsaM4cwePw(Em zl64gNEjENa_FIU?i*G^>6(Nz*gd!><6(xvPEZTEL*-&W1sD`!3H*|j(Wg8HSC7RM3 zHn>7l@~vc&e$ZQmmLQs5RIG>!NfVk;CRfxf_zJkXVRMS(XgBK(hVbUfu*Y>7RBU12(sT7uLo?0r8XU^(GrMAM z%f4PNDhC{C@$XyLr8PCKj=oxSPt(Rrnq9q+!Nx2;h4=nX#*2_F+9b2yliwC11kKw} z>l>!SWr6Vh-?!s`n34W{TNE)f4HG?QOB;2Htdl*(-o4?GD%>vueS$HQ z@w@qAc7kN7oUb7gj%t*7ajAb4U$ZupDfN^O4`)E()oqOiUj~ov(tAI?exS$uQgk`l z#RE%WWtnb%lJAHmXpl07(@lfylB_V9AL{E&<|mdqrQpU(C@#2#7L6C(7NukdCAYPX#xH}dyrYGmk_~=|0dW1bIFJ%WrUfr>LZqx&v;@wuAH|#c^J=?%4 za|l8QyCL2((%Gkyi@JGS@DYVgz?N`XJMyT5bXz;>T1ReY5dX@@kiRDwt(xrO<6EA` zaj@IGJsqfnwPWY@>Tc(8O3Jn3twv6=^S6Qr!a5??EwdGH^)Eh|HN+U1{0368l^+ts)K`kMwQcLe{E0m zS@w;_vG?}pKh#dO|61p8icsgF4SW0DUp-~eXq{3sg08V;O~JwA>mS{(f9}wBmx=aX z5#(4Glf|bIw9OZsi^0hY^A1)OD-A1oB-%<@ZDOHgu`Pn4z!`KJ9K42JvTxIkOMmZ@ zbdHA_<*UQ1b_6-y{X(bMb|4?tUbBO`ess4gmGyJy?YDG}HXZ0D+o7c&;M8;l68E7w?^Sht7S`=K&udqs5NAtIS{dVUURVOG_SM~$rL9vIjMo}tj@1b!Vv3T6d>z)**a}3icSEmjN_e;BSSf@;mq8lvxxyI4I?3)s$ zsyIK_IW}mN#SI^N4xP6oMW^hKqS`^Q>>N0_rIuIp-E-mIfSx+XuTj(w96_(a!2?XE z#%F68DwSTRbCm9@QtZpMxVJoe^mjU?dSA+B*+v>iT)$QCeptA>sm}4SM)5B_vFk5; zI`!8nv3=3TxvKmhyJM>K^FR=-*9buR1FXF5lnYryt|t3sHLE_p zzfUitb37QF77XRKLzHVW#yJcA$;|OAeP3s&4GIpSj4z`yCIw`ke5X@7450{?9R?0J za5yfg`gq9PrjpJvPovbYz9rcI_1SQpvSkQmLe_8^9F-xPapFeKq!kC->KqS;&{@T@ zSao&Wq*%v62`MKA>KvY+RDx`!aUCr0PPk;$DPgfxIRuvV1P42&)U9)VwcmXIM&}r< z$)+SMt$sbFjlE7;97}PKm9C8>$2Lg+97$PtH`phrwLG4C`hJDTC?Cl(*e5_aimj7C zr$53$N5_P;2C{3_{$O-Kp|6l~)e`r0*_17nda4XI!94J}CQ>Lk4StDgPrBh=-pRI+ zg9Hw=IF@D>EfXo8IeLME2hZ|0-KtisF&c+jJevn1ECwging$qSJ_Uypm(uQ&F8!KM znXYiu^TFxNEKqoi={eJVT*$8H->9-dK0y{~iDcIh+IMQ@|9QpJW#xw3O%x90vWhya zx=P0r=|(dgjm&K*SCFnG()xy2E!<6{Yb^e^X57+@st4LHUiT-&;S#Q(brLy-%7YB9 zN$Se8{PBe)u20{#2^{s*&1Ur^S`-Rh^^@pZPMamsD^A-dkxwJ&PJkp=eE8oXFWV38 z#K%hkK0(|aCMA(ud$h~UB$@zDDJ_Z88evCxEs5?lf`*4lWNZu#&!K_mjNr67pSd4( z;;+S6$*^@6qo^G?1gA)Y3QA1UB<_t?>(S%jW9!TtkHmLfY`~g)N~gKB_MfVyotQVl zp`3JSjD+D@nf@#ejv=WDI{1UJ>crBuY`t50auz4 zCOcKFJ4qdVULq|4mqZ_N|E5)Xc^uxtsnCfIK9Tl?p=d3o$6<1WRNY98o3cGd>fRKd z-9DM-^83EYv=;9lnDdKhcdQ1!oI(!GpySjOs?iK}EFuJ9Qrqd2%ACCtX(K{V3&kbU z)EP9cIo?GaESP~mD1rCQGwDrpw8ZY2YUDh8+5dXqGQ|UwN-Aejty0Lh1vGY@MQvM{ zXn?QMTVTNuIa?iq=}<$t9R1Qlt{+rxj_NVLCTprqm|D65l;L1uE4wyrkoIh<2ebo}hiE%u!TGoex&Vjx;MT=uqBL@4?r*~L~!YYi<*qvhdp1w$e6s;$Pfc$FT`qsQU!)|+|i z3CzLTORqHS;@TEvYR9MOnI5g+CA<056=_f*%N-oE@(ORpd^PqPJv+4hq+=j&Irs)0 zD7o|LKr2+a@&fvabvdPyU2C~r&_k`%IRii2zVFJ3pLs{>%VUlAyiUc}V5kmk2W%r{!3I{sJ>-xs!XzgnPhDE(SEUW^Rd2p;5$ajHE0`b)~yr0o$W zab%9L=MO{{;n2l1$ikeXM`JzwQuHxBztI+v4;qhB+u&?i9pLj_kD1}yHmFsBhE`>y z_veLtvG>{iC1JM67ZcBi#SMi{FW9Bymr8|}-&jOUOk!N@a14&SI~&JubzJ`vd&kd} zUuGN6A?2CN#dTTjveGHsHdBV{VBEa_oFdyHTwZ{q95@~|?bSW7gL8=DeC5E-A&sWB zL-Tm0sq06VuBUF-_B28~ZV?@Va8Mp3Tp)2a=%HoA z_bzHrQ-9nmIbk|C!-W|{!jUdSjAg-C%4+$ozWxT)qsr=XY&u06WfywZ0Y|0cTGK2CsvQYw zlY3Pa3{#-6Ip2fA;#tvl>mI{9`4``vVUGFUEKxt_%{@bc7sxg7a883*0bcrp2lt6~3u zwjI%ow2;|F*d6aiUjQ3j>PqRF9c4VcS;*|}+8vr$LR;PWAdN~Hn!W>6-W z4d=nZ(P{0J^mW$Ka1j(i__0U^on?+^;3y4_?wfn(xyNj^$WBx3mbA9E(b^* zmQdC(wnDw%#vac481KWEQv7hFYK$p$_0FWQE^4(kZbM+ET5p&6W8B|fK83rxiovK# zW+sJphB;q=gUu;Am6W}5{RNSb5|-v#WELbcu7=f+(7NhrgAORRnkhJyk6LGn3ODx*6JoG z2xe76IRb(UQ+va5Q3JKVxL9Lxbz&{u0Lf596hn{jqE-T4x$jX_9}`2+m4zWRhg8H4Zu4gGyQsZ7K(q1L8|X18 zK?gUele^c;gp@WmJ#6%jat0LcLig+kcqUx#_eP_j7O-{ONE5BNb{ij!cTGE{h@!Rr zXIW{JI*_~DKV9{=O{H|bT+Fv&TwAR+1_LG{o?m@JkH-8y`{S+(r?RpYH;Kz{qOcK& zl0*FwC91RhC67(y$QPEYY*rVuJGR;^zUUV|N3XhYwJ4|vlT7*vE)2WS!2#&_!qwth zbP=*}Biv@-TgpO0ZyYU$(EBRzjclb2)v$Cm6tT8JCo-L+w3zBQ6a}bj9Hocn5w(j! z-HTY%pho}R$ynx`W?h9YbCi9ny3BF0#*8g0tF?$U01F$gyt=^AuWVzESZ+kVXe<%g zsp;f482Kivn7DCxS64CZq;Jz{ALxc_hzXtsoiEO9eqinQ__2jLh2ysY$^r(HJU9w0 zUzDiP0)ykY@et@1!>6{4p_xPEN(L9K5qPcUnH*m8*+VyHrGP-*S*lAL9BXB(Vfpj$ zJ4<~%uX}58g=sq!vK+AES9fR|ot?{DFDjAcrWVizdHCR1LgZGDjo$3Ur{M7 zixpMwC*UY_MWw9BzsgLDL%oX*pF(FQMY$N#w87X=bSn!^(Z8`=sK6sXkES$b5MIQz zc6zKzQK~9@2F?$@o47=q_SA)yKG%zt>F?VqG7-yBOqgNxRV1tcu3@M)903Q% zrcb(i&HGI~aF8qd$mJd67>^D8vvg{KG^o%8w9=a%LkAXs#tUm#c8;t^e7MMa0e}1i zGJ`h9*&eE5$V1-(Y|srVg?Noy#}YVj_r zE?Nz#LKlt}e8S<{YKR6VpvlGXrrPN$nGNZbnTUOd7$db2O;TI4$O#R@i&l1F;$^J@ zctTeKOUy(fU;>1o2-5uJiI^cxDy1w5#9~!cPAp>r^H?3|AsX`CKyV8|nv+pu%n<_yzm;`{E{oIy?WCmXx=$$@9JZRa>PT z?nBuuTi8tmmE$gC%b*Uv&6f1du_=X*#zOXGA9}-<6?PLrmBmd2-|5g^*i8hLqh*xZ zQ(RxY^6PXmC`Q-bBZ?-mY+*MMRN2XzthZB*dX{r;uheBfkD^@28Vb9Kpvvx#N}B=Y zgO=)0;DjPsg&1IRCy-KFU)l+M`5*6DY#Y=2U$a*mnf8S;r1-nURW@x zItptLm4bkH%(8`fM&*cw&$vUJTj^NoSdDuf^!iSYqR%3e}GsZ^@4;@+mc zZk2UP-Afe3vaP|v*IkB11ldhVY>%rtqWu0EW#`g^KVJKF^%9*j;Sz0T+cUtyU;e-E zns(~^#VLK&Upxi+_|;cy=N~j6F)?Xue2hiN^CY{HV;3(}203N%ZT>ql^`5kU2=1C) zC7(I4%=~&6Zj$+9;PLkf9(YwPx5S9hZ|`?pvKJKGvk1bzJGd83fNbmLxCq9UP5OFN z;_={1{>o4Z4quCqYwD&WuI956wY=VtWLXP2{0XZqQYWO3yWDnhOfPkmDRd3mq*~W< zp3jkO3%hYP7eYKXn%p=Gnuq;J5%@?>m*)s+d)N(|Ut~ z-|ZQz`gQba-gD0aoze~z{G!Yl5Vy}isOhNJIwb)VzQYyjRxK+0_f>&9Wg#e)KnV;D zbZ!27>S~RWjI3;s_y*R!cGi)PEQcP_h0cM3-(4Cr?7Nmf-1?c5PRRp>U4HuBr7hD} z{WVXgINnt&l=7hS+MR3L;c}jcRbNn8+odkcP7Y~*AD7f>T`R7J@w|I9Iu!%XvU}

g4%yVG3eSP^vwk z+6&QsVc_7JPnvb$&YiDcj@3E(JfMEy2pSCz130ql4mf%#WtfG|u?Q45P|DXi|MB`g zOZVuM9SDv~iPMnaVDc%T!l0k(UrXAW40RPl$<+7J`ElqT`3e4xqy*!xn5Y!xLji z3{RwUo8%fLS!*3dHj$ofk_XZ9b+Qe$+bmb4OKfxWX89lLv`Tg(<1!H1E|bgVzm|10 zv3S6UxDg5T%QD%;VOVsMW@*Bx;lt@1WE_)X2YeEfpjtO7DK?HQ!>kOd&g&~=C;WW- z$qG3nr~69ziWSw&lADpsPT7$HR?1b$=x$|0-|d7Or)0_Aw0gPhs(Jb3a=CJe*u-HY z`p3q_3{`bTuaFy&)e5-}YcEbQ;Lf+WIAv$ajwtM4mK;M_8{}fNW`$fPpKe3$%VmSf zYw%jxS$&P%Bo}i)#p>3n%k`^+e>DkztsITa1e(4@4%GSR%gqq`Yl~dTMAh)E@L%>? z*})_)ayw+3WXsjf^EPD5cC;cJtss0~oMJb_1J6wJY$#x>uuo|oG+FI@2^&I@Uhlsa zmL0l)PE_d2pgF0QFoaEPzst;IrOb){g#ID|?zNaNJLAKe~TRTwU~7P-*3Na-{&%oEXHtN{d10 zm0c6T?k2j!XN&>!wr)he4- z0X(L!bpm`Sa+T~+$+XHkkK%zk0n{|m%9CDyZ1ru = (props) => { }; }, []); + const clamp = useMemo( + () => + theme && + (props.width || props.height + ? { left: 0, right: boardWidth, top: 0, bottom: boardHeight } + : { + left: -theme.size, + right: boardWidth + theme.size, + top: -theme.size, + bottom: boardHeight + theme.size, + }), + [boardHeight, boardWidth, props.height, props.width, theme], + ); + const clampZoom = useMemo( + () => ({ + minScale: 1, + }), + [], + ); + return (

= (props) => { )}
{theme && ( - = (props) => { worldHeight={boardHeight} width={width} height={height} - clamp={ - props.width || props.height - ? { left: 0, right: boardWidth, top: 0, bottom: boardHeight } - : { - left: -theme.size, - right: boardWidth + theme.size, - top: -theme.size, - bottom: boardHeight + theme.size, - } - } - clampZoom={{ - minScale: 1, - }} + clamp={clamp} + clampZoom={clampZoom} onViewportChange={onViewportChange} > {Array.from({ length: game.width }).map((_, i) => { @@ -254,7 +270,7 @@ const Board: React.FC = (props) => { }); })} - + )}
{!props.width && !props.height && } @@ -311,13 +327,14 @@ const Tile = ({ const isQuestionMark = game.isQuestionMark[i][j]; const base = isRevealed || (isMine && !isFlagged) ? ( - + ) : ( - + ); const extra = isLastPos ? ( - + ) : null; + const touchStart = useRef(0); const isMove = useRef(false); const startX = useRef(0); @@ -334,13 +351,16 @@ const Tile = ({ setDoTick(true); } }, [isMine, isRevealed, userSettings?.showRevealAnimation, value]); - useTick((delta) => { - frame.current += delta * 0.1; - if (frame.current > 3) { - setDoTick(false); - } - setScale(Math.max(1, -2 * Math.pow(frame.current - 0.5, 2) + 1.2)); - }, doTick); + useTick({ + callback: (delta) => { + frame.current += delta.count * 0.1; + if (frame.current > 3) { + setDoTick(false); + } + setScale(Math.max(1, -2 * Math.pow(frame.current - 0.5, 2) + 1.2)); + }, + isEnabled: doTick, + }); const baseProps = useMemo( () => ({ scale, @@ -353,18 +373,18 @@ const Tile = ({ let content: ReactNode = null; if (isFlagged) { content = ( - + ); } else if (isMine) { content = ( - + ); } else if (value !== -1 && isRevealed) { const img = theme[value.toString() as keyof Theme] as Texture; - content = img ? : null; + content = img ? : null; } else if (isQuestionMark) { content = ( - { + onRightUp={() => { onRightClick(i, j); }} - onpointerup={(e) => { + onPointerUp={(e: FederatedPointerEvent) => { if (e.button !== 0) return; if (isMove.current) return; if (Date.now() - touchStart.current > 300) { @@ -393,17 +413,17 @@ const Tile = ({ onLeftClick(i, j); } }} - onpointerdown={(e) => { + onPointerDown={(e: FederatedPointerEvent) => { isMove.current = false; touchStart.current = Date.now(); startX.current = e.global.x; startY.current = e.global.y; }} - onpointerenter={() => { + onPointerEnter={() => { setCursorX(i); setCursorY(j); }} - onpointermove={(e) => { + onPointerMove={(e: FederatedPointerEvent) => { if ( Math.abs(startX.current - e.global.x) > 10 || Math.abs(startY.current - e.global.y) > 10 @@ -415,7 +435,7 @@ const Tile = ({ {base} {content} {extra} - + ); }; diff --git a/src/components/pixi/PixiViewport.tsx b/src/components/pixi/PixiViewport.tsx index 2258854..ce8ac1f 100644 --- a/src/components/pixi/PixiViewport.tsx +++ b/src/components/pixi/PixiViewport.tsx @@ -1,14 +1,18 @@ -import React from "react"; -import type { Application } from "pixi.js"; -import { - type IClampZoomOptions, - Viewport as PixiViewport, -} from "pixi-viewport"; -import { PixiComponent, useApp } from "@pixi/react"; -import { BaseTexture, SCALE_MODES } from "pixi.js"; -BaseTexture.defaultOptions.scaleMode = SCALE_MODES.NEAREST; +import React, { useLayoutEffect } from "react"; +import { type IClampZoomOptions, Viewport } from "pixi-viewport"; +import { extend, useApplication } from "@pixi/react"; -export interface ViewportProps { +extend({ Viewport }); + +import { type PixiReactElementProps } from "@pixi/react"; + +declare module "@pixi/react" { + interface PixiElements { + pixiViewport: PixiReactElementProps; + } +} + +interface ViewportProps { width: number; height: number; worldWidth: number; @@ -21,26 +25,18 @@ export interface ViewportProps { bottom: number; }; clampZoom?: IClampZoomOptions; - onViewportChange?: (viewport: PixiViewport) => void; - viewportRef?: React.RefObject; + onViewportChange?: (viewport: Viewport) => void; + viewportRef?: React.RefObject; } -export interface PixiComponentViewportProps extends ViewportProps { - app: Application; -} - -const PixiComponentViewport = PixiComponent("Viewport", { - create: (props: PixiComponentViewportProps) => { - const viewport = new PixiViewport({ - screenWidth: props.width, - screenHeight: props.height, - worldWidth: props.worldWidth, - worldHeight: props.worldHeight, - ticker: props.app.ticker, - events: props.app.renderer.events, - disableOnContextMenu: true, - allowPreserveDragOutside: true, - }); +const PixiViewport = (props: ViewportProps) => { + const { app } = useApplication(); + const ref = React.useRef(null); + const { clamp, clampZoom, onViewportChange, viewportRef } = props; + useLayoutEffect(() => { + void app.renderer; + const viewport = ref.current; + if (!viewport) return () => {}; viewport .drag({ ignoreKeyToPressOnTouch: true, @@ -48,52 +44,43 @@ const PixiComponentViewport = PixiComponent("Viewport", { }) .pinch() .wheel(); - if (props.clamp) { - viewport.clamp(props.clamp); + if (clamp) { + viewport.clamp(clamp); } - if (props.clampZoom) { - viewport.clampZoom(props.clampZoom); + if (clampZoom) { + viewport.clampZoom(clampZoom); } viewport.on("moved", () => { - props.onViewportChange?.(viewport); + onViewportChange?.(viewport); }); viewport.on("zoomed-end", () => { - props.onViewportChange?.(viewport); + onViewportChange?.(viewport); }); - if (props.viewportRef) { - props.viewportRef.current = viewport; + if (viewportRef) { + viewportRef.current = viewport; } - - return viewport; - }, - applyProps: ( - viewport: PixiViewport, - oldProps: ViewportProps, - newProps: ViewportProps, - ) => { - if ( - oldProps.width !== newProps.width || - oldProps.height !== newProps.height || - oldProps.worldWidth !== newProps.worldWidth || - oldProps.worldHeight !== newProps.worldHeight - ) { - viewport.resize( - newProps.width, - newProps.height, - newProps.worldWidth, - newProps.worldHeight, - ); - } - if (oldProps.clamp !== newProps.clamp) { - viewport.clamp(newProps.clamp); - } - }, -}); - -const Viewport = (props: ViewportProps) => { - const app = useApp(); - return ; + return () => { + viewport.off("moved"); + viewport.off("zoomed-end"); + }; + }, [clamp, clampZoom, onViewportChange, viewportRef, app.renderer]); + if (!app.renderer) return null; + return ( + + {props.children} + + ); }; -export default Viewport; +export default PixiViewport; diff --git a/src/themes/useTheme.ts b/src/themes/useTheme.ts index ea7e76f..deab49b 100644 --- a/src/themes/useTheme.ts +++ b/src/themes/useTheme.ts @@ -1,4 +1,4 @@ -import { Assets } from "pixi.js"; +import { Assets, Texture } from "pixi.js"; import { useState, useEffect } from "react"; import type { Theme, LoadedTheme, WeightedLazySprites } from "./Theme"; @@ -12,14 +12,20 @@ export const useTheme = (theme: Theme) => { Object.entries(theme).map(async ([key, value]) => { let loaded = value; if (typeof value === "function") { - loaded = await Assets.load((await value()).default); + const texture = await Assets.load((await value()).default); + texture.source.scaleMode = "nearest"; + loaded = texture; } if (Array.isArray(value)) { loaded = await Promise.all( loaded.map(async (sprite: WeightedLazySprites) => { + const texture = await Assets.load( + (await sprite.sprite()).default, + ); + texture.source.scaleMode = "nearest"; return { weight: sprite.weight, - sprite: await Assets.load((await sprite.sprite()).default), + sprite: texture, }; }), );