From 6f099c909be6f0d47b69e501c87c5cc76c44806c Mon Sep 17 00:00:00 2001 From: James Chen Date: Wed, 4 Sep 2024 14:25:34 +0800 Subject: [PATCH 1/9] Release ADPF in ~BaseGame. --- native/cocos/application/BaseGame.cpp | 7 +++++++ native/cocos/application/BaseGame.h | 1 + 2 files changed, 8 insertions(+) diff --git a/native/cocos/application/BaseGame.cpp b/native/cocos/application/BaseGame.cpp index 650835d9746..054d7fe7cc0 100644 --- a/native/cocos/application/BaseGame.cpp +++ b/native/cocos/application/BaseGame.cpp @@ -34,6 +34,13 @@ extern "C" void cc_load_all_plugins(); // NOLINT namespace cc { + +BaseGame::~BaseGame() { +#if (CC_PLATFORM == CC_PLATFORM_ANDROID) && CC_SUPPORT_ADPF + ADPFManager::getInstance().Destroy(); +#endif +} + int BaseGame::init() { cc::pipeline::GlobalDSManager::setDescriptorSetLayout(); diff --git a/native/cocos/application/BaseGame.h b/native/cocos/application/BaseGame.h index 308f293f742..0558d9fec2c 100644 --- a/native/cocos/application/BaseGame.h +++ b/native/cocos/application/BaseGame.h @@ -44,6 +44,7 @@ class BaseGame : public CocosApplication { }; BaseGame() = default; + virtual ~BaseGame(); int init() override; protected: From ba62d1dbcba7132d7b042b6a1888a990f93d81f7 Mon Sep 17 00:00:00 2001 From: James Chen Date: Wed, 4 Sep 2024 14:26:26 +0800 Subject: [PATCH 2/9] Add PhysXSharedBody::clearCache, invoke it when PhysXWorld is released. --- native/cocos/physics/physx/PhysXSharedBody.cpp | 11 +++++++++++ native/cocos/physics/physx/PhysXSharedBody.h | 1 + native/cocos/physics/physx/PhysXWorld.cpp | 2 ++ native/cocos/physics/physx/PhysXWorld.h | 2 +- 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/native/cocos/physics/physx/PhysXSharedBody.cpp b/native/cocos/physics/physx/PhysXSharedBody.cpp index 5209416d758..45f7322ef9c 100644 --- a/native/cocos/physics/physx/PhysXSharedBody.cpp +++ b/native/cocos/physics/physx/PhysXSharedBody.cpp @@ -70,6 +70,7 @@ PhysXSharedBody *PhysXSharedBody::getSharedBody(const Node *node, PhysXWorld *co PhysXSharedBody *newSB; if (iter != sharedBodesMap.end()) { newSB = iter->second; + CC_ASSERT_EQ(newSB->_mWrappedWorld, world); } else { newSB = ccnew PhysXSharedBody(const_cast(node), world, body); newSB->_mFilterData.word0 = 1; @@ -84,6 +85,16 @@ PhysXSharedBody *PhysXSharedBody::getSharedBody(const Node *node, PhysXWorld *co return newSB; } +void PhysXSharedBody::clearCache() { + // Move the map to avoid erase operation in the following for loop since 'delete' will trigger ~PhysxSharedBody. + // clearCache is invoked only in the destructor of PhysXWorld. + auto tmpMap = std::move(sharedBodesMap); + for (auto &e : tmpMap) { + delete e.second; + } + sharedBodesMap.clear(); +} + PhysXSharedBody::~PhysXSharedBody() { sharedBodesMap.erase(_mNode); if (_mStaticActor != nullptr) PX_RELEASE(_mStaticActor); diff --git a/native/cocos/physics/physx/PhysXSharedBody.h b/native/cocos/physics/physx/PhysXSharedBody.h index c406f84e140..5d3bcda3833 100644 --- a/native/cocos/physics/physx/PhysXSharedBody.h +++ b/native/cocos/physics/physx/PhysXSharedBody.h @@ -42,6 +42,7 @@ class PhysXRigidBody; class PhysXSharedBody final { public: static PhysXSharedBody *getSharedBody(const Node *node, PhysXWorld *world, PhysXRigidBody *body); + static void clearCache(); PhysXSharedBody() = delete; PhysXSharedBody(const PhysXSharedBody &other) = delete; PhysXSharedBody(PhysXSharedBody &&other) = delete; diff --git a/native/cocos/physics/physx/PhysXWorld.cpp b/native/cocos/physics/physx/PhysXWorld.cpp index a962ab35629..261ce66453d 100644 --- a/native/cocos/physics/physx/PhysXWorld.cpp +++ b/native/cocos/physics/physx/PhysXWorld.cpp @@ -105,6 +105,7 @@ PhysXWorld::~PhysXWorld() { // clear material cache materialMap.clear(); delete _mEventMgr; + PhysXSharedBody::clearCache(); PhysXJoint::releaseTempRigidActor(); PX_RELEASE(_mControllerManager); PX_RELEASE(_mScene); @@ -119,6 +120,7 @@ PhysXWorld::~PhysXWorld() { PX_RELEASE(_mCooking); PxCloseExtensions(); PX_RELEASE(_mFoundation); + instance = nullptr; } void PhysXWorld::step(float fixedTimeStep) { diff --git a/native/cocos/physics/physx/PhysXWorld.h b/native/cocos/physics/physx/PhysXWorld.h index 3315a4550fd..ac796f252ca 100644 --- a/native/cocos/physics/physx/PhysXWorld.h +++ b/native/cocos/physics/physx/PhysXWorld.h @@ -156,7 +156,7 @@ class PhysXWorld final : virtual public IPhysicsWorld { physx::PxDefaultCpuDispatcher *_mDispatcher; physx::PxScene *_mScene; PhysXEventManager *_mEventMgr; - uint32_t _mCollisionMatrix[31]; + uint32_t _mCollisionMatrix[31] = {0}; ccstd::vector _mSharedBodies; ccstd::vector _mCCTs; From ee78f837614aaf88bfd27ad217f9368fe0ad270e Mon Sep 17 00:00:00 2001 From: James Chen Date: Wed, 4 Sep 2024 14:26:58 +0800 Subject: [PATCH 3/9] Fix the release order of variables in RenderWindow --- native/cocos/scene/RenderWindow.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/native/cocos/scene/RenderWindow.cpp b/native/cocos/scene/RenderWindow.cpp index 85cd2663f9b..a5dec2749f5 100644 --- a/native/cocos/scene/RenderWindow.cpp +++ b/native/cocos/scene/RenderWindow.cpp @@ -56,7 +56,17 @@ RenderWindow::RenderWindow() _colorName("Color" + std::to_string(_renderWindowId)), _depthStencilName("DepthStencil" + std::to_string(_renderWindowId)) {} -RenderWindow::~RenderWindow() = default; +RenderWindow::~RenderWindow() { + // NOTE: destroy needs to be invoked in the destructor of RenderWindow to avoid wild pointer issues in gfx backend code. + // RenderWindow owns `_frameBuffer` and `_colorTextures`, `_frameBuffer` should be released before `_colorTextures` + // since gfx::Framebuffer keeps a weak pointer of `_colorTextures` and there is code : + // GLES3Device::getInstance()->framebufferHub()->disengage(colorTexture->gpuTexture(), _gpuFBO); + // in the GLES3Framebuffer::doDestroy. + // Invoking `destroy` here will make sure that `_frameBuffer` is destructed before `_colorTextures`, + // otherwise, the `colorTexture` in `disengage(colorTexture->gpuTexture(), _gpuFBO);` will be a wild pointer and + // colorTexture->gpuTexture() will be an invalid memory read operation. + destroy(); +} bool RenderWindow::initialize(gfx::Device *device, IRenderWindowInfo &info) { if (info.title.has_value() && !info.title.value().empty()) { From 08ca14211af0a994fc09a72bb957e8700622254d Mon Sep 17 00:00:00 2001 From: James Chen Date: Wed, 4 Sep 2024 14:57:07 +0800 Subject: [PATCH 4/9] Update game-sdk jar, add GameControllerManager.terminate https://github.com/cocos/google-game-sdk/pull/9 --- .../platform/android/java/libs/game-sdk.jar | Bin 34116 -> 34608 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/native/cocos/platform/android/java/libs/game-sdk.jar b/native/cocos/platform/android/java/libs/game-sdk.jar index 5bed1abb00a1fc55956e42aa11ac2a64892ace68..a0513e5003671c9d72280ce8df2aa4c52866df27 100644 GIT binary patch literal 34608 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
    ;$o8O!Fiey4PZQO$hC8X&eM{vdQ#Bdrb`l~j zFt3J=r_2lYBCJXn*u0lyIW||d2Z?Fjh23ny^UFVp=7&f&Rz-|yc(;u-AhJJ1n8O!E zl1Q$l0KT6P`r;z;=R+z08I}orQza5uit8NM{QB`2epeRVh`fcA{D(-J{Jk2R^sQd* zt{fKWY!Kg5X#gJuY|Y_2f=9%X5wG#s=*2w)eEr9*SiBdd2YsMHQ((Bzc`E`46!HLO z%LPh3ylx#me5@-@p7aO_TbE)%W&-oe5kX{1zLu0$E)yc3RKJXvv(FaM41GrkdnuZM zYI{rr?qLn}Ego}n#kez3y78NA-;d>_l4f83C|Uy*?=J-w^-J9y*pST;`@kKyr7+!IYN@*EHp=7v#?1K zK$Y-V=VjjWbAd?5^VKt~fo-qiJ&8z{kWUS_tZIq)kO(0awdyRvLoIFPj zgaBTr*hS3V>Kx@2jNE9_)H-jyIVUfKWG{~7Dy*`+z&ugnLDSFUC(>VnoL&#fc&xV^ z#<8_6B|yXjXsVCW3&I0vROlqjC6?s{BqU@Zj|E6r-JJq6PDOhcO06$snlFAyqW>i1 z)M~nT+6nQ>G~Vu>Vxn8-Y#rTr@z7cH)_rcwxRnjB?@1<}|2mH=`>{6*YlNG?p=&wZ z)u)wlae(F-@P7`w_ExEf5&A6?o^JABEMn$O?Juj$edFvNnYjRW?PEvOY(>1Jo)QM4 z!HZQzizfV)FGbUJ%MedNjEA`af9?O(+FJle(j-~JYN^G{EVY=KnVFfHnVFfHnbl%w zF*7r(#mvmCUvsc5zvpaiNWm%S0W)&|o!z(Jn-QV*|H>)<_peLVrolq4khm`a0;@w>`t0A zOR{(L?>(|BJ^+loqJNej=GFM@w44ZO=W6c=ogj0obqq3{Kx-F&4BnqmX_sysDBr_W zD_!1{o@{!yzRIMaTr$ogz+}-xQ_$*IMmot4 z|7N@uaPNK6`S3f?{#n&@n^Tv2ceCilp&wJWUY^V%T4YzvUIg!>f$DnIX3PiSy+m`h z^H>ke{g&O?ol~%aS}0yW)fp!L?L;*;eK<}LRWsNbhdgo!_gLY@I-;R}Xy!N)(A}Sa`FM{-b)J);B3FX_6 zQQ#$RaS0c+#Q6sWYW3@+!cy_c-n(e?@>Zz+4u(uc$B^6X%?NKg$3FeYBR;I%&Ul!$ z1EgSt5*KWkibXZdhs0uh^AF;0nF`x+mWB92Ngn5&ioPz19zVxaV7QeoT>PeJh6LR` zW3x#`60&Jz9Ka8IpE}A~(U_hQKxdzSeO;lu8E4OgT#DF2d3lNivVAkXh!(*DqZaaY z^1(|kO<2V5;~O)fR*Sysv6bT&i3q_JN`U9Lp>dYoA*a%jZz>B)hKUCzXG(1kSl&W= zR$fW9@UuU5S;gt1Npk3dgfWR22UEp&qvXk%i)RRdhHMQ$vUJA_pM}w-$?8nQ>;S14 zjOWM(vD6L53tl4!>T!K=>7?^Tq7sgw4ZvR`%_nKiS?5X?UTPEQx4=8pDfaw-jMcVN za+FK>$<#zUb4xQsFXS0;c9=-cRuc}~$-HaF^Cuix8PL0TFy>?f9oU;F@J#`HBHn}Q zz|JYuW4Sj4bQYs*dxJST3@+ZCT5m736SCMWR*7%-A zq$jP)2Z!6Uu5DRapPLKu{wMC=C;K5Ad8e0uDcP_<0swITkCOcqP3?{J4F5gXFUdj$ zQ3WY@Q$U`$FaW|HnFvWX9-vr>QWP$nj}8GTNWZr7JT@(OW<)YmvgYB1W5s8tL0osC z;iVS$rJ(gCn>LVF-uxJpm4Ue|MAjCAU0PJ@+V77Dn~!9@)?{s{k?aF;v?Nuw-J{6ki@F;UaT3-;pdVKcXaR8rGc zYxIoh10obMQMSfI_OGx5sP$L=mWef{S)1$)N~9Hoh2eO<$#O8ok8JTtbYv4d>0An* z`MzJq7Hp--<8LnQHknWb*oVlDB}a*FP1va%1A>Eg5VIZfwo(2E7!a+%D;7u>*J)LS z5!%S8( zqd7!t>7$C|r}c%Y-D}QG5}gv&I;Pe+3-pAL6Vnmd-p)rEkk|*a=#VP%S3!uFhj$jW zyihz)>4_%^R^p#BM-}>`BO5dm(cYmj12W7sU30DFhMt*&IRJW*ptxh)k{{S==%rjUaZixH#9IY{0VqD+d$Ok&jDQ`mnZ$W1_|bk0jU{TETjA; zH~^A;Q*fR6j>~pG)hNPaal1gNtzwQ zEJzotNydsU9OE@Jywcr6N215UZ$u&bThraj8~$ARly+{Cj>62GrHxjdI23)Vy(5kZ zL$MVn={`#fcD>YC?4q=C-6GRc;$6yn0t8eBW%vS<(-e^?Q(18 zq2+>FH`VVZuCbE4bKvo88&QTC<1O;nHvN0@ulQwKZ#shur4&h(j;-U^RQe*Y_U{#j?+;n6Fihkt1AW{id!%IJH| z#1>(j6pggXEY5b-G)n6qL#ydvn{W|Y1XYNT{7S#F8o1!_)Opt38{&+@P1pDU`TJ>b z@yQ<-{Tl#4&)325-<<}X^z03d4Ef#uZSD(-JZfzM;dVcyS0AG z$b8FutRnMBmb76RJ^7v{QCME7f;M*&xeRHG4#+Z!>C`;GSb-(E$Q=3rH?P2!{<_j4 zdv&|B@`H+eZl`Q9q2FBjsV%e!_Y!jlqN#AzxB-TFpQHuTO(Q?>Tt9#42HAfSfl$=f%77IfVZCFnMvhA^&9j*5pgaBf)wtX!oef%!A3Dclv)Rr5Re#@H?4V8h$CH8Jn5>+Z~RIlaT4A!^1dZNK2zLOWL&=uPjXvg+GPAy*;}mfdFf|yTil-=jt|w1Jx#C z^2C9s9+#OgDOUMG3v4fO;R&?CG~qNC9?gJI_nPi-W-P@lR-jd#k>mY^>Dr71i+dfN z^=T6{|Hzw{5Y1JPg$e^H!su+%ue-{(dm_UqzOjm!*8*vR04n~KLl_fCY0*Va32I=4 z=638!lC{gaus#Azo6$_XTcQ3<{jV%U$lluL>PRKCwOf9l(P|;bwq|?fF#atpGd4Y5 zK6H!W(dpB8gkiBsgWV9wcovmrLKmcWF-GE2Q#zp1I+baOwO<6~7!l;oMiW$+H6ib= zt^3WVTabT0E>vtguCrfb()cB3!SYYXMZna?-pIzpUeDIl$X-Ct(o$c~z=DwO-^M6O ze${%87mjPL&~CSx5nA>KZ=P;93?SkRD$;yPsCW{fsP9c@txB|pNz<>a8!gebejwa# z5jMBN*Td`3HJV zM{1!UiG8w53R!>5bNX2B0ya|CV_Oyo94RyT*9ms&RPmY){9=`N!&4*$Z_DO+;c(Xt zrD1E1#O{44os8&@mJfXl8@A3cX{p7^Z^f7axl9dtuW=ef?4kDKvY zTZ~FB>6BgaR76?K{%Z@tADJR!^7fWPMBI)R*^Sx(5~t^NvkH+p#dGbTWdmRvqGX-9 zZeq7{&i@zo=Tqcd-p~>9l4v@72hj#CglLb$y39q4W1< zlAN!^tO5uCAPfuu!2drm6G@vdQ4{(PpGolo;XP??0ISE!-GZBR* z#bEn1JLR?l@Xr_M6P}eD)OzW(9z^`$b%8DKszx07`jL+N_zDNOfVn2)xby+EK!0!}ATQqb#jg9sIV$v}BUK}7uf z{(TXy@x-T_d?`8V-Kld1Qr!J7vS|Yj=DX6j{2uz>2aK{eW(?oz>3A-`{#JY(UVx;T)^9J zE=HLmFn<8~>0Xw{T@1VUnf3N2d0Q9*gH389)zTyNXn5{=H z^fVqi*r-^lXe>?pc>Uc4lc)B{EHY$Bm76aLx_rKecF$q3;Yq8bs0?E+;Rx=Tas z`v>6Pn=OGZ&%MIe%qH_C)Wh_zo9(~PZHg8ObG%4g5|DUwKYozs`;v-dB!%uUkn(>i zGAY(Xd)qahs{@*$%pncs>__GoFnj>`B<`-)&jao(8>f32UbY-&dpv%;-JgT{g10kH z`v(RWhAG$6Ia=LdUp#S=vX{3=#l@hl5O;J(;LsCRC@PC^I6?=98PK9Q9TCku`DlbSE=9(n~Uf)5XWxYXqKR z=4}B3VIRrQx1onC7mJZLsRhK@HIes#BX+Qs=9m7`b6sXsHo&Ta*sBlYP6}AG@9z`+ zndOaWVi%p)QO_IOc{7($>c{cxY~EQ5Isj@{3e-Rs;4sO(4+?RjJY^K4ITRi`MN)H+ zRA5Ta9BRZ$t(ctM%IG6;@m3t}DwAey-U5hh8KWw-Ioty3-2;vz+qG+xrmr?X6a`40 zWLV)HO1*S^=BF0$S!#2%T`>269(AGV!|)VDjt?AgFx@Hc4}w?AwIcI=7O7U&CN#(V zx|ELuXhYJM6K1>SfHsVawB~ArRj;G(BezvMLLf==g<+t%8jHvkAfP+e4avg|!6HzL zpYcU2;}w%#YB||I+Zjc>P=d5&9nslm>67V4?Yr<-u2cP4cP5Fc>}3ShQA8hi(P`i) zlH{YqRfy!a$2cGBIPd0L8`C10+v$~z=8S}}NpvjW*F$cEg=A$*H6A>5dQRiOB(%E; z*ej6@J(KfpD>0Tj;#If(3JnI+D+1l<4#|w)eeOAm8TDyV1ALjiw5cKK88L0h!Wv_s zg2`;CbW`~O-%|&nCg$cMIV4;fS%LnK1`dKKDaox z|N4!J^%;rtiseQHea-ZfRf(8U3U0Cdy$GJ+ z@yDo?KJ85RcnJf;l_VZRv9-SCJ*RiI9v2D^-^c2;zcYyJyOdnQNaJzWAJRSQaoD2B zhyVb;NdW*T|LL#vZ(4SI299RVW{&^9{4P=hcU4@t=OIZmj30px1n7ZFhWpm{9nB6^ z6HLwa2e>Fdob2w{xWtWNGAkt9W6_GTM&)9o`RU?fYjsjsxYDY6iH25LgLAdSskVld z71hb7%Z3NTt#K;A`^R%9%VS4d<|f-=_W1_q^KXF|xEZ{+xQy`Bhb8;3z@HgBU15uDyH&mLzg}1@yVXI|M7&ZVLi#ckrElK4To324E-&K^@o+QQefg#dNc7*Lky-tmIFhr!-h-lXyhCd;V1-rJVY@gB@XGrqm!ib z7D`F#F9MTkO;{+@laqU9HH=G?z8H8?8n&`ia2i!dtTzG%XsmiplCWrYeTyz_k=2Ux zaX30T=#RWhTH(qw=EWzbg(T@vP-*&V<|gXX&G`lu=UO`{UC0#UgPR-NHUY631tl4} z;tPGXro1sj4rhAqyUX*2EfMa>l?nT!BT-NlD)oFI#6kpP_n|lpfYAehp85F+M~0$k zQ5Ewdi!eWhO2$yX6-f6hAeqg>($p-CKz!mTyONfOq845sK>Rj=lqi8F$3QUOPorbW zO1~snA6fQAnfAE8zzg6zE#fVLwX!i*rrZ$}5=X3Ah?H>WH_P%LpETlYgZe3~s%miwJg?*K~3 zL|nJD-mO76aO-#YWS&Es_>OxouAx2C%i;ZK_j5RPE)DO3I<4tUo~MPrmpT+|p4Cv<`JgKoeL zhEX)7xnsu=EM8hONq5j8gU&e+haits>ZJ44z|3?^%olzaXLp<$#WrNE;Z=>S8YY7N zawWRr+$M_vjTfu5VRys2l9)L3fOeba2IV;BF@wDr%$Mq|lTu3*t$g!bwE)Pxd|r!= zEM6(czJLkr4WZ0n##9Nal|7t0{I9R!)(E{ycHogf;9Z8zlcut$a@NX@5r*|)Golib zAx3*>4I$PFj%|^B*lqXyD|(P+kr#nnflPf+TrL!?Ar}qv+bk|Rkuynw&Y zho4i;T-h?}-*A=#_>J45s`?kbLCrlt?BorZ{mjpqL;T%OnJ=2wJ17QL2lYO{2Mu_&DV8x(U+SNd{C;(PsvzHADSGx@P6DC z{T+s^fC?pI@T5l)uwve#G4VcF4X~5nCl>BggxKbrhr`_+)Ih#Qy?3bfKm-qkdy;nD z*OA+rTkhYM_rAI#j#`)3Pv1MwPIT@)WEhJDU9TV$Y*4W;& zir*R0G)Nh>BZS=B`3;<}EE)4Uer-8_d*vN&;YKd0`7lvdpdPEAI=Na`{`TqqFuF2m zbgSHqzAznmw$l*D`V;|+#=b`MYsB%HKHHBsg~=ffe{&pjv>9hXEMU1X1QY3!hWR*- zfq$5AXPbQ`=p^otoZA;uulo2bUIEVth#()xqh(~`Ru6?=l8ps;0i8ziY!}E6!CJ@< zDI)sFmTKdN04N!EDl8u>bQ7V0Tf;;>7qVFIyIwf#A%W~Pex*hL`pdEZ>OymGq;|XN zHA0$3Qska>Rj7OYjzJ+eZ=R(>>_$;|MiJ`3lQ|W7%GoGYxJHm<(RvD5V~f_ceHye= z<;?C#4cmIPYmg*v%EkEPrR*BniO|GsrPbm){F60d?&?np*lPLq^cWFGD%$Mis_(O5 zkK9x1;U2D3jxlA!+m{Lu%TyJmDrl-dpT28w!bOd=1hJ5Am`0d982#oFyB?u$Qxwkc zqkl#kNS9PrR&loGwTm6l)Mc9)_N7aWO#6A9j8}u_!Q=AyMlGDf@OzY}E$TQeTWfvqO zuW)CA5;Tkd7R!(hJBTxelsjvxhI5=*9_$H08*qH&Ezz|;H#kG^9? z|B7?q@D`Zu)FCZ{d(k~JlL`Tqyi-)QWGq&-0MuY5nOY0h*vXs9N9;P~OAg3$ty3Is zBq+4`K?TVti6)3j%rCwrfFC{`Qv0b4A{~H=MdyMvcmL{`;q)UrPVYO)K{Z9Ee6-ho zaNT1@co$KJQM#Mb4lD`{5k7j0@O6_>KTxuAT7!UQe~0q5lP8ycK;lQsI8JPrfrJk2g{cd-M_QW?jpd-|(-#`WB` z&f?O-+V5c2_;X90)dl^>#R^M}m?az^8x0*72OA9w9Tyn~SP)HReax7>JQt$AclQdB z+2AWAXwy7xD&yg%^M-7g8^w0|$w87rc^)4Qp`U5JtGC=1*%1qzCP7uE;@trNB-)*1ax#_YLQ_Pbx)c zT|c`&^E(5%5xID;P--3>dikQYdDD^{3E+zE*a!NWjoJ0OSAwxxTn9&YD6Rguz+jGO zATMW(JwvF64`-%!xSgU)v`Mkv@N)tRF0sp}5dT1uf3t^1br$4%--Im8Dx;zPJrOWw2{?$4j@brVhTOm&7`hAAzmH%DC3Lf7XF z=G@YVcQZ;pxiNH@_Jwa4i%dr+_Q<)_*^4!>=ZbdGsvo_}Y?!?c~6f_+5K8gxvUDI9qI4W zH9e>%Evxp=tvf;EC3AP5wU0y?8xt@4H0VCzc9Himx)NPxT(!eh$(qg@V=d^EkmQN5 zaDAAPnlG-Hqh?nqC3Z{Dy1aDHkVvaH1FLHn4Y$fET@lMtRn5boJpx$qaP`69Kz=Zv zQv?dXGYi6t42k! z!ej{;5PIoKYjQblkaMy{bk7OKZGw;bZa4dDvPm zE`v(ktWIdaqOnAC;sO8l)z+f(O=Z~9DK)d6M2+gFAr?DYQJ2^&d_ssEH{^si5RBXjGMj) z>dx~ld-*QK2I#ScP~!b{3n_P4Ho!%~)%H(Q3@)jHsabq?n2Ii5s=Hr(lj>F* z#0fFDTcADF64o_V)EZXsKyOni|rsZo_%;OPU_Zd8yZLv zRRAGZj@$r=-oA&6CmihP=UNMoMMobQCG@u&YVWeB+&Ib6NLKe0V_Z@p@r>$wkl+?eat1GHMtgJ>z-#_H0U*`<&TE~6wKaA|m ztd6D4SEOw!H>EEtaEl(xHf3f&(Oz<22;SzC3y*Y674E*i^EgwCU6@|RBSDAvajoC9 zq@mH;ouR)3q!}zM2Bd**<0W0;^wV{exeOJNtm_6ty(a5)mKD*hb(&^iN-#T2hceZO z;QCAip4@e^Lv|0#b(8qJ(O4}t6JoE%a&c4MunYXwM#1}$S6~M$?XAG~;g}=cdXZ@! zGqU#x_9FxK?2oA2JKX+S8QrB%;EpN2YXt~``$*ckXH7xWzD1f{gw`ktv&6AuJHhm< ziX)+_!X-GMjsDkHO(ERd@7eteoDn3qnpJd79%!15(~RC=VwK;AL2sSC(XfK!w7vUd za$zyEojuyQARGj_M&_RADoFF$H2Zl5HRz(IwH{V(kBL9PKanhG2A?nOB9mvO*@Jur zIfku3!uJ(BBQVz5ZyD4Bby&E9Hf2nA4s(y}6NaRwBv>v9o#)2dN)Q;hiwf57*k9)5 zS$JwAn0HVQ>0wn2DYK2CLTnhrKv0H6n<$dDZ@hN!9^Nuk{1dF;b z>=cx_2_j(j*`d{I%W!|Cz-GVeSHT%U8R)KnTnyYL5#4Zcj3ay zpG8Rx!U!rQCkm5F-|EeDcDwr+YEURDc>}c+DOS(pS4#i^?^h@*rcjSmTk?Tw5BveM zG-H>;m}@&d^{wm!K=sEU;S5?PeuZU4{uVOM4s!n5e?V5{L1Y~9D$^~g$y!R@Mp^c-CD9IQ_P)4ySbpP(I?j zaODucJg1v*jj`*BSF_DoBgnlh?3)EvlK`;D0ygv#>%u&T;IjS zHLQ^)?`h1f&(kXb5Xy%(>kCv%9iTcylaDd=Lwev;;*A3H8o!y!GRasyRN)r>r&P|F z_;t&335cu=QHxq;j~?PZT!bWuQ*n@aXNRS7>&=5jspCYG%GH7REhEs{+kww?FY3)R zItWh*DjNtD;e!%n*TfIw$|WdUwnYz9?nRWdYh~T2Zucp)K6i&2Tg9Et>j7rv5Nr`n z`OJAKiEGqb7%ordq+7OV)$I|uhpWqTg!w+7n#56`@h71=t?rbJM7fVWMDCo?CqU4l zee~Y_101}R;h-ET>vC*dLEMzHLg7U3cJD-*)xi`|nQP`we)YmI8&Qt9>Xkv2F%9NV zNg)t?EckU#bp5TR8nzS#ARWHjXK@iuwZsg#1E5ctHn{oh@FzwwXD|HjyXjL;R`hAx|=JEijhAOkz+(jnrHIoqy_&4R)7HADGj^?g_ z2cYYU(k0_u^Zj27iG|A4s#3z{`~1kWiL-(U@T!bmdh(x;pUCHYXr((W&sIpO2{WAm zRIVx1hmR6t$HE_&pV;p-1!d2mFE+fNAw~P2pnvZKFQMA#QvQnFz<%ZXF#ebBH3dTp zK_h1~1Ear{rV_U{`;YjZl)_hS2rmHyXGE0Ykngdu(B4F${Q>TNH@W!!aupB*0|Ms1 zID)}5u+3GcpFrQpGy`x7IbH9zVt$>eEdnT)QM!~hw*5Tp@SdCF@$q_v+4^=-L>Cws zR2YC1jGnBuP}-Pi{+vGwBtvoB;3|UU>apPT%gN?4jWxb%8Em6;f|q`Lj5j#`^@aep z2x5`DS$~uD%kg7TgidU3<=tP-4XeIzu2s2lTTG)&uej(OD;$isiLi}X$*+XUu8)8t z@JrL}l@JKD0A&y>l3*;B%Vfp8F$j|$syh881|4C4G&+j2FL7q|M-McO{7Nig!wife zhzhM<-jObXLdx*TdVs7Wny}|UN4lkXRU2WuC!ZVFJiTe9qBEtY5ospL3u+_n7_B!R zybjO&`aR#HM;RxdZ#q=}X`i&hk<}bp@QnNLdWVW9Pqf5*R+P`3>n~08Wup@-sg||P zZN*e({ZYea3Rtv@rH{+nut{yF_vUT0YmvcymW%R&T{6338kN^_n#8gBg*@j02Qwro z*s>-|UecLDR>tx`S^{zH@Im8fd<^bzoOq_3Tl6zf`3e_^a*=Desu>?B@RuogYaC`f zt)Hadj1h&vA?XGzCF2OgwG~HsLkiZ3lIavM;Ai0mL&?<=q^P_HhQ+#8(D&f2(YQ=N zZ4sM>SDM#BeZqSNJTH)f3=DOsy}xk;WB*3np=ZUMi<{67M#6jmUI7Xd!;{I5V-ly3 zAsLJvKL8EY&wiI)YP;yLYs!Y*#gh+%+l0ODw z*AB6()Yh0AP@}x^UKO3CR%UffLJb}6Sj z=Dq$Rc(*2shD?>CE#JXEC{gYD5u8f)wlvF}2^4&MMy4nd4s^cECkokIs4F*Mq^XyB zhS*0d%!}E1IV!x0iX)K6vm6G+wBfY!0psE}SI}r|E7jwKEWu}zGMPFQYu&OFWviu^ zc}F<^B^a*|C*tSo_IX2YJS9n?qGB6>=S03g)@XGbOoXNknp~P*&LGGV_Cp|_*y_4{ z-4g6^flj;Z;ApMPK?P*9W5Co_7F`*HGKow@bXm)6WzD875YcXxIZIC7tgO0wuMTap z3Kjde*3a{kol+>%$vc8tEXOG4m;Obnp@ha3syD77+1lukMEf@D*W{m{CU>k^#Z2Utj(s6>~u&cIx+6jFRK4kRac`Zub8?vw|G2Sudb&$s4qVsmUQ-sm6N&UUiYV1; z74`;FvpgdxP+1bQNT`_b5UC>|1n%$k-u&*JTvqf*1Ac+zDF^8vuXS%i7}1VYyRnA9 zR9EJ&(s}7tPJN%ShAOZJ-gLfO8TL*!JZh2et#Ee1MBxyUyu&Z~W{kCCfAT=4M ze05V+NU67^plyy_F&O~sK6hzy+ss`C99Er8J*e#{lP5>*_S6jA-LO&VNMesOc~gBF zT#41Euc;%L_XI<5hWw-PX`oyL&;tud3-Y()qaR&sugIH`C|ruL&1t_IN7ERrLo31E zy~%#@gqsqlI?)wt3wP-QWS;!agQH{{ozwj+$%?E4fKkE^=$3>k87Mes;0B>(=PlQ1X>R#ajmb^FUMX2B+h;nMu-b+yWmaJJ*WZhWe&hZqwL7v zCZynR(e-N2h!OAW6o4`#K2Qp&#mTXeHxuw0x%|)6Gtx;9$)-!WjWwa@C+LuO-wa_C z5)T2hY#?<+EW_zCY>q@Whp3>Hk`Gr2%)8_PohuHxhrL{VF=1m!akdC%^`ab~Twxzy z45jqFMQ;Fd%b*%pnm(Eyi1&z;2W0_sckP{#TTq$6$M$5sv3+4596rfA3BIwQm? z5im|O$Wed2RO_3;~RzmH~!z3r;`{Q4wHG>(}xoBr~?&7vXV7 z8QS1!+EQGV$jbhpB{38N%1T~9p8-k}%TiaA32geV?!nsDG%4DTuWnOdY@X$=nM=!F zBBskPaKRq%&ZO-sSIDbG2QmQI$(Ls>a0zaBH(^=d+sbS9Gh1_EA%pfSFjHjh=u8Bh znWV&LW)v1Kp9o$uv!cjZl`(RcCzRGfnS9R7hOdGYQzZ%#GC<%|2GX*}|Y(`#e5bQfU-L5~EUPSSI6eAd^ zk$5-ww;BQPW|2PeB)shsl}=-_zJ37ajm_CFBKv0XAlyT{gbArJ7N$mP2xcpD^CHC# zDkXWT+&L#q`(nd;)A$VhwvkiW# zjI^2+!Y4X~JN$|aNAn2vz+sh~b#n%p_VCooHL3$1wSiY(DpwQoT9wFAYQ^iBaUurJ z&0(e$ay60q1S@9)^7Eyt(GuSW?W6cuzE8kNC=ObI74b2@C z7sLyvcef<{?5jSxqo!G@k?tuXUo_~e!7@FUBD^QXL#eH|4Vb}M+6k0#<8H8mpx$*3 z23d3*sKlw{;xAy?fk4i%E%HrSWcreO2I`|yK42=w#sk(vW@k4Y-}+L0B|tE(X{P8Y zy__`Q$0@KJJ(AZO=9J5CNNyOIMz$Qm6Ud-hL^obO838oL$tRaoHR}}R$Ww}O!Nk)d z7N6vAfTxN>JD6j%T2|{+62b!a+c~0r2TZ`6YYIzIhkn>A{0<@-0MW%xa&fZbyu3 zE#Ia8UQh+{wV6xD$lHUE&|0?y1hlQ*wOJ(M)X!G^2W=)VvL|n@u_MXUILKJ|u^qqE zQm^(|zf}AX4{5FnbELGw1nIs>_SE~xkIjl5fo7q63ag0jfdZwZwlIvAh?tUQrEK8~ zLHP(0$lteg$hbo!gbo$+hS?5j*Dd35$NOj4%auC{PxZV)nwN}V>#oKvAirt%=amHD zG4V(lWYRPeY-Y-s!8^Fft%tD9#*O3f^8`aBD=Su50T;OocIuiVTHuXj3X-9mj>E>` zH}gpz=1Hjuf9-QG9=qBN?RM0jl$f|YKdK<_BzVZ3B6bMD5f?m~pKjHIxE&wr?ZS}yx zk-HYcLP0~6Nt-xOCxFHk=1R#{moFwGTZWP20YSo&yC%gk(6e{Pn(IUp{9-tA$P%wl zh;l`fAYmz77k)QAHbVfcsw5*I`(_v8$yu(EMWHuT zpbdeea-E5kNoj%To?*9SIDFb%9;$cJ*bFsuORn7=u}0d&MM>MBwf0LIl{D%8En()l zth@IU@%YZN(un@sgkc7X*s-*lyPZn|vrDv9EOAl(`MAchuG+C$1=(tSGu~>Nw92os zEu6z>=D|$#h9&g5bVItik^y=M61sdbf-=wvYXZF*i&8UnGm#NSO!AJpbw4KcwTBMA z%8QGhO2y&yN^YN0?S;W0saOAQ1|4NSK$r>LS|)um!8OJ`vTw_m;J-s?5=6!p^Tb`R z6w_lr!M0oVl5v$jDYWeTbF=V=`(-kF`4Tq6{8ZBjk84DQ8}aRm=Upr-rm%4|H;Cap zQiHZEAhcDkKx763qxNC47@0K_zg0nr^LXT^Ipc+~o2N31AR|7Q9T#oa2s-K+x5?KK zaxCYIR9btfsxX5Nnmxx`nKzxW8@S6UsCREz6_-=a*tO>CD_o)rm-{a?^iGaLQ)d^Q zRR|ef<2_scRDldqg_-2^xzO}WDmdsZdjl}WYLv@qS`Z%)cp(ZN$I{^jb|6%Cy9Y}j zcWp~fm~km$$vem%lYCYH17r{tMlK9YamA!aK;`lFi7MUiHf(h38f)yDWTtWa{m^1L zHDNZj6GK$?J^|VMZoF^W<+j?eNlE`iy@MJf#@*GE+|v|rSvPemlJ`kFc+-HoZy6=g zGYOC?(DGvU3~ze+Huo}p zoU;!4GiTKy+3G@MkIeEyAaY{4V5_orWj|$S^@TPW7s$1Xs<{tkP44`my83~0mnS^y z^j#l-wkGn~+<&>6tB}V3jbLv7suA#R{#_a|Un;BS2b;4r2!!>&w#D`|} zvR+~riglWoHFKc1S7b@LP=ds6k-XKO38*c6+qwsTW96gB}fGAOvH_WHJS=az8^*dGD~|1*{7ekwWU|_4UH!c zxiT^_I_D+=Zv^BX`E5Kn^X-MrguO)?(%Vl*-kOHGyZVZ}VK{aw;FS>Ck=(Wgsj)_~ zNBEvF|H`lx>5hCkPxQ&*h{}Hv&j!MbHFT^*Brn?ntbY|FD307t{Kh#SBM@Ra8N2$p0?1PEy=i~X-E6U6{w?Vs zw)>iepSkh@zfG!Y_&`vHCpx?A7ACSMt5KSXDr<)9>aoHPb=hH=h4HrmQZB?bF?wsF0qFZFX3mJc5aP&DsSq`Hlh`6U{zMynA=xX4nNy9; zE1*me#k$Mm1y|Z6aQNmS@qVJmLvA-uM!iDSSr5Lsx4RynbBDL5TV9i;P0(1oQ64*A z))o=R$xE+3W}_vlBq>g}igBDr`vOs2_I*;UJ67OO$Fj`o!0X#Wiu_&#m#5rJz=H=!TlHQKg!qOG@oDr@k%Yx-m1ZsvXF`2<=i zK^VXWz7mqGImpKZ4ULhPYlaTF3DPdl8~MSfHRgtNl{ba-7GY&ts1}qIx?T&G3Rn-r zv;fCRP=HQ60*vvlBP}8c`18V5wjsBuGhU8jtQHmo>HxwFzVxVT4*eF~j#VV0#1myv zcM!9Z*tgut0|HpoJ+A0Hm*Fu$S@|ECy-9qEKY(nS#?u3S=9b}u&RB0ZRyu*jyekU& zd9k;e3RII8$~fC=r9p$net3X$2*&-q`l8N!0|fYT2><|q0pNk*0V?ckb$^`#)W8D( zaQ^M%e}6Rk{q4lS#)`(o#>T|bh(^!a(B8((kmi4JX=rTq3=J)f^lkJUY5u+l@ZVg! z|F!}66Y0;o!+#;Ef8qb@NdHmC^uJ$)_|G2wS!?yL9zA_+e*T~J=>Jf8_0Qh?S!MFC z-bBLw-}L4mkH()RIsQVM!1YOx@h8@wyt}`!dL;gv zSbxvL`xD?#y4ha<6jJ{P;QvTI`?KLc`BHy1+$a6d8vdv3sXsyfWZV1&aw7Y$gZyU? z;h%Va(j@-E%TxH5@&2(X|C!_c7leq)KZE$s8Q*_){?G8%Uo97#|5q*l<6zgH2!949 z{z8zp`ez9L$nWwWVTwO7{`3O>g&}17FJt`IBmSrJ=r1@g$A1;>KL#8a^V1!54E<--tD2rs z80*^5Mn6<(i)@^X8u*%PJr$0m5iIcrDST8~nH}YqF$WpYgi+0LdYgRhR`I^`H&gXS@I_GmH_B)R8=YtdI_2@5@ z&L67)L}!{=DPG3I>Ii3&UdF=-q}7A&CqJY@51C=`2L7E0Exx4)%KPewGu1Dq5Oxp! zVOSddCu$+hWWq=f>ES67edIF@+%BTQSHaD9> zn+O=779f)bQ??X0;HV(@DIm$kiu3dRi0E>adPi)LR2C${2|BtE>GfuobEU6+V&Qjm z8@(_bIr9JV#7I&VVi6FB7eU~tEDVecL?eHKu?N7=*}R#)FI;|$P&3{<oz~(+n)55-^`&t{J zJ`Cn)g`?TrX2Uh8?>{2Kf>rsq%mjaR&@26S=@7Ei!C9I?#PS$LH?3n3PFy~x!eq~8 zQ^Iws!jhI*+yoqE}Xr{%5;{H*H(-2jVO#TY=>B2V7yRO-ZREs1O#(fNjg*L zk7sO5Gm)bbwD_}Tu#-G@V(D@W2eJx+dP>bUeXH|hhl5_TEwdwsYc>*ZN~_A8W{sAvd;ygYzDrSmHwD(k{fni(=;4;=#;r z)td5K{C3&8kHf_V>w1P09L~tx$|TyUjr-TvAgC|uM&5m!*}nWVyJ`T|hpI-$xrDIo z9K;Nkk({Z>CRvIVq%m(Cgv0nCeuKCGoR9nXFwpZgCL&`cG1cL@gcYQrcnHvNb~Lds zkiO-60S3!Apfq-$2wIp{|CDd5H}p~VFPx+9B@L%}2lT#$dmZFHRDd@!p^@$gA=?-9 zma5P6gO0--CMhU6Yub(ghOGJV6?1yjC`)xQd1sh4%OfSp4_$%4iUU5U$9S}OdM2Nl z+{RZgBfm`UOd+w|6!r-$g3*MX>t=mPwWnDlXLqq*CWg$mj_~tea*?S-KYNm$AZCRwh;jTCVny*&59n)0(Q#O#{*K<{s#X}GIw9>!iP zIdV>w6P1DHTa?d58^df{d0gK@_EJQI1>w zHbUx_MF)8UKA}E=jRt@-b|~hF$v_Q}N$?@WyY-49nc;-zvUBkAtl;Y2J+w;@QC~8D z8)B+P+wRI2u{C^U3d-FV#=nd4SvSY&`K51o-51+^0n5UkZ<6AiqjGDx$ua)-deajW zehv9@(-ZX{Nwf7sqj(U@%n``anYj#ZdMCS_9<54i3iXv~r5h{%XL>GZvZ$PRVg;5N zOY9QMh{#8|u;)+YINNbpL`Q}FDfi5NCIg6_zYT2S&sGK&t&#QU6sPIGX zT)p-{SNphv=D=RV-@d*Te^7aEkeR?&hf;2$uWaD9-`eBx9XMZP8GvNt6GO`rdhQYaAt)(H;MPY_ z@f2(W*EFOl{V!v`2c`o`88>Q^GVx>zOA)Bg%rVmtp7u$1XDT24;0p)XFRc7XbrfZ< zP+b&z)MDeuUc|N&mbRu8U(=Oy`}$RV%*I~)2bk?a3!!0^=2x>#GTA%mwXKua^R=x) zNAu=8rj0bcz8kN{2ry&99phuIANY+&O6%HNi)YT-p18id;OWh8=^4U#jZMv(v(|gQ zi*x(AYUIpf(&yAzmovWHZtjgoaNsc^nf-p8#T%j0{~{nT!o|7pK!Jc5{u2?V|62k= z&eGY%%+Ab-?0?l2!X_qW|H%t`TQe6kr~fu5Xc7#WC~-oeLS|-!o8oFa_wieh1H=nfXbdW9X$f7?-86^QY#54e- zId13EZ0@~|>FX(b#axhcaf%=s7qJ4;isD(Q&UyS1XsoDWwkN6?X>kSdf&z^pOL%j( zY_swQhp@>~OuCBKr}?%CZgQ+4 zi;YBBR!*h#wbN;TLs&=5=@yqyO>=dYwwYHttKll9u{Ql1eX+=;kbj-j9Hq@SzMl4PijvtufN*=b%vhWq}_MQ4xpqSWQwO)9MF zYp$Z*0wB(wD8SnQOH&hxc7ckBVgck>UOX&g!<@3iTmy9;FC`%D{+_4GdW(3KHcPgT zO>ia5#G12Y#9B5l>Qn{aLV>WQv!w{pm7XROoDli8lo##zlIfAcmQ+Z))drChlEhzY zi#uef0xzT1ytEk*2d$Cy4ftud)OPIy;Q$*bOR^g9h#3SNQ?R9p@=@#|0d$?f2QaZz zu1AL-XVF8FJrHw-*GW~Yn;hcZXfC3`RHDLsv=h7nEY>!CRrN2lul!o&m@5+`!e(cP zt{(H_+K`P3?Jo=-V(E5^fC-sm;@V>r1zx_7r8PMk&gO%LLYh}33BQ7j;6Eb5TIawr z51=-uEa6hD$6BpWUz~qFMCI2{JLLF5egua8;E~1w#eU{O4}ytF8;Jk*2lu=GuXFpIbQ=EuNvEWzlfAQvy@T2RJDCbPoz2xs{kSk7+AYabt6jQi4NA)NZ$K#a zj6-h9>S_3mT|#f7A2x^I!l?2-_mtQsd`+tJVoV}F>D=aX(;1IBci9==58pf9K$w4I z3ZQ*0)5ooA1Ve%0N}0iA6~RHznoqiO8H$be3j<{#7;xJ~EL?Mll5?NRIDOF9t;A7y zXa=i3CM&dM2kUBK4YZvXVUq=Aq{3ts;^~n_XpkJLnxh*7%ePKhy{-|;1q(&W0Y^v|7AlCmN>mr;2NU1)7FSe)i{m%Q8_+J{^BBwpjkz{Tnty zez0PiGM}{-8B)Q15sHiouUr*^+GS6Umkt~HZ7NYMR*cm?iC@?ay`}#g+S7pEWIdK% zWQNa(Ek+n3@yDH9DI-2trK*=+HkRV+Esq=9i*7X}5>8vb*=SviRU0lQecX!M${21< zPIrvU=xr|}4>`A7dT$tBF1g8sjL%(FfmIxf))W=__9ayDc zC`+`Vdl23;8rN06z3KyFj3D)`mfBt-H1>f)oXW$wR<~D;CglTTe(0_ex|cA*QN>9T zBqQebk6*wM-{$;m6{J?z6mN40`Q9%|vj0C#zkTw{N6@zL~sPQt7YJvxPWGZzAW%`iuqxxGnQvX@e=Uhbz2rj$Cgova*V2Gh)96p>1} z(=Mg-wzeg1qgpP>Rw5~#sx+GT_*H5;Em=#ma%D|zP0%W5zd4_)He%@ypFK^!Q{S^~ zg!>%^{4Zbuv})~8=x?2Haoz_5s1UiyGb$`TqG4rbTsI?}fSBspaR>Dx9NaS!M{j{B%U4f*cBhp_tHv3FjMyuD{5EgquryHAJoK7Ck%{fNA^UmYFO2W+-C2>4 zVwe8tFTWI3{&Qn00f7eNW&RfB|!7OUI6%Re_GM=UehLs{4Sfwmx3@j;Wthvl;4cGK4@=2bZL}}@j zsvKseG->ZFDl_q(r4=-$xn`A9X0>c9HW_E>R<+ZQAs)R27~`drsw<`17M0>Ku&tY* z3eIGBaS|fLl%3BOY$#XJa6C5yn%mI4f55Bgr#rY!$BY%^jQ%hPs~F@BQM2q1=U9YM z^_5vxiFkezdyl__UOV)!;m1J?1-im4N#R9r9lR;mI>|dEwR(aTAK&lFD=4KGjIa9!D-8Lf8UEHq!GpFzv^T5Cb6|GY|h> zkea_k-A=ckfB6(uupf^7Y>kzaqc-0>GPpjC-p?$o%?P@DyJ+m!B;9`cecfQDIHink za;aqM;(rb;$ah{}OASO`;hiUddm7s!^=&)G@$kMQE@NbXK!6sZvyCXRbo+K&_Fs?X z5x^W;%l#)c$*mXZz{j=U92y?fU}!&X2@_80sDl?g`YJCE3GFuwuosZ=0~f80CMUmi zGiGjNQH77&Y>Gpx&CHBv=QefPz!UsajyF}d1wBUM)Kl1OQ~>~fU0*qBPTwt7Q)fp` zi>ZZKgB%)og9zs!gvAUF{Eu^}}Q|Ks}aAiT%1m)f^)?SX}2FNu}*X11RJJl>|`jgzo z;USotRciywUBzzswz;eae@KLBPs<6d>KzqRsrV=E3JF%(F4@qZwzM~KBg4IimL%xY zXKi9#221AMyhuZZksk$#nn;%L9F=JF|bvTs_jz&jDH{-50EFR-)WgK+K zco6ik<)*17bnhgHC8sD|na;lDX%fSlDgGhK+A6t*ZI&wuJ`1%jQ>>Vl&%jLW zsXS>{YPD!qs@W#2sLR?WwVq{0zu?REDAs!BST(A4UDm6XZQ51fUwVaVp^BB3bgH(M zcu9pr0^$dM4D8oLCDk~o=puQ5xf4{C&}9ZI(`73q)HdFe(j;YXRJ$~>{eAh91_zhRtTcu@BhJAbD+}do}9K<8dB7#)8}0yf|BkJw}Bx_@LZF2 z>a$C(Yq2N3%EvhP84{{Up_D|ou<{(gIRjp*ctWiTZHl57xpjj6P$0A+xGhX<cr5E*CnHAEfEpbKsuhFlkc^lJ5+-5NO%G0%(Zae>sU)j=($kwJ$ok@*o*9~O|g zayy8j>l0i@;JFn#IVn9ifu)3}f2#6B_6EjelmZ82#vN`p|>wHkr=w)StgWD=F ztscKZis!jWS*g1lE3I?;33HPPH|aF+R%P^W>E^J#Zut;}(xEGZ9%ndfo~$;|NN*PA zfOpKRs#Q5nWg1pn!hh~H^^6==F&6r(wbLEt^M5alADB9qDWU=l$JZnb%Qa>4q1`1N;)TT-$Wr^J|*IS1j4QRueD^_)+$!;>KjH$2j1Qnvu{7@)^-0 zC&W<>RMY>GwAl@YiG>T5>Na6&@sZbb-ez9@o3y^#WQ9R%FynKB#Uu|=f>@39x1xzm}j40gK7qO`F$vwxKzWJ(0P~sG!N$!Z*VrvR-abprs(@eW zd+91IE~)8q6wgd|E=F>@Xu&A==d%g>DCMQtjq+57+o;7{ty3t&9oDL{@)5vUnSJ%t zEH1Xrk^wcM<+?kgep@vor{=b1?IhEgrM07d`vNpUGK(v(*(09VlO)Z;i8Vz%oXFl( z&aZl+uUZ5`07RbtkBLMH>zDzt>Fo$ry6)X>(OG2fBCiKfDid3~D+FGfiT@NOsQsvO_o5%4;rsO>?ko|Kt$$jcja>@;q%^68LQQ zBWb)&5PXhcc8F@64)zK+tl%;YeyBW;6RxTE2N{c$3P(c!TW*f2``HR>ghi7@F3G49 zj+`ZVQc2?UgtA%5zuysdl1pFs--@ycZF$p*W&rJ<;3}nXcHJ6r(%Ml8-C&H`&3c3! z%{V*V=$-Wd-*qrt`M2b+#~@n%A0&UU^Odp+jS`K#0*c3{%cf<|UVZ!`cD@jQggiwn z!vHRjEEU0^spDFSZ{3c+q7Sj$g>w?bV;GGV;>e6F_&Sy!wtV(WhpHXbi-*$-B2+yn z#1HMKtn1&+n{z$wGYxgd5*I;7?L|K7?W-OyVQKpcsifUW9HXREGk9qfak5LRi(xcNa=f?-jQ))R2Dfvp zM_?map=!%4&1$B*AzK$t`*#fdXVxRvlmzp@NvSj=ZntiR0<~kt+BF3H_XiN#&X^VM zDrVjhEon#pink!ckBAVMSiG>oeO(L$1*VtcNQFvXR2+qCbY*EDG?hCHj_nCz9yM+H zmn`>X@A{ny*tb<(x_Arsk`~!_C>4{uuUh6#HC;PfwIgcTgsQ@t1Wx7sqXgC7BHh7E~@g(O}U|eygk3`vgNTM}xTY zM4inBpfFPD>H8ox@&-x5^yE#9%nr7Z>2_UVWZMlkEmUz*z*9m=%khPC-on);h>E8; zw!>|m`Cbi^n6&(C*uv3O4wXFix_(ZY``Q+C{W=$Y9>CC5g3|6`>fT}W*P5))g3FIR zXm9YyC4y!J#m)o=;XIOw9dT<-Fs_Ucwj|qLS>@s9GuxQMcV_9_Ad?m-Ga>}!ulyn} zt`t2!hy;S_SQGeV&mZNC7+Gw4gz1=tG5Z=3ryLl6(v3I+I*Qv7n{7X?2cEQOJ-?}c z(rJul~I-G1&f>n6mggx$#Cx7u0hlE2Tle51o{$Tdf4(_%whwFufRH&v~McGGxR zCKaZs2&YWruDE=exumtosmmu*9HnG6i5OBm?4qA>C>cdeQR)dQ{!G$e)H_;8nRaP|DM*!mKaER17G`ewAgWWWpG zPiR^|80U2g_+LtzmAjaNkNBUKj)vb@(7hOO&N;0wSaHwUx6YaMp5pbl<3!osJ^@HQ z0I@tC#vR%>Dp82px<#OD7b~RKt~=S< z5Jz~|;?Wp6LuIoEqt5HvRxCaeiQLO$T0x}&z}fEpo%a}*L+@ID)cQ4#+@-$Q`FIc- zyv_%QLj+65RH`rbUEx~s(c8uAXf>t!jR6<}htz{4Utk6Wn`!%ZPkgA1N4)XBDi4iT zLJPnDk0uy`tvdXQ0thHh2?$8=f2#?WH?lJ_H*@-*duJbLL$s6UH}Ab`<_$R_Y)vA{ z0|aO!q!=us^sG?4csj}Z2-(JdtM%b)3K0Erj}`TrP4)Rok3Y1RR^%S4eA<@Q);*VM zb(>Z?Et{LGunS+ipMTxl+)&H?e-3>E86TG41 zxgWvO^q!9jdi00RRlTA7_GX98?bFiqPWIJRyh;A}>Wy%|y~?BS9qzTMeW~E|2K%3) z`yU+YA@+v*%Y#Dx{EP1E0{Ef}-U}i4osarEtV!znT#x#D! z5qJ*hpKE{VZ~`%!Zec`Av63mZf%#he2g$D)YEW{-cpneKCLd@!y1qtGJ!qipN#FexJ?Cr!hiQ`0E2Z{^0 z!mA;~T0o7?Y?t1|5MGz9vM|!!`qY>kleXRBpfH8^HnOgR=h=^MDpz)Ndco&U=noxi!IZNJ%7}83$|wP~r>a9aH5>I23^g0I5v@ut9rUyE zLtVA(vMAe1E(3JT@-D=T$);?k(A1I8T37k zk(J7J3G_9ueP;kD#Y?#EC-PeD(Ix_eo0B6yCZ_|yWXwc4QV^4~@{mGpyE;nGrE!?P zvRw_mt>Vy4ZMz_9rS&eTW!`t%+ zxNSY0sj|UI-rLvA#Mae0sjsA?prEw`9oQENdu8W9iVZ2Y7RKcnSu`>aibm1?No~zZ zhbTtpq{^z|=`%BH)B5Vts_L6oLK*_M8$W@To|8hLcH6W8Zi_UmQ}mu5>D6N{AoS#4qmBMRy${K~FQ zOKW3(cm3MlPI}ZfrEbI?uEvI(tP$?*r}d=e^hJ)0dL3#D=w`M@iV8_AELX&+bi=l2 z*3{Tp*4xBP#mv_>Iw$fd@`J|!^_jsQ!2Z4k|FxMVWjeeYwgmDWxL7OXA!=#e%!#&J z4S&7ZYd_>2jh_G zM7p`Ty@YxB7`*DTJlZu>bhmGA;KjK_SbKpST7U||fO&lq#|1s;4>M#OOb!!jZ))RR z*6L)Q-}3yMg6nfzh11ht2p)%i&>kZI^&PI`Vt#-$%z*=tc=)!f*|Szkho7P&aw zygCmtSXajxp~SbH9m?VMHn>1ERF@yh%|GBk$xJC6>dWa|&kP=&fD4ip6p6mP#P^kp zzmp}y>EdpG4wE_xeOi*Rm@8y%uHm5PPNc1!2Nvx~g^Zii9qwcnPIQc^1#+HmNmitsOR$ZnSMT;g(-^(7lQTS#0AJuxUtzz*6NId}hHhGOc?;!I z1M?KtZtKQVh$}iA3@#a{EwY>|q!>1U zos9LL7Y77Ml}OJ*uTUBvOo*qyg`Pdp=8n$J4rXlUNU$9sUWZSPBPP9fQb0my>};}$ zRDtX?HpX46_)H7SRZ>QSJg$-WJb8TtavcedHIL$N7zqUN%#}{pr&oridBPlL&U8wv zbY?LI3$U;V*^-;7JZ+&{rg=7+uL{v-L&9t?a0xRKch0D20+-UxsA5r^kQYhogh^uD zWNPl4qqM!;zOd%|;DMpNs|FE@5z?bdy|#y@w0vt|0)`1(gWq~^0UGl=54^_9(_11O zpt|F%z1f%Csd~qUqfGL?La3cbL&(83jl=0By>?{&%u+5)@ZTn_! zaS@rASQ3Iak_n1&O;NZ9taY}9^5vps%Zr3qq4oZtc&BiZQ>}Zq@T9UuKVcDP;6Q$D zM4@hI$hnwDYq>^7!yc$G?2;k?6JP~alRWHt8pmUq%X;U4YbXQwy&{JBJR#`BQ8D~q zSJ6xhwexllAafVL)v~W+4X@X9qcn$PkCiR z^Irs5k^Ia0SWCf>VM>~Wc37mF1Pa>HPiDO4$R*0(t?Ln$95@h ztUU?Qa+%AIY!`&JP& z6BD+?Is}_&PobZp2}m0alMd~?G?36O&=}VND|(xoYfDSA=J7#L9JRB4psX4y_j1O} zBdrPTRrwqLeDxNPU}>gfG919pu34q$&S7ffK2XN3wrd-Z2o|Qc>;IXL#}0$d^ztuE z(ym6Czb!8 z_?)cRvm+k!7u%g7_IWvX-mZ3w=yww?#3WND07_I_6wTh4^fW zXjYv{&8X*;P?FUPo2i4A;PDdWe*lVM>r8!hbANFaD@iz)b9)3BhQvTavJb;x6Ot<^ z@o73m=gGdt3k@$LVJJg%jG|t}2u{yAzId`1NJ$!3Hdo1M$P?k@!%L~9t*%U{Wt46- z0~4UP6-zVmL43FpBM3W%{TnoI@aq~Wf&%AI`Llv~d70fE#qjIHSz}jQVM~6jvU!9+ z=?foyj}~$i_hBUj$0zr@zI;T*e3HN%767AleUdvU(ka5Zl8k9(+~*;O8h1ox99}lx z&fxrt`d5)yuTf*waV|+6abc~WzmLf)wT*49y86X=j`7GD2KGWkU;i9K(ehB^9^L-Y zTK-Fd?*^l9W%zEG6(@Gc2Hu%Dt6pGwMnXb-m_z#WNG|Hmi3YTTx0kz40mmND1NQb|CC1dMZdBG z0^jE8e+mvz`5qG9G*N#|+47E0`z#c*qn6nCGVaIRR;%A7y$M%`DG&ED-w>S-`wmrD zutizGGT&mDf3hW~VrMh04`C&Kbx}gzl<}5_H4fv$%!#1wSzmqWb1BF#lLm7-ddoyn z_acPlfsMg)WA$)yM@hEFM=G%99rzQ0$MFT~6PXjj;_i=0z>z281bCLw20SpSqe{8Z z%EH=?@Qd-Kg)_J7n3lElrT%s>$vK>B?%R8Of~rz6jMPxm$X;6B@65FcT4ZiYToPKJMgnpKBs9I@l*$8iz`l*W+$q1up%Ej@Nh7!wyjf0Olz z62ki1GT+@Vt*%=0^qG}ap4!^nQL}Par7z*?>e*B`VX!s0GnJ*|n|)E#Iku;))l*&B zSP+O?nviPPSc#*)`jM6OExW1nZ3|DUQ!%I2)ZG~7pSH~QfwkDU*;;uziE-;ZF^sP! zfrH(hx)~qa4ukL7P=sQ8Vf0OU@mFEYZ?h(K@2BBS6`5l)fC>QGx%c z%o{6zLnV8|#n58nXEg>Gjy4_si+GX2T6~sH%yCHd>x78f&^qz)9QIfB96*61ti$ik=DR7YxT9;UQ7nr3EZS+SP{*lzB4WR=F8 zZQ9kMH-cyMkNi)9s3)OFW-xkEz0W5l6fr)15XxYw5lSj!=#nd>K?7%;`gbXfik}?w zvv}f2cZscokxfX=aENQsBFos#c-Epep3o7X-S{Ukl7`QjuUY>bUo;o$*_C;J%m}So zJP(5!SpBMnMS~i*oRsum~2X@Wl@!7f=7PWdOt3jb=`C8+_)d4ILz10m7dxB9yMh_Qb;V&e?_$*>!kb8ve0r=2bX5 zFEnCo#Atzl?6jnCa|&`eKQ@wj#g2?wrAOnpv4VfW@vN%&4VDe7&fw2ZyJ9mUi}pNp zz@8+Ibg|AM?)-znd3~WLN!HA6VUt)$x)i>3%vABpX3c$}zQD9qPAoe!O7?GTCGNES zLYIA_d=EKQa6-8O>!@@l=2`)w#$uy>mhV)Wo8pnYKja`n$`hW6O++zF*nRD!XFw|c z@uibK#on>9zjdNM<0E@0ZV|gFFxegyPkia!SE#cluWM zmtZydO+43gJ^e{Jz*#xG!%iJfUW9TMv$v9$RANxKKrfsunJ%)bz=1FPjKwJrZF9BE zIAvV3(@eX@lb==xW%x};VKct|2tM3y%+g++ne_~xFIdiNxQ%#w2e%qweEY?L(xWDU zq={L5@*%>0IpT*|w4BL+vF7{t;2Iev^g->f7cJqM$Dj{j!N$yNn!MYKw>zq^NE)!E ze4ml<&v#+=mURd^oix#NDr3rUxYu$Zp|MDLiKjCtQ2$6%4blq)p9Q!Q%@HOOQI@ZW zZZBrRM?;cmd%$z8AUv&U^J+~tE_*?E?bM>48_#BEUH)dUu%y=rp|T}tCM`kZlrwp# zI1iQ8?5E0t%i>`jlR)8@dNE-GLAjS$h2|e$0rzZJ>23WINY;!c_)x5KvfD8G&|_ zgw5q+ToKwj>YCb=;b~fJ?>Bry5Uzb$pz&}UE+_-wLE@ij$llTy&ej(q)1{gXD^hGm zv{t~#vbxO;_p;mi=9to!rFELhmYFqUaqHG9LqV&R^<2JNW(|MNCIPO%#qz4n4V+b+ z6gFW7TW)Yhs~bj(E1ubaV8&*Vtu19sPwTg0@e9`0N5fOhkWJ-Pc6*X<$6sE=#}j+t zSjb@!ZjQiBRF%yn<;^798|o*y5lhuP1z+)TGiIP!@^=8I=qtt@D7igk^>R*JK$R_F zyQ?eE;w>a%idSc~mF`UZ3bHOfbybG$Orly&RgtOd6Oad_;dC&Qn`=WO=BQ(Wo^Ih8 zg3#_!d>f(8#CB`8B&P1A^&W?S}4Q?7pghHTuYU9WFw%F zBRrk)9;?zE1OY{91RjCYKOZ7K%-Jz_qTgNWzZc}CEW!GtrT~oUb)-6wXl^4``xBEqxfr`)nhsE4 zf%3=8!Vw_$FkzDvtNlp_&yvQ|Ij6G=mEnpGapHJ8(A9)I8-PF=q*zyIVhplAFm8ut z2;6a?-iA#Z0CnKL4yN7z(~go$Cd?1N7jAw4sVqi6ylq{86gR@+fO>3w&y}q>xC?f5 z??G4Q{7hx}0ip}VfC0iV2;Tme?$y&LmEzFN*&h2#pLWB&x>2MR|5cR+Q2a9d3cD3P5_V7UO$mzNsf`9lQK+)!s$j$ z6)`E|o$(TVE)L?skA6s}2`{e1;!_=k+V%yz_e&g}Gi19q<3?itlrkY8>z490>MJ&e zp20DmpyK==Gg|_`X{iD#CV#GdUdeq!Lar9iWb6@i^J#~B6X z+RdFYzh^o2|2FKf88VX3kR^4-O#2M!YYyhHty{oxkaIA^XWrwb%!%@J3(34gHfAsi zBX`S@^;wCUw!$MrLNRhP_%Rx7j;BGRwkAMYggf#U=xHTOwn&4{`@l9+p_AJHy{2)e zu%xY>xbA|8Zy?lJt7l|Up1}7%j2VppHGAxE249x1!&`3YwR_*EeB~sXB|Wr84**-} z_2?t*evqIhT0M6i*`#39}F#spF zHbsQ}tg#|NTzXfOU+(q|1K_*G-bXXqdl!kbVDXEvy^%%W;<$2~V7-U+_^WF>ry z@Ns>(L|f-3jUl2OXa=BCAK=+wrUxP}#D(Lbx%)-9#A`3vQTs(dOE7Q$#289{Tx`Xk zJeFL(>=;U!^{I|jAf`q{Xtm)Z~;MdC%^UZPn)=|+Aiyy_I?dUf#vTlmn{|1L}BS1p9_(i?&RBk4Wf zm@R2^299Q>uXu360E25^RPV&ua#wl}@PomAUFeo{OisR&9&R9=di7#4;;T%A&56S; z*6ItGCYp1OFJ9A3+_jhX>XTo5-qT-P68bk6p*T@WZ6K0KeEAQHMO@GHqrWLxJgi<( ziRPgORByb+N0z9AZeD!aAr$M&YgeKC2)YAt@DfGb!^)NWhP@W#&QEuo#ZJYGKNyp?QGZH;+)vI?e=~~bO5jIeD5&vi9#bAKzBgy%Py*V6 zN@{>ERi;XS%4ORYOJj!|`7oL84|-{yXKb9$i!y@seYg!T4|cnV{nQnEobb=dX2B9e&!OBpv!iR}VOz5RKZ(*s#e!#hm#U)&z z-Zh4c+-9)Fi!OzN-aRGg{rvmHqZ%{Tiw7J|SKq73M z-h|oex9JJ;Yeh@g({KVHBdjmNYcW`4JD}3`V0J;sSP+bEq5?1dVj_QWB%p?W6d?J%!#YX|OBQ$IA)Z=_w_7s3x5+MwTalV}`oMs)F z=h(4Fu}#uWlgj+qMG8M%4}W{1>Lp)jdOb5~MEEG1SB}`vOrz-&2tN9RbfFgJP3~gM zk?#n^4Sw0WxXhKo?sHI$!5T8#g`0UG(~ZfJ`I^9)(rK$>H4hiHjAVdWMw^w($cehf z^2=qV;zcJ!Vq3m6*Z!3q+I>WPS+82e;0KTg*>Zzow++=x@GrZM0zJ)&sZ>hm6DS~Q zgU9TixCFm5#Ejh~tm*@kFXskph=S{b$^x`eP7$Sq1VdErc^cJt#}#fup!5;H+0Jab z7f>1ll$VScLb1udSfv%5rST6Hp75f@&(<}QL2pIL?nsu@2!f1J-h{EN-$t4aN2Bom z4Yd22CG0dS5*lwdP3NwzK(l@a?c@{k4(Fe3X<{-<-b^8`%jFF;=!HDgxQMpHQ|#Xq z6SyOdbVdH?Q2Vq;+XZ^}$GHzhdLV{IGeaHtI`Hfw8sS7A>PMR(95xxv#RZF}n%%X% zE!*QqQ{~!bj4tf|WYz|1+B8;E1$%~i#JY<3Sv*umK=Zi%sWpP8eQ@uWdeFGomQ`1p zVwKiUbD|yyKPP!*!hgz38t_ZLUi0HQk6RG-7cthi=_fGm*JG2#ap;shk;*bR1yw~d zKt+Pti5Hw;aU?q6fTtomJ=cWMqs{A7@S<)k7q6_sr_Dvbo(5_yivwqAylyp4CKI>xVn;a{+P0 zZlggCG33|G7H9FehD~mNIZL!oT@eJ#R103~6HM=Mhb&c%i-HP>qWuu?z0v)7#Pdu$ zGa~2};_8JOJCd!BXK<(7r=5?fOC0lnUp*o;BGrTN0?_jBGYGsJTzMn- zg4$~n+0z1ZX7;j`sLvF}*-P4wHj|($Kzk{HJ5T9zDes4Jn#wc{W9SPdF>xR3!@7cY3 zON6T392$@5V@V>|MmO(-vEjg{AZ9#3X-)i|lQmUvM-;FN z;F)5gfQ~o{6VmPSzVAt{ruu=+euKuI{Y9Y_ED8R?#{Zs^HZ_Qs{f)Xs2+zmwBUa&r z!i?Y5C!6QtbEZmem&zPNVZom&@#G87r{{z}8EO6OO`B^^TkqCv^aNW$5D{QLH>O2z z_=nLjEt4+45jIN^fsIQ!y2mBT6WZjC_`@zdg~ib{2&`}rB61L9IS4-@(t@B%++I@1 zq)*P#y@;I!7b#D0;0Ud6W$c`Wtvbu`=)QDBS?o9pJWh&+(cmI6lf0qy&u=#44(qC2 zvWs%#J<3HX6heyxv^(fJ5(^rf1hq7RjtZG)8pVX3R$JtXVdxIY#F?sn--g`$?4e|q zb+d_HFW2^w7e!9_b7>c^SeCE*7t0j$>i>ynM{VDiR0UDZTIw|82O1t!J_^v)SC{iGD4S5 zFJr{;jL#UGP~Jp7L78Q|ju^T;T~8Pi80yer$=>dkQn7mS=1VJj4Sa&6CcEJb{qvM0 zQ)$y4+oL@W~H z{^f<{Fiml`cv z5|o()l~y*Rrcz>g`U#%B)4red|FEzddABCr04kx6j@0bQz^B~Ix>B@29scP52(+(P z@z@0~G%gL~WJ8tSf;E^fMy|_{G{Z7Ea>8dVsr`cKO$dQ{=g^po_o+_ZO8KU+-3@aqTZ@e>nLZz$2}>1z z|M*bJ8eXout~TOVi1OAHTp>y-`(YpidIYnpQz?)6*#veoyPi{6TPR%4&tMFrh6!z( z(RY!%o~v7HoyMEBX-(NF;&%?=Z2EHbZlQp?_q!-32q=jOUVLW6Q@74r?#R^M(LE5G zi}r9qW)64MD`Z2KMcO*la^;B>!5W6IBe+LL9{@W-e`)K&%tcP^>jCiJlynh-54+A$ z_J;5r!4=Rnj5FF{Xop`L#C8AK9^!11)sB?E0qfKFMQB749@rl8bjx1%j}0q)rL+?m zU~=x~jl=<19ZCJ@?NGFg(@uh> zej#MG+aZ}bDLKv6?GzLk1fM9wXQy`ntfCs8clN%ol5(9YNUnB3gU-ZCzJ3(&Hd9Ua0>3ID><*0$ZMP_?Xed$q5-|(fZk|;{O|)PYEs zBEcT1Rfg;(j(npm_pyEqHE}5M#C3Qeb?=knlI!*B++w4LuQ&#JppZv>cg*zo5;d&v zQ0jqT9@V?2bIVr&2=nNAhQx^U+c&y}Qj7R7sChJ>&ym4DF`)3;mpFo+TwnWVNh@>E*Uiz z3No2C1>@qz54gROQe0oBajC?aImRQ;cSp{1ZCN&(y%* zDU@xu2vTkbDuK)C4$O2j$O)6<4%%n^ltKpISl;w?oEd(0zS_2 zoTdj^(JdNQWX}>LvSxPWkrz;Kd`1)&kG?=h%%yTaS7Fg=N9~lglU?WMrJ19en_mRc zyCL*U8nN-2X^0B}l>lW=csNjpFeqgJ6{SSP7s&()nKH>Jl?p%&6F4VZI%F$}VB`Qu zu8cGall!1eA*$8P`nRO8VCSv}C%ip$IPtgD(EHdYgj^`1=4w**T)*ojKS6 zS(jNdx!ZJ3|2x`!`ppY^cqglv4=vmix#v2di5>mDx}$6RsmH}vX&_(f$(=nbPj{tV zXRDe(o6I{{KA2Z|2tHzXf%QM*=r}8I`jkJDxgTxM96YwlBXlo{vN{sfNZLtN|LW!q)w`J3JltcqMN@KifDK>k$ zj>blp7IGh2hjVE;rN2{L;O%L4A@tk%?Nm}|aEV86yyT)nfHP<%y!RgVWd0@?cV_E0 zYuKYXR>hNAafR;DE`>nzR`l*BoiL=LB7mGNlhG|Jk+lvbgqvVVF%HW_^5+yv#$9?y zK4aE&LeTidlD$*rAosM9ZTGSb2_GIeL0mS2^Zt}KM1QxOcm5A}YoGrQq zJ4FZ35^o=nl3gwkb$h`(2$;l>F$s4hH;es#N08YO3M=)CKXW`ZN@Z4WB=tCkuWBNo zJS618^1$XXp}J!up@qkJCXSxU^$v$@89(3(@&>2Y7Cd3zmcAG|!AdcU zMZha$3Ln}eFW5k2*?@8He5DAblrQlUU!lj8KaGeQZF|UWZNUB=Uec==t^p&DO||xf z#3TlrbohOo8SQQp&L&wB8yS1Y5|5^NfXb{G;87Z*GX!1#B1p$vM$vc zFkl(5=sY|YKXIRw zUamZilKa!ef;NNTLU16L(>l1(aVW!(#xzF2`jpx_QO`l@CWx}kg=QQZ7c{2t zcOJ<`KxfCooV!ZdbFC-~^IGSq>v3nnWWPlySA}Mm(-6*%V`RPf2vchEYtBRztnaq- zdn1 zaWc7%j?T_NYFytfxQfPLvh8u(edA*N1wvNP{rte3ytR8nyTZLtuaZ?3D zxJ@>Oz1@Y+4fP}ZV^`;g{oI%P?BnWg#PyErCc zQf@#1HS|NcJ>qM)x{GZWjfKpnp$vtJP_;xGX&a$1_j3ONS@*MEt&Gky5MQz*w3y?` zu}Kf}hu=&FGeMsHH4vRcdQjjN>?6}Ed2wb3n+?)wu7ZV!9U>DuE+hGVq)Je|ZF7rW zH+!zjc}$j)UtcMF+_@*2v)B{{qaS(FUJ)eZXeeM>b>rS9tZJ&oTV8`L z>%PxRsYQY#HTy+ym36KATC``pPV|DVW>fXR@}9yV$l;;RYT@H$pc4?CMOZ*ovsBXZ zdqryOd2^3umqQ%n_6}7gUPS7OftE5L`jBSXmxJ8XC*=N4SdhTNFU#-6(cEXk(F`pcSy}FOj2SK=Tn4^@%7~q4ZZ#*kOO1 zSX*AJS(bazO=*kx!sj0+G{u!#NF*?nI@%k9ceU38 zhk#qn?Qv=lRFE2Ha?EeOiYMZQOQuC$0ofiIlj=AyN)$Ca@GgN()0yo`KP;u~FmrEN+-w^F3H zQm$!WEd6oK#kJB28nYrQ=tjtkp1ceRd=l*cHrbilNUM6=59qQ02~9H-B@a~uBimr zMAP+hlyLOLZC!LG79>RcN}4mOBH$}QSG(62K3{Z0k9IEdAU@)sSH_0Lz&<8NATC|u zVBs~IEKlUmdj#^LAPVqJzqruFZ_kj|Z)4EtpkU^=md{LW4)m3Ms2QHhR+JcmTZ7+|p@CGk#c*3FEfd)wEuKJaO?W%wkz;Du4h1iGc$F3H=Y8L&p9y9f#9Dtmss9|CT3*_j`?vrkXaDN>n6x)q}7m z)iczck}=8JGf4mQ@tj;M^+t|a2kSd60i+0upFjVEhq<;AvPXqkQm6ZD_tR9nyV=Q8 z9zidV&0b81IGde;ZK~{&7<>!OnI?-3&jG*>Nlo3Tq41B!c)plQ(D!+Pb(Z>e7eE~6Dar{jVrtG2EwsS_)OJ1HHc z12+=Qak95^h~T$$hE-gyu9xxgmKCuihh1M22|~MxD-ebh$0YidZISSy@zSpu(;1bZ zV#`$Wm^-y1;r*^ekrqRZ7~*laa?~V_i1410mj}abTih)6IQ#Q@nkvv(k_?M`Y%v!} zY~DdZ`?uAFw^FY`n5#;t@0WYS>jHP>B(DvCqu`<2EW1nx_ERi__kC$xa7BDMWkR)L zlPa`4_I642G(9d2HV{$i@CeFRsqTV(bOBZ_@4PzbGb&+M_Rr=%^Um{@2 z!QXq^287sh#6upFp6p2^lAy1aT`s;hkLaGaqGQ-C)VYu6`x;k-eNk}dE7|7YUHTp~ zbLOhmo|fS;?D8nH$vHpc3jp;I>Ud_?VYdTHCOs`3roMQ;b-z{t%FPB`k6%w z4@VJ?-X$$_aZIb%0cu56OR6}Qam|SKo-4(z+U-|BTcQfzP>zUrB=xV|`xjrOfZl)f zSDck3XPauhvWCy1(4U;wQZ zFZVXQMq=IO)IK~}66=@BY{fR!1 z+Ra=)312f~Kw(H6F6>?`lG@anan>L?I-e^;=y;UfEOxy7;wfCih-_}5A zNMlGRh@I#;3K{|Ku+%c8op?gzWPweKigaJ)h3%V5eGe&vswYjJ1b?#P;Ew$MSF2>O zkqIsYtAJU_-G9a(m#*RIFPMI9lvNN0a6F=lR?5vP+c&FGs|9 z)LY?4<48V}4Am3sw?_1gzp*vp3cqTiU_QE~!gHp$=IGU`1xj4DW~o+ASe3&n>n80L zM1vBWXAO=k_IX4GH8R9nYYHThccj>isPJ>6Vcx-};b6#JRVuufrq5BkHgymL7u?#D zQ`tcz$UvGexmpo1yfN)7 zzGZeOh#4`?D9b4apBx|7Fr3%hl45Igt`nr(ts&e|Pbt+yOVBB_Tw&DXJVJGkfC6#w zTin6fczPbuo}h#s<(KaqGYSMlIAoc!U06m~%^?po=J5_N_MiZ(giM<>k1yYu{cxI5 zv+J-9%j)$E9*}f5@Hi0ky&RQ_!MjGpP2#tdvtTtHo}xdvZejgi5OgS~+;<;?P@nT| z^$>VFrDsFa=C#ijv}H{Vc#2l~HNG6YrB7l8?Fid+NmtL2wkD7+QzBA{o2kDjUd8uI zAuyLsP7xY2p$xc0|FGi3^C|5k@eAL9A|oGNmE%`_rG7OVdjI305-8msJcJAcv`hg6 zMDs8Iq<_o4CTQ$p>1OHjAB*jp&)hO9OH2IZGIxo4;6na=Bs7E|pXsBb60VH3c zzUB|5WuzTuWOzE7frwadRoa%g+E=wMt*g~U*5Cw1s#c*twQ6Z=cXl=}*J!;xEOvN* zIPYY!q8z>W68xHOKe0Q>{&ux?^>X`6{lrqBH&68CH zK9#VC-4Bn*px(y=d=HLGk+0SV0_+NM22O+O5brMv@~WqxNwaIP=Nj%WT=Fg5APmMW z*g)LMJ2}nlc7DJ$Vnn)|B`ogoj?ue1nkMPW37FbMI>;cVvB#2!-8m|{#j0yza?~+v zq^jgHzF!X5I?}VIdDObAHodcJbNW2WGYHl;c?JsG{%!$zTStig4xPSxh#dW165D>M ztt?&saRHjm#IbG!n4Z;H!C3i#kG|#*FuX~BDZr@B$TC{obW{ykGqR!plp0x9^(c)gIBl@!}L)G*j)0-rhf+MLZ`on zWYu%v(Hr2a*`begQ5C5Bbycpvhir8Pyi=h*3anFu#WTVn4Z2OH@2GIhJ{)Z40r}n~ zrdKua5gJ%MRvVZZ`GQLGw{1*s(XD$%^CK(uw+`$4K+ zG%W1cu<2)iyoa(hK@r|fR@_TwkWxhB%Bk&CM)FZ8cWg)NEKl6!V3`};VHV0w7F^df zJoB(Xvt&y#J)#+!vE<;5OCZQKq|!jz_$?eeHsjlJUZV*^HfA(DW6|norc%ci7&Zpa z%!{w9vNqp|%uXEIR-)Z-x`_nZ5ut4v3R54p1m(T^A{m!jzg*P!?zFxLm+qvL?LcNV z?B@HCu7?7}8V!qoRrsaw13tY$BaBw4#U{uq!))0skI2{w05Yaw!F5hGsuvoB34D@$ z075vXvW~_M5`;GrPhDvz-f_9t=RfHbiKl5PHdT%`mMGFhTs58WQ&>i|#dd9zAvaY5 zheaG$Ru;z?&85zQbz_5YF*x29ECHd>&zN zb)gOD@$i!UV7egH;zuZQ2NCYZnP|AM=|g`6 zm}pzGET>8Th~e8GI)oNBmMS94*nhNStYq|;H*_zu1Oc`dm76FDrgx963$8gtPtnZk1xSuBAO} zL0$^WBw0X}CX||x)-e;WmGgt5_DA$dWi#}0GT>tE7G@qCogGWP{2?0+a`Z{Gp>7Ma zA?zRn$(Fk?9P8@S?Kkfx5h!1!SPL8DCO3HH!| z_u?VDbhG%(b*S7Nx2`3KlvF%m=dlP{FKsZvB1)6KEJTyo8F4$>efX}apDpd4l#(RT z{hWcC+rZ#QoWO;$V`nk`uyPyhxKJFY&;Ang@F&SU3XAwGLL1eBel{fN?1S%O#1Pc$ z^T~RkT)BkAd_Z}z<=Rsa}Jw2Rc=ddNRy3k zHK`PA`fWE4nob)ijcJt{r|Zp;4HG9zTbzW#nj_@~gfO88bXu6sTGMdckk4|}3Rmg$ zQVi2|(>Tyg=+vN;5$PK_ilv~B#&Jn3(?d3W1_5awS2mz<)uX( zjV*OuF+sX`iAh*+Oh@IMs$2vKfRBaz;%o&?`P%h)CQGq1Y-FFtiwl=tGqFl;D%LG( z^vqEBhA3S|eJYhhS7vYV3Yt?_l!L85%R)^JqEWEB2}gV0vA*o`$Wmiz2M_|AICx=y1luIq9R=|v+Ew!sI@ti*q}$>K+oUx3?hkf7|BDXDE8Vwt zk@bN$rxwE@$X^_Ql;bP1+aO=B>q5-5tbs-|Gva>kLZ}<8!sW)Z@{FJJ6uF5pCzo?w z^5ptXxl?xk27BDg=~EJHWP4_NS2vOPzCA!Q=BCVZy%P@k~$Lcbykb9aXB zGZ{KMq5qS_>hiN?PTrnA@t{fVl_VKsPTtYZ>8rLceEXTRbJR@l!OrU5YrsXzen~-|;Ll<0BVzS-)~34^)>-Sepu_4yz*`$M>_cah)47aa2= zNq^}VtFLaE_US0%SK9U860n`dKB-tk%2soBt7NK80*K`#HfeY zxxH>37?&;ooukL-Ww)K`if6XzAWgG(ECGP0;0j;6x>ItI*T7)~Rhx2>UpR}lo50Lr z>^QYbbQ9M(+LP4maKZ;Nh_1w@Nz&JZCY3H)iZ+5sD3m>JMD0Hfi)_H8)m(R z6o*|of&UYE?1cj{Yj%c9=KgMsfr^vXRi&`MX{CG+a-+Txx=!hA`q|Bms0Z{0Ab7cMe+% z6yj-dhPAy!`Ef`@B2f)0&pZbF**V8^hAwQ3Il>1Oi8Cei!2EIH(5K#a^J&b#!-_sq zqTiXSKdi+3;5>_E)Hv=KwBk@#E8`mVTgnmVY-54!)Yk)n_yrk=6=g(Zf zmFL&q=v~`kyJxMx*$U8W6^gEY!}k$aq%JLONe=%!P2D9QJh)xFr5?5i@kP0%9<*P8^}oviO1jMo-1z~f zdI6H=DAj>Y1#wX*`2)@y6i);PpurWuWr<>2Fx`x1OyrtFoI%}Uu(I$(_(Z~$>kEX3 zZtw*Co3P%|1@Cw?$$TIBJ)G7!0 zzg*~@7upN7xqPHg#^gI!OH{Xj{WA}Gj}AJhfnmV#?t5dO@w6#YFjw%9iYpQfiVC2< zLaQyT(&<-rO)=y0_b>PThxpzXDbw#s1T*1_Yo(?;hOI(WU6;(I0faGjOnN9Cj7_mB8a ze0r0mecI}E@vTS3jIjE+MU+~y*V<0BNFqDQUz!Qnn^}9tA(RB)n2xH{^FQ|~I^WaG zYy$^pwq=*TS;pqGUb?!^19w{5@lwpn&hc1Qp|I#*oC>^Jv2%gKoL!Z6fJnVOds6{> z!+H~h$>rr^?Q*2$7KV6S;YYiVB0a#e_V+HjEniHqp^bV*`T_%Z?pWMPY~12B^wRRZ zXa&DWYOAGw^~)@CUZn2})epw#$#%TD`_X>8??{2J0}HhW;6X@6KX7;WMTi&uICnRQ z;xgo_k~zRV5qBYSLV+bQH=lG`4MwZGf9rWwZ2YL$ZDqRGAPwyk@=`vgzPcApJBfSV z6+lKyxhYM}mcsrF{iJa4mcQ}<#5xJBVLzEjq(4ur(wnBmep!-|^*HBvWDBJgQlWZO z1?(LHWhI`KAItm0)9;Nh`1>6zlvdR9sC07&mwtl9(Q~H-UM8I-hv1f+dpCmAMtxS~ zu!t00uhg@R%q^$j7zR|4ERaSI=eYUg8#0Al7o1d9*bRfkr0(~QczB>!a+TjyKc2Y; zHgH&SwngT?!BFoAdU&V7i+=m$od{gJ-X6VuBB>MGyT+4p;uO+xLHN0( zQ~m})S%a93P@=!s6wd(5{0#R7Z`^iOya@Wj%Nyq$b0YN{)D3lxXLW)gAf^au2+RDM z6Y|)vkl*+koa0HKK^u&JQ_8QTH=%T3NQ&xLxD|`n9tszxLJ+(M9CiU(P)=E<6@wjl)XOFY65F0zXg-gPPdcjLa>Z}!p+ zncz-CP37_CNi$0V#S++^7 z%FvYQmJsVgjn)O5LDd?`h+ECg*4>d1l~{*R^REe+IJ&$xRa6w!Tf#zd^*Z)dQ}UIa zGh72S+0$#vD!M*danVRk@cro-mZk~;eu2~RL7L1#n$$@fnDiV-Gx7kTpid3d zns~S^Kua`Lozt7@>@4YB&5wPrAtQfJC$_uT5ePR(W!wh~w@L}O3XzRo+PNC+cSSJx z@U3?ntxbv#^M1z z+l!<1+cbL0^%anUTYF1aBS=syKUJBLn~6`x2lb1Q`Iw2-Jd}gGbuQ5J^$vMTR1Uj~ z^;z1EzC{#9?~|w9aH>q5m`Ug)66q9PLAHzVrF0y&cHSB?J}}%t;)M^yDMDnoW{H`Y zY})+}Y?eSVm(YG6-f}7Z3V2YC02A>hygDWd?u&9{Pg8)?m-^}LDaN6hor7>jC{j_m zCmL>gl@U1vDdvRW!dknZ84Ze70y)0 zU2UaLiUr{_Xols#Jq=Sfu@*6PvotpSTZtnnJInth-=vjM1QFjudE8JEpWl@Hw(i?NB!{U51~F4oCp#}c&C`mHH|Sa)VxxYm4AA8 z`nl5GwBzUf3wjs-%EaKnDmB##9cyZ>Ep^y+v)*BGfEI=o#x+zEYfQmOzvrYtrGJ83 z+$L)}RBv9(GW6Cg?)o-#7PPLRy<|yy`{yw7uyA)T)quKINF}L@2%%1>NzMCjq>RxC zG+1LHWO*%`}K;F7W-NraNc6EYF=wbb>cSP!b0LcskQEw%!@X7sUwAYT{^rg=IO zGIw#qf!H{nl0oxA0mDsrrP(5$dLq<^wiy0A05s9PeI3a^)p%@WEdfOtNQXOcf5UEnBP++Y%i z9mW|%FM}XA>xp4E9mf_)=z&Zrq$uGcpM_y_DahjzxCCy0y^`01t|ssj(FHX{Os^8rDA}x@ zP(UE(678`~U1yekm%#$JDiwK6DZc|_G>IP))gh`A>BPzeD%=)N@Gv9nw(6Hk3}2J@ zos##Dvg-{1KBTNz5hq{KPd z$Em4y?~^IcovUkpem`IhVZp%`4i_DDBgIj~1uo1~7nAsApzVpuHYgCC^ar@w-a1;d`oBhIZ?h+-B-7Dv+0)_Km|9t@8+2D|mZb z=QQ=;UbzOGg_J$AL9LFR-Tei8;c9^p1`??SH2Slp#vA?nM&Zo)L~}>;xEH0I&WZHO zn1Q5Z|B|hddwep*CeRs)HRix^12E{Y6OgPHSV;sP`UearNkztHds>fti z829Fhs#N=r$rsFbeRZKZ_wEk+2y>+^gAR4U$uC{~6;SfJleZuMwN}x#>oo|wJ+?t7 zzwgZP0t6j{WYkAIO1? zi9Sw6n+S!~W+}MU^9uD44HidZmMQrbn;kgnRgM)(=|&CfqgfjkS+ur&Tc%*v=q5!R z8uVf43}7y*gqX>`iUu#|hh)S{Fj1QSlAqEh@{tMIO^iu;j(G{~61$K&X0j1(Vzv=( z)U`-4N7j#3;6T`mBdFqeMAOh4gfM^-a~i?3L1t>|7T3Mt+KW#sxKQ6qr;KKXZees{6pv%iNgx}kh! zcB#iAPwF!&5Y4)41=##dMrLyI*1F*03N~8I z`OIzIJqANEIG_nN>X@7ojqkZ76jGpM4~{nq2eN`O;~zcAUAVFBiv8^~{LIE^*O$nFPGodw417SVTu<}aMv2JAzsdC)i`_9BteABNlrR)UMTnNRq z{#+1I>5!Q8GgC*F5_HSey`B1;m8}SVh#^ajJNrJBQ8)&xpqS~s51|j8uDP<9P=y|5 z#N*{CEfPFQwv9+vOXu()@M7DUBn$%9&{$)%l;0X8);FE`L8ifpQ=lIlG5KX$`>|!? zvwZZ`)vN{-aS(Pz{@-mrgG6mpup-SL4t)e$_n8*9Yz}znG@b`W*m{~j6T9H(7uX!w zCewP`9^k;azh5LZ+}6nbk_$V|9gQx}{jcJ{k&F#ry z(;LNM3$DElip{WvUb-dWj~P{XBd{Hh=Uh8YsA4+fWY&3(BM+uaLj5LeFVWEUTv#VD zzz!6G0ad0w^3*2&-G)jfH+t&Ql4`r~O8U`+fYOYhYfB=Y09+f8JR=~0J^cNGRju=@H8F$uU z+PUfoj_H733k!VvC7>iyenvJgK;u3dB@6cTxrD>@akpg<=g2W96kmcFW`imh3pz_Hqs1B=3`du6VHzO1F8G zSm+eHCl9F?*O_X#nh&5a9Yc)N;KHyfnZ;k6$LiKlzu2S#>lKQX|X^Bk&?J6={u9-ZjSpz%o5s~RyAvDc5Ov% z#VQR^aA{=3;TDZFy4H0c`^%oS?$(g^r|CmRsGzZx@wCqDZ!_&Dx%WHHv)|rNiNkA{+MJa*? zUoNqmKLH?yhNtvU8MfgeOGB8PKLEGMRZxr}Cp}P3ytVX;YN4f(^%G;$Pi`iL&Q)zd z)K6T`Q@-WVQ@ADSp$W-Nm{vErR~`S&3QkY?+~L1$ve7N()j$?xoGOuiyw2Y=H5IgnW^TU(--WuA;sBoWHWc*6Dp8zcoYdUPD3}5 z)Kl28oSLGY$=%A*YGVob>Qf_7K;nr?s%XElAv1walIqT7)(e1zPG$$F(O70Rly7g~ z;FUNJ77mFmMy`QQca*r}NCsHqoA+A6ii}n#>P!E4B25ZCV%cC6?wBQmgHk z`8o2l->O}MyhiGq=Qs>*ZA&(sa1XITSJ42KpstzH1QH{8aAJ+EsC>C6txT za?T7saSCI}mc-gE-)J*!K;;e2s-iQ}bdCFT&Z>!)n6$nTwd%R{L1=W?R>dg$sig7@ zvq4L|VvMY}a zK4*uXyc^EUonDd_=o>NyG7K6>|Gmtl3msxQvR)Q<4=avEfGF#mSWHgKSG^8ZV@>qboyJr=4OW@tqmg~Xmc;7Y z2&R$`LJ_%SQg{qpg6cc)-S*bgrv!EC}`Dp10P%axsG^-EQ=jtgtThPHV!K z4fuUS8I0|WZ@xLn{f0_26$mvrkK+>7Zkkv&Cnu`@pvm|YK*t%7{;1fofXcz_ZS+es zsfuViP;2xn@W7WY2D@{{WfV!?am2Kv1rla@cWbjVQ-8=f2fL#pwL8sl@hlr`HuA6z zTpSa`WVVVyiN~y*P!VbLDsAUDPL|j-x?mSen2D>a7%a6m-9-o@8IjAk9og=&Ylp|oV!5`r zCYnk1xsX^HTF7kmfi+OYEYIIr%v*LY(IS$Oyl4>VSj759shSK1g|r>1 zH6=DZ41t!=V!qi>PD1l|e){v1P4bGLXWsZ~a;NHN#h0iP<28<&4cafx>bmLU@)KIV z*Gsn>Z7O`faOsWLu7d_R_5JMiW;tPi?Q5NSsI2vd{P^mx(n~@&?nzz0q2t=khQ;_0 zihGZ*)}Bn6TpRPBR~sIRJ`T>>VN7tq6q^U=D!g{?&29+S^5~4ULf$Q!u#!2IWn8d3 zsO2sP#(0Fiyz#?iwN>?r;(po9YLGE#>TK^De(fzrN^9H*bZ;!d;|s+5W#U1~6lhSa zf+gfjVh;(PFs=}m-$0EmblYW^eADZKnIu(jjA`2P9`DCL5%=}*u>@_9qlgU=8duPl z!U3pYi=y^t8WkbF$r-TB24)6d@Wfab;WH6WZe6n#=3<_}5~7&{*TGja=pVm{6MdEu z4-LTV9kHr(N6yv-Oq6YJD#i$>wo#FYIh-M#+xW~e_Y?#wvzrK52g8E{<*&sIYXTtBT&+kmxi9Whr!?5@^>!muua+F-@&;pmC4 zLThs5>~~|i3NUuzRg(e5Xn4^o(T%=X$n@oP`I8~ppJAP$JXecy(`3Kg_HfU(#b}uh z&50eNA&x22ch%c4)F{#m@q|J8VI>8H1Y3yqW=mF}Jo2i4E;t}!D8~u$Za@t+W!}?` zXYcmx>&x{+h+_-_%CjjM-)N+{f-+^|@G@5QnjTONpy&0UpPtfsr~EHG%h< zVitOzSny0_ivG0>XImg(>V<5ZVil-z9|&t`Iz|8;ZP3q0&vltTwOlIO-F)Vh+;%Hv z$n_gDXA-G&_QWv0tOq&D0ge97&Fe%r`s5o$Z_t<@J?|6WZvd6mFQ5%;-s`FdPkPtq zhT!>>qI{n3C-;}Nen&qscWWuxSs(fd_3@uo#<|3P)s^a}nD+2`y$zJrt zcPS!Kbt-nL7(KDeezfK+x967T06(3jN~9AE49F%_5a%mzcg#*>-91-MI`Bq1Ixp+e z-^$SRcUr>tf_ZM@VYQsJJ0C+|%h6zua2~jBPrSNkRVhn5o4Y`B+5G5p*1=kch54d; z%-tA`l*<_CD~IF!vqE*#85(URx)QODQ8>-P*4{+&L8H>J-;#((z?R zF{NdZrE7Alv19!}Ug>nNrFm$ZMno`(45w*-&Xo6ky4yr@j)v5I{2BRHuH^=9dKoH#z=IO2J}Ht%tH zhxft9A1IMEphYi{4ZIBEjwjczL@jR1WRo1O2=b1+d~Jfcm!xfqk{4vImuZeNX4*bL z_ZE8nk~GBBN@~KfBCDDRY~gUPsPKG;BmVfvQ%@zNDg7y!^ApQjVQzQEqShwi^ z1nmE-ulN(|Pl4NCST<7shgkn8cl#6IPg&Pr04vh}4B)>MdHvb&pTeZS8n%=DR}KG5 znbMyie+pdw0*R9U_d)*mL%=`r{uC(ug~zS*Z{z)QSN=1+`Y(uG)qe%?zXx0YY5bp5 z)n6@NS^Re`|8wH%PlP{-hQAOJt^XCmKRappPuk&6j6V;0|H5#y`?oRv`w{>1xacpq cJg0vb?mq_{9O7@SAb!4@KR Date: Wed, 4 Sep 2024 15:08:39 +0800 Subject: [PATCH 5/9] Add ADPFManager::destroy --- native/cocos/application/BaseGame.cpp | 2 +- native/cocos/platform/android/adpf_manager.cpp | 6 ++++++ native/cocos/platform/android/adpf_manager.h | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/native/cocos/application/BaseGame.cpp b/native/cocos/application/BaseGame.cpp index 054d7fe7cc0..56406785f52 100644 --- a/native/cocos/application/BaseGame.cpp +++ b/native/cocos/application/BaseGame.cpp @@ -37,7 +37,7 @@ namespace cc { BaseGame::~BaseGame() { #if (CC_PLATFORM == CC_PLATFORM_ANDROID) && CC_SUPPORT_ADPF - ADPFManager::getInstance().Destroy(); + ADPFManager::getInstance().destroy(); #endif } diff --git a/native/cocos/platform/android/adpf_manager.cpp b/native/cocos/platform/android/adpf_manager.cpp index 3818826a65d..ff9e186944d 100644 --- a/native/cocos/platform/android/adpf_manager.cpp +++ b/native/cocos/platform/android/adpf_manager.cpp @@ -87,6 +87,12 @@ void ADPFManager::initialize() { } } +void ADPFManager::destroy() { + JNIEnv *env = cc::JniHelper::getEnv(); + env->DeleteGlobalRef(obj_power_service_); + obj_power_service_ = nullptr; +} + // Initialize JNI calls for the powermanager. bool ADPFManager::initializePowerManager() { #if __ANDROID_API__ >= 31 diff --git a/native/cocos/platform/android/adpf_manager.h b/native/cocos/platform/android/adpf_manager.h index 9dd7f7d02b1..ea76d585062 100644 --- a/native/cocos/platform/android/adpf_manager.h +++ b/native/cocos/platform/android/adpf_manager.h @@ -115,6 +115,7 @@ class ADPFManager { AThermalManager *getThermalManager() { return thermal_manager_; } void initialize(); + void destroy(); private: // Update thermal headroom each sec. From f832734d6ccb0c3a97d2a849aa0f32f076d8010f Mon Sep 17 00:00:00 2001 From: James Chen Date: Wed, 4 Sep 2024 15:09:43 +0800 Subject: [PATCH 6/9] Fix memory leak for android platform. --- .../java/src/com/cocos/lib/CocosActivity.java | 15 ++++++++++++ .../java/src/com/cocos/lib/CocosHelper.java | 24 +++++++++++++++++-- .../src/com/cocos/lib/CocosLocalStorage.java | 2 ++ .../src/com/cocos/lib/CocosSensorHandler.java | 5 ++++ .../src/com/cocos/lib/CocosVideoHelper.java | 12 ++++++++-- .../src/com/cocos/lib/CocosWebViewHelper.java | 9 +++++++ 6 files changed, 63 insertions(+), 4 deletions(-) diff --git a/native/cocos/platform/android/java/src/com/cocos/lib/CocosActivity.java b/native/cocos/platform/android/java/src/com/cocos/lib/CocosActivity.java index bd27d9f10a3..55e93a24ba9 100644 --- a/native/cocos/platform/android/java/src/com/cocos/lib/CocosActivity.java +++ b/native/cocos/platform/android/java/src/com/cocos/lib/CocosActivity.java @@ -137,7 +137,22 @@ protected void onDestroy() { CocosHelper.unregisterBatteryLevelReceiver(this); CocosAudioFocusManager.unregisterAudioFocusListener(this); CanvasRenderingContext2DImpl.destroy(); + CocosHelper.destroy(); GlobalObject.destroy(); + CocosWebViewHelper.resetStaticVariables(); + CocosSensorHandler.resetStaticVariables(); + + mVideoHelper.destroy(); + mSurfaceView.setOnTouchListener(null); + mSurfaceView.getHolder().removeCallback(this); + + mRootLayout.removeAllViews(); + mRootLayout = null; + + mSensorHandler = null; + mWebViewHelper = null; + mVideoHelper = null; + mSurfaceView = null; } @Override diff --git a/native/cocos/platform/android/java/src/com/cocos/lib/CocosHelper.java b/native/cocos/platform/android/java/src/com/cocos/lib/CocosHelper.java index 382b24dfc04..bcfe7dc0315 100644 --- a/native/cocos/platform/android/java/src/com/cocos/lib/CocosHelper.java +++ b/native/cocos/platform/android/java/src/com/cocos/lib/CocosHelper.java @@ -78,7 +78,7 @@ public class CocosHelper { // =========================================================== private static Vibrator sVibrateService; - private static BatteryReceiver sBatteryReceiver = new BatteryReceiver(); + private static BatteryReceiver sBatteryReceiver = null; public static final int NETWORK_TYPE_NONE = 0; public static final int NETWORK_TYPE_LAN = 1; @@ -98,6 +98,13 @@ public void addTask(Runnable runnable) { sTaskQ.add(runnable); } } + + public void clearTasks() { + synchronized (readMtx) { + sTaskQ.clear(); + } + } + public void runTasks(){ Queue tmp; synchronized (readMtx) { @@ -135,12 +142,18 @@ public void setBatteryLevelByIntent(Intent intent) { } static void registerBatteryLevelReceiver(Context context) { + if (sBatteryReceiver == null) { + sBatteryReceiver = new BatteryReceiver(); + } Intent intent = context.registerReceiver(sBatteryReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); sBatteryReceiver.setBatteryLevelByIntent(intent); } static void unregisterBatteryLevelReceiver(Context context) { - context.unregisterReceiver(sBatteryReceiver); + if (sBatteryReceiver != null) { + context.unregisterReceiver(sBatteryReceiver); + sBatteryReceiver = null; + } } //Run on game thread forever, no matter foreground or background @@ -197,6 +210,13 @@ public static void init() { } } + public static void destroy() { + sVibrateService = null; + sInited = false; + sTaskQOnGameThread.clearTasks(); + sForegroundTaskQOnGameThread.clearTasks(); + } + public static float getBatteryLevel() { return sBatteryReceiver.sBatteryLevel; } diff --git a/native/cocos/platform/android/java/src/com/cocos/lib/CocosLocalStorage.java b/native/cocos/platform/android/java/src/com/cocos/lib/CocosLocalStorage.java index 79fdb0d1a1d..2bb57fe30a9 100644 --- a/native/cocos/platform/android/java/src/com/cocos/lib/CocosLocalStorage.java +++ b/native/cocos/platform/android/java/src/com/cocos/lib/CocosLocalStorage.java @@ -53,8 +53,10 @@ public static boolean init(String dbName, String tableName) { } public static void destroy() { + mDatabaseOpenHelper = null; if (mDatabase != null) { mDatabase.close(); + mDatabase = null; } } diff --git a/native/cocos/platform/android/java/src/com/cocos/lib/CocosSensorHandler.java b/native/cocos/platform/android/java/src/com/cocos/lib/CocosSensorHandler.java index a32746e982b..114a7608221 100644 --- a/native/cocos/platform/android/java/src/com/cocos/lib/CocosSensorHandler.java +++ b/native/cocos/platform/android/java/src/com/cocos/lib/CocosSensorHandler.java @@ -58,6 +58,11 @@ public CocosSensorHandler(final Context context) { mSensorHandler = this; } + public static void resetStaticVariables() { + mSensorHandler = null; + mEnableSensor = false; + } + // =========================================================== // Getter & Setter // =========================================================== diff --git a/native/cocos/platform/android/java/src/com/cocos/lib/CocosVideoHelper.java b/native/cocos/platform/android/java/src/com/cocos/lib/CocosVideoHelper.java index 676c3191e7a..0495b0c4a3f 100644 --- a/native/cocos/platform/android/java/src/com/cocos/lib/CocosVideoHelper.java +++ b/native/cocos/platform/android/java/src/com/cocos/lib/CocosVideoHelper.java @@ -48,7 +48,6 @@ public class CocosVideoHelper { private Activity mActivity = null; private static SparseArray sVideoViews = null; static VideoHandler mVideoHandler = null; - private static Handler sHandler = null; CocosVideoHelper(Activity activity, FrameLayout layout) { @@ -57,7 +56,16 @@ public class CocosVideoHelper { mVideoHandler = new VideoHandler(this); sVideoViews = new SparseArray(); - sHandler = new Handler(Looper.myLooper()); + } + + public void destroy() { + if (mVideoHandler != null) { + mVideoHandler.removeCallbacksAndMessages(null); + mVideoHandler = null; + } + videoEventListener = null; + mLayout = null; + mActivity = null; } private static int videoTag = 0; diff --git a/native/cocos/platform/android/java/src/com/cocos/lib/CocosWebViewHelper.java b/native/cocos/platform/android/java/src/com/cocos/lib/CocosWebViewHelper.java index 43debe9ef8e..adf17aa99c0 100755 --- a/native/cocos/platform/android/java/src/com/cocos/lib/CocosWebViewHelper.java +++ b/native/cocos/platform/android/java/src/com/cocos/lib/CocosWebViewHelper.java @@ -56,6 +56,15 @@ public CocosWebViewHelper(FrameLayout layout) { CocosWebViewHelper.webViews = new SparseArray(); } + public static void resetStaticVariables() { + sLayout = null; + if (sHandler != null) { + sHandler.removeCallbacksAndMessages(null); + sHandler = null; + } + webViews = null; + } + private static native boolean shouldStartLoading(int index, String message); private static native void didFinishLoading(int index, String message); private static native void didFailLoading(int index, String message); From 4820a001e6916cee2a71561ad29243405ef5d9eb Mon Sep 17 00:00:00 2001 From: James Chen Date: Wed, 4 Sep 2024 15:55:05 +0800 Subject: [PATCH 7/9] Fix clang-tidy --- native/cocos/application/BaseGame.cpp | 2 +- native/cocos/application/BaseGame.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/native/cocos/application/BaseGame.cpp b/native/cocos/application/BaseGame.cpp index 56406785f52..73b774e7f4c 100644 --- a/native/cocos/application/BaseGame.cpp +++ b/native/cocos/application/BaseGame.cpp @@ -35,7 +35,7 @@ extern "C" void cc_load_all_plugins(); // NOLINT namespace cc { -BaseGame::~BaseGame() { +BaseGame::~BaseGame() { // NOLINT #if (CC_PLATFORM == CC_PLATFORM_ANDROID) && CC_SUPPORT_ADPF ADPFManager::getInstance().destroy(); #endif diff --git a/native/cocos/application/BaseGame.h b/native/cocos/application/BaseGame.h index 0558d9fec2c..1f432b6199a 100644 --- a/native/cocos/application/BaseGame.h +++ b/native/cocos/application/BaseGame.h @@ -44,7 +44,7 @@ class BaseGame : public CocosApplication { }; BaseGame() = default; - virtual ~BaseGame(); + ~BaseGame() override; int init() override; protected: From 04ca33871910624477c4684070ff6e526cce01b9 Mon Sep 17 00:00:00 2001 From: James Chen Date: Wed, 4 Sep 2024 16:03:15 +0800 Subject: [PATCH 8/9] Use #pragma once. --- native/cocos/platform/android/adpf_manager.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/native/cocos/platform/android/adpf_manager.h b/native/cocos/platform/android/adpf_manager.h index ea76d585062..7ba133aad8b 100644 --- a/native/cocos/platform/android/adpf_manager.h +++ b/native/cocos/platform/android/adpf_manager.h @@ -14,8 +14,7 @@ * limitations under the License. */ -#ifndef ADPF_MANAGER_H_ -#define ADPF_MANAGER_H_ +#pragma once #if CC_PLATFORM == CC_PLATFORM_ANDROID && __ANDROID_API__ >= 30 #include @@ -186,4 +185,3 @@ class ADPFManager { #define CC_SUPPORT_ADPF 0 // NOLINT #endif // ADPF_MANAGER_H_ -#endif From 8271229318e53e12de27a96a876672e1304c4c2f Mon Sep 17 00:00:00 2001 From: James Chen Date: Wed, 4 Sep 2024 17:55:14 +0800 Subject: [PATCH 9/9] Update external-config.json --- native/external-config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/native/external-config.json b/native/external-config.json index e161837f64c..a71a9ab94f5 100644 --- a/native/external-config.json +++ b/native/external-config.json @@ -3,6 +3,6 @@ "type": "github", "owner": "cocos-creator", "name": "engine-native-external", - "checkout": "v3.8.4-5" + "checkout": "v3.8.5-1" } } \ No newline at end of file