From 459a28f0595120df5880ea8c76d304fa7e818d8c Mon Sep 17 00:00:00 2001 From: ppedziwiatr Date: Sat, 5 Mar 2022 17:01:33 +0100 Subject: [PATCH] fix: init state from wasm contracts when state fully cached --- .../integration/data/wasm/counter.wasm | Bin 25835 -> 26140 bytes src/__tests__/integration/inf-loop.test.ts | 1 + .../wasm-deploy-write-read.test.ts | 13 ++++++++----- .../modules/impl/CacheableStateEvaluator.ts | 2 ++ .../modules/impl/DefaultCreateContract.ts | 2 +- .../modules/impl/DefaultStateEvaluator.ts | 2 +- tools/data/wasm/counter.wasm | Bin 25835 -> 0 bytes tools/data/wasm/optimized.wasm | Bin 0 -> 26339 bytes 8 files changed, 13 insertions(+), 7 deletions(-) delete mode 100644 tools/data/wasm/counter.wasm create mode 100644 tools/data/wasm/optimized.wasm diff --git a/src/__tests__/integration/data/wasm/counter.wasm b/src/__tests__/integration/data/wasm/counter.wasm index 6d5c480a165b3214814e57f7553b426840112c09..17437af70f9373cbbfc3ca832f19f5f5ea6b8e32 100644 GIT binary patch delta 6374 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 interface ExampleContractState { counter: number; } + describe('Testing the SmartWeave client', () => { let contractSrc: string; diff --git a/src/__tests__/integration/wasm-deploy-write-read.test.ts b/src/__tests__/integration/wasm-deploy-write-read.test.ts index a5c13be..34fff6e 100644 --- a/src/__tests__/integration/wasm-deploy-write-read.test.ts +++ b/src/__tests__/integration/wasm-deploy-write-read.test.ts @@ -9,6 +9,8 @@ import { addFunds, mineBlock } from './_helpers'; interface ExampleContractState { counter: number; + firstName: string; + lastName: string; } describe('Testing the SmartWeave client for WASM contract', () => { @@ -36,8 +38,6 @@ describe('Testing the SmartWeave client for WASM contract', () => { }); LoggerFactory.INST.logLevel('error'); - LoggerFactory.INST.logLevel('debug', 'WasmContractHandlerApi'); - LoggerFactory.INST.logLevel('debug', 'WASM'); smartweave = SmartWeaveNodeFactory.memCached(arweave); @@ -79,7 +79,10 @@ describe('Testing the SmartWeave client for WASM contract', () => { }); it('should properly read initial state', async () => { - expect((await contract.readState()).state.counter).toEqual(0); + const contractState = (await contract.readState()).state; + expect(contractState.counter).toEqual(0); + expect(contractState.firstName).toEqual("first_ppe"); + expect(contractState.lastName).toEqual("last_ppe"); }); it('should properly register interactions', async () => { @@ -105,7 +108,7 @@ describe('Testing the SmartWeave client for WASM contract', () => { function: 'increment' }); - expect(result.gasUsed).toEqual(9079017); + expect(result.gasUsed).toEqual(9053274); }); it('should return stable gas results', async () => { @@ -120,7 +123,7 @@ describe('Testing the SmartWeave client for WASM contract', () => { } results.forEach((result) => { - expect(result.gasUsed).toEqual(9079017); + expect(result.gasUsed).toEqual(9053274); }); }); diff --git a/src/core/modules/impl/CacheableStateEvaluator.ts b/src/core/modules/impl/CacheableStateEvaluator.ts index c0fe879..2d83f38 100644 --- a/src/core/modules/impl/CacheableStateEvaluator.ts +++ b/src/core/modules/impl/CacheableStateEvaluator.ts @@ -40,6 +40,7 @@ export class CacheableStateEvaluator extends DefaultStateEvaluator { const cachedState = executionContext.cachedState; if (cachedState?.cachedHeight === requestedBlockHeight) { + executionContext.handler?.initState(cachedState.cachedValue.state); return cachedState.cachedValue; } @@ -93,6 +94,7 @@ export class CacheableStateEvaluator extends DefaultStateEvaluator { // if cache is up-to date - return immediately to speed-up the whole process if (missingInteractions.length === 0 && cachedState) { this.cLogger.debug(`State up to requested height [${requestedBlockHeight}] fully cached!`); + executionContext.handler?.initState(cachedState.cachedValue.state); return cachedState.cachedValue; } } diff --git a/src/core/modules/impl/DefaultCreateContract.ts b/src/core/modules/impl/DefaultCreateContract.ts index feb8bd3..42877a9 100644 --- a/src/core/modules/impl/DefaultCreateContract.ts +++ b/src/core/modules/impl/DefaultCreateContract.ts @@ -45,7 +45,7 @@ export class DefaultCreateContract implements CreateContract { throw new Error(`No info about source type in wasm binary. Did you forget to export global "type" value?`); } // @ts-ignore - const type = module.instance.exports.type.value; + const type = module.instance.exports.type(); if (!wasmTypeMapping.has(type)) { throw new Error(`Unknown wasm source type ${type}`); } diff --git a/src/core/modules/impl/DefaultStateEvaluator.ts b/src/core/modules/impl/DefaultStateEvaluator.ts index e994df3..409f02a 100644 --- a/src/core/modules/impl/DefaultStateEvaluator.ts +++ b/src/core/modules/impl/DefaultStateEvaluator.ts @@ -61,7 +61,7 @@ export abstract class DefaultStateEvaluator implements StateEvaluator { let currentState = baseState.state; const validity = baseState.validity; - executionContext.handler.initState(currentState); + executionContext?.handler.initState(currentState); this.logger.info( `Evaluating state for ${contractDefinition.txId} [${missingInteractions.length} non-cached of ${sortedInteractions.length} all]` diff --git a/tools/data/wasm/counter.wasm b/tools/data/wasm/counter.wasm deleted file mode 100644 index 6d5c480a165b3214814e57f7553b426840112c09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25835 zcmd6Q3w%|@wfF43&nwv{$>t3S$UZ0GEtv2M_$ZkO2#BCnTd&1pfQTdzLI|%4@K)K)V_Wr)a z{hFDzX3cudnl%#?70Z_xLI`74?#)Jn(Qvcbz`MX@H8eB`b=SoL4REbzwYWKiT6~&o z8;rGtTzhkP{rZOW1UA+h4dyO0ZdKN-3|GusT30W!qVt#5EMK~~()OOC7B5{WB34E1 zqV99+Dk~OTzO<&ku3~=uwe=PCmBNUjnfkW{$W9bLGnWP_-|AQ7>5BSAODdPwS1hR&rj0&pmV=B%OKWnk z3*J@dnU&o#D?Ji2>$_*x*H_dntOPke58@acc|jh`7GZ1pG+~5=A&ih^SXRg|B8DMM zNF`z#R@ksm#h({0up<-!hb0h}t+pF+01D(vX$c;wcKngxq1#iXo7HH$o~2 z@jhi}aYfBSjHiB0ZKV|o&z)OSxk}{VS-Yr4lt<^zT~Wig%d_UroxgPP;>!8;VzNDV zZe4x-qPg=bmRDL%WJ%?crFCme5w5S8x46;}G2_~-9D^f>I=%W8^dE3#_QPK`rrlu} z;RaX8_KuDY>&j4>Y>LUYm`un4ju3XCNE$L!l{C?!N0qEyCPURpQI)hNiDXDR^)ioz z$uI!jkZZZ&Y6&z|GL>4pOgbx*VU&hv6qE@mrlCpLdl9y6yH=5K4Ofgeg=^YZ8YZbY z+L?;Cg}i`dpvI|k;z^6$n-VY~S3P2`=^EqBI36f;Tnp{&w@m{^ROT8}as(j7#R3o4 zz$m0qtv?NEUgcMU1{RvYXnNJAw9*YD>4p|sgwo|PuiO>Y(pr`@tCB#&!EjVSw02oi zbx8;o8`6g$^{OqXmvOJ!l(BTfz8-20Of_`$qo;oK1z7(ySl{$p&-9z)y>a-VWwI}Z zUX{>vB@C+!w79b&4pA;jEwteyrXT2uUwzr6IziUBfQ%aum^}h)MM0n`S@K|(94kk7 zA`(tc5)e+VYuICe))hm|m^7-!;~tX{*7~ea5=2|g82x2`(K4dwAcPAodsYuM9ciqT zMm^;2%nmikU5$5r%S@Q^|K9iHldBUUd0_L7yCaD(_zjhFsuNKT&5d4#p&3I>q1!EX z%_^C*N2ofBsPJ|S}p)|qI9De<4YZbxWR>>#de)CyV z5ey6T@Dng003}?5HfM|!LgQ6XcIGg_`7~8|D_wKBM?Um4XQeBaOWhkj9e#%4@az{2 zgY0*Wsqh3wo{h0Vj0IEhCGaKEQb}5<@VYYu~+ z8Ms{oqM_#Ojo*#?BvO1gq&&?phsO%12J%_@x1lvOxDjqHKFCyJrXT@lf^o zx{4oX8&(4tW5D%F%pV050JTQBIYnUtUcn8)KIr}-?&^f8hYS#K5WptA3gDEp&}^V@ z(1V~W&}7o`$q#Mj&{tSHF~Z?!jHZl1%e%yr)^VshrZLPPom+Bp1);D3uio_Pq3xF# zpiEM`QBVJ^+>2MQ$7L&hr7t(VUo-_rjOttjH6~;Y;srb;FnOF%Z^p$!BTcgm9dyMt z3u9EA>Xzn|0hm}ll&J5@x-`?m07jvu3#kO?I7_z-=|bui3UiX-jFxBTYTWFKcwp2s z8TwP4Q6g5uF)@34#CA^;YXZO_u}%iD5dfnQH7xXq&DJeZ!$ObPTo4tOAQV*!Mi-PpPwB`6V+O-}04~*_SXz;E7oHU#V9^Xs&c%T?(F^evIhW&<# zVB3WMpw1qzbE0N_+iz_zL}$v8VouUEEa5Z0ME z7olBe`jVipii4`sZ0k%B=?GeA;xg&r2!r|n11P=A*7!2<2f;(SmVFGK$Y=I+kL9r{-v|PtVa2OdEcrl{7fxs%XN=NmvrT9XP{o zM6Iqm%LR@+m;+i62b%eEOP&KwJ&z?#Oju=cVGH}`A?S!Siy}~Hk4mgaRd5F~ zly#{9SEgWU4Uo8jB|}K29Q|eLuj828Q!Un1L^gEQSJM6v7@IPsYIa);L=j}@z?h*$ zJggkQRb|^M;V96is%57Pd92cZsr9LWRiV` zqF*l!e3PV>#AOaNOXybHmFbvQh40}e{>l*O?GSywSc9)MC za->?`qjT5=U8jAEo<8^uJK^j>BZewv7Q~3ioC!n?TsU^BA}d)S6tH@CT#TLe)h4ahqnS9#d^KInp-@7yM}|m}A7jN%{?M?bKt^pwT^hBwokmL~fkBTa_%oXo=t0P~IN7P-8U(jrF+1rVv# zw#8{DR5g{U6Rc)1Yx%i7NHOF_X!l`Uk&IlA$_kE^3C&yNRFWa&02v;8Ilu_>5zO~R zPRjvCI6nnBz(^UC71Nc<0fvwRRI6zbrcYL0n=!+c1<3X>PZFZDhDC)HL2%wxX$Uwm zj)uHpehi7fZPXYFJ_c7|uJof8i82p;k3la?ZZD$ZNYbda)VO$shSLq;9n>Ni9G?KuWZI4v6 zu@j68`UVmWXRuOJ;75+a_XtpkxIGD?Ld&!%g6=;HIXtb|pj@XlwBtF}lOy}PkVAC~ z`10wNd^bFVslQV*b`G6Ef^4rr6zK@Vb<@wYGnx#XG#k}#gTOmNLjiN#cw1_<$v ztWtFqlH1g40Jw;9sl2o&Y>IS~UyR789vv)31zBOW42NOEkC;$2%o&I(1av+DgGPLy zSE1I_9CU_COtnacrR&>_We6rzB;!WVe&8}0QQ-vB7yyD>@PGjBBRvM7HU)&}l@2hD z3>e|+64ZObVKf>J4G>#&XM;E*1;cCRA){kJ&_N#vV@DK2&!mblaGAZ50T_W8pCGQO zg9lVG25cB%7ndUN0{~-)#S$bk;Hg*|u6735vsDt^Ndi|feRURB1BNW+d-gQYkT-+# zi6MU}kO5Ub&S9~b#jKTV>d#5;In$ry>`73hF61d2;GiT47c-Jjb_Ty-9D_2IROQGZ zZPPvwRvBL>Dck!%J&|ySt4Q@l)EAZwHZ!|Tec9#Tym^%Z&790b33TBM*CNNTEa}3z z%VP@Y6jo)_jV^IRCfW_DKmfYM;281s2xtkW^|*3UOmJax9l{bsrnGY|1@gjjZ@)CT zt^GW5Gf-MnAaJ+}T9i>mCM&X0j9G>;7Gr2<1dNd*Qu64E0U#0FP%(4YJ*rH3Yd_uM za6nUAnkLnv&1=yfv`FRqRI3(E`Cc#i!MHlNX!BaM2Q5+sopE4VLKGtR76dptw`lWP zv>ch9OFZz_X6oEYx)!ae#l>LqWt*$VxY_c!h30e?%zO+Y4TkKi zUAnh>3A4qF?9<^4vu}szZjfP^pP`m<9IGp)K2<SKwH`mhBq?g;t2v;y%UMIpH>BlA| zaxwUbiea!K#zMNun2ObJR<#UWRfm_<$muyEUm}SlQ)N{$8ym&>6sD?TA}=g=wF>?6 zZU5y-|K(l(CDrD&={Sjrk=wgc`3*mO1DV{m~OpHh!( zXuZ4j(ra{7>E`-pU5OXa|7@Ok-vIic(JfomGt#|@kepkbr7@W-2D5YB`KN43^*|0}Q)X4LS z{0!WtQUi|2t2Oc&bObHv0;vKSO|WQ46NhT%q%4G4N?d1YrhOvY_`5sV)7g|eeu&EY zAs>qSEUrf|rORyWnqp4~BzcllTC9MTa4_902Jd-T<2&o7)nQ0!l>%u$FlTU(u{}xT z1HJJMnu&_uGpM8}yfS1R{d}za4;!BP zZSULtmsApsv&*}$+q7r$wh`ajv~6Q#(vELF1ti&<)&fPAn+}FFM&b1pi zl5!x&roWP%<&1eE2?)jSybbFU+31tsZsU58P5gW({;V|qY&UC@haYU%gmy|)8x;OM zg;^LEijsyi%njjF$2>?Yu@`CRoGkj;9E9mx z`uP3O7% z3WwR}6v_61Y1*1HX#4Moq%A`v8O%HjX4yKB%>3Q?GZVfRJmO$AHv|31SnH+F!(`|v zCk>^JPz|Tp872*6!ad2r+fgCi^ys&^o@Dg&yTx@%l%O;4A$nK%uxK2uf(}hjfFqUY zgd>$W2M)u-ArWKyM3s4Fj9@CNa5Gx*%brtZNe0baY*64>Y=rR!1aM^>Pw_0ealA~_ z-dktR@I7j(joD0DSOSw@#>a@vkC#Q}*GK#!;v_VW3r`H6eS#$+%&=2&2S6Pjqttzb zx{qX18HQjYa&aRb^+jbn(5$%nM@@(!)bSziATbW2Y%M*-n3_aGHYL0>O^^-)6j}pT zznCOhz{T&l1fnn5kG4P~h#~Esqa*srM7TV)Le6x1&M;+EusDqkxpZm=7Uc*L+~|%L zXFM!LnXiddptfR*!7$BO^RzvgR+dy@XF(U9CTO6ivJib?n2LvidV;3g!s)crmwsQ= z`CsRPgi#nv;A|z9eApXN30O?4o~xzZBMRf{4iBf4V{a;?J#FzES|PR+z%Kz%JalF; zAylc-65nm9Ih`MHTa*Hp5#?(2iG?K&aBzbSIXOrlcV@C}iIl#YQ`C8^bc#-$x&l*m zif#gze=*r#`zRy{+X|hDDm6$-LpYf0NlE)JE@zn_G3?6-7?*_{Gn)!or1l&bQ2@=B zK}3TgNt}#On^Lm3Y*B@XG36`G}9Rv#hfDll88EWvruNB<8#IE ze1N5(x9Js_3X;F4@mEVgwhe=t^;9F_R$VW7aF9&MZj2)em7Qo)VU7c7ph2>~pQ2Ru zVGlwZSTl}M;t-`$&z8aR*kJhwp>ZgeV(-S0eI88_&IIRTOwn2q`$G|75g}-^seCBh zj%*p~Oo2M{8vvP2(aG#2?N_!9#eeLP9+@>3?y4u*r1;F^=A!Em(H+kl8Umn1=`bE#}ALj7gVryaXcdw7%!B`9@B zq7Zg~3gLVT1MX(P5#vc2;!%WE6P}^4Y#O4NgGAb~A+l9yeM^|=#7GDgm-|{#2(1J| zl`l5w8nM$175$lzW2nDWxXw<~CA#dIF*| zH5Vs>!7D36cbi@iY30S#V90~IKt%{=XrZsosTbh`U({?O#eDxKD|ErR6`HKv@+w4n znxR0j`O3n+;qMw?^>kXB^ppX^?6kcoT?5pOrZ&(qm8zR!?s{H1Q>LYONN(Vv$^Qa{Zb*+a} zrxKpF(S|4_VJeMF;&i8)XX)NtGXXyfNmJ8Y&rh-#=F+u{)!qgte#^OruwXA&PkNZb zzB7VI5bJQm73;9LH_G7{T(deEYfg$yNyI7ZlJN~p3AmzhClWC zzr#RD^Ww}qQajj&%+88MBRUhE&D@wmR)Zkdd#%MmG+hDAUOC=aoTb`>BCi;4ERL}l z7NHB?=QF|#njLX1)u;)R7_79NS}vLjIzsUvY8dd)smt<*`qY~3iEZQz{3 z2&<9Pg&^<%Zln>pqZi`YJ07pXqh7X-;9rPfFJ+l5uJU#Zk+U+9&j=&M*Su+M5;DDk z8c>*1Rg?oRnf0=5bk#Vh2dWcXJ^;_NBdU^N#L?cCYxZ>zD4f^28}Qc+ZZ=+AXcO`- z$p3tX36|^X)IFY4gT%@o6<2 zbvzL3V}Cft&aTD-V%+$KWY!Ic`TVhDC4^GOj3J??u192C=i*SIKO$%=M`UwE21aDK zS)Vy$ME2<;vRe&=#u$;Ilo`~kms$)?z0{y@oSNgGmSN8ZheRz{K@F*E9HSV{@7mzI z+}*ShNg+rWGdQYvq80K9;92OmhdpyTWD)uyK(^oB>y7(R>`Av&J4e;&Dy<#%TOo|V z<=h1Xib(n0RI55e2Jk8*u`vX0&-I!~4VVe>bG)v_gP}e|G3AR7KL==?hRFgZ9@hg7 zOA4esc?Lvv1~+L|!3olZpah35-sF!-uyAM#@17XyqP)z(N_@)p&-g5PtzTw|2y|q{(0tX-vgevexrrWH$X1c@3OI zgBjpIJy)Q8kXCV#%IkVsS-QdQhxZ(+BkpX9HDu??q*8rj#`$MK1 zZ{Add=?DNG%GfnzFN!fGA;TW8c5|!I1}WL1xIApi%M0Ux{n6x8YaY6~$K*FB?a;Kg ztSD~5Kj))naSL0ILusmd_)x@gQ8p{+2JW$N~%T~q9~7juh|6B zbRHN!&_L2S87|CCM!d3QG-+_=G}kk!oUjVBgXRcj*&I75>)ogu(=9@Ub~4LHh>SB^ zWa$>!x<%AQVnn-rq;yn=$;f)RSablcs8>zUT7?IDhpfRyANGILE3)r=J+l#~a-%TM zjaSJs2m%SqERg2GWb?Hvn6>Nhw_;OWySgw3=S%D=`-p{;L9VzOnt7}=&n}1b>1sv! zB#7H8ND7UHQA=3WeII589XM(D!2~KDy z!pAE>F=&GifJtKxwj+=#RxHywqafPVhYZmfPi6AhZ>op9-N4Z_LC-|r#(71ZRpimK zxL$stoM#q!)Y1N$!B|%z6P?Zx`dK0Cv=INCCkVX|KS(c_(722!9l?1qtk#dyy?_^! zCvrguUv&J8RE2&2|1w$4&iM19>sN-yd2CN`NpYS>7xgL0vmRX}+ge_PXir;brPpEw zdV#Fv)H$zl_5+Up_-JMdiIo00FhgxI?172^Xblt(c^4AJ9d;!w!}*l`H;z3+pla=- zNdE7zqR+WcakAIeSI)tT@&7NZ(4C&^tS4Df>azlR=&wnIeKc%F@$Y<`zWPb)b-X&) zv7+iH5)DTMqCGQ;^@F@XZW-=O)NTeC)2ByVgIi`~tGABkpUU&JusVCBTu?}zJwo+i z!Ci)=+E{R>aV=t^4EYO8JRxRvVc{xSj{@d!h40)j145Z}=dQ&L;RkrA2~Yg_lF5jb zVFF6A5ka4WvvLqT*8Y8+e2RU9B@!{&GCUz5^VnqJ{Z!zn2KJJ_l`fbEi5)~Mmd?X* zi(|uO(})a!`2~uXZp@hu3g}{0_NjFQdh3IJ*caw{X9iM}sY2coa*L}DeB#fpG@rmM zo(b!Xy!^x@m&@Lt->Y(jh;DdVfj-TJNUlDKi2!XlM6Bm5Y}{a}gEbp?hM4Sma=u$g zMfN5~uTE~s)IfdY5ZL3grH=zH$fkjs6%-ZN8A~9*=U-7roZ;$B36_V9(bXSQ<6Hup z;0zX27~zEyfN&7fD-mHW$!AD;chq7egV~Dv22pegjD`g`ylQbpksKHr_@qxcpT;KC zThAjlWgvbSFGvN_SS@+*c_H_!VWks{4C&K?-S`69fg##qaco49dIA3)L?@^`WajtN z@yh1cMUlYYJ4BVJyuWvV`KYX*|Mw1vp-H`9#xeL;E{cpoMC{qJHQVWlx3+A##a3@E z_%p1ydOL=Lpn2*o<;WJt=?Pxl(c!9;65-_urZLJ449LG26IQ$gMFO%WWZs;*w%9ewT{*qC(V*MR= zaZLyImB2~31qy#9N*1F1twQcadr-G83x8*Twu3wMKsxFGxd!-Gh+FVmiEpo`cHL8B zw%w1A-El1f-uY-zDVE@>K@YMy+cx?OxjWm=ilGHB@MJ$qLFJ(g*ad(%4YpmwHrfF! zRA;-bV0YPeANGs+19Yvx=oX7vpp`w#{b++;58;8{j_R-Dz(WWV7Zhi6TyrXJ=Vzg$ zC$6?IZv2Vp2fpQAGy|%A@qh>mCZK_j#O(n@*&Ej_5FUrV2&}CUpT=7S*ey5b=x%cC zUTm3*i*?Ht$@L^;FIupN96Ku;wPaBUJ)rbbtle?~(XRmBO0inh;yxeDtyJQy@dhuq z=i0^`A$R54Q`pm|a8;n61~TClcdmT%QGo zMG6B|$o1g;r$2i9vmj_g<)$$5v@r4l4uY>oQ3@3}o)_?i>T`>jsm!1jf_4<#E+>GC zfLka9U-mipXJtT7Q5U0Jt`unz_(TIKfx;HU+i1APZUNl&=&x3dhjOE7P%2dUr5Kw> z{oZbh&VAhig9=QLqpVYEztA^}qi7HMj%V~k1EhMdMh{ET1EszcBXt2=fjVXC&D|B; z?(PA7K|l479i_ei?R}Hqrm#Dz=__TIjpp$@&?Cq&7pl4v9x4{BXx)v7D z6Mq>DIzNwV3bZ(IE_9iiFD^8Eh0-|}nqCRc`c_e)G@m7l6vqROuw*&PZ^cN6bq#v# zrN(fimpzOC2)Q`oguCjv*Eye%LC5-;AWqI zBkRypA8ipCr4apIl;W|k500Oq@4mREoZ%&ghzrFKSe?djJOe`#KB}*>^R0c6YXCG( zj(34!0rB8DCgAE?6R1O+BxrAog$s_}s`Oj? zDC(AM?x#k)yI;VEIq)dD^iW3WMHrhdJ)TiI4`a($7`EmI7-GPyOLu3K)&Q?AJ(N+J z4ZOPact$BG+gzaW76f>6fLE99&M1Y3?AN7-GD@?6SC<~oC|v=({gn=G?H^3YU2|^^ zB;dk&IN#7C%l&|yiAk@&eL4Al=~?;C*@xPzJxW)6zZjV1_5oVk1_UF#7}|zXYTJNw zYum+2+t3yi9UowqlA_{sP((lAd&Q;DvMOj6XDYe(0^Q#Qf&Z0hAL!dKeFD8bZ1^bJ z!*Y&a5K#R&aCM-T*1(|jCP)jVpl|m;dmQN-b)NJEK18-_yp67n-DV*;f8PSmE(V7& z^KEw(?YmsNfVB)Uy0T2UAMHT%Avd6owyH~yyLKL-85hu2RuJ>%gdR@_{#^>v+}1u<+kG2=@z;nw5FYSFB&#{C5Rvo`wq}oc?yeKahO^5FI?AVo; zi+!^eE_wd(%f)41x%tBz-n+bP^V6#bJlSjV)t|io_J{dbPQLdSS49pSOHIaLlUi)a zV6eUmmzxW zjcEHIg>Nq&@L>A};a@HUCN5-y$)Ze+fdK`{8HqbXv|!@p2>sec;tT4_n=rNyRy^7@ zI2h)Ys9%G@&~ek`IVoy>aZ={w2lF}%IE>@S;9wj9JseN1KP7D*q9=(VHkR%XIIho$ z%c0O0BPhHMp~Ow-fv&1r^|K0hhJ~lIS{??TOVQ(yfYLL=R89nR2^5Jx!lBxjhIWqo zGX*L4>o$jm2F@v%Wc0Lh9mYN#m}R?e+c+%1cY0gdJWMOWu)w@I0dnP54IMx&bzoS) zI~ph{UyggAV6t7~**;vM+cn(IAq%<6D8}$$w|jNXzKj|!W@bS^sG)#{2g|IHYDsqs zL|CIdKfK=N5vtYJ5y4;>b#`iVd<2e3HJbfnO~1J3KUY5YsT~dPeRt2w=Ie{y6TR>J zc-$K|&G^^y10ye~y#6~a)epWqCI2$(K>qJuf91hf`<$wMeD>kJ&$d6csw4h(wfy8O zpLzDu_J%D_3_N((h6k@N89L{hH=lm(u_x|nUiOWj-1(=%RmtriFS&Mg*;l6T|L$ks z_~A`!x?g&G>1R${HU2*5h1pxDO<4Nz{aaqW`1V0RxugDFGfhFczgc<{f!_}i}@fB!GLQyt&g^~BRp-#KIL;_%#gU%IyV`LQ>5?0xO}!F#^4 z`HorlKeK*VZPBX#c=w*&AMJkVnRg$%Z(V)kfw|v4eqh_Kd%jvb`QNI0>KYN8dUk#JuL0|G4^zjal~{Up;Zs7r);t z`r2)8JkVM@=i}Sn7`^_UTT_2{{E-Pi|HYK#gM9`Mnf=g^6ED40vSa@L+4aP}%@Znr z+w$wm$Mf%wy}IGS0n5t&W57)>-SGQ@$1YrS)x96zRhz%yPsXoitor1^uRpwG#~sz{ zesJ6BtUs^n`Hd8$UpsE!_nRL0&pAIB{ zho=5^(B_H19{a+!N9R1W_2Ie)U-|nR&;H@MYo9y(qxWU<&wc*V-uUS1Id5)z!`=Vx zwTavQa%1nU7Z(qF;PBH;@8AFZ59VC^vv+n~I(g?K@2uT+!kPTY&Y3e;{y2Yo*$+Rt z`|&$3-1ynYoKFTG99Hs`KYa9vv+W!4?cX}F&H4SXzg{x$9d~H+9S3%P;qzBcPL2Fc zvsLzC;<SjG_0p+#PyNTKo*kn)rgzNmSl{vW zj_-H8(Q%~1LVjfe!tf=cQS1=Uh(qGfBF7kly~sJnD&t&uBM#nR3i00G!s7J@FG09J#=gfYhCe9Askff_5cnSAupWXjg)EC1_WIcErLKqt)*i+{fY?hig2pQd|>oO;kM*3tNm)zhiM9 zhig2pQd|>oO;psdCt_iXvFdjm?&EQl;+lYKqN148uqR?+i*f3AJnp5qCg7R~D2|L& zlOpy;Oyh9zw-na|Todue(Q{;^niR1&Vqz=)PQW!0cXEiM=g3GkDPnKL#8&*Bh+oY` za)_hn$VfFQVsFI6R&x7zwGQ1i-ma!7DMqI1uEpJ7`wtbvFxk=dGalzUpMk(aOn!bM z?93G^*Qq*G;40V!6@=1pFu5SNm+C3KG*}4)Q!}#&i!c>k1PJy*Z0WW5VL&4EIZ_(L zlgxmW+Gc;~Wa9+;OECkZVAy!R+ExtOiqT6krnO>>vKajpV}7BYo{tum0KNq9C4esh zdqX9n}@S_1w`#2x19Rv6=fFA?+F@PTf_%VQ|ZJm!cj|Kc# zz>fv|Sip}3{8+%#F3(5H#{qsE;Ku=e9N@SNq2UemvmE1AaW<#{+&m;Lq18 zN&#OA_)@@^0=^XRrGP(QYncG}34osf_z8fY0Qd=jKVK`F2>6MBp9uJgfS(BXiGZh8 zQ8OrAN{C!0r#MG#&RCs!FoxK-03)@MnnmrPgefI*n%v@uNi}ivj9Cdy(>K-`A6Cbw-A|{MOc_r z!vigW2U?0{!ZP?DE-6-E;j;=pa19nHvYpuBiW;96b{6J6wTg|RSA4U47oO=AY?8~R zy{tjNyARKFVqU1_mk=#3P~eA&`J*0+<9Mc*XjgNh#m^QSG4Tr;(^fpwTNI3lHJ$0r zg1uh5eR!s~6u1e)(WF})^;#XrGo8ujf`JPh=E0B?+WsPXoQYB4na+Kkx#IVisH2ea zW2S>SOPv*FHlFyH3z0{OZ4Ocyc%~&2%mDvru}DdsW5KxpC18gH4&j-W05^!_QLpAW zp6RT{Qpl9qTxPyr){tBA>_Ls8aBf8%Gf}sK7qXcxAj92wrZXR0t&pZ#F<0gJmg6oD zdo7RPnU)b}HqM*mKR0x0(dR2(pLnMGWUbyPW1nmR-tWfqym+tY@3Zi}o!G$pM*OcA z(plYeNs_BAY5{Zkb!U?(&a2xwL%}T<7k`*#+lQmyj=UWsz?&Ju4&+|E40lxn-PFdr z#ASMAd3d_sy9t2QYxo~Tu#v*E1z!<I$O$l5#M4I#)gs3j8t0THxn^;#?jh)4n?3au$Vpfy%(Ys;Zn(~61~g;r~6OKW_!)N*T1UzZ*Nx&QynT6^t4pq%?VJ-?gn z+H0+u`M&w)d(AiB%tleRa+x87Fy>_6X4DyVx0!YP7Pzdsx;nvkp&n6U;L+H~YH?c# zwX9xWXRIgW`rE=AH`Z+=u(95#Gk2SDtGsG;xNO1lnp%+&UAVkzfQD$3YRPrW~w+lRlIynRe6mt!wZ%! zUsxG0<#*v7`EE6}3y2m9MNVTUISh8+}%-1Q|<~ zS7qN2Jgd&rE4!svdL*RRcTcacEvs2v4sv`R#4$MXf;^ZjLe}i7g%J{lFv6B$Sz*J7 z7=|z*m56CrA;Ury|3a3?w4*|Vg^AW7)S9M<#EiHV&WeUDOSOxILPoWS0h2Hyb8_ko zDeMb>Z8S=S9ef3iRhfPj^2lq#j;@VI?kKBTw6t85WGty#;t5N}7p|(QDX;QgOG8V` zsuqhYL$&Lw%f;02{P|VoYeW|A)k~_xwCMc#tE%`kJ!Ag-h0B*NEniqGuCnLPuc@tF zGJiqY%5p0^vaEdB@|ty~2-lV^SXyp~nDMEMEJH}cjyk>i<@FyhC$r@q4D`coLDJqiI6p;)`r&i{$Fc}7* z8*(i-Tq%L3Le|%>Um=~<$uLU8v+_!W6f@8y>^%tEwq2`0xP~hxn8G#fs|}M>oaju& z+d^JKGEn1GIPs*#?oA1pkgIMn*K~~uW*j#ZIcb<0)~CX;}i0VzR)^H82Wk zRO(kln%DT1pn-)ZFq&SqDXmn)NUEWQ7NJym%qw?ArLSf%kHf1c;u&;-j15*thee0=jeF4@#1=ct9)HC(ucuyRDXoc*Hp;sg{ zT?xY~0WI!ah(nZ$i5A-M7SlKM#J9d|QkfuYTtLPR2+SSe zD+vfE+coU5Kc~WvChQt3v5jAy&owsz`cOgjI3BDx6-0?xA!EgFJ#@j5TgZM%Prh z5gEsKSa!#^RS|}2K706=-!>|2kRV8Ks4@{!1cy=tKY#4CFRxbwcUvQ$dHc;Dnu=gp zpogD;2>~eK8niiMln@%Pg0jZ@aph23@>NDXc%O_ zYfOhHFmh~+4PwljhBtvXk&;T%LX|I~tNdzMSaby{qAO~qxfU>o=B@~pfLwDJ^vuB5 zbs!q5UO_qV1|3i?1ue6vWF}h+2;8VlV6bdG+7R#~25(@QMUQe-maFGa$F zSD9wd0?80Rzu+cTNVB#AubOQ@NUfwRSOJX^Vcpbly4$S67)`lxh1Pg5$#FgUZ;$w@?@ z5>~CWmL+2{z7z%U3M5VAMNvf}!wn@YFeL0|fX8lF+0zP0gRT~1O4>9a^&FyCv0U5f z=4NupZloec%p7__`gJSiQAs$&|%{L#53Csz;(8}RB)uO8ZdnE}cq zwHx*H-^#ss^?F>k(pUO&)BB()IAT<0Ba$&8YY;EsA%V%`gnBY23yn0zGIY=t*DQ=t zajIL2QwCsSwNRqIt7}qB3j-L1mM)|cpyLePGNcQsS18O%hSOS}pQ~}RE8>As&t&LN zaYl()4adan?Gf8OMXU(`hr~K*#6|#&Le#L(BQ{gFL=6i)VzWVP(DDMr8UeAub73u1 z{Opk;(E>nUk{C-PF$xk<2u`PwXzP~XbQ*~{ATelpeiGH>@EP_SCW37f z{*N;brg{XzU|FThNEJ@qsI6o`!orZ#8$OedGf~2M9sVV{0@EFom`^ATP0I=q3egN) zFdQwtBb@}p55(o(aOish1m*QKAHe{FPZTIf1_OXoF#+4E#w6qXD7{|Unn74+;#`Dw zo#{)0z6uViLbI(iMWiEWp@~bUgCh*;0}P<_UXx2GgAF2Tog-W0aLf_T)12)P2erl# zMdffz2G&C;4|9qZj7ySHyhc;86azdpM}vKOj*ej3@FT6H!5LRY6HZpblJM=o8FnLT zb=4UsC5gsvG!1()ibAIkVyI|EA_S*}zWsKL$W$d+#L6&5=+O|M7HJ>?O5l^GU=eB9 zn+&LzJOEduW_lr8;&Oi+&(d5CMmT*PNLeihK)(tccw_LwHyM)QV5I=|g%YNGJWDZ> z)y-K9zNjfpS#n2K8d`;lp$Jgfvk)J2CJt-ZAYuivNklFo2DVCAU;=ujJ(ysR2@XI~ z7CB|xLN;Y%S(ED+_8fE!l9C1i+p^`J9N9}|bNwTaWP=ujiDs_c>ZFE<_*qk{hG?9% z;)w~XBra@W|11O*l4b!-$fFVqRu%h!3}t*O{+0Ex#5yR1ffYqa);s#m)Ndy-_1EvQ zrh}FA!l-_)H4`cc1p&=` zZ}SGCrYj5pb6olmh_VCWWM(ZA4UklrZ#5vpL$BsT^y$4iwd^{cdPnbg@4i~L88s?| z=@f-2maqo^v?`(lOg`PH)wr29KnzOuLAJ^Xd+bwYK`n{PENGU{k0zL^(iuuCgjRfY zi%HzH;$r~~CQ@zGjf_Eagd{n(G@v4$J4gr*H@vLUF)CLKYOBIhtf^s5 zbc6rqpr0c>3BALBdjWK3uvC`{Ea)8iuLyxc)2)E6E(jTkvFSy{CA)3RvD-pL#+5HKC7ZjtI6B`tC!UjUI>j9YMI$xy{~W>&D+ z!KCJ={@@ToZiIFp#uZ6R1*xRrIGNDAMam@^LW+>lvzH=_FkQiPVC1Y6VT99HkRptf zKua;3sT5%dDMGc_7Ge5i<+T}7T%CtxAk!!zI%`-|SP=y0U6F!-6XR&e8>Y{Y7u-&b zp+sYhmsa~h4N{IB0@TT-4B65{_5iP`Aef|hU7d%iF9Cl*K(GZEOpFBKO)Vl5l?#JG zs{715&N29yGxHK$5!lWkB;HV9Rl>M1050M|q&97usfw*2Slb?@Xk#ZB8T5?-lrvcA zAMhiE;d=xqMBJVNQK4nZ6hZf&g&dyJY*4PV9@_Ej>BW)#UC5!jh5a>)xx8RLL@LBk zc?V*(p^<8|mx7SYp%!t(IL=VyKj-mI9zILx&(<%aB~x`Ia!x-$ML;^`3AT zjfO)5#1`GzAdX1E@S1tZ=ok=m&qK&%I zC2q)sdZ6atX<5)M2FHl6M?gz3t;dykyV8FruAvg^?4M$NIsVuzdh>Tl;zB zrlGW^LEvx|v?!y3OjbRi7;4WLi!rn_0>;P@DS33o0FVf7sF=Cy9#tZ}wV!U$9?(>u z>(iuK)aU9JJ91N0H+62&;FTj!4sh1Y7#j&78Yv&gA{XHE0 z104N3;UK$5(tLP}VOrunr0<-xxQmz!DUC|N*1%Yny{INwc( zG^;@X;#xEojtgRu^#dT4QBE$k=i9!PLye&UzS==<5G&LhFmzpKg^gEuF#x^4VEoy3 z3FpSgOxayKPERLj&ECcVhRn$qn~e5Am?y%wKJ?4pS`N!G1G5?fINM$b?1%+}iPbf= z0sE_D*SrQASqFQEJH!$XytSEGcap9}YdYd$FuAfmp~u*0dE7#CItwO729X9s_SG)k z+uVfNVn+7qaE94;!E@Kia02SBmT?@bE2ibZ+exKzVfAQIgZrsR8m4v?`dbck#p25B zaL6)Y?Y2ZZfUqm_6h32hLP+Q}rvww5PiIx3)L8o8TMJXq!SIs>KbsK3^_op2y5rG#}|@TMwez)aHHgJmkgbl2J$X^3vKG@@6dNSR7qXGs4I zi0)cDD;*KqYee+gMssOLbbaZ#Eide}_t;jnF1*oPPfwFtZYLvL!Ekw<2z#WrO-W>9 z@DUZmU`33Dbdxb1tKW=D8M>wh5A~yFW{F&h9FwdssgRl2N6w`%RTcAmVY$0S=!b9k z56}1y@Awb(tzMgs)0h~!`zw`a@xwQe$?a}M8)iwQ{vwLwisY~yH66OhVvfP^iGLx1 zWvvf~cwLT2Z$|y`aH7t(v2=Jgf=jK5{GQ0Cl4^e zA2)c+K2!u^u7?R@?>tZTzzvvZPhdyzT6hx!-URTFyL4;hhvF(K8@3RM8fjpW zn}*v|YQPbBwMH(3j-UlyAXOl(2^I}0;!w?;l!Y)$iR(Pgv`=IkfAc4ECYy3Y5K&n_ zq)YKVhwBkc=`s_Ws@O6DNuDH?7As&S985P$!F!(N_~wQgH5gJ#r9j$u%~>2|Y+n-j zNN>D@W}~9_EGj7qxo~K5D@IsiXCh1XMuZ00Fh<8;&dty2$r z+V#o!xV zl)50sZ7BWn@Bi&(D6Qs7&L;0Y$-4E)41Die{B$yNL(1+LN@kFMO0gR!Gcuy zoF!n*e&7NuXhIV~2%_u>irR{;XQ%)wk_c6uf~4ULb3=I5F%Qy8>_r+nCyRa#^-1+} zq>tYZjREsKkVAhE%by4uwWT$ZTU9LoLj%DK!g3@hoct6uO#KL_P?5u8pgA-k=xadG zmuwrr`0Q{h)#gl8$uA8Pbe&G0Y`TOnFL^5hJ!0}hE!|ZNg%@XZE~X+CqSC!H3r_}O z*gFQMNNF0FMhb?EmgjOAd?1(gG9``6I8_vqy(n0&u)$@ns&saa9XbP9NdAK^a201! zP&mxKph)%yw6&zs_FoZ6Ynn*Xn0X$|vUMPt`MZl}CVVY;#KCHAcDdF|9hXVdQBE34 z9ibXdkuyvh$b@^6fwzNXn%$IS_PCy8^z^&Ob;c+`r{P2NuJB>ec&Q3HG(CwFj;2H> z98HM};4nNK5;3+;+YpWYCPo1~%=~Vk3+vAb>05c#7uGjpLzM zdvBdN!+YU$8?%|RummQ*w3iX-FE5Gow-5P7#7Sr#7oHeC7dT)^2s7+-d;_2cw?g$j zLVb^7QW=I|B64vf9`yw!JJGDD^7~DQA=K$2?jSJ^qHHZa#h98zL$)NmBTwKg0~A^V zR==1eS-{2b_ynRa*^jnBBZwjGo~0xDNHJWVS|O*qJ!hCQDp;JxhFm(e1B-Hm2yS%e z9%lk9MVYUORG_wEi@`9>So3s8ejw=l&VtTAOVB`1Wg+@}i;9PVdV;3g!r`^Emwunq z`CsRfgpnUf;OHfmeApY|+77d*?*wS~T>tBvGm&F&$)`PS^&DD$1byN^fYJ>hm~e(B zgep~9;=3(1r}G7Fi&DTcqExLuv9QGX4sNg^CkN@{o0)7|BBih96m?uHm7-IJvcOcG zqMO9!UrhGbJ_<>~`U0m|r3Oi92X;x)Sd$)3ZQ8j zL^K$Z#K8&X;}F)!R#gb@*#C}0)GCvNni!5|3YiZpb_%raKpofziW8Qf+{F<+pF0>W z7r@MHch0z)UUC-)Zi9@g=_hxyOgirKc87fHD?;h3b1j;+>6egmEtsuSmf$?-qkoe1 zBbgG`xq<&l61N`oNW2at?$IwG5ihO!CFWe$6}@{>^u`ii$^u6r(pc)J-~RWU&*tOxn%FjMO}>on6)%ZI zp3&;g!9y>rxZ&-j;IK2z<-A)T@$+wesHKCNk`3nuTP-f3^h#Qzb2(*U@u3w<`!e+` z|5~6tCdb)UAWsxK(ZXJaBE1Vl0 zTec2%jC?&YB*AMXEu2Rgk{Wo+5V?Oy=YiwoMLvuRV8ZzXs=68Q?zmITxD{Y2hCAa$ zC=P^OKTQ5e$jQ`hkO1v*rpO~h;b9aBs%=>Qby%v)wqf$bu+Cj>9j>GwTUYkQg za6}3EJzoLoW?e;y-}hkoQz6H)Z%$Lr6fBj28k67EZq^owFW0In?MaHysT2QW=F}LQM z@be`Q|Ai(zh{v_+UBFz zFx6@)iKC}#mRABd6Y%m7x{BpIFAY7Q-ghl-wX?#o!*XsQEI7@zn;x;S?};D|MHT?& zwgIUHqZAIsH7k>`=A_t?M3l548Q;W&gew|$Ax+hEFAg2lArJO}(D%%_$Zs);xb+P& z7w2#AbUZq@0%=-gKA(OM+jDH)viXX+GNRhmKlsOE)?Az}WP>07Vl>+N*(HW)dLUI777uMP4zUSR7+9$kU~GU?H+} zYN)ypV`gE5g&3tS!~+Y%EIc07Wyhl|Qs?zP@S1&~TB&1%nYvLX+rW#35!5523_;)q z+(=?_KQY9Efjr!WTdmwv$e*uZCufB$s_^zIkufuoO$j5x*t}&u9IJIRH6Y)vD1aM6 zL@SSsuNV(Ejp_s!FTnGy!ir=VQM|X|n|Xtam=+?x89%*nGx0z#j;s%|PoH9X=Y|?J zsR1n$bntDc^|Ge$aon5?sk|S{b7#*J@EX55U3(;rJlLMUZS8xnfzdPK$zE>1l9BQo@eY>vplhzvL5Q|FAxK6^xV zi-D*HBQlgSgL?H)jlrphD)fyrd;HxSc8qX>)q)jNk-C$b;e4+S-b>vrn~{=&gb@v( zipOmsp8%ePetXOtdOoM-aEXjWx!2z7jk{p%Nw;Lu7Qdm>gkXzWX@~t*2qSP!ctRjh zb@E&FEtu9JKqQ-yLdOueIoNA9HDETx&+)nzPp$e8MU*dI{0yXZ7A6arcvuiPEGdw1 zxv?Z>B(bssNl;|+m8|u=82L~CL|y|Y5&2%s z@VyvP*Pa){Oze9x6sEiwo;@!H6i5orLjR-W2(0`sGZ0!~B@S}%1;&uUP#&|=XABJs z;xIkJphb3OMfe8LgidxT?t@(D*_if}xq z5iUSDb_zhar3eSVDsV0V&e^uV5Hd42lEGenLx_b*JG36&Nsgj)#UmJ{{e03Wt=E4i zJH)2aahNa=T)Xi+`5m0-&Vo2Fzo-O!M@Mv%8<*m$r-!5Tq_v88varfcW>>;tX3OJ+6$lav;z;qsMKz79C^SSt7W-be1*GXL zG<=|elyx$kA5TWSvSc)AaON~OGNqlc@?$}B(9Y)A$Jyv2cdlE6@-vbdK0@TX*&;)? z$kZ*OF48jEPa>hDI!s13!o{Kka78_8g4QcM*tuj4wi&Veq#lv`=i|AJIF%du;9P|) zfgq4B%>Zd0OeP<@f?2--KV+Nf+LigXbG2(%*vBoLOLE1v(9G7!Id&7O17OmagY5{UiokUyXA~^Ckb+gej^(Bo@^IaGR^u)M2jc`i6MY-!6?IaQ2ixL$ zorZFrnB+lA`^yGnU4=|^I>qScq^z@|{R^I7^rHPBxnV-%(lS(70v5q)xoE`W5HH}x z8!}M{Us!BlfIaPp{)fqGb|zdDUB5Cs&WGSeutM?@760tuq&}m0-h-25Thq%B?O98% z)Uqs3uYa|iI_F5vf4uS{4u-xgkZJ0pw8gLoDgr10m1iPR+}~HiGMrD?f8*HG1gh3P zisb(aEBajc45`u}q|(mIiV6QOtk9ia@T4hNG0|rQ^w3|P3j0LZjN%_3IeYz+((8C- zwqr%rUnCli3PgKm6zd0h2@ae%#oEmPW9saRYjDGkZ1tAZ{2f0HS)F`RE-0iOl`C5YYF1EGU}r3$a!F1yf+L$z3+qDt%QE##Z=8x? z6Py5p3M0Hw0uatzPefQtvagWx?x@8`2D24+Eu!cW7!6?LqZU^b$$_DPPx^#&BeuW} z9Dv_sAbtoBNGsAnp|xJz(tMEw%6K#WG4T70j>_bR*>;=U5SW!T0@^p;`g6QVz^ znZUjpI0?5%;V(zYVzj>lqC|+_>#1G$)R1ZS zBV>16OMrJFT9k`rxT?^DY|gZe{zC4}v@>F8!3#V&gi=s>G!1qUAkKnq*RTzC01MUG zVJq0(w%v#QV*UVKt1!ByVh(6!&+-u3U{pu>52K*Ipo=!H;y$6u!IjCv74Qp46gLd*gnm1jh63u@n5D&%W#&kpo#74VjewW1o|3n58z$wiswwA_(n z8}o$Ronud9PoKb5hJIF}-7;v)Qs~TRln_$u_e#8XO|`F2z&KmT2FETY#!GSC1Pn_Q z2I{Np!TWcA^!Nu-(1w;o$vbL%N1cF!VF(4K(6^ILz!&Q3?P9jFxoT)tHwCx5TL4FS zpcH&L*e%eb8v$3X=pz5g6LOb!vK%yeRI~#Q{WWwCtT3=!Qd^^JWwCEd&D~W$d%Fky z&}wNDYth4U^g!t?2gNR6%TTBM!wC&{G7T>1rxr4x^cJDLZ^s_5n|mnw_V&Qp3Gg`= zR{(cT>tkpQSs(9VU&GeZ&uZOS>MNBMFG0_>_|ZlMxI^zYT8(8Po;jwJ582;S^S5W< z8_C~u^^Vf2_P9XL0$pzhY=7{$S757mLXN#`V?Fe;mt9U;KZ9$UvT@%d(a&nWxX{#9 zN_SjnY&kgVYj>H_V3sUV91l3cl9edG10$j5Sce{at1;~EZ4YCQNnBmq&MJ(69-s1; z#{fm1_O`DgR0*zh30xdcXNl{@TzEZCs{8wB+wK!^WCMEArN`4sp_=U|rH1y!i8=J$ z7uU3NtbK?WDTcuR^;MR+w=Yr=Xoq9%U9?>Uj&L3#S4N2ycwUZi`W6ysylmIl8v5Y} zFu*hkSJyJ9wr~!iWi1u-*LNsQ)?S5LBoFn|*4{4|F_?Nnm!3>39Sz@@tJ-eM4caci z*mUXMw9**x>e8cWrB%SIOHZbiW&&@X#+w)51!c{;bZ=T|7VzrQqiLnkg%i5;WLjwk z@b=eu`v-Ve0WV4~$9&p9n6JC$-aJUag`IGQpbwQN067~zu)lpJ`F{C%`Of)*da8X# zSA6GeDfbUh^c@@!&^H;{hEnL&@c|dstI5=>#!D1M+b*#ulA@vuP(+LO{oitESp_tU zbBjC%9PICsz|+cQ95Kx^!<^>8+3!O2M(C1MTsouka%2 z3%rHg;i}$tyEb;Mh2V^PJ2<-(9L8L=AGM(Uplj!`mO(*RHYiVMEGON7W^yl~N0P8} z2+f(Cwz7(tn|0mZ1mYl+hj5Jof92Z=``bp_6ujcEphVro|I+u8`}MuyMSZV0sqXcg z3#Gu{k?srCee*9KR`>GPU+3MO-(;5Jeth+eiM;Q8Fn1a5B_Hl6+KKztOAhRR8~1U8 z|5h2lQq;FjT=$~9QZyaC`=)WLuM`L8EME4br>+!NeDSsqZhrU5lE&xO4tS>5)N4O} z@9htAub%qA&##FbZmXY)!RG71<_ClIowaO69Ze!XaKKlB$yNB!1-TGCMM9Rl!grbS zgvQudpmney@J7?YL&mXw}T>JMEk2;xMSVKM#~C$^&+;%*oe zsOt4lOwv{>)_}S)gz4qp2d30KNTEBVZzphrZ#y{%{~jX{as?br7$s_S3@WHxqwvje zE0}yacE5Is_^f*KCXGXb6;($E2Vr~}l$5T!2K?eOWie>itr~^|w9inzFc|C1u0lY` z<{^sqy+Z<4Z0$itcp)>YA+n=Gf_Ud@bhr+noJZ(^I2&v6F&f~k3u|v2s)*e-G>C)) zCXkiYsku_YV!%>>VDk_v`_shiRk57_bfQp>c#}?}*Mzt8`r&6*n^u$d5~ zJfYj3Ov86}Te)MTV#)52fs14i!NqYUTqJ7gB1Z-Sr<0>~uf%s?r1FHu(>O|@+cwJ1 zA`7{;D$;{%)-`+6YPepU19qVXog5t%n7}BtYQ7zMSEXi8%pC2yRYPIG9LDIK+8i&m z_l6tH{;{T?-~XShU--n%x_7^|Z*}vHMeeEI_k1+|jaz5^Tj}9ZmzCf6%{`TmyfZEL z3hQw0?_PWPkyrYhseWqivHd@6e|Akr{OwBl@fSb!!^_+2wmv=Z$i15$xpB~`dyKTm# z}DKG!*owp8d z-uL>OxkIM@=B0;T9rS}Y9%aeMe%8&mKlRw)|9J7YUpo2TU-s5_ zd~^5H&pmg~to2L7^A~*n`l26=yRBpYt2Ykb_r=D$=REZM#$nY3YyR=h{d+&$`{?uU zJo(^;+J?jPzj5;L_TBe?se0er7Jmb**#*yXy-n+Ta_kRkJ z;;&=}znv%EIxfV5=9m7s_UX+T51w3GJmquW=@otT&Nm)zsh;=Ioo`&a@%}sN|M1k~ zlYaK|X~{?W3?4G~(IKY}yftR$!vDSd>4S}v%744(*X2*;-WPji(<1{`l>TGDtp{%Y zecqEJmt6C}NB36eF8Y)4t66J4e&j2UE!%l_<%aLxxi;g^Yx@3X-Pb?3;k!S6Y5S)i z*z)NuSKRv0!I!QdfABj^5C7-9?+*X+`}3Q=^8BOIe>2G z{>BggaKrU49Q*!zGWq8|e`#-cV(q*)x4+>YdguDYoqxHd_qNGJ10O#2T+@3Gedqmo z*Z=gFyDy)*>+xT%-+s!O`uMKdvseEhcSp(hKECg%dq!@)=}G6~fk%do`QjfweB9ao z)%cFDpW5#He%N0xTkuPFX!G5NcYXFVS5K`U^_ym^I}e=#Q0uYTJI9`T1uAwmR)^8JC~B=~T_B##6ga{pi%O zQ-43zt$k$s^!Bp$JKG;>f42Q6?Z0amr}IvaKYi`#%F}nBZaTg1^v_R!d^+>Ypfgj> z+;XP&%>8G+apu68ch3CdOwW$Oj+q?`J2rNFrQPKi8-sSl z!WNgR&scnq!!;h)1Y8qwO~O^IdLkCK7^^dg^5kUu^DzUXVCa3Z z+ExVGiqK0DrnMrBvIzYZVSb^WUW^uw0sI)ij{*D`z>fj^7{Fhwc3ukjO96i=;4cOI zrGUQ_@U)MM(b}fp`IKYnsJniygw0u0^ z#{+&m;Ku`gJmALz{$jO%0^lbAegfbp0Dc1CCjkCptzshJCjx#V;3oopBH$+i{$j0V z65uBReiGm(0e%wTCjtIqt*99A#egpcd@%E{_xzaiNDM*M1GXnB4&7X4xM`t#K(M+JVtEuupq-d zC7ECb_-D&%O6mej>;10)J0x=u_ml*<2PcntHOFyJWrmhRrp$dKd)V&PHyjjp4{8ke zobEs!vw3%b7jg$`$kE-nr?N*}t&pZ_F<<3MSK?b9@>(9nJ+)KEnT_)%`OiHw?0~eh z9jI-1HLXw9>b*$zi5l{LH|`h3dp&=jhxaFl4ZJ^zdnyNhAxUzzMJ?dY2U8PWN)*2i zu(O7OTP`mCLCTFk!RdNO-h~n1$qZqWw;2z^UDZH0wec)*nO<2A?ymQ20-y~5Q8rR| z>JJG!!Z%iJ#mg|hxVZc~w^Y*KSW qnuX=plvU$@D6;s*PtNXHIC^