From 40ae4ef6229e906c14e93ada4fc1451ecdb28649 Mon Sep 17 00:00:00 2001 From: ybx <3046829330@qq.com> Date: Wed, 19 Aug 2026 09:47:17 +0800 Subject: [PATCH] feat(windows): add configurable application logging --- .../windows-log-settings.png | Bin 0 -> 364772 bytes windows/tauri/src-tauri/Cargo.lock | 5 + windows/tauri/src-tauri/Cargo.toml | 3 + windows/tauri/src-tauri/src/host.rs | 13 - windows/tauri/src-tauri/src/logging.rs | 2681 +++++++++++++++++ windows/tauri/src-tauri/src/main.rs | 37 +- .../constants/settings-actions.tsx | 1 + .../src/features/logging/fps-monitor.test.ts | 62 + .../tauri/src/features/logging/fps-monitor.ts | 176 ++ .../logging/frontend-log-runtime.test.ts | 45 + .../features/logging/frontend-log-runtime.ts | 292 ++ windows/tauri/src/features/logging/log-api.ts | 50 + .../logging/log-fallback-notification.tsx | 40 + .../components/log-settings-panel.tsx | 358 +++ .../components/macos-settings-panels.tsx | 16 +- .../settings/components/settings-dialog.tsx | 5 +- .../features/settings/lib/settings-access.ts | 2 +- .../features/settings/lib/settings-search.ts | 1 + .../settings/services/lithe-log-service.ts | 82 +- .../stores/ui-state/types/ui-state.types.ts | 1 + .../window/stores/workspace-tabs.store.ts | 6 + windows/tauri/src/i18n/locale.ts | 114 + windows/tauri/src/main.tsx | 3 + windows/tauri/src/platform/tauri-core.ts | 7 + windows/tauri/src/utils/frontend-trace.ts | 40 +- windows/tauri/src/workbench-app.tsx | 2 + 26 files changed, 3973 insertions(+), 69 deletions(-) create mode 100644 windows/tauri/design-qa-artifacts/windows-log-settings.png create mode 100644 windows/tauri/src-tauri/src/logging.rs create mode 100644 windows/tauri/src/features/logging/fps-monitor.test.ts create mode 100644 windows/tauri/src/features/logging/fps-monitor.ts create mode 100644 windows/tauri/src/features/logging/frontend-log-runtime.test.ts create mode 100644 windows/tauri/src/features/logging/frontend-log-runtime.ts create mode 100644 windows/tauri/src/features/logging/log-api.ts create mode 100644 windows/tauri/src/features/logging/log-fallback-notification.tsx create mode 100644 windows/tauri/src/features/settings/components/log-settings-panel.tsx diff --git a/windows/tauri/design-qa-artifacts/windows-log-settings.png b/windows/tauri/design-qa-artifacts/windows-log-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..f0415fdba9477007276c4baee1d6bc083f003075 GIT binary patch literal 364772 zcmaewbs$}D{}>C*O2;hZm78W_y4%$~-QBridTP4cl@k}&#TcgB)!jK$Gxa;x-@V`W z{r%xO-1B^%^L#o_pscjWO>{zZBqXGpVxofbNJy8LXk*t=fL~8!`hAd)ZX<~aK38-` z-aNbJPK@x_IqN;twD+b$9c`R;Q>Y9wsLUICOE(s#p26ND1+QUiaryj=%}blo<^Bn0 zx6Nm9^ES=5=BmRHv?A}w6k>$*b{;(UB@^{sbvU`;;tFm-QSlD0S8@Nu8OLq6oW!(J z2Q_x^O!App*p0l+hlGs!=f?vWS{w<=^#|Tazdjl<@01dqcIhDJg#G^KkE<~T;M+f7 z=uq6ajg%tR%W5a|K-K%%FBm@;zGy&V68yDgoDB-9x6!0R&#Oxq&5ggl_yzHuwl~3} z@6XcMh5Z2O8B?m0Vdy0^Mmw}Pj{gon?)@d`Pf@)?KORpf=LVzpKaP62+ec4i!`DbC zOq$+EpCrA|7`=Yo;S>L`k@nA{eS5eECungGQSLrKqD8&?kImn7qjcT;Cn|vj@3hmL z{87E#$en*5`uo`)oS??t`3D5=M$CJ_0h?2-&1%j6%f^4urArVQrIBe@)u@L_-Fxiu zAN2Z$YraDaMuFdlA)w(ya&F~0kR(P%HOxS=6aE|3KAU(t{y)GomZM!q>fKyP{SLN^ z7}+rBCjoyk#&60qUPsz{^qXQ@-Zy?w?Dv|VPtyos&YYuE==bgqxX|Ko{)q=***7+M zAm)u^efO&BuTxy2_dz0R9LB%g-`GfS7wJA#6VKn@4FVkW>!H6NuuJw5b?bpf@BYB& z_j}%)p>*B;lZ=M%kdSBNPdAy4;>jETKe9B2-~kj|&_+Re;N2*BTPN&)!)FB0oQQt< z9b0eUC|#I;?)*(EfAjyF+YgYE(jL70iPRT~NPEwJF)TI^{yy zTwIwza??yZ^oTlG(%!Z$UG-qiC(D&4t|>d{xJG??j>vz=I+M6}`(KRKW$n|Bg#;t6 za#LO^i8o-d5wY966HYh(w4=7uni|Hbh?nY}q~2&uHq;AA$z_mRkl*TUV{f%s+ESVS!6XjV>| zc!A>~qKednfgo!AIGnD?ddVTiE>6R1a(ivpogtGFJItHXDYB@yMIZA06Qh^1{7*&6 z_kf-;A9>awJLRd<(CgOu`nivO(rw%RNzjr-xJ~v8BYoY{1^X;G#kkGW0h_1eHhQx1 zb2ga^uZs36=tfOmWeSfnDtwR)VSiKJCs*-+hw?taT|Q5)FD@@xjaFFfjcmN7)3zud zYwc5@U^c+~-)t+28&`)^+H6TnW&I(eLC(+0Y+SQsIdYj>=61_6 z3iXd$?{9T(i=u_}mE2DaA@qO@f zvKJfA40dW>Y}D&vpjnhj_+(ZQH_xTi_o6-)(RqsI&QYUew+y0Y8gkkDj4@(035FYs zsjB)#J{?z@lRYTUoZPmi`dCo&%J==q2(E!BK&{3KY@NP;ry8IV;+U*Fk2gCiH(0;A za|Di!n^z@GKC`$--eK&-m!43l3X|)GEcYn;5yVh1Aelo6So?)BADajJTaX}6jM4A( zbGP*A0)aGMqz--bZU0>C9G#m{T7${Ee_6}@g}*%+R*j* z&*@!a!jgiXy< zaBOiO5-zPq;YUl(vz6uLrNzYpLuDr;C#Tq_WZ#WIP9oC6AI9UC(u;e@RA+szL4|K$ zs{t7?m*qnw9Ml~TZ?KxDFj@Ijnps@KE_j!am!5#o&MRN)8gGt z^Gg5Wa{S(+rbCX%EfVLGP((Dnc0q&b5_QRKbhKNWQ$_vTu4W=;5_{3%M*g?bGBU*H zv>p<3yUQ|=F_G}(U1H(sT2|6z-F&2~xK=nr^4A5eHcKaL+!*ZGE)W%M)x^NpY8nu| z4LfmvUjM)leyCuphp0W^tbC`lWFAuT-&X&P6bkp0=Cxa!H?O{=hnfwK-_%NVAt`M$ zv&5N~N-?obFUbFfg(G_>N<`A@I-0{M>E5!S-G-$E>9Zk+VsHXjaM3h5%W1MMqP+Y1 zSZLbgyS5-L2nso*?5SMtRHb2xzHa<5TG1|t- zZwBw@hmSe->e@EvixzLq;$ircS;c!wD*d$JedS?nBj9wVdCP`tg6Fl9+u`nuk4ZgN z(=#$M=6W;H3vxQ7S3b0QQ$9f|BoHz0_h!0lE#xcBeM8RA1*ctU;33+pH_m|ST0USR0NPVqITHHruciz5SBhHUZ1;Uab31e=$c$dkEJ zHoaa9x>PG}MM_hLhzG-_<8!FUNZeHc{Qjr$}mtKw} z`*V=^)}aJzqHw)=i)lB%W_~K5w}&k)J>5UG$FN8#Dexv#>z2nvzb#g65R)2`UFv*W zQl)3uE`=T(1l2N2Fvc8-^UJ4L7Zkrc7&okBdv9sDL3M7NXjlUVeuwVx=%xVWz*?1g z!*pTQnLo=0n+fB~lQP2fx){6VKyDkYjWM~EkD}ZY^RFafnZez#+cQXkp{h)6s+uv6e(uAS`Gd_nEX9v8T;n)ZmigtSj9|Xg*Ez1neN&MZ#go3&1l}O0p(^TPZ!;f3CW`)tQ5*P6ctn_xi0}qQL43EcsuaU z7XB1lx^iMms|4!W9~lEd)J$$ib1N%$Y1J5N>gq-`>xy$Gh0V`LDw(lHD|PjBGN?dx zB~)Gfh7&>Pk?P72q55j7a(`nj0ybW@vptiQ7mqDf8wmYLmV#{$a zrl<)*A(RDpB$cLH{*kKL=;8S^2Mdm{N|@nRj-R3Ovi;Q~{qnJ4>$P{oE-uHW8UCil zw>J}RCbBHOKTw+Absj06DSU#VAf@<-JkX>|96dLmtXom*iQATcH)rzTn&Q2KOkHEf zpm*xr5XJ~wyFI|hzDskB7%j>yC^0fRNVu83gcE40-`-W6q@c>emV6%sS=K5N*MurMVNo{LnWqLC z@hHjm$Kb1z{i8Cp9YmFG8dxQrj2RK7bi`E~HNmEBuR&CkiI^hwy{8k6fgVb$+?ERX zD#$upVHT4?CG4Are2rdZ=S}hB3Km6l;MkxW)T>Xct%MwDR=O09mn86Rk&LR_o#v&m zZWTni?BNJ$&e_&*adIkp>de5TLY0RS^*G86W8QXw6e=SqN*IjRJ}U*~7U+`QHL)}; z8?0X>I~;LEjjIcA+wKJ-4Ewu+ZJn_Evq;RV+8)QowqYsqws7_ATTl{VPZI(I=lD9v-_i(K#uuxV;_`uy1 zGwh8oV8{&w6JQtHj_%IA)@{Q6{^{+blc-zN+KP%9Y+(oVgBW5AlmLsGDr$)wv})A4 zXCFik7RS_Oy7uDY;xMSyb#cnE6ORN+r*hg9Zx_zYJT7a>cw|v@KK6()3+dWVqyH=X z{hnq4tgixU#c1(I>F2r;k%$c`Np<8jL9KXE=8U44I;~U?O@2Be@sX>6646Z2rIrMN zSGP#7q@1pnEVH;E>j;@-K2)xzp&VbRBw$URkaSFhleIaXn4YY=1R+uHn~^Vts@xtO zA14m`_|)&U!*cu zMy(_zQnef#g{ZHr+i-Pt_i=!9^0S;#C4uJb#{q}bqM4?a(212jO_S;@*{BXKuJLeE zu1V|T3@mDACP?9=to~LAnG(2L>5Uj2ijQ}z>ol%iA#O=vu3AP7bHTeIF0Eo)62Abn29KF;|TIcQNLy>dMM(?>%5j+EJz^wYH11 z^>5!&kT}4&m+PX5qOo_mD=xT0RSVvESRHZUZS+d0v;Eq4m)9)_QVYu9($Zjy+rz zne2i!Zg$AfX#j?6W$H5D;?Mtj^+8?~qa4({tu_v?>_8zs}+2Is=2zz7@Q9aTzu%qC`LZ_jH?KG@r8a z%CVi%gqnJ!g2FkFh4~^U8XUqmz>=4u$T-z|&8hv($m-ra4grNL3=W z9{pj&&9eK59ID{CcN5CW_@pZLi(q%zWg#k7WG|@v1eTZJU!}5)sjxku6z;`OTqi(n z1ssOgmY*=q6P<+SagmpI;h)JE8J)zB6Z%Em)ueg>QI2ucq<500Ey!}WtsSsdeg9D~ zaAqd+t{EHtb&#pP^x$~7FoSl1j0UZ-=Cl!sm=UB;S+0zrQYm0%qh}wZNhp(3&P>9N z^DM8YP}LyFkUBFx!H0gSFzb$1y>T~U%W-7|PolUd;|D1(H7PIpw`e>bSq#v7{7PJQwZicx zu^AD0dQd_~MTT-aqe{qWHCgP0W^wLxj;LA1cGub>z)*^=5l8#>8-iLTC3#sNUY~t& z=a7zd!EtbMax$}6LJ(eC4CgK&7GK-n449+-`d|6(KOtlE=KG7 zZaN)&f@$B`L+uu+oP1Ouv0UL!9)SqEyS270r{})x=exD* z2lh^oZ|u{P0w(4cp`;^k^WO2AeR;(D$s4hjP#am<=xnUFuCf<&AhoYoLM!(k{~uA8o>K*L($&I!gLJ$8A z(`|D{PXC#zk++N0VXgzk4Q+Kwh4azd(_b<=in5#~ZTAtN%~fONn$O(lmNdTEburlY z!J_gmxr1BQ>@i}zOUp|%*NeV#b8`o|f})Z#B0es4;uY;t#O8LTKJ#4MV$)LK)UvJmE zX}s5TkmrHP&uJOl6@!6>ia~h^PY0P*cSX6w7r4%ok~Ew)T@VvlWo5d2D?Z*0)L=lT z`1vjKddT`&vll9dJ#{U%v+eG5kAX&Zgp+dY_art9V88$ypv0b0G_5zXQJM+oW?Vh* zbsgLBT)F8`Z-hwHEK4k=bef*-zmJ|^g$$iY{sJXgm)*IpMAYxb+K|?_o?Z?wDk@Uy zj#8k)t{bqXu6gyVOmZ7<7WtPA{E^%!yJ76(3d9~8Y?cIa^7mMXC*sSCDpBC*M_4RB(Dyk8@dOJDIQ<-R())$px@%HWQ3WYJ5e`p&3Da*Z&TxnxIT<9 zB*@K6PUc?B6hXwiHGX6tUDMi;ehv|ADV{pa(?6>#<~S6|H=prN)mdE-k*59 zII~?WZPs|0HELn&hwPG%^+^%!fL75UGOC2leyYF!?dMd7)u9AY+o-ZdoJpnE%G^|w zkhGGg;(#YaKq8N3kYmyzhhN@UM_-lSUZ>|qY?N*cX}0t{r{Xb%a_w`HzS;LN=9bbb z>78S~c>hXkQJnB4e-@C2QZ2O(M658Gv&K;QH9y=_5U7#Mo}X7e96d`-Jkd7bd11tw zm?NtOPG3=bX;Z6FU{cOu&T1#$0TVe$QA#z14E6UH$3mZ8iJX?5vv%ft2>YGc_?PO; zi!^V3^^v@JA51eN+p1lamc^vP3)PJN&aFd)461ks$p&c0TqKE?%tpWSxbzT7`4|qj#M7gG&|kYv5QA`K%)E*=yelD1?McZVPi00J*!5c- zGUvYLd`yIezI7ClizhfxLREO8V}X+y?B~Stj0tR1J|^W<%a-;~zlrXdm7X~Hd#}JfOauJ_t1zo`kH-#P!-JrRup~@j5=Alu@ z>$N;2WpH)aDP+8ve)&fWbZJ6gwu^i2kh2i% z$YE~EV0;daEmEm8^srScbG7h%u4}8b1(JWGA>zVPG1kUS741ImD05(cbQ$U}mma>_YHJ4F8}Vug)7Mpx5!4?TS9qFn&Nur7`C^QaDGh=j<$z&a z4yF|>{8F4z7h#=dX!U9HNpo!u(}*;(-Y{dvo!EZ(q}`YC(`4zyVVrJ^Vu;Ic}Fmr3Gs4e{d_`%_Znq8 ztEs)YGJ8!KUuH1xFK=GK!fD&SD0C9Evs>rVbbB_vM1xRKrrU`6D!G;Kv9s;E(yhJa zx^i&kat^B&f%(@$cO)+{&*c4H@8@bTbVV-WW=~7?gVDb#a1XrsSTPvc zzULkc-*_Wp6~N&1G#OhE2t-Yjnp`N$1A9uz#s;{7PVC8Xn<{ z+hLH1bNGcN@xvH;x2@TO_mYHo(AK+=-Vr8Hua`Sn^tkLKoH~(Il}5mMxw)r;q)j|I zYFy}@g78Z_lBM@{vI=?_+t=)IVxz~+{VQaE2z7pR?(N&0#bB-jL;Rd$DlEXSnb@S( zG7QS*(7zJ)s>##qSsi!K`875Z3lpribJ2q3$izgpG~bCW>UbsAH0wG?oGW1C(!(LK z?A>)c_mln!qxN?(S|u*2bN9W%Bflbw(H%rxvQK@R4ic-tUB!y^xw$K=b7v!FGO&fX zy9_4U(qYq6Yx|q_wfofCYT$_L%Ga*=(A6%qk(b#lMG)4~~oxHF-JFeZ{riTX>CTNw&l+e(mjvj`rb3-hP?xUll zE7aTU`wtKoahl)3C*wo@I}!P-0%@4=JE)1SI82E<_a3%|6)_NI0}1V+KI?oKjH&+x zKNApse}M3nG{MooR#jA}w9H z%aZEk`tXg_7S~l)w|_SOQ+Gs{$59yUJP_fxWR&+Ols(Nn%6v z9Q^!RuGGrEfMjG05Lzoc<)TE_gMSx|N zV@Ub%20O#D+WraglMD7@L~LfP%Y2^_lb@eZLVdv+$sOYP^Ijh9V!A`>!Re8N(_0in z;wE5|8m7Y%f@qnnez*~iPu2M`zoqB%xiq%0&MkTxh-i}UWn%daE#Lj$rtinqw~hiv zCbW$HTBh7vq?1ks%deWBbhW%Gb2!D1xXdjN5%Us;#_fJk*+sPs3PQ)3JfP4#NpyeL z9*!(yio~8koAgnno3zC%RP>`UyXBD+(euZIjzW)9j7N)J2quLU`@ilbs65%+nlp}_ zDKwu(Qq!cG&dic5>~fbp>`JL?$Zf0TDDO5*-uogJ^Xo(skMoPMKl%o$y+?vvL*dwb+y?L;s zF_T*icTQHJgsKyxEW505?10*f@&Z)`N&}#jFdXwVP*Dx6rPaSfe{UomASajW#j)=+ zI|km7{*#O2ri|?RBn^mH)pw6_|Hhj?dOCjBKi8P{zuJOJre+NTEZYHFY>;>uWv9`K~Ox+$g z9Cd}YkF){lpVKmRa<1f_C7O{!%?6jAXK3=VmXq(`?@Yt!;KzU(Th0+qr+HmzKh^(zAd!c| zd+6!`l*L9QG_T0MQRmJRAcwX^;b8=woN*_UY=Ok$nXh_nPASW(R5&)j1uAD}Mgr+G zKrMkzt5&|`2_&X@jfxgDa1CC`6?9Z6On+=WdKx{*e$Ofi;Aiu3Td8*1z4I;b%CANw zpEx9Ao)x#jW9Wjb_tR>eJLilhLrDBE!Zz>EE?>t4L%;@jw zDK<)V$;r+($eRYT7fR`navD8|5}*HVQPruKK`z3i7E%-%@|ni%{@xoix7)0xcMoN zrr@-py+2ej7BX2^=duSeN_;LAu0@G1>u{t+#c{gXJ3P$F)>2YOTM}2Kd;vI{%RPxD zvw8d)fZL4e*Cp`^XH~7-v%IOf`N(lNlQ0IzWbwV@RID2(ELDrwx3uJRnODhT1Lro` zNRn(>oJ>zR9Codxq}<=Y9;s3S3F>CxwwucEX_`Atu9s@@v5d>IY|3SMmt*O*`n=?Z`gEZ*gmC9I+ohNxQ|ukpKYyF3UcQ&1iA|Y>#8Shgt_moP!D>RQ@B=0jZThf&?U^hN-ghbyvpo z^QeCK&3k8+t%c~}7hl@KdC#4V_0G?89B?ft8IXuWgi-t-1*3nUA_z7YVr@o8rXe;b zH$xb0|BV2f09dZ}+hTNrU6N4}^jb8;X}mDA~{E{mK1{1J|Zf^tw~3a^vn#WXj% zL2`c44b)SROfD2MvU}oo2#20%OsOXGQ_7!xh-2}$HrC@;Wlfw|kZas*IwS}O0ULp)lDk_-QUe?#tw6F8_$HbS71&NDWu&T4)HCcmGR;i|}L$mX3 zc3@l#NxZS_C7eU0fKhh)I@HdTD^pd$tiB*-In{r3>yGfJ6btj}LOYYNjK0l%!y)y` z{N0Z9mu@(@h&F@I)F1!s1!*@5XH8 zt*ej+T2Ns>D|Lcm!C@OxUYkmB?9raWa}yXVJ=;^|3UiVUl^e+joFT^+(nsxs+>S z{CNvF3HNHsa~*<^^;xkI19Mqq%*o_HYk_D7|HhlDm*GJ5-D28yD~AqY4s^>MZi4o- zujOf3*}|smR_ID6wt^s)70d^?MlJe;QLlwFD8otR*uf6n8{Wa<(Lg1_LG;*0#KJQtWJby2VjwCX=*b zk(Pc{_JGF?zx=wlKYdY?3xkz6*AY~r2Z*`GCKnZnB`K4vOASqr6ez!YG$wLu3)*V8 z-{-R^z5i9_f;-VT?~-9|zn%_ph1}rGp@Wgas}J!*z=ZOb>a1YMaS@ zEUnkB=B$ZxjGHd3N8_u7Tm7Fc`h$x4KhyQUql)~1Mb-D-#uYxx3`!%>Nt`11>RB4(^4!prRui+LZF$P+yGDu3Vy1*yYKJO zeq^wRO@XXTEG19NZ){2Te#rY@E!Ip@v+h%4op>9!Hoat!r#?((M&$WE?>|QnV9{@G zuX8%jak;gOzbup^BS=_}4QOBAKrYA9&IL5Re$*)VtvZ79eH$5l)O@Z#4mQ~wIG1}>Q ziULd9Sth*9QpO27Hp#niPL}5psZF=iOxJ*UA2w@lS4%9NIAuT)FtPjzUpl;-U#U94-na9<1KAl$8b zxg3nlU@%x=Lsx-y3GZR7-cbWo!lzf1J!#BN$NnDe?a=#N#IV?tiIPO9P0DO}Kli0E zlSA46w{pt2aRi@;8>1p%k7uUZAr53g|y8;~F6(;wwa#}2e(AyNzx3oM7ZG7~+TXI4&OZPjb~WGF>+-LUDW z7d#u-=h*|YjL!AjUG+dk&nwK4OuW3Py4Z*v~(VZ6s%&)BtR{puSZg4feJ80^qGffq`{ z%?e@r5f6NqT<^xNJ32XkDEuD+eTI^mJQt1TEyATU{wpQ-<2J^ZXmOl>2mQ_Hw~_9@ zHL4|kk@RoS{@EITySf(WjfW7)UGeF{)v^Eo7Wgm&?e4iZgjfK7^}#(f{Cj_I{ww3~ z4P(N_&5H?0-X=QxQB?O@Rgs=uucIQJMVv8AWR7Wx3{d|{~keI zDm@)jRCbzwU!a2t0B`daQTPe`+bW<_mmTk47Bs3Di6S`{`c{bi2L64)JR19zzZaMQ z^D@%G)Cx3D=>Gxza>b9~ls^!g#lVNe?m=Vv=#45$$km^^`e!>jFmCc|TIQR>#}7;a zJVwpDB=egaC?S8>mM-U0{#cNC2N+%;WEua?Jd6$~Nd*662S!r>cxF!K!=EQ&979R^ zWj_Ank@W8Yz*%|K{%}(mIZ%?&{(T2VtV@g|N6`O6czgn})2#jlOFp{^50PhgBeO{V z{<2lu`~Kg09zO!$+B-G|;s&ig-@2jx{P;c9^5XpcyAA*kzHjmU8RMQI_xyI(f3_I>UVvW?0Dp3C;8(7W zu^(kW{J-tsvwKNTp0Iu2-*+^AxZd~Qn4B08&+x|-n*UT33)Fnte=y)L#j?OH;5Ni~ z*?ayQ`sEeCn5Q%Up;t2R&Z5umV&%&id)fcLI0RZO`Y(|VC!xC&r-9t#|IZ!1Rn7k~ zb%vjLi5HXsV7BRY942zl|0b)?E-*>+?0(Sx_uCpj+~{Na$-}=6^K$|K&ymH1r$4%KZAcYCtEOjN6S*eq+c`N_{um_E@yB5F z_zyWEWBiI#Y6On4+J5Tyx@+&6TS%B;=2Aw#{j@Q=KJ!pys}hn7Duu#q$g%LqL{0hF z^{)q45fd6#j_{=z%3qlKjuXiwBeEQ5b zSU`8yx{oo#kfQ-G`O+v+(^5lyM51C;vgSQAG zZ7VO2>ynA@jo$Ocqx=EmJLup10VwKL1)UejIsp?aMJmR2?3iA${qFDUB(0xa697c# zO+Lz8TEFf4Pfi*{SENx*Lkt&;F>kRV0*O7(Fu;wkIpQVi6%|NfX1!aAtPI=zJ;n8V5n zSjdagkbNH*a3Y}Z8_}7%Oi} zfFH*M=DR!%W5}1brVt06`9B^Y1cH?O7Y99Hq(?clcP$$uDL%dXn2?1taWG#ddG~G_ zDe68!C^{*;@0RsMEZ*>2;a!}Me{hv&-K=}rYG#a6xlhQw9BKX+QAD9u1L-mp5 z5h64H0%LCc67bUYKT4dp@k5a;{-7Sdk8^<#D zpxA%M?4N4vw^9eRUEpm|2Bgiy_!X>cU337WdwZkmkzU8zXnuZKUB%}`cKyRo`R-Kw z9P|TVO2+Z20gXR{7FZANvO>R26W)F8@!$h5afQUUb@+J5oPP-TKLIp;K+gh(nb^DJ zKFo7}J3ZfnLm!=T9^$^A7SQH)8phuW;k$3rNOnC72PrK4F=42Y^X2UscQAjWrB%Y) z^Y>prt}b}wD<&atmw(a+5c}dwUm(V=jx+N=?EAmCNFfb?G1z6x z7C~*L;4}O8=l)HJM${XUnn&MDz3I`|cjx<4X3AhS_r7X^&hx)fXUQCU%j9`B&urf(| z-}tA-1UCOUQwyM-LPIAAr4c9iX22lO(**19pNvJBGSrpJmaFXgCSKp4wd*=E#cvbx z)7Jf9MW6ONaT!RZz+8})ezMK!&CKQGdizCXe{_dJ^K?1RnU6FCPnWP;1U?o>0$kNx z+U7YB@meV<%4_PPBsGH%n~3%9Lq5Y*{AXq?Jskg;WY4aJ4D(`0%hyn`Rv>jPjKd0{{rur*Q`!! zs1+yX$2n_S%__aI&oTGIoxbcATnARV*cQTkL)golHDV0 zbf8uOOr5wsOL*MGaJC;JXMKU zTxvZB+sN;^ZP#zyBlTL%Bt0%&FHx(RpLW~!{E{A?w>THh^To_*rqZ^>7GkNSv_t}( zF+9jYCq17%Lui$ISX+UYn4t#Q*=+Eg)@!_{&qHO6PDh(b;TQF8BPH5KOy)1$oG<9u zAYqs6e~nlPTlR6oNe>q@hC_BcD0Aw=Y}AHX0%w6Ivkl8+g-!F7qnS(vNP5Rk{oY|q zFdjKV*%J^1(%^Vw%-ttmt1mf&IU^!JFdI5#C$x*5L41KERK_G|D3BR5Sv1#8MW(Nf zRGyd6|0+{8DWs^!?aToYG(~J$SbwmYXLp$&?ge*;jEC7UdNy1rcH5viB}=zuv~*sb z{nkr=IXcV;Syve?U{Fp`u~hf0c59-Fs?N3f01@-H z=bftpT1hX=Soh!np{=f=nAMRfy1uuZIL+o{8Pm2fa((#alx1gUr)Ih7()uvX7GYV? zfM`$%h#qFs{B=I^Q7jFQszC+BdEH{C!65I>_$Dih;v050Hs#zAe7&L|sKrpEb)Pt~D$1jh83P&2`5y08Sxm`m$Zz)Ddx5_$(%h$GS-;l$ z{)$$;`I;2ll!_*|_U5vz{z12qQS;Z1jxp+!-UNO>hs$O>#2D|@&0Xi$=Z0U)yT1Iv zo8RroAHEI1%mgTgpKPD@M2)S;+V^djUb_OczcVD~b5Bf9TYm8EJU%|AiDe*t<`_Gu zs;Wc~DoC$wISO;S*j=D>yDVKw+P0u8t*&p%AE!7Sv9eXh!N)>W%MIzY-l+@= zC*U%uRl5#@pl#Xy5uz0}HB0+zOh&ya8|&-fK>h;s*C4y$ES0s9qQqc{Anf|#H_ZGF zw%e0v<)qyRL&fOW5_Kqr0dEEsJw3WVe?f^D36Fb4CR`vnP9cTYt37SQdsxgytPHUd z2)JTZj`8IDJW2c6<~Z75)ck9ZlOxq z=>u z6b?#zBmY;Ms$+ZkYKG}#&1AQuZ7WNYCr)||lrkgs4i2CVTTYDNplE_Ogo%VWA(Gf5 zDI9J~9XMue*qFm3DO;<|i4ehu(7hFgR|2|A+?L8>Vr5U)DE(3~^ySoBxOzv1sjU-@ zAt|?r*+&Nk5~v7x6tuvG&J<4zr-UzDb_HFJR*0!sKqZUh>K}}7*ANqBlUb$MB zu+p1)3$^Pt46#7HzV%`|i36CI@Yj9CpWZAIMivf!czkvZ%h4ebAqn9hq2$g*Kk{$Z z71 zT7fd`sdoaWiH8T=VH!E$>dyHo-o-()2&wYdl2}iU*}Ub6X-nZkoY?N}ZUSpX7_!%_ zcyl8)v=S=Pv|Oh_Z)CIE$XL?^udJ*zO-y2*#W=vjmImvF^(u4H2$iY^L`E61slc); zS#H0ca-6X2?PhsdZ<^6p*=$mug;xBgPCRnZ598owY_~*N6h`}FZ$9vK!JB(1KYK4E zA0zw!ek;VAITY2h7foc}u#%&uQ_y22+?lgJ8E-dTTwMJA|9RiOTzG zun{mhNSTKiosIP{IL5yz9T;K~Xg4{jDoXwGML-}s+;g!RkS0id+eTRn{lwPx8i$jo z4w4E^LZUkV%d456?FR}~%fTgTE(`|5W5lLSPt#Qj*=iW^F@^WJ z>1wE`XZric2w@`j^6~K&CYCWVwm?TUQ1cX*uUw~8mhFxB)M!VOVLohPWhUcNX{IhB zLiX%aU}?gOv5|#cT3}df&ib`9@Dhar#?G8}`*&)5R-g72z!HocKUm-+Co;v)Jk{Xy z2WJj9hLf=F>4kjrGMO&l+9LdHq8alM0~EBW(Dy-;8}^+1>DJxt3zyB`ew@)t3I$J#pzztK&Y4#)!!+3Q=3_E|3t<&US!TWrOL9fp;qWO|*{O-`y?y3Q0q zC+n=`96akE)nkz;i!$S12in_M*$&Qbyoix$!`_AqkJTEwe!?ck3g|XG$60(Ikn`?^ zMsLyWlFKH2(5hR(ay9Q^CeSjLCs4pxOqo@_MxJ&-D#{dUs%3I0b(s$TEmt}e=%1iw zz<+$0QH3kXqJ$d)!>8m@ybZtMc2EL%O;I$rcCK`)=f;+kzc`oEmSwfA&`X6=X?1ew z#HmDM2d1c2I0EP7@%t+s*LEzY>&glW1}vdMkNR_3b6#ExuRHBjCcSi{J?Gmm+|O5} z=(=AfhGdgbQhIKE_Lja2^fx}9nwq*27G?m2K%w(ZP0?rAxVV@&MAE8W<2ayd$j@^n zI`4iTeFX-ND-zWXv7CvG-hR2yD{0u3OO#_pLTGnn|1-w;9)AEa3mBb|8g&4t52cfl zdP>VbpG|TnP@tK4<@TkWYuvwl$IV)=f|0T^^I?FaovrOkPdt-zbxVtobbt%p&a6N? zdAX5tbaXU6D-iYrp7KFc@I|H7#W~3NSMtZ55qBlZ{Pfiu2MzQ7PV)~eC;WKFra;Z3Tp9L?`O3>!8&4KPt)^?9=b!Ve4- zC@Cy0W-jK&@Xf=%cuTrQ;rAJ5!Pb&rSQka482JwwCHy?tPwV^uc!AK%;$D(E+epiH z{IXWp1p5hvZ&`7j4#1?y94lDIATzT;QC}`=R~$HV@2&I_$-=7h@(Kz-$q+Sw;~mni zsjzD&b+puzCWj+ifFq<(^2{TXH=~yTH^flvaHcyMV z?Q*g!h3v}5LXP*AEk{eGU1+GAYHb$$Gn!D$oW58v-d0?calocl994-IEXbo$t{!6f zK$mk5@af99Hap+ai`Cy%zB2vJMZqS*#cSDkD6hdezp~OIYYIz28&1OQN_(48`>u;i z4V#A377(jAZm~?vcx`k;Cv6pM%3P*(6J$07Uji|y8)-fy***#Z>BKV%hr%(9X|J77HjR?B~Cc>{qQBV&N6`BN;-&ocWzgim&!NVp>H<>qPb$xg`e$B19KI>}Ixwk?fuXgq*7> zD4>-u?>;uwiz)5KNA^&b&dPdD-ccyI`8r0bCX~eJX9EENsIl}9E%s5;CmKTvtn1!5 zBCSWnPxEhoxf5wvROTrEE_mYh@da^H`Wv&(!VK z_tTqq({g}5;=Z0#UIeCTttR>^D;sp*UYmT`XqWhzvuMol2cSVeCI(<1%e|bNb}L|N z_JY@I|3}wXheesTZzIa0q)Li}iU@*)AW{-0N+ZpXBHi5#v4Tj6NSAbl;^ph`|9&L&(A7lvv1uCSN;8uxFL7D6GvR}FLO~( zD*#%IrD%-I`RfM{AFqZrHjC2IQn)*^b}5Dy9_A?uGS}Qf>{?fR2`1A5oU(PFnn->F95`a4H&xO2fE z?k|_nut(kZV#xPp4{PQ3NyQ^=;)~TUPYx+d>bP6e$UNW2^#or11ZzJ((B6MtP<6Mt zkYUY&WU_Vjy}4`DS&M_cLz*7dYCDd+4@-^B(g&LpEX8w4oJ@BGbt-puxC(P@_+ym* z>IDQd1X8buF<2~bolBC0&T16a<2F4#6-QFe{o()SJmrLZ6)_Fg8(zk=+@srf)9IR^ zY$z%-7V5q_U>qIlx#MNFNrczBzD)V zySXZAU){B5VP?9<_w)mv?uDh|gr>N-_RaFPe@!E^3JF+$HiEC@p2-vBvYsz_-XnwX z7AKq3xNz<`fds`1sG##uk6E9r8_)0DoS!>614poU`y`Q?T+K;oH95KZ4`k%dN^c7E z{yuc?Q1O68SolM*jA}tfj=)S`OGs>r2U?5i7^>!h-s9laQa?P{7n(+|Mk#V7eJ)_e zAgD+zHYY0ZO|Lw19j%?Otq*<*S zVewhC<+X(HHOo?l5{1~w%8vXyN6J6?vP^Zr!azzaw z`|lY}4go7*-I|)UGb#Gj>!&NGJb=Tq^?-#TVHiuHX**qo0{7+Z;o)I{GE;W9TTT%T ze1yu)uMe0ur`EkU#9ow))#w2%iI2TK@Hpm+8)ItG(T+JePhvSy|7dvp%uxKE(at!X zeVNj*q8>9OL#h&8Vrm&FBdexeH1H*wwh*oU5|9n_~% zNdJ{i9Y6MWA3rkPH6_?UL5d0(6UHb6r z6mb}Dv4s;ey`c({tv`1LP%lXVj1LsA7+_RB2OE_sn<;j}=@%Yd>zBIXhT4gCb=mYl z(D4GROn-2ZP~~bLCRrn*HVw95_;qSCJ-w-8tVC9p>&=@^Z&Znw`(qp1g26>+VV%2) z-VKtuayGI6qn{N_(EMM9NCRyWGeen97444$&!cJcO06peVIJc;&Bb{w%J;I<$ zp#Qn>&X8+)1%NL-6{ZeL&?u!e>*V?6pXDe|J^4rbyJ3&6Z|6PjXF{L)|9iSI$B&oU zQgF&KEdNc*a0}Yubk528_RAottgdVMV0DG@ZkwfR0>tOIMn3mV;`|&7#W)-J&GQ)b z%M+huwlcn$0DPdaab`mF2Za?!%j94D%^=!vhtA;eufPF% z%4P@|SxxQl0}e5?Wp|!&+nLA9hUjYV3^c{cT>NaSbt@%A@;c|+6Z@o>KAt_L`MS$^ zYDae`9O*swZ9XdpJyreC@wGM!MMvaw(r^MG3X ze1L(SSlY%?>MWw-Q@0S0OAZ4l4i-xv{+#q>fKlL#*>y%MTmIhn5GxzhV{mvp=P?|8 zZT=FBCSM=nSJyprp6A^|C9y})8SOseSkbq=SHFhc=^By_;9SQqJp2e3)~h0ajb9NIGHoQ%q7@8d6U1r zh{;FanELm}uM2*vxxE#^L$6cZIKG)H)o10zPW=%o^~br7fHaM`Dj=VHse!bEtl4B6 zq@@C?4JL6cgn<(0_lo%*l0R3hMuu2y+%CVQS$IVfw%+OZ4Yz3vahz{x-uTr7l%gf! zWBZ5uGAZ??ZJdKrj>cxU6gSc$j7tv#!jZpDIx9pfD@%|ZJ zgo9cQCe(oa<^*9Nw;U|@Z4^_Nda(GeXWpT5XO~pBPA6JW=N?_~qxV<;ITDu|CgHpN z>!+`PsxFT9TWNO7ZO7oQ#pga!YxN(8p|(mZf=K;7!h< zXM_1!6(T=9KXdGg-K7>aK+tzQ$B!E>iGSO;?)iD(yzcViQkA$wb@z1t^coULrX2F( z_uC%-&hNy;jz9ltqS7l_#<#h{&4cAgjZaguAC%Q(y&q*eDKq%A{UV8con!12O%=W6 zztzx{c5=iUEp+p5P(%Z?4B!#oJ3*Wrj3%egmAql7)tB>R!R#-(RC`y7 z*c7^>Y$2A8^+rGM+fQ)APnRb}dybC=jN4@z!1-T{=LH~TO-|>}yRRYs=K-E{kK==X9ZHtV`(2bdSiZ zB?!dUuC|-}p{;u@V*fzsaFx9eX-_jtk znZ!&>F2pD&{S`lV>`ejTeSN+4dZDj(*-kv)L(x{q9BoIbPS)cR&9Me~tIY0| zT9}@ftwE;Tq^TTuHYt;Hp%Mgn?th-1!Ub0Kj0cFv_HtfiM7T;f8ylS_bv3xQqcwZJ1sGKY+K9z3J<`_(m?_8D1_IaKh$=%H+c>UO&bqNEYoWSNy(r$$C@@h|S0)Q+V=_~MB4WmTq6hX}HX#}H7O6aj6s^TXZdymEUbXa=qKnampaz82@6hbQZ9p{mTyh z($3_)ybicSf9VLk;!iY0y3LcCF&9>TTmn^n9U~XY3lS}3s}Me-^SX2YM$A%|Tus7= z>%Lq%mq65D^;0tw2XB$<05a1cd)AMPmXDR{56R;v9VWSsjcNef%-#1a_6~+IpM20H zWf>%QciXy760GC<`CrhE6a(SiM8lG?Qr}^X5glUzsMt*zTD&N3RA)-%=6&`~I z-+Z2kpQ&Mb@W(R-eZalLPEGctY1VA$Xe&4jyk;E#sa?;H&JN9d^{Nczhr@TXSeiH3 zh6654wBAKnZ8RzoJ_jCe+o-3dpa9d=6r zGciT>piRZPIKM>gAmE-4)oeJTqgT%um255gVg$S4EcT%UM@K*@{Qa*=BAynE}cSLj#z)l<*?2hiqcMQdPla)~o8 z_6@|B`OsE#msaK4bBS?efuB9C(xKeV6=aZqquKRz#S5=Ssm*qm7C2Y3`aq&$bc{!)6@OUxpq4h7 zCsr>cQc0NpY+T`pucXy9UgY8r#d^sXd|8hDpo7Sm@$&u_Q+Tlzh{o@bZnZ$nahlOWcwIpxX2YXtW?*gI#PR`;_t(#C@x zUfs>S#IK*=QJeE8n0XDVeL!Lix8}bu-L6t+6>BRh3kfmBR!ANWuG`i)w-3;S#PYy= zrsV6fp3vvDX6;2`txnq|so0I4WHJ1LBHqc4_p*@9(JZCU;ariVqBwR4pf#-RAT(=z zMe>89pA?3E%;4C+{<--(4E!?nWBkPIAxWr>VSb^SzKvJgV*oJ*I0}-2o9N4-x+a&- zy>gNvnxPI<;ZtxQ;5Y^?6L#Bq-jlhT$bFH5_((iWNr|_+-{}$97yi!SH(eN98?j1h zv%o#D<#}DuwjLu<$Scjwqg(UgV`%fN8=iPm+2q>5Y07)s#L(>^&}>b`OfLV?=DWM& z5X%FpvKURJ>C~X6r6FTZBylzy%`#_FWnZ(f!@s}6XHU2n`j^N4JAfHc(T_cc=)>zK zM|)BgEZ4xz|8|yRl9r6qyjKNB{}2Y z=*!Q#?hhRE+jzoS{qvqIZNeRzLdD(mVhqZ=U^V|U4p3FrA$XzLrBE0%JVs5`Ozgty zYIds6o^-^)AyzM9*)ihYjwEgwFXtY^rNKZ+iT<3QANCDb`mp1Mx}mgm8<>i*^vI$` ze2%_Sh@)3Bo*C~R4}oNOR38dzh#WU9{|7$*ZJpF{9rV_xx=|2QwbDsm@c10zJe!mx z6^}unUx1&%l@9_puV*(TH92-f4FGkBq`GLsiV3iGULI+8oqjurb@sxYEKU$Gzcf7Z z5*&hNq*L|Vre;jQc?v&$8M9JXRg!celw^7{)nR1k{WFI>9~VeS z_OI2BCpW;jN$^65DOLaScata9APZ&zmch7%T6c6E*Uu zwmdf zOYUvVd+XLwm#IXFNjJm#N5EuKY`VD4J8UWT=A+v|vg`Cd5{g6yt11~x^Ln7(ECyc$ zD5xH=bNT4`Umxxy)W?~fLjMg;=D%+Mh(1_Qqo(QwTB$t-$9wVDlRKi++jJ5Hpwf;_ zKJa%jm?wjD0Oote=uGJb~yEDP$}ZGlq|(d)bbdUQBiY@~nKl*)3?t#8e7Y`_>r zgi2HT^trg5^U~_@I%3j&IhoRDq480I_(anDl6>MZx4(w?`rDo0kANH5;diwOLLP_I z$j^l3WoSd$2<(g3Vge;}FKS)Ln#o5A{Hh|THVr&j^GH%vhDy=QUFWF9uCrI{X#5N~ zK8z-Hn+QB~E>=V2-kB*fjB7m2Sim`R;I`jH67=ALji!g%EzT=^-Dk33741#w@AN%q zSYK?eu1=S%cP}kHS&ZIGZD1;_-HT%J78}PzFtSE|k6^(btk-*pP?P2OzXLm^_1V%W zjKtAf|F(`$aV8Omg$kc_M;7dgG|X$4JGbK9yLS*6G~_`MAQ@~^WUL?|w%zYvvlAwc zg|O-BCgYd6^idg-=;p>%Tl|47e!U*I4x9jPP!c=XD6IyFqHXq@|6Rt!5uBJ-CX?uy^LQxWbowrWGqLekls})wr7Gj`vXz%xAWe z9ly_luix@n*RR9Fq1bU4cHfd0fA0deEHHgaL*HXI6^|=ao2`Z&RdMFFM?m+inbg?P zt%Y4*KUP(h$jf_cpmB=;?6uSl8FK7yPl(m`(Tab6lbwAzEr?new-O|IbTxBg8k(pE z&zAIdSnP=Ij4eEDgQD3NiP;N#T?gfbtYLN7$;zsqCsLsBz5@O7q{Hw#gY|82JJ&}^ zc!>j$9W$k&7}Bokq#^;+X}U`6m=F-5lQO@^><1*!9r^cu5se1wBC21nEVr||^ahxU?31Z*Hq=yq zUhoDQWJ=1Ue-fT5QyT>^n*lzM=LI$1rmUQ_5&x60(GS5C4Ju5q(DAPB%nf6}-ATur zGFvgd`QS0Dt#j{Zkp>{H64syTGLnP3!3hb;4{n zQ*wbLsoSR0R|1Tb?#oe%5}6q`71eE9_)TOTGJxesYB6AN5OAzTvEaW}R%+opBZbHN z`%}J0-8V=$$EWk}G6UF%l$4<^k!#s>dKv30Pnx~5KQe#9T0U5)yWh3OaBuEUTx!!A z0D?|(nZ6I4K@rDlSJ^$2%>OYBBqWqg+AAmlpHfSs2o$I4P7;U?^T!7do;YI z))SvwBMKn&ICjr6F&^{fo@D88#_&hitgWq&J-|UUFVsEGrv9)VkF0WDU+PVjEJQ9x zN;A7-;1xENs3jT=3~B_5sW9LJvz$d3I$yd#-Sw5IYDF{X$N)zPde~+sf@6Oh$IG|A z{?*5nWw|ZZMBX%LwV#iq_Wi>wg~)q^w#(&0pFlx!7J4n%iwSdV*zm6M=xZS~k@Szd|kV{>c#N|-{vNtnS}><^wV-+n2dq57D+36H2&CS%h3YEn;aYfoZYv94 z*%eF0+Xi4hp82b#MK5$p^zY^fzvhh80PJ-6rSeY~y1%V#DfuFZDh`{K$~eH5Sp3Zo zl%-EOK2}2f?ioJ~0H_|yyTP%-NeYWi#UpR|&Dl7w`ZnA-zk;0`#eBNTZd@ib_x_7} zN7DsYajO8cqs_f?L(5Fz(FwkmG_qS3z&|aGnWh}JQ>|tL5R=KwBl_Rb`d3TxIDN?q zmU=N|c5yi8iNZSvrJJOKTh;ozb;)%)XkBG0V43Pys7a@_{Axm(7KTn;5>o!F7eEn8 zU}pgh8Z<5$yOyRjG$Tp&Ihcd#x>RH7#it&o?8e#M)JX~>aM!8SRQ*pEQpF&-`2(*2 zkFsvHp{!w~yXVWr=>7u!;j6}=fXT4FZ-}sVom>ya3edsBJ<*3?t7TOYigtMT@D79b z+UM+xLLtm=`>(2<{UZQFxyfQermL$PA$c$g#n0nYd@L+2FK0cZ_;;(w=)wnX&@$oU zJ_D4VykNvE~*T~MDQ+RCdxlV_)w6?(I| z^*({{KGmF^u+tUBU^B4pdu0#T zk%{r8r6pXeEk1It`UE@(-cA81^PryB@*hj2m`WlsRCK3ti@eZEC|&|v*djQh<2WBC zv=VxH0OXtQ&E!HkO=Bg_z4x$Pz8US+V44LxY!!+KUof3*I4$L`8^WhKzoK7bBzMw%G&&ENl69f=!jqhH782(mlgSx*S#&b<5@{ zc*m&q*Shp{Yy?ROLC?=*eU{onexH_>XT6zQYp;NQA>Je2S~cO)O}QY0O&GdDBqSbMzZllgC4IG(Ya3p{+~Mzf;! zRl`z+1j{^HEq#n21sg3_scvK-Zh!`boMa6rp$Y_WjO`c zo&iYfU%ik#KEh#T%iJ51sQ!w4FRd{vE`bXZTRvOWTbu40czyeI?h2os5y^P3H*m4PKmC`7h$xkL;q7oyJwY z{3?!`oDYQ$>W623lDp8Tc60U~!ryZ@lD{k%%&}t`E~6$$R05nCM;} z?m|$E-&EArRJ{iXc>$g1n>Vr>;m?>LJ8owQ*e$>9x>TdQ9yO&MN>G9-mmE~Nw4N;N zb_%uGE8dLDD!Mjb&Gt35wQY<+;2YR+<3P^%xz;0D@H==PL~k^B61D8Syazw#P}3cN zSX7IRsuVkotRLyKW0RD`BYp5lo7#Q#^;@o!_H6+yxT2AHa~m5RNOAgyhF(TfmUXwc zyRXa!;c;6y39PD;5}&H=`{T*jJcpFV&vN0f*2=u0vdC2awIV&l8{P=%%%qYqdB^=iFqUxPb}%SG&YMv7yfu=XgG^SPT^;yndKzA zQ-2a2}E`RJwYM0{DHH@py!E-b7*7=M(C-zmiJ3@6&II_0Y8qlYW%P$2bi zeS-^Zo?TAyKH$>FIi!#C#iP;a21BKLLY z;i42zbQ@-R%6yU7*7+$--cA^#pqM|tJo$*ILXOJd9q9DLvwABk6}?ahU5l!i^sux^xl|l?=GCcerSI3(-{GLfFMf=H zrg{ipZf_Y~xy7UY10!P;LQs--?O+L!0!8tgI|ad=s4>6ieRX zOLH|v&{Ca`-V6OXyMD+s+AjUZrGNNletq8yKU<@3iwOZ&v3+^@(keT%+H2Rt`#JtG zfvWB!kU~m*fr)UF{vCsIaltNPpb5G6$9`*HOOd>HU6NXDzdpCk7NE**H1);Dt)a2MWD=~6azy&CT0QN&pj>Sd!1AXo!Ap2==k7#D`benG_C(WS) zM4S{)OSnuiFIRWDb*mQqh?zM!INo<&XJ0RCf|A~d_eQ6LN3!y<5fUHNgH+gO6;_Y? z0mWhJ#}I3>Kzik|7Mk9O7Mtlg(&I}WeI840Lj#g0q|qev;Nia~~EvbYm^+HdC7 zuCu5`W>zbgdh7bGR{XOGh5H0#oJ_*7e624sBYDxVN){ms>>wFL!tmP3Hx!dw|Nfi*_63kasFY*yU?=?qCOGqM#={BZ%@()(e&z6OPVh!})2^8XfJy z6-;e{?#_t{3E(oBZ}47sb#}pSgZ)w@6oWjqni;EC-s)XEty70Y)gY%m^_7()Phi*Q z<7f$0_T_hEnvGF;Q$?r>+yo0(KBQi&8tnB%s2Jb4)?M()PMDEolUdT|Xg3vqgh%Jr zTUc0(f3=_2sN13OPT|^v=;{J7)ba6g>dST5(=3OR%RZO}-07Uu*jQJXHxhfuF6jdv z0hCyvj_QbhNM4wmyN+mM#%w{4V1tUHQ%bdAmLmU$wcunGy7?SUT#j++xnyb}-zatW z+?fExgfI{{bwLc!Py`9MyTGmUiIKIQ1)HG*xLQvh{hGJJqR_@B|0XxDlG-vhWeJh^ zn`a4t>$k9>Yq_rY@hMO^Lp@h_j9>Zb@{H^(c0#v+hi{?N zpR9-CVfZN+z8i)M+fhf)oTd~`?wLzZ$M4tUIyj#>LbS9#qY8A&IFI8W;PkUBew3`}&v#IPr+;2HhgAcSaw#6KmR=;Mx(cOYCKP`}WLrb|3@& zw%k`jVW2>)fQDvcl$UVRzPP?lbjwI9@ds2 zp~>}cYW}gCtFez$)zIMjw6Tw(zP`yVyM9|zQok1L{mBfeS8$%dbmm#5c>m>$09Oia z5$&ti$?g@=xGzM_{p7LgD%Ts#FYplo>d@&atV{Ev>{7Vl!orezPrT)#ijBA)?2Ve` z@nT6S;EzA-f2i)mU!ih=fZ4?-IT=Ckw(n0waup;p^`COZvT5~Fkp~mD8iB{_T`!9o zhM=xi7BxHilF&_Q7(Ngv&?et0D8%oM(5%4M){cHy)}sR?4+G>A@8SyU(Og7^NRV%PqO^6E+aNdgWdmQv8nn?oj=vxrGf$5Nl55%hh+ixK>jZ_XVNl z?hxVu(hw3g36_$pU>^8y?6It0-IyKmURaM!sn5I0cr`VR;&Z}SLd~C<>_H9hZ z4cKpm&^geGR@jxZtwRlOVK=v|>z5J=ajEzy6RMoQYhsma4bOhN(;G4dO)*1(n{F$t zRD#dY0L>>yr?lq^2*)2kUSi2~uG9&Mxz!nr)q+?~=I0~o=huN$^1JsFcGs<#@D7I{g-M^KTGu&S0XVtLkIOl-T^73gK|#59KTY}ii&z#` zuf{+I6d^H`E51{qG&7yLtrCJ{|G+=`kO@D*CgB(ZIGe^7qjW?^BP4Y#FHR(eJbnT*;js9RnNq z1{}6m98=O9M46f^rU6aU`<(6Bac#jo+&w9m#v{ojf&zBbjr3V*Wka~Fj8{XkLM*on zp-kNeDz5p0)f@Qg8V~gi=7lM`@GUs><;?WXL;*x^Zl_xh+S%-CC5Mos?bZ_ZdN~rh zRxs(}C@Q%H5xT-)O`c^o<$O7}rXxs9JM@)MCP{begQAwi5%okUc5r2rOf@slWsrL$ zKc7Fw`V!CA+=4gD+*(y;2tMM|i>J;!xi#Zd35Hx-P6_>$N*qpKkT$(7Y$ZU4% z+0eT0~MTMlLQxxG6S5_;av)`_`!mTOGzyMeDeInN}1 zl^NypGJdEEsWNMy)OzB+ZwG{(XjmS7t^Qob7Ae}r-tzj4*hMz^d?tYn82dNFtdWNU zu9Y7*G?%3Qr3Ldh;s=N*k6rDveO3fhaOsNB0!>~`BG7c+2-ls-UD=8Zz!cokv9Pr* z5!F?yHCsPe2YRBanyN3O@90%p83&HLxRkO;lxpaH_HUb4Uha@{cq47fj>=2gTqERe z(?cP0+Y(;PwkCCS1Hy#!q>Wf>ob{{GN4vi3Hq@6|= zezaC0d)hiLQaZy=2PBkLLl2I^6I>jn3YuC*K*E8(fDfKyQvArADA;7{v-{c^vaGcI z;02?4mK%I(3!=Qj7iy<*i*{mwX_Li2jMxlP4`E*&dtEnNnIrtrWs_-QJ9a2=cuwO8SQ^;Q2 zl=0eWnVV97^WFTN86Oi7bY1ZahJ+`6O%ZqxZ zWiEfQ57x4>yI>CW2Q|esd}BrF${44{auk%+jIe>$$Hd0c^&V<%Ht<8gO8ssoQ*&KH zPE2?B)c)6Em);)*i|}NN{XkT4wIgz9q{f&?&od$}qLytsNo}cM-|~-4eUWjCz$fs! z9P+IRW~kW8ir+G{k8V=D@59ArGZEZiozy-uMUtMY2G=;Mo5xafyL`k}<>T2x5`W!V z_L1=CtLW;jDLwOP&Dw0A-rYAXDP#+1MweJI)oQVuB$&0v)1DB{{M*T+sbdhw6e# zVCQx*n6^j6Ddva{P66D6uIozol3&~NEjn90i1ppuqH716in=YF&cgX^)7J2H#kkuu z2J6Km`tHlmZO!Z3xM_+*X2cjQpOdv#U2s#>u&lpPoLq?#Su)}hBj8gfGolI9a5#1gE~@W(<5KpAA~T=_n^>Xi3Z_Wbqczrm zKiH;%z4Ae6g>+&*lCeFAo!>U~d(Wz;&KZV6O}Zh96{~p+%TZqdqSQG>Q99rWE@ArJ zw=_y|w}~fAm*3_H-MZ--XPm!`B(H&e(Xyh?*DVftp;CK==CltwKGtQ3?85tLO_9z_ ziE&;g#s1x#NzJz-XMgL6ou1JBp~PC-+@;gK_?*_7 zMd#7kU~Fz^ZCTixvzIq>!a_V#FtbLyEG435BHKsd^W35;eW}zc<>8t2&U7%RPVQjU ziHITe;Z?WP^6@FDF zb`C5nhJ{NPv<6d#{|^m7g499(1B4f;wlvw(hkJ_UY8Erzv^_Q-oy3hCp_98l7YvzklJo@-q#&?iZ~0K5+#n(EhF%M9wP!DrUFWhg0JC$Vw4pgvxQI$W}q6 zJ=fE#bN&QmOnbt^?Ks>vtw10xQTytI;&e{;;-J6hV3sPX;qy-A7Nb!6@`97bg-=u1 zjS?{n?QU6lc-;=U5OnTJVhYY$gGRLgtOZg zq_7UX7Sijro(MY{7OLM(wuK`5+o*9~OQ={q&&BSkwt_w9Qm^hL&1G(KI7-BA;j$$R7k z4BJzYDq%CVb#KyVqkAeyF(vP_<%(q_zlIk)$6chD^>K(zjR+Go!ktUzkrY3LIEb zbCTP+@v9W{IzbB^gtqcTf-kdf|4{ zGLy}9e6~>#%fs;ABe4?o=2=UV!T#~7UU7Wu=hndadXHJD-99P-+x`uQkJATGk6c)V zv3sO@>S6;5>2l!N&NN}I*O|*<3wP&Q%N;B$b!y>>+h5c$=M5`87;j-iSS(qmH_v{E zpJPJ=r6-NjH1zm4+E21QW-fU?s$%%cxezkpIc>C6V}Yx2{Kipu7mwab_k%7XIbQ|W zqdbMD`)}_)GRIeiL_O?evnfdfQSNgQe}!bJRsaBwfZoQo!<0^P`(;@2;M47|AoLty&n;(k$4*J*#_PL1lx;+aT8ogB$}OtR3l&wQD< z7;MALwq#AN-Gziu!`gc3Pg9Mq=~8nQW3@%K!Qp&}sYXwX0wi}#DLy_bA)GTD3<1Ehgrs&v(1b2h`w%T zfxyw-O0}TL{n@MC7l!-98Rdt5V z?PzT0csqabERnEi0Fip0HjoN3J+6@Rv9-5V{<50>>fyPPG=2f0mMsnmQQw$=G?K&I0#3jA@Jha;(h2DRz)=8T)k7kB zS}SP-}>Ky+#*fS6(vRv{_+4k||#_6P}|g3d_IrFY4FNIblqSGl+e0ZF4w z(kG6#46hCG1ruuMYgT)N-KKQCsBnAf_A$$N zXoZx5O~DUih~@5L$iBMX#G5fS%MsfIG26zu%uXSj=>p+m5~^pnXA zko9($HkCvFw0r)9I{4AF4+f4ujKI6?WGhOYC zkw6Z%ON~n}pEW!pRw~O&^<{@}YiIO7S!&}%2)n3%<;^!9UlE|~<2Ry?BJ6nvF3v08 z=Gju2C|itG#l&(?Zh1$UvuH9HQtvK)d)UIM+|k|*sq%{Em$A-o*1z_dGb$kqw4b|q z8A)`(xES{UtEQr2Wb{?PYjEufroxeQr~8>p#YjA5pz?bvQd1Xars9Kn$oja7OqZDL)pK2YJ8dI_s`qZ;{ITL?F`PYVb%7|LfqSbUh)Hztt%zCG#AEEqEJ9k{+E z&-nWBx?`3&(~~bQF*JDVN&{VWvFwKBzOPu_{Bcg*f_xGCoTcwQ`g_x=sF#T{VNzJ; zU5g>j*+h)uX9c)%iI-|U@fxISq%=~$e1r3XK}Ka-Kf|&TyLR1T48*2Nd;CjHh5Pk| zt!@f0GCem81a@S?uo~vbq<+QAfO2(%w{CNj7!+$C?u^uol+E(!3Lf?aG1qY8mU9MI zQ$+!bb|Y-E)w{+Cw0!<`8i4$oy}|c56N$OxP7Y=ZAYp%T>TdJ4+r7&bIwc0PFNi#r zdmsk)b!yyj+iBiuN>8hKVlBI?xs&#xcZGngYJQ8ZI5F_U@cH=#+sLtQ)}P zCQ2YDQf1k_(SxZe;+`%yR^%4xm)_I5IpYj=Ga1A=*m%xP7cyneSL?gOYoBC%Dv}cm zc-}t;Kv=rd+Z|kmwO=rYA2Q78YFz93-w9e-EKQ61VC^YS{J1!F4XR#%2SSKQSlQ5u;f`XHNpRctr zTba@?5Y%m}gnw7fzq3^SCk9@$E6?}drE?hF=#~OK);Xe{p%jZ62jd2JFn9=O5}~Jv zxBt@96An~!om>t=PCF;O+H!F=(b?0Wir*$E>Omx+c5{!TIPXw)6a|Zf*W9;rf=TV> zvbS)SPUT4@)OXc;__yv%yWTHS2FcTYv<(yJUz8|Pwy*Ali?=}@1kUD9dQF7=XqSGH z1oPbR+DLcSK+Pfdx6JMJ6gC#A&fduyTu2Rs#QxN|8cl`GxH~h#Ucw;;3)3Tjb1KY*DNYbfxX~ zOSgc{G>}mlRQ<|Gd{DlzBqAq(YoxJ#+$~_-F7{a50CGPOP z@y;dnZcaYlKgmmVL~SWbR;tz<93@A+M11bs^;cO6smCKHsk9NMLet%u~jM!MZR2k{Y&7mHvrfEvU%tuM zWUIZ$m2}B?pSEc~ch*oUTdi z*i6^wc*siVMi6R^@3+EsJCAZtcik3qZx2$*_>WAALc}4m`a=Q(#LCP&IqklG)u*(4 zkN)@SMoq6njN5QUGzMFc9=(2QiM*}BQ(>PvLE);}I8+bsB<2`CpzS=nhFr#M;W~TJ zG{vOrd3L3WOKV1GlQ(&D$^5qG(+yLj+IS{j#Fy;xlLj|6DBV}m8I_}96rlg9C2nLn1tq`2E=3Tx| z*FXBo7@1^UwgC5QYrUUN)1j-#;;|QUa$FZgo?7cTE(0m+X1bK{{-|oF>r=|QXJjb-?y{bKAli) zIk&h2X2Jl;V7M@NBS}|`q0~w>W3oE4uDJu)%=%TzkW-??z$Csd740Sy_d55Om9$Gf zrX3VU-RAZX;bPEjih3*;$+lwloYO)FX>Ol@Ch>!y)L<^ly>E|r$9CP!2a(x6SrNQi zwY0t1e@-@q*8pENJnQw$C1%sd8we|8_w+7`B;3zd=cZIFOPVgK8~CrkKL-;^ku_T` z&rHZ9v@xtlVD47e#1(ky>>+n<@TuY-zm)N?;&*UcFV^F|A)CKgTpnyXADF8TY&JX^ zYbw#}>gEYO?Dt4Jtm+QvzOXLnL%TL9gPXr8KkqiS_@noC*DP};asuz&b^H1rdg+V! zZ*mWWgn)K8TwwamPp&60M7{9k4Af)f1?_&)ugUAHADfK5y~cW@2E zTfW|&d%ZHY$(y@2;P2v6D&j%NrsoOJi=?9m}H;%%`VI8Z{3fSQrx2_w$NICnF| z!RofTp6(#k2P?yF(5?x&t&MDF9G@qKhWUrq!smAiVN}jB%6z%BQnN{Szym)6h=2b0 zP7f~%wEhr2XSR#BUVxorvWpDTgmmtC9p9DDrN8(-?n-XQamX(~-v)@y@m;oy_%v#! znKe(r$Jc4~IrV%@O_Qz?Ry(_TjpsSe>#I4Z5pKNY4Vf9R{Rlk_SWHXR)#(#rt$j}Z zl~0IFe6ZsJPYb3RS2~2LS%=-0h!uszs)%hb6@fhxwxhCn&h*P&*XEm9GO!y(HK!fK z0IC)*blN7?>)*?a0;TWfn#`1LBy(N2(n(WZv6}>+`%Xg*ggx zSAf!k*HQBPqQ)OtO~#o z_`SJ(YAgSZB07tAua1rS4uc5bwNOuYir?B2H^hPalSTjiAbkYn!dp+7xg2dpsbc0g z7r5&(3hZyFbEot0^^xvy58xN*eH;=2+<^Z@m|@bs!076~1I|07&`EwFgqBGd2Acp< zxrQ$&GQNM1(ea-Mjp|><_34nD?`oG12>@Ku!j270Qg6p}ya94%cnDrN$#`-&@BhLN zd+LZxK=@|?Lv$?$h9yVy=^ zJng@DD(?JBUyRy!yXMsYp!y04!@{^tBT8GHsxpJmLs7 zCx-{`S#D=)1pu)^06Z)5QPdjnW>CPFdyh#=aD_tsxwi}}1jsS!3nKma6UqHg2}J4T z6%=$;RN`V{3`1}30Bj>_Gb@S0+6;6K-4&hUzr3hJcE8IKK<*ZL$<_`a+3S0t?Ni!& z@Y{wF0g0t*xQc(qNPj(-AmH`ew{IjQx)%b0A((HgH&W`NTYKN;C{XOskW735jUe2o zU=sm0%MQLdSC)%~`j;WmH$eXJFHwuq$tx?fD?{Esz=XClt6LCH1wIE}PSr1QBn@s~ z+C3)`XxRN*z^`fH|8hh+DHe_{0xbmkGBT3nf09%%y8s{?G?+BPfceE=NQXB$$7$dH zpD-RKJV6KpdIWxc)5)k`F&VhoZbE!GBrn5Sl9K(s&r_BFXtUOq0g&*Z{#^V=NC^Ne zAHngCrTn+^eiNX{1^i~@KRkW_aE9_v6;5zLz^Q&6|796h1Tqi`V6C_GJtjzpEA2O_ z;7O5L#}*{D#xZ;(3)Si^&=z_I(1-y+S~;JBA~gH+kV(dt>%TS;ct@qD9U}%IFZx2ypsj;XQ@V`e<$@-@K))63Y z8mOmE3^NOq4gN{1r9{n~2d|F|+G{*=p)?LmFDGxVnRDm`=8rS(X0$&h)~(__elQ;b zKn6+rilSgVZ*lE?YsYox8~yKXq^aRMf0j6+bP(ugjK`0 zw(DDj(BumA(On}SeeA9JiOE0#oCP*z{h^wMH^>{U^8f$5lN+d6>L$_(vATMrcjJ9I zvigdME#|V0Tc3*R-0Ska0A?Z1IX9(Wvr2c^XaKnN_dZ*#GKG$pY$xuC)kh`^e=Yad z!ta#NP7}2qe{uvG5o^N;nvsJ`y+L(3O?@*f?!L*IMjF3Iqgp3 zkN<*RGko}&=5I0lGDv{Iy0bSXIj=jBeM3V-icG)cB!G5`$fs{9+{O9j`w{!dJdp~lawtCZ_BqXj9&hH3k`B$H1RK^2=J<^zwS+0e;55U z${K;qo1YLL&c?>PIxPm^-q9koOrDTYF7288*{&(A_Uy`1k#vK>a{(j(>tWLKSe?Hut?>mQ1%Lg<7Tkq9ZnVFCJ%CR5 zEXp2!;q)}3!gSL}z|*Az7_cj|*_q<79Q%zf|AI|6*yiUC<%ll~lw42a-yX}s78CKC zFZV~_h4wwr9eL+c$Rk}_;0-r!fcg2!60fyo(B(On0B5O+-t1vE-6wjTW+Mp|Jq7x+ z{q*a$@#asemm}+Q_?F-Phg$qp3n}6LzqW+g5eX0^{iRL=(0lGgoB4S!r=PgSYVvOE z_A3C^_V6dM8gQFf&6cm~-LC3kkxYP2w7w3}5&WRPjkEp~ z3bXuQvNK8W3@J8X}r^Ygp*=nS^! z+^mb#1jA;csuxN?J0yVc>^#_XhWq&Ov{m)y=H~o`E%@jNKMfd#%YU9CaC?XdiUp}rxaZc6q(BD0D zBX&A4t)Oy^`CqcU^I7%30yjxG0#2iP{FkfdFU{I7dswM|PJl~ez)7k3&FM8C0*v-S zacUkH*?Jag0Y5v~fvG3liF)H+z1x00t+;tl+dU9$9i&_DB+-DLUjV*@f|X42A?SJ+ zLt?=E@BL|v+u(Gc3ppSDK06mOuD$WaG)G$)WY5ZD!8VOQBUK@%8gag1b!<9Nk|`PF zuOG_?`K#OXw|24uG=aZPIvy(2zmk)<+ezoLXLqBG3@5;3Er2PhBd~03tl5)C%`Md=qvq*G;9yM=OX#^s3p4ZI zC+Fu<|L2V0eV@5=t2L2^6g%LTvebzT>)4GP3S7UjZBJj3ABjpF{qKXV^Eo4t_x- zG@n%Vh^TmKN;B=nokII5pa29D`OpCL^(vVxrCeDJ_XdWdTcjE9vsu*}``I+_#YkX$ zu`3qlEvI$(;TpyWlCupV+dqptc1m!Kiikh@d8aeuASe9aJg${UBbqlg`Lb(cCKcA| zU|rKN(Jx|=PgH(3xl7l*cIpvhZiP>I@o>PK-TpA75GRRPnBZkLC|GHV$)0y44m8XkkfeXYFczrbh#QCuK| z{V#X~@EmexN3`)0*pPuhpcx^C2=4T<@zdySdJ_+PSbqK4eIL_a>FVz05~F9&Q2k43 zkRC;$!H?EHgH}(CQx|C#?p1x=!I}3o(4uPwS?56w<_oH!?}|8HU@IVrpr9b3Q20d! zY+rFtntV*`zIEMAP3)7VdQ0U=HGj~T>Nv=^KI6#G)^6nExSPP*x;wNZ)BDMTmM^dI z$5hooF=NluH*g4dO~gt!mgc7!R)XkgXdX8wPo8ylo@0w!HM zfRWDV!HLoB1A4t&c#Xl#ENyQ}9{R!|J%xiud40!T>igi?ua6IXTkL?Rj!oJv3%|(|YO{m^x8bRc$^w)q3;hoATi< z&t3|j>nGNjRELU-0PtkpcDqAevi73e$KE`9*l^?|kwM1uDY19|tod&FIf-zAh(F)p z&&x=Mw-_P$(hN1cy}A7U73GL#gz@pnvm?O(L0GtLp_C4DI@$^M&9Gq?FvR#`PdRwW z0ulELif;e%f&I%|50_MZ*5f7Ik3I&iEz5Gkw^^NFC80>1$(lu6oU0)y^r8uLGv3%J zrJ9@ZV~=f+-%^E3qG7M8@g{F)I^Dy4e&IryTJJ;YUUi9Esmj1yx`M#8E0|N=pX86A z|5+vuJO&~HAZvg0S`kV{?UZ^upW5m3bc;?f0~d_q$0J~K-y+03g43-x%4-PX`8GPv zsokvoI`~fZUo4*dgBRfRfi>2Mb@CnZ(H?kjuC!EsD*LP1K%P=j(RB@1xwmPZ(rCP4 zhMs96*4knp!m$PE!V8S;KF1VHM><;CsYZ9m>CQAz-%WjgAFCO5xpg+n@Ynb?E z5TvRK(4z5QO&9_>B7AT{5}iQghisJZeU0O3E7=6a>3XCEM2$PrXT~Q>WF+(e7t6%i z3%W}C@u?R=!{_Lq#r~}9w|d_#GDWY&-Sk5ZW$wIVfwBj3kbn1TTeI;C42@lKtOuxP zM_9O_l!D!rvw;C3Iel_R$3~&5IXh2TN)ySM7vc5EY{|ZTsT?K$tfi(#9m^!G^ALwe zjGiS7Ajg7bz9&-~A4L&MHRWk3yS3^UYY*-)$Wx|`>0V)!jW#1^Cr!eY32(DrLobbI z^Z_Sc3@)>$`8gaIdY(2~$n}(-Gy1W}(LlySPck;ljIe5j0MI9D-?V?uQ@u5rQvrQrWufET= zxsO}?s0#--QV>>+4 z+brGxzWC9+yF{HngL*(|!?=RVSx_w3w)J~XVvE1n+SJsvKTTI>CmP{fVr(LEqX^K2 z%4vq&oV)A%aAsG2K|z3E?)21o9XYlX4L>cO+_@5SRRa5)q#W@+pGMgoal2C%^a(e@ z$U32zy zNwMWaQER!B*;$lb=XIq$4(St>u@|v;+4TD6uy-ASvGs2JQc`$Xj2ck{KJR;xDvGxo zm%}A_GN>ApL^Ey7ZHO4}^?d>Rz;JIk!i6$-IaaA(;XHX{&6Y!lD=I=fHx%1F5vuu0 z8ZLo5apmo@6B}^)Gb2+|b>beY7~ztTRK9JyJU{1>Bz{?#t3#V5WISHN$^LTl7dfivq1aRxj|xMBZR4y)#)oF98YanpzcJUWVe zd(|c2;pV0p7dgM1W=&ss)iQwS;zBd3SFywSeC$@#=pj$B_H`p3E$1-wyZ+;qgz@QJL6}~qiXSo5H;)#F)*41dEhuQ;ptJzdrE<1P)so(i& zq0sA;D}R8!WFHkc+y@muPNTas-G%)FMYN~!JsXoc#t(KOO4ltFg zrlX^!q@tyx0vYW#@Cbw)=ULEM=F=7gD0d%T+lV+*W=mEV+3d0@cfPMc#lT10-Q65L zwbV*VrZB*ZP&kvFJk-OswXtbTarLQHR#K91eqmm9Q)zAWwL&9?J0ny4VX2ZnFgOS( zUpfiDc6SNlOUzK0yr>6>k|q+O?ZL*_r^|uK-keFbACkl3NrI-2aaum)NIs>Z*{A|= zl`cQj%$9891)lXm27P>vkNo`n09x3tC!U2F8Gb!%FHMGAyp)8!w7pvQX_6vu9a305 z&bbTSz5K)9b{OXfmoJT68(`+5bWdEI)r7MwNWwxO7aieFULCttG{-H_$MIh$GY^^# zt&wIw)-;>bw>Tt?zS7cddsngu92YB|Tc$fN* zNq58|NjVnf3C?Hg94m<*KNgv0$zCMlTs3J*H-1ivV^E&7WLO=c7=td;=G@)E|FJc) z=6q{s9>iZD*=7%K=?ZhajmaAotbNB0>evti0ewY;+HsDB?;|iIX!5+=+{9m@{dJ4~ z`A8rN*YVI!`StX4kz*w$H2z%pzWayTW*-aQmW|7+SHW_^wZx=vl9~_%F%pOugvq1R zLB8)I;ce%ltz@MX{r*Mq#DVFv zdwrLywMCv}I^R?Y&sKa&b9G*n&zSIEn7AAyZr6Z5nQKHeDWH5t{jd4}r*nXbIf-!7 z!}H?Im&B6p5EV;FvJN)3_7V-wF+~+RTDYox{pAsY3&zNW#g;Sojc?i-M~i*456q$N z-60>}Y=1bWby0t8`Xh7ELglna9|=~n?)iRWz(!0#M1VaD%Y?fDdy#k&gNt*9YXLyI z)K`vc!eMUHHrJo#fvm{~;cYg1;e%PRClXRx;)ytVsh@W+B(!RZmP&55?Y3*WCZj^< z-4>|#4!447?p^2Bki9jwpPrjceAMdDp~1ArXq@=$>~(gEl7AMx!~+rs6y%4#zK954 z(f;Mp-`OAn+1KOK*4K)vSM$;_7k$BB_DfV%bjFRhYYXyav)5O?DP%0yp-sS82)kH9 z$#TDq8Y?D(^rO`2pAZl*7a`&qv?TF|mkM@vh!iV((8SHI7asgz$mY7TB1qewyCX(RmcP&mh=LeCu zOl%bDZ`V1-CQenJ596OT)^|ne4o-LCh~YAsE4=&@gbU~>^xhT+d55Bwxmb5t?O zo|$yn2mSVkTXNvg{<_?s+8O%Eo`i3ykJ^QPz*LgtD$dPl6tT4TR~lF5JhdmU1I=g) zzzlCb1(mJ$A+Rn_>Dl;Nn%it|ZQ(RyxtU?8XR1P2jKy!*2ea%i(yBD{y|PomREjqu`Eov7Rrf9@7v9JVau;TqMSce~6#H zvSx96iz-YG!LrT3w|d4LjvNva^3ur4>*lN^K0Y3@C%Us^eP4jvZE)80_JRqN_8@cM zL~_#3)+8tDCDVi0iZ>i~l4I7^3lPxo~Bm$m%^+@IYJ<@N|O!IW1% zjo$IA9qG^4_(*LF(+@)_y>wNaJJkJwkV(H0$;W=eAh_tlVVY%~sqv=ifQahy=d};u zUw(e}kNGK8`aD12A;^)Zcbo#3_yOXqs?0uRHl?LDRk+9%tR^fN3jox=FFHaOZ^vHj z8Kl3Q9?2RW3ia*R%v7jh=N!IDA+K<5Atkkzk-^Lvot>qOmi$^RYkJ~`Kuf%i`-sET z$0EsH@rCvViOuel%51pyca@ZDV%BSUIQhK8-2zX)<37T|K#T63)GBsTWU?i*wI%D3 z|AMij7>KQcf`OKSL1`i0PxGFg6p7>k9M%tK$lICI$hV!C6KkU*c-aTT6D-zWagtM~ z=`m0-Q6Hd21c#$yVO3~+g9%c9rTHY@*yP>h?PbL1;!Wl&PM?T_lU{F@=-#5<9<05B zR@VwmTWMwFe#V*`BWZNXUYRdc)W`GY3Bq#}fNdJK6c4Ti8ez$wKVKiz+n-pDl$n{* zbB-6C&CJ+ASuW!`e&d4*<;>~ayp91)mYocLVj8FZ9-PrJ`)s~I?be{>=20V=V|I;JSW)#-VuXfE5~g9P5xGtD*+A;!)=u($Uc^Aza{c*Ox8?TfGx~XOo-g z+t3iC-nXP(RMcb~IoQ;HythDkr~<*^ z@$vDAi5IcbZ44ruN_h0m<`?;8SuHJ5_UTE|w2o){vAwJIs1j%a$wS~!!Dv$g*i zo+C5uxOx6QnU9jnt<8k9_%Mq$<>|)U(Dt}EkgQO*XGrkVAL4^AUTNL8j*H`ue{&LU zesCC8Brt92bF&`Pb(H*7M{akHY=@O8msK(`5(E;WN5^vHqtqC*ojeVsxs-FV2;)er&&{vR7wWRdUQO|T zoCh%@N3UPW<{1a_VyZ_7J(m6cHi`;m2dDF$1^$1yt=3^mmXx`WI#SRPd)N!A2~3OH5rl@Q!OaWr)QucesPg(V+x>;#7`hng*5= zaSb8u@AnALPV#y~N={GAwRLos*9IJ;>*Ot)WXI>`rpBgN9X6Hotb8o|U~}>xL68;d61qmw;`ztoVJ#LZbEK0Jk2G02}O%s zvo3(Yw=Nej@U%Sn$C?26EE&lgCd>qp7Ji$x7MQX?6HEDAQJH$_&rLy3yQDPF<3z zn`FD_!#nrYfBF|9k~w3qfFa zE}pIA%ImYk>tE)6Ni76n8)js@8IkWAX*)LeT)Ymzc|HeZE^Gb#0AR6477Em@VGfRi zpcAOX(ecT+sfXu1rpSkQPl}akX}%P0DtEMZK8U|YMDTx*>*d*0dA_C8RWx$pn9HQg zmF&3|t5OHGF*HnN_K9Cq`!OJ;`!ueb0^8oo>m3wZ>#eKLCV6&lhi4~W)2uONhi2-) z?5y{0BW_|}fX}=5I9we%T7p+lWwjqC9&g3hrq^-;qlq<1tqVE(dK+<8o-wl_&3Qe2 z_0FbSYu-t}aZ=8h->R;1ywJXTF6iTPJmXzhdto2BmcyaG>eyAM6SL_LR)f&Zi83KL zl|R<&x36>O00NmW)YJ^|T>)yAiI^{7Z9PW`_W~U{NPPi%f%5i^O7M6}yT6^QkMW@Y z1DsU34Bs3%$mqo9O|v~^1@<=XlYKf3N=0)mOLUP?e}YoMZ_QN21yazF87}kT`3&L5 ztJxeXaaC1NAuO4okJZ(9aruTn#DR(67nlsWJ)=fuuOxGR?ggT|<2T-Vrad!4vUS_6{fd2JY)UJS_09xGQQB!U08HSoH ztoWtn+!NymhD++DW5bqDw~j9(PF*f<{oKD`)8^g^Ipr&_t;XioA4h&m8IRrjVOCW9 zBG=3Y1On>{e7DT^?dyBkqQuFTMjeI?m={@u2jSTptwCg7>>^n*J zQNTxQEsy|yS?*RLebG)e!L_*U*E$0z38 z8{wWR4Hn`f=99Eq9)^0e)6;VeucCVr@j2TcdIy@A2Iezegc*kbqNLto$5 zA=It_=38}jVlIsTG|bi289iY38v1y9&s}tMbjxYH1YfHtCmWk~eCvb*`dBqcvP4IP znCYE>(>qMeDm64FJv!Ra4T9Mrw9|Mu+9oB)CkD;(nE_lvQbW-CSJYpD1VB!s(ha^@ znHPeKiy;EwTWF8n(5bR$LwNqVNo zM~j%z;wD_}Xcyd!iq5kfLKq2-2WWDVp_o9Acci=i4}Ab=Q+rZP_w@7>!w!)ps`OIMZv!^s#hwJ7?!)*a*QQJ3avfiw`h`^SK#cCyo;-Fat3qYTYi63CC(9vdYTx zDzo}{b-=oFxf_tJ`xcg4eZ4etaio0iUS5qgH6MM5bm{6(hl9uxM*y;nDM(whVMb21 z>Wju$*Y4o~Q@tBM0G|z>?vPlHSPq|_DfFonKsQf3 zrm_W5D8&z|2^YM{l3FPeblzWPLGg9ZX5;VwdzqyPe z?C$RJ^EZ!bQ!LHQ%+eT29xsn{bcp1R11BjFO{_?n*xJj{ooY=~wv=A_SNDTO47cE#pdzc#{@i_wtzPRF%|p zH7D~qNNj1qPKyq6?n3nmo)-qY*-N6ZWWP(z;?&*-H^w~#DSW0BV;b-~ot}?XJ9}S& z(f5(;d`2$_?Q(*OYlzv9*VWb4^)(_THfl#?QZkX5+OL?P*bLjS1qSmwQo;{Uk(Tn& zS#cn$)84gEN$1W0k~2Woksn^4M=sD}nfxI!&e4JpR#Gm|b5dJZAJVZDyFzi~(4(}P zK^^`fOgp;SAbXO5pI?_MPO(2~;UPZ0hO1hnZtmIf{%33@MOr>e0~X{^7oI`L`SXOQ7rcEf{wK57TUE<7DTi zqT;0x-=HPM{wnWUnIAShuaN$2NWMVic>Fbs=M#W6DgeW*nUT>USXpv$?o&=@Gry3T z;h|xR?i@fagWE|+qu};_b0}ezaob}RNMpP7;{a8U=%@O*Em7$OF4aO+c{owxl&pjS z1PmX=>6e5_Zk|?f3&+(x;{;&q&@j3>I}%1xUJWxk;O9?FPebO%^<0_?!FpSpn?z3@ zNdyQgdeC-Ymx*SYTUb1l%z;+d+S9tE7}EZ_vE6v5_P6GUmhb z3ZnxM9Ff<3&r4YrW=#wgscVhf3=z40Ghjzo?{ERQ9yB^k3@>pB$%IqHY2(7ZVkEQI zZfN3khgr%p#o^)ooHUtiZI!h2Zs8u(1mhB%K+UKeyQ(9=Kg?3ND*ALP}CouU!#&q?^G5f>|ZHHEH0)k$txy# z6&D{T?;F@T2F?3o4P2}$-kbhCcY*_Q8!mz}nHJ;4kHI%%>HR?WfX~?MZ07jJ(II1E zyiyu17Uwa)%>2pLYBr^D>+1^ZKG?)i4(3Nkw6QxY|8 zhC{G0330lT?Xxjqfm6@IA`awR6-3SfIM^!b%+!A?cK zP%6sf(g0sR1QfXGO!nC=aSGO8^+L#&O1|t>*Hj4<4FFsJq)v~9!Cpv+8TrA<)pdO9J^g%Q;?H5=#RM{Y8z(7gH-SJ)KPt0)4w6uS9@-${o~?M19)$)``EKI0G9 za~dCR;sv+gcoR)kNmpIMr%F>|_fotxL z(%=@HntNS>g@(p7&wO)*M%D}avRj#{@@Db=t@$LzPy7Fm1_D_qJ41LCN9T@{ttuI7 zAY(9EQ&Lr5-{1K$mH5n`D29RgW^fz=DH=9A_VAXHiqV|qnepYg=GG5+4vgYss+k`4 zs*vvR&CV9}_s4)NQiccG!e>B#@L-v1i!S4Xu(rHig5Y8&p)GbWz0YprD;7tg)>cHs z_u(CG{=brR(rkXdl{|aRhPdX=g)^|k@3X58HN@0g53)IJTI-!n=lcz3T~2olJO87m zBzQw-XHM*+v3d+NG$mj2wn)8%MiKtj%BygwtaDK@s?v(5)9V$M+Z%M7+wR^VK51`B`5OxTH9t)rlf>9*3W z{l5BkG1|umK010hMI%auQSC#ALC8bPs4a&48PtXi z;mt3$f2zPa4RD?J|8~{NP=7c#z1QP4Ti3GYi&JAtYj8SHbRL`-2p_u>Wr~8n0Yb~b z3l7pXWepV#9UaKroPwsJNt&jXmbn|LP*0w$p&6h5ZvC%?4CQ6)ay^Slat$))s$w33#|{EA_YDM9w1a zi9WB%2yn4+aeD}D1Lr)T+_3V#&LvbY+~C4nYsKxlACj<>a!c+epgP}S&_p8B&U_Dh zXv1la-)DHZ%+X+NK_%^#b_1hY0@t70>~c>gyb3 zK85)Zkrn5wt=ay`!HFX6E1L!X1D9676r%ES2% zyij2`P+nf1wrdkmKn_r;(BpB`R038DJxFv$cJ57GXbM7$N0ThX)c%o4-Hgh{s?72a zWoHbGA2fy_3rlNri?2Ar?a{-I@6JOR(3>zZFed&mKG^$kj-O}g{)YC>g;EuZxz5fLx*dk%Z?2c4Z|GwIZZxVkts zf^NEMT#xVlwc|fOK1W-4`YXI^sYBjB&2$t1Cy*kgXaN%|iO1Jt(9ut^pX9&V%1Zb3 z#L=yyy$a`NC7)@V)q#wwsi}!IsBS3EWk>Q~{|GhIQ;*Zy>1^+`0cHgcS2=@%f)atq zbu3PYX?#l^P9<}Xa-ZOVggqBebJ18sf_FGwa1n46v9yB8Yvs!9|x zIn2+=;(jo)3S9h8($ZQV#pP$#FL5{Vn$=`xHf1#1_$I&8Q~0qh{>v!%ZBXq)rk4#2 zcVt|f4~IROifX_<+dBfOHb)(9|CnQ-k!k_yFDn932ZUmNy)r>G6>x+f5*m8{_;O+* z0a~CIBqrS1(IJub@$|HM%Xr+ns`ibBnfgSh4B^HG-SxHC2_m9m-stF4dR|^yRzdnl zO2K_1cu(-C{8P+blPI!Bv?!L?oAA_3P7e<;QP6S@fh#I)&W2d%vHcy5R`%wzc;A<* zCM*l}Nj>n3nnT~L2yK)MbwHr>vUhEf*k$bG4i7{Mcg!W?vawO2+dG6LU~ziD{Y;OK ztvA{@oH!T8!jdC;!ne1X_HD1$%)YW)Ihczf{R@lEzm9XfpaK zE#_Hdbt~KY$VbZ+xaXH!YyoP;Kb)o(7Cu*5s?jyY5>@k_B^ehH?@6?O1fuwPm+2{A zU${qIRqQoh7aj3>q_>i0b^70~wQMvbQn#Ehiw79X#3}rN@*!dXno=`|Zek*vUV_xK z#ffvIkTeVS&7>sBfiZ0LL}eJO?EO9+TU8oY7dtEFv9uC8i1 z^y;_(@GwhgN#qc^N=#kt4<`>GzxGWZbo=z#E)OS*#Kx)!W&^j%crjiYk7xdmo>ken z5J~C0yt3vW7Jj0c_V&?(!QpzfZou|t0ri`FW;V8MjfCRo=>vwz#U=#tj%fO-5A6{A zvZ&`^0J5p1VtJlh@p(7T?RmGyrw-Epnwl_#m~*bwd6#71$J=vJa)FMeoU#_oHhqZO zc7>aniV76COb`)Ckg0;db%<2kz1=)~+?)C3i`iLVHv|$x{uxcJE2&I|O{mZP3a! zHqGLvY3K1mADC?uqRoUWRV~`Z#6-`HdfDMELT+y>H+V9#bYv=rzoKVlY58Pm%gSXW z&jRelQd5?p3qqTyPm@m+P=0A3L1v4SEsP0teb^oZa$lXVDGcMl zILQ$3aj*Mq$LxKsM^XcWj>Ei-eKQa|_oY3zv!e}Ly3cN|_Rh!}>@N11)XMMOb;$j7 z)bBo~XuvtX2cmOef}(|Oy>5xCPB1Mt<*w#{xn+xmj{ewQ+fz$SO${Fzx2ZAKalNxd z*Kw-`e6(}_iQ59u%K%WzG?xL~d)ZR)fK^OVbaN9HHZn33M-dCZUpp``P_gbHz`Os} z-k#+R64Je5UGJ?ajslt?DQ}m2ZW?AUATe7!FtDsg3iddm?O>vrNa12Sh~RlSUw=8a zu%K_jLD?-r1=Oq_1=mKLz6{S%BmV@HTRS@Yvs-8}%d@_gW@g6SqgoO^aHP4eH?t8e zk5UAvd0)mp$Wz|Y)DbYIkNMsY<$LL)JGGSjPDl{g086Q(jw4g16(1cH4cTudXemlg zFFj=GRn$EoJ;>648#LDe0`7qyXk=Ozl*6&6Ye&B0W~?9*>%U-5}*-kX3(mp*Qsw8Xo)2MkV=c! zz-PD6a&>#YzSx$o+n_o#oH1hVY*6+AA)3E=F5~Spz%`WUKC-E!)Dfps%MlY1Q&mwN z8y%JJU;6klQh;AsUH&x^a8uP3HH0tqC=4rL=lMtIf^}gVreekMal;CdL{)2BC4(e< zr^Zr_bet^;1YESNtc;AG9>_?bJ-~Eyc7|G1VV+dsmdofyi5_SgZ0zhX^bKzPFvAh$ zXu*_M2a2F=UE^}%KxT*h(Kr;Up{7JRno-oyVCp99q$v%H?LVoL^pviFCCO%4jE4vvXLR%gduUiwD0e zm*j_=nT9C2T^M-laA2C~zt+=I%7$)aDVo35mv@pbR6&dUaCmr_ljiB^(bFsW)kn@& z4VHZbg{}gPNi|uN*c&tLE5@AJ^OasunO@sO9@jK~y`e(F@+FPTT?U5ckDj~A<_FNj z@)6)ZBqI3THLU*$b*9WCZL(h1__g*^*KaSsEvECI7WNbD>piKuOckp$GuNyg)MtX{ zv~@SI!+M3%_XNHV_y4=qej6{Co8cEWxP+()Vm{y?-$$>cc6%|1 z1xUNR?Ah=k?`S~{1)|R$gKOn~^XO=Y1`O3y#ug`!c zg`n~ZN7*%b_4p*E&CP8qYim*hf}ySBDh}r$ft&5~gJos$pgtvQnf`C@?>jmU0!cO~ z6sjb!CPvMsr>8YLI}0717=l2c1qub8o42!F!EV|%4{Q%V2 z;QS_^`zHRAXz-(X)H3a))EW^3e8ndFbCf#v@#Duj1A}0vjl-^>^0PhA-g$hNWqv^r zv8$sJr0R<$E*Agg#qgbD+Tw=@x|(iwop+BPxld*UJPe5XxM2k2J?U=q-;WJf|ViF;dn4T^Sk`S~fblJEl~A1&`h$jCT~ zS(opq7N1|Af32zD7xh(EN^05HSiL4Ux8O@-Wo6b6!QJsXQ(49SJ8Fs{rqu7eKspb@ z25`RU>NM5u4zBBzOu_v22iN07G9`JMmQu?}=I$jQkGjtAPN*C@*97_UNMydYQ*bu~zf ziB7q8vAQnLPf>4vVY-Ra>Kz&$!o=^MPiZl~tMS2_54RR*kxedb_CA*oY9H?q?@CFC z(|PvQuGb=S7el0!xTNPoF6foh;{G)F`V=98?q*LZ;1eljk&i*PG3x0*zPc|Cn!e;; z7x>-O_kx7?$9wmVV?3J8-C3VX_vRwMf7hapG=vApt%U$7)*kG$I-V)sE2M4XH3llv zyyaOsN$;bB(qUk^@bJA4n67MV7h>5wYL^Xi4%6qP z%YiwEC7rxa{*!Fyii4y2HM_zl`Sbnj?;Wed_rbqa)N|w_{1xWuFCpc)50>55`DBPh zsXN1B-WK1I5R^G(br*sex|ak;NXC`z*n_U-BN^E>*pD96ELXJhvkObEbn{X~P+oRF(8sxBaa{DX_~?qCzrmoAk- zyA_WPI8$$bfcnq+4-YH%NMI+1FY(C*V7)h8KHg&f8pb^@AA7+b@in^EwvZzf?i__R zzwa>>Yo-6s`}Xm}H;TNvN^|TZxEloyL2Qv^D%t<=At52*`_~sB5GdMAvP}x-h(uFH zA{Qdl=WZfeQsH&Uwk$#96RXO!wn(>x@>?pK$gNl0$sT=y!^(E&WSz6Obmr_Pn2|jb zJRpOkf)BUey&q9Ro!du0FCE{a>D(;0TyRgVD?0}S>D_LmqMC1kS`pd`QCv~Ds^F;p zPOJP5l3JYb?tl+6*^aUH<@D+fGi<#rx5n@>e3V;4#<&2^tGPVBZRX@kltZVx z=StFNj>dnh6Oqv`2AVzUO`ju;uRa{;(!22V%XofnUjo!2bPKQl}TEC`Q-Zg;3}UxplaIi|YwmF+jFrPVr0%%n11gTdF! zu^Kl@B{w^#O6U>bkZOK@boF=@JYi2kAx$ zLAtwBV(6{`5s((?mhKW5asWXk^Ds6aO2=Zos`p#x>pc&+&bp^g#J;*aG^8|iv)n4AsY%+sw#3eB5{7h7Sea@Kr& zxML?kj4Mx$e6Gy=%-OFXbZKKlAZ~hE8~o(1DyOhQwW}J9>Roh64mYSP4;>lO!M{9C zCIAQR(U06F7o?J1aRUH6CwutNp^yLMS+C?n9Oe98Kza#iMddn}hyaCo+5(~Zd9B;L zoSfVbKo#x<1nHsgY+@~XjY7b6gFzu2t=?u|*o-A_ZuKzVIA$TZL(VGk+t`M9{rLiy zKQiPqpH<#mWpueXf$-_eH!k&93tl*-Nm$6cw2&*$&s}YnrBXEL^DF%))h4xc1LM>(+0cP^&pWRke#)zkoOGpFszN&r9th&KfQ>T!L8 z3N7hD%k(iIt?G{(eV0a$tvFu3_;DQr2*OP{2XWrMLm&`0-7w~K$nzx066tP`f)?{g zuzGo=(U@_r=M)z^mpy@^Yj|7y(b$$pLW5I5v682!NxO9t|7CNs86dRUb;X-xpI5Oo z`C)yUkP(c!C;t>(3%&mA>wjX0nTAw;1a*QaGTc zt35txyh?u85Jj1wk&q}TcyJb2f@8rJ16*8*8y*0ib6ljuH<7~o^2o2eISS`AP~UT+L+MSW&6)WT<;*0T9mfCKeslkLepy{ zJL(l%xHKoW1%&qeVi}OW+I#5d=ch}?s-)Rq;3v{a-Og#rUPS-l`7MSo+(JR&8%G*N zG1OlZ8oW%!5eSk5Tr}^EDQ{3 z1xxBR%D7;Ypsfxyab+cR0uPau5LK*Q=d}Jn({z4k2g=MIEn(sTfKH~3yzQ%B>0P3U z9HwWfG6j(SvHU$f)c?Nx#<}?T1PY?}UKbXhd;79#>9H(C+`i3lE-6=2Q&UkXn9S=g zlc7Ji9K&Uuf+)&%l!itrbaM>3MG=vq#i79DL>bPzej5FsOZ7AF>%i`}GX#n5IZYQ^_HE1Gp{vz4upWBmVSZQH1(_ zdvg=D%(pUNN`1@#VJsP{K<;BMaGRgc-{wINR<9Qn1LfdSk~89}=y-oifu-74;H*sE1dUsP-fw@V23o#Es)GOClA?qgUR{Tz|6W zf5s5Ub|VS%U*8|6j*3T#qC$rr5i_bnwb&1>%o5E7%H+3+ErC8ifV|_yOT7o^3k!xc z`<7hze;ecaJLAwk{tk?;2NLIlibsLs6w!f35URmwL^hcpTBN0ggWwt_i@rVryX|~x zZr@H^gSrl7%V$a_=GNS4+NYhYJqd62&s!-ad~iLYa= zLi~>%MvYg9T|q&+r8~7SWE*LQI3O+FlZUrqen||eaFn)u*}1YUJImUPk9_=zFdMDb zwi91)ysQ;TWyBPpv9x4otSbx^&FI#?2q)(^P@OypmI}_+>YQ|EWet$EP`op;sA?P{ z$7m173ZS0wm&qBs`TE}=-k;lDFzgr*#X*$8bRJ?yQ)h^Goj`|87!z2q3AFS8! zLnNNCl!?&Ae18%tKs*2b!HZ;V0KYeK<|nVmYl!}g4`q62hVh4sYv>9|ug>hO5WJX4 zSg@H1`qP5UUzz}Io4Vjp_U*0LVBA?%ha*&9 z=RyHBPz}S}4;Yx;;x}+e{$*n(=#*UovjzztmH~lyX6-&dL%kF}#ux78<|U4@(F7^|7P@pX-P7Yg9JE z*Q@Peb(Xm*AQeB4C+K0R#0j)R1G5*zli6LJr7T#>81JZZG(qVU`vs?cTR_8j^H`AB zU)*wQ6vh!oImKAPF((k!tTJ)Dl_KJleyVtpPH}{aSlUqjO_^xEl3BoT z`nyqyF7v0YjwE!iui=}_zUa&j|GoLVn~X4*DBN~;FJ><;d_ci8iib55c>qcJbtjw81j9W_)6@C0$z2`Zy?Gzsj9PhN zb0+2lo`+8D)t(1=A($KKG$+2gnmU<4?@KI{53J!_2YT#xG>{)yp;mfvsG`Et<~}mu zXfdjhSp}L3A}lzVgBC(fw#)Kgq>%Rf4pJ3qyjlPDL3*z-UC`e9`-#2B;4UQ?W@Toe zre-lPhz&pY7wHKM3c^w7#cZ9&SjQ)$;HRN;llic_=V(tSZzkj>{0Lz}gvu1&IaNBPV zpnH?!(K2y(NEzyz=L<8g_9m0w`)<%SES#F%mj=zf?}!Tx|#KDO@YKb=c)E0L6! zOqnw#RAswYDpFB?E=XVpXd> z%6`6i-_`%=jK>rwu!$Vc2Sp_bvx=&Z!s<9nbn9GtF@5yk>?cv zYk<`bzcQ-1bL!e%JRnUjqslIs?VDcS+=cD>1aK4@Xwj=$KP&DjD6ARJJ*yjRO0+Go z6+f}milnP=?NBB1!sD~HJ-0i?|GwTu_zhPV93>WVv+gV0YM{>7ewAykri;^L_Nw2v zsze`Dl&Cs83`lXK+(UUI@=B?wr+R=jJw&J49C$mv3fCjLhQQXdGQ(%g#5aBbKTk&B%p(eJg6>*}#M)`e?le$-S#G2) zP$BXfBbCglZ1tC9!dBH7&Ch3G8rD+KQnJ+YDUgErI|WGds;D7Xcw*$!e#J|_Pc@SY zlv}^TvwLw`Hv+|<#e8`3AVQ5g`$@!yrJx!~0vdmpn(KZ(rRPzB3@s!nwq1jSJ+}`& z2KRJj*_C`a16C@Lxdm2Qp2a9bF!pg~Rc<$~B>t>?o(0D&-`G&09JOskke_1kQ#O=E zs)mo9p>L>PP`u!yTP?1)-~RO0+Hd3ypD$kQ+;QmH=sbVmcQI*Ry67DvSsOO za$VmXO>C!45{4iF`xT3{NTA}!?YyH!CD;tCk%{yr*Kf$6a2(+}U{k_hC zYS%8%RfN^$>!e!z!xb?GcN1{B@PSPb@qsN^$Gmn9eK)wc9s zPU(1VH+L9bogOabU3SJ;jfyM~Bz$=i4|5mYrXA7dw_n*ZQ=~KB&JikZT+UD10~&Wu zqg0zarB9lk(yxf^=`(6OFOEzrw&NlYd#Z$3`8*X{PZSz6Md?@L=*p$GN6NW#8VM8} zY3L(P`)WlXdC2rjEu>acexN{3Wm)S6x;mNitHai6OdZF>OX zB)r{KplmtusB1)ryQNPi?lCwxL9F(XrS@0ud_xKUPDH3^OmdQd^;winU_lIxOZlqy z+?XnWgZ*CcB4G(9Y0Amoa3bNj*Od%0QU2O)wbwq}_hQb~TClRy`iE%=rj$gm zJ|0oMqKln+A!l&idab4eC?)gRgl{VJK^kN^eHmM-B$9sh1Lp-C zFIJMY&M|46o@x5n<(4d`54Tu~vp!K+Z}MVP@M^ou7eZeZZOHQFe#V4RSIT`PWyv>I zyZv-3$qqw;XMUxtA2&A{8ePuEX)fl@ma1*sECaAg2^abYZ9#bjMZD4W5^GKXM2QpB zs7}2Mxx^HW(G0q0I_nuetd^EjH+8`ED{ZMKf!5|VSe-1`{o%9K#+MU;Na1ipsEb0KSt;1umA(~M7RJQKbM#U+v+|OD`5B-7=K=fVc^^Vu0) zIY0M5=aD!<+_ZeCKxih5SXQLz)2-J~(bQJeRMb=iI#^qA_npICZS{rF^42>$K)pJ! z+5WFUEkXyxwZ9&it`byZ`{i@>lVHi$7!1L;7aofvLeF$5&T2nbG$e0Y7SeX|CwLy$ z-g7+)me9A>+c#aa%+JfsXM4)N8HxLLBpQEtC9fe`LYkKQ>FW=u9J>4m1F?j`1*A$^ zn$jK1NwR{l=}hC1rTI6U7-b>z#pby$9LL-Hw6i}tDtjW<=S%FEbY4*8=TUkrZfJ;N zUwI{%>eaWRsRz)06<{dNwzjV38TTf)Ii;XnZ!hs$D;98EQ$il`B$!x8+s+0G2f#JQ zIs4x5KgKhVf^j$=068L($FUN+vd)1@47T!a#B*KPj;p-GPR>e1la9lxvAQM9k}!|B zX&Z;{zWFIXFg8i)H{E*N^k5@{Y8a##S?vLseeRyK5yCV~+688dN_Uj~OmQi>lsg~G zf8%%jklFuAY$Dz_CkW>>-@m@EPibGD-cL7*cDTpfpQdkFHeFF$(Dldn^=5PPK@G(S z$j08h;>eaU{ZWXF&f9PE)p36ImuerwN+4U8>5r#(yR$o5s;Otfo(cb&*1OY?oJ&ERC1TAXXNZwpsXh{%==5 zRy7ru$^7)Lc9%VsMox{JLdB4!EvNED5u+;_OjB97g+m!tJtxatV6R^6QL$45OjD8e zFtPqf+RHkw2f+HMX9XNj^2|nEc&WsQ@@O!4l*-pq&um%jjAV)BX;_(cbojQN6Lt$G zniuSv>H6RJlR5os{R2&_Lty`#$#)1h)t0)Co2cK_i#mwRDI_QwC>Ox?B*?Fzq0^vo z%K_ulq?dQizaDWu^mGgjKl#ExuVcSs&QIACshl@K;)y%=U&U>f^)9Uf~mO4 zPywzOPhef~L}u9MJR`fPk_?|AA1g|Yh{R{yNa@9m?tL0Zhx073KeME+W8*e);k)V2 z-h1KBHV`3uLXZw0kTu=0I#yI=a!zC31Ef(J;Cs$cPsmiG$FA-U>?CEm%NiGx`LeLu zW`3aqkH&BR(Jclpy=xeW-WKXL3rPzlat}~uxX7bKh_7w8Um!#y4_dlIZ{{QhRP1^rUmm|-ns_!ddSS^30d%*m1-ySoG~cDS~FP)Q2?Tx66K9q zj}S~|^LSGVqYse`3YKX=fE7W}PYdU3GDZ!jD&g&xO&};AV)Sc%em!EE(o1L&a&V?i z0~;i4Z_Bb)BhBGGo63P&Uu_Ct-8S{SboI%TGy?9bXv|9g^R60&`PQvSNSGi){BU3I zMw(9;K|ulHpc2qbJln;Jq(`hXK5qD+c+0g@y|}UHt4d^0b2&{o54 z^;Un>P6mTR8$Lt*bkVj}3^h!#XkGC~TbV4k*QM(9e#e-ZW~MKkozIsUZh) z>KFY9+vWo4^zdLEbAs2ao62NYKrK`_0N2a5EPl>3v291^_>ui`Mv+!jPC(S+Vc~aS z;vR}>G-tx&@wpL=J_?%k9sGq>6>2*KqoXK?jJng=FmN=(caS%^q3MJC`Sn!bPWDUX z&y1bE%^qiw4pmW;37R^ZoCQoyCoc*~RNQLdWqTiONc^YjJxFAuF~V2mQ!q=466%*re#N65z&iQwAU=N zJdWz>6Ahjhc74lO`g(N42|x!PP@#vU@Y`p9{*3bCN1DL%>l_-hxley->D(3aLuC^=11)p4kmxQa ziK|o<9gOc=VjY@Lf+kL8u1>f2B`THTzZjpSl^hEk%yvB_nnjkw{AD?a6Be)gP@4`3 zn=t>Yq9v8=Eu+cX+_B68?T^7b`(`y=Z?;ID$T?ePHk6#mNvddvLTRyNWR>lh{Phz5 z%{pUVia{a*IyP20#rH!zZ7^EU8sZ$VeY&aa6+zZsQ_~tcTm)@2$ZT;aO#2)|S!5ws zI3cP;h&cusg$`?d<}sAIa~8eLAVG7KQnvwIRErwH%L~Ib@@Wk%4w`e5tzv7_(`WPo z7+*>YfS%*v#V1xN9%$oT(Xha_qg+dLgMf9%t=6<=b#BKK<;3L5k-VU72jR9W zo-epg7`{zd>^LzA3A3jXVn`Y~j)h|sawfwNqoR0q)}wX4eY~q{(`Sm>bOqb`#G>Pa zJ(@d{^;XJm8VU|ZA03(FlwVA5!V9Lxb7;N^++M#sQ|`K$aF~_1?{DZrME!_Dfn^?@ zr-*}-^CY1Qr!-oaOWAVo>HRO&H&rW8bPT*x%IE;jm1-d#lXK`VVs#P@aiwaGYw#oDD ztFvW$$K-JFCl?Ub0|WY7;LAlGahmyiSU7w!?}uld0=jZFEw zCLlMN`5n9m0-UZ9`_nEJ1U6f%!H%0{+hZf6I`uC5r~9CAvb2-d@MK_r11u@BYG1*l z<;pl*bab6tkAB6odL>PF8?F#%*ei%p=_e;e!fdN4XebL_ zA_d}XREfJiFAO<%Y+1nS3E&o-%9bDSmW(GM-lZWTtFrs8qc-04K`fpVRRw%Ftv-EE zn)wo`s@lsrSZjhJ9a+vK8*-PdY9Q_LKMtPx1?t*=`p3G7ZWQH1p|uj??8?fOQTYYt zr%Ia2>Wa!!%u?^cZQVBGKKZ?>x91o(No!x`vI+JFFz&2b=QBOTYO7a{*5z~h0h0~a zX2=I`ZEcKfp01IurtjUBtahEzE?AM*a^8C)oqUOpqWy3{>tjhk$l`gOCe~SQX`L!t zyX(OmO5yHKDGb%UG?h4M(~6-{hg&G0r4YgdHF`fM;B;HiZ{51}p7?_(hu5jIqw{Ss8n48% zRb7>SkpBj@b>nve3OEg$mwcc`+MZn`{g#ZKKvSo!Y>D)W{rm}Lf#aBesnz3ABGsLS zn&fS`vmXm9e0E;p<2yu9_ZX{{onS|&8)Q7n^XpzTbAEls+2w}5jH2s7Q|XbqDkVfm zZ;LGa?+Z?x7b?;HU;78(W`27f6MlsPttg4b@X2?H`$Wi9A8C$U*O(J7rrO|370 z?j(KGS$B$3+T0S0ePX-HB{140=GRK0BX2*0UuaU2AHy#-JF_=amek#Pj4EtwW2AJL zl#2-!cOA}P@vvrU&yxhYe7QY3Sv?j@${LhRaJgLER0$`3^eQcHdCZ2|mpShc46Wya zx_BM8`oG@Xg;iZ8`|2h!?gx%(bCggZ1HC}f8 z3_v}ACqIqG=c`TK7%!&g8T~&LxwOE!ypYhzoTWA5j?9U~6Yu%mq!|f)7C)Jw^ z#Kb-x;FxPwq;H*Hwl%(EKeSuBi!9RIQMV=z$k>}&H^i{FI8`f2R4qMwv!P@e9jLaF z(AlWn-tN}LTT3fZw0C%7XZWHASv=|ne}*^^DI; zy5o8KP=Ee{uGWsg05s*~himXqEK?jW%`}lQ$EY*>cKN-BG9_9hON>j|dYgN2tE6C< zeGc~-NW*z-6e!!l9`h$0OT8J9OK?8uUo~#7?BVx#ASK4d=Pt|n3YoBva zQL_oS+A0uX^N>7K)tYG*V_d$mA1r*wxD8`@`r9LCXoguHoqqV^Y0<}Iiufb@Ef3tq za(c*d1h5&KW1ijGA1m7g7Z*JYYO7|Xw_eFvB8{qk{ym`8V^|vBUo_irD?xFcn-HiZ z!td&GICMBvm7+{-kR26iTSiwFsD9wBAvJ(4dnk?f2sZhR?5r0X-d%Jz#iML!FTj`f zh|{_s>knC+$pwgaqIo7SL=o zTByxvG+L}pZ$trE*sra#bZxPh;ljYL~a?IA}g1APq$a zLDF864a7Wc5~RhJI2spstT}Jo^iBdq;!e*j-PpXJx2dDgQ_qJp4vZ0 zW+*GOO#q3|_g#tr6LBizNBfZCFCO zT{*$ZM6H!T$a8o&jGI>Jt-06u$K7f<1ySoewn+>|$Vp8_L!1acW4Y#_(5{T=2l?6H z>KH+pR~p6jnGuY&%X}GzXH<@y1mRt~y*jb34oS*r>3 zRRhe>Ci7qmLbURlP2OVNUd}t9D?4rw)qW~KZ{MuevgTY05Djs*u@sI!6<>Y&EF@#}4FI{EjW=oqKWFs6+(+SwO$nl3qI6;GlvkLnAFeKe%`wCn9gXsz@6VIyLIC zNLuArwno)n6JTOl&Hs4uIFxkEda^a%i&P@xgBS)UmAal>M8%lk4rJ7f|9oco9 z4^g{TlGRs~U2{MqSg)*izYl9#L)N}xoH|_ebWrixLJ%XtZPEArv&ox{p{*4KD#Xu& zd27vL7jxz2X7u-?o=iK1_ve_^eGHGb`|{E6vL<9XkumfP$tB~MRT07eRN>@9%*AxQb4fnN*xr91nXxKJcb79H^HAo>0|u z!{ZIjRmk&qtBf#kIWq!dJaU01gLYF1;KVv8v7DU8bAMnl!mznO4ECsRB*?%~AkXv*}ZL zzq0{%H1kV-VE9c7Wo6N)XQ}nDu8k7|VGF+Nf>zvXR3fZ@uVO%hMK1QFRW;Uv_q0l< z8>4W$kp6OG%@vOR-oGWeHK)8!3v8k*Y4LoX^6-4;e4!+KRm*TLwJmmh+<}0+52iJe zHt*}i5tbNa-U~Ts^$SuVNMMUDlY*#f&yP_iGqKjcXb)=hQq?XpTQ}9W*~qV}ndbW@ z{?t%1Kix1jwLxLXYztD#sV(ciJ|-s6XuuzBK`vApyI3(p-d6d&GPzC2QFT*~a`EG4 zwcXZm>jqS(?pL(}D<%QY zQ?>gLTbuIZ5mQ_WZe6P*9)00jy8|2FV}E;=O|wJwL`J_ru7i4eA-s##URz~TTu-;+ z!8ZGx-QC<8yMrI`bem;)#U8d>M*7-fsYf@q?&1S-ce%HJ^>pgJLz8e4JZ^&KKzBXX z!N()@Vp3zg9U+)TriBcyiTwRDjE@9-iem3LWRS}c_Z;jGFd)0sDGUM_cY(u>b=Q;Y zqi!K-*~<6;D|)NwQ)OlJ3kvqpp|`{QEzb;}4lOo-yA~G+$qgF8-=pt0i=UR=e*6$> zo92J+BTp+7*vi4dLhViYk?yL<(SpT`%Z1-unDyr@Ux&QWD7XG<%0Tf6B&@cf0<8{@ z(a7ploA9X`&vx{Md+krGwgU(VxU3-Ja?dmsVs~1;B`eU=i#+U4YoUZ(cFdPUK|Ry9 zh-Si6GQNb!MCYRV{QUH_LBAvr0I-0Ui*C0S2k?y&B%MCVecfO1Cl^4!`MtxQus8<5 zV>a6DZ-NB7cpMh&mc<8j(_#~v6~(?F&ydIywaKb0N)H~7*IaKKz>FPdY@5~rVX5C? z8d^Haw(M8Ks$$0o){CyLk(J8#mm{EZBy@L|W2g?|9zHnN$jp74kpW6h2)B5TQjlM! z*S)F6Ses3*+k1$78IU)SqSjL8MG&B+m28`FL*yY+RcStnsj zWu8tYecazAa``rmxapZ^f(5QTp}_20Pf7 z%g*IUng*`ZS)UeD`ofGxp~%sN$ka=CvTRsty_yk6rlfMxtG1Ohziibo1Uxx%#ByFD zJYVHGNjszTx3tw{8EI*<1m5;a9bVDCnXef%XX~Uj#|Ze3*e5Ufai#MQg4^#RTMnO) z5I($9#I-58g^kkZ_6+4`3A+gmtFV^QujsId;jG!^(}5*aCn5)EU7P;GR!iXnCBQnb z<%1e{ELMpsCl2K~d#aARr?T0r*)dZPLDVS6EZ3pM?C?%~ep>CR-Ol<@4wFt^F1Wld z-Vh(Q(t`~*lAhe~FMMI#x@c!z0MkiwJ|6B+eE7B`mwcVS!j^jm%?YTU*)oD+Q^g%& zMfZ+fk`k-2`ciou4}|nxjeWQKOU}$RHaoFFVFuy@5lE~s3k$l2ecEo>)t4#H7S`Z0 z(q!?x?LfT`K2(($yci<8K#P&h(v?q*!q=6uHy}j_zCHy)%3ogQhji}>z&1x<7q|!X z4p$)7cfI`@o@ZSAdvC_R#$Yz4j-(mZZDcb*>9s^B4({9d|^z^zoZl_QqEi-B7(sHaRS@iUJ;yZP#azxbd{f#4z(i?YGx;h`+0+F>| zgINBFWrq|{e6PFZt|MDO_=%ww;d8O;{sYOFNO0>5NO}aSl$@IDvVs#C&)5@wVlEUmU|lxB!X_z!X-FGu1E z!Wzn*`>>}dYd9bCN9(51o8k{=(HwtiAD9mJtOsrO#8wF&*}N7J`IZEv&z2aF3OwYh zDN~4?!a`qeGQXtVp2LL~4}BiG&z7$$Q^ArQm&WCVdEzw>9cn?OFE0t8an+|SITN@$ ze+}&V*CZVjyq~BfpZMpGe$wgd%ZoTGBh`mEi+jFJ=yl^_i}+zw+iGdHsDFcyL+z2b zFj07~>_dowvR}E}=ju$6xFeuxaiRE{Up#+G+j&;B$InZO9IGy4iom(tu~taaQC3k| zerMq1WXFp!;0hrUod^@-VhaNA*VREAOKCO{8Bj<&qV)xVotLBRYqm{Z1M=1sR@Pno z!O2$Nv3FrOMufp8j$Fu-l?IuMVuEi~P5(j#{TvZ9D>}0|Fh6ZrQ99k+2zJSKLHCng zN{FK$BoW-!d+VmNQq!DRy4h}Fe$Coj;o;Of*Hk0^ro`8nER*D>%JlSbf%6a9{MNJe zbFkyOF)_ys|KTK_v|>PsEaXM<>CY(Mi~=)K1U#Yyj187Vl=ti zEt2BdGwr;>je%Tuw*1;p3)EEdTN5rXRvWh_xKE8??sjLpAX+a@fL`&gdeNJ(E;cqo zp0pzU*3yycX!;b6ln)zw>%?9ODo5EzOt=0QjLXmNT2{@^mBp8C=#uPUR(EP5L@rta zh(ge1t>1Ra!r=ADV-oHN08%D%Xk5L} zYf6rbX`ad%SkohPR9Rq`ix>FLg0SiVNX&f|z)+6#DQruYTayaC;O z(r7TgahbnZSGXZs|43_nGN0P%I)m~5d%0vSlpA_9kasWmfu$6Ktwm3F9%qFih;(_l z4rn!;iJ-=8d9Kl192}JEOh$ltLN#UvGUT1j-oLwitggOGs)`f4V$_)GxK=>6I1+7N zo^sU-y(!chII9v<8Z1bts-Butc1l;*Z2zWc{-vR)z@1$?QJ~ZRuwTt1-mO}LZ^=9F z)=w@dpn-&zunFa-%lUVsz0ED3h?`Bl%);Hj$X2q;ULJ?_5c3MWApLApv(nQSkFRc2 z?se?F&eA(|#kNJLwWZb*^P||aExm}G*S#ux(z4o=w9e@eI;Y_rQ3=1{B)tx9d_i{4 zzv{?T-QRPl#b*_&aQ7}B=U*>#?fB@>ZLI#u&i}sT+W>OC-pMO@WLJUzhlCFb>mOnv zzn75IY~75V&5Yrx9C-`1jcvv9%z;C5HhvPvl8?h16v7+Z@+Ze{-)HWO?!5u?NW|-? z_-qgSt@pBY+1E89JxkQLcYvS& zw!HVx9r(w6auom@t@pg!KjHSOLRtoR$^9y)3 z_(s(K)}aX-FP~ZMve(jG{fiIF_@J1=c6Re3Nxwd9InjGo>@@{{a`K}*q<8-|U z5yWkmzpa0a`5E{BHxo^TfGD1e3SUp$lYc%&q@za{{z1f`rXVq=sw5op5n`jJCyw?T z6913&a|k~RLe|0`ohyDoK1vr125_P*N$woC^@@R-=N2F*>2l0B7DxNf*8-P8g}jj2 zElf;Y_`xwiD-heE^^N+{oCjU@p3HBu)8B!HR09g)Oc;VTkScVDaUY>B0wEhn6^|6e zNxGI66Ge^NV8Cmtvn=1b?Yyz>*3O_^VRV-MH25)Jl3PmLZ@DtP6>NZ0)$``N^&Z@W zpw}}~69bczN@HrO>bi z`1tq~6$nK|+fU_jh6TM@Xt4?9=WUJxXjA7~y>93{;P68pKf`zb_J=jb$BgEYeT4f3 zMyC-I0+BG9&7+kbRy5()D-$QfOZ_bOeC?%}JL%KT=Sx9x)o45-uI-V|Z-oxDBwoBy zJPHORlvD0JqT*IE+ucK4dYr1->$=<5!N78TQYh-bHa{TyES|*z(uJHOGOMa`vdW4} zWLXDHMXvtZI-{uL0QwowQbq)dK%NhzN*;>gA=X78FQvyK477fJkohLs>Bk8iA{u|L z!j~`QnEl+>_bLngL{+h$%lkXgK9LG|zUcDF{q)pD@!;Si&#a4^J>`sebyTCI|cxH$nxw;+z>xlrHft)w;?So=; zX~^r)#l3-FsIYE2pS;^Bl35Crlym+4{olWTSX*0*8y~N^482zBqe@FtdPN=Gn@@8y zlDyJ;|GY0DY^7M<`JMkSJNryLV>W|FOBfgLq&U>dEUu3HvkHIjW56YGpuZPPUh8{) zZrEvp{!pmt#f@QqAjnK@dUDHKlsYR`)yT+5Lc(sN+3!W!i-*g1FmVpxCno@<6hHzF z%tGErgBB(I`DQ<*_=M-t5;9K`Jp015S$8%zGTn4$1!iX(qS8c&HH3`v|KtKDvqEe> zupDPM0c;;7T2A)$RsAn1K6N|gy;rdFmU}xX!H1e2895XKstF7$*7{;}b{X}4?Pa*W zuEGO9XEhInjRVmxHH2|j3`jyc8E=cK(#3#3eQ11ONsqgIuHJBbhsBF1Z-ByM;$!IZ z?|lJ+U~5C)?b8yq9r716#{20{>D5#@i_|KNY!#&54;qWBnxM1HWv99*bBhjVa3s9?0<0ey|h0zzNRVW?lu;bn5B*}a2 z4~;)w@2n6Nlx>qd6iSZ7(;CG!XD0vOn=K97L^3JrWO31Mo8Gn)4N5U#LHe@KE+-|yQuDZY9R28E=EF&9~IT` z`CH0mDq=gCaBg@kLp552bO!Do{k7k7z<2#1_c4Ri@HzLFVi9i{}t@UO?_Io!Upk@1_wEY!S0PJ7y1wXHa z)1F6~*M{RS{&Gj_G>^V5Jaf`wct=XPOU+rh4v3^!SX&h2{@-B6hMp&9o65smR|yil`otEj^V zEOK$iR#(E_W$j$%dfurqo6v2A+gS?)ieeOHZ|r@w&f@5Eww2jcl(kCCHwM=*)b8Yo zi6|&UiGI{2Vdi{cS$&=~Ok@7a&O4-Xxw?1*m1nHRBGj|FAwOvQAcIF$4eah}?Ok$L zx2CG7CZI14ERr$+SG?&rfV0M~eW!A)D}OVwcGykj%@g_8*=-kPg%jEvoSf`JW|#&R z?vo@1opi;jY|tZfvv*8h0?;w4@Z#tRvxwi33s;_Zu+S^kp%CKeqlX zv~J8B=Qo3pA?ayY5QRT=*hhMeP46+hX>CY}@4vZ8(!WVcN`i%j#iU!Sq@kgqt6H)l z2S_fw9X1C;u23KufQ|_jIiO0IaV;jp#?E1P^P$Hgbq2LDi*WA8bCCyVwY5BOPzoT6 z_Ry(-t_u$DRZJ^&Z`syE*G_$%G5YrWbnSWjowbXJ;>mQmC4N(@4@u!j^QkVTr4=2< z0)SAiIt6k(owcd0(ZG80fjiB&z-{^KyuWg}Ha@`-NDFKr8Ot4XBS4IZiMMFmFlUqS zT?bjtu4&yR$}mD`^^*7&=U_hy$g8BP#`ycWuDZC?Blo`e#R@P!q20j&&<1X9(G`pZ zN@23>-|KlIFds8-4)ohmQk@rU=JP?23a?zH!NS7IuJSvsLuh9)1c?KcU)E50e_L?% zp-n{j74eCg|0QISJ16)LKSy>MivKSqjEk>;=Okoo?c7oR*r04sbC*tuK+ zYU87`D$2@PJC3I?L30Il^*23dX+a*Icjg?rb`1>g_1|5i^^oCx_@<k zVDQ-*RHtH5lUZH0qG6m!#nY?G0e(H!IqX5l$^~@gTyIOgcj%c4$Bm;%f%yzoJP#I! z-@vHr!$40HB@6Ik-FWwqArFw539cFKAAUyedJ@-A*KW|Xv7!=Pw9c#!^?k}hL-gZW zQR)bQQZr|DZNc|ArSfgWE(AXgHub8h0WoHzYtQn|$(EEWAEn5yH2ROMNF%zRc z$cvK6Xgx}ObK_U9!teM{k;>b?SMJ7q-}8Cdd}1DSoL|v;w#3U1j?zCSF3xc_nX(kr zwSaCXbnKPxcs!zqYdiB)1b5w?c$RkNUyT4VRe_9Q>fl?Di3^Q@bj(Ql{CQn1WF z=qjXvjlSlKCNJG&x^swUP&HE|?Zia?skYi316>qg*it9cCrVQ@A_@O4-8-AHQhg&j z-?!Y+LiJ8)Dd0GYX61j984RM?P-99Zc&mN$S{~ZGLy4JK0bdaL<1>EWc1$X~_e`Vq zXhzm(-o^a<8#6un_=RmGw{5)C%H}HJ{rm9%RSNX2yoSc)J9O+%k&$>09z0lm3LHX! z;^EV0&lK46rKHC(0~k1r{i@-phmtQXJ<`RW46Yvme7PPIXy9o;=&SFbDf4Nbneb4v zT+2}kcf1gl(lSp_iH`NaUf<_o#z%a%`jdmvk}(X@DTI_et7Zf^97Ft zdwt{g+Wv%Q^WQPm^*DcDPfbdime9TF>FGB&H-=%b6+nneWMv`U#_?zmpi4ga47kNK zS8{U&fXP%@*-VE^^5Egb5&Z7GXOhH|_y;Oed*9!xszO<+8nSC4QuO9UJQPF4W&<2Y zgHtw7cc*JCl<#Q6{6_>0@}_6#pR=XB``#6q?m6LnQ-Qzz6I+w2TFcbLC|5U+K}4|b z^q{dML7N{s?aZ>m{E@)tG4onw@EvJ#o_3iJlmAScUK_UF|8kea%nx z=<^f980ZE&!YyS^h^tM+x5r#&UP9hB>&C&) z9`B0#dc5BhbY|zg1K-#S)g;^OD_JM+&)uMx!0OfJa$o2k<6Z>_NHmnDGbtXRs1*1W zDBCM6Dy&i&%6&h>?dcL5>#WCE`a65TypPIt^PlVLe?r(^P?K#WAqt0?dF3P&3hnF+ zN>5L3Zhm*!6$=9TM^hSq#;Lfrev6g&d6lm4rRz0 zT|K|nX@&_Y*tw)X_S;m~F&ZqoIp47S_4JxX{E0W;zlZ2^8~^3%KkMT6?Vi~JEgMLm zSXj2R4S0Xn!#YtQ1c*vkw7Dd&WnKY7)S5tmXfe-Ba`kCnEWALzj)xZ;w0dN5Cs;Kv zLEDTix}s=%#)G#^Ry;0rlcVe10uXOYNJ>h5IARr1^~@k-cq1(nl7L6Z!W3wCCyofGiq(rWWb7GFl8cY zW46l!O-f2#T|o%dArL4R$U zO6HHJJ2yIf>)-EzRTYDoDOAi|RY^-$w-(YWf|dv67KJRCxUKT6AE2%q7)u#cw4$}9 zlm!mV8gxZsx@TBCtw>I1l=)lvTEtktRnJ`=MkuTY`@W{n?)1j@7tG5+U zw)gV%m?!Ga*Ayr!>!^Hkp10JNK5Fv5S4v(o4|T+xo29>#fJeEpo&B+kwuVTDelmMA z8Z7kx2>a@|D7&p~L=Xu9NtKfBZV*tAkgg%5yStLcyFxZ z^PKbjzW;z>?wP&z+Iy|N_O-6714IZA{K`$utbhFaHJkfrXb6WKzF0!ZE&;sbA{UG< zlEGY|&dA;pqyg0(R!Yw#d+qQ0z_+!nl;U7c&_{XLSRF}{zH08&F{N76*w!bRQUJzR zGP^Ux?hr;x2wIsT_XI`Dyn2v>t^7dQ4aZr8?(H+8$1ST%8${0%!%d&j%r}8H_82&& zWrdHH)oc>Xifz1gO6=Ac)xz<0RpfgrODBQ~BZYA%yc)kFE=c~{n}OuyZeRNi%xW~p zW`aARu)HJ*vwp1EC-D3w$GA>s0x7vFEM3w*tE>joqoZ$xP7Y5GPERvX z$h)d)YUDD(HHS0f+`jP9&+q_EQlaedu69NfJeo~5H%Zl9Tvn%V;UjF~2Y!_AmoM>< z8KT(`vAJ-a_7<|UxgX!t++|tJ8Dopoq+!ZW#cms!x89ML3oLF_CW~@~gA-|aE$nk1 z8+Tk0ffIog9fkAOIyYd`(Zf`}|MR(`2aH5`6Ca8wcO}f?Vefqlsb;rZMlFSD`S5uv zb*L)Y8DgN3-5Y5Xw9}|zSy#NmNOr_;dexq~ws9ujQ&DElAex))kwB(zAJMIxZqiWP z=_`7hB-dk{pJ~t@5q|zb6!&+r=`R!hsoFN?xp}|yAG6({JD;M*rzCeT*4maQ}N`JL# zT0`a#GB0#T-3YDL+$Kbg;Fwfr+uT)uS9mMIM*Rh9MT z%($CxS=J!~ZUm>})6`m}$jQQn+KeR^kKGG9Zo%ZWzTlbkqP$Gw;@e@$!!BQ11-rtV z8$oDgeTA2U+lShQ+LGg`l`_90k3>6u#yuDJ=qTZk6Ah5Fv)_S=OtBUSBwhe_F9js! zdJ6+U$D)XCRhO;lqy=h}a5VlBaFl!xQ}a)T#~)epPd=&rJJO-m{w5Bo;9w06KN!ND zz*b!}G&C(O$il)xM@L6h)%ipfR~H;S!kt}=nL(Hs?CGn59;fEDKhBRu0Ass}W$No# zXx)(_mn)oKY)*VKBhl?>MY#$>hQEoIE^r*VMAX00y&WWN4{4}&Z%MJ3mv9K#o_84k zSV4!%4?WEZUrG(%#-$Ut*sl95H5wpOfBi974;+xx&%i+4alPLvd8fo^F&z!0Y@p&j zIW>g4gt$lDYoOL+A1cw$f7`Q@l9v48tgAiQ1$w~C8s$%I?nv@T?dn{Cm+%d{`?YWH zTPmOT*Ra2(y#A9?0M`&l$S8f*hj;SdiNeZ7t1By!k&*1|967G82%^kvoJ=pVEjue;KF}-_HUQ-sej&KYx@n(<<-|4sX@hBjyt~_39Z}&VQ=%qKuF1jxz2lR== z@WTR#odZOhgM%_^*GoGx)=)1CFA2E=rNn=2DzjuTmMAZeH(cklw_8aOxUWt435_O;oG9 zMXJ_DT=1!Mk`GX`^@^o`Klq1>JuzPen!5(c4@9?qF%9 zI~oZYx$v;E$s2YmqiN=7El1G6fE+YtS|O-r-u_10&uJJG*RBK8!sH7VtJNvRBRLB-{8quPR(MZV zMqxt0DsR2M1{oz81lnjln>|H%s;AP-8x>27L$Pn9gquWDIvUDwTQuprT^1g`UfYn! ze28G+bIQMHhpE>_EbNSYt@AVH_L01I{&nd2b?hrs&@R2-h|_haLjsl=9-kfta$Dh? z%F1ZqXcJGMb!?X6MetBE07jZc0uG?{g#evG^i%_0k!8)DvXmp(4qWQK8=5x@eSAf` zC1D&#%-AbS7961sHEY!fy@p_NzPV^e3EQ)%fe)X-^$OZgH3h)&m<(5RSbLI2QV|>d z$hCeugIb6MB|tsFu;{(6$J-}Y1a)QW@*CDj!ne@j3slDe*A1sixF&uFXInG+rn$un7^=ljdVELR{Xt78+w~}u^~Zr z0cd!eaoH+hD~XGX`>weVCvftupp%^>ab^1C_wBjq6W;DLYpQC-X$HtDr3ow7NPAlMktH|4) zlP8nhvsW&6Px!A;hWQr9*DOvA znzw6xmg!jbj%b(P+Bu@}wM6T`uv(8_23x78>hoIO`@l!m#_7hXF)@3A?J0bD2&H2% zTf2V;DHxiL291b0T=X~X#-%xw^ZFuY`Mt+PK6Y{{ui*X6;{ayXjW(~_I>pP3EO8SX zXE)6th~zAkF~q&k#G5>xt9T=-*4@fTTQz~LMl{Ky{&r(nLrrxWGu$Jzm**_QCDx(4 z)I%<6aEt0jG+H^`;49Bi=qRX7)vsnbpI0x^`Yr?bPi@sO2}b0X{N8gfL^PN!dnhbb z$kFlf*P~#b*tjiwpo-18SvYt{4E){>k?Q;Qw5f?SHa008L)x+fc~S62Cn9FdWhNbtZ_23WH(!c zxk}GzyS2>iC|_Vse^Pkbo{>T9PEqja;>?b)ZMW3xR^D|xj$66TB~RvM&9 zSz?B3?SV{pe-wFL6sH}Yp&Z45@q2UAYCZ8^wX2_IVU>bezN^@2V*yE!wUbk&bobmD z(nFMh(B!REX{%H`8O!;!+FDoWO!Yk|r>eZN#_a5Ag%JIZix{Sd&@<2LanIW`PdrDi z-4uU9mz|1nd3kxC@bvWbaiC?m5^`dp6Ae~6$NFL1Q4nrGv;kk^=B=Khqy9N z=Ne7bbB3HO*6Jdx6b$76687yrSKu8ymEN`lffvw`)1A!YvUE+;j z@FIh>YK2cIL`jpY-y^C5q*eQtqf2p0`&z;#XGcQkc2(I5YBPV3P}GM%dq&wcE#0hv zGtFfE8$SA%=RIethiBq>sB*^^r;;@s84HB>gjzD^1fqMM2n)u zl8==n!}!#y+cm&|O;aC1OiT<^@+te`vlL5_Crm1?Tgk~?@?pU59+cdHQx_hLcPm5YjpOL`eua>Z|p*2}~Xi)unm*HW{g%mK*_& zX68Fm-+4iG#^jYab&=$4XM8PtzXiMci%IL=?-ibXYov|2-EDbPN6N}Kb*Aga9%aD- zuOIm$GunaLfyod(vrbT#rmPV6GZ+FyhNk9o!R(4=)OvG87fq`L;pI=935xA8*S|!f_JT^0v z;cXq4#URO@<=fi(0db8V6@OVkTZo>DYI}Dx^~F!Tzy#yxXs4Xiy1LTRL*1ms;A?;v zV8g!V3pckQB{z3g`P-d#1OdV)PrioN5ufB(C&;V2eGacN&7PA`<9FCTpPQQ@L>g?f zaChYNBsXq&m%wQSF@9TZ)`g$1Pbs&u%N{8!LZy%3bG7sc>g14{hX-JB0W_)hREaN5 z%g*_m2Uj%x-e`^uoi?7%@8CTxOmCJ(Z4M9_lg%@Da=$=QUjTZb<=xnj{==vJWiJ3g zU?UyoM-4lP^d0IzjSt}%*OteD)w-QyR#uwH=!?`(x5>3fAvbFZyp|CS6(jL+?-;IE zADPMfdTQ*6Mgl+quUG)%^3VJLcxFC!)!>!nGTiX|yq3~imyF`#oD#XT-3o{@Q1k?H zpsud2^6Msf#4EM5OkWsB;4zcbvTAB&hf!)n!^3$r7oREH`3_nz2L}f|FS?WAKReAi z8}%h{hw|OT6!Vrh$nq0TS3KSx%F1oSDC-l~nmgFS$8OK5VY9s<=`?I_qmB1GzRsu1 zOW)M1H)DUax*|x-`+UaEiNA!ivZl1t$zruWc9mL>x!vM?aMr{&#H{NEvKHXG`GaHS ziDsjF>!l)^n*a58wx;T0VBe*KE4~kKo1)_pb>P5oD%G1X$1QQ*EDLzl@!1{Osb=7;WD*2V zMGy!ZZlRV%)_%x)x8_{ZfaSHZDq4V)Jlhr7kWlT`u7*%r%D`4~DOIiN*2u*hJ$)er zhAJnXecL^oczkoSKb<8W5a@G<6OE)EPJZkt!IEZ-3l#Zd3SgHarj=34pp_SHk88DI zaHC3PtN4$ZM5vhs5eSrzOr=0^A-4w*ty%Z9DxqvIhO8s`opz$4lku#!1DFi;$f#~J6?E@0>MqE_41%)rZGoLqI!U{d8ZUaJ0q zZehs*UuCa=nNri<*0>vG>+ zDNIw#4JdCAXJH6$g3~}ydaGLwX$Ge+v_YRjO365*#3l*vR!ceV{+n57M^r&`mcyqc zbJQf}Ex#h6UQR|GWer32Nj~%DOgNm`oo(=eJB1Xy@7jPkuwN>pSx*WLisz zBiM@%wK`B^w%)DIf&wizC^t~QS!w^!hG=nQ1m~{{7Hx`$+ChJ8_YyrO4yM@J5}>@j zvnvby%@yRvY;Uf9uii+dNPJMMYj6J6)ASYE?^?hdpep98Q&;IZf7e@x>$rpA*zO)5 zi{80}3?jFhoIH8b^jI_JDm00a`?9ZZkFJo8nufWsi@kfqWP++Zm*&n&t$u-qWpP5g zn+(A(Pa>t2#m$Fa*FtVo)eli&_rN9CmN6{QBxbBwj;S<GXZdFK0#avs6;3GaGpg#A9TJ> z$S``o18LGG)AWOHIWr`@3I(WT`T62{&ss0>7H_6SCz-(4hCVc0a9#&EFFn&98`GXc z8?*e|68IsFTAc5LpPMfVT3u$SXE#@ko^7K zO%1$8hA^pTNO~n(`?qhn9Hp2Gf2)K2ICQcq!Q8(~XSL~H?g^{n>Ja^~LW2B)!0i?U zY%vWs=*H1;%#uz_h2BRq=eAk$ku6>EDwqd&T$1Oj6($JIEXEiK`&8Iv zX;-yc%(|>_8g^M&niZQ^w&R_+Ljou2{BH&4mBB?TL!PCaS3sNdw@RlMH6()K2!P6{ zNe^$$nJ)s^!-)tYFxC5k_o8fjk`#r4r@8oQGii;G?KBp>qd`Vxc(7{4WO(q78nBcp zU~HFJ%9}XRIRD_ZsN7-7hm$IGY`FSH9M3^6yTKP(Q0a?3m#fSQ~Nf; z1Q|L$Sz$NotFTtT+VI4;BHV4Ui1w+nJcq(>i?)9@4T#8ot~3FV{(bzgR@Kl(()`3P zw&`;kHq96-u!R4S_unOAJ+JQtJq2((=rG_;?;lizebk>56E!q6EaLE5-`m+r$2yvs znV}N!=uaiq1p%;My{f3vjnpo>Gy;6s=?c}XERD3)@Zli^!3h^Fg%3+-OE^|Q^J6?W zR2g}X!%d3u7P!pn{a}+{x)+e>=YI1F2;f0yQ@YJ7X})^Rt6vyDv9Kf)7WAd|U}3 zfL4Ic@^U4bM`8_uJ3CQ7pVRgSQd0U^i+)B^9X?@-i8>^EdGjZ{Q>x)wU4)`lu0RwI zxpnIbv%mVN+(Njh$iEtO(NmskcR34yfCKDsd`9LE#@D8+S=9PZs0p01{ z`qFe!w0t6^eusRF5cAL|1g|H1^2~p;(M=Xs+YKzea4qN39*i;q&qwQWH_sjUqaKaF z1JiNLn>DDv;qjN2@C%RV%dR+v% zW1fvDdM%Gg0mJ7ub@c&Dd$9l;y(yeL#u983PJwFAje(u|ac`v+a44Q0nuwe;d2!h# zGcPb&xW*Mq?qsF0BuyUG>DtO^C39>eQ{&W4BGXOEIg{60JJv?yn?bHB`d%S?X<~H8 z%I(_7bl&;Ys`mB@Bs!F3FoN?8=ml>KXcGy*cWhDcRHjn42)tPh{S0pxSW9g_zO zvIe}Dc*2oY8czdN;nJbscb6ka_^nUQoQhK0B9!&`(KTbx+g+Lc8 zEoDPd_qrOsE>?9^%+Dv{zp9lY*BZVHc`+BTZ;+SOjd3cl;p>mJNkK&CSD)U}D7P5Q zRk!eTO?xa^ahvB9nf27TD)41T-OpKkn-iBCNV*)p{*A7cLZpOv(gqmQcZ`@~eQvc1 z^D~YBjn?;XNq)m!nabdqT>kd%7+_c&a?kHhNsW_mJ!?lZcKrn9S0a(U)6%bQ29xK% z^hn2hZgXCp;&<#Ua+#>F4)ZRnP8#pN(iE4b+1t`C(GNV8cOIyZjTMq_qq#B7!vXa= z0TlGr^SiuL9X4GcwPAN|fD2~E%i`*=2UlfJe zXUhx;Ai44Gi6Dr3+i*TSXi5_$VlffdC0G{0nUT4?M`Si&mq23Eo5&IMFn)6q(EKe} zC=x*bQq=-ARO@Q(K3Co{aM==(< z+O96z&j_KgkO(B!J-c|IByryfiz|;RZ+bDa-iw6`jKbp;0k<~T%7797+x@&Cxku)B z5V2@IWfQPzk$T^oc= z<<8q|$}qmT3MZwGhmi2I3;%B0`gz4`_!Y+QSB0mTnCW~jJop3EkN@y`O7(Tj*hfxO zSQt6B#9S&driMVm%CS6n`m`zZyrL`)dUmVFIRE_0-?em$iZax5Khj+$UAC{}c-`X2 zJxAE!8)bQgG&K6gG#^ah{y=DJDq%bX4Q+b{9sO}EMt|h?&GjHngNPP{BB^`oqA{*w zOLAkUn}#Q|25O{$nCxti7D@67fD#Q{8^h}kpPyS9wPHJlt%bR4Ty9!fLDN27v#yz4 zT)lJkX`|Cf-t2e83%S{Oq4u(e0WPscX|Gh!bys*Lqh__Mj`e~d)3jXH z&36|q{uS^fVLR@e;>n%Z*P_1cT`mFS=m|WDq$uvUH||BDe@cOrhIo}b{d+s=txC7K zfv5H7-X@@_28$wn&Qb-M;pExmlYF7A_sfp6-9?nE-r;*)gUU zlgF6ZD5?B9(05)mez?bfJ5&~u9u!vOEMp}4PapVEcG0du)P8~fL=G^(V`uBTf?gvE z)&#`rHd@Q$&3!<9a{9%OQoEf02)zLXOU8?fK3CpxxMBra_0y~V5_H<>#l1ZX*WFnR z{^zOc(3Yeb0gFmIVr%G;EBH{0vd8A|oZhvRfAUC-WJwY}I(4VZYGF{a z0k+lTl{-$}m?Ab?4!3iQMr~P0P_CU2b$ zoZ{RC5;YNuxC-+`@&5HTDZ(5yd7g-IjS-*?P$HY?x+vG(wu0x zE)jKVpgzWrZs2A;(iG}a@r8GSMFyik!M)f2wfYk?YP#$V(eY=6v&5@~6(gtH-7_LL z1IKHl3MEl&4NM$*Z7-EB)Hm{bzVjG2Qk)S7c^;40T>@>TE7l+Jau9{@Ui4=<2E`=Z zSkheGXi0}1)8n!4sT!wEH?*bNW%cof(@5f$f(Ho#fa1mfwk!%zZpV9`aB$BK@Iu3i zMnF6!icS-s`R7FrnSuIh|LI!YnXX8FLZWcw?HJnl_PLLN|C}nyxy*&1tS<}sk?-~r zKycV(GkxRMP_^#X7pBMUJS{(Q$rqgaNy2$)$DL7MM7Ag{JU`lT`}!cRR*UEDXtRyH zv-V*?4>mMFa~_*F&wT!_yL3&c4Q8K`x8YV?T5qF)GMW!M{URh4;(B`uoc-J7`iovT zh0{)+HM8R-Pe#wDr!dnt;}%_?o@x~BP6}fS;v$ zuUOLeVgGVpCS3IRz2|qg8No0VuwG9|(Q6&I?$eUYOuU=CoI+rAM8&)|VCQ1Ex(Mnq zI>pBGZp`%#6?hl8{ER)JiT*hWF@v{vsbbN|_Y^3ft7j?4XJJp;vLsK%k5p@r)BOOS zAc7);L^@;nlVWZ9Q38I@D%2!-!}tIXjZU+kG=5$Sx<6|sm~A%Nsf@y>U~^E*%YxHt z0Daf5CTbg)7eB)HjChbZFnu&T-nKNEv4pAx=uBdw@QORSnse#*iWt_u-8jA=y4g{Y z+6#VW4_d9OKMQjHel9}4{;oClKB`9EWX)l$ytCN$!qA#A5u(H966Q*y?)qy}!tbwo zxjyXya4X`%J7u&VnK|HNJ}?jd(^rIE-(&r|76AAtG2o48#INq)eO|E)Ol56aHBPkf z_O5IoQOyQ56)o4a1BGmdoy6%g!lE9}Tgq6*k{ENPo9d-h4B{2S$=V}cw7qM6-rChN zfDnO5pzd1Z$k^ z#8*3Bq@Me55vwNaNvlIs5j?s#mw@OK1bV5U+{FkjFm}q%0-JhNTMN%VTCU00(imNY zY!8~bw|i&pdFAH_QFwfcb&Cxu-~>;{c%&-a?)G}N9{u} zDXXByZ-W3s?Zj@J{8McQTH)Z{ThxC2DOgIOsJ$oDNyk#-g23BN$vZ~TQgFVTpe$~mTKC->5G+7lhIicj}y+cqG0p3=<{+`f=Su%5y zdwzYemFw{XFIBPuj{_oT)4U#bh*S-mzZOG+`=A#s#}-ig<2BE+thk@m?;0IC-r(Bj z#gY9_oYqV2k1#+l;*Y$I^sb!`78UhR2=|I5dtdUe1#p+F|L(iu1|M$(- z{~|)Y^On1gL3CJ0;2kgMzNjw-07tE$%J+hW+MU9M)@0Q+9U2-~V{Zzp76s%T8Mr+~ zs?}e03iBU2uQ1r^*~(Qtd{g-O5txM_vbL(jAgZ&qRaoTBD#@2>u}5z>wnLxb|K|{~ zOz}SCkNy91^aeiv%IG6Z@wL+bzzW1@!an)$cFIOTcTt=6^EZv)8Ye#r0Bby~^0Gj# zY$QvLH{9ilt=`>qOTV3Mvf78$l+9F}lP4!rMo-dxlb_gR8@-R(^GSuq2d z4gc%KKY-)kBe{DPQ#ddgq#FxQ?i9pD{N)=|9$lev_~`oEB~Kg4fwpDGnj?}IF+Kg@voMlKZebPv;N=yrG3o$8s^=x zqw#-x5+L7_@aW&igXh-wf%&$AVZ%h#`%mrpe~$O}hc^-e@7R$O1Rx(;_kw_~{@*YB zdDrjp{t8piweO^F9TieY?qbmf#ruQbFZ?y^-@DpRLs&}!wr#I#s|SC?{M3q(qe%0m zrbFL07I_E@xvIuRHZF+LJIOL9P?07B7p5Mi?K;C36{wRN;Wk16{!}>c=G5Okt$)59 z;MgI{h7E^iM5V&@VMrvgZIw(OMVoUeDPEyydcD!r+OCnS~qq? zm@F(Pl|GKE9;TjYqFczvGe-JWQP2C&K((=8jqlhw|4hfvAAvOzQuqR&>>B5Et z2=mzD!W5Eq5qlHSDWsq9{k<(}&%h7-)nor_=Wmq0^A(?G{-#*=Uu2J+px%&WCJK9I zKKR%8^@{88&B0qzEhSZq@NZi&K8Z=rDtH;I_cLMgV3q(%t*sa(fJ|XvD~U84W?L}x zKSN=e3XHFhT9#)kJ|+yx;Z|u$?qPc zc7+9skwwX3sYp(Kv;F?xi|^li-TP)>$KsXbsChsaBg&jP$S#sMN&OtBB)T_djRE7+ zqm+4OrCaz5d-y zjLvu5jQ!BQO2V7IMA~islPaa-N1=##%vD?1cEg!LR{6DjdO9N=lp*R3F1B8MQIH91KVpW9bPW zJ7F2;BkDFv-usyw$N0hi7P$Y%D)Ya#@vctuUL9vu-p}X$pS43E4mtL3t!&1G#OtZlz*5nDig@*fVZU{If zr#iD7>LL{#QZxn9@;Eu1ERs%O%V6ZcTHg`49gVoT+`W-u+z0v3+GF8!gJxb`Z(JT@ z;B~uZU|7C?R<^z;YD7zIB(u4N&vW=#f=3m7Dk;h6H36@dU}p8l*L3eqrU>SPxJWv# zqu?MX$gnKu<@}RQ4nbFLG9~sM&KRq3<|<5Ny=W7SStm#L9}IiHKlxNh%D_N0bQO&3 zmO*HC-MkwZbJV-8BCbZ7w)+TGeVO8<+D0J+Gw?OO#|zu4zfv*DdKi&^ZK}ZRS-)@6%BqQ}nl0?yPx{T;{=Nhey|5+SAx9#EUK(W5u z&1o8bzJn9r)Y8(eOhvizZ*gdzS~k(v4#r12x$hV^WtJW%)m-qduDE$9n0};npgc;f z+*~9UWsM$ANy&k%Yz~Bls@PUkSQ&G&f?w;;OMG0mB9SJGlI($)`POdb>fc5@cS5^Z zc-n&TDbHW+93R4NV>!s;@o-p&RAULRg!lzjhY&GqFo-UU`h_Zx*Y;$~zkKM84SaX`GG>zSZC*rqn_SsjnB$4c1 zVD!MFK57h^9s$#w+UWol87HKjqx%D9m%Kcq1RB@w=C3$`2D9)33G*5KVe{Hl}l`w{XH?w%jAwREUHsz_so5H?bncAX}+Oq6r zEx6xcgN#f5prfh*oR`&AJ7EH9rIg?;PcYlBYeimmLwMV}g|?d4+n~v5e-jY7Q8^)f z1bZHMChoR|s_?CD@$e$W94-?$dwoNG9bbsW7gIe#_c~t1ZCy#2gvV;^oiIlh7_6y4-iFJ9?2r>tJ)Zyq*- zdI zyc*%mT+JY@^-HY)w@dwVr`tYzJOqFG0EpRIg97|yfBPe~W@uwk2x#yQ#Be0|o!H|u zgW~U6z<(_%1={yzf8vK%3F5v^c!`787$*4wyHV#9FYC~n?>jMjf)(ybB2V|(cez_x zrKrgT>jQ6Ic!yg}Rv9dJIeWATaS)9X&~r4vsEiJdjZ(HWk7$4!h+}9}GR9CVdNC&$ zBu|ZSKdf?rBuaLWP9wXZ7<)Z+&0!JiX6iR4^G_2pqKv(xZf%i#1!`?Mxlcx;oT3l5 z22Di8EC^<+Py9%5GhT>M)gLH@KikP!$TNup;nrTv#BgF5)K%_(-{OtS6WASz^N*ai z&)tsmL)9594YW!yd3E$K3%hrLD4ZpB8<4!dUK0(edsR6;|4t8UBbYOr8vs-Xzh|2g zqD`tZD-onY3ksFRCmIsn4t#22E1j#@H6??}&E@uLW=xbw8cjLVZLN0}FWX^R zj+4~ghrQh`Fv3BR-p+ys!dk%bivZ-GnbwaO^E2wSz0!Wr&e5iGIt)fGTKIk}rN)s# z=})Usbu%_pHi;mOrRI)jB{7JLfa(q!8Ow^Ux)f!cJ}$7bY+$D!8$V4bOuiUt!-erY z7j}mryCNQsYxI?#Jo+XCF*+;z_Pl&ivSG1VlgmXXq9|x|b9Zx}6%tau<95E!Y>q3F z5gkg}`9*+{m$TiMPOZ|z`Ea|+zCw)cRX6BrBsySP9OyaEDviW$LUgb1JTjPEpFhx8_c> za;GQlp56Se^^x=t`-5PW&kYBQ1!uD*jwKog(naY8c5W)|1d-82#qDylm{AiArS_Nf zv3nOr`*01wN6l7-;2jT+C+O~?*UboKj(-)nbVKs98=+4#!9=E&3hCmA#p3R8f7(m z5-fa>A`Yfeo^`zLNr8CmPgZXc7}h&hROawZ@znGLR7IsOBb*VP(-e85-M3>vn%{Sp zXs~H-Mw_d&k%Qsf!<)a$Ou@0cZ?Q<=jO%r+DphsPo2&|13lc^)%A3iSQ~PviRXEv_ zBb_zp6 ztRt?IQrJ*-l-t@p8Pe9Q97a`#a&LAH9JVyTxAQCo6E`D|$x>(h)R9KVBDAA$=$xxL zdZ7Uz14MOux3G|HIr2FUd5zV9YCFWCc4Z^DbHtzG_WE{0A~cG6*+~tz_CQ!35WsBt zPQ13IY96395eX6}Km2Imq{aZ7DF|F~-Px}(2%}N^fBLQ0!Cl#8*@`ECu>QjuS=$5W zgGCjM${OX_(LvgSV69l^_QWU?R8MD(q9AzP1L zb1ZJV`z8;rD$6wI8*FAn%p0C@{BcO_2T0l-e}4Pzo?dcD59MOyI7G@0FpL?`x8)s_ zt?WiKzWCo7DT7>J6j`Zd++W+8 zfS0F!C-2&~`PseJlUJVWaAp}-^pN4->*!OnEi2?Ofy?$w^To54N2T) zZa#*HNkFX4Rp_YX8=?1S%~1_wl>pxIF)HyoG7O zs-9~|ocQ6Xm0sjJ16rLyf0A;r3E}M*;m0wSG|mn(FSg=L{~#>xHel^8IBTE}?e|Rl zs5$68*0zZ+DHokSz@XxaJDE#iWQ+hm;~jAr;W{j+%;+@?s~lTGHtNGxI3J&gZPoi8 zFq#8xO|C6W=6|bg(~&|jzaPWR3?4pg(e@xVw-OQ_w{|d(7WLgfc%t*1U>xt_O%+^E z?Mk5zgFYYBA(!Z;uMPWvpN=dW1j5q5tx5R01Jh2xedw%g6rGi2)aG|m7`65Ou8AKV z#C3QvI2gRxRzSfhOC9CnOrv7^<;`U2fY(h(2&?iGW42H08YwDh2_seCf=haQDwSY( zN^$GRrz_~&$-NNIMHOYH9ppgK$wJ9zO@tzKGKAY7o1aX-`t$g;wgu}r2NZ(FKZ zVv4$LY^LWf2H$E;4SsJZamTG4VO`;tPE$HF_LDKy>(L^FPyn}{dg931!Lv(aapJqZ z>OIjVwln|QTmWLZzTa)YcQqI zCV&8Nxn^uX$sP4C6-YrZ^3Q5-3wnfgjJ^8u=~RXw&ui@LIN4oEwXmLUGu6^F491fE zx=dw}+x&Os<_VO-O7=Nkf1Iy53Z=+>Es zHDS4&Top16>JdS&Jo10~I3gvSlb!Jfj|h)ps`6;?_WXWrPnp{R+T2XN7b-F}!;$CQ zOi2L!Ac(-zxt$gY!0kx;jan#M9>qrqKyjiykC#&dKUqY4=RoAs{qGL*82x(*zX0C* zx0Ae>?=wRRLPOt^eSDt%5}BkF8;b_X6qyEO3d$$?dP3}wGezStt}Ib8S~Cr3MYdL$ zZWW3Zz$YQS4aA|XtNE%T`&sIB@xv|#M6$*BYEDE|OF@jL%{P>1eTm$5t36hh@;w5q z_h4VX`#FA0Bz&3xNNf#K`G0#Uw% z?sY?wcx;a$(Kl5dJ2LDFO}?a}p+vXjH$^X2x?fdrxK`Lcv*uOwJQ1ymmH8}A@mi`G zJxJ1RwkIPzk)Od(tb)-KqKqM$k)CjvisW&hV{>SDbj`{wLO*) z+Y>gY1f8|#l3-NU*CsUu_us6(2914>hlNdlLkpi~w$=)O^=Xw0(?6gfBiq^9rXCfz z;1dxp$tWG;B-}EPC2gu!5wN*9USJu$DHi4QshSMK8&?;dyn;;GT*C{}`F|}Q{&qSM zlMPw)LN)i{iVaJanU~pUuTr9QA&b9Hq4sVUz4lhE{M`Ia%Mte`p98K%l!g}Hs@x1$ ztNXXu>?b)FjN!@FREt{e*)nJMQq_WppMgDOQf}0)wz=hkpPI8Vx~M2Kn&)Rt%f#sM zpNwMDgH{j7#y+#)Ib{y{`T0dNnoU{1zDHEI)j@KtcD2X&mB_3!T(ErqJ&vesTw4Bvpn=HZ0>W!KK}aYsL1w_pEs z`H`&pw~9o>oqE^@6bn3b+4l+m{-E(eotocXrqVzOKDY zJ~KXv?$5C*ArE!07pboAqqwKEmO;i(5v#m^Q3~d`St6&qbj%{;`oL(T6PRW!`$les zkDAVtEYg(A-gqVs+GLxf*p+4$_d=;IyQ}bPt3e`A;@JE%kJR)N|&kc~(C%vgJA1sf*sj3Vum99sQxYq$EuNrs3#15ekvTh} zU5y*q5E%)I#0CLIuE2@Y6{YEl@D|N*ILinZV=u^yW^nFKDg9jwD5}+ZL%#)@$k?Sa5(jBV<_bUc`5}eoFtDb=H@g=Q=*cC#%;_@u-_KN z$EH3nW=x;2jkkukwn$_$mCs+uAyI)Zn3gC3*f`sQ@od=K_&qzr$=gGSnlCuS5IE>n z8_3>W8k<3%R2-d3V8BwcvOrx^*70yL>FZ0%K1j&4m?V%}3S$QfgFjF_GDxaC61V?fW(q<{0ju?#f0916#bh>9U zQ!Nxx&!6{_MQXMpf;~=f};WxnKP1 zhzDC6onUYJWjN|BggsWU9d=gelt+yvr@!t-p>U)<5Vs#ZRHeJTc}8$#CW+El?q)?l z{UJok>U5z&L=$YjW$2JT-uvFNzbNPNte?FXIE1k~JF@ZN#u*d3cpXZi!=oVI$cmK; zl#`t*v7>?FU03bf8z@w?%&0#kBxGzx&Q2|p9Ew2@9TWUnXrHs}MGbLFcgT%Lufu~% z)aJFFAc^`?JFjSN935IB+|LE;s$+BCcp1}MEYJuUDDR6J@lzb#*60-vOw-vZgy&Ix z5}~E;e45ucM7@NXLBIC;QY<>KNIi3pl3@YypH}<1;=f`ezEu8ePc^2vhyFeuu^2vn z>uGk0_gJ5_Ry1`KVUg-d`s>P?A^&lYYt}rQSZf1@VVV7|n@mQFFQPuU6leCT{a$)= zctg?oOd@q%O`f^r5qb?=GVvsaUQgo@w>mqEMbQ-WCiP#lnXBhnk=+@%_5J5U;t#=y zljk_R>*YBqDF&}WJ~hWIoF2U`U;V@6h{R=tB+=q`RnkeZ9n?)fad(OfoSdN443Im3 zObc%_;@RD?zAHk~3nnNsKRjMe3lx=6;LuP|iuG#8_2y@xeQjvTbROB zwn4@?V?4myU8&UfBq2X=WVO3q*y`w>tSm~Jt2T`a#RI1d6{*6Xo15=ajrb81ygBOf zMyQHlhUaP!v7GiU*UE?{V0~8UPW&3!82)>Qg?VW20m~%#+r_7z1Afdw1^yUXXjo`U zpIVWL)6wM@o(vTgF>&AdG9rO%`Mq1obh*aAVEi^1&-@LdX_2YxH<}i5Z_}hpPL*HV(6kS!7^u0 z&GcuFj3f@fRma)&Grrw2+|mAY8UT1Cj}n!WnHKHr?7X>w7%dpst~*?m9Ir-87lp=O zI^n zze!8<Be%^j}Hv#=x_CZyyfE@mi-#!6M;yAGUUzlCvV!6jnJb+AB8A z_Z#E|69~jHOSFC$i+HAr@Gy1)^-5rVF(h+jYPqH~NI>rkVYgb2mhE2X`fZzdmOzqi zjwV;DXSdRuw>U#hx(;FbDNLRxNta>vNk;Wy9l-bA#(1EV5`g$FD|P-_m%>ttBU8)3)jF)|_ zd%IpLa=g1dIsLiji>!w88>ExwZ;BaBLK4KF37sv__FO$B2gho{@p2ZCXHXy}Z7Drg zkkI}o1Acvr-R1R15@bAfkK(Y|W?F-S_b>_1RB56-L~Dc4LOymz1(DJk4(H1;@CQNy zCFoN;FP{=yUhd7yaa@&&@5dU<^&=;Lj<4Y6=j*Kr4t;3B6P*}Iomgtb9ZsVc+Mm(w zYd9X-LpHh(2McT|(0^WJEY|gOw2h^0_^5v~6JYyQ#nrk0w%SyiXzup#A zQ#;v^o-KNaXc}OpWQ{FMgRLBBkxxG=p{70q@$?)_ZADHe+8Qge+E8(8M)i63WiR4I zEymG=>)H*b4WhEb5NjE-JmqYFOdeflgU4a5>OE9K%#!0kfEbQ%x25m1iDrcS^pm$r zJ$(zGc0+&ydu>_~<;}BdAr+9Uq~U1(-a|LOnS^8SB%2I~U^MRkFT=yYCMLf`4nl`pz)Or%xHgOP#fvXgIpB8OMntPZ6{_?B4na?E9mJ z=S=&a;Q6#1Rk1htvC||fOTsrl=(GIpedR06!c2;VAvZ2jMVtP~T}^?!6}B3A*@1{Y z0*grYu+-e(>O|Ze>tx(DDZTd}uDf)=yC$WKxhIaM5Q##`9G~I@zmvGnMLAYRW(B&3L)IDF+7g3qa?jUiM{)^gyE*t3 zOCRs@WzL#QmXv;|t+O>tKiXRdIRD)pO^p`l$D2XzqrGhB6cw3BEdsxof3O zde+K6_^RN&lF)4o#srOJBq*tLuD$Jg ztiXaJvg9Xg1*qx+jQ*5yx5R&D8-RR+G1tjL=gZ2@*CZJOUUCUOQ+fat2l^L44;#tQts;N z&I)ey1w8=@`Q#S{PAP9*UgDzz25Za!moyiK#{oj?SgdJ zx{#(F`(%1_XL+zxc);}Bo6JG{Zh--$^h=%X&+Q48zC*{NqE=3{j#{GR`Z-U|Jbb%T z-a-Km56x93S<~4KN+rC6X}o5`t6zL$T9lr(CI`G3%X>8|$-{lN#|)*@fsjqCbHJm9 zi*8<9GOb~_8gVqcnJJA@#2_PgXr8{p7{#{Jjaj93k4iNo8OP0}>T_Xcacith?eNJ+ zcuWwWe~0)R(1rIZ@1WR4*s_c7K~LWK zNK|Mu+gxB?<~ztd5`=J>rd`ZD?I_Artn=roi~33k`T<_ak**BT6`PWKyo%x9qD;u^iCaJAnTOz`6nSL`W92a?VaJAJP?W;6<~c(PtQF#9lA zKMAeGGd#p!u4f1#a}{0ZZ}wjZ1HcoZ_p3+E1ErH{+>4wD@=cY7ZBKbiKXBwVKXT-? z6$KnMzE3Dm-!{!PwJNh@{R&LQ5gqM@F__(?%Xxk=gcne@LdfD}FyR1P+1LqK*YblU zvsg&Lq4oEclh8YS#$pOCysTpcD$f`$O7*|ar1G^OesO%5Ro;DN zW%<&3-55PvfJR3>+TyOfqm8PJ?sdH*iEQWcXeFi==g$8eDpEA}Gjt9srdZ{CA#;d^ zWK@W7owX1+wC_OKnv{gF;~aJESO7T7G|oF^>{uzKoA-TYDx}3?Goya;$k_8{^6?Rr zfUocmRhf4S*U#@a*PeUP7zQVnoNl{_W*ci$L`1dtm$OEPSFQZKer&$f#dN^^7t+Q$ zpgXL@0<7g9DC~!`7zYFDpsQ$F4e4%9%Ut>&C`@*sk78HJith(_1YP^-%~vb0fW{I+ zfJ0b1hBsweOK7;<9IW04WH_^g(r>DIG>4?CU~FASo;NG65rvy&7$7oi8LEmVLaLp! z*qE*zK9Aq#BfSw6bHUx`h@U-aaXFT!#|f-j+>=VR0kbhIJ-uRW38CLR37z8lh_Pym zA8J)436JOFKIFkSRl{Gv>vdS}vH--NWEG1xp8|Iqe6k~!B-nfYBv|-T-jV}kQo`Cm z8^=Gs4f~}ppGF}u=^QTV>)2~vliQaJo|JRG8?w>*5t#^X&tKPGD6cLw>Fnv=1U{^v;TgOP}ys)fye$OotdubW4+O8>~r3 z@KienM~N)znZ#x5wsatu<|V9&3Wh(?i8pD7d=Hr7Lvs*sBIdV{;=iom ztnV?3+8OBUMGA zsZ7Q=QIg1ED-+M89px)WOMnk!ujd8uCW7a?K92^Zud5ClS8P2vg z7|%k9_h75#%S8wtT@Nq=Uf;1?VV-Vmf3=jPXlrC{xK#Uj;;(%hM3;D|ceKvD2Tkku zJEyU)3QqXtkCL$v<~zTa-;UdBd;(q#@q8{;qZpmeZ!b>%9{yIWTs%B%uvD<{3DN5P zfmE(T81SB~(FgM@%1gKMtP_$IkLL7OF5mm0|?@9vonQ4*DFy7?_NRvR9?Jo$If^?d0Fr z_={KLW7o~hA$trr&9#`sMa^7cUgM99k_qoYD#2O*@-H>Wdq@n`SDKBu+U4+?3?BMh zbeHu#jXha~u~Eqkxa@J;P!ZqB8b!eae{S{k2=J)0%`SY49pZMN2@FeX^F{1tEt^ad zx|^y#`d;3h2{O`9n|eeBM-n8wn|6FMVx5!C@0q>0Lv*!VXfq#9+K0*%t+R^sWljDv zKMmuf+ZZ$$Q~e$C+LD>z1ze{(2$g^GRU6T9_(rbY_BNx{Dn|AaPP^4Tf@zCN9*(Fq z)eXXy`L}&HvD;nxV^-J6E{Dw|%{J@wO&hU0kiXI>SfJK0;9mm0>t8aBllD16=K>-5 z!P>dKdMj(ZPwlrl8l(gTYi>WFL*L)GOGD)gL6USt?oL=nRWdm|eqy`=HnPxJuC#l- zYBoEa%=|{+Jd9%i-lim@Lem0bMi#=Xp>9%r?z&;u#)_G5L1ew7^@SRK__GK#=E;Wc z2_rYjWC>Tkq{4qytVxo<<6MnrG%WjAlfA632e73 zOtepC5BcBh#MI`Cnu1^aMOKu*z6bv+WaCo@?|A8PDUDo?`r}kZ>($C}P~rnm?k=(LKBxMgz;=(9r7E5wgQC_>Lm7 z3#@g|+9{<9P9@Btjwv_X;rdt$ zLw3(}mezw)q)EnV>zj<<7F{RtK3BwLpWZ%y4UqH5fj>!)_i19yV*rZ4S@i>LmcH@p z%eGuLPCjX0fS)X}m=snDY&s36^-$VkqbSuZPR$-fL_K}c-t?@kvuJ~x_Fc!=_8G0< z-GaofluZLG$|~dah-Z`Q&%(Bz&=CdeJ5QGP2b`QHW*EkUSuil4EH%sf(PuWpJ}G(> zEv1-<7*9F*CTym}YibV{?GWL$YW;k%^L;L}&lQ>3dv=l7a|u1O@IQy^q_Vz=rtr(v zg3cBmbzMVbkK%B0y47rSorHeU%AN!5I>Qn4+bv5xA-ikSVK(eV<|^C70IkQRcUxtm zL#d{zpDxLtTY}s3VES3qu)o4561lR3A8EFVnV%E~3r+hcmKQ}f?ra%(jZv>GP+4Y< z924{nRKW#(r_BxO3u(JlI2YL2l*LcDeu1-otM`?d+SJ&%gTX~m(8w)-R=xfmTtgQ> z%a(uISCvug@p+~r_b=!TxrEFVu6Nkt`3`r!4ci1_;{*0Dt&Owns_}~y(+D6br zs?iqxy~Vt-s>z}g9~$7JlIHE#`dktL=mVnMdluT8m~dPgdU}_araLP!acMm#uxL{l zVS)lm$3qtE{e#S<7!@22ob3mhfkdAu1*2KJ+g18L4PxoUfJ0{tFLss}4_BT}n`TLUy zlf3E52Cs1IB7TKZVIMj11z~>N(zgT8;x0&t>(F8zCphlcHf@E zFSV=L9iw};V$O$Sli&CraMN1*GO9yy%dof6#U?L|;vkT6?Gl2)oh7y1){+tp2+{++b3*~(mC^C9)#A$ytcT&yS5ah8{zAe!!-RuJL>Y1*tjI7zjgDH8*+K!LV>$ zuNOXIn<1;!!;K*l!UcbG2eFJ z#N;?IVgyj7*1mhknw3boJIR-;?E@IzO8YM1;qlxR0Jnz6XvpJ9oye>0$K=Ih837ap zUGvc)650zJ>$_w&2eEx5C4`a*{5V zo`8wFWKVYcRAgQsst8SK?)I%5A93@=+QXQbBA5Fp*G-hs?(?OzL>uCZ<%!B4#8_#K z)I5oa6W|~F0%d<^PXVCe;EPJ-jhLYg&`D~+H!3&XRLvKx=(192%So~2WGl}K!m-2n z`4toKt^F?VJ3bgJgrh)3hYW0f)fn-LLU&>#YeyhTS}Ar*LFT@<>8fxVzMn@ZXv&Tq zcoxfpKHzL_w+MktRJbGZnfiEhce=NVfUFIhNn`<6sr~ovtb1&=r zSJVu@ttw}?WkAyV?aEd6qwy-H_GIs97I`ZT9^`%Z(K>AC{I*lfQ+`>Yr^ZR{G67btF77M~jF^{U7u#5mGHX=f)d zyEAA*nhT_(%8s$%V$66A1j z$&254lys|bxLp^Ri_J-F4_wx-mn6MuxXwchlh#yAzvR0%BKr>hOQA`wk@mfv@e*ywM?(x_7SA`HG|?`dw=Arkq;XDkq}$NiHNM3o zjo&1&xcntoTCmeXHoY1DcHVth2)$p8W*}SJk~NX@f>k0pvPP~=e;P?dG=W^W+}sE9 zLz`6LP&?^jC64XE-0SmOgCTKiw=Pv>fxO2hr~Y>J;O^rsJN{wYasN=qaM$G*o6}1R zm z_yhL1|4fzZ#X+B|!>V`BE{XH#U0(WGlUmJ4sV0{ubvb=lzlX>Crc;?3rlRP)bD--( zwvgKv-D`e8ty5Kt)kk2L2C(VCC!Um0OBKtps4zI4jlu~QV&FWylSK-XMbl#Q@bm29 z&Wkh+Q(R?*beoL-7vhu`)n3#%xI?k>W_l9=+v^&VivpS_M|1W#RblO6d|+|jIs^~L zrg{uFbhI$4O!;}ylh2FT-#Ll3e2}f^M;zZaw}%nA5tdb?0`kBo67kUJmk*?5w|;pd z{7Kf9c^HJ#D<*urht=#*Mk-Jq{*&8z?ri~^vJ%+*;|I5m*5Yib2dLcx;ld;G{a;!R^EMxS7&FZcc)FUd*w$%f6-ixRTZH!op1Yzwvd!3kHkGTMo!Gk+<=Il z(!`d$VQx9;a(G0-MkUEi;dBWB?a<&9?K}f}gg6O|en?qYUwu&M#X`a4>sRNYB4j4W>=`nVtyx*b-_|I{4oVC}D`3*EG~+qCUtF{Oa$@|> zzT{bKI(fFHQbTA}yT?oi8jIubza`l$gugBa+Vyt{G*D=#ln^%A=(x>UL36uV`elI1 zsVtu^HbFco3^a&Ha`V3Wh%Kg8JLP0B)6+?;{@5TK{OIwMJ2`nSOyqEaWin9&62ATe z*w%}O104G>kHRb+r(>jq_z75d#7_r8_MNdd1nJvF(Fl*&JFvRH7%*NB&gL{##WlZT zz^Cv!Y{4KIy82ml>kbzelS!Qnet)ogR7#RGH}@$?)mgYzWGt0nn|olPOEovorg(^| z*q`dw1ZIlzPcFb3XE1ll>DWB`<&q$c7ttluI4Qc$bjM*tN;F6)VBvDqHsljxu91$I ze^uXMh=4eU8FdG{v<^{Jnrkxs^H}+Lcq$}ILTRvzjOKDu`6#FD*R_Mt8;Lj- zA3M_`UWiJ%;AzLLXy|N*>N<@Np5oUt-9w)Vv=7x>hF7b6R#`M{!XpBD&F()J^yzti zA!~asUB&IPq&_12vFK_7soXlC>!u~6!Vc==SEN!_1cL&S+j!4kO3NiqsvF?JE3Hs2*0p5LrjJ|Az_j;}zW*x_G86V!)5swrc3f!B| z4AGkh==2)w&CB<{u{F z*>>sQLhjO zm~xpZ$TK1`Slh~J7r2kc{z^6%THsZ5GWXzipFJ_Lx(lq4tUeGcwzkmQB+1~i&8x(& z8ijIs7)`HnUn#E3A{vf=47X+>O4i89`V=J86uH-UN21c?(HbZrI+!cEvS+r-EgF+h z9YRQf%H8aUwu74S>LUD%NmT=~cN?w&qRYwbk?F`~vl6?|{H*M4emrU=PBh=v8(_!2d4FlEME6hAur@ulsempp5zr$H?(8XU)_p! z)d5@$Bv9}#(u-t;?;}ecHrn{`Ukz8sozIZ_CQy4SRO=`lSiw|duB{BUz#L#Q64?54k^twQ8} zfWU~fP_KJlzvxMEx(Xd;* zE5&~GFjOUJb}NPptS*OvXCl6FXj~V3`!!=$SJOw&1QZ?~6yI}tMu(;mgsRgQ5?p;! zocM5C#kmRMo_2i;$6G}u=nTSrVle1kH`s3@56lQEfnID7l!lEEfl?299yYX>%3iy5 zgr`NUA)>I%q<_m={x$EAQ64K#L4${OCTbqIR5_AZPff=B?S?}Et+ki_3OTzeq^7DW zEci!d^t&1x!p+qF`$11nseHNVM5JMzSna947%<^>qFWh*Up$w&JU(<{Jgsmvi#TJ{ z4tgf;XZlwm1rQK39?$K1wd_ASBW>rMKRGT_=817)$28$f%Lj0#7Ru{EnG`K$K~?=J z@YcQq8Lm40++8>{)+eBN)r7b_I(KGh+R7iqb}NL;>m*;*!g;bH1z=$*cRexaqH=SPWob zmC7aeOgfyMj#NU=rXb7!%}J`RzQA6y+S0+xFE7vATEL`C?;q@Dm& zj5Pi4Wo%*dEO07L3k>FnG&$!$#CcY8=9pRPqlURhNWjhx4vFr{mF(uGB;`ThI655A(3;js zaz|E_wTau}N1-*clnd%>*8!a%jr!|u!b5}dOxC(J*2G`>yU}a!bU58O23v&fk5`^z zq!4G?nI3Bx{gub5t^>g^Rfx4cKvzDE z>OGoHAScECqn^FJaeb6Oet&4!rn-jK1c3a>3jDSw7Dxl^_Y*@??6JBghYt^@@LD4g zgNtjuenN+5BM|S}=bG(0-M0FTxoKppjTr0-P2P|JO*Lhn+y zkm=_u(%F30hGyVI8a^(6{bVya#x9}#bUaJ8<$r{sYPg_H<{8%Q}q`YzRO=B<=6qbJITLL z#n%S9bgpwrOZqu53HeW+?-?IdWAnhAuSHDh1s;Fq@Zwtd)af)K9;k&sSU1)c1z0p3 zeyE;~r2Xk3>aW$!uh92}wYUo!=dNb57hQ>t@?4G~4iyu}QKv&_UT;^t4TJ zosVN*wb6m42bFw#sHgPmTc~TF_1KS&lkk{TIGrt~LFtkeZmRGi-hE}hNk28G_Q-3fiS(O5B9PvoIB|kG9?NxajCL5VPt?gZ0uUkL-x>lwOGU?#_ zs!dFdqfPzj;lblPR~(cl)i9)6t(^XYM*i7D&<9N3{qBn?vw*qE8lj9Jo;+VVhcFl! zRFn!U`AOhD6%aS_p~6Cl?^k8wn$Qw`Ne?X%7&r%>Pc;T^s`IZvX;ucz z@3=now4bn=Vv+3!ix-kS1xw!{7JH=HvwaAj^r=PC{4(_XC3lNU*3wET%Pxqb3!q$< z&S-&KCtQE*d0jvM)a81p811|%Nefj~)<627d({$Y1O-Wx+F*JmNk>gRv#Z7Cn3G(c zjgT6vO>3})FSW8~j__c95X4^tRzQ~)8NMPFl}Wub$xJ;g7dR4>oU50BfAMDB^kqut zhH$vsGn8rhnykPBO20I4eNNmBi$)x={h8Vt{K`RJnNpdIu-+}B5=0Ge+l71c;HDn{a zzW7dybA{@@gc_k^tz+C%x@z2??1zp@xSu%4S)86>T#=d+{c+JV%b@pbmHNl&fVdrk z=EM63zL^|8seV)K8V#07ch#ao89BWbR~hv;{eId^MK81qPbr&gjc6)q^CU0y>IriC zC|eg=;ck+*Xs15rMUQ~RvYl+St+FJ)n!D6y!<*?oIYxDtfY<2zE143E2uG9B*ZuJf zEUW{mJVcpaFzgIBzgom3%+L2^2$&y(aQ`BL$lb6ELDb zxDR?7ajv%N)1&>&pt(ycle_RnoNf{*9zb6u###R;FF!~*&Xxr`bhPRD7nlc$zNQVI z&|ahvDTea-_co9vzC=|>&E6X}1xyUbb%8JJGML`s0a3J@aYjA3i!vw7;WYli95buW z4+C*srk@9;Z_!t7zGoJnk8wk7;w#LAyk~b}D4}2I1Owt&81Q#r0BUquD?#0!yfBPN zCOJZ!MMr#y()s=53otRLyAlfPtrG8|bJRu#CX0(*G;!HT669TV6h(_Ti6#ZI)WN5V zKFyHNy^#akSQ$4|^vUuli!E?z9niYdh|HU+egI4dIbn~>1k0f)xgzU-!exP%e4m3t ze!%H-+5f}oemz4w-Q2Kaw%~A@cRClB$6K5Fo_2<{rmLcd$FPZ`FrSd!bWEq3 zMWsj(;ta?1=W$G;$CDm|_WAepr~qyks!!A1RuCo$2%lQfpo>p4;Ne~^huZ}E>3Z>b zYCQz^(;0uTIsahmrL+DV3D=IN(+0fCY~s>N#5O$Z_sJpvFuX5895;#6%0&6gc*~{% zRR213;Qa_ri_h&U=TdU5nbOchiTtfsiUu#>vMi=GI;ue;i(H|uab(r1viauwgq>i$*G+IEA_LGnC=^*YfRF6A z>JV!+{0a}QNGywsf!<`Jq_@~&_!RMNp4YC@vUr|<)3z*Q+wJ05Y@sCIeVuq&peYi_i!VLEwHq~tD zYaDH7DN0KX3R%&B+2c@gWhN%A&R)Hxo<8+@ubLgzF1^%`iPH z(0N!J=v2CebFvr7E+R=2-@_^JPG>myg7qY71KTMJoo$@9gB!!&&V5+7UeWdCy z`XbyF<jGF8j>(L6pQS~=qTOo||CIS4v- zu{H8Etc{XR#3aPpUs)QU$O3~mpp@1VfG!)&sZgu;eUDDJS(1s}6#d1L+CsgW zo=n6z6<}Tv7N%)L$;|nKzom*<;MR^6qN&mvLxa|D7Z1%VQr_DFQU)*B0yXz5hM8$W z=TNP`Ul`eK`qm)iqNnGj2;(H{q=DLiO0aleWUMA)_dLv79pX)2a1zP7U)@ayVJ%y- zG@X!SN}~wN$=iwxpGxRSNU0)B2P^DKiw+ghiM6b`i)AfGV5><^{4o6;)Hk#A!oue6+JXT`x87Hig0we-#>- z7cNSw$#K>*yB<6wz5Z~RniwjB^~i(gmLl(61|=ic2zNcLgP_T1V8r-~`;_=4rE6 zTz14+b7oj;qfRY5aesRW5#PKk(_aN;U^!(WeWy;f47{Ia8o;=DX5e@kxm|i*WZi8M z;3uBdV-$eE`4z(d9k?P9pIHYX7;r)6-h3h-Wcd#^_blU_ax;~_)zw5u1Z4S%1(9{o zwK-5Q=xW~wo+xshPbKAwoY%DBxr!4x{{B_!VF;s=o$flL#H{#>JO~twQalR?(@YAg=b{%4Z3x;tJ4DD=BSW0?h zN@^UJ6gRKT*nliK#QaAaC?&p3MwCL769}mau+tGi52ZfHt>4E;{H%iQ3ynu+-?;~eEH^T zj~?<^Ke60so-849z|9FTU3r*^4ePGQ-jP=%-&Qd^U^H{Z#0qf{n>7#?(`ig6<|AZs zxB(NjMtVfs{~KJJM*Qo?dxEGH z+T$u>EAK92(>gpHyt{-Ji(+Z zXrVFL-zdo3LiQf;`QKe0?*iuoSn71F1Djz$-T>%L3Elw-ta&;Lc^mM!A0bpnDBtcI z{4`bZk?$R9V;ykVwYwQZ)xmhnVIDUV;nQYuj=3{yen_veGB-QEF^5y!&-@jlwK=hmR` zs*K*_uzyp+hlAv8`G?e6$hW=rW4Qj)Jp1Od^@3*#qk#6eY1W$yF;2dxh!bx*G2}I^ zCQuWha>G3tmlCU~FZ!|}ZLz8m@4>0811Q+52&W;bLjcJLLLkBlHk$UexTxj9MeM5l ztlA|{+e|~6A_9vS2&usToy)Tvb3?%27VXYUSv184Ry3;_>l7UM-$L-4iB-^$`lV4&h2 zLbU5CSe{IVI?*!9n}ild?+=6@!|g;^CF?}?M|_`Ef(d_C-)U#93XeybTw9K?&@xsL z4ABdO?tfQYe8pm=kXY3%S>3Wnu!MXoZ7C|XI@fRh|&=*D-jOvd`DIN+%FQGYYjmO*-@9TR) zYNtGR4Od1qgdxN3dK~uGchkfS*aTU8S3e;eDN3?e9k4G)`^NHGVyK2BQ(t5Wip#9h zQ2N$@g37)FPZsgcs|ZpUtm#(;>w_`tU}GL5t%U^rM~MG{Xc>wzSP+m%5c_@P{}5S& zsQQ4f)^f=5+|Ppb{W;KSW$;lOja5DV+eAeq`;SdDeFAc$SUc;L1^a61_1S6VG=gH%qRSnj!d$|@}(PYy3=_OawZr_!LrPu;Y3CCYx`27DrH9!&h z67pthsCbH^wRSa>>{!oGFJpR(8zFHB z&&3hFN61X$6_{w;dgD5_qx#N0VQD0-$;w*av$xCEygd|1|Ig(z1(2D|!a znZgXj$;B-t>PKW8OVaNiJda?4pEJzZdMZ`J1<2X;ro(haD6hXc!~bNib51zA!6i8%(Li>nLpZepQo<4>WI=BF9PK83W#@ z+!8e`VoDuIMpfXUMV^J->`CJ2pc_L#;Y*I_tOTQ~nz#|0=J38Cfw@Hm4J-`j4eTrnWX|B-I*2u1?A&g0%y}e5OdIo;3%q(P*?AdlA`Ppe#~~;wq<8yo}p-npb~dT z<>0VkztOO%)yU$wLHDDG3JW!{-{^SBc1wgIe-tGZf zP+wU0C3fLH2vrFqYWD*pxm!Zi)-%~tIDxM4LCR#4$?leTt8i5ezRciE4rj%LTHjWT z|ApSF0G|qw=>HRw+x3 zOtc>LM2~cnjP=TT^h|2(7Q!?P!uhkhD&;J@A-aLKgyTuj)6>@0$dRHMGYSmsYzRGK z8gN*DU;sSli{$UPRs7ghId5|^82?U)5F8tF$lg%7A%#?t>7IPjjgVD*G{N#t94a>|BTI zB9`?u=hjc6x+vzm^I53>R%O3oJ1z{Kss6Saz7iB*9cm^@Fz7$($3l9&-=r4dVKreg z%bh*2Fy?fMWV@$O=`~ul?5P5xS=YdmjMelg!~l*bSycJ@QAWK|cOjk_HehDHq5!Gp z0?tv)X=!@q6k^(T<3PKlO3&``3|8f+Pdf(7xB5jzPSm`=RM8OJ0r;i0Tt3Oz5m8YP z(tAH&BVrl_>wVIzY*YqG%6;GcUjt|%1$cx4wRrQx>o*Wu|B8$LQQm~-#mL?^U?4Zp zUk@EMlEGykH-$*6R?N)VDn3mDocb!+Be(DF6 z#CCIbHVr|PipcfPGJPCH0dMN$FDRnFy%+9q{C`ioo>QWD1FxF?!)O}5Oo;?q&6}GA z$iTpr@MfGO?3;aHH;pkLV2$e@y^9sOE$v)t2DG7AAfb_Snc@^1%Da1<(AhZK0o3`! zx&69Wr-C23=*D&(AH*qwQ%G|k$oi*R9wzHT5D+dTXO8pS^`cIcY0xPIT22BGOr$q{ zWR5}u10}=#EWJNeyix0;5(x;yeA|soJkY>ESF5%Mbm?QuR`}+ltz5izys6Og2-+96 zw&p5|rA#*!kNAjkEet$W)D`-@YP`?kR`~948#pj)($i7~->fR*BjB7s?yMyQXGeIK z-zVD~m6k1Td+wKh($U~sS0V)HfrDB|yg_~Eee3^n<1enA7b60bEFd(<;}iU3`P8XR zIKVy?qSV^`7QG+9K_(82hdw(^5oj!*m*k+=)#28@-m{qf@UF63hBz(UX#$Kbe()}U zkwH&quwak9^Gn;JwHCQllATL>s4{VY z3|2ZDm&f7>+S^0BlO_l&8mYe@(ySoeL;d{~K>La4J=2w^q-PBY4ulTSdu(;Rd2D}u zYDdfPYO~qu171OTvey2(9USx5K%|T^RUddsDJgYU+W)$kz_h0npNz^_$GED9ip)v8 z#Wr+GBTZ!4z5ME53Apw64;*BfHf$_4-bq4}tE7Tq5_3;~mD zrK#_yL4D9a04#m@sF3z2^Fr@9SJm4VF8c|*mRsGN#?rZm6KGNxjefSj+|X%juSKmA z+jL>M2gAL#y0f!1I-RY~lz6R^HNvu5}bGkyEs27h-VenI|gs=LclW1suV=*m6NaeI<9;u?+{c+`um|e1mO9P zqWn$-ob&Mx5x70TZ>VMSQ9k-QT_`swCPp5Sac{gU;^^pDd}n556_k?7Wpnv>!z&Vj zo8>B4`G3OUGCuE>QADrlRaiWJ3_iXDI}sIqN1WABU53f5`Eo#$PWryferGw zo4|c|;AkNJ=-Tw?>RK%}iVUysf25;YdC?DKJ z641oqN^)?xG3SEQ()+C`mD}yMO0U24@j44GBqU^WYpYv8&}bx;e&ZQtb#>Jb>V0+I z+u*3RjC-DP*w@qMPz*XAkH=U`1B;cr?Lh@b!;wt7jY0^}_5UdNOc(I^V@r;v$}77o zLV+Vg;KmTN!K7>eHg@O5?6~-rZUq4{r0L_kJ$@;A3D}H4SB2u zmo;kY$BR9XJ5WLjlxpVx`=HLF4^pm<3}pZJ(a7=LHx#5%>cWp*;BtsU0vjkC#0>*eK@YSO*kO!??&e?J+F zKWj)`@7xL%YOvbh?Ih={;kr!b1?AAK=fue3bOC$sz8A1fEV1&pA)*lnr2eH_FdYDIz9-jb{+9sM+6nns%qC!MkpSe0X=3FK2Z{ZYHQ8{TKT-HCHuhP=WCIDC( zXX4clPT0I0oME^mhT3aO8;B_zIx0(xk*c6ZR2?0k$cgMy&3bEdkx5xo*|^GgZNQ|| zJl*@_a^soPwfLj_G1fFF04E?sjDz`rrm^X;rgrbPb2C9w}=<2X!BhCvxusG#SgMNR$tMNwp6;;dq3GFJQSk#s>{m6OUTW-ekeD zgY)f+_>%c1ram-v)EbQeQS|Jv)fa)s$@6l*MT9S?N*zFuRHas$B^ap7XzsqXJ4)d7 zYoce`|Mu!S!)sqs9oKIb+zo3APbD8ui)(SBcg1MLI79A~79l6$Sjts+xWm zv(Gp6Bu9Uy&a$4tDc}XfcSm-S?6rI8S{dcA*)`VxQa#?c(B9-0$m2(gN-3uu7>LIB zAn=x=@X1Vc!p1AE;7o}c@X58S&Y1sbg`C{*hVzy2#o0ESy+K)cyoFV>Fjv`B%oxUlFrWMlH_Kj|ko7k;dA9Do(FW4Q|v0aMbzW#e2hyXA|gX1@T&Xt(f?kI66 z$6F;DZlEU((}_mU^XuiI6PzVY)nrr%XNb4YW&m9 z{M!`<9@5+|ejO%*)k8ptD==S`I4{T7$mw*%h3TZ7Fo|;vW z;2*D>9!BLEtCv}!$SEvk$yH~MD@%94;{{)ZLxU!I;0LGMA*B+RWew5}@be+3C*J>N zL#*7T295`Co^yj0zPfS2i1b#IOnp?tsE77r@v+X%V9NH&!FB>=!*`Zn`rU(!taRzi z_11;oWz}4H?|tgOn2H`^q{rx)ht#sXevT{>_RiZ5iC7~OoA)BkEaWl<|#YBole ztCfoDd%j~2`58sd<-G8*9+4HNpaVqwHCjnL-k{PHFNjB7Pq*xLmk~v?T|0$O@^Ka;$oLB~E6KYB(^Jtu_e&_XC{rGIzUk~s8us6BwjacBfc5~Ka`hJM~-&MkY zA;pgK3O+~wo2@>jx&;h7kA&l+0W_lMrQsD2a3ddB)%E1^qsCU)@H1K+-a<@ zGtJ90I+L{TMhUFP6}VM5U+KPj{r}p!I8(n8WwVaE<#mE!y;I|Qb8>Po;c{E=*Jy02 z^loCEZN2<7b2eJsUs5<^7xxps66Xlpwp8i2K@W%7GWC&C$?liqeavmi6Z0Zls>rD? zMn#^PjF?pQ{as)lgEEpwE(;qXa4}!2xlBG%`iakK$3W$8%(8EIMNxZeX{%kOgQKF-vV-;dGUjG7bfD?~_!|EeW^#H7;-qKo+0px5fYkeM{5TLD`@Q_yfv zS9oU`MSR5PyD;PC62^3_8FannqQ&H&nVb-T}cisR0A2J1X>Be^R?t$~E}L_Yr|0=$BM{t@6`7TZ?}UWu&j{Ouzwzy41g zKKCIG57$fLfdjOF*H^FuX1nuHF7Q$-j%m;j$^UZUbYE9onMd*eA$rJz0y1M)PEe#e z;`2}!|JIi_IgE>pRPQx4G@qFT#|5740_Nue?5)VOPXJ*WRMaKm7d%y4yXVWTOl|LD ze_EV$d!BvGikIeahpm?IbnWkFuk*sBDJH(z01;PCgqXiY=w)Q5R!A~dZp$@V4mr0q zy{EmlKt}Q)uOD*RYt})yLeEA7h}O)`D}PU2!#BD9Ebu%KWa9!TFYm67F7CQ{S2Y5V zaVoM>aDY!R>17Hk2~Is(cjPJc_~m*=D@t+ng*}l&nn;rP#JE7W%Z|keGFiaalXn3* z|6Vd@p>P;bHwVqYAgVE>JE3wf?)SeBfY1~lq)x7G%Khnnc=~SHUO2>WF4$(6}w4+<}Ob5PL}03 zOj!i>sRC{1yRqFu<)7Ycx``de@)sd+I_7pcKuc~qpJa&o{y_nB>3gcw@@Y_gcH|-n z;f+Y!UK@To-{cB)=Y_RO-3V~X2s)}5dYg?^X$C z(9n3;EZ0p@F{K`E>aIr-`{>i1uHssYyuSa{J*x6XsPt?_avGif6>^O!Gu&)Umha2h z*=c#l$fYWp*NLsV-L37sRh<943Mzy7cyRgXT`~3zG&5Ow;Vxz$EE`^!p!Q0Hs}&=b z#^;|W>KXM0+Hu>JmnK9U4jx2b6Z1-2XWZs?kJQo1XkbG-B`4sP0Qmo`RPNPj;8)1UDGCub zYop+~@M84ie1uGq3NZ{jIE3<@>W!vmZ_QaodOA-Dy8WZIB8K{EtD^{v)(5XXnDMiy z5ajtm|ts_#cF)*xkx|CpNvt zKxiU+4sA=HC)GUV50%x3bbX4+7V0kxgNvkw@@t|^)W*HNSh9$C&GtoMl9<|qJ+)zF zsEP~K=VF3ooZhFq%Yol`;lKY;wC6V3-79K#SgygeLC|%@bT+W$9{{pui^U$iSFw@Q zSn=F3G*3i&LsLL$gHk_{jt-)AKQ4KLM?TgmVt6Pt2i$lDlZJ;MX9$B`i#=!5HTYLh zVZiA|04h3Hy>141H9+pqEZhKZ2ySnfMi3Q!k+?;*B zO@o+&#EA390tc1@Vl?=kO^?H^P#4u0wt!Uba2j8qP9YgeK*X)2IfYxM341P6KH+}} zz-=zS$W58<+Xs?Lb;=5}NsZ}vaK}bQ)*^M@Pnl9?spa@~3D!B(vrOBzzP;M?rvqV} zbJ12H_-t`kZpb5noG?vwK5OtPht#l#s%v?%LVvt3i@-?yow!PzhepdJEK{{g@hzI9 z?o{#<7hZeDXVGbx74e%x6p6D3igT0)e$%LJE&c@ots1R=C$AIwb?gJLF|p2dthQoc ze)N@JseNll$9T$%dw*zb#)k3NQ|;ujO15G&iM1Db(L1MObar^)(`3@MrGWoSa|pG} z(%M=B={~uN&Q42qoqg`*$rp_yl@mg;#hKVoauUcy|F~r8lXav9?5&|GX1Gg7LPIbu9^}%diX0E zg6AOYPY0Eko?Mz1I6T3-lA-UyQhr{Jt^+T=orw*`gYb;sIN{fC2}f>T-F2O&L{bRC zA5K$H6k=WlLq6b^Rp2?sdq*}aWV~P-ijCn#K?mxVUwr36@8|{i?%tXT$fqyQwXYt) z1Uz7GMTLZ{A_x>-s1j4FvSMemNX+OT)U2~QDjL>FdGF3FjC(BIB<`BBR_eF2ObtCi z#X)|!cpfciM``VlXliu+B<{~gK|b*ce%>Ejtn(@sxYOSgnQ%Pig?>26YO9Sc`|(*0 z7ktsC5}|w%4?}yOe-A5q0x4V-mX*7b&A>x2F_BvDC4Q!Qap)Mn8d#|%hkEG!&i1)> zn{mCpG|00wC2>u@53Ipph6hTKJ2R=K+-r*C_bO1y-~`xpP=7Ytbh81>_}n_xvk>H+ znLj1)mp9ro%vUO4rSgPMK{%)r1Ap6s$MdCn$RZ}U%}#_}k7AhG`cXSls)d;ff}W`x z_O<0w75tRm4$el=fbMmttGl;>42~LgHKn!_sh|vYVucL%XCLiEm5Ql>3ALB;RX8$Z zOw;129@4dvF0;c#e$|1M0o*SBQI(L%7`x8Wk$gQh1uM8u+Lr^x1ox%-IB6`{-i2^d ze_TrJ^rM>do4SOO)R%MHj`<)A8(sFJA}_4rhXyM(L-XF*9sxk=v=@(d1&&v2)z%-| ze4YRHbPsCBbzA&=5)i_0k9PP$tp48{`71J2fQa|cx3?o8Ve}06fX_iL2NR?KlooA5fx`9X zb#};8ph5#3HrTQDKKo`JI%+*>I8#?!2@3Ma5dx_P85kJ}cXfepetAJm9@(OCW4``P zrc#FNn)pZe^f>g+$W-s*(S!%;d3RceDr>mw#)#+X>QJ{>=RWci{~{U|ksA0zE}S^} zjZW-fj3k6WxZfW!mQ5ukDgVg&=VmRRHCXkFDlDqaHBfOd_6$YNH&`gCh)kaVu7o_? z=UVOKvBSm|aNTz76{D#BS{mMz2}r+uD82XUKe>olbQm!&)Lhdnk_0Pz7c zK3&{tQkG-#JYs1kI6W4eJIpuD^O32+NBN|IBu28mP(o|#jRO+G4E+5;jG7Aq301x; z@5)S|V~*pUUir*8Hf%ZCVTubK1xUuNB5YF0&gNxW;DV$rBU#UWIeab}moN}7RF`fJ z5rkju_<yW~2xfrdy?udG zR#?(Zh7)L$S;a!X9StmFNy4c!FJ^Q-i5q-M$m&Z3v-mL;RCEgyqd9HtTupMz@Th`g3mKWa_QKV(DyGV)dm9HPsbI@4OZPJ zH|I-rW=@uOS`{8=8wBKd+3D$CSKAVHf==7wLZE?ub6?@y2OFiy#!&&D@vA$>>zAk0 zQ(6An978IBUcaNxv8(=_$}zjLqzruUX#CG)HNUJ-WIsI2;~I?5a1{0|HQ=$8Z{)r? z`#@5d)tRDV%(AS7kHkn}kXl-efZiW+~CCh+4+U2X|Vo{mJ2cWM1K{| z47)Q?c{g11K8TN2TkgShZ0_9F)6?s-CAis@#3`*aLRoGt_ow-WVuPp~HMJ;5fGjmG z%Q;ffI)uQ2D;jWledZ*iX3GOfKmHhGD7)YxTh+RERWUlkG&0hbLMZgEd}xAM0z7Ft z+%}BwMLGB}{(+4_B*n~1F&Dh$cyq91m3UMX^^{TCmSCgIF2-igr0TCioQjooz@6T5SPmO2}m!h*R6<#pbl*5O6st%$u{LM@cThQr2T z>w>-js`@@k^iIo~iHk{O*?nLBHl1TN4fv0{B>PWif9SN#xyjj0Sw+p?1z8q#jU&}g zZGFhQrqID*7&OXo&*M9{QAgX5q zy#B56XC?(Lu9H0x+pR|f`Fk>d%a^~Ba^YELyO>rnRpbDxfYH_vCsM14H3VBAJG%7$ z-RstH@~N_^Z0=}A!nUjDA3`cS;;SCkK3ta3qUI1uZQP(OCK&nvL1xyjHJ&Y22#Y0y zUJX(@Sweq2Lj9o>=M>C@a(2Ea_bhArzRQv%VOw|zZ-h}$(r)@ymxam>f6idBQIgm0 zaEEo(=iVND;iq@2lo#0MuxwP%;N|js%(zUH`S2ne{{#IWLBL_1j;u%Pd=a#BUc;tu zV1|)vCL^g&WRsa%@1s)YnIxg?mMQ{x+FZm$xI{DWd1*et-nhqfiI*tve4^_{E0)$4 zSoh>ZM+CGCG1$JP+3$H*sg`djM#TE)nUyTesv4K`hb*$o(;5g*08%i`q38J@7Vrs# zwldqVk)Pb5P*tC-A3*9=5$eF=VcyYg9isf$m)Y;Ep+JbDg|YY!USqU`$q1#-)#rSy z+;OzA<;yDO6$}sW(2Bgx1`RSoX#?mWs*8W8VM(myU63qZ<~AUeWcV^meOl%c)gLBc zQaq%VeXsjFS=0EcSS`1{+L|^~BXe~=Y0FUE=Hb`$qAfJG%@Sd5`}j{i3^-F?0y{HP zX~FNR@;B1r;A3ehx9FV9vdwz&&>3yA>3`HB>#k?z1b|b0*c)!o5Bvj7-KI=gs91w5 z_K8P5T03+EAhikmer zWY`u7S%#`TRU?WXXM*i-Vs^=wz5muYGrwL{EanDLHr!4j*+g177>@De_Dg$@zd&!J zRgY*pq3HD8GQyjGHT4`WT^LcRV4Ko-<3v4><5o@E^p4#6*N=1US~%=sCS@HW({3rb_3*&B-YU?+%1R zWs!s|?>WCu6$Z$_Ae*p1)hnM8$uA!#vR6IM*ILboquB8K#bZ&?9Nc`@32+?vR67~8zrjb=}uMOHRBZbwhB2dH~qBd=vhv} z*NGvwj8-;SdA#6J?qC|F1Q-6D%v08YBA~Jr(#|wd@K|lxwQQgy(^0Onc+eBWc;+<*i*xu2F_quIQ!zAWXr zG?KGIo+KMeU}k2jsn#m=61Y2w#OaI6j6xt?E78OlOvsMLtTgN^*w1sAfIq%66;C_D z;A@7650QXMj(j_*F+yM9g^$?-?;_ffMCeRW-|}4X(Bw^sTuV9;;XxM;vTm}^qocaH zne0#*?n0dq2$_WH_s)sbd)tr{o}>OqQ8AWW@0BIcR;6w|kIHoj5=+?Ib2u`A^G^CF z|NNgCJuasl~9MQBU``hA){hi@#5HyD7(l-NHCIYXsuNKMEYiQ)%WVi@GPF z&W|j(3qWq4b1U5A8Wq?F8wvl!&EvSw#NWEI=`qJ9W(f&i{Ao^C)nc;?36B&xO;u7( zH*lFehEqjLN5P>hDoy1St#kSItQM@$qODZ7*e-o{8b;aDi-e1gKf9)+aEJ_Bf8~<> zZnnE<(ZjD<#i7h$Y{6odCgt)e*#B5;qpdYP-WDv4y2}b>x*y1ax)123m~*bp^v>u8 zyLNzq0F%SvB{N$Dh}t`A&j8E+jpGU)oHuUbCN+RVs2OaI{{pL1jDa&V2kdq1Mt+a; z9m2xg+}v>Let$J5=K=)YfR7+=GzkZi(RQ!@%M%E4-cix5OHN7(dFE^Kl&LWJzJKbi ziMk&5QVeM2$xarbbGqzCEi>hgJYAEu*n&rMXS}-IY)7;kh-sLuDF2=N_pg5k=G9%@ zA1eY?4I8_$qJ~w)bw;tF9{V|Eyx^S8R!^g^8M+VE`c2%fT{XcK{uj!)7geOOKLan} z*6H02*Ws*bLOXRA5$A)hG|@VImd0O-N~{zsF1$_nRLw;`e~0rtulKanGDtsg($3GNbP^5(-si0=`r3o9w+^U3< zc@MibVSCp4Rc4PVlOKG~<%caRW0SGU+kDt1T4zIKgE;DeM#*;_!uQ&-T7N(9IhN)F zbca%;3YDE(-ble^m;nKVC}S&-K~P6aa?xa%YR$npz^{7l^!)6wN&aeX-yl(+bUm#* zM-FC`T=p*M^=k!G>9Y>Fz1qxu|M^ONdNIGyyOEqOLHhkszwYUP-EIAj;^Edo=^ zFq4vz0LfEc;*Y<1#3-MrUTOR@tAXxtA&zmCf(%iW*BhySe?my}0S9GdbQC>TaCm5_ z)eS^EG28>kiW zl@hr5O>(b=%@TKyi+ayJeRx$(-2hwHkB7D@VyYgvx%v%zzQ~}P@%b2)LHtmn&a@0F(&P<)a%!lUb$iYdYBqzk5 z>sCM6QY;UUz3w>Pf7Vf*GB~zZ1Xup9W4>G4Djnh|OQHh{vVVLIOB+L5OFby;&pbf( zzE{0I0QOh44)v*o^VNf}oSSC9WsM0uexHJjYEEeJfi4)&%3`D6o`bmQWsU}haDC`t zY(^`uZ<0?wAXjn{61#omI}6H%@+~R!@!h)NxQvk}O}HHB9dB;Evuz zRX)aI4D6{8>v2EaC4mA!{5u4(NqXKvI-VUWy#%C9xnmD(*je$~-Jeo(S8_|mOCbSe z&Ke1k)Yz3-Q~m>mRnq(eLd;DUPay+rWPg~3QXL=U144oIft6BLsvk9&OTc8@?|J2V z{rjZIy}W$pLDXY4d-D+?_lS?=5=qa+^^SCh{T)r>gL@INY$wOT^CLrGTg+#Z${5P_2|i3u4(V;ey2*$uXR2cY_9#$e0d>q5O6x$4{vJd zw2yXmdfjrVIMzZ5;<(H7%qKbM2N?Y2xf|U95~u*YBo*;Ab2=Y4{g{01>lpr(xBaK9 zZ&Z5oz>#)OqAeALMq^x9QL;EW@q1+D{p+Y0Pjs=dufP0oe{MSQ)+Jy?+f(Al`##wM zk)KpOT{D|tj_@wEsTFoS+K4oh)w^d*+=f<=SPF6EdudG=SVTX(YzJj)JAJfX2?|8-LsTkIE zV--xLp0{_6JSzF{Q{iT6y7jx-%P5~bRi}b#1p_AjG*=EfjVI4I3ndCm6kvd6mY2Gu zaB>xE0t+zhYWJ-*y?;GK*W`?hU`<}VoxT3g!U)OU_CN#&0ut}ehHzJt!UW ziDX&FX>@NcNlge+#wv(S(CSSmMbV+P_z+zpSvg(=Sjz#dquayE@DV|S+fTTlyT#c{`6(iUD zmnP`6`?Y~hXF0{oSyKPf>V(SC#Qehg(SqcH>^PbI`1g(pN4pEKW8~-RiVA$WSXqwV z4H7Q7w$S9e^6)g#lC#r42PxbvrK2ck8cF*MTybi0FTp2HLgA`R@g=*e>Mx6Mqvvq~ z^G5P@!C%wE%9>icZs(MeAKp%NXP(|QmOR%bUs`S_-0EYoOm(~_w1J!q=Tj>>QKL<8 z?j}uO?I$n8^Gio`Dm@@vvCGf9kKRoGuxVm##+4bY2+nS}Qs-yK6>-^tasYa7HNpUd zs=)n*%CL#2dvSfwUrVq4F{%Db$)%w-?x<$FlaU55V7xJi6P7c|9Z!%kxa%;r)`aVY ziuIwmtDNpNJ)|i}2re$8#Q~6Y9{r$0R!gwcw10 z2P}!ij=h66B&`oJc`hbb-r~2LsLHzkZX54<8A4J-(J+Kf9&8;~CFFMmP{UtcyvhZ?zdyOE+7`Byp&7UDL5} z8r7bV>n?n+Iq!EI=G+oC`&3=qvY)ktU^NEwy?O4L<`xI-5o`)}U3Ap?sVv(3RCB>Q zR%1`l*wV?t&%S)1fLyUg;L-OD!v#k-xL;#!lSf&u<`t_l}J8`bnX*;N?=JgUo$ehH)Z$E`*An5 zQ#xL81|q0T$>GcRW$ezVrkkGfG{oSzz*`d#Vg?zSiyytN|L8ok&`@$L@^Zrb1czcs zd!CB9^EWY?y|O!P8VOXwZV|qDe16lM2*~BTY=h}3g0$OF>a>qLzctS&yCmY_S4Jhh zbH+DHL4&1O#-z>rr2Rn~ni_ci%<)uXw{K~$k@0vy+fS`w@X~&3C8-zvb@atOz(;$O zx_DiJ<&I!DaZ}O`CY_Y3%*3EEleoaF;_wV7{#SZzj~fRVH;YsnAy{6V$CNZ}V+KXf zDD~>i8d4{mrl$|6c=S;?FMi`wd?2lxbe3LFhAn!H#Mo7OgX?~p^=8g!Y-KJno)mO4IP!M$yw3hcJ0o4 z{?)JjMVSBU#=d8N^$KyEo~t$K%h>T<(gRG7Gl^pz$(@mPr1SCfeUib7zF>EvDo7Eh z5hjGa`namSw4nQ(H#a(nnx__YZ(&Q%efb8i{2Zh*-s_lJ{2g%fneLwA&dpC{m#gI? z5cr3Kgr9y26pnp^xp_~qe=GtB7kP9kudkG>{7CJCj=rt9xR5?`g9G<1clyws1EbN{ zx7VW4HXWH+6_z5@Gz?W1%*)?_vggh91>LyQaV=z|bbaf+<|o^{=_YoB^(h#W0#8Op zj!@mLPydGnOxDLy^ukbZet8o>@C3W?Jt~k$+M-Do<@)I`EG;!_;wh<`J$;U@x_l7i?*F3kpUfgE8*sHv?S;(kxFyXA7PDtx2C=;UIOP1(W3W}P{{RJu2<6M(eW3xdU$8oIWYY=B(JV1@N6htJ2qaaZx|OCz0S?e z+}SB<%I7@$i1=J5YG%8HdBPGiFD5wS6{(TbiNV07WE3zDMSm+{P z(#q*_zaEt&P#y{Bs`c^NGKYgajoHs<>9bZ?lxeiyVsYhX--+7StH_dAeXUB17WPHG}^;!gI58~+1Vuj z>B9TSEZpo+Uo{5Sbg15Jvx0$d5CjJmF_&F5z315+`r>8^G!^`;Y_vs>0my{pR;6Jd z|0lU14|xSWEhz|IS>8FFk$?+8D~hoV$e%VVRg>VB5wu)ER?n|`G8`b#itv`LnyD<>GIW?U2hF*jWZt`ySywk z=t9%_Ecs!I8}WRjO;1NB9FhYUZg_~|U8Tk>r zxdrDVFK^Z0Q5yWIX2v`wTiUiCg%|@&FJ8EHX!Wx)Xdq55fG}Ys6ceE(<2cBxw^e#w zY4&!EZIiWBBoR3d9!H{W7wgHJA}-8XE05`6KQTI8b27U=X}Uz_@ak#YlTm8O^AQ2e zR3=S_YW>v_$QSDrD#!BNlc2c<(s4jQgz z$#kDJP#2X3*OQlhbS4XP8w%gB+?;fBF@)`$FMe!pxUd6OXg(n8!;_Nb7DJe`w#8Fo zBg2>`mas|b`?Mxa|8(v#S+=wavtYgc^7SkAn-`I1xEKurb=&V*Q5wK#K4zIiX$={^ zf-EYK@;aZ+6~RCAY8-opU$L%Zq5nV95*b2JdKL1*}EM(}37Dn&hg> zT`eNZgS{_>qV+S1=&ws5nKc+bGv$Q+Jp_47^a6LsB3=fWhhF7x%i1)o+QOpGNVU=d z@!C$+pG4%Ji;U>p5e7T$!(i{fN-9$N`+Rh`=%)Xq>dfLRyz-ZN?>DXEY7PAYWToD< zqr1s*G&QJ*QD9dBzUa>YsL?ik-;d)1H%;McvtgMTYr!TVA8<>`P!j#RU|qe=pGv=A zkKXPoS;HA1G#-@EoqfL7@mGY%eBq>6sw#Jf=e8gk0vu(ok|@33xG-7zQQG|*kZ>`g zG29tK^W0jY_m?|)K`b|%Fx~G&&6^Q%chhp5krU}3k-@7#Zu%*-T*}5rVgbolZe$L+ z$Jqic4yBol1Z<-_H=dJna&ox@JHZ?estFQjqZys2Vb?P8Vu4=+f(r3s+2#x}Fxqu= zSGB?R@_v<&dTnMrJT==RXS>j7T7&>WoWonh6~_P#4GnldC<7bYAbTgrarVu@#Ad70 zPER00BoWKC{~%;M5U{eca(})qr=^uTZu(CV@kjP%{dV)=-$BTAPV#nRKi~B^-4L-E zjy-+XREWM`D5)Z|uUhGoI?s)RA3d>Rh<7V5?@EOJ62GVC6H?V0Fx&dz;APg}yFls@ zOC6NW z9M0$ojOw*TpPO!64pWQ(!V}%^vvtErRgbthX3UlwOpj%o#O7b@DqoR;7Gj?}nO6H& zL9q?1q;pT-!|zXd5C+=$u_@W5^X0Qx+8f0j#y|DFSIfifo1Bdh3jdC!YrOUXIO%!pH>v(Qa0 zBE!eZG7Ml6c^+#BQ)R?CKH~GrckKIPD8ypk`I9aBbThSm5PvOE^(3l4TBf+244AXx zGgMe~V)?{Bn#g&Tw!NOY6mR8mP)Avlvtu^N?RbCtakJ<{2wbXimJo2Jycuu0o;t}w za2}z5yZB?i!}PGpVkIW?XK>(Q{d*}!(*Xg+9&LG2B(>f8%sm3tw%RkKkJ{L1~b zJ*p!XE&>Y?=XtV0YI2zdRaM+SOF%K_UaB5#i8#;#o1rI4FsGY8-3;WByoX;WC!Ddt z&IOC!<=*ODxGx*fw`L`ww7aHMICYhRR>2fPa8v|ur*S3PsMYWj9GKSbV%sW7HnS@O z{Foy&gqZZTj6Y9sn59-}rrjL0xm*!#`@?SZeX}8JnBt~J5R*;$kX3ABGZVBc@?Cbv zDS?~aCdCxt(E!@SV1!=E=V5iX0%^30d69WxB7bDs8po6BTsHc_Tp^!5NeX9(^7P`H z=3sx`N^J0?K@Nr5LFl;@Lbo6&T@%>m#eU-72W*lZyv(S|4$2swUXWiw*8iW``p^+B zT0eJGTcAMjH`Eoa!O(R5gLKC3@Dmlq)#eQkV1xMPyaO&*{3Z4HbW#&bDdN9Zt^sHA zTOFaIrl#B30v?n?-bu;X(HsxBk$(nb$*~`|BjJt~6SH;=JG;{~_KS^nzsRoOg7=6$ zaPwXuA)WCd|BhKD^muOHaLMH;e0u`UnH024W;Zz}FzHZ!v?w{yP8t{+!J5N{|4pqK87@J%$x4EmGb%K)7DASVHx^Y~>+1C@7V&8}T zITtYgS<+$d?7_v{mN@K$L*(5p!`-<5D`y)wJ&IiCLzJIPk+Y2%YD(a1Q6vO?_Qvu? zy?O|%ql1xrm1O(G1$TLns_#KCfoNtVK5%|&SuRDPZWd5U z!$&Sx^P!$_+0l6Fd9Ps|Li}rGkRe|0-oRVlW(!`<#1x3m(55}UOK4>%0L}GM>-5DX z=x1Qv5QQt{Xd-j7VG&CW~dny<|Cl?yY*4NhktwN z-7Ue00Q4*m4$Q>=?$KFYh{=6vq;S|h<l-4Cf+E#Rm{3+E+qS}oLcpE(gIiV-kX*A9mW!Ze-H z%)FoVzu3*W)PfOVb+U=6LJJD-I^cR(OR=GkW(+l|ME}Yw7(s4go#&eREJJPaKi(2> zfK{ruzl?tYd8aYjF8N9SMHa(&2Zy`&anF@!)Z^S4sKR37k|)XRkERmNX|IbF{hZyg7Y zwjOQRSXDB}t*+%d^PMVqNpe3^**}}zfk|-^K)y-jB-oUs1-+DXAcyz5*!i`8p?}-` z%iDWGzsXCc=L4R)p6AWOL=`-I%WgYankSSR=eyjS!Mf7V7Kg3YkzFECEyGddFQYS2 z$A#Bkwr9KYZY9Hk^FG84;)T8^1`6#nqM4In_w+C}AoN2#iQRepqaNN6j7+B)8fnq| zEO970bUwNZ>tOBx_eXwf!ck{xgVU6b8~rQc8ucgt@wE|#_efYCibOJt?Ql6Kns`{KB8Kd z>~_7e^S9kJ0`L_^S^kv`9QAqi<}4*Zu_OAF07E`^+}Vv(aLVszyi=?uahDTz;%~9g zVS1OyMPi@D>FM9^W@MDKVw=kj<~34M7ZjDBPLL5UCI%-=U|D z-FbW&;6^!WjUf+oYh4+uAR0dSqn>^_wLUvZs+C-12nuo2R~&ilz6|RxXJMqJXve-H zRXS7fyLPnM8B~)*ko3H_IqL2*T9Yx?|HRBJn5!E#FB=>IFu+au%*@~sf=cfd{JqBJCSVd1ZjTGvfy%m z8i}h}@H>>K!K`8H@?iE8~=6RXgF%*Yh>`}-_cJ7s_JPT2Ix>FSeQ(%c7gNOmd{96fr+s|f)4F_ z2diHpf16HB>qzgoimun@ctc_){RzDTpSM|o9`FB zFHrMy^bSuO9;UEQ{3IYFNt*(93ThYFq+tCad}#IvOV?Ei_eNQxaC14bN^kP-FFtd* z{vRMYDV^TOG;fb<7W&?V{fm$OlK~WXuMpsiHQhxWe8@>}JXN*Y^XN9yR#B}5N;_l>DkZ3_^yFzeaVGk|HIxd&hCH`k+f!kGPtNy|r7GE=QJ~1&t zE`YF(JIDoG76nTKfDN* z_(PAHdaky(9i+Hf*YIM0ORJTdLX)G!Dm64>Wis1NZY|s&W5CqF(-d+cDnbeKy4h?| zeZ+PYJBUXZ>o+M&*%IuUY*kLf-(cpZI5p3cBCAvIxw*b5`CP*|;rC7cuq1C0O}1;D zjCTsf=?k>|LU3&PmD7yFnx(d5+??&U&EO3;B5{UfYfH-WS>bu{<;59GM{nsy#zo8C(V@pWIgn+0VPT>8k z=BT&&Z{VKm9@tADXb5FAl7c4Dg(DXmcZbCN69F{11WlvJbUBg%$KNe)?3jPc!h|4q zxQk_!uxqcU_eD$S;RZ#RK_0cDD|V8l%fnn@$h#gFKdCpuO}^z8i>0d zX(8b6guI5LyY;I{KW`5Xv`(|PHQc~uQQNz}gXppC9?XA~RK0u5O)Prxi7rm%QG8S_ zd=0+OYVmh5h7F8hWi{Lwcs=QQUK&5=^o_rq4WcjWn}50NBgj>7{z@`-ftx<5AUW{_ z7PX<}Y~g$yWE%`2n~uTv_h!25Ppay6HO|4||G%B%^*oB}E2d--AUu;Q5XS=b(yKEf z!kPJyoAcN4u}$T@riKPLCrWp&5u~1u4U*?uUTOSLh}kjl(P1En6RU)fK1)VP?&W~t zQPv)OJ}|+GU?9Ho*$j!)nB!EuXznc^KiK2=B7ae%H8RJSNq>*Cr+>Q4<++MgMEL(o zd0xZusx;KOX8^2DFZPD*g3pzp;(O`#MPzEBX1(DseS6_4+y0E4ZZ7>9ACA}6%y1t= zGKx;uMI?cOdh*j?)BE9S*C%hF;2?-zl&w%JRXF_dV*E>?*|D(Cp0=&5Sh5}M#0ha5 za{T@t5BBh>f`L3+#;K6=elLT&`Q|q#(&DI?e`+gJ5o27A$JHyorPrM-#cEBGnG6%E z6NoT~37xLLq_7$_U5jl}5%&7|rDtz<6XmL*o!`*6u#yWK-Zb+N*5+=ur!hQ7Cgjck zi}-&bTImxPqqgo!wNA+Y_z_ZZUT0K8?!&lx{=;-K$W`*=0D%@-n{1toiov@X* zwvG1(6jJN&2sXnMS~Sh67W{bF(mDEHFy+M5HL~3I7K2DdyHN%1to+S5@?QfY6{y+J z=r@a~sF0|au9g4p)=b%Q2-HE zbouyI zYcK&G2o<60Tg)H82(-EdJ?%^F9<67m>?opX+A|h5o{|{7#ScAb&Il88POaL;19VMI zY>{Z!=oCzHORq9b%m@;zV;p$I`gpRCjq|j+P+9+IthbXKANF7}$0E!AyJNxcAywBw0Y z|IorZ0KTV(nbk(f$V*KAr`Hlk$Z2{KW20k;OrVDc!8=mq@DWPgTC1oX%Of_3nNOQf zQU$tLVJQE4t=8RO0zWxTxfKlMLqjiNHj(B$O%7{++cSIF#->@^eE5CdR%7V!_km(x z|C0btb2_DDlD8?LFUz!bn6`qE{pBEX{H7$<<+x00b(8|#3`-g9JTP~nu=DnIpxnz~ z<*tG@+LB+I`wg5o0R6)o*rPx{<62)&)fFQC-9DJ4(S_GqW_Np^l0KNNudJaf!0tIl z_-S=!@PrP61bcmSW z-X7dNK}AWX$q~uL2T8Q@rln=HPbRN?@|jS!Q)0vyIb)GgZ_?1#OXm1e59}WPW`aQJ zqeI7yrv-Nfk{fy{UKb^rY-P5P@%ykh{EX3Wr~fwp(qJM`kbv$~6uA5SkfsvVz{{5+@u9PDZ~D z5=6rCwlY+^wjGUHx*zpGN>KW0!%=glRTGAqlJsGcZ7e$f{XRMDUY|~fkY(!PX8&tB z3RX1YDSxlf+9o8C;2k|)^>q8iS0+40e}6Xz=Vz$fERuIjcDwOTym_caRcc@H_!@Dd zoVamtRMr6V8g91lk?WssD=$?xy%B{l-c}Y7*O##rogDL3D~IVj1Ik!~TQxcYul=$( z2DNTMsMfpG`Bm%Q14ur+q@eab@o$qll3X`Pr}X|Y$i+lWN>R@(!a=lYcGuW;S?xDv zla1Fb$CKmH$kb1<>25>*X4R?`V>p8UuYDPw+eP#0DP5G)UL&tywtsD#>!gdDkq!aj znITQT78Av`@y_k8^jo!T(3=s`ny#EW239r}1_nRPO6KGwV~&A+j1bIE0!)c|gBEq# zfZNphfbgeP;H&ChB)(;Al8lzvk3awa@e$uA5z*K}LMS8JT#t04Kgsq5e!EGXa6AcD zwwGL^7~VW5(D_w9H)Nms6Uok)!?NG`$gL>!MN&z(-n%mB^>(t5RP_Zi+_P2h(DvEh zuqh=0yr6vi<=*P_c(C-f2iUd#&pgV}uLFibk8{DCryuR&^_jXn4!&n%?z+X%G_j`} z6X#tG2fodG=2vzAD>Z}vy&iFoxXQBflN$6|fJE<7uUnCh(wAa$8a;2WAHNyCm=k=H z$vxbwk|UaRhIM)xO%4?zH`RTdX?VYD_fuJ+tx!GkI&p%2K$7ew5o)I~5_T$~WCi{< zK`10oN^6e}rz*MuVX$=7XZ6m%N%j{afJZx?=Oa*nDiBcimqaSr`QhNtN38RiUo~)j z+oPFv>w|7myWR?DYt6hq4rbhNy;29@K7GFOt(#I4iakxR;cyh+90)`~wy-|n7_7h+ zb$fiAOU0Isq+k3gsp#BGpR2~yq}A-WS6fS%-hoBBeI)#Kcdd7s>C+IV6zve3>4Q1x z(S2i!nu$KQ(49Cr%H$(VZiH<@Iy`y_I-cQ2Z>m~9`d}xxSRDHFC%|4L2`ZuHOy#{` z{)Y_R$mP?$Ce^Yc!O{Cgk>O9@N=u0;aq3;~IpKy&OQqXWI2W!$&5IC-CEGI+rJ0r# zDq?w*7bF+<{vD}?x?y4A^}M&PcP<}ZmE?Pq{vj*JzaNglz>0GyYXz)c8{cKX zvUSQm&7RFywBHMufakUE56c~DO}m?YCOqqws?NMQ{cOKFEMy1qcb-w;n(1vxGxQ!X zd$EG+PK)VtCRxTiz3w58uPH7NnYBSo#i%MA;M0MCSWQY9*4+e{AGP^ZMK?H#z-Mv| za-w>R1dI8STgKj<$o13|0wgySa_gOWnTd4xe`FdpM9%NN)cM(7_x2}-t)&0`?Szg8 z)aSH6o#Rr$zDy3a-m~^bg7M$v;W?>fcm!qb<^V{PfnuB~t6g_FB$=lZ>wZ0R9MeRw z)<@x@4n2tPqtjo+i$M2gP}ES1;Cs@qSpSJW;Ky+)?G@BqVyAhkRssbD5pyyErqcCG zv%a~xSyMR1(9$vp-l8P+$mkUAgpFrMom>0N+?>aux!{M~j?Mn%{F_m8@4JeAY|6Dk zTsAo)Sp>rJ?k8sb5X@Q~CPV~yQ%V!+SA_rA$3qmvhquGGHpanEPt0qbG{$k^Sljpp ze9b{BFGZm=rLuf&EGfQAp-X-n6z8(QL+SD*_j5%dY52L&eRoy`U_(IQR@}v__O3h= z0w%;m;$#_y)3q1+-(Q|G)cbtX)4m(XO)zoeb{-9MvF3U+Ld7@aV6)zObtfciMa{iy zeRwS5veh2Pl{ZQ>K_M`=oZmq~Sa<`-;k#WAHFHY93TKChm8l?pUCQtVMbN-q*9mS2fMJE9? zpP-!W%y$n+!_oCh>r`@vrmHu+0R0g2t`+2svDoKMZOyQs~M!pwI=7qDYuP%n~- zN5%WqskRxW5`SLbBZqfVrwd#tvEPRouQ5aSW`(Y75edvkFoU&x!DDsy70nlX&nMwS zNuz$;s{g|RY_^&1j=7?;&;E9s&x_WV@Y7R2W{?3*QItMRSt8Pbxix3N#IPPzyg{|$ z0~ThbRtzIw;~&`xNUbC8&k>;1t`|>Z!1Y9|ENty&c>qy=ZLRUTkY6?Zje$LCl?)FL z;p4p-H%4KdqtS>~gq${r-0o~n8kF|-mw<`d=5<=T!(??XE#ZgmKQN!3H#xIIHTd?s zC!Ahqgt}&ox1l6vFnWmx-@q^cV&|xVQxvu=4nq3k2^oX=JxB@VfG+VAh&^|!K2~N zL91OezB`L{tH`wN7`;FkHX@+)xl@bw_+6SxA=v7M^%;RTgDnxT30IOmU77~cf?q%# zPjxM#q(@gJkB0V;RoAe{Jc!z~g$n#1^KXr-acdJ5zB*7+XUPe;d7i)PjcgFZ2qDOT z>`YoJf?If-HTOH8jfS_jb*_K|!~alYssnQuN#pCo7LVFF#{^M0!S?@I3^ zFBPI5GnFgfRi$q|`0=$Y=Fp4_JVd@v8SQ+c(yJUA?XIK3kP-Q)M z=gXfUVEa#u`TXtZ@AFtMO%X1RUb{ys8W;yGY`jE^WI&x4=dCx?!BtMm0v%C)nus1! z!cq}2MElfQR1|ARWG{DC`}O1t9aoiMrzw-aG-;&B1hdgNSq>`@1Ul@ZCkfaPlAnvg znw}r^mfXJdD*0dr4^22s4QVl@Ki~_vEQyti3F;`+5o8A7rPwWRNx41}TmdI7sK{-v z8Wh-rTKLU*^sbw0BQ=a%MtjLPIILFZJG;rqu=0!EK;K#GvQ02QGnFDOW5sLp*9b}C zvUj!S#DA!MMeu@|h_1G(^8Krmtpb)yD~{g&xvha>IlV>4{Fv)jx`DwyB@#ZB6Q*w8 zuLLq;aJwz@9n^%vg%3U&>4%HW-C@$jDSNNMC>w1o2klFt%_uL*} zCW>o0-y4AL9D3xgwpHoAkruoeXgMj};O4(NrJK7*CWSY%UJ6;nd06lEA%UK|V1Gx% zUsJiYShe~X$I+v|oO!Jgsv|?^Dm}@!TdvwvwD$}#h0(U_$AHHB6vE+ydlBu~5uDcv z>8mnJW_9zij*iU3-wnr$s|r+#(#A&f^keXm?d;=kTslmT`;I=EoL{U4!Dph~><*Hw z5Ws2TVurgh;4W2A8+f)7hNdMSUP;C?I|_X-#st*5)WY`TnUig1D2YWL2Akn{M_aG- zN{vk6)(cBjbhwr@=GOWeyUV|Pm#KWHNM=6!T(3V%arq<``a4-IP|}9opNW=7hlGR# z7c~VI;7Dil<$0|WD{3jl#kg+vtct#Pk-MhGG&n}ZLzA&=>nY`k)?Qzhi6N)0B2yxY zh2B9h$%Ie9mYZb&c0jxaViXLhr|dM!HJ8I~nLS1sc6ZJ_ zyUR;OIp(8J9%aJLre$B(k~_S2;TVAH>>t~vbtxrwX_E-ugK2eXj$JJOL(fcfwZ z&HCKs-WP5svKIN`o=8?xX1izNaMXbThO#*#5eI{dN~3Qz9Up123Sok3RoN9zx0HWy zF{7uA$^^r2>aP|XpfhPObxhrqH(FdtlrNsyI#? zGE614Ph(@bYZ<5brRI(C89g_J2k%MLwWFfz=2iIpX!cd_`>RavH05WU{<4;f>!n;^ zI$b8B_nq`!*P(9>)2h&eL;Mew^i=XQMRRL>Exlw?fQ>g4OLBJx!0vr7hZYm^I-YgE z{A?)qzQ-ZvST%~%P~01Pdr0^VN06V(quS%Qb78;3@^tnpzbRs2WijgR^mqivgRhsR zv_E=r(`<5o47g{!?%@D8Nb1Ir*HJ-g9#w1KA-5W7Ob}%sOyRcLYvdEgQkX7;NOYfk zbp0WC71PPm6?*JI3~%NrHVj-If(Gi1zQsgTji7GO-aK6CI2$;BU1CV$(%X{_H4SX{ zYz#|`)6kUa&>j8Y3e?CXiB2H|vWp-lu#b3BCbP?YHi;aB6U?ia*da*b%i^1dZupjkmy_%_$m_lEaV(Vw&Jh<&Qu`l3wJD8cx4r_y`#cHTT~LDn6rd3ay)@6nk*u=SF>*l){Ki7!M&WjI^UK?*G2zVsvrZem@3n-2{}3#d9?59MD8W?5=lwU=$*uykEfD& znX=}2U>lk>$+HsP+^FGGmb=qwk&AXb+PheKnVl?&I`qzbVi`vkxhK%4eoD8-dfU|Xob392&j@NjAy zhdZ`@!_k0ySqvkvzf7(M#3qpuJSrQFOmnzNlTj-JthdjcU9ah{hM=lCK2R2Fy1wX~ zHBi(Kql@6-_qrks_3`BeXBTf+0;q!#aM>Q;>f83;aG?}9ZhqVgjl`1gFJ>zc_%=Ec zMFlpt=~ZoXuH5;d2FCgGUH*0#0+yYC=cgo@IOanfw)Yk>s-cuL7p$V~dY`4!-}>Un z`;w#J5hKepi{c&NqeGP(+#@~i^D-}b4|zttPNRIB3TG6%_L_(<)nW?JsS9W{Q7mp- zGaG)*Ub$B4UGov%%$WX#0_{z2HLA|))L`D{QYDE^NXg@b`fRy;G@Q2v?9alSBAhnx zVksjBdygL3i9gZu$5hL$>|8a;(CJ&6qnYUe2x*Fc z5Yonphkb&CKnH@6S+wKyS`PjFI`%I1vO|kzkK7_+$744)_1aAX`*=$>JBMZ_CLQaO zMgs0(=SN_n6!-Q9aKfe4+nemu8L@SBl1;!Z33}`L^NK1_xc8AUWhxF|M3$gUFKybf zMA&5!{wBmgV85bd6A$oVeRGuM(*!b5jZyCKRDq!2&p9gr?-^uz^AnIP$#bnvQ^j#In5XdF zLZ{J}G+9k3rMS46jrZU);{G2UGrtY&oYf%@{I@(`eMbtIRDfUYxG=Px8&so+^%b_M@@5SQ-GZt9Nys^te5D!kZo% z^s#I`m?_{$8DgOF?5%xQTe&vV7jMR%a9^LL#KQ3b-5(5#a9A5wQ1f4t3;a?^==15* zryFjm=Ck<^Og_6R(V%9u;}>}cTehh4vJ1+(O9-&vKYj$zM2jW$B4cY|t)?@vFo7Z< zXZ7Q?_qC-&y1!;;%K&m59h+z7YHq>?(j81$-qE4{Yl6ns_I4h=h7(DKcGGv6M>{j~ zYhL^q>vIRO(?z2V)$IL=IZaW~?%CO{(cXH%74-0knPzFw;Gl&?w6O(1I=g3WrIp`k zX&LW!&Hl*+cw8R58HCW3a=jpRwTz{&jRsOg0G{qeh;?lv*XIHD;i)N({h7!Cqus5Y z#tT;hcQrLRqL#bZ11Q9ulpGOvpVmxc29gYX2clo`ViJJ%{h$325WiG3m~nfqqG5Ok zFvxh))Z?OD+i&Erzsq+JFHBh4MD`4Le9lmKEWWu>_^=?#!Lzj9 z-jm)FyLm&7SFiFx2!Diu8v_jUFHR=musY-wIKO-8qIzi>fgj|N)MslEzX@@gCxG8P zSjG2@;LgIpM4+=;eNHf+L|3np`T3xFXqu4P5(z}`^sPP!Pw@R0Y)UflDT>O*jKFV3Ss_!gB;h5$*l{2%Hp2qK( zSqwMSVDY~P5HbjtG0^zi-qE9b;{f9g)97m>wiOZK8pOfGbeI@(yEzl<@;w{psX17v zJ15-N_S8N&H6AKe4B9u(&&M~)6!44+oY0|FS^c$H#||Q(at)&qI_4#z*zt zE6lUx$`rZo~2%A~nL+1P1X##|V#NO5d?x+F9tX!)b(_hHx z(xh%lymL@wOzeNO50pi2ID1#``-76jdDHeO@IONWSR$e}XX~pul-9`4Ipx<(x)jq&r}y6e)nwjJpyYF1px@~Af)dDE z-kw4rtI)_#WU93D`N=!GJBEtdh8bppkGyofu2-qca`*?IXUf5%`DwatnCy!*sV*YJ zA1;$LIBe?OZjF?Up2hY>S9}1xo8R60vmpo?6MMP=%>RT%oBw$!PEA0F;2CH|whWix<^g zO(tn{ljeZXR4&740yFa8T>xy>6D!!tBupe3U#qi;31!fyjXrLXqTd8X23Y$o6!kD^w9 zwsRJme?2VLIGP;&{cvg&&&TV}u*{GFZXY_$-XI)oL2%_R=pAoC3UbgZi2rIDpwPA9 zWYAGo8lP%AM5>y2?r`FHT;ylX=$=qD&-qWj0a=~yPJmfJQUhWAUU#z=zLsFEr}7&L zuatB7QB>8pX~Lg3m!HN1V2&Q*1FgH!w*7>=PW^`DE%?it{vI}fxS-RzIX$~NZy2h8}@nsIu*EO+FXoKV4@0F zTufb%?+o@277BR}ExhJD^;7ijg%xSrDNYdXr)O=iP>WDoQGIeCWZ;sqd4+5QOpVq-(TfN6eL$dmhXhTeg5t4mZOHvi={>fp~)lP>}?ISHbw$vc9Q4OU^I2{=4ztcBBFztoYL?2>j2N zaYH_#b?{2Lm&0Is!m9Qu&QfB5@bR{@_+b=Q8P6{D3{w@3lX zAE4#|Na+91sRH>7%7ESg)o#C)2H1)K7B#?4{R$G$B{A8zhYEfAc7Tlz^a1Q|5C47| z3>X-<02t<9e$bG&z($51$Ht$+V1iWn+1v*1?^jo{fo&1|e<%FcD0~o}$US1>x%pF| zv27&Upj!ShHWM1~pS0Bfcm(?0rC-D>g57|~+Q1JIWPzP(ltS42#ybD|`Tro({(ba! z*n={us6j|T+exqaJz<<-*eWeJmht|N?y5(Cu72G;dK&ycW@1?G$!EQm%$t@cL>fPJ z{_so{u8^3K@xRT(&&3-~h7qLw-(Dby0K=b*D}KhGGPF9Ok5vn%3{it{5_14`2k~Fc z{cbxc1r&tz?`}Hq0*X_!m_$|p)6USGMyvY{wr+y@J zDtw`347PfB+b_F)2fptrPAB?HeEib=t>hi`(B{@}MYBf{7{&;uCZargR zYT7x?PDr@C$s%xj3oRMXx(xu{KcVA=juh&nd3qFk^UBLWo6{W(*v8GM#Z86wkH>ds zbgOmL``&vYwy^U?CEN&kZYaRsb-40ENeBEZ(Kbd{V&udWFMIVK7ACL~!SU zQTsayp3@~hB$pzSUxO)gjIuZ)!p8YR}P^-0ZA)55>$FinC%|0tyTR~NYj ze56^0fnJRmw9Ec{XMlWpbF)UjI|N`?IJ&-bIo$xtVc{Xc@$iy>g_xT@Gq1j7cR;eR z6h9wa*UTBDb7pjMAM0t8t2)aLu2T;;*w^s5LWpJEUTttFg6L@lQX#(=*F+9{`M+`{ zzupoQ1$aD5Z&;qu{pQpt#W@K$Y@mM{B@p<}RYVX26c>TZ63Jl> zK)?18>?T>>-8DBgB@4kZZ!J(Md9b$Fi=QwL2!QKc2hiwL?~ z-w(HHpH!>X9y%N_GQ+cw-0!?_CQFuDyu8M@-}WraByyISjQqI0JPd@tzq=!T|7Pp+ z_!2-0GpeMD2JoZ%obuu`Y)qLXj<~AdgcL-T&JXdueG#s-Zgb~$mTEC`!4F0NX%bI< z&6&1x$`N>`FWO7d=e{N_*Mor~k$>(+xu5G#j~2GpHY(Q{oH0;lU^TBorf)2Ie(^OX z2>RsTHsMKSR3bq^*nedQfTVb0X2x>|Cvtxpq_;fy20D7}Vz!QeyJ8eNgLb*wC4J$; zyJ)AyMwfTzm-m-TOUPxu^oR%u%}I6|;r>QZUMs7@F&HFgSMRCM$EtHnL{n8*aH&nq z7GH@QDeGnxsw!?W+eN$;xJa#3idi)&OW&g@qp;V}$&v{6Sl`S9%EVbT`lv{Du|7cm z-xep880_ypFpTvS{bCs*cLALRA%#(t>H!E_ZkP3LwPQ-0p-PKj5YL8Ve~>7I#-I-zg@1%;n_j#Y{ z0*F$wD8nWSJdQ#70H0 z>4}yOeI1F=knz~$-;g93AO<&)QaiAK!y}o8puMBI>46W>)%aVxw^h}=7ZteSF^DTnT=sI2T z1M%58C8DdIRolM8REvyw4jVwcYy!_bpCIKcVZi%ltW}<>i-hMVI!mHwx=q-PgB~@+EtT8?6>b1nz5_G#FO6YCBz;h*?0VStCKL zf0(pDkU#CozlXA=`J@M$r?446T^(6Sd4}9iebEvvqD5jKDkkJ0Eg>3+-_XctJ|W_Ok2ztCK>IV0zzg*jZ0#00b>?+{Ng;ObG?FgTa({tS z+&kn|>2_)5%3$Jt4bY5?u5&Ii_pD^-6<2N==V7F8&v#|Aa?4k6ctC6u@8bqHD0oh9 ze5*N}&l9^zrxKcVe6Q*tzh{(>v*NQ5oJBkGqh>f}WsTFzYpn}pu71x~*I{gk>x)d) z8}iWWWM$MFC?ElREw2pa_U@5KOI-zTm^p0hKdBY;8B z6&xHds`X&O?VY~T-2I4PQK&b#`39Az>CR6aDDU(IrxH!A7xTZ8)1o#(!Hu%G<|&_Tu>tvH*=qC$bq4W1o9JMvFEA zVreX!ulaxXKAs$e{zn0RX+!Gj(>dGf5K+*RnT;VI4!?ie1xC_4gLni01%4}kztH5y z(R6w`FT+36tS>5oILqW*3o!Ubw4lDjb_WNqMrk5eQ+wW3 zyy}75gD^I4+!?(webTCkk$x9~(B{%fW$=>8F0NT;u)}dXE$TB@aR*t+n(J1?SfNZL zeaAfbl;3faw^`uh_lD?A6Q&pk}tH|=2oqYpM6nTSI!o-j_2pU z3vme}zm+(guhXjRtelG==@}u??*|AV4_3D(e1sYXn%=mnIBce8M@f9Efp&3t z^>zqzA~S6~Nhp$|laDMxs6yuwmJ1t?S-TkQ<^KxY&t z;!E2hf@|f+2vZUUp)$&l@^Ay8Vo%!;(cU|kmZ8T9T?BqT(KJo>%D~Bd_66d3 zk}KItxdHd`Nbu*_+T{I{19^9|F@yP}gJcEK6uF4H4Bs;Rx?IVj>{uxKol;2&ak%pG z3g)=6ir5ZN6Rn(Xn3CX*wYB=|3!7p|zVbC4u$ALX7=emO{4Z_+L$p)dOa52*^%wyuJ0&@a8**>+^ zl^|-|0f&MK_v1)twaCzc7byF*J_vaM8 z16RFYXz^+(E~YO!>3uvXk>pyCl?nX}upHN)WhsYh3*nEaEA1%`O{;qvZ%pNpmDW}# z6bv!Dn?dL8&FIO!9HOS-3XQm6z~5(nh%r$sEv0|AXp+K|;lU52i=0F|77v>rqUt-y z^xse*L1Cojw4g%dzvf286}tUCL%{0d(Aoi%_gWfU$%q-y>{#Kq@ie0!@&tDsYH}x| zBqhK0AM5inrMUXcw%pTpD|FvUN$4mJZhZwQd2wpa+;o^>f(qfkoML5=l{~jbQB#P2 zT7Gz%?aL%gd)vAnt2EAROQSS4pE0gJ&-;QPPjoYXHuC-cn`bYoiSg^abQXjM%ZH-Q z`$860Bjj&eOEc`_S|h~280(1hbf37eMCud3=FIkep!gq&{AG$xQMWosAi-);W$2&( z%;|WWoMRN!x$^^7RzxblWh_UgJN>l~SQS26+80!cA9pEJ#cJyE1b60sxtIR<_lgc3 zb}pCjXi|p#G5BGcN`*q60##SeF?D%C`Y-RTy}H8{I67fe?t7J2%~K4QB6YyEQ8TeB z5-qMR6Dlr>_}%>}X)J2g1U|~OKv@vrVxbGtWzv7S9g5(bXCMXGf|0+6>QukONQ3x4904@=Ikm z`b#)W$)**Xu@d(Z!oftk6ps|eH`KwRp3RpUT*aAh9^&k0m3M68Z#Kl=XDX&yk}Acc zl4)UQT?MN)lK|BcW=J4~|8wH-k^mQ9YKTx(7aX9wy`7$(Yg*Y^=9QIm)%R}bTdr}t zsBXOo1EkXg5prC~%eG%zJ6V;k3#-RqtRy92POv9pW6d8r;KGYu45rM;^9olyqXA$C z^Bd-33!Mx>2stqioS?ML%tSzM!mKN=m5UtcH5IolW#i}?IiXG=`w{6dx{rJ$e%om zI;k9)ReKXxvnEt`9i6;05oQ0~lIpMQqo61ui0NN0%}-V5hI-QMPS)xpLf1GA?lXe% zzWLr%#vi<0nK#O$alcB)`eC5O`^H3`FU z-j@c3#)j+^hH~nGB8d9=`rMe*b8C9<3GCk~$RBZVi3!|ZACLz6I*AjsB$HWox<^+C zm>3$Mt3{dcx}Ogcx}|T}jFPly14lV}2k7EHfX&y%#ZHNjt(=l!e%;da1uL(`((+{2 zWV<0-YSAv(q?Oj*d`E<48!9bvS}7%9vclEV^CavfICj@8&J$f_Hltrj%kTG`N3TsV ztomxY23gzDSXeLyxb_Ls`pbDrSts#v>7LtQ80x^KShq`Q_7Z1x zS=oiDN1iU73%)ubv+7bAebGW02~yD=EdahS1P{fJCoxxEA3CqS2!XE@;_tyy{8d**u5NeUf}BmDaDksnCjI(5w*gIJrYmRV9RKDo_&gOvMcb(Gxo-WqmU>gR zrC-QDSp$7Gki4t^;o$>UW z)s_0;fMG#=b z^T6jChWcZiRL&R;VUfV~EUiD0+%o=9aGez4x`mtB;?;gZe8)bwo15ktuS)gw(r)ug zPfp84?5>Cf2q;gOfwhq8dGo!0T}x&}aQ|Mj5V=>3hm6|fN1{EWLEB_tKrnr=W~t{w zzL!U8{~Oy~w?>pOlK8ZQr`i%c{ueqj8Q?HmMLe^&z6g@*j; zBnYOmJaPH54CX6$XHF>*+!hpUvco`fjv3_V73XhG0)>Qg9GbJy&-&kOC&b5J>`jby zbW|4bS7n#3xih}4~$Mxl*}7S#3l)NC08eK+Wtu9bNgAX(gtvp zbgnxT-7(pi$=cYIvQIrk@PBY$phN>p`!JUiuUdcOA%7z=`fR%nA#UOgc1{LY)h=a? zymDD8xIQ?Z$eKTUI#oMq(ACHu;?yKpZ`e)^6$+ul^@Im z>}mS9DxW01QlX&8#}S}XE}(yLm1^dCF%)^jjSx6c?P%xMl&X~V?7g6%8>GY8=eM8l z*$7u8FbY~4oDL^}%;e7DkIq1SeH;PrZlj>Q++10=mRp(~y~Ru-;rq+u{ao^?anIN= zX;$g^>4{qfQFpWbH8lPaUv(>uu=4^lkI*HqxrDb}(O-B->}`&^zNv^%BwcZXXyo&` z!piK<5D)}x$@mzo##j+|trQIn)z4-@CEIO6-@uz6$ciHFIGOt9>6Uj&mrlS>C5aFBlvxV$hP3PjI0Z~2hat3IQ1s|$`Y5hbtPkB^_)!@}yM9j6F*jBgRx{lks`g8n-I`x!z5mJbkg`yuPOpyD(z zJ~wqiR$cTy1lHy1ILNK@XmTVRyl<<>dW^)x?*Pi{Nn}@e|!1}QG3Kj;s@bsuck9!Z%~9gSr$N%D)C;MAL%tb zPUvVl*3{!jRq*}or;-ygZdiufcElyWAay&=DioraDyO5tz8SEy=HYsaYqYjv{kI@~ ztKbmaCR^PcRQYmLX?MJ}eZis|kz8gTy+afNj3qMvEdo+$p2qnpGF>SLGuS2-_FG4l zC6SeI75GtW%`f~PyVpsURP+hLAi$Hny_3t93@VHf2`1y~R58PjOY7tK8VHikzIR%e zLutfDr7CE|uvrnhGeWgcB2(89fCtbuO)PUpzfs>c*j?qoes@tT2?n-O5(a%Xl-6#rQ`=U5Y!i=e)Bfah#-- zBn6Ztah1Km_0c!Pvb&GwO16OmgkV0C6gImTMa#>&{3$>!$?a;Wz`L|`*_KJ8R%ZS(yiiAQWUG;0iegydit15DarA4@oTN@g!?zQ}c~Zm+OEDzi@| z;+=1Js-wV$A!c~)v-o8N2Oz2PEH0S z2S-kfO?CSB4zpH|Gb!jA!n)~iCS;{eMd8Jfg?t2kAR*U1W5GVHv`j9teCua~V9|u) zZ%m$X+pkJKFEnntH2ieGSH-^Xa~YV@gt2NU4&-7zo$%nTDH@rq+v-WM44q(*%jGrM37#Qt^gH%*v3oQS?>I%23m3 z5iyc<1((>P^Lpbl>?wO!O5ge$hziL9ro}P*^!uBy)sFXf{!Fxp1W1@6kh~jvvqS_% zx56+ydJ8}W+`;UzFk>I#TJOv%9x6<%_$($gjX6$q|ElJV1v$|`@W6o6%l71Sy(_gs4Ef;8>9kZ_06?XzJjb~E#;G3E_B3`WMT%7 z&d(2}t0^j+JseNm7R==Ru!d;-eP|MdzyTxrpVv(y==lc_kh_QRZj~h>#H0>sA8JVP zR-6@2Vr4>x51K9<3Ba_e$TKDA@J>ofH0n>>-ddwXIj-P9i7$03ZFzhs{rnj~ca}^z z2)>I+@>uN(ey_&EM6BNxga8XGSH*7FYrw;!5kE$5+2DE4{bFvI6%z8m2>kJS$V<6c zQ_Q!yF_JayhF_N-RYJJA*|R|6xl$dhtxU(>?pLW8GYmHNKvAyxYv+dJl`IV^l@ni#9S>f>M@9)*|x8URqNu z(oUGtw|LS&?B@Vbuc5BCDmlXpO0wcN-9X;@l0XJWyw)L7MDit>V=TWLhjy8dqX4q^ zj1Y-za&M=V8sw!Y`!+XKOaG|m#>_lV(tZ4LM|1y|yvT&fuj|=Rctkzc@Z2hgiL2`- zWQZVCjz;Pj;{9=XTxbw% zuwY<7_U|7rA5S7s20(vK$e0O32;$9rKc&k#SG<^862%Hg8N-|t&5}yMSBc-UU+zGpHqNeR#iO{M771fg`cpHguS_(-pILm9T{1T32n?I z1`M!^2g4_0OODmAsSj2?K3pwHQ00v(Q%%&_=TLE7W5mB&2M+$4wbaE~@-!Qr%PNC{ zS5X5#E-qU9P>UBcj3_B-@b?dI{ahKTQDc>pnK>*;?HZpIkA#Hz68!Pf>+$j`9l%Gt zy-2WbRy&(c2Y7^D1mHM1Wz-Q^tJT>Bzjv`pPSDW33iR6C)HvAc29R&2?CrSf95#*` zXj0t6->9N$du|7#);YQ?H6L#}_8yg_OTTfS@BQj>DRX+9+)7VprT*ZKZk03ZVr|V8 zA*Z5}Y~9$Dx4`>`zPVB z`Y*{Xx}^_@5%P!S)!g`w8-%<@7OA6o$dVd8ni@SE0--S;$vS#p)gTld@U)4U-VEU= zf3mAO2}zo~DD02zX0S!pt;q`%j*ezUk&(RIkQ_I>Q*pbCKc!ybI$6LdDjKUEx zM|}mQ1;_K=Qe#roP5zs;#c!SdrP;s!_r?aZ@NOL@@dh0Y&l&sfmOZXfp?Xxk_A-6z z+!&ivR1_`0XHm4bU+2RP7b?{`4}bGA;ZxC^n2XD`=}qj{t0nu#`-6tV!DK!SmA+^7 zBg1=F$EzlSBC&1dC*`|!buV6=@9)zlF3_8oPBA3lGLD zFJ(-@MIuBG+~40Lmx?zqGZS{)!Px<7KP6Ecw@hPHx=))@BAeflDGM??nYjY3|`vlA9fcN=(mW@XVZ^kK~L-(>qHwQ^X1{*&j)t& zu&BX>YCGFtV>HkSR9SmO5-V7G@UEa>U{3PEpWQ*<;i^UR)b-$<3RFBF7)oj+*hXM` zEnl}>k)7nT_{Qx?UH|9xEu|G{p9sA5l|%Q7#5oIgF$IPV zO{p~Ea8`Moq9ThBllUzk*2TKWc-Oj0Nq+TM^;$Vu8#a=REWeqT32}A7coHmbR3aiG zz-i59H#$!!K3?nn%xpO$yX97IbU{ACSvj2|P^R(Am~0XGJl<>TAMJgLqgCC;%Lu>s zNEC=vq0XW*_<=F(P6>Bu84GFpr4 zfnFT8G&mfRYEILpgPor?Suh(<;Xokmc@Y7jQvufODByW@A}12FapMdw0AE=UqLymR zzcmybW;Mut>H}P1+21HnG2Q+2-4WeEh2sMq5~eD+$&3H&S%3F0U>|`2T@EZ_aVb;N z^m<9%Y)_>$#KQLoD6BUV+uvSTVkb?MUd&myD5g`cQ7pr6_tQx!?^}dxqBIfy)?#e{@T|buGR8FWz0&VhzLSE)JscrVX`u9 z>iyBD1#7;Q%`Jk8{R)g1F8T)}_r?)J2Wt8HJ4VIZt4qeE!yF_0@RgU}cvCm}?Y%a~ z9T_ZM>GbsvvcE=m-Kzcs)NFtuZCQhtBL27FIPn1y(&3F3Bs8q4dE|uRlnI%fmXefj zRps|_Maf5#^h>+rAAagqcBcCJ;j*OZ&w$Ec7G~BZ2=UYP55URnZx28aW%~4lV3RkK zI>n$A#$v>4g87ki(=gg6rv%DoWj384az<8N%U8K!$8YLR!R^#Z)oX$s0XMRMQlEH?I< z_09z2^!WHVdE|(set20^6Q0zWHc;uw%)A~cp6)L`*~xlKS-GMOAvyN*t7OT%SpnY=;H#RkIU2uwTv^Y7ziVtO@l%(RY1H@3@p`;o zBe1yJ4be(a;cc*aMu1FK(tpB{h20s~eHziy*wF>z`NV$=H!vdFnC^66dm4=-D%>UQ z996JfrFZM4;3?Mj=j+P%F->`x)!vlYRmd*7)m;5?1;Zr}1#y*1C5z@sbB+L#R>YWc?7PKw)lkshMWf#S9 zFSO`mv`n38N|&Zj5dO>BGRi^@Bm9>9=WKu>L9F6qpMKD;bD+B3Oz|9f72(A%6MfsE z<0EULrU=TLJ#=J&yU*e62vl&a3=KA zetcp9JF_f>$wU%mV6Y~T*2I$%jblzLdt+*UibuZQ=~Bm~DDQQ5b5$c?$js5iJ_P&j zcqv_HH4;XQ+ci$aTNG;O+G~eNB0K;3IJxDzV`^^0ZFt8qE(LIsc@&)W6j(82tfcv> zsA3I~>^v`LXk+Z$k3?SS=N76T@|*kC^&}M7GvG~`ZuPBO;~N7&^Ox;YKZIGwLmKZM zsQCFCZIWV$+OcQN5)N}V#MM4s@-f&+m$Kd$CILvP_79tK+K4v3)tkFb&o_P?RuaMd zF%f@M?u-TO>(jR3LnP)cGWaQT)y6dprZVzkr#FC_FSEWpg8K4Hf^b@E*W{Z5DgeZx z9mB6|n>fXzYu{A{qYrUL#5k&%fhn=QY<9D4`Hp2w(8dcT7^R{@UMX(XDaT ztDyvsH&;IUK)qSk$z9{|{1W6fZu^*V$EJGF`Fpbmm%|+?f^y_Cdu6{0u<}vBOw5pT z5qQNV2u^!F%rQ7Dpf(&0Iq~jVi+oRNT=nvBSj6d8tGyf|C`uHofa&3>)( ze6F;1{xOY7F)J9KTpRv0?buX4)^^CqQcDEctp%c*74h#lrJL zS6gWF-Abq<>(sb;oBB8M4ZEFmT60QS}lII1HH2?OB{t-L z^zrX7Z(>1(zOBP#PmbAwlkaNXU#H!mF}9|RDKO!}-#9}w^u7J+VpYyNkI_uA>gxBb z8BIxwO3EXz57(33vNbd+8tMlkHY)o}Ralrai!5{leVgu^#&Rwf`DuTfcM!~3h~SA2 zhq9N;vDtwP?Q_XjQDAD8cij%akS$GJcU_v z$Sfj6Uqq^SMfZ}^SHJMEO_{_>cs0;bNlsK95<)E8t03Tfo;Go;X;^~6e=EUxnJ146% zOx_iQB^C6!Pztz>Rn>Uc*x%p(pAXA^;Z2p?C?x2w5fC(bjfX?F8a{5&J!ngI7Y|U!S3+w@Y8*nT%RlECpefh zJ}_0Fvj1PP=#yDU6BJ~8nb;WUf$LJdeisAq7s;uq3F#Nh=PAaeZUYoAqjNQfDQE|~ z7{iykL7$tN7QP`4#XaT-_z4`fl7#Z2;3MnlnF`^U#a4}NS%(vY+=tHG9*$ZGa{Is9 zKALQXc-tBpP5}7&xy^CYv?gY?(V`JbJwnC>nqTM{o_Rq8$+TG96OP&Nn4$?AY?9@kP|MFzPBXZ>8B*euXgEEfo;&Y{R(Z&imzj-yC(!=433n0vB+32$0ZIU!Bp`9G#9)GeksUS_n*5EnT z)2_Ej8r}y(?42#l^L- z;t!ZLwP>_wBY8y}KFk{3o1b4;Sh!&{$)=$(w`@9QLQY{ZQl*ydgZNidQc#@Nzc6Cg zuf0m6wd46dSWj8ycio>uc#xh}~+rR-(VtNNO~$*f{%Mci7^21;?RZ zVYy}gIM1E}pE0_l7_sPVI(FQczIK`HddBDSb;{gxJ}+rVTCdDNKIv{zVt4&oQA5j4 zz}?Kl9p89r{J3qZ`DXjHs$zm|O(Q#mUwiS{XOh6Y-rf8{dG>)*JOS$kHy(b4ZC#Q} z9H7YdYVLG~beei6AoCIRvB8{ZYW*aLK#{y$da>U1J~n_V9j(`Fcc8nxf~6s9uLZJV zNugu>5Q;9oo4p`zl_S2-Q@g>nipVYrzT&j1?6)TQfDw9=|J@#*e$X{R)+MS;TW4x) znuFowD9HILdeX_ zymMUiqc!~&BLMVVh-Lr3yo|e)C(6r@aRh6l*Fr@grDEfYC z$1qG!$YFpU?@6KCh#2kXJ`iF*r<36u^y5WknUNrD^qrEot|rBOToK$mi47e)i)wMd zXc<{l4F7+0eFab*%eFQaGUpQ?U|bHX<4h+>TgNUlAd|)_$B3-uFtD2$xJIR%u+u$svS%P3SD<;zfDyXzfWur zvsm3*>3P?lz~GyPi}^P5y(h3)Da+Fpzdr*!i$`0(GB7&dAtI_Y(ku`bwDOSCFMz~i zE6=OR8sojakeA(j^Nk&o-LpRa7_0g)&(?Sn(T?C>$j;lf`%0@~rBf_BE-NeUOqro$ z+NYeJ*6Q}YlI{B0TlaMG$8pm8Bo@Qhw8)I8&2=tAw95*>teM?R3%?aQ{=ZkULnAN- zsDD-n5HR5w5a6c#d-0kH-HXgMJynZf5ZUu;;{^%|0?y+C@Jt-~!Xn+t@waYNaz4)2 zVSnGZ@R7l6FNf1d`?S*OLp42b(Q<`c*i7mAy1K6C=aYb7gm0gyq%uFUxF4#c`SLg$ zLLi-3tpVdzXilkxXoNsrwKoQ&4FZVhxk2pHz}}%FE5>wuP#p9DGciw)0M%4f9!j zuX`R_)H!wxN|wjxuX+#}*JP2`bGW{|`1*X>v)wIXyl47L-<-{1ITqVk#(FKG2#n{^ zy`7W3_CExJe-|ML^}m#G24xr^PO1E`n)8yGnRs=>c|XC?R$xKJBG{QHomK?%kH+~~ z9PDt00F|TBV;(1}fbK|J=OXQr$Ut=hbq z%Fx`%Cl1%@{05FtQEq+nK%LuHb)o! zJ6QIarMT+`qxt_Vs{i`q#|3Kb4^)ZZDWrwqpRPyiZ>Ya2lmJCoucM>ox42!q73On19uWwSjEnJybG`I8qmPqG6G^*9_Hj_illr`u8^PKbC0_h@bqRw@Cj{?@zKnmG1js zf3L>IKDI^Q-P0Q#8t*cUnWAEcbGTrchi@4*M}l|`2C4WzKwA*#&%R)Xg#SoI;H|+Q zp}my}wE+CS*cZ^;!p@@tOmttjWy_wAMG?CO_igwgKU5G$q(ddJY3!pT8F@<&%NbNJ z5uK?ijejq1e=}xFI?ONje?9zq41olKckGGu4g^+!Uu9u3_Sqm#Lab&;N1?+yqeRj| zBF^91umSe(oC(bPA}SV{H}gnRR^GM;ByXa8M+Dh(ilGc^8k7dU&sMHn2;m{}{=C4YmFwssN&( z{v(nAh}+|-^evDo^&gQLGFgmfd2gTxUJ$x!u(FXpfUC_XGv8JQ&c|8YY0V(HD+%N0#_I5!YL-TJ+eUk>6|34;Qp8`by zWU;0b5|{u16zS_%Fd^xeZ-kCeMYO=HDQh@bqU$0$1KzsdvO6vG0&#rRXjPqaVf=gvjU z{@g%;`bW-O9zuHn31|u%tmVt?PhI@EAk6&f{5YSCvI=gA0BI8de zFQ9M9xBKFU0G!y{G!VK^onp}71XI*tC4Vw0{jclKQa1C~Qszq2_6bNF1u$PR;VmAv zc%c0RHjsW5=GbxkhW*2xU*$kpfi3*+OP>N&07SjJ6ABo$`M{vAU|$Hk;imoH$^HI~Q~%FLKNIIL6-O=?poe)i znd0|W98amT7j%i1JB{SHBOy(Rfw=!i9~pT5@FUMX@n6HK2ciGhi2q$15WYf{HoJ(~ zjG5Yu0a1hdR_$rY_V(1W$j&YjdD2)&XeEHtM07vil6cec(;9KJg$_*j+sU>edlfYL ziK2kdB=lyR;PTRB00nImC|CX*=fB3o-#{4HBZGSCY2?4} zyU0NPv5PQdz=UWMt5&#s_X3L1Mfo}iuD8t4yW330Z{WNtJZ27xsMX+LYHtw^$zCxZ zzeJ)Aib7dgQM;7T@5Wrw*U^ zcCu6$u>qIh>r~Qt&i%djrfsWEpL4_8w)H&G>__IU$g&xC+DDZJ-d>(ruWPhsx95cK z93Ps)gHx(|oGWLsKhi>}&zh(oJXd#$NhhDeKX~?*n83s2?O$u27!fGB)r~XU z@B8l8VtPHD0%^JTv(nLv&f6U=X;nTR9g<%Uza@C&rp#<0V*b)ndo%p3W|#Y!SNp*L z^9qXJX}Ld4ozo*i27mI^c}eDoPQK8!js)?OM{ZsglhD?uAi?=|+y2<(4UR|)5X~VV zE{+`_BMWxINLS!Ebcily%|>^3Lp%m0L|Wp28uxJN9T64W?-1|Q;2PI$vz$bYi_Qkoel>yttu<6-rjgD^=3hd7dZUCOw=|~qV`+eu@Q-H8r^KT$+`2!QjwL-i0 zmrBmikprz0g75WQW2})gRcJAd#`}+`+A=U#d_Cz**1b=wmo0?c1Ip{6>lLqA?yq`=wFN|qjM zqDTxXt~F*1IH<4?MPx*}MY7qYDyL4byhwb~Um94IiCh4g^r)EFDew}Kn&&8WE7@7Rs>NoZ{2TK@CZs)c})6jVvPdz(qASViW;;cYH=^iDUItqA`EHH;($;2sDBEYJ@W`m-L` z^O_%K*PA%-tSz9_|B9;KOkkZ*YS3)5FPC0(^TgT93CR=jz}^N4T&hK&IojL8Ds?Kv zB^zE&7_6Q}q#Xyp0bomAKABW;I4z4X=ZY%z+L)jxe|-oRfFiP{p|jXxYu9pH#n`5) zW5rOl;OM)S#SyI=Ve^<=o*V3);H4=Vy{rsXw>CAkEIRQVobMf7TP3`ecU*112}ums z;mx4M2}rJpoWcS}hZ@h`vD!hw^6@pZO7fSd^CoG-$X``|(eZx8TN4ppTa(O&k2o1g z%t~IGNW&Bmevh=s#*-|)U{FfFAOD74NMK|(jI*;Ih#c7Hch#Z@C9Y9JFiNurgu~v7z?TvucDNnT{InD z+6`s!B1HvN40l6KyySI9g}SHB1eOZo#8zjQ4BfV?G*x+P=tw#nv4QWH4r@8b!ZOA| zg}1Z0a^Z)?p0Tqk3$v>1#}Cp)o{qu_`IY{}0+Wk`hhEj%bdn=w1bs_pVLp>fHBGmi z-6?o{|B_2nslON|1wq_WF7%xcfip~k3jN*eVuHHT=JVT$zx}A|aomMs^-Y3p!opNv zwvd+#O)Bl-bfl=Jj=VuY-mO+Xz3()kyH1`wx~UU* zYVUjYl{hrl!eWbIn`N^?N)N!N!p|Dhu}WpNUG@gji=LiZD-$c-G(-5`lJcaEe+qPz)&`NDmUds&UG|b z9t$(Ew$;)s!0czo$9NwKlRaT`FlD#Z$X}yb2%(`R*OQX*YKQ&-7m(#{;e5*bAY1?a zJF3<)cDe?%?4iN9ikb#=kWlQ<;$q-?DnP#`AhR+*V9lHy>Y;nb?Jry(h49zHS9aJ*d|1b0RnD2#t|K|g^L^Hogh~GOLj7fh zVAA-@&nICw)GlZ7$e{aJ2X-Lo`~F>Y~rA4Hl*Mp(-t5r)`2`-WW7KDn9#Fp3b5LN%Y)8 zkKkmg?(Xhl2hHSnQEEOqw#;n6o?(&y$bHLWgJIl+OGq#?ox#th0E%R{_aR`F-ht_la{b4%QF@g!8PlSy52f6eo%DEdn6=3CqSoRP9!_*9cFcD1#c9-o5 zY7XUX?F?WGqba!JaMYF-4qHwepdp|$KMDSN?;4t8d1YEISp|K@gxo#_ci&2kWa(hy zn)$spWFa2W3R{d4;Ym1$) zrMcjgMgB{Iar(~hT;c=eZ1QHYiT_{$CYcg6F)XZ2SSKBk!_;MTXI^teQ**(Ux80;CY&|S#)xX=`kxJGCZ$d7DL)ul4|=s(LtWfQZU(>MFwBf@+qB%#oz5I zI>SPAeq&Vo49IJH-)OpY6(z6$ENSOX*P7Er-3u!s&>an}2Yz>oX}1~0W|m~kU(bZI zvY7h1^Ya5wkt5r8JzOiKtY&1P5j}Req2l6RblN+N@@{X!=F(gy3AoRLE~+AF1%e?jJc9kVIsy|cXiOz(;6-lecIO}ZT= zJz?zc(i)hjWC|pw2`D;bQYQg~3i6YirV9Rq&u>K>HzvpfkeDu_Of0*My z-?Y&HGj;N$v&tDS`#AVbQd{oS7l2c6NhXu=>5skgESMVygd^AUecg6<2YfF#HwoY3HYL9bz zq0gN9pE(dx5#KJiIur5rM*^hm#hh5o5ABB*8X~outo^g|HLM)t3xbeP#j{IPM)SCI zI**$DboKB%rq7em_TYt{Rkn|FPBgc6kAHh;sww?WRXoEQEp~R6t@wRGUn@TQoH(6Z zwXG@%)VQSr(a(FPt1W$KVONQh90!}gilzwtygi?Ru|#F`G+y~!dhmy#HL82CM&{kn zjJI$N*C^?18|&;XF9+7MYYVM~^4(t&b?`OYnYdPa1@AmsjF*%Q*iP94mQ^OEd?+=4 zVf||>3mN67znLZ^O~5b<{YwuC2ogQ6gr0e9oVDxBT=qrzZd6p{AXU}c^}jLfB0z-Mg_8jYVV5;(!`GP;45kaP8l4#n8?X82IBgS z0(PghU0u@Utl3jHZVL?7>>n&3a*Lzu8?NA^6{2N=DT=V}Qwq(c*ZYk43OX7Ja>hOV zSD})+kDr3Q`vWD8Lne7x-xz{$=UacC26lSVD@#~8D8iDsOI`&>nM!z$0+2`Rq zQB^HA8wE)-n)e3b+>>*s$T*fWif-q>OwTW)*4#Ip1W^f1yS_~`AKhioAB$bvDqMvA zaTek;lTjd70iZV!gn$LAAWaCB^ zwmD2ypS35$<57~RT;6C_Sis(Ud2HKiJfw74jvG<_vPJ3R;B88;W!tF7KQ6D^Cp8zwWt)27QjjkT>{Z{2)fT-r4b(2~EwOTSDz z4fow`!PnXiRB9Et)z~!Qa@0ICzhJP65wYK$>Y`$9%-8ViWJfQAnMg}V# zx~8Tc2*Y_Pce(QH(`KCu__8Gy;4O`yuDfrl`vjyGH*cd%O@r|wCqV$p1(mX{Ve8+r z2d__BsK;jNmo9jUto6G+EK?c^rzl=?q4y8KV!E%j@dpf z@VW}3dj>yiIKYmGB0d*ZghTubm;U?(G!g$3_#DadA5RQ_LIM4PHn;M&t*eKqDbi0h z-`g&l`h8gdI5#5F&k6;N-KO}=0%_@u?B`4ex*MO?r2KF(K+xTx4s*S#?c6qAdrQ}h zcK=|u5TKFTv#%XDidj%bf4Rf8xZ#c(;)kck&R9#%x$DjlJ6y%nTWfMoj`Eyd zF_-~;X<-H@U>!}Wql^rAu!i#i`**=Ft3h?gvv%?TEz2=z!u^MFga(2{47sA2mmGw8 z;{7on2loha!ioBW=bH94)BE+VEL85k-cf1i8OJ=RPJ0VpcbDDXRfQeOTOUkh&!C%h z!m#fZBo{Q1JywYYJXnpJ-Uia?wYWCJ*w-$u^J7ko2k!yM+!j>Ph0QdnnEm3aZl)Up z-h=f^=DNj8(%gRaoM;ObS`wa8G#BoQ%)UtY2nufNA6BukB^%hoQWH7t3yy8eXLoqb z$NE-sC+JyEWR-1^WF-v=1p~e*%7P)Gc9-6`Mtx`aDdSP=WjA_W4owMoi^}m5R&`N$ ze2L=JZR_kS0ej{j&{}}5r$co)i^lD~(qfg}G6Xr61kqyv%H%HajA^_`G4fNnu_9#c zm0t|~YhG0%wL=o)mPBA1lrxV9%wLuQp&`UtOz(#D&V8rt3nqwNAs}kp7ZpgHoWs( z)!5f>u$1JA0M&^8?ec^D>9_kQ!caj)09cnS zE{<9=LFn4M?IL`PsQa1&szq+j8RwO=A5v|{{wW$#aeS|0PmK}<{TsNl#qeR?Z(eBo zeYy2TQ!OS+6EM#~Dw79NQgP8Z90PcgTg{21_VpKg@`1jmYPtr?QfMO+%x1&(n2Xg} zUjC|jEmGAfO?*9_ZrDLRZ+U3eX5*icP!;1HE-&Rtud6*>1lO3*il| z8i*DuxA~1$CS3_>%7;eqe?S{=Q2`3WB;)Io*xFLe^s|^f&WSW^OX1@gc^oB3^HkII zVaHZQL)_=@gVLL0ulu4cu*Wl~a!j(pOUSqLy3*^D7&>^7-^t@50yFjYB*who*d<1%ZL15S2rAVJ^VS6IL zmM{XDhp|Lq8KFio`APJEpyPFx4RSBJm*gx zNNNMjlt=KJ&{RC8?}t(C9q=u;*)7b|PpD8kSih0iKp|hpx6}*AN-so~CNCjT!_nif zA=eF@!pQ_%x}sxR6s8(VTiyBQ)OVRcZRz5I_rg^f1A50;2}0Ioiy9M&P*S0vr2U!T zLfaGlO4X%7QX~|a!l7#~uatO>^7_5?^bkE7683eJv=1C?r`#az@1}Y1TH0hW`N?PU zgQRc5iz@UMuY`HPUmrj3U7G?p_YyNEX*eDI#R@_zi}AVNpLo2J>k^1Btk>(U()Yi4 z)pz_%t8q3)rb=T_K5X1xt9;=LnN-vb=7eJ(U0gce{Ix%@&%}c6?Yf2({Mi0&XYWYz zv^}&aLD7pWblTzaN-fZt*US4*ayiNS9P9;3qEtd+xOI0nq2PjUJ;ApW3DE0Px_C-g zdeTN%y%6wb@(a{x$ezO0+`Pilr@IW#n3ldplDM#M`P)9O$j?aB8Z>tDzD2_k>+-Dz)kawcin;T)GR4(}Rh+A!$rXd-8b{v)FO* z<|0b9{nflhkLjoY7uusA1EBh@0S+Bdj6())U&TGaRHIPW1VvO{NWipqq&it)-)>BhS6sE1* zvnt}=96s$E{mg(_0kVK^Fou83A^VQuMnw32m9fA4^lh2``OoTc-g0xk_&K=6O1wnd z@C>1Y?gpPVu`(QtcKcp{xNxSda@bSBF95mWFhH%D0j?o*@oss}&BS(Cp3>_O!-cwr zAU3_i?qy#DU6oXk(mv9IZ!A@!E{b#)IX9>>l9ha-%b!s2cN&uir%RU|9sgvd`z2~D z>Nv@QT$ag0!#EhR85f+y5j}xmu9c5`UVsgif6m>(> z{8f77D+gOzVRHj3g}82=h!Hhh9~Jzy=@Y5mtV?j|6{pj1^C4EFA@lpr;6GTvl~TDX zAODJqbM;&iNguvq_9xAQFHifwe1Z_C z3G?we+eUH;gOzpCJgYzX8Gw7!U7C}V7vCG#0nki4V$zfwoj3a2Ua;Dc>-IeqeWZ}< zt#8_qvg{@V36SqIe0Ee1uwOeYvD|!T+Vx}HC0hu78cv$DQ3B&KLZ^mMmy<)^d`Eq7dd*}+(&OqkslC%|?>eh+1;Ki!F23eDg zP2@<97G3+zZxa^y);YEHeQBJtGxNNJ$4VV9#CCGJd(WR@2@9QVK2Mf%x|%3=mp_J( zYYEpMO!!&jV8L3;5n%W>Dzb#wb6}iC#?> zJ06F)SwC*GmYcTL;ufTMrDs2Bv}zCiJkqpG1@ri0G2ll| z1l?DDdY@Bqy}T*(Do`?B?XFst7|DGo8kC!d_PsCoCV72;pG|8^U|5_}^CX>AwbVC} zFju}mdD-|ayfCbFs%*$KquLAoDs&_;xveNycb60=WU?#{#j1KU#02T3G(;y|fL|dt-6u;D)@m!{(3c2wvfCU&K6);^z50oye!C z+RNKk5^ZVGYHBUyN{fMgPoV4^Ig&WC>gsYUjXiI(TIX;VCXR=Im~m)pH}bk*BNC0W z7q3{0okZ_V<{%bwpe}CTtom}?w$(R|y^)8xr*xxr9+8^D9lpnpILp#tb6cUeOmj3e zW51>_eg5_@MpM4BA0mA@ILWWbX$V5HTA2)gD1%F0!zgL8-|ER;rinrtlIWGMxV0Z#`CKr_7@+0vt>z?7#)&nugICku)0 zM>fq?a-=6Gwb87*a_Vr3KZcm^U_ciqpl{Us#Qfz2`QQE}#7Ta!L}0I`xA^y+EEgA} z`--_RZNtnK2@N!h_x;1t3wA0CCoO~h)P{dKY73`>utU1~a>36dD>}M=Oq{JUtb!Ns z%@AB>GBcvaUsvq3yV{0EhOgYi^M9SCV=+u)^4USDB^ekDL(=f}`Mu6-Uu$n?v+BxH z7&nl(l(W)$`p#!3H3~4Hp-n>DNSIu=Fp;X9S2_5CRx?#0GXe&X-RobdyQwxQ{&0%$ zv^y^jcC}e~aF>E7WSc>U3@_ABtGAN6DG_>aL{SZgw3Wx9PKw;X*Ux=PlIx38j;GfeE9jhE~6i9Clq*t$pyF7u9*B=4#o979)1!x8M9KKAKG04Bz@)jTr!(X_&L6h8ol)E^+lO-yxr-jd{THFW-x44Df z0h)5LBTAIuKDpw8KF2SvdLFAIVq|6wD>79{hH5C(WV0pOD|H_2WhPBsd|_s0o8#9C zGlwL^ohflh*P+R%jA2+qV^hTv|+I zJTBSeBvspG;ELEN77MRM=-RES6W zFjY;_BQz+`M!O?)asGE;%ret6YE^en2(9&Pv82TKdcVp!zWIAipD%Y6dX_G=f4gNem_vw3^k#O?h)E1i%l_>R zg8(Lq=Ip!V%XC})f%S1cVL!Tet#f>b0AKKzR4G7;+4pMSanpoJS8gigI(QV9Ts@7g zivO_-0!CC+yK)Nnq0}C&O|x6%lQ?gT%loS1f<0FQ2M?D+jZ1Xz&_q^1LZ3~K(atdi zEvTYlzut_0wu;kiLW~i=ZqJb=tD5nhjFUA;O3dEIS@wJwPP8E^zd5^*WN)g=_naTa z_s}>uVLdEv=-@|DA(bH-($j1CH(gV0hKQ6G-g*wMSq)wX%GT6@CHlLTLABL5*K=ja zJDMwg%)(N=*D+gFlov`kB79XTB+rMkR5f++i628y#ensah7oeneOu7_{mPKjAK=xC zzS0^`K>-)|lGN25xBaOoir=HI3i@u70~;()hU=fsgTF=ejTu2k8#eK;yu2Me3uw@_ z^b`G3UDrj>)VxhSwBny%=+z$KHOLVa{HPeA#$MJBB;!Yndrp@(@iuj%F)|WqPq`N`fJdzrLW& zu61PzCo}FMf`DpxdiG}SS5#;fO#S*jykQ$!g-XRG9K<9lNg!KFsmj zoi};t5=5G)T#mQJ{$;&WTrNXyoT|bi28H}!UHdGf_uzT@&{^er%a#57<51yu>TX6J zFq_iS3g^wZOYP})+q5X{cwX4EW}3-f*i-;iVmUg*Ya03UP%~xyfZl~^N^E- z%gq=Cd^2~PR`xeQ&FWlH)5%ZmjmtNaAyA`V_7o3hj}>9m&wD5NZJVm7giUM+QC0b( z1!V;SNoq3kN@i+^YG(K2>YBg0qF&&QY;1VzZ7epPq(_!Cc8smdDvh?}%`j+*ZTCiS z*Rg=0hPVF+P-!Xb>sz4rbIvQq7k*Yr8rOXg=y>JMdP!in;-?h|z@R?V=vJ5Y`rD69 zK;IAO`*fB^t~3Dv!?NWwBtMn;qyDp5cQnZ=Q2 zgBc#t*jPBmVi2k5Tas3iUnPYW8K5Fukh^NYyoK(^vFP$+xm`8vQ9_wi#5)x2X8O0B`aJ>B~3+GS9#f7 zN=e@Ao-ge<%X>$RX)#gFSN7?VXh5?8_KCVlQ0>G?(QJG>VpscKoP!9K9_Ok9;0y*_W0=2h&7)}YkSn%E1jC#yOu=y{;_MvVnLe1F89S9 zgNcGiZ7)mku6Adm2q}g3(xWSFY&aO%P1#o?BP$g}uL4U9vs85e5wnW}C~lseowWK*@Z?4ehs90)!A&TxH5KO++%eO^qtN&-er1 zp)XyhSYq^s?xV*0^j%g<&@|<)Obk*K6J7J3f$;%dU0Y8QjqLy%70gin8E72jHjk@f za>6}#_QQ7~JWxVI*7U$mV8~(_xzWCd3l0eumX6Ibe*+&I(9exrcy3HeN)c7bJTRRj z`smA~k|y=!7#(@vv{~3|M9wFm5!4B$)e~A>E7H==w$dgcL6vp2tfblkXjE==xzJS= zvxP(UfPA!ASGB*zoTRh;v=C>-k|i`WL}5vrd}kw} z=NZ}4t;Q=2K=sPOSt+W$Z?2`)MkmXyB=aJzR)>0R0bYl-VRu27))ZOa z_2Y%5CvAg$E&jajX9o{f@Q&sF0i*4H*9@;YUox>C^p7Hb9`5Tc33)iq4Bb0vTjlJ; zq?4Z=%jQ~5dY_l|AaNLe;sB9ONawjVd-D*-x4XM<3ctH-&$N3p&LsYTm;hz3_Nq7d9fllHm9L}5%yM-sp z=7t>ifQQPD#@sH+f3N`e`xkcSQE)lcij^Wz#KZaAxeszLP^DfVIHNCuVqRuOETG&* z_s!FvfZZ=3DGic04{ubv{yY^#NmC#&pO@=XgF4?Ehi40{q*4#7ilsPeSxclXCI>&DS48vsez_ChcWM{JD9yUtxfWJ>8rb_f6aQN9bXOlInr{D^ zP)Aqmw{01*$b=Mbs32O++UvWPLd5T`Z;uoXM@tuR$EEyO02guR&nCQZ>W$58WsuD3 zQ_F1M*TYO|SvZ>6xKi3#$tvkPlQJHkqJ+)Nr^1;jnUrLFmnj9o(KBFmAjb42*Tu%V zUsJTiplS&<_XVX{u8+v{fKZNxiEXhtS>q}pJgN1vne9&-8yFuco1nIWtmsviI`$sP z6)ZQbI}~@4pDyv^v*V|$B}Lzt%O2fZHB2eHmA)jMk2pIkDni14guLNtRd~qHP!Uj( zt){+5t9!g>%s<*)qPQcyl_I@8tN4(H<6TDiJhYe}N-NUu&Im6PzFq~d1>u?yEd;BH zM39Q8ro6+kf61iI%b+yA$q|iR^~`MLX+vs_%0Ku*c&9=$CCm);93U-J77JW=#LwOW z7|i$aZr4KTRO;}E%_RcFIAsIS6E&7jM>f$p`2%s2M%wmw)-)K3O8pb59OqCIlY!2T zwb?lP6+_8Qjl;&*#FDYWcLYf0MS^-gk5JjVSH-O}g^jMq*y&n@HjojMNrfhRQlXN- zSX1lYTq)REdTzw!j>SyZ8YR~2Ke_K$6J*V>|ctrW_a3Uz=({5#*f@b(lOK_ z2Wc)D2@42mRiwi^;)Yh2*l9f8MuNR9#w6qHX$Yeyi@zDsZEcpJzcj#R;-62T9jYgw zsnrTE>W=<0seXs7guzcw4>2pO3QIp! zMAk!g0T%ZrmdMv3sx^%krLfwaC&_8PI(AN7wnKMM5)FbcqcPwEemgOoyC|(`zD1Va z1^dY3VJ~kpK&FlX=Y4tp9;Jyt%8S&*BL(&2H;M=BiVSRy9%yqbRC<^lI_mZ|XY4zQ zRh!Q2m8@Az^D~uNMth$uAu4+PuS8waN6XW^E18^6-MMu#+>>$;jBlhlEpO4h`qQxf@S&(Zz`@*$UyBcV?OozA8 zwB~8y8-W>xUcLddjNVDlAp!p8dV;BJ2#*`IR%G(fgu;)S6UAz8HoMP zKQn-~liydi8u&eWy6)w)HkW5Mhuhlk{$LJN=R5|ox6WBco8>1HU}eOqezhUdlrSQh z0ck?-$&Csm0J)(tqtBg7yCXVaN1gl{wmxhtb*eHPWAfY;CZ$Xpb?y=}1>eRuZT@(2QtnR}wP;7P|1bpREdt{jvU7N-75B)ZLZakdb4Oub2 zWw10+Tg2%!HVLV^zdsA5*V_@mvjH)+tU{OiEcf~GVomb{TRWj;bL+(RPz}eY&7Mc2 z($+l|1xq6nQLE&v74!$y3RO*=E#GOb+N--l)y8PvyxB}Nvt1P}UekA! zw=hi1bF~5j@?-9fx-os37lP*p2C8&$>UW2e*($W|WO8r`<4yx764Et zZGpx;Jgj*VN^;bC3#4T-4zSWCu*? z0X@tN31TXVtky-(Qxb@jc=*m2 zElN}R{i#^VaOHC3t`{QFq-wS%3?c7_qQi<4O3G;HwU>T8dC-h7UCaMbtjyRFT)K0sV8%IMl(g^PDt_^3;zoWM1e>S>G!L-~lU_=t zm+1t7iD>;APB3g^)jX~Vq?fmo@-bh(cquJSe?eOcUQ7en13DzO)w5MiN1Tr!07vc= zU%elf%7HJlJ7vD&grmO&>zO7^@xz-XJImQ6H(YO{?$rJMY#4tfPVw$wy@U~${I?gs zZPMc;|F}W4w*s%+?YUZYmw=?0CHmX_LuMW)c|GAlvfvvLsU&` z%kBPfrd_`!yyd{zaf^}+no0rXO>qKNYN6h3xis-=(9Ul!^Ql}8@jF{h|K*C&k>Moy z^0gV))OI(7NTA=X^ln(BeJv2~tJb|5a=K~_;J)u@x8E=u1W2bz2#k#^?3icJa8b?9 z$RS53u_hMba$iqY+H2kG#vt9)1og1Yl7G*5KYiY#rw#RR6WonJLL_G{?43W)rRt6C zEUoYB8x9@_O+?w0Gs1h4%*ONa-MN2o#g|lDCrn;pz!$Z%jT_*~^r!Pl+l$vG$=l2z z%EF?TFIX>fDPW%*Wl!8vN#lqY7p^L}%`^Q5fY%JdpwFfhtk3fB3Ulay8#g6{dh%A8 z^Q;JC@pa8Qb|z+R9WJF@Vr^?|Q<>6n7LX1@b-{Trt%+TqWVLt7JUrR5rYrz0P9NSl z zO?{O_c&9<8WE&ro8IMS%O_aC)-SoCm8++?ekGgi&PXthidp~>0>`*Bkh?7;TLPs$? z!rkm|YLV9wHX1&I#T)>2WP!9Mj7@EkZ}q+ZZ6?$~b1_uC-)Y5j;efyk&@O(S2BtfS zTN07SNUP|`(iB$96p8al6!og;^qw^}rsZg+2Z{))2FK(!FJ#VK$SjtzNkt;TWExAXZe@|^_Axh zdHnb97Yi^JtV~2-tT=I@Ek?NN*csckiBN~-iI_c}L%8MAJM!_p(^ZK{4auv2Vb%wL zd+FF5!%dv7`CfiE6l2}O&&$hl1tw~aD>!VkEje-SEOc1=uJEIhzU%SmeL~+3Z{=aD zHiL@tn|2h1I$P#IF!w}>uEF)~MKTp8toXVXA-E`es#DiQ$*uUPb3h_iSNFd>BbnE{ zBl;`S4MmfW3RC77z74Y!Cx1&4=ZB?y*%Bv7uTcfMIyzcP+xpeb=jb>&$p@LJeDc|2<=(aV zocqyY`$`zf)i!FylOGBr2cwBo%oLr*|x~rA#!??FSrKBr1 z1!fb(6eH49xPUWdxGM7YZqGVFiCQ8;;eeI+11^^q6{BNTt)Yoi3}@`Vwv1})o%pPo zPE}RxWb>G8cLj@ZzR7E&w(;t+woY1drt{V9m1AmL+w}l?Yg}YQTTVk(gu_*bncyw8 zmZ6>w8ZO$lrJ!$u11wXMb%zRI5kOK(G1i?Fce_>_IO%$^(&!vLQo{fQV*w`)7P;DDOpiDZSu>P*@Z4*S) zn{%gLT}u`?i;hup-KnIisGOrUa)>){j*Z;@LMgoI^*gz9K;D{NgH(6I@W982JMU;M z9Tx}Q;wrV%bA72JczyfzT%D+M^yz&d6CZc9bmmOju zKKk6(Y$wYXPbvq&%k_4MzuDH;Y=xcjb=;v4J-cL5ezDzbbbz;gcT()sogIkXy~Kw# z;P^x?4I%&$?lxzmZvmHR8c zj&8>Dw>22G#T{r|sb$5u^5k%nKCf-%IfJRYNY`sPyS-PJ#-<`E4T}VYxaXOr`cU%a z6-^F{#NmQ7ndRk`m5^8gA`45a8GuRQClVIu8sC1CanfdL2VeS;$#FjC+smjHS^E+2 zmfgj!X2V9_mR@|k6_iFC=rY<}6P>@K6i044kA91vwk%g?Kjnk=V|ndx8QR;IXD(2zf#8jquep#pg38LTQ_WtNBLy zQTCw2i{^u(i7#e>%u159>mZ?>i(av`hXq)AR)J%ej~@Q@z)@JUaQo8I7uvmo=T&~r z|3}wXKt;WEZv&zrh?In&bax|-bfYv3B|W5cNf~qqNOyO4BQ4!IlyrB)@cqDhy}tMU zzqMwuj^c7o?6d3a{XB5iNi=iGaZ$wyJyXtsd{0}bhrSFytH>1omWAtKN6iVgsM){a z3!|C;R#dGowlcZOz-UN0H74)O{4Eb7)tzM96)ON0U+!}35`uNe-?$2Qt2stdBm9Y zK7yT%;|`z1vj7J;mM-`~pidZZ2N2<|XVcJ!#=Q2@-}rhpJ&=D%50p2qlNFySb>C(z z$1l&p=9@`kWyi{4y6F%Vu$wnq+S;PJ;g&59EXr5MTn(Hrt%W-9m3x^2(MoHiC+y1} z$;A%27eMHFr$(08x?HIFFzKb^~<>258dE zdeBBSJ-(ymyu*H(a3^NJ(d=?(Sl7;|L6U)2xnmW;$i|QzhJlRtSiAf@0#{&c9_lQ9 z)@CtRgZG;)|xWVU73)6tYNYD+zS9%9^U65r*4vbafC9CfGGjX?*&) zXFwqF_CP=Y`ZbxjJ)){YYO@_#VH zjVdJ$@5gDHpf1{Zh!4fYb}U%H0p%BRM+q*H!Y2uro0%Ov?DqEb1qDxBbUc8*M^i-W zgcm|Z4;rd0nqNx~XhJm?K4CUk&Uj{`m`FRfIJlac;qC0!rsT}8IQZb_>ex=_y_csL z8+CB|vcWW&IV+{JELE<<=`;e|F5#!RpMs9~QPNiS$&z_1LC2HINQMs@H;zlDKQX=u zi@F4{yY^G4UBm|w&~GSgWa^v%z6~0B392jeC4r+Yw3MOJ4#i&``=v;gDFY>zNg3US zWK;QbAp)RHR}fv0hlt4rF?$XkkE?;eH_>KD2OyOmHF*FpC@2rtG)t%BOti>&CGSA2 z~*bJ{pIo#M_WuGc%xJI zfJpks6)Bl_4MPq%`{q=Ii&hPOAJSBKmyBQMJtsS1&(NBWR#7v{>2Gq{4nXCwyj=jg zYr=+)m+2zT3xy=tG~8aXIPNtzC_i^iP|#A;3tz zS-(fMNC!I1>gDiRi9D$${glZk(?-BN?m_^%eW;qGeK;&^3q5ZBWc%VpLZ4U+{`2Q2 z!io>xm8Mi~$_Z=PD(ag_m*vY&&&}NiMUs(c8LiEi*rezn+{{lSn!-+?2-#_KiVa$O z7Jh`GZa5ddtk_^zMp4Bgw0F)j*SSZfUn1CxA|nr zLq8$zfK*Dw{k=&kXoXlIdpwdeRi5!*TQ%T@73rvocwNnaccs90X5im#7QVxYI4fViF*k~_G)_+8e51=mCxHRk| zK21i4#J1$I^D(VdtiRSlCtlfTT0gC!ErTW4hM}q-`UE>pWAp|4iB)tIInY7KOiK`h z{&Q2;h*c^b`(aT*Ay{__2?W|wdlPR-lRk5hLnDiFYw$h9C%COMD{{__?Nl)S`-)q%x_vXzQqHN?egkFUYgxqKozYyShMRl&t=~!f4$U&hT z1IF=aI0YFU^tDXKn&v1?Q(BxfOSoAmYsnf~*c)0Xi`pAH+Z(DYx9{YZ&hRmfSt)mq z$Pcz&8Svj4gnaK)nm0fY^x}`|UIjTHzoD*XAC!NL3(4Zo_1tLlZ z+s73BD}R@a3JXs?Mt#yA=?Q)Q_^JiN{NByh!H8xXw;n)#>!HI@g`9$hP@0jFi2IV%3tE?I-@t^)!3Q zePsWukjJO2U{a(obN9*Gr_hp`T32(Ja!oBaazv!3$<`x>`TdIw_M-G4IaVA2Y&|&% z{pl*ay{^&JeDhefWgjz_MJ zk4JKV&Ek}3%))<6Uu_c9?|LH?k}*;zc7zOIuMg?TPQP`?PA?(McgYquOvhxpFa3M5 zp*D1jE|^@vM$YVh#@{~i6B-gsG21-QgkHQfBzjj20rYa0&!XT3-@It%fByJk?%DdI zVnenu5L`AYTx)!@KNqnF(m@Q5g%FMqkeWezco3WQ@~A##b6B);{PMzPeo8+gzwN5A z*dmsAp?Bpr3M7Xdw1drXt-nUxQVxFy(Bp_kB?-a8KU2XerGLxc&9H))dr`P_9RZa5F5!}QbVDbp z4CI&~ubLuT+EC9Z+^Za$^n|!Vd{25*9V4d*q^uCFqggoVCMU+e2bO=sF(ymmsdXHv zE3vk&8;C$xaJeMfnW*ClCL>#m8n1dxmq6()#$VykH(#0m0W7)9*LeE#sW3;l@rZ8` zPy<#XK?8(y@_cdo7nY_{Kcr@#_ao$eHL*WieS}6*x%_FIf46Yd#TFAkc9qw)5*6h; zHn~=IvhyR~L5tI2a$BvOBsMX30I$Tuuak_>R8S$hPiybQa`wkmt#B37+8Kq|tCMX` zgeuGV($Ft$3`P^v@bEsLP5p~7Er7N-byfkgQ7iM#SKCi#B)pmj$%s&AX-H~5P-=iO z3KTNRX>QLIA~NbZ-WC<6dXgbNVS_FI16J?urp5sXLvHmRUxfUh-Hx6zD@Q*7&^wqg zVkP=(s3YuIbwAR)sYsC|rRx~sSH5_d0 z&oR>;OL8B)6JzaTf4OsnNAWR}=uR8Bi8osfP5W9KX&#@MxPNM~lzwL_m7@1aNt-M3 zT+3Ke5yfEj+UEEL&hadCH@H=YP`aCDG~QHAA<^StGStIz7TUl1Nqiu4KHrj*#MXFz zA)CBMg>OmNBhO|B>-JFj=TO7d+&pfT;ZlEtYe@X7ghWuPsgw_^>23yuh>XY^RYQQK zJ?!h{3}>!i4@5k3YS`|w#^CWpWFqoaF&1qSvSa3ul3}3cK&+`L1HbvOk%CRx%z26H zGT!cvC4Lovfg`3bno8%REB_t z7WN}TZ6-68mE`O|_P-jmJe#$IU@Y&{>#t8UA`uZTtlNuf20V09SPBnHXHQLs#kdG&~gRGo|L&pncV*9oBviz(%07@qN*i1o#O+&Tp15gws}cuE3RmJ zE7@rKL9GLth7+cyE4J)rH3o83u&QEJ>r%uB1^&iiQ>0((NY<1J(NNE5~jz4Z(>r&fjx3oD{ zv}LIayL(wXQ=61&+Qqv%ES#yHD)_J2I{&IL=yh4QlyrM?P2pq?C6(dRu_Wg!>y2EeJ#j<#}d&Kn&#E%wv z3z>N}a7lNY+TQkzFP~;`deG~qc^Z;%4lrwCV*~Q;f&lkGG?{qi+&C-1UIw#I99!PV z#GYb@427FOW?4MbbZng>JOG~Xc5VEV@g(orEEQ(UfJ;FtZt2nAhv4FD0F*E1$^EK*R zF%#~stv;TZqwBD~rCHgLu*=wK(;HEH5q68GfExT01B=NQeh>hE2Lf0s0CetbWtW2m zZlH1bF$nlq4P=9J{ZD{qFLT55&Msf&43b<-#c;0sBj`>8xkO~u`4;^5bT{|n(r@MPE4q? zS%b(&VmUGVoeKz?yDI9w9_Z72_I;H3T2g1PUs)}91aqKQy-PH>C%}@dD-j-~BFm0-gnF$}UB2 zd{uJq`l6$e{n3vadg&dyzHH=r^w@R6(8wsI6+EIKa~q?Vg$5K_=VY=O+aKN<(at`* zxP8}uHeGi+TKQZ~Q>2Dr1E*b@5RCFSfF=+@QF`wFmBak40DwXBdkRk&rY6TLJwKTD zI&VIs0G*rsWW_gX!wE*%a62V^Vv;?#?l+1dd0THwc6&idyat{Ss^Qjb&6U%O33;gY zsAwC2rd!B!wc|II8>-JwD1BeG_zULDYf%Em?XOOk-@s>H@9qH1_-ES1#G-F&26Uem z6SE<}wMH~ogmnwlTbu0V1l-ny-ELLHJ^Hax4nf6W;N4&CyvP{4`JR=ZA4qs^CMXzn z@wR88o65`pH0#D9|1z$|Wew7hr9wE$(BtUFVtFDiEgxZT{CMSmBpJYO1z_#|lx^VE z_tTx-sZ6?Jzoup3IK|zQ1Q1<&m)x1ip80h+yVTXzELwEk2;xv&`82<;($Jnb->nj0 zoN>MOI}5=hW8C36m@6UEXh=eQdG(Xla$(O8^@-U+i;ZRVzM>8;lfLb0#I}BuX_R7< z^7C>2^8d=LHyP}!`!2a(GbQ!Cn@)Av6*D{?8WLSWe$L=$Z329BOhru0k{oZ`INXsz zI`-7idFSv=JGS&zJd`ts_4m}awzjlpX5v{xPlNk4A7S79U++0FJ+1z={9k|k6Wfn8 z$Wu4n-s$u4MBAucYEhGiV6wN9^A+M35)hAT&~<;DlK2m)sEQ$d&2QWvQVT0jPYd*f z0^`L)(Bu3bL;n)!1xs?6rr*N-=ioOGrWhG40N{6IX$1yTH>#^CsR`ay$(dS#Kp?a7 z8%Z(@Wp=~bltuYXrgOD+347Kb}sb@OH97#aBo1lZ1-AROpuNB z(R-v7fL}iM-|2Y1A^}Ln#9xSzb6jt&)xl>1MdG`c>R;<;E17&8*r-n*%R#@n(l@kVWjAm!wzeTC z81oe*dLze4kKyl>paMn?(%@vDUF5W<&w*1;>#lwFh?212WAm((po*eHRqdlY$$AtF zfHXen#H0VM!JgQ{tpjFBp)UH&#{OgqJjs)B-o=|>n7689oD z-7+l2wO8Jw#>uZ^la;d|rY-E2z`~Kw{u(PAPkGf0K!bOL^{SixGG6+zZd%|K;G;4T z!M~@*Me8;B6Zcj(8dLBLnAcw)U3lP8$m!MIF-J~$W#mJ!xa_%4fZq8*AJ5}e ztIO=yS@-tL8y;2@$-B*RxJUB(=QuLvw|~AEm_c&U*#~Lcql)d` z`O?DGHSIK5E%mx>2T5j>T|91CHhG__Q&)FwX(V}w>&WJgrW*`3&Gc<~~gDx*;G0gp|M+DBg=`Fy^7)uZE@Qdd$aEz*C+ zTXt;~m->mmZXDlN;h>jNe}W+qM{gvrqdrwT2y}Mo&*Y=6{@U;lTXHYh>&9?Q_l32j zv4R78{y`?@ZnMtFw0Q?}n008JXVyZyAr!T5(nLp}9Tg@F;#!zV(}Imb4L9${(+dhT zb_TEg4-frIhYQo|<8#3Uh3tw{Xu&L;N$XqU4;m7%OepB_*t<1}nqeW&QEj{*!%D7l z4bM?h?lZxDwDfH5A_2S|1~}5Z0q^5+;tw0KSn>?&7$zxcD$*4qMA#Z%MEV@wP7FHs z@R}d|ya3ADwV7snWahc2Pts8=NJ^S}j~3fU?49#ehJYHqu=Qwyu2exYcHsohw(sG5 zGB31V230ieq}e_!;9AOb0imUo=T{4vmGsM8A*d9nSN$MTzx33nwDmsPuxPFeNACLX zg|FUv-258YvbKR;fBj~F*C?|`fR@$_Z#!KGQ;TN$jbgdhQjaOMcP>=p*VGnqT0 z9v?4mretkzn}qQ~4{TTvIW#Del3F6g-Nl|CYQSjL!&c|eu?=El_N^h?WbZtF}nG4sqm z6po?7A?3pMUU5>0^TP>5z6VwHwULJUn^ArfvA)fG+r&Eb?Xl`c{n`MCf-8}B|7vXI zXq82ld}e}a_XT?mC#-JM#_RHg?($o_%Tkxnn3zdHX7(-K=YfkK>NRDth>HLJHXs-< zsxQ31Yb&WL8yTfYDAu@Ad$N0+T05zkH5)|PT zm6bp_;JOhAgfDy4vNkBArKhL&lX=dz{!Cgd&iSNW{ zn-cpY8K6QhRx$v%Nh8_5vS_$+@EV7VoLXEw@h+bm0hP5b{0mE1+?H(XS<)p*MI_qV zerKA=n{eL(bBp{j(P%en>Wf~S`PI0bHCA@%cR1VdyP?vnwMf3p(?eFno8Scwy&rJ3 zQ=%v;%WSSW{fh-f;=%f@zCo0{Df-u2x$1Jg-rbaYkV1>A(G^5{@2?%@!gv>UM-Y^V z+z$!?0%oo8;Fy>*2!r=xuG7y_-HSNuk_3ZB#yHFw_m1g)(FEH_ad2>RVNEs9Zo#DG z%0j#8W*!H%BxKCZ{>#nmHqnsLLub-Zn9KhQE|=8LlNb9{SZ(jg2?MBW+JHXHs6Z&7 zBhVVl|MSj{Ik%dkqT(8JVF5k8Mg*8*Y!AZaCAh#m*CRmm)xRL&L$-{to0iz+O57LD z?3Ke(h1gZ{GZ%-q?_TQ*^QBlX^;aUI`-_Z^a~uz}w6y3$oJC09T$2R&>6r~`dHD|s zNK|hyzG6|hM`#NB_VLM!1=}Z8*xekC;gvc-0|$MxCLFr6OhX=0?U+!|-KCRf&=n%C z_eiO^D4%AjpzGmWI?4FfWM*DgN|;Z#@2gloD=kKTh^?f|J~^!h(n@0pf-HF!6xai2 zQ1%v@ob3OQ9@;gt-i@-Eq8Z>F8-QGBxRxhvh-sDzl`IM zwISQ8Yzwn|a#lPE19SsM7RX8h5UL`|?zz~p=p;WRAVrBqxoL@V5+m$it9)MSjdgt4 zx(QycNgRErg76D@+bdKWhVM7&;hi$|3YCO`U8r+xIvUckMb6vY?4GIecNPbyR#uKr zPe*omMuc;P??R^~U9~JMMAfMyRw*jZ8Y|eUM#skR@Z(-_mw;j0jeb7n5AO&%%jAm0 zRv`(s!Sy}m*fcfE?(;unp@_c$d`ylUC5mumWo46RZw+@;?AC?__bRsO_#gFlK!?|@ z9I*RFwH}ZY4Wf9Zs6kY8rp|jfPv&{n4$8WjzD9ueCWOU% zZVGVxdf&RMIBwtOag}DQ_EZr+!h~T%tIk7wF(o8#?4mHD7?-%vx|hqoz*h>Oa8A*2 zS_~9EuFpiMLxatsrXAglP#z@B8yBmNLC3qfaS~ra_4WKa7w}Woz96pi)T39g`KPsQ zRDlLY{)MZ!R?Si5S?UT<4{(;fT0WA9-m@zH#YN4&P|$XpPe|y~SbL|O404-8IQ!v7 z=2KFohJiNw)9~*OpCz_rDfx$PU?A$+wRn}su`_Nb(d6jbk+pPRM}-r--_Uj{n2~X# zn2m#iAV(-`W}pfz5&Ngm|6x}se- zG6@jaZLt2B@90;lC`SNGhNstWR|*o9msWx;EE*23PUcyPI7TNhD~#;%IGEW>N=q%R ztfC+_X(^+_(|RJlL4YUyv%M7$$;EP*;WpCx3zF=*`op_ggu73&91N)Sv#0DJNd)3g zz^!p^`aD-Ad{f_&IJ0jMoyIF&!qQ~rko=ICbAZfRX=RZ%ap$p0Y4OHER8IK{$G z^m@dqGLa6tY1Rs^#Ckd7xNe^F8I5+n3x|_F7>Q}(f^?esJf~u7oNp;hsak!SilpVB zkszMBy`{%EHfo;F_ERSf%jkHpJ1V2EQWO&-M?%RYttM%b<>iLIB>wX_(9HBYxr)$b znrxp>Fv`&adB}Y0&BC*(+D+C=2f8fCyJS-G@}tAi){j03m4fa*&+oe{f4lg=K#&sl z*{^`(4O}-!kqzbf2ROKt=01H$^}!rmN_J`LwwQaN*m0C&Xvb^YqBS6{!o`mZ#20uM zpXFF(%YKAqPv6rcwY52E?%UTFcFFA~+*Hr*ia?2p8D3jk+tKleU%ciU1WZF)C+j=3 z&Rp0*5&bD-0YJe0HH+jZc$v;@F|>yGzLnEyn~+jmi-4F;VY8@#Gi3uzJ#=o5NFL&` zoUDG%ZhI_R%&1~x&H_zb17Qzz)$|urbyu35lR8Cc*d7fbc_bPuBO#9HQ!S8dNalg&UG@9yI-T>HgT+i1 zgZS`fj<)_ZanOfa=iNv2Lli2+LwOU76Vd>}7+N(4K7g#)j(X*<{??%dgePpyV?iKc zBtR8YdMe-7K6@EB&*xO4Q3kDkAJKe^aWiboM{U45?~7aGuJpCPtK7(T^0#*R?danA z!!NKRdU}3@X_(EB(BrFy5A+R6m?gWVei|%S>Yxrhb*8r9Yos;R$5|+V-FGWWXR4-W z3@aTRpo$+gXCYrm&~Z0@ptK1^4&kWl-oTQm!#)R7q)QXcXk<^EFWV z+V#@WKSKg&+{&?ls3IHyR%|YtlrcBn8yp{3(RPvE@?G>lEaeG8(JOHZ44_SMHz^PL z)vgQJ5m+>)&w{`U5&y^NuQNG#0Ye=Cs&`y6d5?DVj;Rn9-Geo8muSEzOYtK&Xj7!n+XBr!Gb4oYO~4^o3$eZIHkv zRYf-aYhfStsEI54H9_^FB~3V2uT{dbmfUI!f-1(?H-{&sg1(NAa|5R{)g|TBy4e%C z`O$3Z!bMVBHo!&8y@!VFGUp98(HbX$H8|@w&%+JtQ(%MI=ef3VVdm9I{UbNtCjK4L-0g} zTil^u!NGEXS#X{x13#H;X&DBZJ;l=0>&Lr%$4g5q(QzNwQ^*`Ay&%Jmi;0e&oSyP) z*YkSA*SP2aoiV+ zY_Jnt9g*p{Kmpd?$pP&(*hqyW(InX}{y_mRJCAZvQql%%S zWjP}+emNv9{>CjE-LvVRQ~0HLfuBqmj|0mAcd#}@Rz{|;SM2Q?KoMP9RyYS9jZgWC zy@8Q?4O)$e6a4~oEz;A|D+4s*yIU;dL7O3XhW#z&aIekG%!J)uqO@uE^ruSe8Hh;J z7v#H9J{J1LxpKTg?OK6DgIEkwM=5zQQlZuf*>$*veQajyS!rFtaezn}e&nUY}d65FYuT z@P6G4uC&FLuptRR(2l-%gfNAnZogU8>Ce;Y2(TVpjoi38Y|GZGSQR7KKldZF2%fPG zeB@FwTF{^&)0#n{ov3{%B>9f{%7SycRXGuT;m6M=a_6WTqH^AF9j+<0L%-MBNVC{< zuGWRLLC{r#SwfFcWF^rEt@_qBCK4oUCUfmBM@)>FM zk324!baI|V23ln%q36%A8;n+a${KkhCo8VMWi|KH*g@4?`o`8y8ql?CTNY5*v1Hqb zmqV4~u*EMNo^s5{fY^Fo59NQcT0X*$6m#@SN$%00bTXBn6wh zCg%|rN7L-oP50X1`Aldk@5s;+^&+-#FjwvqMx+`dWzNr{h~I(7GrtQX5zLszn9BvhtQY zTzsJa-qN_dsB0$NryQX&Oiui;#@XWYWVO6e3|&^bce{(0Cf}5|Pg7I$*Vy@@!)`k1 z3v^s$u*Np~&Emt*O^ns{IUU+lq=~MqICr`7U=HS^AYb)V`DS)*qe4p7`FH7uos1a$ zZF{%8>f~bD>R-d+rz;Gi>|erQPdhu)%yrF(wzSHPF8Z7167w9S^<6dfWD^?|p3$k- zxP(%oWaQBxYPRTMS0njee2ZQ&i-ZqhCxy_>Utu6CSA6|#pK-_G2f6;a$}q4TZ7|Qg zVPNqD>8Tlje0GCR1moPIkIh ztrH(*T}_R89tF!?;v4`&O9rf}7rJmW4UuWP_qwh)fMg(W2*nXU-M!`hzwARO5?X6BOz{ z_Q)$m1m-S6{w1vY@RvIrxK;!`{3JwX;Y07~uwvI6B=L$Y@{P~XT&mg zQdH;Q+$g(xCE#q!DP0=C8pdeAi5BI`3l6N}0GVA!b%|r(;7q7YWJ~MQ#%b49RLB9o zGe;?gv#@F2^ztVc5m3$h?Oi1fG4%q6ER^{!`?zsC`Te`#{G2#*b2^B={LOL;p`q*Z2lGaNm|Pv=mi z?N9&5*4#znDH1UJzmgu=0K=EsLouuHod$N#%RiN`HwN0POQ0YMdU+|nYmIaCiQkb> zYNhk1P3E+J@XqbNLCI&dy07b4w3%gU^s0l#$T+B~=)_|YFZEsWj{I|H@TACCK#if@ zgs3l}muj1R6l;Pycq9ci4kh0h-{^4HagPMX`s>wxUMC`AaYXhDR0p^b;v)Gfh$eef zsPZBu=vTV$OxDX~z2@L|10%vMqEw7;)N6XRpg%u0mjvsvg4X;NL+EsVQW9ntq<$j% zLoxk2_vSYwFgk#ovjGMqUoyRO2J!Y3_a)75sqplC4d449F{XVkixwM%MiQ*$l?~1)x4(dl7lol8&4c=w8uhi*VB1F%n)Vbs|AWL@<4}&N8E?rYEpuMlByn&+O}!>k#@A`+WzPbNcsdv<2_4_a9~+& zo1bell~z+O`&%PiI@Fd5E>5UY5TFL{st(s+Ryv%u#^E?PM(mf?Tr z0y;|Hj;9lm)|6y0-QWcb&b)HYRuZ#`Mib=xpGTTs0USVNf=dm%;5FF^JXFCOmj7mA zWJ-NpyuQb)!<-{`q-C}}L_|V)`WWT7bcfX! zfFI5rG%<9(WOOETlH887*7{LKyjuRwXWwwsbm%+V1RWEdZzP8i+1g-1VSAfQ{xufk z(|z0m;Tdkb92enQHxQP2L94{X6a@fuBZU%b_LXr*2oxX^lM#vrmS_M<-u>%7lO}o|jt}`#4w=EQ0OXE+#Z6C| z8UDU5&Beq-1mt&(!#lEcVH}wR(`C16auK6I@BAyh*Q1JgKwsp1M!tVy6F?32kbm49 zVyr_{63;IHQ5Pgr&l*rh8wRkQ*-u0?5M!!|ARrL~a=NdO0^_-m0!X$mTN5-e>7hmK z`Rb0`m`3hhCU%S5nSInp?osW)dw(Z>mBk-%AZ&z@E*C{h74Jg-Ah6Hr&h&V}3(35R z@;BC}0YDFu3~gxFGjdpFJDs9s4V@#qY?Pa-OsXu!ZB30>hvWUL5}q@H%hj@TB?gRm z=+XrqfCbH{_PmZ{G8j$L;m{f06HBS&&YIp)yS@A!?fx17Y={XMl`UCkK(g9!2fj@3 zjDU;|pq<0;WWT>UUhhPc528kl8wH%mlnIE;X=U%*Z}u$t&M$`A_JTJkecUCsXemx` zFv87ZO9v8v3MD>2;Hk3O^?H$2VH;kWE3p(2PWLsxkB1sZ!_v~!@Jstc&KgY!xXTn=4(EaAP!| zV#mPL`@H@4qrNU8rsvk5x?T!++ogSb{Q6^u=T$S3%rC2Xj1C(OxL3H|@CME}VMy#( zTHelgbZK+W=P2H4|S*w~uKtO92>X#L1 z)C{wda0kuyaJO6DZ%$v1io-KwZxf{0S&kJLxZH}cgY}qFjcgiM{ z{QchohDgv6{>{_BXYf0wybCL@A1C_&hfsS5ofII0dNeahv~WtGBKAx0?h_q%GU_#l zE@<(O8vjRrz3#Xdx5EI9uk~|7@||nklTV(ma8K?3T>srTSrz`xAKBx7e(m{nkpPAu z(2Xw5BO1|#sVnV|6w6;<;}t3ebMxC1{r%lv?+6#4rdp{2Auo^^nxFp6-ugHh=p^x! zgA+;_Y;PxLqWbC|ke4SxHk`q233)Y9qHiBDS8>5?<>pLLMs*a9v!{W&i2KJr-EEZ) zy5}DT>;Bu60m;l8UhlC3#XVzQXoN=s5$O`aW}A^OEa*0Ex8p1=HT4b*+@4J6$Y0Mt z20DQbk!N`wt|xEv)t6RQax|=m(U>((C2CCe@jeu3E=ksELTXz1Z04Rc%$wK z!=u16*t3^!)PSO_^@p$}YV}4Zn@Jwfi$2b|>RTw2m*CE&m4U%CUiR~`3bTQDt~%Q_ z1{_t@Mrtc7D}Hn|v}Q_|8oNWp=!KDqbd#c@d)jxjukjGujfUmD1n$lrIzunOe6?Nq!?>&+>+zP^?R*!NcB ztQfRPzjfo|b3(V8y#fQD#K?#}Xbs^zUB9qhBLE%aj&0jg({|~msNh-bNFi;le+jSD zQl2b09Q(+UD`7YWE!%t$pkouxfjJD(dwC#lm>fmUuPIvLM)1K-Tg{W@8DEDKZ?{r@ z{G+-Wbp>rTGj3omzlnglr%CF)Ooz& z&QRpl03F8kt$8U#!2NpCnv>H}gLy@v8{%wxyYC}lem>*<2?5ppw)ITusoV9z?Myuv z4bA49>)y@J0LJO*X@J7b0qViS*>FJ-gfODvMl}!J@$>a*sS6J&8ZY74V&UJFW9417 znrBfKf>7AusquDvLsQJN#=F3ToFkb}X+|b~+aIf%cR$(jv8GimRKI}ma-Od3@DZOw zeU0ZE+wAu5bgUHo0`1?Y@^{p7r-hsMDLn}QkJavuV09PqMAq3A1d3CdmTGO@!9{^^ zO1ygrWX>7kSdIHW>@}Qy79t+wcUm7z3*mJkzd@2Ui|ef!~AsTCj#YO@@=n|28#czLEp`QDmj0VJU}tUEr#&!#e*vKR3Uju5 zll|8A_U7H$ERK}nbU9d$8JXayg2Ku5$d6xZTa+rUkOb8?4Dxhc(?#OwkFq+z!IW&>cRrt#uT6{A}gj ziTL_oit1myOTUHXu66+pX58=5{fi*LM=T;D^5&LYR#rTOAmg!{!Af@o0Re$!0+d1~ z`i+uOddQdW!_HSC3}=3?j)-@XX&H!gPx0aS@McZoHx6fxc7^`Uy8Pf~jYlTSMspR?b7dy+tPuQqk;)!t+N zg!WmfwoSiIJBGtVrb656sC?Jtkz&KD{phGE+RsUG6FF4-eyB0dm(2FV!?jXrn2;O{ zz;fy$qIupE*Zt`a-H-n&o=s*1Eb0mQL%zG+!WDwo?5N(Ki;Rjo@=K(rl#R86USH^h zg@bXcjj?O<$3EQTS5{rS+vf!4sW_;EHl{Qmt4`07=&g+NxjO7loh#w^uS7L&n*7A@ zkqUG4c12~5^4L_siFkWoxqjD_kqyV;na0aHO~d3awdhl>XflqV#;;x_Dl zHYX?W(6gr>=#r(KFrh1&uqlYlFj=;ZTkFxN9&S_{)m8;xy1ZnaQnL;jnQ z9LB3I0_OVPW!v}Xzb>O&{m_%=42|n3EZG0@#>buuJ|t9B9HcL7Ll080 zNLyOL?O|aUb9l06Ini>6S?E)87`uHzv-VHa26KG9omMjNg1>1E^fx4?(R{I2$Rw@F zh?N|f2rxNyqNJ_;{9E_@9z0=(+y8@}TQC^}XidieM5O!EI7Te5s!HOu{&;Bt26I`> zC7Glml)hhtD~Wkt;Pmr0nmTr!mAcM7;*puv=onbc80^VWwf%IWKf&h2lYv%`i?dv2 zMy9LEiWi;W;A`%O4-txV+>6jJ|tr+#f5knXMieRGou?{3Eu z{C!pr*A)JAPXKr~6>HG0J5?qnC5;7qJh<<%?6<;sZ%BRkq0tnV3c(hE7w5H3fe{fe zYmNy}x^ug6Cdl)1N^Pxj5bUtHlMLQ_X=RRVU>;eU4xJp$H{N`!(in=LSPEywoO`Tj zbjdSaY-cz%VE$zQ4M>sx*ChsK`MVfhuo(u}HhdW5-1}|&jQ9)-tE011(Wf(n@V2T6 z8bt9Vtk0@}9S93FR>}qh(lSj_L&&K!ibK&9_o81uwiK^%CYxK#%#2%U+R^^*L(ViOLFbqx(Si>*GYMH-^^z&kti zx&?U@QT8k#UIV8jHUKu{P`i3ZY1r7R{$Rxwxn^)XgLJR-dyjWH_hR2#OXncciZTDR zQ$nFKusF`AI(nGWuI=>)uSY-Q2vZCyY@A5%4PpHbd2|smJbV7DMS#Dlef%T}rg)bi z_5RwuXm?tK_S_v$X7A%Vq%HNp&uIblfH7+!wqMOx#^vuP!G~ zVq#+0W9-4=+sldaA> z&b#g$l{NdL2v%lKZzCqU-L5_bZDBtuGIKWQe-%6SfjVVG@Lep*odN#iQyuWQ`Cpj< zShqX9jY_@_h%cl8ej$b*zVUYP%Gq}9=Gqpch>nBZZM#H#-es#mn2?bBJwOW77f0y4 zjE;$k*?4??k+jOsd$v7Qc5T!|->~Pgd4ejRu6^r1Q0qLWHyv2M>td85BBdy@z0SXr zvZm5-VlDJ`=p?>ZS|CyOe7lv8=dAwa6{MvTTfq;}z_eSwg?6CeT3n&SFGMv_VcEF` zRJPdWFI&rxMVJH-F1C-TfmQ@M_fpl-{%2YD_mLRroBSs&4^;5V0*RW2x3AIf?u9pt zm)S&7XB+Q93o_&Nn!s(Sgc1Uz+m#$_DkUSMS!=MND9;xY7ezU+v!pE8rcXORd2vwn zBWJ=x0Kdt?P$@Z0O~kjnW?khLOFhOGn2&HvlY8y5g@M4z`^p zPwoLA{531_^S^C_R?80~y#2iFe$|ipmNCjLI^LDfCwwmnIXP0&xsZ2Lw!pdRd}=e*b*2@R7c($j$LWusy4uaA*wxBP zXe)exbVqZ2ht64|%Qu~O%nLwIucRkzk$QI7q@NMLlanvWmf}8^`lz=wGc2ZfKqaSk z95t#1U0u@m7i!lC!)#iie=yISpB->A3p|?rHimx=o_N5m6W=@Wf~bJZK^~ZpmiX6v z8B;@L9PopkYgDxRA=0FKn{zhB^(sU}aGe$L2{l|_Ump&`b!_}~fC7Vd{UGq3yO%I| z3n?tK7n#;{U|m`(I?Z?GhS2Xrzc4o85BRwAuzTESwxm=C(MB-@I;}&&{BxM~vy<}= zRK%(o@uJ zvT7@16y{>bzh+{CSyvkAL+r!FVO!!H#7uiz)EAQsV4MzCM*Jj2w4ZjpV3p z>xBrBu{`Io{P-oKPom}1eci3#LaXu3Y=^5na*)6Jk>zy_0ZMD1wAA_Lj1^bP;v(m% zz085kO)|57qc45aKr+{6Sn=)#j=(5$(+U1jJ>|KR5B-f=15)K*CV&O*{eM!7cfZoT z%Wb%d0!m7I5&v<-7on8A8K>zHo}iN|q@#dCTRTZ%Ep}y0KaoVt8}tX6R7C$$%5G9H z9lyTfUq5RpnMNNp&z_;-HIV7jaIj(^8d?m;aTZRDsSGg{GlW)F4p(Mp=BRCNVCp(^ z20ch*0}p?Eh)m$N9O^^x;Vbu)D$5e|Do2*)yJFU9gzV&hC4XH8=H7?>!e>SfBEB6ZQ(4QY56>IRjf$5j@;sTw-y22(w5?Z8sB3BlpayXY# zQ#)}5^cadIPWAFIs~^Xs@Q$C5!?^uNDgEIm{FWA`Xux53L@NBn5@-|)F9nIxJu)}l z^uvAs|JeEpu&SbFZ8}AyrKP*18|g;6L%Naf5+o$0Idpe-qku?vcXxOH8|(Y-z5ny@ z95(E8_E|AAYt5{g_pNJA2Rf?92(I++y}vI2tL;LkaR$JljlMt8-d`Jb7@#rN*4qDp z@vS3l|KmaYqgdk1`4&JUHvfuM_KCVfRfq>@@gr-qKf~B;bG0jkLN+=71GCHSc#c%u@F@S&%@Fea3UYPKWTvB8ct{cA zLiXz3o)Eih2Hhy$?>bijeiR?|{~9RYR^ny68ooGDb7jMYJ&UwZ1Y2VUzg-a$*LZsz z0BC7<$}0J-OK<>WMa5n`AI{;2iI7R8LY#iiW2K;Xu`qI+410BM#2>HHEZJQ603^fP zOR0mPg?b}bhkV|qnXEu5dc?S@H4lk&f=2DadH}lP>umk@GJVYpddo(;n#fmDM_^^v zMKF9_cxnV>ZDbQAtqK|47_pe^@Q=mnE$!;93t}`aWw^ZjFK&M-CSY?wJeS`C5|fSv zb$%Z^9)kJavGY}=q^6m!jC3ai37bVVG0eQB`E1ea@}#7>X4kV%5Rg`u#Xwpk6R{`+ z37Vq8)(AlTIGBu&ZDwXBF?UcQP8vm{TE@b{rhu56OAh|{cX@oC*3U0#XOYSE%4*^JJ0J2&!n)9bUHL_GJIVQG_V*xd?j zoeJ~fe{pV)r2(|=K^klm*yFoNfq^eCqT*d%%uTqPS{dx|jyQjcz_hh}xmKNX@j6!sfosn_!0ez% z#hHn%l{A|L>QdeaJd(tNa!&LR?d?HJ^Yc+(6V=tb&dumF;&B>0n_@8KdxoA;tWO0s zvpN5Jr{T*-24?Vk;2%WNH&+kq>+};lt$1Bn8tQ{zRY*-oDOcgSE$Y8B7eyi}jW(It zHXym8v`D!vH#$r8>$Wq8M^U@wx!omkwiq5&vjnhim|2-8^Xxr~?MZ@9u(=%@Q|r`( z^%a?SOI#Q|ShM$TFN#jP7l3oAO{2REL$}aiPoZ-zX=@6C#Tu)n(z3UWPUf#{C8EmK z(eyFVi&ecF4+AboL)T*3YdcJ&swX%|u z(LOV?larIBr(>b-1&ZC_gl)EKqClM@OaKtrI#^rFnvFCE!8n&~ZL&#`dgMxzXC*b? zd#yPK6Z11OM`LGSLWvTr{g45%1n-WCGqTDir6X-@Y-%?-g&8Yk)R=0U1C>Lf>;=`; z)x$D6rXfJt`Tsol8dinUdxrY=fvX;mH^%2~Hn1_rK>F6`Kakc#5Okg= zUBQ;!T3k>;d6T5AiDqYpKHG0H*c!Vd{Wlgsj67dIx~^)sW6nuLucJ6&-C$~t)MC|f z=UA0MkS8o~{>5rcsHnCvw^qlCFmOK1dq?%{Y|zg+IX>EqA#F>Gbf`ky4dJ}fo$c*aozd(`D8qN_4}HX`^USZczSJx$&#|NHV3Mj#@v8SI1$0RiWU&)3r>dJ z#qNZ;wNF`aaK%!#gidPe;^N{s2OW@csIt4E1oHXsE!Xes7nI;EY{yWBpMy_KXv~@n zOa^eoRC%LM`zuM>Gz$3U ztc`VWvL7a$PRa0mz0r*n)3-rl-V`QeFJsOmPFK%y;npu6I`gcw_KMjQ%m&Pk*lj%w zHT`f_7>s*6H5QMU-CCZ^)(c;ZzAAE!EN|g?u>`^4`4MW@M5!*;8|7Hr(3BYtw*cuZ z3#qOd2WYQ4nmXf#<_$WOJV-c))L%+Dq@sXUHICO2pi7_O%1!gD;EM|Gr}@jjsH73< z?Obi&I^wSBvzO+X3DWXrsT5}<0mR%MZn-UXy60kTF{RtF@8^uh?Pa-~lOt1?^$8O0 z231fsuXewP>q^DV?T|RU4EAuNBN0WOrN5%>>HTT-oG#2y_Ct2^Mc?}aoVg=QYZE$H zYIsl?C6E)P{$>h!NIbXyodNs-vtUwvK0$R~CTj$CL!FAwhhBpuZWQAkJrQx6Qry$Y z>SCxkK9s(=mQs%99Y+%C{53V@vh+qxg92m!GR~CU!S$W>aL21Ga|m6#{c`B)jhGXqwXcW!Ts?MzQkPv>}y2Eb@C0>&uw z^RuS%l+x1m!xe7ZQoR@5l~aKSwQ*^7UzX?)8-UQttngoIR6&X`w=gM(9M zY$%Ry@Y(F;KgayPc0&QozF+Kj*v+13d7HVRX@jNK&G|AL_(nhPZpZXWVV`?Dx-aRa z*h;1-!+*`mF=j;()N1kIs)jm5>0{@?Mp?J~25SV*WP6@)(%-8*bgk}SdO{W9x)(o) zY+IvZiXhB3`0i^Tn=q{X2%U~Zx59R<-bn{In{oE#Di-|I^j;>Me1C|A@iQbCLOqB$ zE;p&!6c8ys+mTb{A%9oSFBtT2_|2cNO106@^am&67_K=3>3E1$i^E=gWZH^_CO)HY zE~$?c>fwUA-UDUL3HJk1^=0#O@)m6%8H=%h?TgTvatE*cK*%K?B4Vj6A84tmVo=U$ zb4!piOI54Mi3fk*BqkNg^zDG=E4GqZ;^E>?PfCd7{qRvI*w-I*=Rl6Q`ASU ze~wn#Ju@Wbl^Of09N^U5QNo5n#@fFVK8q!Go)A7bo@67bJ|NW55<%9mwTRA^kc1+3 zUxJp>)mo-rmZrus*rM00v5Y&NCihQ;`!Is5LXV)pje>sL(r8T?nqNW(z$#k07zV_* ztZL~^g}Lj;m1v_*?=-I54$sCq)KSYpIek{I+%I6nWuvQ|RX6Zn`T`V}UE03aLV_Z$ z@WVQostl|?P-hJ+|C`S^YiUv$NS;|Z!_>I z_0C38QgUmQU|lQAo0GGW4V#HrpZQW}h0RRU+PZXd(p`^G`Suf-<^MHQ=j^_@pEM_` zk#H%H8}~EDb$%My_P)U(-1q(bDG9nbt}2jOvm#CM<@ut6x; zpDcePM8x1C3vS}zPOkCSid#52G^DrJ{nT5eOlQo8gD)5+Zk^0`O|NUa_RW7^6dOfO z3%w*X>MiqpH!sU{X~A{>VTvZlhO={8(@1Btr_0H?EEBb0VcGg{E#AZ72#T*9Z|B*E zKFEEM27g0}kFu3`aU3y&tbGgshCUAKNa)Yru?Xsq@~~e(LDOWkZeM@U&X*3B1aq?= zdN^yYB4HMK91~52GO!)ax7rS2@1js0+scJ`qsNJ zm!k1f5A81k09Yw=>_;9ZYb)q(tqHDtjG71jwh8zTKw7f^wIcrlR`~q zE%lJBW)~^*zU1P4HsaGn)XccKHKd8s77X`eVn>Cdk{FWx{AC^w3ukk>u^#?!Hofs; zTtguy2YV6AgFXS$ z*d>eTQ7NuR6}42~&WIGm!FU<&6HlD3SWu$P_*m5hf!vAv<_V)%p++$e+FGq=vTI$N1gl=fc|Q zi(cBTr18r=r99?%Uv8yxzkNE|s$@v!KIy5&GB#&jed_hKpGjQm9+=elBK^zj@qHwI zuOaDI=g-kdy;c@br{uXpjg&rn3w5=Pc<99Heh^)AVA}d25D2N6MpoW_H@O3L z3q$>dx)HW{A;V@0@hxYTzkg?5%2uvBDWoGSI3Xlgex<*P>ydU?x254P%-<#AJ@yiy zkQh9RMbdHOVGIfLYj(AJqA-y%dml8+4*=x}5vKHJJ#s9u&&jO?;Dxd0;qlxn1`CU_ z!hek+^{jjn#2|vWT29o+Y-VlKq9^Y(R!GpO|5{{zEcl9Lk8f63@$sYuUL8Se+&2Qb zQXu{FChfcxKpKEl{q?q33+Ds_o(x;{ber6)pF!`gPrCnS)r&*spoi7jqc#!EOQy!Q z?ZtIaBxV}dfQ-iBTGm_RSqA;wDj)IEE<(Pq@jFTF7yjy)Sw-VsluW`bb>+6q#y+WrwR^%{cu5vdYs`tZ>jf!;W|yAX4m4 zfh)Z#=j|0M|Ip-6j_|J0vSI&4w7`5v)6hFo9 z5Iq@(2gXMR_{W!Sn&VnwpW3X-c(#GWhP`0NxpR`oc<|*p*8x@RalPx zM8$tKGU?e=>t$OCTAI`v-9Gvv0#r%$@VZ^QIAs}EJkIHOMbp9q82B7zAF`P?ULYPN zUf*7ut39);H)cd>MxE32Rh)nd7ZGJeqN3D=gFZ*-4(X2e&txDjf!Ux5nvXrYe}*C0 zsTDN*yfgKhati+O3vF$wO}4FBT%`D6xw1MFl1P=XGR9tUYzgGtdoP$WT}iB43i-&S zTw}F3MJ-WgTC3#ksCY0!IXBH>u01W#JvJC$Qsip2B_^%&#mR`BF57do0OuNr7UaHf z)10bl;KVR*RmMawPo3rB?5nbRpx_ua^cs~ov_%EQNEz&IKwuML>hMvUlr)D%@-~vRljc-BUFTQs&QheMP%~?b7!nb2m}>`g-8}!|(zyjP%5-$^vd9^lwGBuDp9D zJ#RVNb~dh}_Yx$4!!Rpe>~d~0w}T})t?QjEtOS&|2a^pM-W=(0)%m%rQmE@qZ$NJb3R{nw~n~N2i0oo}V zwo&oOMZi09<#FU@0G}O-P4gi3_6ROiYltP5t zJZM?A;%`x_^Mj73l9aEA?VLXNR)nw4>eD++etoAHwW^QlRB1nc89N>m`>vxSj!)4| zYVt>qtT-;3+kFPwG=KfrHQ9(WdVO~A-S^yDCBx&}oYl^D(j<`jv0@ILg(|KSyVN?D z)LBqi>c$6Y4CukZtQ|>3gtvCvD_dNg!o})#Q#R~1h0GsoO#BXVoWN7ygyl8{H8gRp zpv0H7+4mb1Pc8?N2lo-`B{n~2@vbAQP0x(HXELK!d@-Y1Ag@5{z56avHA-H9r1!t* z<9lR@HD(3N7$?H+O>G+CfgtEM3b@j9>K_eo0D6Vd^Ho1DrCL>0MQI19i-=WfVAsOI z#hsfq9RJkN(2$gbD`WbzWh{^XZof*7|3YaznNv1=U-umnv=BRFo-{Tu=;6{bx;7Sl z$vnOWjpXehz+;MQj_{u%4L?D>4#H0|W*yE75eG847La7;pX;0tW=CR+teja8CD z?Dy_f9Se$$IBcfVbX_+-c#BQ>n4Kk}Y;5%%biZv#%3VCubr(r268Covt-;yY-dxM& z%NCXAiJAI2uW>*J0O_~z!%hPF@Joai;Ee(_dX`i zH1hB!=Nm%Y(CFV-fRm-vHi1){BxRxz_AT~-;XvX1NGM#TbXRwR2p9$~*JNE^eSC#E zL#$R~Bm;?l+G2Pq8>_)LbN!Xfcd=Gnn&vi5@ePopWjeRhuoDAa`(jiT4u=k%Zn6$c zN14935}Xd*5h*-I+af-!Ze(o6c}V~z`X=Wd=ZMr@A|?B9$X>uaM4O#$xlyoj@a?u! zT;4UD2(d_1iKgbv8Y%6>1qH*3fQL$KjG8;N7*CbUMS$Zu!rARCMV4T4;JwaX;~M32 zMxC!0IoKHxuLqF(x;P<1fvC5e+K-rimf&`imDAm5;cCQp87 z^2em(z8V^uL6y8Q0F-95VOfZegzv{jG0IO!==)w^wr5~rskwOTXD~ zI+t*om|yzxfp)`xwxt*DMgm1O{sB*}28(b@bUe8`ZBWbn_#819*Peor%U{ z9;0llU>7YVIGHZdv-K3lZJe;=W?WZer10H)?GHkxr8Xs~yw{-nikeXqqT3nuTxq94 z856T-oAH6(I4W}to@zo^54ZWFuZ4|u!bvm{nt_|&I{?W7HS0#8GQ6-dCe%U!h|=xn z3B7BxG^5FLUaQ8;=GpZNzNcS4ztv}Y^RSC3=58X?D~5VDc=Ec2_9}HP&3f1}Z+%qx zwrUul0C#$6j`=djit0n2m8V;CxV_U%9XsB`=pI1Ok#9yxA`j59g97Zny?uYuYa|rkW%Sq&a>^cHl`NC zgq9GG(RtG66Q~b4L@N@H;DcG+=NWz?A|gf`8!UJhhQg*`EhEk3Uu zF7||p0q=~u#xHiS%IAdoCJV!&Ku5eF#41daRF$$!tD>CCy|r$nNG|+A*`zV;H_0Ns zgvYBq%okpId~^G`z2A?6cj<7bkALmWJ4i zBJ#;Q%|E$;xqrg2n4J~leSgrgq2Wp+IPOuv&Tbj9vj!}9jQLQ**XgJqgI^dkh2DPB z!U@_4Ch$a;b(hW!y(7#Y+(j{2g6E8R$5RpNsr{wEHmT28dR&B~rCqQ^GHm*R0awj@CvMH&2+Q!e9aqpqHKpX3u3 zCZg!~2>|^fa6A5%&uNd@pT-a51d;fnAR#ZcYJ=<#aB2kYjR!#&fv}GPWFIBp49H80 z7(w$VO!tnSw%#442pdcg=V+2E3Gig z5Bs^zWB>sH5d(80Y^0nMnv^{|FktoL;cBd%86#|(xh$CM*Wvba4Z_naMu&D9ey+=y z@DF8ngnLm-XBSro4IUjbw6yHG6SeuxcjGVbrzWR(^tJNRwcXT+cx)KF&Stv3B0 z4W?BVE~F$Zc^L_Vb%;Ke(g3Gzo~s)*bdsJbfjms!IL^q;ls9W6{tjn{IsmSHp@hM`r-i4_HW8N}{GVgod*dZj92%WRWX8d2gc>p;sqiuu-OAIulbt<=W7Bbw= zwHU8=x3j2fF#KFoWB!o=G4}E6Bi+F9sHldw*8B9$s+sT)Qd10`ZW5iH;fY!g`m6f7 zOUEABv(8qU%A%`7Ec%lEr8=OMia|Q1smDU5(`~%eO*4^sG$+l^c&SN<%bJGE%K!}JV1DS_OD*(Ut8qM7*^6YF0KhLUa*Rprf!XLs~g!pj&u!C}bqeENdoi=UM))dDQ8 zM|bYmxs%^z%zf(asMighCvPkFHubdJ4~UfuD7=tThyo=Dl3aDVzPJh^DGT{47B6tX z!))5#ok1cYV?e}WY_yR-obL_s$D(7gv$2eJCO#$S!c%VzJr2+IrrI8Kw4!6h-venv ztgJNvVR>lK=g&9wCu>^Wjb8>j9im}$5fKoF9nd7aP5B&9!*K~wtZB+9EwXnl+9{v?=|D|8`*t$ zUnYy9ce>GSVt>SfmBN3#xM*lpwTOIYUq#BkmFtz+zyH*k>w4?oURRZv2wxyIdsrma z>@hhir;K+sTkZnm%udJPI^+t{O-PEKQta7h;gh+F2G``{yjYtdY`Zfo8Vs&%a^>^6 zMR-mS@ckeqV7Y@+ZF;hc@$KB(NWG_FZA-mhxvGx-YY}h)o?XeOF!WPT6emPc_65TJ zC4EeAPL(qdUS}6}OF~gsoGi$KW})ok{3r6lp%LIx(747=u;yhB8eNAV9^&X=6Q0KJ$<3 z$>dB?u;!@DsX?pyv0+L(>MfJ8-RTt}5~${ct`5z6n)k|H5Fou#V6`y_@*vPb?H`c- zwwDx08+@KKIAxN(4I+()i5h#32a~=@51DTCz$Qg{Z^1uVQ}acn>sq=ao_9B1I>HP4@QV&>V^>Z*hE4(1#ng+&G^<>?@Ka^} z7n@Ks9QE9N*Wad^D}PkpOJa5%Zcim`Hw8#|viI4HO*0csI?W%kcv_fE(fl__vu$NU zy%^7BdQnYCcYfn2{UOP&_rmZZM|_eKUyJW6TLC5M{05)C3`F0Yr7WiX{WwFd_dNQ7 zRW#l_Zl&45K?@{0^OdJLMk7p8m}S$I)@J!KGOSHkVyx&2iLnEA^Tb<4smuNe5zZzN zgDkA&3ZLIT1 zCwJ2-nXe40YFM>biEx?=B>~D{%P=0ABv!p zaDqbu==99XrSjhd`4By%*>8UDXM}{bOS!pr+wA8Ya!uXh8M?z0HE!iGX>`~*6(33k z5RLR{j(&uBKkVu1izErJ6>LpZMIPYq-<|I)$R<)2Q-6E_?%uBvCML!M5p$6;r9@g3 z0WfeVAbH-m5NeVNs(YhJTMomfmf)&whAanF&KNXd&-H_3?54@}`rzl}t4+ zY_oC~m!-c?XJN+S=H@{)5ZSdc&g}c>>jwCZitU}l)unV*nFUzQTfZYkzqHdEKf}WI zZ>q4tFpbFYDj)-2Ak$XOPhjuSKE|h%$HGZLfL~Qig1R-T-qSM^6}Ax3cYGbOD=N(7 zNb*WWnf;JSWx;njvH&fB%HHsd9!~?;{#}c%YcKD~iElq@PexyPflYDp<7iC#$-6N> zRoPPv-<;Kck|x;&1xc!qsCBuuu`ZN37dh>QkBiA$-E#0A9|oo6r<=l*QseQw75q11 zKK;NF32s{TrjEwr2@F3$IhpPKT&gQRfc2pyu$$q9&h4$BBj`3pww-pZ{o9yp)cQ6X zvG9cNmM*+HhlvL=%4*Bk^PX>#ObgsyWOO`%tpr?m7${C4KF7u084@0RQmUu((rIdn z54!h{mcgVA7bhs6X|5D|8WN}}vtLFGsTCaT?jd$xDP0y|Vj){AT6-)U&2Sdh$B+7s zv~*5yyi~f^$fVYZHo}i6vhfks#O^a?Z(v9ja(wGJC>Vy&heQ>z+YqC_Nk_l`D69p; zW_1g-s|!;?x+6OJtwXtI^Xcr4R>J%tsH~tN8-u_0RM)`2(EHQ+1=XzkYK^;jI7CjX zaGG~@*tYYYSl*uDt~R`WnRp`BXs5`;p!4H*_Hhi68y_8gxq-2oEO{|ui||q}drX+2 zG*T~AUDN>>-a~zg*z7J*><2Wo19|Bd>+$veIFn9Mvfwlo*a-QmuD(9RQz>6H`0X9i zHuU`&Px(6v^3xAhXmzDw5(7;%Gc^vj&hFD=H7zL)2h!u03>$Y)z0fQX``b@wCMq}J z$SPq{&3G*pcC~FyB}&OR8zX(7Pdq^74Fueq;UEaMFc-_0R@e}{1SgGdHxyqxC3(a0 zv$NOx6PaOO;!W3jimi(gdR9B`4Qg{g9UZTD=h38Lnup(N+nv^0%@LFEqwa`X7Lzxv z-ZUMx&b9GNY8nG${K*cVUKEJ1vH$TwHh6fmoCH(pjVC)w^y6N_(HC8)-s| zW?_-T80~Pbzp;RJ&Q{6$x^uzrpf6g8YVKB#AC2_wH!|w)q&4y0%3?ciq|D+iO{Aq> z8(N4D>oHixvAE7nnVA9TpopHGCPxamY0wjK=+Lc;Tn(9?lYlaV)4ZZ&plL|-B>K=7 zz=}fQRoZu=!{^*89;M}e;h0}K(bUxtFGo0iX{{!0p7CKu(CR;Ax~D}}6cPef?!G#%o^HIJbb)~p2ZWd1FwoG4BXlcadWT4M#u%NWXqh& z`|540q*!;E5Y)zk>wOCDaFd0onDXc*DH`sAX2!j}Ai4@w2Ptgzq3g$0I-)yMx#-F+ ztW4t7F*~W=gKBNZj}F6o7B{ii1AA*@)wT>dkVdXp5ydk~Rmbv zqDnT=IXJj>lcD{-D`TnDkj5E*3|27CE1qVZ(+|^v(NwC#E6YrYV%{o~R45|gB`nN* z&)T%_U|(n_jJIXMI;nQZOaeYl&aog@>;}d1u~ADY@7xa$g=)R4oFl zdJ;X|;8zl+47MUe^mF(`-F{-2aHzVrGBdg=-X*5*^ZXuP{6++l-$5!-nZn z;k}N_ir)0Dv#Ql>EjOR>U9DrE5Xno!FN3PPd6%$S3eU0+zoa=s6-eENr(7rv14um} z`bfk;>gT%zx|26%SPE?b#St5IoW3?`1u@L?@8Za3lb%Z_aP%wAD3frnC^ma(@I8LCkn<;bg}RT3!AHlX@}IQs zC=A#P9Ut2+BER0dye`QLKY(|2owaz!_ruBJY#x%};&9aFxcc+nqMLeB55jZv1j3;0 z^g9Gqp;WVDL#95LMci-+b;`)p#o`l|7NTONSvAIdOHFH)!+M84C28Bcet;pS>Q?D? z0cxo*v6EhSUHgXBYp!s3SUKr?$9lDs?e=WYH6c=FTcH7#@eff;wFVczLPMA70B1i{ zoB1f08tEF%79~f$A?%CXO9`l?rP#m*x_38nnn`8qRJTlSs@M7pgEn7S*XzBEuX5}B zrb-kWsh#ysa`QuH}V0o7^5oMhp{A=hyRD z_ZH&oP3dPF2eK&V@Jev7qcJ-!O%`*SwdYK{fWY&rWtv2WGXuH~!m&U5>1B$SPt1@%_>I zNZ;|$suJvIvgA$r?H)#+fMf6Z6;4bUW$_%A?T)pp>e1;WZv5_epxD;-B+A~*NKz;3 zd#W}{It{J4qA7E)SAu>(oPZ5S8N+IuY^@BJmA|Tu)U(#sHXm-UPzPy}UZ=&@*)IH1 z%6I+z8c|Buo5rD07j{SX!{fyGdX*U`beEks!R0n-D)qv&I_1uzk4=vB}Orn7)*>lN62o`7O3;AA+0HM*OytRG|*}~Hdui+#k zS!oHjN!M9x{aLTrfHncHjf?mG7eRe14~B_{S7(ESPvVw^qk{#IJiIN1Qbo}S!Y9qy zSA}#`2rpdB@+hT$+2edj-_Ui!Q_`eToyFX>m`y?ve-rD?jSz>vH~xwZ!Ii}F(h?$M zu~%%uvJ$?d6G^TjxtX(EEyL*av;}+u`K3;roUFQ0T2IqM>v(#O@0e42LngGKCFlD> zaf~s|)@>7K`fh1e5PhSLWR2pa=m=evE;QvlFH4DLTiuIb_~Ae=CwBHkB{J>-cx0r| zHf!|MyD6g{S@SJ!l5+2If&MVCcq zIM-BqH>uPnf^w%(HhHw1S0E)Lrk2Fv!?8!qZ6gL41r0Y%S|kOfc}_Bj`GXN#W&a;0 zE{^htAJig2ugr#h%*Pf?t`mH~vI_h>EPEywyS8=6?5_nn3fKx&)Pa0p2)OwWfx#UH zMK5U@&vZ>Xey#d=15Kxe{m$(5>i)UG6m$3JMe<&Qg0;74P51qEx_L%AH5Oa?UieZp zGm&MuWLve~Q3*6N91SpO}wvff7w*v#b*XW zb#2{dF1D>+^=4L^S#`A(hqL{z>?Pr8HMW^aA&;LDHBVdB?02-dAFnwhlVe+*`bKD7 zyIhyok3XD#SrOuvVPn`Cu6)taLSARVMK-%_Xlk{G&&yMkjIkgS{3ID=Uq>CXGwAQd zX;^zo)~q0UKJsLWtW;6SzsU^@>&8e0`4I%~p)K-8J9NPlBf(Q_DhR)poM&Df0ol7t zvvhBtcK{eyX3N{s8SaBp2J7h_8cYj>gm4V_!+8ghiO4P?X00X=GMZMny~PlXq~-la6u@I)=}$9KybpC=p*}<^nL3^k_v-vUN)U3GU;RI)Gb?x zq8P<57wH9bF&CI+(6?H6UyC-wyr++sw+!l^*=^7CQ%@hL*qCNr%TrY zD!PK2m`nR5_?&yF_N&4cl=Jd(eaC0m(hXqVCK1m0n%-srb!5 z0zG-M$d?k_^`rzxPmmOgKofZOw93I?xNV5l-Ed{}b`g?8X)d}z`QgY9lW#ZG)u8N= zg+kMC?O#nFQ1Y?+~EUpnOUWW0>`zUPY3=_`N>mi@r&>7t84!dJ0!brC~^J zChx|-`)+uvr?NpEYadRpai$)C2T^NJcr}=6MjW|I@T&1+Okj%^%R@Wr*qGr4#KqG` z-N%~(v@}a?z78?I$!X{ni|-vzYy+x`;ySEbEuB0SoBP~X3pbft`V(&&U<15TqcHJT zGvd?Gc~)`?zqe%``*wQw(Mf6FhN^~>RZ@@Er}locPUCOQAdY5z_O_p$h4y@~#J|(w zbdVDQfX|8 zG6Qi$UN4f=0`(F!SEm@Khgr>)H>TK6DYv1%u`2SNVI%ple;WQq4+Y`{#B&D$H{{s{ zcTuEe{GKvBD~M1maAxRviYo!6RWla(`l{FLmE zn934=XW>~XhLfSUxq;t$2hWoAfS`B(_pX3F=FjP+g?{hGuFTOQysGZ(?wIzx_4ys- zSetjnr5Y|?TgOClNz!H3O7YBFRP-)74sMCHhKH&)PpqTk{RUPAx4MZ(CH*mjMZ_=Y z57HV)fs?c^-P_O^59=5yV&g>?Yf2|8BZy(rD3es`W{y^s2%T9^FLKa!A?eQTm}qfD3lVB+O(GEgkIKSW|J%3 z#J1SlKVe2crmg?HDT7Lr=i;>8D>%!0d8EZB`xD>A@k|w(cxuse{2sIb=cZe@Yu&%l zOdjkcjArL1GeK5$_(a+odZ*gCsQU!kZLNH=XJXn~|5#wSwa;pN zvl7z*@QZH`dY9CBy|!>kjhKQYZew|Hh&|DjU*De3^Gwsk$O=y38?Weq#BYWPCpaXz zl=w=+PP!S4aU(k12m1wsSy8nACUkVZsORbW(40ahcE+oaK1I$=H@b@%!Wiy7)Nk4T zPZwy=%6q}eV^a(QLjEpuZ}e&fmhUSTPn)MILxt>}Q{si%57#CM5Rvi|KASr!Dr4^B zzeaVX-5A>d=Z!@;2dDTO3z)W1|8}!rpN7loe3;K<@0`Z)e&OZp42|ANDnnF+l_uWw za+U8w{F8(&1rm#CjhCuvB=iY*CE*0)VIQ^<^j>Xm8sbf@=ay;J z(2!Ge=nan}^?;f+co<&KkLf7Uv?NrE@+3xEn|L@flIN0BsXzAW+kY{3QOB)3i>*w@)>7r4my@w1NFBc?Og;4X zQO!SE(D*cVRILFXB|EbT60?bUkvrD9AQdBQ+IX?NoRqS+IW3!XOHmq?N1OxVJ=+^F zNWDopZ63_thx4FpZ;R%QU7kP7RQe6Vu>D_QZ*PQ#1Jk^^F*yeY$>#!&Q31GDkdjQ?)#fTl+%+6FB%p_J_s6o<+o~Wbuac zuEBD3l4dT-3IqAJ^Gdwi3%p~k6F;gyYy@_!m&(zdAo%x1&g$bDq5l$3%rz@}B z4eV$F6x>)vv%{{?a~x8#M(qY{vaNgHD`x`bNu`h$iQbargBJ1t?~E_mxb(<@;i`wD zwAwPaw4%yA{W+de?su?-(!C8|HLKWFigSe8mo7arQf_&Aq~e@TLB#`1HeGUwPY3fB zm9+&CPnd5AV_^T;P=P9x^sGNp^9BWM69~Zkwge$qdOn!6kri$3bdMrb?3$AX64Fi7 za_6zxpQ3T&tS9}wl|^E1>KDZ5W?dL}JVdR(9gHe`twvE-#?I<%UY|x%IQ`~dZ~h%PiGxL;J}VUW)TmydXSv zKpH(M+Wlh8V^pkB{dhewHxb+Hc~LY`HaHQ6r>ZKn|MX}o9dcwf69e(|aezWPH*V4q# z>#DpSD5c}cJedBSA$};Y56%1Oq3T<>Ia?WJ&07VACk2^zMprjM@i4BAgq#EGp0T;g{d8{-8uhsW;ttw@z4p*AFsO{_snPnxyLe3Lu(}YNP$pH|=KSKU%CetP0 zhq0kv4Wj_?1b*MB|17Y*XyK`#P29C@}He_%ZPYiAWV9! zwHL|Vg?l(UDuu0O#=ea8dTXbg{}sER$vY)o`rgygActDnxcRB@t@icjw#nu2fvq+c zPEGbw@`{6HB1sOXpPAI|E;if+VSjDyp9LKZB95UQ4hc{@+%M(->*nx1^lR{c&HVF0 z6>2?Ya6KB{?iaZKvwL9RMW}k^|7G?74Q2(v_G>q*Y_ttbs{hBG=ZERtK!gG?LjQ)S z2!I>1yod(_0}gM%3;>9a|J?d@)rY0$|DT6c0yb6M_m}$kY#=bc{al1-r-{e$B6Ln`Mw~yd1v4( zy3TZEdAibwW=loZDw)7i3iYL+Py!tGiXz&eI~~nSikH+c>A2oBerqsAfLIj{8Y7bZ z!oj)Z z6y0e~&rQ!RnAqzg?P^-fue@RL4~~@g&_F19%FAl~YBA-NrG;FxM_u#W**z4! z>|9{4mJ~${RJ=Q|!a{_C zASafHOdCp}I?Yfiq>?Ke%_E(DKP6uXya*0#Dg#UAUsUMt+z6myq-z3U12k|=+_|`t zcyZ6o@;EYN1;P zKsaFk&n5%IL#yk9GAZ3YI5}96Qx#UCJy0mGf%3{)Q0_IgrepalnP3=^D#u|=8J2n< z4%^l9;OOaPu}z=f4NE`=#49QQAJ~Kc|Ku9(HNy1lG#AgZLmIT_NZAV9p10;UybzJ= zQ6OqqP_D4w)gn3_OPmjf=PKzJ#ThmH<@(>xeGT^tj1BAqfOZM^T!K)q{{+zgj)sps zcp$9C7nj%(Z9@>ln-`z6Z#HCN(Sb)wACR@V`R2+CCJWnACyDBAL;sdIRB%0dh~J~} zs+mg*RT*W+CGm&J^~oPCc3Eo1J-{v366yV{PxSAMk*r)Z7WScPirFjY7|X2 z>eF#a#KNF0SF^olg$1O%2vhHP0*DHf$_73B9icy;l+pDe_!S6HqWB1?*TT~G)<%W> zvI?K~7`3b=SB!6!iCR1uCpn%-?=C|DYK{EgHyeaNsKh z`_j_Y!eyg{dT5N0p|H6KhLca~r6r@w9OBfp7a`pHmm!Z0+L!)*UW)y}Iiq^7I_{EcenU&dY)@*JTXDlZy2$zG|y>saXgtmw9*CoG&hGZBh)o_L+h zX>wK)EVn(SiX?pWJreOXUqJs%?OqC5-xNKzetq8P<&hx^dxY5htn#cf7Ph0K-Cia` z_45(`8@-%oANstL+46VyXytvF{#yuqBz*5I51AW=it*#KRSpiwdU_~K4^a6#a26i! z9!Dk)MkruiaSj{u4*0xCL|>N4Q~V63eOUEF?fa~M3Ap12Ncio)Y6;=u-q{gMK1L7ULlK8o}X z@P=>tLtmE{N?lYHKSgWuKUk}jjH*93*tZZ68r6dioqyWsyGbO#@He;z4z;VkJoVDoRagT(<|K;<65F*U4GrzOwSgUifE7vVzMQurpoA_-+QB6UJ;ML(82^A<^4SOgP!F>nYBY+*|jkp-TTIo+9RncJ8i3 zflWkqVuw(ZeE0heox4Fyk^o(c%X_pkWf3cj*84lJg@8VU2)uB`91F73@KM2w&95B| zWX>CSXc40WV$2HabJY#iyaq zl0VD?wVl%dp>jDB+CUov;C1~GA=5&L16Vmv-t8MI#oOx9qZPl7+}0Y0&4kw4+nEW= znvWkXETQ%O#sWS%I1K+dh;b>$>qq-mUO1ZkPFXlz^8zvXt;y~E&Y~47Y~9W-JG0?t z^3CH!*VZgAYjVi19}B08An}B z)5|gqHjMCl?N;Yb7VI6&AmVwc_KRs*0zoNQ?zI66`y*%5o$clAk8NyOtt#^^?!cd` zv!~X!8zl8St2471LflC_t}vkHB(eX;)K&O3y|(>hVuFZ>3W(B;l9E%2(Fmh!3Ia+> zON^50*SD@XrgdrcfT8i1 zZRiqlJsn?3_7I(-P566642!lcv}3RyH<^Osj*=l(}7wI8n<#OZIsk? zmqXjoo_ysS`r5X@^DnWZlrF4BSgz4qA1D?L-yO)4zMjY-c5_U{;{Z|HRZ+2t<_w{q z4p3si-&Exmkh2M4JF37PEN$9dl!(TXgL=j<3N-aw%)4Hlao6Zya(6o$jq(EEZ6?;5m}`}%{>v3{}b&AG>IPU!-LsRb^!E6+doqsoXJb88=!H1lb?_iT{TT` zxP`Qyl%AExCdaKheX$%XM3X#^M#6sQzcb@+&hx_Je>pQce0}zR&)FU3S|0@^Sv`+G zc<3{?>dfFIWJG$F;i;C9=f!W*rUC~+0YJKw6Ct|-@m=2=XKaDMv5>fYVH8|v;uomB zURFJmPj>o`q2Ezk<@U`~dPw^~D#_3UwNGO8(Ok|~{!v%yTR3Y3WbxIj32};@wQB1K zAVC-{Am`>x?>2B7rrz$ikn}80%hA0f@70?3i|ZmGCVFXi|L3JEa?^r1k=@%YGe>tO zfvg~wzIAxeN6p}|0lLGCOty({Z)an(wU6nqXAJ7$UR*C7@*B-&%%I2m3FMAwI#0jX z%ftI#z6g16Eh|hvr5)7g+*Q&+&`N&Y6@Oh~Y zx2cNg!`*^xf}v+sMN~t+bG~?iIR%Hu2)dxnkcmn-9*RU_Hj+R{Czi=&y4`3l36fYP zKQ#)z*wgIPM$i(4d_6W<0X)tNDS#9VpU#F0$2leWG|1WMcr~vwOGLtUw2-+aq5Z-M z*{7ZX4EZ6i%OCsvd%9l!I@=v0d0S5Ut6lopZ}u7k~J$0alzjTZa zY4u;ka+KrV9wSc1i>&X*84FL{0xQ&77P4kr#-o%9tazT=6Op? zh^*+Y3g{`nIqoL=!`yIpU7Y{T(PX1Y!Ksu26;B#uZW_yR$vvo~8w7VnF_bjc=a3J@ zbAlj!iRr24lcaPEaVr!Av>fG6( z%2!PT>A=3UrIG2JCkN^(&f7qm)2C9JtAu1gqMGZ;O`sU>+f zUmH{uS!-@@EDRfSeHIPIG)7mYyTe^ryzw$y zrYeTz$Nc8q;k2tSmY5cBp+T-~rmkC;eB=~!1NnBs0gqn;-!=z@7#6|{3Gb^j!F zy4^q0#9Fz1V!bE2stWfC4uXZuglCMkP023mQ%OR1-EjI@jP?%c zviBi-38lop-EqEyUeMP~RGWm9cEDeOUmxRq=sY_dZBVQc3qkT(o0I#>pxfY;wN-u% z_=H|D?6GKJ`1_yvjjAGwGrr$*jkN?{BOdt?nzU?CV@wiBy#~*Ji}~ogeh(DUA{_N> z633x;9lC9L!K;W>iuH+{jd@{dV)p5XQ+|q!vzNbn<$ltc9C}U-SWej4V(9m*V~>Y3 z8W2^OSjHT}@-L76OhwLyBAo%RgoCt(;7Zw)1Vy**fNu)o3~C5bKCTnN^0ahs`-dj4 zEB;Yie0X|5!=GkP2OiR3RoKzM1<@AjGOotlGEtx|-r~ z$1B=#1zz6~fr^e76ZpsM(IL0mEgWp*`>v(Nq$_u= zkcKWNiFI&9LvTQAu0nCD^>rW8B-(Z6R=Sz6tk*pSfzEG;%>3X98{**03iO}-yF}X& zbGFRJf?0K~#B;q46`Ga6a?cl-Yt>(*bKQ-niMlXyrUJo41?tP==w@j8qukABysUEShJsk1*fOL$Z@9~c+EE!Fa^c!YiV zJdwL9$Qi#}H5+cNYR)5JVhGXu)(~)H)0}b9^-1)1L}nu@}~6kY=@(3-u?00ekH%5o8f=2 zzQM#umG!y`RlFKxQ+S=96cy0=5# zgIW(kB>?F1smKRcd<{SVAf?iUUO)*& zwm6og24M{{hkF7<6I$n`0%}fM3-)}@U|sJmvWOe8N96dXf)J~AqHRId+mr3!)u`)1_h?^$HwAiozk)fipK*0%2uMkqwWz6GYcbP1C(Sv`Ar1*;tLj!LH|8T1+=yr4#hI~s{(4dV zcEr=Gb9+xo^kOxd4a569HwK8EO2b%LslaWJKIBoRL8FmD9bv`dHWbqJki?WA1{ex; zb)2b&PgZVh%3CJyh>o*zPa$j$@);cZ0GUNuY^Fw-x0V)L=&=1;2as+RPru|JSyN*! zp|FBT!+8Ivir1~?3Ivb*a(MdLy*HMp%)gP%H~s7=38q!wM)w!>L12dcoo#+*hqTFZ zN0a6Rip&{o1tGIugpgJzwe5)T10&$o-R$?G*6r zosbCyZc@mv(J1BH%%FixDn3?^JynqJN;XR_+mBlvBKvw6*8WLxmFiPE^lUEo1LgFM zgi+)a#jSCpGzDqSI9+YNg~ZY8HA$P-$XR@EtdHWfeCLI2jyE*V%*trOeJ(YhcQ43t zdmHn?RlZlj4f3iKCdrNIiTdP+nrDc*ODH-9j>iUo>$_YvPNcmhT-yv?*-RsZWydA2 zjTa$%X%P6&?0WDwO1-8c@PAlHj=%#A5lG14TON$g$^Pf5$FZ@nfo_S@er_Ic441o1 z2|p91pWALO@6K!e&E297@!jbsJ}0nO5II@RntnBxX~?ginIHU%R40B(D1TMj=1*A5 zm~N!RACx{*WFJEc0=)07QWLGl;uS&s)&jK#XwFSGm?3z$EFWIQpZ5G-2jUxn*2A$xU-F4AvqaVLO@tEOM;j2w;n z+n_OlE_tqUn78qPCYv!Cnp(_&s~_hy)!Lf7`rJr(nNgOpX0s6*q?W8IDEg3^v|3Oy z&?W?C5VzJI$wv~n_BCV(l!1#ZM-~r39SmEq@UAN&a(>a*QtlU?{t&)wmFLxBB;^_5R^dXI5`S>(MG`iN$YeFNswrf87p{CU=(k7q!nPs); ziHP*(6F)`bX__j|Ekfh?2&v3*ifwzQ81Gg^n{u@Hd`s>SCMOp{KXdFS*iKhF&Sz1- zhdpxwJbAZ^Y#rgVor7w0)r_k8*3j=mrRvO(hiX6SY!_=ys6i{S+!wm$5keXh5>x?c ze0L|S5t?LOA1}Z%tl(@>x0&vb>G?hCFCU=e!Zl!Z`do_12OMZfuZ~nIN^h1gi&hZT zkfZi7?qHf3))M)ff^zB7y~UT~58Z;kXAjT7;cY3|@sb`d$ilhCgaUC(B>jt`QkB0x zu0D9mLBr)Po+aSNi!OHj`ltQ<557(irhy)&>7DD7O8b5K@Yru40RWh|yH!D$ZKyvp zV{CPDtd}e&=5_SK*FvK{K&T|oGS>X?dZ4n3=BHCKsjjZ_?bLIlNyNY;Vve)dI4!2s zPv_Ht=STwM+@=|f*8euzc?O`1p z`g+PTRUS*=)$?#U{I0;+)wblfCftY?rXW&{u`$OK9uy&sxqno+Kkd{?Tp}PD*jF66 zuuxzAx~1{noDKt%07KuM#w^#};-jUBl{_D>d*Wj6J_N}38QSl0ZL>ZR8?-n)Q=K2W zLK;n*D*3iKQWs1jRhD_a!R@l%5g!2)jg`Fx(sM)ZAAT?C+K!k{cBig&vs9)Ci&sVMw7EzBkJb91e z<#SBNXRqVd&Yt*s@Qd{-l-pzamt{%ccv%tu+?kN+P!s34$Wj_jvTOE$u*pDM@Ez}k zs?4n738B#wy4eHtc_yv((jx064HvyRvicrd5<3#Zm|gCgA<4(IPMuC^bK06&x52`H zC$M=H&g2h}@>xa=~b*j)TS%agsHp5Hjju? zIlF<1J-H#y#_x5mJSp8OqGUQVcZs~QXdcozAR}4DK<{0FZLep)zpNO?;<6vjrF5cv zbi*+1VOR}fKm^>08avTOgHh*S->WMKv7o~;%x=%rDLu?L(Zn?@%*+GRl~~Z{jRao^ zWCffUi$|y7rk7QTVgHcEPeCj{p;F8*Ad&_n=KnGx|AJ>f8P9J+OIYuE`!dF$sxu(< zvoO!ylT%%#dP4sW?^*9yWqCc6w$aCobaovtQ~~b1U-3+{-!lqX^}`FnZdq22y1>Kf z((Aadsyu0Zbv#qmxM_#qlfO-F_tDcE+1K9A*`Dzcr1{Y3ELJR(!RneQ9u2EN4wi?D z-5sUwIAZDXt;#=3vUU_3n(-*qh?VnOVAeaz#^I{=oRqlE&cg#V$%M7SaMf#5yYv7j zM8_*s56(CuZeqVO$@Fzj?_iN+kB2h8-lHPPS;aMf6u8| z$JZZjKD1uUPK#J`bu@oWoP9NTHUBE|*y9tad9HM4-EOEM5)?fI@)ix&4f;4x8y?gN zIJ-4bbdBDsE->PhYhkj!=otqa3K(gixe8}{5tQ@1MM*wgB)YfGdcfvsxYeVc36#L^Wk(S)qqbS|@!%`Icr_y=3V)@72h)$ZW*oCwOtl=Y{SC;Y`)$$7&f z{vJ0abHSw!q32clD`Ptf+U;huCX6y{R9tXgJ8QD^cr%nc`*Q9*tFd6Ks zXF6QZeVetMSSj+dSfLOSL0h+nF-|51H>=(JWZt)goW%BA)Um3?AI4zB(Q`E}E`K(w z7-0~|s)z0zW@(fOSkd-4dtd0XKApJgtjS#G6K`V`DLMR}cTx?WgFgCt+}e-TG+8(? z=M|!%RNYD+{idj9I)yrhp1zTTyi-1!X|w52Gr!gG@yfx<%Il`tSRjpn8F689GvZ;H8>8&;lH;m||5b?ebWGJsWk+nB(|2PFP7 zbdy>csai(*-0y36NJrEvkH*Qx3WD{E{P8d57f>zB=M=D^8-3Y&)oS1d-m?`R{7>B1 zZeuTQN4cK67{-)44<4J32tCFjG@t2^KiL#al=4}&#>FR;`rsx^!sD+Z*Ejc29D$-> zZ|U>~m;rc-o(u$tQZLbAfNokv`#6@ES9l*5`ghmnn^tMj9>@LfZp_^*1x_%B{N#sLE&;dx^EO?k>G)kg z@qG~;)BK?MUxh;YSp;nJ^HO#0txI3NF>Nl)4)xd+ENI93gV-x)yk{S&tqg;Sa=mo} zvym3)hm!BTRaCYo-cA_p-H@jX00Qay(yefF^&XEGf6p<~Y?7lipTXeJlVA^s8p6xWexavn^AI=$dL5*;# zs9yO732hr_zPatgu4J4+Iq`gcdLez*-`r(P>|OuxmuI%v0CrZ{&nL?*avKgab=Q7S zNT-76^CphV#)qv+=_ps1!&JA@qUJ54e}|x`$Pi|Cfh3PDoFYKRAFaxjCG9_i@8IgI zMvC;ITbe*_R(U!gup%xvP#|U3pypT5eq>AuZ-#+tlUA&5nn=8}oZ{n3m;zzct1Vnn zj;To}kf~H0+>rTcF=gkR96)}lLq$Ubmjn!;lKZ~`RBUkP+S^C-<0wP&8x(#GtjQ9A zeLx_|oB(tD!-M>adi#4P^DOz1i$NAMkJrd6UwEdMhd+ z-=+VH1z5O=`HcdoTWNDrg|2#3M5LCynJEeDVGl=ZcAc6L1EOd_J1c*A=Jw~C(p+jD z{7*{~w$m(8E*hFThB`+(3eHET#4|zUS<5uG)-^h8o9cx&13&jJ_Tc^Q)kvJ4A=zbo zExzT{L%K2Fh8j=x0lqDXx~&UoNAHnX56Fr}&uC=`sVJ*?Aq(?rOZ=Ef)JpBYkh60~ zh$c1rxb%Ds3be-)W2xD+T0S~c1d=xzG%1et-0d7Mov?miNTpi5S26cc=X;$O$)2y= zh5^3y^fIQD*=5dtOHfj~pjdReI8fzTCeOVwnW{hEjec0gDsI=sB<5p4xe1JA!;rM& zXRT)|1GRnkv|en$*CVxC>utA)1J=)Bi?xoV&Bsr*V>C0C<=sXiR6NX;E+v6_*c#2DG!Nn$cCvaWmI zGrpVzZye~gk_5>hb|p^+AJKlqgP(5j)v>#>K!)tuSZ5A@-k&hu$w9wS>VYd)!diN` zyjixW(O4V};37#pkOHeBsCJ3nEJpWS){H4tHV6pXVNE!F1t$;^gV&;A@Y@gU#)H!^ z-Ja|J!rp9(kU*m{ep!p4Cr_q(^zuUj0Jb&L&=K4cA$oJ^B2P`wL2$FyVV(qcBi_k&LSKt8!AkelZcboTQ3CW=AWaqhU4|C zF#$*KZV8#ab*OXzIj5*c(dS=+YPe&Yd3b6P%%kWNz?b6Ljf6d-zPQMGNUtSw%lfR# zzI0v?dRQVxZ*@l!@@8H)AI8n)tyOIKBre`kwcf+3*yy{pQL@BaP2s1ac|nE%87sdS zHXF|0LKUa!7ls-NzK}&WQCDf0F=h8vc6yWrs>alUD(82AEmU>yadLq5S(mCb} zX0&qWc|HS|cltCTvD>{$P*8X}?$1^)bDyy>#c20{*)~ zM8Ti0i$&T}ZTAB`+PB=k90P|M_NJur02vcu(nlnx!&_`C03|tvf6tB zb_PKd)FhV_7&hjW8`#CT3yB16?TY{n4tRhQ6p;M@`_}mLl}+wc-Nt2L-L$$$Ks1a< zx`peHGT5WVm=s923HfG?-FBWaj=GB_XL_E1c6O?a7N54*jZQf#ZI4xB?g+K<R`62Tx2}^)tT+&=1&UOQ~kQFzC?D*D&BuI*``*X8iYUAle?hVA4t@5 z?~^^eD^;B;i#rw6Nt#HuE~(%0Zo-1)@6MI9}^{K_wEkTL~6hHodn^e7l2s~qb0P7 zC@(8&pu9eQRm1aD#Ckce*2(t5pAY5MmYmcbjiZ5lj@78*Zn}-``-jaa5L~!yjg$2jMVxX}OYpCVFYpkt({*mYXTSfZSp7|}jm*e6pDOhHWJ{$f$x*-a&SZ4Y zo4vN0)%SjNa(f3!;5e9e;^N*|8NaYhQaV~Gy*$DKT%tlDCV&f@Nij8#rsb@&fDMz7gaV2G!Li( zv;A2eU+)vL->uCSeR~{VdBWawa^#xJLpP_tN(-xj#*Mu-&ttoMyJ^93B$LHSykfks z!>zS*ky8=iFqA5GWa4YD2F0Fy6C>YXPUQ_MiE+GFc$iwX(=vFMf=c*V^2W3GfSf?Z zmmApVY7OsBdX}r5@U{0%+`3_>u4C{)_a6=GsP<0*v{vzyI{*KgDNOWkoNjg?%3S(hF`4Sh#QhZBb1bP@@$4&F=!&9T+U5xou-c8zl;1kCS zZMu=!$k5ya?o{bH&~tlT)~(eC3E3Q>B+WVkBIsF`1u=IbWK-p&k(fiSNS}tcz=&@-w3TPCO6lq{4TzPYDd}jGs8B(?5zFf`z zk#sqw!$(A=&IcptGos1KJkE=m*Z4{$B*z8<*@7Mgb|Q9tSAu~ej;R6*A02WF7FGnZ!?+*bG5eKPn#>4 zhecd)I%Q!Jx?l;Db~L5sN1)IYBxxG~Z;-g|EUe z$rs6iq?S769IdVZwLI4ugZDZrc=0%0>Vvgpe?wBrVv9SFzJs|F(7gox`Mk_pfG04Z z%g`w?9arNV4)eHJ-Z*<2)Bl3$Xg8{dO=`oPi2h>1aui4mKE{od5kh&$(M900Av_9} zaJxR*k57%6%$%xwfAdb!rIC~vwQGZ@sg5kDANBV~<$N!0ikCsAdd2-Ds?F0w_TM2& zrbSmo&_siUPO84Et%!z1p#NmVIS24JlozSu7E#P|n!ur`yz(QiKKcq7ogi_a`4vug zm#T*tB#SL)+(?b}+Dq-z@aS(si>HHwA=}xpqpd1Cv$Ns|%g>K@lavMa_t-7EJQrOpB^09#M2&#ag_EHJ z23L7l`S$i!F|2%mDc>AMo68pvWvRxHeYc5UV#4OfZXF@YV6AGQ^5o^@k4$wCUXk04i2LQ>pB}f|A5@HF{>lU{X@_m{ z@W5@%1gZkxpHjEx)dDFHS=R}KMS@S#KY}KeHa34HmUWlG$Cw#^LIU85w-=#kRc$^P z+4ZWKUQsBVtS5v0F@ZKmyB_ZUFtlqqRozt5cfvGPtWMz5YQtp5z^VXhonKo73zfpSc<3rDC5e~R^X0OI1hq2CI z<3-9scUR5Ft%+ek%%y8)H}T&*E?z-L4eL_JBr%YnmjGGmKoK4v;3PtlIB`V=odh1; zmfjQAgITTO1Vdh`hS8*s^TnhBsPZQh6}GxON@TX=+UUf5sACEqHQE^9E5pF!?dX7e zBgVG}7{m+@+sIn=7(pXi9%5;)$iu! zyviDIr9>RzEX6Y;@`AQP@|d+Idf?W9wsd6r$*98?tx0`l;goGUjK_-vj*~Z(EzHd-xGDqmK3K3h)6JhT7R%F)cm-ilJkI zQ76RXsI=V~vsjPf*T%O7w|tPfs|}6s5U)}u!BIDABc*#;cslT71tm4F)`p>@3mKd5 zQ(b00LNmnkfeG_^g(gUP>1}hL4H>V~v?(`{bfs7EH36(M`wg+;-cTCK%2(|QviZ#( z2sXz%L$l`Br*eQMvV}k5Ty|USY*DTw4%z#dwB?SY7>6JCgback8k%kDDzzLib=)3N zbppy#A@iDi#gL9)pB|eHBy09fK7&f+&siOjmu~#tn*CTpTrH3QAQG-DdK?8bs zrTE`j!(SBSw~6~z7l?zZFACYkuH>CEDldAw%NE?rH}$zMB~V(j9;iY3^+VzdGqK(& zpST{IH52*(idyh$Pv#ohOBgB3;#(5Jvi8MqQ4Y#?%kJ5u_Vw>OPn3Juv#-uJz*}vs z;pEonBTi2pSk*o5@14sn)oRjrr~?5C@ED35>8kf$0f&hSL7)*?plkD%^56 zN6j7fIv11RkGJ3vv~Yi=wZ#1L&q0aOvf$iak^>(U9@*=_=M4BRaIf0k{ro6`f|?e90=Y=r?CZH#i1VF~2_dQ@He7&+e!?D1 z+}nD6>lx_lk*}KzC=nb8448TisiMR&P4UE9AEFmS_88_ZYy7Yi_nwBYjT2*?YYVMGheE7zVd=`on-8A9sOsc)vX zG!9og7tf(utMQ!=bUw!DDRDYT&HxL}RAg+3R@{coAnj|K9?gDA{6>iNwa=L3>F-a; zlbBEm8z+M;ojj%s*q$oZnI|h*q!8PHz+o-;I0^;>;LI2VbdoU%H-?aVjY(w*< z@_tN2@zTcvetW*V!Lcw|%K&+0$iQeR+^;^#cDv*=LGn)Be2}*^dUmKSU~-T#>!Kfx zyd6+HB9 zS4xkjoN9sgH-9-eckzAoc%)w?v>_yd8>4~bhiZ8g1+1+v?QZZwy~~gh(!-gO>w2 z_~w|yoNNb*1W6RkSz#{9e|pksQ5+ zGzTM&{+@t+@d0k0E%=BTp$@Psvt1U2USG?d_M>N&Y%S3<2|4W@At8sg$xpk0Z%Tn$ zbOD~xW99zCNJUG=HoBwov6o0YvE**XMo~nl9JZ|bIe5oA# zMC{F=vd8(dm5y`BD5LYB06hK{hnJSwd}{qY&tm(o14ufAHxzdEF#73kSoERTHV>^B zn92+V`YpC8&**l-9Gx!uZfP4HlO{**P8j*liPG{l6YrsUwp*c67e)s%b$ASgW$W>< zC*FyUxPM?Sh| zq*HPy?9QJ=JxZE_G&^ zI1uLYb`~so!I)x~mNw+f!ILyxPD3mt?Iyw_FEW*q6AK|_HQE_*rJi4IYD7{_*49*C zAyD%TB4WlVIzm9a?GZZb{0prTm?gj)-yFJ72AU@>86arF-<-l}sI%U>3eV5t@l8sr zN(^x?@j?sshtpyk*DDa&I`T=*TmeK5wY>9vAQoDSFJil>}WmpTMch`AmRj^b5a-H4PR>v1S)2ZG*NwZcYU2ezqTlw^OwzQoWv-~ zC?8kP&dG&fP3$gHjdp;6%4Z&dtK0&+_W=oMr5ZdM}nC!0Ak;y>2Rl%fyE zl|QGB(xbQ@T>bOkYO!_m&4!{KY28``z7#7Tr3j=W`qZ+q9{PD~lf0d(({BC}*T8}G zHyd??Slli#%y19aV}A)vbiR6o;$&u(EqgWX=3Hc|4?(;peGE@yZrVIlbPyDbsJiVk zd+{6WZ?VtHE03ond&kp|2%1#}6=;9*^$;0Xa$8f{rwBs_kax2C(;#~$2xZBp!oJ+q zMNa;`mmgMPBtjmQ01MvRkoJg?+jRmZ!eVZr`J4~Cjb`ZYqkdRf>Z>D-|H&QwnwKqH zHd3anhZc|sR%W?);R1f^LAck!4xbIHDnf(B>s;C}S%kxRWZKKo51pQ80o~Y-IfSJ* z#zKMR-Y+r_^Zx`!M)_`SJ8YRij=atLMRXJnb**(B@zuTs_0nF^4??WKv^~ezjOhx+ zwwJ@%G=g+@j;1xun;r629~{la@1_^bs7H=lS*q|`ccT%$keY*ZC5ymu(YXPP`gD~U zfZiqhuo*PN73-!R`#0tPP>uJ=^pko#2LSSm#K4m6b06bHy|>WhTBLcftEnrB`g)`kkg>p95F1D=4!#r{MK{+d(PHHxz`QHA75Zu^^GUZ{nwuU%y;u2yA#_JHF=G>o~NcP zaT+$L5nl~eBk;1a_T;aM-Jk7sn*5r1Tr>?>7lm$N(-bSs&!7 zR6ED6y!%6>iuY|i(%Q>)o_EiK>{<4Dc~ZA-IyiVu@7@lV^);iK)}-P5Gvg;j*)0G8)|LJvtt093HCje8bkgO9RXKG5@33btpywVB6@IZ# zqAj;TzCSn$g)?e4faEn9k1fSD!)mv5`x`4)vud@cO2?R<6?nTrX4ei~G*#w}&VSRY zKu;YH4^C7I)~F|n?pi(ZnN3Ba`$VhU=51R)>4Y@OmD+XnNF?$LapGs@tOXk>EsLe@ z=lIU!jEshSo+HH_JqE#vkke=pCO%g`D7g^*jdj9G&gazNV-Zcfm3?;@9;u~7qu4z* z0T4>-u2`d#d7YK#coI@+csxm(Lk=;Um5G{nauOP_K4Qh>#??E&_4oRNN3b#(rv7aR zRD4LSe_*Fpa@E)&-zN-CsMk455NAQdIPi(f$*z~`~#8$YZL&>rtCY$(g zP&Yn=f;<*>*Tc1~1u{6RDxs76yYV7jXB5LcL_d(^&$s1pc-kzXFC@w6wJbCPG7Ra7 zn&W1<6ft1zBGj|r98t!|`I(EZxYb(cnvz}gaE?7lKv3-4T7()+B4SaXf>z=B^=gKm z7aOYEEtMZwxjyRf`uinhb#;tpv6UO(W%ogeut6VPLXuk-h+B2i~C|4U_^E z*KCbL#5Y($rb6RfCEpgq(oC^#&ziFmqLZZhx&Uo7p_ib^bofHvYokVz|2WML*f#v0 zf=SDsEOHu+?2MTZ;Ty(hRVbeLhaMPY_>|?BsEYO~G+1Loa|V{a$8I*$Pt=tX*b~-} zJtvY3IDw|7hfBaGr7%jgW5Gvj@n7+AMN}@g!JOf>A$XsXg#%P1k$RISN*nQ??VPd$Qem(4-O z5Y+Ew2i4YvhW!t?XnLW>{M2&<0!`d_8g6i`nT9w^@yv|BX`nPExpvn7SH2;pXX%PHqkj{5ndd3lZ?HvhX%RRmLs;wrdJRf@`m|>5TNVdi0_G*{EX|*#rD8 zM!-aiXXZZS98!xm{kK*vOrA_7kl|X;dFav-L&*I6TjU!xs&Qsyb2dNuy$inmjor=C zQP)ne^xaJNek7y!3CX!p_+xiE~bT|4An7qXE)fA7}xRPZSm&Fgx523q_k7$2UM) z64xVS;EAFcb3s`d>E=c+JvKj=DFeS5!0$7xYLIgxo~Emh(0P5&Zf<6+8r#PA_FgzR zM~2K=uDsFI@1J4{Xf`gfX7Zd?|FGiPpFHVO@O<8i1D0Zyt*unyGS=0HsjD0o@rvko zP0AGx5n@Wx5zFcqCitsP>4L(Wg2vt><896HrAIUcl1E=Ukt_ zjSybj{%GYCJfZ4L-Cl-t)ohcl-RIZ5oql48>o4<2Z%*SF5!cD>k-28$9XmRO^1Qm? zYM)Qhwy7&xCGc;pj~5gO#$yNd>4Dy!ZwC%nTTCVnBuE#HJ z37--pSOad=;9TDG=K**y&y{13tHe<}O zXW40)(`>FlZ0>yJ_XU~NV*+h%=VP`?P)2W6-&gMvkeF*vZ|E)Yb@R74SUcw+3ZYPqG%*e8oCl&e{9 zNP4<KgJ-7XchvElH)~#gcwP&38zeY=P22%hGE_g*i9ecxyR4~gYW0QheBrZ~ooOyHo}?c1Uc9y3o&Dzal9C90d9u6B`bTK5 zzk0V|oC0hY$6KDSsdzDptr(?R;i!73+K{4|azb#d#u5Dp_}tNlYjb*ivky}&9#_}! zUQ+b`GMSjDSRgRyyDcu;^69>{nA=qOYZaD&$JxzLNadj!)ln+8P(OUzQW0^V+jo0 z8A`W3-^`E(6QIezh>3POXNZ37>p`4PE#4pX^u<>0(GdZ=K>z5(Y%N?`BGu{L4#$({ zvGk&8k3^de`W|3ydH^UQ1{2FYF{UKWWxNgA1&jCw?8Gu^mKX(~Apwi>Wl80_K<(69 zzZ%bY6Bc{u3j^o0qIk53xibA0zxqv#2F>huf7IcB-egSLo?*B$?e}^_7?6%B{5N8E zaF%AXk*SeTgZ?LFWGLWq`3n$&-TtN^$_f_~;Am%m(};%Dg#puxpGl z)$rMGI%J)*ZnPU1x(a|rVv2na=EUJ9HCKw)=6egIF~a=90-~ZKl&bu5#@{MyvrX$J z_BwdoL@Yc+b}|)!b;3NPr>lLV$1Nn!GuW2bJh++rc5*zg^YkJujs2c@dAkTCz;my7 z*&)rux(70j<#zTrvdRL+g&yY`6`1fJJTnnB1`4%I;Ea~HBLHk=TR%e2OgR4r|=o2+-V_#eK$Iv~pDc^D7{ zML@bi>5!0aP81Z7Zji7D>25egMWmFJMv(428Wbd@ySuyNi1)c8_4EC`|LAe|JiD{g zJ3Bk``u*V}YdYph0<0s(KN3R31s3ZcO%fkfI-_jLVb| zYD_>5AfZ{+h(SPG6SC0w@7yw`K=YcSrN(~6C&hf;O!t6>QY+q#qlsPPh*>AQx%Oct zX>SY5(x>!xK2VLzH~gL<7qyWXVk|SPm3rywI?ilygiE9i0+Nv`BZH}2bGsNsW{nR+ znj2^w#TdCIEjd`9Gboq=(MN5HnENNjGqXQv#5023K6RDai&jY@m+U&kd145a!#`{PtK{RYe|6< zuP{k@tvQ_^)Ai@&?}Z=MOp+s$JGgFtuaBjBT%;Tz*%=@D_F9~yiT1$yf~8GcXG-1X zs`2QyqnX3We&?t*uvhP_*1xY-u;U@*>32N2Wj9K8pt~KxdL6?#-^q#2Y2I|cV9AQk z?!=`8HAY0hs(HmsAvdcDvR7CDF^;Sc?k^-?YnOB+j?-R9a z*7#<{_$pS=9_)$jm-Y=iwqkoauQpN9*|J7J);_5bSQs@6rBx2&7d{g5R$XdKlrq9^ zvipobxHJ5u8Kc9uQ=5NpM(t#tB1Qim^!oBZ?pq&E-el^yN~6RU&Yo}s@u;a!_P@3j z-ZWKoQeA^C7N$?-8r(+o^MYN%krM!_y%ku+Usjd_y+RGrkCapzUd@`AqdX3G;AYrg zocrdYTtmD2+bt@{S^P)-A|>uu7wZVe&*S0c!NlnX8tEyfkIU*_3)0T^5o5XgNjwdH z#TZu>mQuFoc(DF00~*wCk7twVR-pYJ8{!hI`Sp!sbNVklDy<4rn{UOt{1rB|j6-*E zt#_;(Zj2rXt07u)yuDMNQ>WOGw>fPdbokv4 zFTNz2Fz3zifR>kDl(e!yZy+Z9`t~R0g+&hI!8+(ft4g$7bVQhnhn}*pQOFy<{)Ljz z$(~Fnr|v?JIu0h;;hrGw_2(gO<8vcxW9Uy9PlCZO(7Tm$7K;R%>da$)?yxpu&OG!G zA*g?fD>49-P&c|Y8>7t7AhKF29OSX`0BGK^VqnWNIlDCVXd_le$=?yv<8Xhj&}MN` zF>kZrrQL?5tKf0}0dR$M^}D*Fvf{2+FXuLTnktJnL51*)&%p+V@*`Fq8;Qr{<(Z*I zFRRmk_0tLCvVL61pRaalNK7nK6|Rq3nyTJtok_%m#IP0F*-ihNx~uDs6x#FH#cFva z!;EU?28EK?6bspN{_%!}7XmWR%T$tYg>^gk@iD|ak*doa&9O6{U1%R}7Q5LMtj%x1 zn>k}5|423VyXk}@fD`){dySUva=r2 zou(&EDqNG~86m~ww2y(OFkg^P5ir5+*-W(iEo<~sN>(`ps%gRe9Ee?&^973EUOwr2 z-}_6LKfw9{$E?b{RsvD?uaS|FnWVtMR`i>5v$O-nj*j~Ixm5FA5Q!xJC84c^vTgab z$Vv(&Q=a9XEH~Nx=njSPUd_aaTYcIG(1=E|2q{*vEOi6kJatpqBZJj01#PBgiDd2r zrqDo^9i5a~{u6$X?>P|MkdoCr1 zXtaXF_fJ0fhS#J5f^zA2Ijteiik1BCZ%uu1@d#zSOf{&A6rWo_)&{oIhkV|qrp49x z1mGGHB4X7G7P%@Wv%9%`*t>~7Shza(``t%A?k5is+{N+tG7cdFyLb5~%6~VZU$dNz z@A(rp#?z)+k+p$l^^U+3D6>Mu^DJ!LL3ny_ODarKk}t=pc@Zr%49kwGTuVdaIb%ox zg?v=cVa7~hLGnx6P}wYp7yCcAG{bV3Xo+H=X@d&C1X%y{+4DM1mf?l7HcPARm|E+l zPzQ%-H&p~#Qc7YR?6{<#d;wczeKa0|He;3)F!iuT50PLUF1&BAK8BpU^7oCv*=XrW zrlMo=)se$yC{y0^2tzI-C8ChaLNJ8cB7Q72Hj)L-`) z;kZE+{a3=xrrP7xIi7e9-<}75%8DG;Z{;LQ6lj00lsAH&Dv zkB3IKU;MO6^dl!>GtD_@YSLAMC$-EN8eit}P1qx#VDfX_jKICc0YNuWk995_P04)mGewE-9 zIqmkA82N;3A;T;6IeNa1zlmmU8L`&z-3W&J0-z>jVF*VvFIF}^;th|p8<>|V3S7AK z(1QN!U?bjNwM^QuVsnON>lRbtKuJNP88JiHk*>QVP*&|ZW-{lg>F`J5yvzfF!y-rG zKI#fx?iENVNRfzQy#78lJ0thg*QmJ9$p)`c)QR2o4(`KBB{t`8TEk1VR=oryQ}a*C z>$|6bTogP#V+?mEti6K#DeY9n-egdQvXNH10Z+X#B~oNh2_IJeJJ=%3&47w~tIhrc zmrFsXs*=B~{I;S#X1cExr?{J*+zVdAO?6b)GyC*8uB87rL*H%Wnwxk@1w__CER=0O zuFsJIRZ!i5*53S}A2+WYV&6%YMI1Q2DTLt8k3-K;tmO(xZwb#^`S||FS{cDLc`Z&$ zR%SWKJnAP!1{s6Sc}$^)K-z40Jc3Im6JTL&Xe0zK;e&s&VFjHQY0H zsT&!|5#DNWq9`zU%xSZ_+$K7C>r)`T%$vy__xRIt2(fquA&9yrtLm`vFBb{>$6sLJ42OC(rBI$IHs?RX;wm0Y{qjI_-ieF*cGxoEgGKU! zVBn#xc^}c1HYoEMD4ZI%USbl`v!DrzWVe{8nNM52)-HSsFBdkzic~DO;8@`dM?g6v z&pA?(t=t0w1|eu>$Bs$)Et-X8H$DVpW53+y;cPGBea|a*L>5PsKlH4GUM7%NeIke} z@VG-7zSu=zU}LS>i1xGX$^GkdoTpQs60j?xYIviR=C>H+)`sL~Gp}zd`@^}Tjc#d> zc&?<6A3WOb(29z$GhnN13n5s1!j^gB!ql63BwkGZw!2eL%c}(raF;K@WF;0q&Q4lj zvUPwJt9(IF_m6k>mVqv^!E(p1yp&uHEPG&3 zKJUeKUgE1rJxw-0uXcPP{6KkJXMeEL69fPsV}$<*5WHG*g8EeMc`V>c<>puxfbn`i zP@2F8?utQRK9!y;90*gJqG!M*bHHR&T;kE$6mq>t`JVsLkg%%Ma1UZZ1&m-m?AUR+ z1kf;Q8@vtNUoV|%v%j_GIRv|uAg!yYfv*{ke;pY9f#U2}oE6xQZ&^U-|9PQ^&Rq`+ zp&|)O;i5PSC>HB_qZ<>!6G+Z@ugp&noa)Kq;Ni2i#p218`zn+tbm-;6^(Pq2hvbZ{ z?}z<{SP}f{3{9Xs{31;i+59i?bg?sGg~g#8Z4BcNbJ zGV{-?2&3MOMLpcnbg;1as^$_KoTsJ|Lk|y5o>LT6tsK079%Ro!Goqj_bORxTv8o7= z5OScRYA+Rw^d$qLx=(0+c)1UfO2P+j(SYwN(^Lsx1?fwTCf)iCNl^00GcP>YqIF*& z-A<~2jRRp@z8I&6MNVbM$l@#MHQTqtJp;^yB1ov;@O3Y%h=V0T+dUFxzSw4oN_=Ns zZbQppSv69TT$rW5DLn#T$PI zpZDp<^ZDR)y&EaPU=>iA7`9nZ%^=NsqC}Yuwpna`soJTXj7|xQYS4@hbXs*o0ooEudt zEAss=RE?Z^Z1&v~@fA03Z|@owCzK~iD1(K|Yf!(+)dPWE&!=aCf6Axe-)Ns8BEVv` z%kZ$xKGh6TuFpI@MH~N3L|9)3K!gzhWRW0*J%SSe{tw|TK$bP=pSb6l&gc+O*d87% zMs18XqNC-Qa3S5sy@IVY>?`YNJTeQhx1t`QR1Ze*0E__>o^BsH4Zt$rfAF273usP4 z1GtS$tjrb6!b|m~Ay&(k>XnDHjDSf=mjP2apUXzo0dmbC#X9ZNGsxp4&4SOWi;hJj zhrdSHixz+U=KSdk%VU6#WPRDh0seLD3QU;F8JI^R5DNa$v%qEWjq8N>u3D$AK!7bB z-z5Mgl3`7IF4W=qRDZt!a)H@fS*=rtkxd62@D~AKWV_mCU_lEoCgnI*2xp@u%Ygs8 zRk(N|_61k@z=95e`$%t{KMYgf*4Nek*?a-t!a5nC zGs7tJn-6xhd!f~UtpoLoD}SA_-8SGaBUNp)ixU51;{nx4O9RsX2T2REz$%aWJ1m=# zuUsBDANInsp1lhQi1oTo z2`hsu2uYU$pLyD#E!$HGLq{_2Z8QC9aaF2g6*EJ?%F}ufEFaCy5<-Fo^uf}&*%Iv@4;8l zMhIiTM^Ud}L-gFQ>iZ9{e<3>@K(=`NY}F~w)M5~*E)D%TfiAk1_%Z>4V{ydCf6gJg z%t$`)t`Qf&z}`7s00;-z{SP6_AZeYC13(V+Iv^xFfBORCFnSs@0&qt(hQ(5xlMjq{ zYsfCfw|w%NOvYfL;cCaRT_%~^=m)@#QjH*cK}09ezuIfQ{$O^4 zh#mGbsQebEBtnt)lgC%uIyQr~REx-UyNPn?sq8_>91reKQ{%Y_2I-mNiGhvq~ShoMIyLhk@b}W2Om?{|q zdZ(Irj(TAVAd4AFSO9x59?O%>Cb!H(o<+KIzf|oL!bt|4xxV3Fv4N+yd>vn+Odfmj ztPLEnnL=1AC+R=}TsCIVLpTeh5oG6;R!Tb&)P=~1PT0zi7euC)E%E{T%#|SqW>!{$ zu*)8D?lXY;0Gvx=#PyvgWjC?SKGcvJg)6i>+st17mRmT?%v%I7B3#@iHtz|Ysz1nh>@Bffwd{YARKI9wD&SMv@VRv zedVf#;_aixsF>e?lgck%`v$%*xtQ%vav0$9{wN{Hwzfr69%HBBerP0KeIuL%9?``2&olbf=Nf zi4h7djXqxVno~;xzhdG$a4Jn+!x)7cMX4gh1Cui0>eio$kU1t2d|@=ia^+#zOlSOX z-k+ud1u^wZ&w!QTq89&3>cQ3^6D_^Pwn zft9J){vu*Q0-BMW>fm(M*bg2agw6oh0}ky=n6RD!qx%yH<|Z#lg38>n&Eg*$r9za> ze+Taa!ru&uqlQz`1UVVl0H^?$%(XEPMj4n3Em1BP4fq!y(AdgK@K3jtsf&e%m@rAL z`UUs^ntM0(>`&+8Ohl*?2L%9#Cb(TW!hrYBb`T5>E4D45KaT|f_?8FY(Ni%jdr1o4 z8^;>n?BmQ>X(KtO8Ui93mKli@LQ(6u% zI5>g~))&!^Y*NGs=#&m`Q&SVO{!^ct+lZg9mVV@stsT;a7@47z4nT6xcQ* z6@2LMTydG?=&ua`;60ckZC!T7Iak5N%CQdtqsT9caq04(GdwzF)x&?B0b(5h#>tp# zQmcrQmt7dnmvy1~&xqLe7-qS?;ymQJll=@)9L|~NgTo*B+cgUh0L)9GHTN7$OXx}< z`CR{xGjhe+fdX*=p_`JqNp`wWAR@qa-bLsfpes$W+BgA<^E7XYW}Pp|eTETK`G46v z&KEE_+?#6Sx}+#_cql^oe;iV{a|<*JLNHepd9(%Ru5;wxF~C6Dg139S_yz`9_OAr}yI)|XD-FT-Zx;fUlMDvR>~l2@*~>0oa#=`)%zxfiM4TM<5&#`SMyyA7 z^n$aV*MGOt0s2u02?(f+h@EeOp5D32HXs}r;%a12haXn4BNLuAVcKTWom~)d8(*}# zVUxMS1{A||O!x2ru3n@SW~8DM+L3ZAzyF+sZj>~-;NeEf4Rkbk=w=)rV`AJ?n=|cU z@?7x10qTqH{G#Pgto*P~Fy#dzvT+e>FGCq^xG*yO&J&FR$Z+2I%l&|0ZZ8ST-{uP` z|GrEz|Ba}8HBqIC8 zurnB>2v*yVH;&PK|LGmt5?yKl%gsXBva(w3DsgdJjix2O2M-&a(!pJi1+;r^QW|b0 zi(ne%9>u>p=UN}+IYuOO>b0i!41s`+rfJ@c)%Oe|Ewz|~9nj*ReXb+r z#N~@mHN1F}J!ad&6c3c5GX_svLG8B4Sgkj#vV-C2MHNpIsJ&BH#WlJX zYOTFuwIHCd=!I&Af6`?@@&Sq{hPwkIt7jfCM|r`?pf~PuQ_C@tA=M?6N{bY{*$Jjz zKoLjjHA80C?((l&4HX<>0YP}Bi(Tjvz||W%HUoo#QBvo{DLau63GS$ay^_U3MhU+W z52)9*;OD%K6XA}s4b4lDKy@S@G^xgJK9&8N*#9ZEFRZZc#C+xo&Fql9BD7n`xi6_+ zc6uiO#h0(qi3O<^v=%lc&vQgu1k;@){xARwcnS7ppzT3MYfR<4pvf6s!)Q9?eS# zFmYb*6j8|Z3ebw#>U1?RrxS5=I50c5^OTwAHYyV?2G{{?gUTj(ITP%Ydm`OkVG<+9 zsJJK18sO8T0GQmPGnl7kKjo_HE$(d#6-_)S7Wg!3?%g@TBNlle)`=OB>B{EQhVYvGmfW1NT^`IXt;hF=lSZFX zAzKfz_Alchtpsuw?0M`Y4gs7%i{YXchZ}YA1B8!4%GP-lI{t!l4G~08qQ%xHHEA z6bAD$4etO7;5Z7+j#j1#uB$Qvg&tj`rrOg5!Yg=pU2J8(n9*Sovb5|U1mg4t9c~OM z3aFZRODjr~nGTnmK~Nfl$QHyFD_&izlWnIJv7^hWZa5+`kr~_jIs6#^!i)p#aK+7P zn}PwfulN|{6nzE6Bifcojtb8_>R zrsd{HF)wy3#*u7SyN%Wl>NkNR1m2OKr`DY8Af7@6DG}@z9*z$JhN1NjQp9|ACv=E-@P zxbIs_*LbBZc$F2JIH9{3&TnCrYj}^^p4DwuOlC0C9~8~g_(EK1)1CQvnZ?HSxYDnd z!b>FqM`R|&Qi|O#%`#|Ogf-1l{bHIkou*5M76dUp_ptxFz7H}Ehkgbsm0)y#tcXNKmHLwC7A!xEDcz4D}h&6 ze5I-)uoiGlh7!0tkon%&JB#{Bh6Y4=77Et1CgbOLo$MJuHMH2^u4UrO6BjdR)Q7W7 zBXN^iYR7GhqCYF)*tPIZ_FKdo7moOaEtXb@mAO_WZTa5%GJ;mckKD)-EfGvN7BZ{# ztS|S4^kZj@-{nyzrMDvv9KS$5%}6R7_b)rW%o@rdPpFQ4SZDS z?NlU5 z%gAJeo+*Uah_$B$&CWUMIn1*ad1#G!rQw?aB~q_j$IT;21*ul~z!^`$!OB3?W69sD z*mmgy5#Q2QQl(W_T@xP_XE-C>@G5s`coHZXbgOcv7AWdS+oQP~!@tdtBh~Qc!naU6 zjRK!(0l@VF)>^F|=MO9tq=+AD2Kzq{*L-ejb16MI@0!bVvgu>IBf@fK!HJq~c85oT z#w8ezh6`<24>_(0YJQfkp4ze>OEzWx5r7s`r?0xiBsp^2FfS-!3FyaUeY7V|e5v;( zDvvef-(B?)@2h~_&x|F|;23bUjAii1PMyZs`I~K2$l-Ay-~y|6+v;Mc__l!&-EP*N zq-9qsIyAs?rCxI*J~+uu4p2KZ?Dx$`gr6UI9P&#kNDQnODS5c4=V0X|1;z>Yxs1z1 z^vG6zQ?zg|t0mBI_!kt|VDI!&Y~{#81t2X#{-6-d!2MDFn)Nw^p>!GZH|R8(I>8+R~e|nA^rw zW(4q724-;$nmqb01+J=**iS>GNZhQQet3SOlHyZkXYzYlMqP}m7Kw1}KkCJumRXJt zag0_-l>agYs#}Z{{b<%_b^N}>bTNZx9Bbp`pC-xH&ahsi-jdnu+1boU*ln7PsLFlA zcFi7Ri9Za1P2rA1j9oX$NtmZbHeb-?P@ObZZv4i9*_&))#2c4qif}5lZNco#kyTfh z)6rv}Pkq%ZX;o&uUBwDtPtJ9?9dHColNgwBGOO%8W zpNvmP%S-g8MduC1z48aT-SIbY?LI#II;U7X9Q3TUCvIC?xLm_4sq7D~DFQR;>6uW^ zy(;=seQ@dy#fG7N!u%61Av;ftgv$94vE+2K4~j?4pIe01ai>y+9&YW2Y?rd)CKpa6 zJW6tXRM#4I)YFl2?4mWrmO+iDBjKf9$?t4u*^T2iJrFQ8w<7SeOD=HUtwbW~<8ex8 z27RQ}j=)6aS+zM}_5bWIVJ9s!)`fFS086w5A;b5XZT3iZEzt+6(Y(&bVV}?iWK;FF z_^lVX3|_bWfr#qFaQ8sRWtf#KXGi`##s5Cqjg_OHC%~9`(NoZ71&ukCSV~Mi)a_YQ zI_**2h+6Z9Zsx1<5u|5w!1h%{b%34 z0;}dkD%JcK!y%Z^eMdVJlO*emvil-b4BVCu27ADvmuRIV&HPMQpUYr;stk(NbLBvP zHbDfOAqf|z)ojDD7P&Eguz({qL0O}!Z- z`o&frzPH2S!T|h`+V%A>k|YNs1phSz zK%p2I%I#W+OY2Dg>DdhcaV6jbrviur$nYF`CJVGUjI}`Ky=*G~ziDL90`mek`{P#u z+JGM2GXEcpb){{3vo_$UM9J5lXE&VA(e(l0H0|iZiv+$0<>4mF zBNVCoeF1K+og?Dx0gx{;{pD^5{%e~vOpHdYdfS9%&*Gm~M!Pr-K4*dOVwg0$BFzgU z{hj-GM#!r?3v5hjV65^!ubvRjAh@yrpW{ye8hk1cLf=annro+w3Y?uA{5N2B!31g{ zz;Qqme~b@slz2LOG85v!|H~?TB85A(?@j8hefY|D zSwIMTBj|=_O4b`k7j(Jevrho?*l_%c;6XDTDv~c|{>osh+(HLn6$k|UC&j2)3Ow?! zK9l2ckBrpG&C4?ztvHI02i4-^vxUU8X#r2ryAFs#^=s$=4T{2@c z&F`8*vwkFK;Yy@`Y91(f#0>0tQ4#%K%)?mX=r+e+IZ>c0QpCn9B5)Etkmfc$@^0p#NYEZ$?8NJRG+f1l>)oez9A5RfWukIuU=isxDaaD$Ml@EuVGdFpBsj3+ghT(Q!=hp zSGgpaH*Ommg60$|(SH@s+|BHZE%h1q6~nl1cc{nub0sx9F$=na#RseBEa`VeXAcQ~wp)i`3hH zlC1$E5+k0)EH4OiF}~V&U}z@6`P-L)vZ{gWu(Zd2W`Mz;uL6VGafXQJ%FnwjV=L3s zuB#bsqSd#||A$gGK%_x1Zl`)}emSHH-P%TUkko`uV;yVnb{on^7mJ0O@u=~%ZJC=BRp?2QK%RmWta8~VhnK0vn18qvF+pua2_ zY%9#nJY9n_nP!lYs#U=e;+b_*N4PpERaDwR=jiAM=d`@0)9Ame0@xX_*@srohf(`4 zyvMt`nc%ulb%OlX>%_dq*`dYCe;9f0FL^jrmpc|Yed=oena-Fhx`O!KVsWNbGly#^ zoiMvM1_`OQ-mquF9IN=YPTsa6mZhJ7EhCNedr?J|pi{3W&@NDP$RmbJLm% z-4p$-V-}TOnKcV;kDHB0`DVdIKN(eK?qENaq=UMu=%hE#^BX22K&Bz-U!s`)7%(5f zkp>^Vz!r#>XRbf!iSFLUT#zCP!MAAeqOb&4!Pd@xO#%P*ibc1}K;0^`W1o?R1?KHR zK53EUlz!#?{>dEeN&>FsQsneKT^o>C29c($7dU}2L963ffHdVZ^kb`=I>t2=AEG5@ z(H5a00p3Axx#Yak-uy;Swy;2~{a&pG$Zu1p)f}{1uUX=RBt6dzc{}l&V!gI5(@RO# z{sI=qQ|@HcP>kwXWwLAJgm#^IdPk*oK>B#GTfi$x>i zNn=ZRB!Bb6(!H8{cW>cdJJaBrzO_8RAn*^&P+uo3`_dp$REzfv+F)-8g(< z0A6>fsvcEm8_+5WiWW)5wMA!h=-7tN=WLGEdFw>rz23^~70#o3Mh>xW9hb$o-uXgj zWj7zYCvq3#M?Pf)!IU2A=2R9&t@Ex_Ub#g+J2C#5#I`vj&oP{dyjm1Y7YVpiqdT1E z1x(*QO9PVl1?Vpy)W<9*i^sS5qUQzKUbk{nt*eg4{?xXOdpW<4v+AA1{}d1&icHiw zS`<{PO2^f1o=M6i7KH=d(HDJ49IFfW$+Wf>G-y6E^gH?J?0(?CK?-q$e4789Z#9`) zY&FYdI8eVb9N!V_n&dV!KR>;{2finZNwKk&d^4-@dPru!#bH@4w23K)};4iafTD=Q;fTCoa&vsASA2a+P6 zI_+Alx)SpL$$nqwBlKc2c+E_Ft2WGSIF_{DVQeY;L-<66>PlVQ~73O~@C$KN2vEG)i9b@B_O@znhcqkzPJ$^avGqsj) zU>f~wQ+hCOJ4Hg=PfGI&KAdzE>mXL)hKfl9D?MG-81A+)dgDtQ$Z3Ok01u(*M#1=W zvy9{InQ6<`cGnZ$Xc(+e8CBttwsCtE-}FJaWrH`$g&2vaOg=7DEfynvdYRCyRBB{DDJAWDM@Us`4HA_cmgLY7#ocAMK{!=?Pf|PBZ+H zq~dzMFM0EKxXqUmCfwZ_rd5U)S`szjlLL3t=e@6-_j()}r@w}7jWBsn{P3x7AgKtD zEy=T!>#O7NX(h~@8))CIWBrtY;X!wQ?M^FR1KlB?8P+pqA%gM+Fh67~)NM7WcmkWF zi%(B*xR^opK}-qgIO00hvM{&vGZ3g?o?-d`C$w1+v73OL!!euv+DLtS{ngl{J1spZ z6flFIVQ%1hgZ|vPbpmbT7_^Hz=}$7MJiaT##p$#yWWSt7f8Q-9Ej9lW;**NC#2LTF z$!cMYj+>RKvv!R%X~xn{k5Nomr}%I9zd#cnCP@s3YJS-odEbyam!&{YwedkDOQG&N z3d`P>+FsGZyMVZG#wqoKm?Gs@w8prDi3-e{XvZc!#!AZd>Sp`Wg@kCpQI7jm4ly?s?PjJvk$m)hxvx3j#Zt4Aw<9bVl{h!T~FUY7DDZXVdP|T->ehKGPRsiRkevzx<2c#q>!z>@_oXuv84hH zViJ)&FkazYBv`4)SQ@T2jNDvvUl~s#iDZGaJ5aT)2ggWfbLDQKq?LcBqv)bQo3nh40TL6i)=Z+ zbU(hg$opqOtp4u;1!fnxnRYleH26E3Iy>2v8`U#P9PA%XEJ&96bdhn|*v0#LUi+_e z9flM~h^Xs+C8NoJ1xX@YfMijcL)on^Lr{vVu*h4mT9JcX-@m2O_{*kraE!oi)>p6a zj#T|+vS73d|ADN}_P*%rs|>66pAPK5D=BD>aoL;>9d+LC$M6VovzBvVUin~V+rV|3 zTsx0a*15#oJQU@ztKoq=5AC0>FeuYTJ_8j{pwj!L(ypv)mCIgkbrQx$>6MJ(=Fdb( zPhKhg)bR&@@vl6#-bbCbt%GpvR6ej-5mr`G3m8f=5wPX8E-R&eS!HDx9a?GES5aNn zEBus?)RcXWykOd(W8Wi9`^e}=BF>2`tKiI`TR?n>krk(ty?AT`Y8%$27Y+Zk2psYl z3(XFg|1iG5RS4Y}6aqAJp_#W$VTTsxZxy~C6)<-w&{@*BDOwS~@o|^dM}AnSkIs5V z*P$ZQdOMAI0CjZg3)lF#(XU6*y=hB1e?~QLuF%#oa~0ublYV@5XnhMQ&n^dz; z7F_dI_sOiD90)@saa8b40s+6lot7G;deyD3YJ|nj`futNpwZOAxo39NKdj9t zEllesl|~)xN|(h8ZMoe(lGeLqq5n8jc{Hs5)d&(_^8IjuJhv4I>1&8Bn2l)(*Efd2 z(_GV7gzTbT1T(baCUWdbXeNXkyOx9sj78yx$_nn#+gKu*EX{k>&8z-&Z*c2J<(MRF zTePY0-`6EL=WrMgfOZ?c(si^X%_mkjDb=NICO~-u*C*cEzQ3(BQIzO3HPk#D@ACJnnM|SV8i>s6Wxxlv*B^KKvRMJYe;-q9%ilo&m*Kz|@&2>+= z-hAIDXoh^a>}^aW1H;4J1Qd>`u&RKmrDL_$LYhX5?O)SoPLG$=Ba|K*%xVV~@afdJ zut{l!(4F#G_&Wrb%iT)0I3kG=Dd#I#x@fuv_$Q3xLKxWux2h$yDG!}2PKc$y$nx)w zd<7KKbA28yjuNykbd5jcQ)FZ=PHDL#OYThvP1d^=GnA`i z%w#wu;HfzAD=DS=i^57+eevqa(u4bVb$yBri~Mm(*myR6I5K9VUURyAJ5tESJP99j zKtwkyG)P!XW~Fm@s*=7ta&pUsR!Za(6Ev4|PvbE~(qqQc3O%&NWb z_#&?e{20&1a$$z%W$VBX3{l8@T=V+ex@XHmZop>M9go=jk(nGe>4z7)J9kH{Sow3G zKm*vUsW>eV@xnYeFxM?MJs^;zyC;AqUOFg6`3$<7;DtB&?A8cwD3e5sZ1Zu^N1k^( z#B=dO%zUORO_pn1LatWXwg*`TC*S=nx8y8W=2FV3@^*R6-sH|NPtARzmVX>vQL1#e zpCJvxF%jbHeAt@y(lm6a45+r?p`;LwmG^cd_A4c$gL-kX&B!`>AQh&uI;Y+7a~d() zw8V7Ax)jgf-MriGN}g#y**BhX2|;NL>pQD`e?+B7{{FQo;Jb{c+;yEZ9-Tbyrr~NQ zdcWRd8S+i*s@N2)S>@~HwI7`iw`aenhcg=eFqQ@ z;q5D__{r`FV(|S^x+buNvWamMKR1UxRJ!d{+uw5NjLT3@Bvt*(2%MGNl2NpW4}(#= z_@FINHtTQ4nW=@^nmLB8N$pM79^0$ltPnoZ2r^v=1P>^mG|x` zD}CcDgUar*`CbgARY!=3k4LvYO(2MEY9;iBgM(wwUEk-aq>ub0g{S!})n8AQrcu%` z9KDXjw!mGlj|?c4^g7TODo*ioeCtP#@m6J^Qrk;`b!1K1WjkZQmZKxM^PXtspkD&1 zwor3#w{{mpGk*o`nuUq3nk6Qx(9Zn0mS?D{!`GpqG9|Af?>l=u7~w{-oC5NJ3>%}J zGRG{u#gaHdDU`wI)3(Dfn&kPk33r3G)wD&PI1Hm zJGTv$sf|Rdh_w<=Jd`0ji5xX9mQ@-v>|0IQ*NqM#j4=q5qN6IX`^&8)QN=YuvuDbllX z+$(I6+{8R?Q?U(cFN4^A6zXQEwydfZNSXzt@iB905ZMGBJPlar=?p%Q*Z88zkhQ{5 z_6Vc#`)Jb8?>CeZkStnPUb`u9DEC`4yb)-D|L#YBD@bT$`Jv7?y)7T9gA>6JX;(?B zn@=;GMUJSAi(K6kb8L?HX7zs0r+F>9MVo&&^zqcbvM^W#O^LZm8(9hP*p)HPE{wty zTX+%}n(se)b1OS^wc5#Go3gqs?d>z7udHQm&!gS?YxRG6&LA%!C7np%(YFXym>A}! zVwF$7)7Ih~#I(oMPFIH%>0_22kOz!}()SMj4A`xU3S|Z7zT12<5<$W?_o0o@1T?^8 zu$Yp3y+V=`G6vlZedfn$TZ>+TPssjDD!{Up$iQfL5ieyab_H^3cNa#spjlt}A<9_>QCIUnP7R%bC=$Qc zJ%n_RpO+_8piOLZ%-bgh?q($I^Y3a3vIs{G)n6NRK4E1Z2$g4)y@qkyTU&ekwe<2- z3(&HshqR6Rdmj5>-6CR6SOg0XgTwy)tPSq6fK{Jqz)M(UV~!c8!q73fC1jh@A+k;8 zAylh65Ll+Kk$@j#DL)bCP)R@Du}~q$-7?kN?0N_hKgQ_aYIbvRT6VJX+$Gu{fZ{3U z3||wqjXtm*AH&#rIh8Q~z&n~`GkU%9-W{k-$J(0u#@1+)L|s->@pU31$`a#IDmLTU z{M0PuVrwq{@DYtU70)Cw-I;2ZJ4Ua);Kw(9a}Em+I`QP$wDSaoTtlyQUi3OeZ`Fp;i(N#0ZJhj zbE~Ti?y`@v)IG{-a?>SkkXO%;@5|^oT5Y@PPo7B@_3v3cKhHM(E()d-{lAf(4}T7UkW@95)Y{ zIaNRtj95|9IuC$o_MD&#aEHq@=)k&E7EQ~9KSe&iJkz!W=tiq-)ZXi~1J)b0ET}p-zA`76nu2{`*SPN0i^p_zs-d3y7zN&$JQ zxN@~oXMhpOf^O7lTiR;I1h5a<`8r{FMx#{bS`#RpKG)0hJKfL%cCN>8)^f24X2+1? zH%klS7Qb){IK(R?bEZ|sqb{|Y)tg^dP)wO1OrUKd>?(Jdl@ZH$+shtTqIzT&)6nOD zqVMpd!#C|~$&-fCaMuUbW!43;&mf5{j^(4zHD=Wu(^e{2Jt<^_@sB^t5;zb;l*}LK z&2M@nibtx3TE^`B%)CAc*eXYJ_nfea>gp5XxfgW7(cT&dUrRpPcN{vnyLh_C(`|2B zSl@97u!hhkNuMswRxZ2nMeD!@2{asaO2nu~pZpWs4)AqaQ z@WSEQlQ(Jv4wG*?{OBb<4_I!b_F+HF&33pU?PY8;z-RI$DKx2_lU-2VuS#MAq`l3l zooM;{VW(|sMCNFcq1Hen3jN;n=tkg-{Fjo=`SC}8qy!YvxVpDul8PC5LRp&nvY=Xd z{EJ`palgHrdK&eon168r>7ZGqc$%CIdJXH~$ld}R>O5#JQR2e2UR~UZ9#gs*nK%L* zkGW#AAMQ%_X$B@imvT7nS1Ai?dQz&)>(~%KS28{h>R1aoLF2e)moo|t^={4x0O zX#2OYwq>l)?qR6Jfk2n$d<0#Yi_$U94X53z{WSFWvIkjS6!`KTBa{8tzgO4XI!|p4 z_d*yx&oN8`jwFq@LlF?*_=aD6%%(<+x)b&3xI*}~zQlAX6BA?`&%<_3Zoaljs3j|m z`j>{~Z8b|26i zeSu);+<;RnD&_+sq!1FG4MO~#pMn(oGIb6TtL3>*-S9Wp_PupFZT~zSzEN*^^5}`! zq+X_;t?@8f*Yrb&A%*c^G?Z5_eG(#HPV3r9S^2r(-}yVVm{@|NJECVw=Gd4fdqMLD&I{VqLf_RaLl8 z)ebE+6hFztRf?#3B#Jn{-ELZ7jVLjrknE20zL$bo(7!!I)jM5wFbQ=l))FAdk9$u& zv>zBVoFvV2oDwtV?Zo=pShJIVC#lE$w~>*bvBtVU!Q=9>gFk}!th*Vb zS$VRYE#*bQC6QaLCyuRYE9*0RVyte59kR#!`evq1g%R?QhRs=>#ry@3NZ{>#1CmbK6tX`b>7Ga_puI za>n}YXmqN7?hO&bQgJ<7Tw0%<9YY|vKV<#lvbD#+MV!z@I=Hci-UKN{kuK#dj%4;9 zUfVOn#AT2aJ4i(#w|_)jCz7*pEb+GN8Q=C#GZn}(-|vv{?DawA_=zER8D%|DBXDIW#0lT33OM{5>d^N$06sgSouhAcG zvX%!oHY%MVXwrfzF6N(!qg8_9mPG7_Mm>HRW%=|H3`Fzxd1&*$X3;4> z*mQ$JFl6|S1BnJE=l<}_n_^-^gb$dYokW3M9P+)dSIu~inX3Eu`+PZ89Y;Q}yS|>v zu9xT?aoxP#pHy}*#B@Ns`(D6x$GEjpIo7rTxF&Y+9DME4)3^(+x&vq4aLhr?o(ujP@mZU-dHPZN{x4PsKy z^;Os%dSq3aLrVDbXq`4UoKD(Oc?_XH7X(62cF=6F0dlyO&x=qjy}sQic#_h)d$irq z{}oXZ6uZ?Km_H}rrSXh&wZ0|VdNO7C&tO(tFTPveD74s1h-*nw{ct$VjaNcXPA6zx z$89ffz_Q6q)kJ>Pn2R-3!cOF9U=*_wx)c>i*$qlju&{3Wyw7vE=WnX~LnSTWs+37) z;H_+D^9h%L#1Z*JFG`CM zhDZ+Uq$QN?EZ}GIg!M>1S8JDu-9z{j4?C${vq7AJ1?2a>fm%ZJqxXE1a5(K=Mf1(a zaEe0%YCqC%zr{=v-fK4NUYwEoH4%Dp+|#Njo=U@2S9t$qJdHfWbEeF3wbHafMRl1G z5r^hAbOwhfWm`y#_GoGw5?!J~8OW7Xc(PG4axJ~;R@EHBdj%zSiG>XfAYvGGb{_I{|5!hI1bc>F`|vmY~9JMkuq>AKIMA2h61wbI$4y>4)HBbHjF?{QfP`b#1M_6$1E*%ZvDK#(kun8n2k7@tvPzQzj=Q?{X#w~=llrs<;17IG z;f;AQPOhD{UVg2PW5GU&?3rg;LKopIw;QIjW8oDFkX26|oV_>%E1*GO%Pr#*$e@Dj zM(I|(lLpI4)K>MV%ihXKR7~v0t)S1WI(C{4Ly5CdO>T#qiG*u&L?Zjk6_uIaV%lw#dNOP2*MNSl2mL#N2i%VO@Nx@~ZKmaDG+9Ejfcm8Tu)5SmrkGcv8wu z>?Nheh6GCJvi?fROmugqO=%8~(Rf2>xv7~U$)m^|OZP%oCBE(7qdSsGD-2TuN#Wvs z<2IAIhPyL2Wl!WVnR`ixhxxhZwX=?#4>2n{3Cjw4OL`*@mX1;3^IU#ML4-QX zUh=rkh*Yj6?e4sBS({OmPIC=LOJe61vC?cb@h_-cQx&Pn-dh|%OBi+jurZdmNta^N z`onBh&sgBDY&O0j;-5s-Mq#+ zy|lc%9FZjzMkByX@2WOu%(ywf+D4JyGLt@{;_@O*PS4H734 zgak+H$-$6a4LN2lk8n6->^y4xXT^|1OMLI=Pgg?=EL+u-Rej_`8}4fvAWv&z z+)|aB!g#K`)n-xaws+YfB!}--@9~GT+am^f{$nw!ugebcM>%lF3BC%2PZ-ri8 z9!pgpeuF&qzzIO5^YoFzX$4G(CB~BP%99%l)}qr9C9Pibc!fJAU+dk+HLh*h7Y5kI z%^6H13%S68u-D=&JKG;_9p3ZX(jQTfQHZ=?re}S@%*oifDAs1d%N+C;9wqkGnLXg= z^}gk`bjK~x*AG)(jM80Y{*9R0-dJ1w#cxXTpA&;~^5%-U9w_CUpmIe?HM-?wA5MrZ zl~hyj2jr%V%(>!#qM}*dvsR9^mp#U)=c{Z*i;!#fx zU2WWgaz{3bt+Y`jgX{gp#bULfN2Nx=O4Mf3Ey(imAv{Ni3Su^%^D>}7U~;t5%SMIG zdbbke9A^V8{O4bC`c^?N4>^AhcfYw7&YL^-cj3p?O7)f7y;V$O@ z0=aYcKyz_?w;7gJkKUlNvk?RMSQWRN3W7F)Y1Z_&ky}=Xe2-Cp2bh9Fx2m zS2pW}5MO00(ZX^#6pfJwdQbKVOy?$%E_NmthIxRc={W!7KiZ^Rbg zGss{|?|w|TqvPOw!4sUj*w_yUgFPOMYxVlLpt9I;G4Ed#;18QiSe2dmk&F85`KqDl$&5b1 z+_38obgE>qh>#V883WNOp?t00xHWBjtyyM zi|eL2Gr2(YpuCq_kLFP@Lf?yiGIZT>nx<`EUHT-+dUh*DwNLojKUhE`DFM55{cgeB4d4}Mz5_+EBUu_y3u`_-hJ*M5a`l;h`d|CnTp{A!Vl zR%fp=7JHQ_nC-QpJ8GxkTqkLY=+WcHG<=RGYSA_?I)457{(#C%4RQnB9iKe>{rjy( zq`0K^{_Gc#*ZEI%ZawSx*?!c0b?eWne(ZOuRb#H$3k&Z2uX#+7d=2NK7}UVew{Ac< z);>J4^_5iMRqovR%r=`*MT(8@8d#APG}Xa8O6c2&aAW)0n6k~eIpq~M=L#7b0DEnz zBA34+VX*hSnse#QdX62AHSdMvKvRgEg;g?L>{7x_rYfBtF2iO4btLC{fE_6et}(x! zA$>xNs<*}(k9Z~gfPQGq#w|bL<39tI@neaQ3?pKrj{DoTV%|I81;J{XM1j|>_15Eb zffK+wbl~D;y)fF$NfEhOT>z;5wF;dTcy*8%F9@$SZ*s1{ETYCVC~z|_M2;M!x}-Q% z59L5JZrY!RpVm^xq4fJqP0nWN;O#VL=bmaIQGwg3S6=?vi;q9dMSlBCIxJnUcFL7YnVpi`J2P-{GyXEIDYJ$yzQ+KYPI=8X7x( z0Sx;OUR2DQb8KvK)Ta;T+^?R*oBW+t^_=l76LJju$18V^a<2IN+t>Va)4-!9y9AsP zH@?TdvA3wpEWtD@snbvjU6Qw+`oHs_n=5iZi_%wlTPVH05Pp?KMpCw(N1*Eb=2JM{fO8`n0(}JDy_}=n?>1-Z`jvCq~U+&F8qT3(z5w|N&UCHeY7X- z_v!6(g}kcFCSLoQa$&nx{a+0!X}M~#^nQMRDZugBM8r>-?8^I!wU{`;zZG~=@l8uF zm5lrUtVGdtE#&`IYT8rwyAnKQ!VQ5;&Du^8_4sTp2Q&&PTfTS@+P#4Lcq#6ZbAQn0 zBFcSp8hp%`)4!u zJg$m?KncdSp={5deVneTdbJq(3csEJrR&VQTl6lMm)A{X|G0R1*$tsFj;l)w&y@eK zDujK*LGgVwO-Va9;M9T0wIn$=)T-{ zljyhoq<`QjzhDMDL49S`$>hel(&v9}%>T3epA{w4-sm^MICMU1e8^UOI7}`FDKqKF!tl|6}d_?y;QKy}{2R4~~kpspzU6 zhJ!984(31Lzo%Q)rvQ1p3#mxa{@(wih%58I`BcBvdr?1s-22ZDzVCeXj~L|dZD?~##=_2~dBy!I7_#*Ox!WM*f_G@@hfumAt^xP-pGys36Y`^P&E?>@NquqdAqcbEpAb6 z{}a#Yo7ay1c+|f^h4-z;oD?KU$S<9rLvKlZw6`}=3z@KFWMT2zE&*d9ide`4$Vh_7 znWJ=MM3M?)qYXJbC0SYPC+S0Tx%$nlkc|4N%!wx67yR?}3ECL>Sf7;IJ2pY@+s`+Ejn_u9P0 zE8K=l7ODJya$%kOwU>FXLhIe7HhTf2KT@(kB@LJfenIy7-qjX;k4CW}Z>k2tF&024!%yXGyqeeu0H=~C&(Dk0Nr@Fg1xD(-E z&`wT*eL%66~_>;oT1)@zCX5)Z(?k=3f|6Hm|T?cU`yU>CfrhD51z z>s$|TL-kqIpWJ3it;5w8WXucy1Zxz?YFs+52YKas!ph>jd{f4tq9PnRWfNy5NA$OS zygz9g*3N}JijEhmKPG0dT5yEdQmr~{$Fbs5Dd&$HIydaCt#_tk*6|J-G?K!^%*x0- zs5vn^A!#L~?!KY+>8(MLGe7Pfx#~ha4})ybuv%=~K<@MTp?slSlgYO_ zy#Jb*_$#9D)Bf)ls*eoGMq15hk0OR9Z=hzqx%Y|c-*FG{$mhXPl7cMlH94!iFRrD38nrACC zTc)00(XCYzZ*r`=ZC0Hc3!Nzrn_Ic}s%Jzk$@!=}c`9y9&_xa7RuKnD3P{K*J;OS4 zjA1k+BFeRs7#c5BVIxEqH8&9HW>d9Xi-lBa^-oef8@IbFAyAjco zssjzAsG>VQ(8Be`e-QIBUTpR-En~KAZ9FkBMW-xyhtls${zQT*r`Z zF()9d$tEuQ!y^F`#0$0?>p8;*7v=);TDt&CnJ+ioMreh!(ib(1?6k0J6DhjR(P*9@>t33%CX=00cmVDD>e|IaC{}HPindS;M|5X7d%O5MUJ}~21n8_hiL>ChGvqBu*$UB z_+ktFo4uL%0<6PhzkS=Ph$y+{=X+HnxX-}-1q<5USf~NCS&9b3;Y)oQ5?o$bo$pNB zhl46z6#STtS!IJ3@Z*`&wrSyHZbPqzdKxuFtaClKNh!@|Xe9VFe;ENOk*@j&3y=j% zUub2voAJmu@#jd2c>+?nke7MYMde^ErLa#gTwKs>wb-JCNip5j1`sWkLK{&*f+Ewos7$3K(*Ss z>bVm#&~@zRbn4-;nXJ!mFAnQu*?1{PzP6_`Mv`Fv` zIxG_3tS=97pp=Z;0`XaU%(yLJQLo}a6Pd^NWZgF7o@?`*FAKVv#>)bh2O)~$V`cV5 z6nn*roz1LdKPsDQXznnndEYq_f6MAsBEniklax?GqOT0#78yIor+77xN0v{dKMH1;(s9RO*5u82y%uacxGI;ZyOs3Qxwli08onCHuB9@L3E zN>5nRBLsVc3OE-lagIN-qjUYcb zT?u%3Oqs~hT3=`e2s>%cZB_xGk7SEdZ4;(x$*6Rv?H7<=DjiPmo*#E+y%ZXgipN4$&pq7 zep@}3G1?XdpTy3gsc@9bw(pnoc#naNFaemN&&vK(8Rpk@hQ#;JAnLbki`9+W{G@~9 z7I^rSWJpZk<)8DVA7tio3|RO#gYPPwp=!?kJj+J9Q?D^__?~VKkPjtL^8B(IyWWBr zP&Sc6$Oro#%yqaa+~wt;Uc2X)!P+(_OvG7-VY>D8)mLmDsE$&!*@yk6=uxdy-sv zns*pA^)nnZmr*SMX{vPW>fcP&$88K7>pTU#aOuMwPR0jpmdaEf?Ww#sGeZez+o~8O zywgX>D0S~|o7xf3QEAGN$y||#!CNW@Vy;6!;Y3>5h$@smMP4e;j7EHg%S5nZ+2zzk*`=>>BIR2M&6F%zr!y9l zW2!ek`J|w4l@ekIBfMNK7ZLuY0z{eFFj*}eFn|s^=Qg?`5U08Z#RUX3K1-X5&KDxx z^35?cXCHLmHkO^WLnsKm_i}&a%3z$SQ}a_Sy}!pH*B=w@ozT8k&Tr1k=0c=EMV7)^ zlE;`u5>i)@k5g+p0Q8uHL@@t=lgVl<7@T9R7}YU*(-bN8b};rz(bV{hzU|LKDyqT1 zG+c^9Ds!9H|qMiRc}{Cf_(;l(qY(|inK@_(cO zif7j(yeYz>8u{%Oj=`G{&>YF*9h%)=A;wjxK+O<6H4IaObY zZC=QxYu0PQWBp8j)~bo&s2^q?x|QCTKRY0jGF;uP`UWg|Smk^+UHH{EeDiPSA92RC%^g2j9P~C`w(Wq<*tOYjnW*;SWMQ9J}S~?W|Em>8v&eg z5U^T$T6iGaxtWH}wggZari5omC|dGb9=o=uZl)xb^iG-sZbDwl(xv}uxIohT7q_ib zUfpUspJjUzqvK)nu1*ieT!Zh`Kos@3b_=?JCn zxbw|<0EL3PO&;jFpy*`l?b}vXIw@z}uqQfm7K6pwt4T7A-pHJ{QwzqP_AJaAggWj8 z5W5O44-_91vG5B3^1zu$6g7nPhaejd>G0z#3iU!QQwoX#EQCPcw}7$jfl_352dR9X zlpVYGr}>TRr~$}aLr}7)JhkGiw(Wjt!%LgCIACE!ky?1hUq<0&IG)fkW z$Ok5ObH6dwB&6lJ9IammRZ)&?t+lgMCQai^W0+LQF_m20)y`(|&X1frcvuo;ULEc= zSupLu)V#LrYrnaZnwr>TE$4HxrRpcb=)WYk8gDN%y9g>1tJVlvwG5D7_>J(aKd}v! zPkg}zEUABO)i2MKlDvIZ{WXuov~v=knx@e{u_^aJjhPTsR|RKXfj+)JK4K7Y2cpFsBnyEa*3u4VjQijkSnjkK;W*I?cI&`CDGN@M@g=iyDc(Yo*38 zsvrB0WFf;1p*v|?Z%KTL{8c=S$IlukCa)9{i8wf#U(0WH=w&~S5Ttt>syj`4LCcX* zS*ZBXtl$%os+>5(ufgL7>N$u&g8_Y5(5<}8t>5-%Wh*KyIusmUODd%tbL{y6Cthz; z4_I&rrUkx!RUttK1hWhln`09T7(GQc956lac9U{%Nv+rcn+nL-?L_+=23FmhNQE^C z)Ml82>F%K_zUye&8w4K|&Dt4S;lm%SyC8nm7?w3W^=xqPB9m(+%t~TEZ8Tf z6I9YSoGHvp4mpzG?#-f3DbUH(kOft9c1aLg1$fW`p$CX64qHGr2>I-&!IW??4KQ*j zok6_GC)r6GPnOHCVe{mIhbnq$4IXDLplgEVlR`ieorgYO8snXUHTS zQ6%tb$KDe{-Y~1PISUu_!!C*h&&@2tvQbK`AKWTJXt z%(gYCQdTCG3!`S(Stc%)MKY9$UYy2M^31#@X-b<4=a@bjS-zLL{UT-y&#u+VSxes5 zyBa#sK4qV)0kc)TTqpM@WpD%PHSRX)SaF;c!mVjT^IFiZJZ0h~yT1EX)vxz!TJFzV z@%6crbgeaik+kx3KdN`z1%SMD&n;(Rjeawy*>~H=3mmakyg>7HSCd@o(H19S60wS@ zC|TRTs^~um;gzejq+9LP)o!-{7K*C>!FJE(-(*VJIW(G!uvZ|!?asJ2C&eO2C!2w- z8+;VAm@sJd{lp9q_rlLK)fqE$1_C4Em8s*nupK=hZ6{0rScy*W8d_M`A-a6>wq|Vz zMkG;4PdQP-RNjj=d0G0URF%tZdBN^_vT94<1aKSrsu)TwwTF6hp5hF)UQtn5kKJ{~F;RPy&PEXSK9};=H^)qB!#vE74`XkNI+CWOG+ip7p~3FWI}b?U?ml%gCt0% zT+tE{^T?h8LpSB<(VvgNuC|pO#%nD_?A8W}iMV#%MpvNs;p&TlQwon|W|4yK@cG0k zh=+H+I?~5l{_q}T=~S281toAtMXLU|#FVhL0K`);bfO6T+O!sR+-g-N%cc#|^7$T< z43U`C(bS()L%~W?N}gLFiW8_sxrHIH5It%fRBpL8K=Hf0^mVowf;$avmn?x$`m z{Xd-(c04Z19`rWp)6zeOU)v*+y$Le0dbSEHy(kDb_cEE=To>-MqQoCo}7Rx7)J7&)%GcU+J z+;iq78YoXk)VHt$7@sdhZ@qRipkfAQ%=JvD(b?Gr9~KXXMo|Ykffh3N_8HPVmKu6z z-~<~B+>%B!@_FU1BLk&3RdrK4wJsJUz>2fX9a|dr5+f4RB|Q!md9m~rFAq}$(6N1U zY!81AFdGWW^dMna>SW7RiMPCvn>bMsk~&=HBp5ekI%&yy2ncm zP3>ZP#&r!XSXx-ntvMVF`Ze?=uQeEb64}Ud1f90O8_LR|;4Zp^`61oqlT_wfCV8=$ zc3S*m(hu^~X%}nZU3r>VeD%KA;-E!c&WDOMbrPyt8|x@Yg_zu_0Xrh=X!sw3IbF?v zf!W08?J%z^7py0LnroAff7fW;q2YEJGp6Z)*%H(&lDkp;+8Y2SZex1Fr}X7p#i>6| z8KCE&%rCPhfkwQOMTfzGPcs-dM^bDSb_EmmEj4N~<(`TuDBGBiK-muZN1GZeb%NCq zH)A8l{7Rb-?vKloc99TK1NdusEIZ3{`DJb=j8=>tq+1ClY3|e;X_X6&HQWM!axa}x zfCr+-EBRuq$>f}eic-$0QIr`tRV_oUXCrRAH6!b!(}i9E0r}{V#NQqNe|+=GwS}9W z>$vG=w-FkAzxUr}@kfihPkkD>f<`IqEO{<&HF{dDY)HD>jRljXxdrre%YWE03L=cr ziUVocsCLYZAvU*czmFDNYito3q$Gh>dTv!qP5n@Vah@0xyt)sqw9DKksk4eARRomV zzYkF_U>B*j#vtbBaq=Tuk3IDoD`(hz#}0Z^8cZKPrO}AO2DosP&BFpse_6%()7pBT z`47Qkh6V&e_p8ced6{AYT5Uvuz;}+0(aHr_NAvGJH(jly7C2s-I*#(Qugk2cS*~SDx|j7^!oNh>#5mkARi_s9Y14>4M{WV}6drYgctQ7A9W5KIp<{JMG$dLf9)OF}-mN zq-9j2tv)uD0%Ij{=f7swUSX)~9r_0g5X5E6owX4D-JvoSe<~Snx29V4loqa?e(T($ z#p=Y4nb0yY(Xt(btvBusYQK1b&i0m;w$5B`vG7fr5r32rlV`A;LV}3ST$nO;N&%vX zFeAw?G}RuWLzITM{CrejBq^N%lg;z3{TwNtAop6zSh<&w z1Lk8_1L_GaYDp-sx$Lw^(Rw&noKS&FRrn?jLMD)wyN<$CHPG?xE}`cNn98=>%ONb}*K9bbXc*p9ESEJ_&JGB-+7>=GiakVUGo&yM?6G(^8u%Hicb z|LNQK4HIku1%wUL6900`>yn=x{_2)jKV}46eg}_?LVSHSj5uPZ0!E$6)K`_KWJgJ}ZaV zRO=u!O_a;cCeEmEI$!xy5WuM?mIKPp86)bnXuEGQTW+XNlz0Iq^FR0*6(BF6ZkYh< zD;l`W^Vwa*GXf*gvWH(8cn9;sf?(=(h7`08%pc1mKcH6!7)>JkRIb!&m8;=qL3Jat@->&A89 zy6r`U)^#YEtD1_d#dhov)r6w6S{dxZR-0znzomX?c5EsV?WkU|@p4v?*6Lh+-YNG{ z)rw#}@FF!gve}CMFxyp%@o`5@d?w{fJ3CbW&8b+D)RET?!|J2)6?(4$!}+`>$i95F zYk926MF3_t?7=Uhr!z;$)IhfdhBD)+`im(oU*pDZ7TMGFR7E*J&GG9Za zdg0}W{Qm8hZ)LtI194Awt*TQ0?UfDB-w@;TVdWcTXb};Wok!(jdO0DNa58A4iXw2gAy_a0#gz$A++t@KPqy=dL z_87s|SXD^sWU=xkM-~{gHC&f1Z<+87wgxqt`p#I7%8}S@o~!;<<6^eDd{43f|KNqo z8G$96@dx$w7#UjyXk)<9olxtiU2tJS&3Zc*p{z9FhC&r28z-~3mI*?Pt@Wig0B*P0 zP)?1p+HDb76r8SC&5IpaBJIk4e=OogD*&9$^x!e_%-yNqPK}#}205LePB9bPVj}Pg z9e}wor%W8lQ-M_3S>9vv|}QhfvwxipUeW&N>aZ! zV4~Ely`tWGQmDgT$RbF&4xT73S8xoFs{T6G45f;z+!`xw>aRhLTlZBEx^4~-FN!(5 z7hde%gEp*(9WWo`xexKxx4i~@P~hTomcr&j+Lr2NU%dl-QfreW$5Y_`N@~thZx)_9 z=RL9gC;MH!!5(=f04eELSb4~g2LgogZie*;v|7tDUChvAPhJmteUok&Gp0&77zoxP zHXn>8#OP`up(W*7n4>X%U4fN&142`devI>~HSHSjhtPa$bGkltfyk03aormN+#32N za76k?m=N0i@Pg*clhOvA+!m-$gmtjD7 zuS;n@vy-nZlQ+E`oTi!##_O6@#oS8yOi?w;?_m`oa(v@TM`I14UIWoffnYFgm0G}Z z!wjJf%m?aH^fjcpSRD1^@yi~Mg1F>JZg%$9-Nj+uB{JhH0if!SMnBSYBT`FPt-XTu zeZs-ECmMu{uYL+w@EFo-o$Z|CAAZ%F!E1Cmr++VudIBu-wH&I|OZYKH>Gl=9c!S!( zqquX%=5uxs+C1IG;3??0_NJ>%7!fJ|B)a|dzSYk)X;~qABY`( zCpla(!Efq*Fc*;OV*T_$bh3eQbC-*X6NnINf}R{Suxpal@gYXU&39f3ZU zd7$t*)L6Iq&y!08V{2X4wtR3*=e}yqBQx_CDXK||M@U=yc~(Uk8Qy{js6>!aXhOX^ z+*npc#~b~^HTs<`wSQjY(b7}gJjvPZl}kS#1`;}{3+*{Br&7hB(4Rf^nOf}9VU!*d z0PrgvD<@amx!i7<`5pscS;g$V2@O03ewb7{aNYed*RX8w@>|U2PMJp2v4e)4g0Ga{ z*_O7|8=bz94=k#$pv`AB=&GIf9x+bASGV2dZJR|5=L05Eyr&o}4GRs)?=>Hsz~3U> zMmM%)pxGK&gulMf>6r}j-Q2XY@l>2cna=}7iX6!w11t^aR$Dc)u77#zGtRv~Pt1g=`s&3Lt0dU&?LXkxz=&|1s&LK^0 ztZu`=!!Ooq2kE03nv0}hX}={|kv6Cj$M2d`_HbLn+{B7Y#!0Q(_5N#_k{cr=UFq?p zilFymQ5vjccaS=-W0OkEE>~A4Z`xSZB28CL$;Os7NHaIs(B22j-8>*qVK!vH$K7$& z)i1-OXgT$rfD_aFtGAetmNE_2u3xm7E?JT8s)~7FTd3n3)Op=D`Ky|S#iYWcEuq$} zrpy~*KlbOO529~?a?ZCo4s>?HQoUBAN4X|cO!9};KXpv0*N|IzJ~x_}vlMW&+QMv( zlxR7m1vov{+?hZ46bsFx<6=^7w)46xpURjq`yE)Nqfl=vNk}J!rY_VVnfR740q9H! zI()b@)Z1IDcepi9wZc|&6HfcV!ch4sw8LO`(1Tqclq(!P+F8FSKl$aud8uE8t>;O~ z9Fp(e3<)<$6s|dT$sCrKpAZ#kXTUKu{Z`Nn0K(`3CpIdo!0Tr_i$NbJ8f6oC(4SfK3UN~DV6w-W^il;EHs*>I*R=eX{wZf#INI(%-b(n~ zGyvDWUHxaQ{jVebWBDDqI!kQwT0R*;YxK%>V6pCD_wwPfX%E^m%~Y2ybh#}#1d}6k z8gij2g6>7Cij(SMu>uC#&90FBei{V)Pz|fvbC@@%3z`8Vwe&kyB{- z)b@D4Bnew3P)h+Ce=5_5KM&2PP|WZ?pr8B)3vjeXRGUPpIG^&MUnd%G%%?H$ zCrt=14m^4Wd1LhA*IK(u&Mg}~Q}UOpN-9Ai z^k^uQ$LDbQI;<81AKo@t&s-lEj^WL}9Ui9KdOc%4E({#uq+05>O;$p~n=j}XFsz2s_Q!9Fy%_pfF z^F`4W$q^r4%+4ozx$kF1C+OknjXJ5(ZSoDK6STt;qZJ=S`O1$~?SgF1I;gW7MMMv? z>k~up1!t55i)nxxZOmSkPPW0TTbJZ#0fQ7|Nn1#p8&)-T20OR04s~kKTM8{M8sQ3y zDNaY*GH|KDM4=8{##st6pCGcTG9kxFjK8XF_kS7Bi^N<0Paa=E-F(;Z4{V920g+sb zeY`IXnM1cBRdvE^UpVzNY~l{&2j{%v#Lj}veK}QeuNq73H+A7R`MYd15W(YyUak{i zgH~X|XkGKV zliMeriiV`JZ8axz75pv-%-KA)Z}WEgHCFFAHf}PZPA*iwkX-DePpa=yshOhy2)5jr zuh)|+y`VFdTH)sT=#lyvXkQs?k(@nu>kxgG!wVF@9bp<)^dt zr2z>#(00?oZ%+yiW9PV3Q#mBzNsv5K%jYk`Lkl0;%+~o%fb0hIl`@TtU)gC!mI1!& zs+S5@uXYSJX!u`W-WY36K&+06ICu^K^?P}aDq;|x=RIWan2`4;HR7XUlFr7$@a&1| z54-D7lEC0yJ7q?fTGY^BzpazZ@|NxVB~kx&Goy_AOMARF9F_E zuDa%^S7mD3#eJg+baN{|V+%CtZnLakOz1BH%69?oO$K)pBcT*Zp^Ax*iWzh20{{Rs zouet|j(G1L+di@!QS>VMV3I*n)#K=kcA(ih{w|S*UETBOigusSQ?IrxyQsm{X%k|d z$D%nU6Jbu{28PHM8YrL@jv3@;6EsNPPjGd-g*He$`zIx>nPW6`J4sZ^HCfKfR-%FO zdRX#V*1DTqaBQ23)b0JsMWUxMoD$dYBbEtI8F7RtMj700N|yn`wQPojgxYN=l6L-S z*~9Tv7d7FRWzea!l-*s;uLZH+{PCTbk49?cI_(w@o(ivqNyX+Aw%h5VN^N^43q#{p z!WW@FGS{SJwyI6TaTcHYwMqhCXz*-sT)>-d6d8g0%(0<007LnN-QzroxZE29o0k*5 zqq)E41V?<1%X!i63SR-%BaHzM%MJy`avIrNOaO4`$&P(DzFwQpgM>N2xnJM~pVs zK5lMD?cT(&Pl;Nb#cgDHUwyK747=ztw?|@{$nrXjR2d?+zs3I?CUgF%& z`+G@(3aBrh5I3cUG08H%h_+=sHSG+t>6>{y@%q#RYq)iO%li8&KD{! z_=?H;NLRla_Ho7w7)BnO`>oJEjdGr#4j19m#Lg>|c%4jxCu%kmp+cU+l?)rXVZr4( z5?Ms%?C0>zKB$1rq&}W8_b)W@<_(t-o}Bwt`7_tw{nO9%AHy2V;H$XGkC~KRllP$W z??QjJWzod`)XJqn`=BCjljSP>c&Nrqz=Li&L{zchR{g=EE(D+Rxt7Sm=CRD(<$;GZ zJ_mga8-`gaQML2e`A~9N`Rwx(pwp90ML_z^_$mF`4IbHHwCZi`oM*9 z%SOhj=FByGml8RiByu((MLr}wnKf{+;N1bZ|FhK?d6I<)*ofugLAh@gFyt&xjEEex zeF^Nyq1F8a{m#$8#0Ew8)HEvQbA23$FF2$bO}tboCVLh7a|`(PJgHISfuW~UPXA%v z!99_@Fa4g91!b%@Rp`r`nui8MCa8r2h#2^OvFFYrQ3PW}MXY7=J4b+qovOwCR6*eE zOEHkMol(3Icag&zqzTlok0+9H(Z&C!tow@i>?Xd3H1C*GHTo_`G3@BM*i znhqK^*^IeFj7u)bvBkR~f;pN)I&3(LTEFWTF)mj)oNN2{d{~o9Y*5)YkHua_B0CNz zpMi@~y}DEPC0oiVdWP^45j|5tei0$-?D3pd#F2cc;`qM6JZ@rh%|4u?kwa40*304i zI~y{kR>)@j7~iW|;Tj67VGiQ+&E0G!*f0S3pHrq2I(M2@Tr)^@D-Nh=e>}nPzJP&L zFg6G6#RZOK*@avS*qEswxdRU}6h;5=Ok6j0lhdGO>z_%Okm??3aZPTbS@+GwMFS5l zvR>4HG!Y`j6dY$J$di!kC1l$@gBN3R38(Os#_GIUz-sddodqr5#f9CbGAEujjLyP8 zJjwf#K7DI1c5^D;t}DZBS_C(oQ5bKD22>iI5pKwbR>rf9sctSbdUvg&bGqY$dBC>r zmP4hkv900S_BggcqUjp*R&*+4LSA54R%`%_-vD>YZMTg=L1eQ+Q-kZAs!MnGF-TY~ zS2X+=y@692mQ|}_rQm{mI5i(2H^41Ww&;z2IZ4z5WEnGyS7{sLqs$&%T)teM;W z4jjs356kZ+W~79GpNVM(Hrt-P^qhle8OBz*L6SI%JyCcX;I4?q64RUYe3A1Lf-;-g zBo5({2x+HSktU<{sDap_v_k(!B2W9Al)nyXc%Q#HpXMvV6H_4PXlZ}|T&Eyw!H%UL z)`~3QD{>R)eymTeMl*kY$x^l};@!~8p21O4*KVNW?!6nfDAu}cYzxoOm}zn#L3&~E zywdr^h}DH`Mlp%d_t`0>#nyel8I8NRT8DkG*>c*-!M zU!3CYWfCnSf;8QXhK?Iw5L#}xeqG%FG&t{1D)F6PWa?71v@|qv+atzvz|wj>t~*F` zft_Af)#|cmB9+gkwRLQPZf|_*szgC(sOGet+<>6AO%>mV{P$t%)+{U{*`nnTyMf&$ z<>xg?dsP)a!&&qUNR|*i3?sSb|qLf-t=M#Mcio4l7sUfW2vD_u_M%L&ab|o^yG~2_d#A z*OU{ZyhOIQuqllTi?ypme7f8+R5Hx(=N-}-F2Q?I;oLSQoN zn83rhn>`A;r)?u?UYG6u1^ew&uZ0Eh{PSbrE?YEHwV>x=Xxm)^S_AHvYN8OP*$Z;? zl7$l~IN4$Dh~!xIzUhMR%uIAg6yp1%^ z-|>f^_j-t@geQLH64k&w(v4sY#&ixp;3$z6RtD8pt0@l>0}Xv~D|DgeuC@_)qEi-u z5r#B}lcA?{%_lZhGd`xmXGj*ef7BpmJJ8E+TYf{<Owi@vumPu7m13S(17vBH&FMmo?@NjopVTSE;ZZU(c3dWwpJ^uCQIc?Itfn=)#Wg9 zk=tIWUgtULMT^i10X%nQ`b5RYXe11x(OO+u0aI`F{nW8x8$hrPn|6+wA$YiR9_1A^ zm9#LG^*CWSA7dl3Qwa6#-l`R56fJyE)^f208)>PwI#kAVOU`J}EL{F-h||rTe@%VA zlY3pb59%EvlRydac<$5rMN-Ur<&*8K;j#jsjES_?X;xR2YH0|edh|gMQL}{VWQZ`0 zm(^Hx{I9&&f3N_H;4FN?B?mvvpBykPLVBXG)+TXm=y~$R*H$cZxbB8HezW9SrjEQp z&{4w0W{B#@Dw{eWJ2zl4>9)v@jrQb`7UBq#&j)1elL5IQ&(%jtJr%rIOT1m@cLlsW zK3YEzv3ojuwrMJLR7@+j|CLNp9eL)pOB{}S6PlE_)796*21^St*Te$IV3*X~}kGqW?Z zGvE1yFC66VNoDm~FV{Z4zacto$b+jSKV4G_b%xuzqQ*DO%oFtcd05{ zNi}5J?MC&~pG3`1lPb|G?q@~i|MOBcJkPvwCDQn#-LkGzv(EPIWE}?O@2b(s->dnc z*-jSNwt00aBV8$7uBPqdt>2cg`Q1uHRVLHY!Z!nL9?5u?iKx)=kFpz^W&Wnr>HZr1 zv-M@r2)#pJqg6Zhl2Ghs`@4s>zYr=mtTtq)=&sx+WV@b}Aw91j!ztWr++S+C@5Ke2 zWug}PI=kafd2^QSlCm|D-~NnX2$4$o#sBG(i+r4@)Jt*4EQ|Io2^&i~ zwoJ{5d|Ml7mLBWlGlKia$QI-JE3N8TW4AnNrB_ z*sL__Z;Hq=4cKFqi^NTLNRAcmG*70-Y=Au-%nA9X5Ac1Zpfo@e?Tk1lcvA0R4B2lQ+Cj{#iL8S5jncvv%<2>F0F2D_d23f zo&@V_szf!)*U=QZM0U$X`Sp97%68-5(?V61|8xv^t{mu^3k0av<-dUgNIe^P9ez9x zMm6Hbo)4(E4hWX2_q_(U-gxf0BzI)51(^emr6e}664^7s{)uC>fl~5m z0-e;GO0O_Nd;eerg?>r{;d7ujYu$8^(k_v<;h+M0`fg-5+KvWHfi#m8^=0?>_PwI{Jv zC1~&esv&C)wrs58$DniA`J+AgX~SuOgQXwus@-1>E8`n3PI2n%daAEGn>MeEx0W$6oIeGt}>wIni9n{vDCewsv5bh zm^8;)q`#!-21jFG-G#SQB>uQ8S4-|!{qMC8F)J1MDZK6C2q}GHS_U>palQFPf=0>C zZ(dh73(NdyC)AfMI}ix%j@YomM z4kbE0e?0Nc-H!Qzo^}1Y7V1=)oAO(~ZS%LF&o&8J6l)AUvQZR-Xr;5`p}rU}>-H43H{kE&5i#B97?%{Y{59gbd~ zipv=Gj^|o!pm9-SXQt<7?^2eN4L0BDOdI&NlF)l-KaqZ@P~%yflEEDivbDU2zSi2) zFw<-J_DyfX6*KWhr}=;2d5Xuv-t% zo+=W)8dOI2cYFlZETi|bZ#?qz?@kQoEvTvHs2n#` z%^8OFW&jm9pps4u*NvYP8e^RL{!f1ZLwbMt=%MuZJW+4lcav77lt^oi#w`6-^`^IW zEwU-&X=1H)KD#X<;uYDO5_vI(etX%A2;exKpOb$gRmjB7){~4)G$_}TUvrl_OD?de zqQR0T<7G+$xoYS%4r(u7$~0{-DB;v1;}0cRagj?;7c0b!UbFciRrB%ooGmEBS`K)%C{4B0Tfs zY<*T?HFFMcr=~XdTauQ_RFW%(4tiWgUunfr8dk4o92A@0+V>j1Vung{r!>!hZJ;4r zD&%%afsu{jCa9=W-TmFe>B$0uuILpG_J<`Q5k%`9FC;;Kk+X5A6K^Bnym@Jf-LjDD87t};p9X&mYFn)sdGFCA#AQx zl~j~%#}?d>RY2`{JE$N#Yqj?$Fkn%JaFcd(a7lR!qegmgnT2z}UFSy)I&ncxeu-h| z7pV>&K|>v+#7}`K9Dn%HH|Hcq#I8zx{Zk-%iHYC6i&Os0>_0{Sxg6{QST+EW zqekF9B7GpF_M&PD77rW6Rd=~aUA$_c1_s|=(s2U`jT;#dL1^*l<>4T3mmlE80CDK; z8{X5WBW$=rYGLDEJazHF1{6eTL?RXg_Q$9d#Mz6cez2)*)f{g_->i%r3Kv8Yk_xFX@a6M&02!IgfcN<*Gs?Hkaj!+NV)XhCl5H4Lp3K$`o>@B+E*>a z9c3>)fBF=7z>bvb}E&X&ZR0a_a` z-x6Sd0??2E#u}8toPN-cnXqeI6S#joNQHLZXt?qVqy|jJdk5~&(ElhfxmoNC6H-Uq zQT+En=PP1BCjchN3dP|V!-7ZO++@PY=@*9~(VQ}q&V61u_z0wp0?9ok>Q-jTQ^5jb z!>KbcVxPv9PX{T#FQKMJ;rC}9!<+7}I~-8Ntr8Vpdh}S>L8M!Z+3IwM+GN3dD`5%4 zc-H9))!3Wb^t7x-4}cMrO?JMIrv$Tj$?I?@t|D$;11lMw3C;!DeRd-RFcf!8+#8sf zLE!k4@>1Z&AYWv7>~511Ud_CKFoW{F1hx$VnQ_dsrw$@yw*jWsP9P-bNt7{?hut7o z*?Eo8RWw7mgw9tvGGBgVM&0Q51?w+?fULiB$ z2nrhGmZC;u&UpSi7R3351%qxqG*;F}Lo8Z9X;0TOD+;%FhKv>Gc+?{_B2XWi6!^aI zw4jbR0XmYqoAA|*0!ZztuBa?Pq^4<@pVvD)fOm2Ix{((0;0|n-C<^#o=;kV-)`gPW zEZhzFJPeBkkQzr#8cHwN4V@-NM41Ck%Q5o|^fTs-Iz~JJCmRce56~pLo=~kvNKUN1 zGmREN4{wMxx#U}_>suhUhMc^ldbaViv0x9yo=To#`Z^um7{j}|lgVpm zr(#oYvwN41yX7+;+W6q0V8@5LfCoQK2_iW$joX1Le*huoJKdP&%?+bn<;4+eKdW#9qC*eqS ziH(`zZ1(RPf0#`3F1_blz`r*Ae1xR_4p}|4BNiN@t!xxAg#e_GIO|gDZ(ctr>ErN` zS{N8;0x>uMuMmm}c8Wov%$)9l;=40KsXxC~H%M%QMQZ$M5?!*r-`2*Q)Y!)*7SZp7 zM`p30G^!ei5z{@tw*?+gLZ{@LlDouK{t*nE4v&wALZr^L6}a6!o%{NVV z7wbgn%u;|c4-uPR-Ixu7##V-SP9oviZ-Qn3oD*C@XFaN7Idl_+b#U57PG zg8hwG4MjN&vbx!;=CG8i4{#cnO(%YBb~hobRa|sOIoD+{Qw8=k1m2F?#1u3jekB_s zBVp3kylw<)Nkicg5T?jcP7o0O(_&B1^kC<+9RqZL<#l&L;*z(2ep5-s<9XsbFfJq9 zhb|Qw&3SUJabfGYd>-=hpeV-%r$~jXYEAn%UwMc>f9Hi(=SE6A!@<#ZOfrbK0fAz;IP}+^WgxV>MA;6`PdfdlxwZxSVO`h1bcNyV^l_t zbBR1Tfx$m8Xts@#O8#q*JKrc2B_)rROIGYRKy-z^FV>>!C(0K<k zC5)t}Pon9;A^*GEP-D#GrZ%eteC1PsW*HO_anxHd%B?0%%OdFIQM%B=q1_bxYHQsu z^xS@c5g)k(GI0q8^5pBN3?yU;hE_@G{Mhdm^o#m2=-@iA? zxQjGj{^z%X5$$AKXK|h2a3QkVOBVKa8?%ut#@zOccZ%3(P5RJTM!dtqXl*dz%gHNk zFA2{nJNzZUfCPsWjCT<#MLVro@fWx74`q3I9V1>r?Svh7$U2OJE;jCOUP48ygJk|N zQFz%g`~{anHBcuDQ8}@Eb=;Mhkn?S3q%JGL>AnE9()vGM%IV8J#xeLxur1ajrZaiH zs#rJ1RxDT_Rx}J9%<#-iPb#AkctL%RlRe&Wf~fpg*Jdml1uY7a+23kB-4tRyY%}w@ z?&=>_>-5EY5mOz&^bwVDw8=(4bOAn5 z(IpDq$b%(g2O28+@)`u=KZ#45IsXHy&#jbsw2uNQ(r8wO${EG3X)o5vmV)l3C|A*27Z+AI6T*^KPZ}~xwAX`~Sw|~r1 z7!K_jbB>Wfm8ywnnZUG?ip=2;FN~w3?FupoHL z0Dq4j93<*Z;gXjg0Q+UfQ28IBQIXrwP#_pl9M0eW{{5*{eR;cp%tci|-LrziXp?8> z66hoV=llatoe+lrpXf1(-p|BfpO{);Z9^Yjy$wfx8m4k&`P(4yH1;k$vwESn@-`;v z@ZB~xIK4BPIMS;>-miBh^oe=x;wm7Y=45YwB!Fbd}T2_*Z1S)8nZLHf55 zX7i=X2-WITBHNJQxHT8xab&8vk zi)iL~aw(>w?v1*7oO{)R_O7wRq^Ni4Enk*rFq6_Ih7@SD6XD*))A?iEbYK_IF^FG1!ZXZA zt(j>7V2nE(7NO*|%xCkT{b`UP`M~AWHwf_Q zi8bnKZv*^7TT8DdRHs1rp-VK0(g&e*p^-=RN)$E--FbmsCz1oe9T8UR5FM|Kg;!kw z;HqH(ywT0hmIGSgvkVLcV}Qk7_RyleZ;ufIb%_uS#(iTetriV7xRAu{@t zo&v)+qEMjw5sQR|9Mg?YiHMs_4FgX;k;h6oq+ne5GRmk5C$O5ez+~K#I2!2ePWMQ7 zA#XnqwZAyQ2^{-<)kGQyVSzm2_g_XS85w>jn9iqcdLo`roJJyiOPzcRBs)@$0)?5* ztOj-lU>C2;cAcy2ViH~z(Mld(bVzScU#^nDsdS$Y#7-7f;n^|z(lQw?fc_ig3UsfK z!+=K!XC1_N7p5sHgAf6QL&S!?_czr-9$mJafNfvycp6zaRD}lf>}YwnucEyG1~eC%sD&DLy$m0qo-Zj47XHI<9^M z!QT+rPy+m4lN#YE;0njWJ9r;gt}(*W8O~{SZepGZLuDlhN^zPjqY40d`TrY8jFnJf z%H;Sse)9Z|3nb@aXxOKVgB9%=l!Sj&U%j|`7h-2Y42uPv(1$S?36JA1L56+}3&tU* zLO1YzFE~-oiSvV^^7DW32oRLOTUVAl;1OOP5e*0K*SVc^A^r@ESGAr)-rg7zLc95w z70Iivj>^b>KH=Hlkln#j%1bEzNAMN4y+G%Hc=M`bF$bQ<%2h^C!U-eF*(aEVe@=cZ zK>pQbECCR?aaM8sbK-b!#PAMtD>*^l3^P%io% z)H>`lG!lG&nltNZ@}b2m27;_zR-YWAcgsGmflclOkAr+JLc6o^kY?CQoZzV2*2OcC zXMf`1oYD%H&+!e3BQFo?Pw`Tw2bLqgN-y(1YrTCv-*sC>$nCpft$r@@b&M~0$^)r0VX@#8>)nJRF);c}YU<9rZD!U)Qk%yuvK2yLj1j#wm0|%%;e0Cp3K{ zqT0U(V6tYs7gU8ODnc_ZgIR-5);R5}}*238;?X4E)ajs8)?@I}k}lNUl~`zW|%rc-K84(q=Mi3S%h8WSI{0kLOo> zBj&l|MrDw-)uf;Kj5?gN!7?btNwuJb><;VZR!a0_aXI7h)6`md%csGMUPZg{ZbxP+ z(gxzIn5_|*op`E`MGDz1-UbI@8?;|x2&d}t50UD+7cMM9BVla*k5N181%XymI>9lt z9XPc)5>q3bt1e))eB$l;_?8*%-ChdAlF?LNoK0DH1u@O?gl3d!$>N2H~kwE*q4=YM@ebsudM}_u3cYFb&&3k zeuHHveyjD8ah`k`>6gJraW|84;JYrk8zy3)*TS=h{;h$??K-zFy46D9Md2s3#R$?V zz5E2rJ6ev1q=y=N19#YX-cA3BLTex!MI^h9*S(TwLWZ*z0$_Y31@1=>N-ksm)G>#k=VxgQ zS%0-eRc5uP2+rMit}i`n^Ia!q*&f&I6nvgq{Ai-t(={cwj$KbVx8@tjSN8S4Tht%? zLa3m{UCN=eaB)njL`>vW8RiWGAHHKh*VUZGWefL+_k+?|FR{&sCMS#6I*^A2e1K@_r24s0he6p6o2Q#^0@UvO;H$e${sZmGjyXxez-e^Dg~VbbJj5^;9b zUP*0wyI)qS$PbFLYonXOp%FbwpRV7NmAp z6~C0VdAsi7fytjm+ETJY&b&jdDJ;L3S=!2TG-s$*{rvCY=&+^^S=UD)O4xlBLm;VyZ_YuvY@%>*PqDUMmLcC+}rF#fpQnw4M68 zAjN#QW-Wl7`?`65{8NV{Lw!eaZEWrh8_ZsIL$cI>!c>A}uYI6U6$%G7~c2X+~D z2aEjH^uhgj#(|lC;0<-no{ZcCZVK8p z?51~X?w)OG&Po+YHRH;rDV7~}re-VhvsJ8zZ-UgDHOaPcp74ajJ>&kP z0;_OYf7I$KKkX(x50+7XOv3>BhOJ||H0AV7Y47~;PnHbU!B*2r-2e@7IddACq|pIi ztmk~4q5C#RXb_bgVc!}+adLev6zoIdXX&q1TJ*<6#??*&dLshU;wR#DkFIj^CZ009 z9TDU@Dn?LcT9iL_knP6!GRE=ItCLnN9c~t6gu-VRUQmA&cu*u-!^!l=n}x6QP5{H= zD83T(g^mkTFaalLXkc9BvE&`|T*O`E#`&tzR6iO=j`aEUZ;iKG#9mUOa{c-3< zw;HYmtZ*Ov4Ev+^x!2xyA)b(;JA5YFtaY$!qT%~VW{k&@e$PTl*YJD|G|OS+RdSb? z%&0{7tLBdEYnEYpy?b$gQhS306Dwp0Zl=%+_N?zM;|x}sSRRP-Z^lQB#dG$m;6z={ z(K_9!o$|`NVXsE7IP&pX1~Qbh`uq8X52o?xQZ{eeS3Tw1L{mB^lG8nk8x~7+z0YWb z?UsKa(7i5Te>OcGB+Iqmk;3t1Gjz#7e6c?pAh$KYUsLQ#;w-hP-l|BmpUX3>74C{W zFwBxFlg!-TOe=bCVuqra3hZ#vbM5}~ra?^$yF)}!a9gBrJkVqLVf z-|pJ|M%+y8a3>>aS3*kTvv8#y#8ukDVj_|ilV}ZE zSY)!EC5-I;ocKBtlzdocsxUn**ORJxy!I^@3lmXRgF9zg;RsZz9jlLc6yDTBD@wY3 zdN)smM0sH+LD?8N*U{F#XLKSo%y$j6&Qf3O%R01E_j2VWzSaf{U2M4Wsv4;}$5@Oy z6ev#I;W7W?%RkbQi)X0;3hqa!X;qnwg@Y9ZD}w3ZWK-h8HFT{rM%q%hr%aVBHh=_k z#_|nRX)28*5N#U`Zfg3}E_Xdu>RAT$p$7I0a-K8O+K*;#b=D=Buc#bNwi1Ph66pFI zZx@8W7+u{cF2IoCz>dqmd$_5s)}Kuweq8k0Tz)YZ=}RD2j)hq400r(Dr>&Cm-agkO zz%W*#OXHg?Np6wI;F>Ca}fR$pgVW*CI*$md%Hc^v3Q z3jnk z?;mo;8qi(WXJ}a~v^M@FM8~^WruOwc{!=W!-_?yZc@zMHP8+F>C3#c$W68O{52h^>{BZXg+l&J9Pnlp)yi>tp! zhG~0<-b1XH_Vm@Yvk)pM&JHuj>*!?^FdY&ZTxYKZi9;k#*UN$mKN}*?SA1il<(s9UeBqW*kp25Q19W8P zevQDwjQUpb59NA=y>k|i9VAZX0~XoKQdq#%4+>%NNGS^?kjaYd)V+}oRRto ziOUUtL0C!@P79jjfX43h%z&kzNA@D}<8aF`$L)?21+qt-) zmc3=#oJfVA+=r8$9ln_LXg;wKs|py0)b5@4Bv;wB`J5$>UT8Vjlm1b!NlHgBO3ctt zOi9T|NlQsfOG`>h%K|cc3(kg9KPg{;Xy{#XO4=M{|AO9&LU!}a%W3*bqN7SmatR6eHpxA`J;EKrlOalSYHCVq8Cv-BuFEVcE_EsFozFm{ zDC!#kO5O=LSX8@{;TXgA^g9PFOOZH~pq5w!=a(e`f>-2b-l|xCFb_wd?N!5H8uCnnDe5+(smy* zyQJ&HLg9xW>Kp5*jNe|o?7sJ7*yWvHf2xZ;S@D8IFI=y#sTz3GTbFWAhOrru0U+?) zL99Boreyk8wTxj2)XLx!aEq45n&B?CJjRIv$kj={i-O^PP z)4t?Jk;Vp^JJ{x3x%))+8=!u~{Wm3h=~PWY$Csf6+=L93ie28UgNpIb08D{46idm5 z_RUI`RDczgX~s;${)v+^-_>~kAdZqGpN-+{4in@+3SI~X^ni%EF}niEjMC81FtFEO zPm)R?WtaoE=kHDCIvi|f)rLBM*L*>6X6Jqo`G|O@UWXC%IYayP>r(}jx?g{*x=yKr zoZN(o&KE9?E4nwXF>0JiJsu_e6Hvo!ueXet0`l=k)k+p}gG|}PmiMX^nUM|9M2ZiS zYN0j$f+9|37G2G+rMkLoFt|4>OEoqH9a@R|);d6;9#@!S(cVtarv3=4t*WF)5409_ z?I+fH0>4t}VQa~$KQh9^A*+?~jGTFu z3!CIl!ST7cdU$vkC_JV#W)^TjM^30#P*c-p3h|8pWm##Nmv{YXh4Y%KX4}1TpzC_|8cAl{pCPW%Amkjfei2r;__B?Sis3q>!NrhUNfQo-nTrpCwB z%y=H;JUsl-73k>bn1{?P83=*unNp_tx=&7Q>Pq#S>S4egFhK-0dJglz7)?ag%j={v zW@|IrkRvXf&=^QzFzQ!R4+`B%_3*&aRu5$2cN0=6)$nnB^iX)1kieRc<9#>&GOpCy zX#71pi@DUFj8p}YBl|7iv{{z8``y+nyKt8s-VA5-E;djHxVW>?S`AcPu`ge%*KE`h zWlSO4s|n0|zy6DkuH$`?o}<#}(tsifrgm&H#b=`;QG))*@r!zV7jF)F1cP25r*UmO z4|rT2h_bTsLAxNaUEdl57ndEQUOs+~0!caMp(QIm!SzkrHoXxAx!S5xS+Sv0yHnj8 zg>eXuT*AR%KOO`}*c`^fnIps#7Bwpaihu#Lwr{Ara=e-8s#*9$5|~Jwv9r8+9Okn- zR$Ix;%D7S;c3%%P+&K_kyw+p8+wUo%b5 zX!PpSiHH-oHZ<2~v>O!~LJLt}Pi3g~$&AUy%fHD`V3gx}V$rz7{0Gr-IHc|pn}P!? z83Hve)!VMsB}h11Eh4-h)7$9PkpNwL_n$Yz^2#6HE@(5~N2R@=SDD1y>(HtJr< zzc&ncFX3O{IQ^glmr~-(Jbsc#52?iB($ibIa<3PbtE$DdQwYXNohb%hfLq%&sBiGN zq**mVyd=N8_i3;v*NirCUugT3zf7W6gO>5`vE43*s(g{&=GGxn8DpJ$*hT?Me0Wd7 zaJQl6vTIrkcG~bk=HQdL^y})Gz1jzVDKx08g5+Rs06S7?XGVeFtTk8g{dhv24X!7?|NuxUBBl_dC z43=;By>J}io;>Y6jaOnyE=u(-MF;-P*l`w*I)<;r#9KlU#|Yh?Y*W$GXZjXf-Z}37 zJd>3Fbp`q}hfg0rIx?Uz!rYpR!T!3AL3`=MjR6S?448W)r~H77oBLk6k^^Wtx^P&? z-er6}H?2Ju+3^nkyvl+j+wMAV$yYq+Rc{*>+@<=#Gs0Y|EI`iT1wOrqu$h_JCrVC| zgS|V`LnagGC(TSnC^}?xh1@idwO$4t-wifvl6x-3szSWP{*7_@|@^V+fJzU z*FUhEKWEjbR)k8DT~gw7LPj9|STxe=IGo(*K(@SKfsclK zJGQ#MKJt^(1>ZuATQn`WU;kQdmFid^jJc}r_lH}R;XNAiEzqNJcEOPlo%VQ>g#W?6 zW{)$ktW_o>4Dw>0U5h1t=JlQr&U!{=GV^8*P+Y#5!- z-iPrmGzVqGE+Gvfi@kKvdOh%%`rzK!d-$eHg%@Xo{Pn1_GPv_!8Ftc}l&h+k59kzv z6mF}}K?CP_SK&SWjeuRg*&Ra#5$N|zs?rD*9U)K3tk}r}VKLs(8|pZh2z|NR^uDVZ#!xtsJ&L*^@NsrPL%O*`opmOd-*4eu)W%6X6iGcRS;wxwOZ; zN$si3NB0z%DC{fzD1t@SX_et$H%?AYu9Q|yDh}flK*p$1B-Xos?Fw{%prYC84Oty4 zG)H%T4U(Qf$?UM;;>-*&F3)&}n^3sWg9j5sgI2*9S2I04@RwFrc&rxRIvhJ*Unrr* z^Njz966AT?y8h!&QvFaolb@gKd}0J#KYhh}XjS^;L80Q@ZJr!9cCE$Lwzfuc(d%ev z9jGP6OQc_Zepj-w+T;bz!~J|e3q`RBv1k!-Zfcnq7n+X)txWUV|{5#VB}E|f~>aBIsG;e@C=9**tWS{>F{x9hk>4$R)_$ji&W)qW{qViGiM zHvZIdydOS63MEtizMz0*d0KV5$VY2b z@gJCVfsW8-ZR`9q^wM%AE54;oa?$xC(Zl!deSazFE4_dw^1RL@=DQ`L;1jy ziH4Y;ms^SbMOiv67+*X!>@_-C$_u!y@&4A4u9ct4`0t!iED-4zoS z5fO`QGG`6PNnu{@c*euyAg7e@n^Vd}F}e}cmhd6HEJL zy<)4m+qxu@gNzJt#$Rfp<;)FJQc^TX4gH3-%)96ARvW?ScFvuDoqf<0L~!Z5^=ZE& ziE`7@(yF9cNl!;dhglpYk6iiNtRYoeimmMdVobZd8gT8EIJl2q$`#eVP(DE1=3ObO zdN|V(Vags*Sy_qV<~L;B-Q7K{MI6M9j?5<^F;T3+))s6!ad>zb$GI}7?50B|DSIbw-s9QP{#QXyS5^F8lHNExX=U(T?MAkKPZ&_*`&H24k zn5>hmc6Aj_-5VS-*2qwuHB^$7oxiqVA8MDHAOA~9v;mloPRl55|Ejvbl=&BU0ktsy zl_n}yjkk+rroO+t?hua=-^IFflkKIEFg^!&3p=fZFzId2UppUB{1TMs=<*JcMvIFF z*5YsF?y(O<7&kTwliAWtn3B0xo072XOOF&Ns5!_e$t`FqOn15*VuZz$cgFja)`#_Nl##Ci;2ue!fy9BqUrtkMKQFurL`S z!`M@G|76wb5#mH}NoB6&h!2WWnB{ORx?XM%zYz^lxlqPuyaqT7&FMBKgb3c+EFl5J zrHQR|UrR`=?(B$ER}1DE;u76t<9yWgI**)OWtr|d(38el@+wq!?^dca<}M{W2>KZrJGK1EzCIBy`^EC<@7Pz>U9&6wIlBq#Vyw3kMr=|HZ4~CRG9E5H z4sBP*V}1t|!ZW}6u4FNuA%E|Dn$qwvvpCH@#;;enEZ2SlrI#-Xlpa@)H4W)`66v{^ z!`SX@Wvg7^gmqrz4!|?)n4$_2d*SOL^+l6 zHF}n;;o8^4!ntjtlipx-A08rrSY5W4y^Mn7J*OFf1&+y3GBnycDzhmsJMnyPL(o=~ z{LLE^r4nDATzyEoN9SB>T2j`aA-IUk;-bhMCLn(;k{Bu=b<2I=(7S?+ zTpvZ2s4Ed>RkHNOIg)rNNL5vp`qM~9eW@}EhKNqS43hI}JT|kgI5#0oeoIz@gthXt z%v1)xd4T z^a!zVPDv@H344Im(5lWT%vn-iK2jFO2{l@>Aj}tM(AlR;{!%$Duq&cQOOT!Kk&vuq zPf}IGBWR|ICA^fBw4Y32Xu+Oz74-0McVE`?{hU#*-mAe>L-yix8R-v=M~@#pvJG8t z1_z{o2cB-8;{E$E2ZsogCTTC9>*z?Bd~VnA*D(cEUt25+Gp)Gw-n6otXdO?U+)JB( zUqa=YFQ2+ZA=QbJ&Smww#N>NsCa*Z?L1UPxe{(kA2wlLr)&=|2O#h!HP^&h8BM|oJ ziP+3G0Ga*-iRH@Ex^G!CF|aJm%Hh&WgVlr8rr*(B++kf{WDewfw-LPh`ML8G5ZGqh z+VuJTnWm&6~)`eDZ&u zoSaI_KogK?(v_%lsNDH7F(GsHbCkNJr?Jo6ph%?fp1QUY_ zDhzc@y1KjTWs`+4e1k|40z-s-J%$VtjlIi;MYMAIbr@L*#hlyKv);<<0jsjO_hH%v z-`Iiz!2hTjze6=+o3)jpp=Yzzy@lDJ+KQv(^7IzF)R`~WD%h+Z?eFwbh);$!>_2AN z4<720Qcy_h0z$RhlO{1rHn?b#wbB>q&6j7lib<2kXDNKVvJiW!8w{lTk zqda%XwZfjskQLi*y(oWVO*SX^tMrE}9OZ5RYY%2;} zv%&WkkO1rmI&XCyP0fk5q5S)(S2Ib;#DyZl@R>MsmqxCOgsmm8D#`e*W)k$yNy9sT zc=PKgKDKkajz<~k$m=}zu$F@ZKg>X*?pQyTh4}?gJn?!|J2IlFF@T)hPa%J#qsUx4 zF8`&XV@ z^o)ZY&X*^qwL}wec5tkDt!oOefr2Mu*FR|Q3o%hpaQhMELBOoo5u7!_$5%~8YP-A` z;=4XGXgt`Wn$y2%Z{gs;lVs2-CQlbKA}rwC&TbIAA*(7&eNW@-++qlP(%1vZ|8M#J zs)~~n;0YpjPDaKy>+pR&ts^*0$YbV5U7$ubm))fspg~SaDTYJX*vOb!-@Z-xW@s$@ zZ1U`ZaYc&I}A9?seE}dH5nNyB}{mg8&Q|j{!VQRSU&Lyd)q3H z{l4N@`<2+?_;7pFZhLrp#CoM{dzeLQQJ$D$rF%~3QLnlLsFTLW$5*smG+|#DIOy)} z7BVT25&a7GRBye!IX%O8u}AeyD_ew&oZ3p3+5RVF{@ZM3(p4WDNgplDB&6>J?8&Cc zME9a!cU^k=o`+}=m}R2EZsNf@?XQbFB*e-6B#X_+P^1^8vI&WBjJDQsz1`QCiu&s( zXJ!~&y-A%P;c3(f4`TY&liu1O-4)wPcFJICu|U$7&4u9aep6s=iXex>NL? z{h;Qkp}}lhk7yma=ElvNRQHr}`eWrX5#`BM0|^KSqDL1Gdej*`+{#F|d=X=Q$g8T# zg2T-)?)avUBqm>4N>Wjq5k&q0UbB`t)CZJ|iTh3?Bxf@^oi7}4Yw8Fvg~4My?9gGW z?}rg8cDf;jJ0hFi9YXa|@bI)Rd-9*X*kI2NDDAp;>d5`Ctny0ln}xw}>Tbs>+rumP z9^htUw_iJwu+M?ll$tz8cPp%4V4{YgPrYcny6QeWElz^e1ImWJKS9qt-5)3R69I_V ztLW(BVnrnMuc9j|DlAlA+Lq_$K4SvT)&t$Ok3WTgV`Vjuhv_1NjWX);=@ZATnf`|f zK)L0rD)AAJ)PBah7Y^gbn-!~6|PozXE+h1Jl%ex3nK;S9FE8BDj zXJs879c8Dar;F`z0^SF9!JMqGMmf7}=G|ipVE+Axsw;cQO@GgF9?cE$t7jQ0Bja2%Vxp58dHv2aBLuiD}C7yQy@~VQWDfmHk>|y!h(c%7PUj%_- zmD3dr0&kCcgYx<06w=N}T?i44R#PEWQYV%leFg2D*%!;;&bh9MZ}(#azJg-~K5M4+ zmaKn}kfZF=2)5dsMXQo_b??>WCjP2KIj{wL-MxhgH1Vojz%RM!18l{ETCb857tT{8 z_y#sMEqb^Z|L?rfX?t_ZH<3RBrc64%($s$!k7U1B0yS_`KE2U|V4@Ilv1@@7Bt7i$ z!`(F+czF1YJ#caqjcNo01lpS~&H|^CDKQeZwzNZJv0{$VmC>Y4o!ULa~`SKbu>(G}HB% zI%69XUKAg=i%^iy>4LdG@I8%tYG^1LZY8XDhI(+p$S$BN_~a4}j|pBt-}@uyp_JBs zjjECR=LgqO9|Rv@C%meIJQD5F^>%CAKzc%n_)H!#L6_w;ajcviTD*QA)J}_k#%=8A z$j->gCY=x#^dd^4%ZGeda!QI{lokj#xlIcbNLQuH$lQ80e)G*6 z2A{WvmX?-J%8OU!wyEgoj^^8b#HbO{vs;Ui{Mg*w#BA%fE;5cQjRq9qihC`L`H0R{ zB1})%N;xXrbF939$yobhLnMsqp19i%`;rVgnKu44FP5-_;^jex1v3ovw2h@8Cex7e zm{{Hu5(|EIX+!vs1obKSgvMSYI-H-y zxoP?I9$d@sb$$iGitK{-vKmSK_P&YpfWDK{1R2T6-gtWZ0cA@8E*;8GTWoCDm>7+_ zV@qe1zyDNbP)-cA>xERTbe)T5_Y$CgH0;fe?!Q5sQ#Qm_eFGL0Zx669uemoO$EPRecQ*>S-&b z@}PXgY@h2FkN&`%+sddfU(l1C>b>D4lxg1f;U;Ue{Qc{;i7Q!8i^o_a{I}2p({(t2JWDoY~S07=^3^mZf zK^2*}aHIHV4KFpr#i}$j*5koDp4s~18HdT|Q3?12zIQ~sy$MkIKfNv={Caz@0dWZw zuxyu(kBrdusQR@4pbyyAZEefn4FG>rins7oZ~Wd|PYpoQ?}vSe-F@Di@O%v6vaReQ zL{k<~g@S7~KK1N+z>~2A?ze>r#LbB{Agf|#wyZ<3Od$sm=SUz_U(rs`jMaR`Eq=!v zn2{2-9xa{y_i28=`;&E(Xo$!75V;Z9Pe9T75l&;2Vg>E#RkL!{pj3oD`eOd8jLJ_h zEfuW+^UK0#>%!4Y@yk?|WWwx}@k(W@MI~)nURNQy_4Rdk#8lP_T&V*4Fbd_Lt#ZGp zsNZDxt}Uuxrwt8BzEJYVA^v)?;rhhnFJ%q$8t>Kk&Ue@kuP5gKy*HQSC@C=y?s9Qy zWI63GeFunc#Wpdo^X$}(QX7bIGvk^^uaOP{hyg=+&f>wcDf#OHULJuBtap>#{S{Bp^*?h zyx^3-7Mr*u-^EfD|6@PZ8~!~bpZE%LJhd#%P5M2$ZJ<-dv<0x0J5te<7yA#Ch7 zE2S&&&SsB5pzl=8?{Pr?U6eM{KAETi`MeFKHe%uL<(kMd-pqmF=z z{OTAuEcHoG4R2on)@P5g_NPVqw^s+aQ2a4tXK`m2=kCmDG-rXAQ$csDP!p;T@6Gxo zq555&4K8(+bT=_Ek&icERsa6|yV%=#A9K;HgsIeagJ(bNq4fdoM>Dsgc_E^F>`xT_ zQ9Fn2B;~{UPvHSl#{nq0kM8y%^EeLYGrX{&L6d%VFG3o8h>eMXDPmVO3E))`=soID z-sLBUm04MBUyfPgpGSGRm3;ki`Zk;BU_-y^zrS9lIQP89 zIKy4SKoymeezsMo2jAKU?v2u2r%izz@IWQ%JTNn8ozLUMdu10GbI z3c;=Op0))X>Rg@2(f(d>v3r)4z8;egP~tU!AoBJhbYTe3mow)tOz>*YIFD9;Hht_k zeajWO1V-lCOz&)X%1cWxg#%5H2id8RvkDP{fY4@k^@w24)tYfvp{=wulbU9*LvPNwr=|ep3pR6?)*Nw#q6L(LPpnQxy-0*A3F_Z!`cd0IR1T zlyBu;BIZ?H96dijpK>Urk4`Rw3X}m%Q3c%;*%`tK27q>DzGb;i00ySPH?97z0T+8K z1$@lrvYX?WSb-WEG27FLD^8C@hP(7{1@|denNCrt7utc8o>tG8+gxbN!@6Fnv5^uR z58As=vnqYQ=m&XUj7?J|lnu+f<+3iPr<=T^1h2O=qyde9CLuHr-8+X;pOb>pZI!@a z@EdGs+F$JIWG1>twFt~ea@tsv3?awi;JY*7Zdw2 zoLQYqdfTy4YWK{56ajOI2(pjfiTZ}!Xl-(0vsCj}DV*Yd$iYsy`__K)H5eihL? z!Kw4BFAYk_y9!)rTpZ(_7!At#F@BFA{F4{}I?xC23F2(@HUZ1y2Xk+N^`sXf}H9kxA`bg5pN>@dHx46_{p!%`5R#NwY_~b%4C8%gUaP z@C4T^jZNEK8WJJw>W;>AwtMS#tm|`@sK~@; z>^00V1)!cvQTX5OqJWW-I_1e?~{i(jSb!X;QiK?d{3_?XPD#jz%n&o8$B8VZP+ zCIQ9t0n%o3UMCPdJiOT3$+M-Mz2B4W3LWftzyONxA;s(KczS>y4T@|8U0$rOvWV@M zX3NQjMM-&EjU73bHXlObL5sJiV%F9HX`><~)l)Nsw*^2I(~75G4qGGdCU-nJ90A5x zYU$-=PfgL>Ei?L&2F+vVeDgr)Ym1qq(5)IIVvY(+Jh~2us##h#p^m!whZn%pHkLf2 zE%>NOS)U7>!xO{WjuA&O@MKX?#e0L{ZypnK)J$t z>XzM$Z}yteiOD2sg#YU=lSzsUozHi%v?^2I)t{(K`DnTygeuxXvbJIgGcDtzhtsL` zz!h_q@V-n2tOH;pk}0gMp;@p=(# zkA&U6v_-cMnm_L`U3!*n*7=>EbQ$6( zCti+>c1F3f1hd25o+LN%W02mcH{BR5U71;$8Wk9xcNiISISy3_B=knK`t}3qXon{q zNwl<7vWls)rEs={sGkQV+p57`zjS7`OWx=)KP`W_j1EIy(RkpZYv?RfZ#-gBNpTaL>$) zB~9NeeUZ0W0o$b?3We@L?d{Ju^>2^E6c#+DE48#Vl7QL^r};N^$Q1kK9~*bG!okUj zUKh#v;G9DH4|IY4{#ck84<9_x(AIQ;v7@5K!8}jkw6oqcx(;7+<)aH7cw?@Vdj>Bv z{Xx9r^?*`Nw4OiE`wD~XU<=vAQY0elwuri`lfPCu4INLkq2!wAJZbMF{Yw2I3O_FG zm?KdS9ACFha`!5wb~UcX35VK1_;sLx+&#b_O{b^ z;|I#6lacV%af7cw3RQSn0jF`wmMWw_^TRN8YU}V&D z&$seX1-N!l)ziJ9FVgp#9)C{mn@){V&ptp$e&v42(b7#8v^M$t()Wx43&ZL95G$Xg z84FWAtczUG763Wumd?rH*gjq%+wcGMaMcJgu4116j^En5i&Y~w5aw7vCX{0({B+v1|HM%IS2_q!Bm&8o@R zlw6G7i1G+1=NO0!kJhQ~gWT5!BNoz2a%}-;QC=fcKdlu3Br-&8bkfWprP2`wzE3qc z$_5zNubt{kD*(x&pculkcuzMFLpk*xr>Lp)3!V4O+9>sTWv8x47_xrNV#Mkb^AF2kUK#AKEsh2#-Pv#cW@BY<#i5ZCU<##>2F`kfhj&=COmz7;;T~^_6 z@=T}4Udcu*Ks${D?0F7+qM3khh!_xmn(j#$6Els1ovp`uC#BroFK=&I$3AGX&LIlcPb!TZ%=O3*#fw>oqnfd0;2u;(Ge*a1Uj*3XD!w3y1_+x^0-sc zc=W{sAlY6E7`PpIg|FU$@=dwEl7>`Lif;fr89ZLiroE-L^A3P72CkP%j}3IyA`zXp zPa2BKM%7=+7XwTuhf0d$vL6TmCH0Dba4wk z&n4QAV(g9w5z6)SzigCRvL1;=i1u(hJzP% zgLtEw^x#8Dc(%v!mOF@@Svs6JRe1Pk&tno2rmxoHkM%n%72vubL6@ge+Cu!y=BN3U zywzrdm&qz`R(pxCv0sdqZf14b5Z=D6r=_<6qi2xs0_w>Q4pg+Yv;y7-&?s#{TmkwB z-V8Gw8KyV7+;-dE>Pkhbd^Y?!W#_&P;_Ol^OmaB_#^3jg$p<@4D~C{jmu**KjYfB! z{_dhXWPY{9UVBas4nflTt8*m{{r!-vHbkQbEQ$BkhnC8X{MtOHeyD2)gF(u(g(m-3 zS0kPO(3HR5rLCeVd&GXJ9Z-8cM@>yxdpfy5l(%D8qMXQ^{6u@m#8r0Li9Kqn;z7bC znH9BP)6`D-?|NerRSb_cTKwiN9Tn{=?sw%B$IKW{*FGip zPLSAXGzpWef_(C$@}DKo9%{zK3e$|B65-(wDL$VD5|Dw-CZ*FXr}=C+#)=1o>OK&e zLb6-8zF1Y40aYrZk%`+5k2p9vDnxc1Ap2$7=Cjy{I+K3 zIPw7bJ}xl*=2KSQ?oa~njX?Z9y~JUyy97#1dY&W3xS_XQW83^GH$Qa>BS(xf&)afGTFr zsei%_fYl38vF*Y{Bj{N8Oyxz~6iy87C-82SF@D=90#pX+!h zsL0ehkgq*+&5p;OUXdflk7y-|gx-E8wAkx&VQ7sdpv#@x@OyMTQ!I?XUOb@Sc zwL3rU_ol=QnCp;kBI)nJhj%?EZVBVM{9L$zm5?rS1H8uuImw5db(dyChcE^$)?jlt z2SQ=BM^jMGvvA0HZy^_)Dt)}wva~A-en)59F%#KoIP2X??&-u(l$Qfk+Z4#M>PzDP zus;6?g|8x4j1b4*9#!$fNI4~sm(x>w-H_w(BkMG>Ar;Z%AFZ$QbFJU*!;oLzb9^~% zI2SkHi0g`CZD_n&;J*(WY%~Qv;yqg%d~7kt0dcmjH^u3x!!P`A4kuGHMAd3H`P@4)^*gkKB< z8}(38Cechjc+1d1T|QbsliT|-qcpFUwbi2QTkrFn+}R-1z;}|+rrOyB8`wmg+jNtz zyJ#tJHuXz|HT>bd;&XpmBC%)`9P$q+w}8L?xz;=o+Cs1hKlp+u8`(}4(BpLix{I31 zz|p3H*pgD@0ZahCz`dA2^z#sjI@d5GtQ+Wm{G<*~*><~*p zU=m|}egw06AMN|wdu{XfCwsBE^#!dTZ_lxH?~g1kEuZuyyRCAgtDn2T>|f4qI0%tQ z$wb53Rvfu8Ymo!R1|BDJjFIC;UWmB?hMcI@NC*^Vt`h0c)LIf4o+1%Wf7z04b_6+7 zLB@6);MMVTm_6#y&lhN^h}6xrd1(#sus{}OyubjnpkU`#$=9~lQs?s~ewE8c7@}`! zNeCNqx)qM>9#XkrHCM&B(XyzHv32B4;sS7)HrBg|O`dJ~;NHFCSmY%Z7#@fedvn&Njhw0EOWks? zw1l@Er5K|91s?RDa zN;B2oEY$cT=F~+?N9Wd}}VC}_tS_}TQ zyh@;KS{!mj3wht)s9o%3NnB^V9Y0dMd(%nSd9jHixZN-WPCA-lreJob5Idu|`Oc_u05N zUgToJdgq~|RT1(8c@BopB3F^O*TV7K2nlE4bCvZpoR^gaW}>T5F^b%aJ)(N+8P@9B zj3EPcs$l5?qnffceF+$LOosdl8f!0izCfZo*~_w=Tzi{Wc9JVAVb;x3u36bxU0s~+ zuG_w>f~ZylZ4JkCLP=W-1I1Xg56iLnf$M*$-qES_?G9i^{u~ny=t6gXi47X5#B(i4 zCjt5QsuJ4|$%Ar_dhf{M)%`qaT{lb26)>5QmKo7nVKR|a%lJHz?E?}O{LabvCR$;D zccOb~O3V7(P#<<<0IQ(>CSCP={LF9YKZJBOX0|>6>a2-g7M`H#W^4u+u%SB*kr5J- z*kxsQ+mnM>>_g=L&IzzZZ zKAy7lM73@vi?|*qTgUTmiM?HtqCfk=)#+Dx&dHHWNGF~WyajUj`nYD$sl-Y>3`jFn zS>FL9U9ZAs)b{h|N)1izbIKKa1Bk#w;RT1d?X_-39Zr2N&_M?qc;}6ZhKAM#A<3pp z3zhoqHHh!pX?~)1I<(xwNV6O-fet;1*T|j7WTjb-KF|I|$dOO*mWTtjW~JTpntcCi zGi$Q_=*2}a0)l9#zu1A9^I(^;37JIx5#!&&Jc8{YdL_E7e8_0f=d)qxleqa=&NZ5s zHnFR;Nbz^41q`Q#XL@{inSYQ=wuV;NQ*(Fpmw7=Hc4`$I?-->StHtj> zq|^OGA=5ck-|qJF^`L3^TUJVy%Vf7D9sA~(>(d$!lNqDD9i~S^2P{pI8aDZh+t@DR zyYpCw-QfQEgSbIOA@au&B~@;UQtGAdcQ>XBJ?d^()>LG>j?XvbCnVf$zAx-Izr2S9 zEtCVR)#Q6%{rrBj3k$TrSB-hZBmV;XyGs>lZ(=bOF+;@wIb15-5PUROgXGH*hX<=5 zyP=41$Pusixi2o!&5NzcFK)F{@^@X0qnMRA>+7z--Iip(t_#*12+DZ7+i?S1R{7}%gBs7hon%S* zsAGE3jR)tGdJ~(B*75z~hp0!c@6vtyA!l8wSxA<7UgRXqsLu0F#^vT_$L?(L;F@N~ zivnrJeEsPf5BEFzQ&S}D{u4G84(w%oF#j1^np(HTjU&!@L(iS;pzaJD(>8U&>+ zC!W1$TJS~C^1Z3C7OAOLOElb|{hV?-1ln4g`uOSO4e0WYXai!m7%MktHeGf1r-#)7 zCCz(Z5`4^5uk-LUoCh}*Yz^veD+XN7B&{w}r36g3t;B_k!(TcykBA=}7}?moIzFdL zMeGrYmh$t3DuiU`_`4P9ss#tt0zQ=RX%gei%Og;Cshu)S^RZewZoHjz@{wxn@b}Kw-T}|~q&IVn4rj$V}LXlwPCKz6c zTn1evB9Bv%$=<_@kjoYAd@as*_3=DOx9VN72wb;j40LtH1O+`Vr!2^`S=-v%(c|pm@jxcg#A*4I%f7B`WZ;ApCeskjvf>;<)o+3a@E871>mHF%%66Fm@0k^vL_P*vXexBj->y$_1CQm`Weot$2~S0Xh~F8&evQShy!|b2cxb|EN}}I+H`R`ajD98x{s&Q-|J?&8s4zo zOn>>c)wB-e3ETI7^R3$Tq;FeaP+CpY^H6%V;`R$u0K$XUn8LmH;=y$l^&})SkjrBu z2x9*LitK~d9uK{7sacFpMV#?o>=#zrZcDtWqqxuh_zX|4$N81xPg?L1#OUqHcL(;b zv}<=W(#Ls>sB696n4046Ey_S2o0;KF?M#B#DiN*r^j`DnGRU7>J@`Mf*p$6d;5o0x z8=KoB)*;SjF0ys~q@qdQ=V7WqJ&aS>sbE&{4skEgi}Ho38G4!v8aL~-Sf-#q-DRSN z^jGdqb@w+?^f=wD_mCsvbG6%)#ithAa33zK&Df_(IgLF5pOWN`2KZE)_(|+5_Fpb- ztyf08oGckNQ1@HELYpMkf;OK3Pd>4PF68yMKfjIL8!(g!Z}JIr}9 z>Ut`+BP{d}12gjSyZCG8I*F-)JhJOq`>qnrZn`+#dI9u7|^*RG18|%^=+p;KI+`-HAi0DhK zj}j4*#oyh!o0=}(s36yP5ldjkh7YWr?*{h2q`F^>BljTEypYqSLb2o1Rgz^H9X*^t z5=@u4SjgT6UdrUUfd^5UtDT7Zg}G)q?cUS@tlstq4Na|>3sT&)ERYaXl*tW;{*bjb zkdjJ1&TalQA7&j7L5w2vkxj)m#h!f{K?1`JF zg;ON$kgyr{ugSvehra9c|EotjttP)p?oZfT&K67u%*a%xuopvN`j}Z zJ=3h4DI>T+1ciJ@r|K5pH9smuq@Sl=Jp8)PkJKZ;41DKnZQp=mx-F`T=&%nG$R<`p zXJOR*aSIE?6Ev8~hVGZ{t1GmwV9GuoD{ZCm%#5e?UMx8SVF2JP-=aIN2cynE|5i+J zrL;D;(H2zKj`L};t!UI;gpyO=ZoNhqPnT|Sbud0lHEeI+VM?R@_@0E;`>?njm@;&v z<%((Vk(Ir=A_}^g6NH?NgBOna*4@RDlc?o1j*p6a*b%XZ>~)1w zPQHua6MbIoz$0K7igG+{Ur&mQaj!fOw2$+?(!}hE`kUNdyLR*bRFN>rCTh(fg!q1N z>hxUQjWZxvN)A(qB$_1n(0&)3(`Awje z%eOr@`TmRmkdx<+?>(rlEqIqfjLVhcrm+2(e7gpugIEKR-dYY4^Z@S~-4Il6Y^Xo@ z>IDmo^bI<8EY8zYV_YbfB)|LH9~%<~=?4px_2fyR(cQ<1knqOYO}*%GW6V0Q>POan zEZ7doU|@g)JIgwe>~XRU@F=pjX6gsLo(r%|RAp&FQ78ut1aC`|KUf7x$ zJ1AE1Tp0)AIOL=X($mciBZqM+-~(5u9R1rhjAPI;W6>s7(JBcv84;A*~hKK$U2g52}D&t?= z-p$lIU&d0U%1A#??dBETN1ejeBt%P=4*Y3=_k+ZT`gwQuk~U%&j@f2;YR9mcWkeaYCYmd?M)Y>9N}aSZ_BuA?XQA^;W!!!9Y`@>7ZP zI)w#O)|3c=kRvb*tiE%@bJ-UDI~|m(ejxklvowZ~vA)ZU(r3H8@7Z7(p}ic>Tc-0o zQVv*ANuMYJez@$djy&4tdz3(VwAMQV73GV;Mu6Sx)-;JR=l^z9l&Fi4; zA^!KQik)D{iFKWqM+A}oyT~GUi`|d)V)XEiFDi&Gdqgz&4CcLQbaA|x3U=&A_-T&X zjR2vp`v$E3s0O)=3}EnMykM%<)z^o>8Y08Je-1+~tdZ3Dh<@+^{lG5$t~YJu-Z1FzrewbXEhs$YGbq3a3N<N)*k&<-iT1-77~7f+y!8SZ*#jVOyqRE z-%B!{jL7Rr9Ji+CXt?*rn`+i(@LeOdz;p0ZfHR5k_gd|KijXXk_$cq zO9XSYykMG>KSzXjmFI_$?ismbh^K463yqvqlTwv_TDh?YwuYYb!DU*;&nqEhbhRjo zORK4u{1%N&Q%TG8m(C~l2${)qusnHY$CggZ7ejq~THN2H-x@kK%9t=8%N0xMteB>A zBc8<#hG>qB9Sw2Wh7r}DC`nr>i3B3Bz~@JbRQ=8SeG*_~?Xm1mFige#v z^>u8~Nk)7gk`OG?*X~&O3nHd#57}nX_Xdf~;JO22 z#tal}rmw>LuI5B;Cu~L?Iqq!f4)0m7GC4Ld9!tjHzZ$L#!`C=Y$LlDF&@(p~1wykA>z!A2S zd}TkRs84s2QFR{QV0dCb`(tWgVrF(YSJ7I(hFP94n@rNwAld{sWjA2H&V;CPK=n8C z^$+Ji7K0+fdmEL7uFP)MpRb5P;js{Tt@o>AUStAtX87@bIRu_YZn2OF!JVsOXD2Zr ziRaKkQ0u*2=yqUvRY@26fdI1rLSaRwuIl+F)XF>K)GNJ4d!_yiCZ+d6w~&ay;Pd$o zj3F+Ml3UB`Edq~squ5-t6YKY#eQ|YX`S^Ybq)sr(yK>Ow9@L=5aSyPhZpZCVl^_My zGTChv@7?5V;7{tsng=|5?YZ2K+=X1Of=>b==OR!9Tzl^Awha1fsQV?wdmELyvkiLW9M}#19cK2H z`Uc#6dwCUZZzv^2PT+e9n4~v*7n9mX?qjN~R>sG(_TCSBxswOYO+61qpr-(>0okvF zUTpfi@jl?hZ7N#@xDPqxA_#~Dw>8>e^#`nI{XzOnKhLk68R7&9pUsWuW$tNufftB< z1H4^`*t%luJlD@sKYqkV9)5@12%}1I+kjjIf}>r1^}kqK{`ZDGF>WSPr4+5#uBW_B ztMm3~lOKGXI7g4X{jOx)DvWgwa@o%hKFlq>ck*WJfFHb1n^K6#?Ks31J)JxKh}_t$ z7leG_%F=&^{oJGZKoB`~J_`-*=}(Jgz?P*+q5FKk2^IqgBwRxf#vWqV^)lY@{;PyP z79$zuM#CelEWqKgDEoj`)V6ND7vlUGgcAuue+}NPguXow(itqTY=^5${htGak(jP_{%p$r9O|W@o77*6$3pE2S`7k< zA6W#(XmPnjFWDM>4>;i;-nLN;Zw6za!W+s3iQ@vk6+APDuQjEA&=DyyNX7Anjx7<$ z!PvaI;t4ip`#S-i00=s*ToOt%Sgz$;q7kR)#=j#dAguC4{~=L%b}Vf56pcB82_T5y zptoE8&owd^QKC<<{Z^7IGG2ldRn1o+#{6qc5{@+LE50`_O##0?bH-Ri1Hwls47fcF z5EtahD9GNzwT{U<|NQVe@%)p&1nDUbdphx9Mh^-f-x5!Txun@G*84F+XwTz5G&iCF zXZj8>dp|}_20|9U0AAsm3;EY;LmOMe&0ieJSJt#suUDCQZM>uS^i?E9IVfNF-W)V& z{kpPDNx<_DO%Tyx;4I1dGSO0x|4WVnwSN)24REK#h13bR57}@;9U$FPDB?4~*#8LbB$k0e& z
    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%0D!T}v02OF&bgbY+KtUZB0>P4M+apW}F*C@E6 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

    jZ%@J^an7l4jt#h*aHqTP0`;#ho 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 literal 0 HcmV?d00001 diff --git a/windows/tauri/src-tauri/Cargo.lock b/windows/tauri/src-tauri/Cargo.lock index 8fc75becd..69368c939 100644 --- a/windows/tauri/src-tauri/Cargo.lock +++ b/windows/tauri/src-tauri/Cargo.lock @@ -546,8 +546,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" dependencies = [ "iana-time-zone", + "js-sys", "num-traits", "serde", + "wasm-bindgen", "windows-link 0.2.1", ] @@ -2608,10 +2610,12 @@ dependencies = [ name = "lithe-windows" version = "0.3.0" dependencies = [ + "chrono", "keyring", "lithe-core", "lithe-project", "lithe-terminal", + "regex", "serde", "serde_json", "tauri", @@ -2630,6 +2634,7 @@ dependencies = [ "tauri-plugin-updater", "tauri-plugin-window-state", "url", + "windows-sys 0.61.2", ] [[package]] diff --git a/windows/tauri/src-tauri/Cargo.toml b/windows/tauri/src-tauri/Cargo.toml index 97e987512..6f52ca4d8 100644 --- a/windows/tauri/src-tauri/Cargo.toml +++ b/windows/tauri/src-tauri/Cargo.toml @@ -9,12 +9,14 @@ license = "Apache-2.0" tauri-build = { version = "2", features = [] } [dependencies] +chrono = { version = "0.4", features = ["serde"] } lithe-core = { path = "../../../rust/lithe-core" } lithe-project = { path = "../crates/project" } lithe-terminal = { path = "../crates/terminal" } keyring = { version = "3.6.3", features = ["windows-native"] } serde = { version = "1", features = ["derive"] } serde_json = "1" +regex = "1" tauri = { version = "2", features = ["common-controls-v6", "protocol-asset"] } tauri-plugin-clipboard-manager = "2" tauri-plugin-deep-link = "2" @@ -30,6 +32,7 @@ tauri-plugin-store = "2" tauri-plugin-updater = "2" tauri-plugin-window-state = "2" url = "2" +windows-sys = { version = "0.61", features = ["Win32_Storage_FileSystem"] } [profile.release] lto = "thin" diff --git a/windows/tauri/src-tauri/src/host.rs b/windows/tauri/src-tauri/src/host.rs index 7f8c3cf26..3910d075f 100644 --- a/windows/tauri/src-tauri/src/host.rs +++ b/windows/tauri/src-tauri/src/host.rs @@ -410,19 +410,6 @@ mod tests { } } -#[tauri::command] -pub fn frontend_trace(level: String, scope: String, message: String, payload: Option) { - eprintln!( - "[frontend][{level}][{scope}] {message} {}", - payload.unwrap_or(Value::Null) - ); -} - -#[tauri::command] -pub fn record_startup_milestone(milestone: String) { - eprintln!("[startup] {milestone}"); -} - #[tauri::command] pub fn get_system_theme(window: WebviewWindow) -> String { match window.theme() { diff --git a/windows/tauri/src-tauri/src/logging.rs b/windows/tauri/src-tauri/src/logging.rs new file mode 100644 index 000000000..67a97b8d7 --- /dev/null +++ b/windows/tauri/src-tauri/src/logging.rs @@ -0,0 +1,2681 @@ +//! Windows-owned application logging, retention, diagnostics, and settings commands. + +use chrono::{DateTime, Duration, FixedOffset, Local}; +use regex::Regex; +use serde::{Deserialize, Serialize}; +use serde_json::Value; +use std::collections::{BTreeMap, VecDeque}; +use std::fs::{self, File, OpenOptions}; +use std::io::{BufReader, BufWriter, Read, Seek, SeekFrom, Write}; +use std::path::{Path, PathBuf}; +use std::sync::atomic::{AtomicBool, AtomicU64, AtomicU8, Ordering}; +use std::sync::{mpsc, Arc, Condvar, Mutex, RwLock}; +use std::thread; +use std::time::Duration as StdDuration; +use tauri::{AppHandle, Emitter, Manager, State}; +use tauri_plugin_opener::OpenerExt; + +const LOG_CONFIG_FILE: &str = "lithe-log-settings.json"; +const CUSTOM_LOG_SUBDIRECTORY: [&str; 2] = ["Lithe", "logs"]; +const MAX_LOG_FILE_BYTES: u64 = 10 * 1024 * 1024; +const MAX_LOG_FILES_PER_DAY: usize = 5; +const MAX_LOG_LINE_BYTES: usize = 4 * 1024; +const MAX_LOG_READ_BYTES: u64 = 2 * 1024 * 1024; +const LOG_RETENTION_HOURS: i64 = 30 * 24; +const LOG_QUEUE_CAPACITY: usize = 8_000; +const LOG_QUEUE_NORMAL_CAPACITY: usize = 6_000; +const DIRECTORY_OPERATION_TIMEOUT: StdDuration = StdDuration::from_secs(2); +const WRITER_CONTROL_TIMEOUT: StdDuration = StdDuration::from_secs(10); +const WRITER_FLUSH_INTERVAL: StdDuration = StdDuration::from_secs(1); +const TRUNCATED_LOG_NOTICE: &str = + "[Earlier log content omitted; open the log directory for the complete file.]\n"; +const CONTROL_PENDING: u8 = 0; +const CONTROL_EXECUTING: u8 = 1; +const CONTROL_CANCELLED: u8 = 2; +const CONTROL_COMPLETE: u8 = 3; + +thread_local! { + static IS_LOG_WRITER_THREAD: std::cell::Cell = const { std::cell::Cell::new(false) }; + static PANIC_HOOK_ACTIVE: std::cell::Cell = const { std::cell::Cell::new(false) }; +} + +struct PanicHookGuard; + +impl PanicHookGuard { + fn enter() -> Option { + PANIC_HOOK_ACTIVE.with(|active| { + if active.replace(true) { + None + } else { + Some(Self) + } + }) + } +} + +impl Drop for PanicHookGuard { + fn drop(&mut self) { + PANIC_HOOK_ACTIVE.with(|active| active.set(false)); + } +} + +#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)] +enum LogLevel { + Debug, + Info, + Warn, + Error, +} + +impl LogLevel { + fn parse(value: &str) -> Self { + match value.to_ascii_lowercase().as_str() { + "debug" | "trace" => Self::Debug, + "warn" | "warning" => Self::Warn, + "error" | "fatal" => Self::Error, + _ => Self::Info, + } + } + + fn label(self) -> &'static str { + match self { + Self::Debug => "DEBUG", + Self::Info => "INFO", + Self::Warn => "WARN", + Self::Error => "ERROR", + } + } +} + +#[derive(Clone, Debug)] +struct PreparedEvent { + timestamp: DateTime, + level: LogLevel, + scope: String, + message: String, + fields: BTreeMap, + key: String, +} + +impl PreparedEvent { + fn new( + level: LogLevel, + scope: impl Into, + message: impl Into, + fields: BTreeMap, + sanitizer: &LogSanitizer, + ) -> Self { + let scope = sanitizer.sanitize_text(&scope.into()); + let message = sanitizer.sanitize_free_text(&message.into()); + let fields = fields + .into_iter() + .map(|(key, value)| { + let key = snake_case_key(&key); + let value = if is_sensitive_key(&key) { + "".to_string() + } else { + sanitizer.sanitize_field(&key, &value) + }; + (key, value) + }) + .collect::>(); + let key = format!("{}|{}|{}|{:?}", level.label(), scope, message, fields); + Self { + timestamp: Local::now().fixed_offset(), + level, + scope, + message, + fields, + key, + } + } +} + +#[derive(Debug)] +struct QueuedEvent { + event: PreparedEvent, + repeated: u64, +} + +#[derive(Default)] +struct DroppedLines { + debug: u64, + info: u64, +} + +struct QueueState { + events: VecDeque, + controls: VecDeque, + dropped: DroppedLines, + write_failures: u64, + shutdown: bool, +} + +impl Default for QueueState { + fn default() -> Self { + Self { + events: VecDeque::new(), + controls: VecDeque::new(), + dropped: DroppedLines::default(), + write_failures: 0, + shutdown: false, + } + } +} + +enum Control { + Switch { + writer: ActiveWriter, + previous_path: PathBuf, + configured_path: Option, + fallback_reason: Option, + ticket: ControlTicket, + reply: mpsc::Sender>, + }, + Clear { + ticket: ControlTicket, + reply: mpsc::Sender>, + }, + Flush { + reply: mpsc::Sender<()>, + }, + Shutdown { + reply: mpsc::Sender<()>, + }, +} + +#[derive(Clone)] +struct ControlTicket { + state: Arc, +} + +impl ControlTicket { + fn new() -> Self { + Self { + state: Arc::new(AtomicU8::new(CONTROL_PENDING)), + } + } + + fn begin(&self) -> bool { + self.state + .compare_exchange( + CONTROL_PENDING, + CONTROL_EXECUTING, + Ordering::AcqRel, + Ordering::Acquire, + ) + .is_ok() + } + + fn cancel(&self) -> bool { + self.state + .compare_exchange( + CONTROL_PENDING, + CONTROL_CANCELLED, + Ordering::AcqRel, + Ordering::Acquire, + ) + .is_ok() + } + + fn complete(&self) { + self.state.store(CONTROL_COMPLETE, Ordering::Release); + } + + fn is_executing_or_complete(&self) -> bool { + matches!( + self.state.load(Ordering::Acquire), + CONTROL_EXECUTING | CONTROL_COMPLETE + ) + } +} + +fn wait_for_control( + receiver: mpsc::Receiver, + ticket: &ControlTicket, + operation: &str, +) -> Result { + wait_for_control_timeout(receiver, ticket, operation, WRITER_CONTROL_TIMEOUT) +} + +fn wait_for_control_timeout( + receiver: mpsc::Receiver, + ticket: &ControlTicket, + operation: &str, + timeout: StdDuration, +) -> Result { + match receiver.recv_timeout(timeout) { + Ok(result) => Ok(result), + Err(mpsc::RecvTimeoutError::Disconnected) => { + Err(format!("Log writer stopped while {operation}")) + } + Err(mpsc::RecvTimeoutError::Timeout) => { + if ticket.cancel() { + return Err(format!("Timed out while {operation}")); + } + if ticket.is_executing_or_complete() { + // Once execution begins, the operation must reach one definitive + // result; returning early would allow persisted and runtime paths to diverge. + receiver + .recv() + .map_err(|_| format!("Log writer stopped while {operation}")) + } else { + Err(format!("Timed out while {operation}")) + } + } + } +} + +struct QueuedControl { + control: Control, + pending_events: usize, +} + +#[derive(Clone, Debug, Serialize)] +pub struct LogSettingsSnapshot { + pub default_path: String, + pub configured_path: Option, + pub effective_path: String, + pub fallback_reason: Option, + pub diagnostic_enabled: bool, +} + +#[derive(Clone, Debug)] +struct RuntimeState { + default_path: PathBuf, + configured_path: Option, + effective_path: PathBuf, + fallback_reason: Option, + diagnostic_enabled: bool, + active_file_path: PathBuf, +} + +impl RuntimeState { + fn snapshot(&self) -> LogSettingsSnapshot { + LogSettingsSnapshot { + default_path: display_path(&self.default_path), + configured_path: self.configured_path.as_ref().map(|path| display_path(path)), + effective_path: display_path(&self.effective_path), + fallback_reason: self.fallback_reason.clone(), + diagnostic_enabled: self.diagnostic_enabled, + } + } +} + +struct SharedState { + app: Option, + queue: Mutex, + queue_ready: Condvar, + writer: Mutex, + runtime: RwLock, + panic_path: RwLock, + writer_alive: AtomicBool, + sanitizer: LogSanitizer, +} + +#[derive(Clone, Debug, Serialize)] +pub struct LogDirectoryChangeResult { + pub settings: LogSettingsSnapshot, + pub previous_custom_path: Option, + pub previous_log_bytes: u64, +} + +#[derive(Clone, Debug, Serialize)] +pub struct ClearLogResult { + pub deleted_files: usize, + pub freed_bytes: u64, +} + +#[derive(Clone, Debug, Serialize)] +pub struct LitheLogFileResponse { + pub path: String, + pub content: String, + pub target_line: usize, + pub truncated: bool, +} + +#[derive(Debug, Default, Deserialize, Serialize)] +struct HostLogConfig { + custom_root: Option, +} + +#[derive(Default)] +struct StartupNotes { + config_warning: Option, + cleanup_warnings: Vec, +} + +pub struct LogManager { + shared: Arc, + config_path: PathBuf, + session_id: String, + config_update: Mutex<()>, + pending_previous_custom: Mutex>, + degraded_reason: Option, +} + +impl LogManager { + pub fn initialize(app: &AppHandle) -> Result, String> { + let default_path = app + .path() + .app_log_dir() + .map_err(|error| format!("Unable to resolve the default log directory: {error}"))?; + let config_directory = app.path().app_config_dir().map_err(|error| { + format!("Unable to resolve the log configuration directory: {error}") + })?; + let config_path = config_directory.join(LOG_CONFIG_FILE); + fs::create_dir_all(&default_path) + .map_err(|error| format!("Unable to create the default log directory: {error}"))?; + + let (config, config_warning) = read_host_config(&config_path); + let configured_path = config + .custom_root + .as_deref() + .map(PathBuf::from) + .map(|root| derive_custom_log_path(&root)); + let (effective_path, fallback_reason) = match configured_path.as_ref() { + Some(path) => match probe_directory_with_timeout(path.clone()) { + Ok(()) => (path.clone(), None), + Err(reason) => (default_path.clone(), Some(reason)), + }, + None => (default_path.clone(), None), + }; + + let mut notes = StartupNotes { + config_warning, + cleanup_warnings: Vec::new(), + }; + for path in unique_paths([default_path.clone(), effective_path.clone()]) { + match cleanup_expired_logs_with_timeout(path.clone(), None) { + Ok(warnings) => notes.cleanup_warnings.extend(warnings), + Err(reason) => notes + .cleanup_warnings + .push(format!("directory={} reason={reason}", display_path(&path))), + } + } + + let session_id = create_session_id(); + let writer = ActiveWriter::open(effective_path.clone(), session_id.clone())?; + let active_file_path = writer.path().to_path_buf(); + let panic_path = panic_sidecar_path(&effective_path, &session_id); + let shared = Arc::new(SharedState { + app: Some(app.clone()), + queue: Mutex::new(QueueState::default()), + queue_ready: Condvar::new(), + writer: Mutex::new(writer), + runtime: RwLock::new(RuntimeState { + default_path, + configured_path, + effective_path, + fallback_reason: fallback_reason.clone(), + diagnostic_enabled: false, + active_file_path, + }), + panic_path: RwLock::new(panic_path), + writer_alive: AtomicBool::new(true), + sanitizer: LogSanitizer::new(), + }); + + let manager = Arc::new(Self { + shared: shared.clone(), + config_path, + session_id, + config_update: Mutex::new(()), + pending_previous_custom: Mutex::new(None), + degraded_reason: None, + }); + spawn_writer(shared, manager.session_id.clone())?; + manager.install_panic_hook(); + + let mut start_fields = BTreeMap::new(); + start_fields.insert("version".into(), app.package_info().version.to_string()); + start_fields.insert("platform".into(), "windows".into()); + manager.emit(LogLevel::Info, "session", "session started", start_fields); + if let Some(reason) = fallback_reason { + let snapshot = manager.snapshot(); + manager.emit( + LogLevel::Warn, + "log.writer", + "fallback_to_default", + BTreeMap::from([ + ("reason".into(), reason), + ( + "configured_dir".into(), + snapshot.configured_path.unwrap_or_default(), + ), + ("effective_dir".into(), snapshot.effective_path), + ]), + ); + } + if let Some(warning) = notes.config_warning { + manager.emit( + LogLevel::Warn, + "log.config", + "invalid log configuration; using defaults", + BTreeMap::from([("details".into(), warning)]), + ); + } + for warning in notes.cleanup_warnings { + manager.emit( + LogLevel::Warn, + "log.cleanup", + "cleanup skipped", + BTreeMap::from([("details".into(), warning)]), + ); + } + let previous_panics = + count_previous_panic_sidecars(&manager.effective_path(), &manager.session_id); + if previous_panics > 0 { + manager.emit( + LogLevel::Warn, + "log.writer", + "previous session panic logs found", + BTreeMap::from([( + "previous_session_panics".into(), + previous_panics.to_string(), + )]), + ); + } + Ok(manager) + } + + pub fn degraded(app: &AppHandle, reason: String) -> Arc { + let default_path = app + .path() + .app_log_dir() + .unwrap_or_else(|_| std::env::temp_dir().join("Lithe").join("logs")); + let config_path = app + .path() + .app_config_dir() + .unwrap_or_else(|_| std::env::temp_dir().join("Lithe")) + .join(LOG_CONFIG_FILE); + Self::degraded_with_paths(default_path, config_path, reason) + } + + fn degraded_with_paths( + default_path: PathBuf, + config_path: PathBuf, + reason: String, + ) -> Arc { + let session_id = create_session_id(); + let unavailable_path = default_path.join("lithe.unavailable.log"); + let shared = Arc::new(SharedState { + app: None, + queue: Mutex::new(QueueState { + shutdown: true, + ..QueueState::default() + }), + queue_ready: Condvar::new(), + writer: Mutex::new(ActiveWriter::disabled( + default_path.clone(), + session_id.clone(), + )), + runtime: RwLock::new(RuntimeState { + default_path: default_path.clone(), + configured_path: None, + effective_path: default_path.clone(), + fallback_reason: Some("logging_unavailable".into()), + diagnostic_enabled: false, + active_file_path: unavailable_path, + }), + panic_path: RwLock::new(PathBuf::new()), + writer_alive: AtomicBool::new(false), + sanitizer: LogSanitizer::new(), + }); + Arc::new(Self { + shared, + config_path, + session_id, + config_update: Mutex::new(()), + pending_previous_custom: Mutex::new(None), + degraded_reason: Some(reason), + }) + } + + pub fn snapshot(&self) -> LogSettingsSnapshot { + self.shared + .runtime + .read() + .map(|state| state.snapshot()) + .unwrap_or_else(|poisoned| poisoned.into_inner().snapshot()) + } + + fn effective_path(&self) -> PathBuf { + self.shared + .runtime + .read() + .map(|state| state.effective_path.clone()) + .unwrap_or_else(|poisoned| poisoned.into_inner().effective_path.clone()) + } + + fn emit( + &self, + level: LogLevel, + scope: impl Into, + message: impl Into, + fields: BTreeMap, + ) { + let diagnostic_enabled = self + .shared + .runtime + .read() + .map(|state| state.diagnostic_enabled) + .unwrap_or(false); + if level == LogLevel::Debug && !diagnostic_enabled { + return; + } + let event = PreparedEvent::new(level, scope, message, fields, &self.shared.sanitizer); + if let Some(reason) = &self.degraded_reason { + let reason = self.shared.sanitizer.sanitize_free_text(reason); + eprint!( + "[logging unavailable: {reason}] {}", + format_event_line(&event, &self.session_id) + ); + return; + } + enqueue_event(&self.shared, event); + } + + pub fn emit_json(&self, level: &str, scope: String, message: String, payload: Option) { + let fields = payload_fields(payload); + self.emit(LogLevel::parse(level), scope, message, fields); + } + + pub fn set_diagnostic_enabled(&self, enabled: bool) -> LogSettingsSnapshot { + if let Ok(mut state) = self.shared.runtime.write() { + state.diagnostic_enabled = enabled; + } + self.emit( + LogLevel::Info, + "log.settings", + if enabled { + "diagnostic logging enabled" + } else { + "diagnostic logging disabled" + }, + BTreeMap::new(), + ); + self.snapshot() + } + + pub fn set_custom_root( + &self, + custom_root: Option, + ) -> Result { + self.ensure_available()?; + let _update_guard = self + .config_update + .lock() + .map_err(|_| "Log configuration update is unavailable".to_string())?; + let target_path = custom_root + .as_ref() + .map(|root| derive_custom_log_path(root)) + .unwrap_or_else(|| { + self.shared + .runtime + .read() + .map(|state| state.default_path.clone()) + .unwrap_or_default() + }); + probe_directory_with_timeout(target_path.clone()) + .map_err(|reason| format!("Log directory is not writable: {reason}"))?; + + let previous_configured_path = self + .shared + .runtime + .read() + .map(|state| state.configured_path.clone()) + .unwrap_or_default(); + let current_effective_path = self.effective_path(); + if previous_configured_path.as_ref() == custom_root.as_ref().map(|_| &target_path) + && current_effective_path == target_path + { + return Ok(LogDirectoryChangeResult { + settings: self.snapshot(), + previous_custom_path: None, + previous_log_bytes: 0, + }); + } + + let prepared_writer = ActiveWriter::open(target_path.clone(), self.session_id.clone())?; + let previous_config = read_host_config(&self.config_path).0; + let next_config = HostLogConfig { + custom_root: custom_root.as_ref().map(|path| display_path(path)), + }; + if let Err(error) = write_host_config(&self.config_path, &next_config) { + cleanup_aborted_writer(prepared_writer, custom_root.as_deref()); + return Err(error); + } + + if let Err(error) = + self.switch_writer(prepared_writer, custom_root.as_ref().map(|_| target_path)) + { + let _ = write_host_config(&self.config_path, &previous_config); + return Err(error); + } + + let previous_log_bytes = previous_configured_path + .as_ref() + .map(|path| managed_log_stats(path).1) + .unwrap_or(0); + if let Ok(mut pending) = self.pending_previous_custom.lock() { + *pending = previous_configured_path.clone(); + } + Ok(LogDirectoryChangeResult { + settings: self.snapshot(), + previous_custom_path: previous_configured_path + .as_ref() + .map(|path| display_path(path)), + previous_log_bytes, + }) + } + + fn switch_writer( + &self, + writer: ActiveWriter, + configured_path: Option, + ) -> Result<(), String> { + let (reply_tx, reply_rx) = mpsc::channel(); + let ticket = ControlTicket::new(); + self.push_control(Control::Switch { + writer, + previous_path: self.effective_path(), + configured_path, + fallback_reason: None, + ticket: ticket.clone(), + reply: reply_tx, + })?; + wait_for_control(reply_rx, &ticket, "switching the log writer")? + } + + pub fn resolve_previous_custom_cleanup(&self, delete: bool) -> Result { + self.ensure_available()?; + let path = self + .pending_previous_custom + .lock() + .map_err(|_| "Previous log directory state is unavailable".to_string())? + .take(); + if !delete { + return Ok(ClearLogResult { + deleted_files: 0, + freed_bytes: 0, + }); + } + path.map(|path| delete_managed_logs(&path, None)) + .transpose()? + .ok_or_else(|| "There is no previous custom log directory to clean".to_string()) + } + + pub fn clear_current_logs(&self) -> Result { + self.ensure_available()?; + let (reply_tx, reply_rx) = mpsc::channel(); + let ticket = ControlTicket::new(); + self.push_control(Control::Clear { + ticket: ticket.clone(), + reply: reply_tx, + })?; + wait_for_control(reply_rx, &ticket, "clearing logs")? + } + + pub fn read_current_log(&self) -> Result { + self.ensure_available()?; + self.flush(); + let path = self + .shared + .runtime + .read() + .map_err(|_| "Log runtime state is unavailable".to_string())? + .active_file_path + .clone(); + let mut file = + File::open(&path).map_err(|error| format!("Unable to open the log file: {error}"))?; + let length = file + .metadata() + .map_err(|error| format!("Unable to inspect the log file: {error}"))? + .len(); + let truncated = length > MAX_LOG_READ_BYTES; + if truncated { + file.seek(SeekFrom::End(-(MAX_LOG_READ_BYTES as i64))) + .map_err(|error| format!("Unable to seek in the log file: {error}"))?; + } + let mut bytes = Vec::new(); + file.read_to_end(&mut bytes) + .map_err(|error| format!("Unable to read the log file: {error}"))?; + if truncated { + if let Some(newline) = bytes.iter().position(|byte| *byte == b'\n') { + bytes.drain(..=newline); + } + } + let body = String::from_utf8_lossy(&bytes); + let content = if truncated { + format!("{TRUNCATED_LOG_NOTICE}{body}") + } else { + body.into_owned() + }; + let target_line = content.lines().count().max(1); + Ok(LitheLogFileResponse { + path: display_path(&path), + content, + target_line, + truncated, + }) + } + + fn flush(&self) { + if self.degraded_reason.is_some() { + return; + } + let (reply_tx, reply_rx) = mpsc::channel(); + if self + .push_control(Control::Flush { reply: reply_tx }) + .is_ok() + { + let _ = reply_rx.recv_timeout(WRITER_CONTROL_TIMEOUT); + } + } + + pub fn shutdown(&self) { + self.emit( + LogLevel::Info, + "session", + "session ended", + BTreeMap::from([("reason".into(), "normal".into())]), + ); + let (reply_tx, reply_rx) = mpsc::channel(); + if self + .push_control(Control::Shutdown { reply: reply_tx }) + .is_ok() + { + let _ = reply_rx.recv_timeout(WRITER_CONTROL_TIMEOUT); + } + } + + fn ensure_available(&self) -> Result<(), String> { + self.degraded_reason + .as_ref() + .map(|reason| Err(format!("Application file logging is unavailable: {reason}"))) + .unwrap_or(Ok(())) + } + + fn push_control(&self, control: Control) -> Result<(), String> { + let mut queue = self + .shared + .queue + .lock() + .map_err(|_| "Log writer queue is unavailable".to_string())?; + if queue.shutdown { + return Err("Log writer has stopped".to_string()); + } + let pending_events = queue.events.len(); + queue.controls.push_back(QueuedControl { + control, + pending_events, + }); + self.shared.queue_ready.notify_one(); + Ok(()) + } + + fn install_panic_hook(self: &Arc) { + let weak = Arc::downgrade(self); + let previous = std::panic::take_hook(); + std::panic::set_hook(Box::new(move |info| { + if let Some(manager) = weak.upgrade() { + manager.write_panic(info); + } + previous(info); + })); + } + + fn write_panic(&self, info: &std::panic::PanicHookInfo<'_>) { + let Some(_guard) = PanicHookGuard::enter() else { + return; + }; + let message = info + .payload() + .downcast_ref::<&str>() + .copied() + .or_else(|| info.payload().downcast_ref::().map(String::as_str)) + .unwrap_or("Rust panic"); + let mut fields = BTreeMap::new(); + if let Some(location) = info.location() { + fields.insert( + "location".into(), + format!( + "{}:{}:{}", + location.file(), + location.line(), + location.column() + ), + ); + } + let backtrace = std::backtrace::Backtrace::force_capture() + .to_string() + .lines() + .filter(|line| !line.trim().is_empty()) + .take(8) + .collect::>() + .join("\n"); + if !backtrace.is_empty() { + fields.insert("backtrace".into(), backtrace); + } + self.write_panic_event_unchecked(message, fields); + } + + #[cfg(test)] + fn write_panic_event(&self, message: &str, fields: BTreeMap) { + let Some(_guard) = PanicHookGuard::enter() else { + return; + }; + self.write_panic_event_unchecked(message, fields); + } + + fn write_panic_event_unchecked(&self, message: &str, fields: BTreeMap) { + let event = PreparedEvent::new( + LogLevel::Error, + "runtime.rust.panic", + message, + fields, + &self.shared.sanitizer, + ); + let line = format_event_line(&event, &self.session_id); + let is_writer_thread = IS_LOG_WRITER_THREAD.with(|flag| flag.get()); + if !is_writer_thread && self.shared.writer_alive.load(Ordering::Acquire) { + if let Ok(mut writer) = self.shared.writer.try_lock() { + if writer.write_preformatted(&line, true).is_ok() { + return; + } + } + } + let panic_path = self + .shared + .panic_path + .read() + .map(|path| path.clone()) + .unwrap_or_default(); + if panic_path.as_os_str().is_empty() { + return; + } + if let Ok(mut file) = OpenOptions::new() + .create(true) + .append(true) + .open(panic_path) + { + let _ = file.write_all(line.as_bytes()); + let _ = file.flush(); + } + } +} + +fn spawn_writer(shared: Arc, session_id: String) -> Result<(), String> { + thread::Builder::new() + .name("lithe-log-writer".into()) + .spawn(move || writer_loop(shared, session_id)) + .map(|_| ()) + .map_err(|error| format!("Unable to start the application log writer: {error}")) +} + +fn writer_loop(shared: Arc, session_id: String) { + IS_LOG_WRITER_THREAD.with(|flag| flag.set(true)); + loop { + let work = { + let mut queue = match shared.queue.lock() { + Ok(queue) => queue, + Err(poisoned) => poisoned.into_inner(), + }; + if queue.controls.is_empty() && queue.events.is_empty() && !queue.shutdown { + let result = shared + .queue_ready + .wait_timeout(queue, WRITER_FLUSH_INTERVAL); + queue = match result { + Ok((queue, _)) => queue, + Err(poisoned) => poisoned.into_inner().0, + }; + } + take_writer_work(&mut queue) + }; + + match work { + WriterWork::Event(queued, dropped, write_failures) => { + if dropped.debug + dropped.info > 0 { + let event = PreparedEvent::new( + LogLevel::Warn, + "log.writer", + "log lines dropped", + BTreeMap::from([ + ("debug".into(), dropped.debug.to_string()), + ("info".into(), dropped.info.to_string()), + ]), + &shared.sanitizer, + ); + write_event(&shared, &event, &session_id, true); + } + if write_failures > 0 { + let event = PreparedEvent::new( + LogLevel::Warn, + "log.writer", + "write failures recovered", + BTreeMap::from([("write_failures".into(), write_failures.to_string())]), + &shared.sanitizer, + ); + write_event(&shared, &event, &session_id, true); + } + write_event( + &shared, + &queued.event, + &session_id, + queued.event.level >= LogLevel::Warn, + ); + if queued.repeated > 0 { + let event = PreparedEvent::new( + queued.event.level, + "log.writer", + "last message repeated", + BTreeMap::from([("count".into(), queued.repeated.to_string())]), + &shared.sanitizer, + ); + write_event( + &shared, + &event, + &session_id, + queued.event.level >= LogLevel::Warn, + ); + } + } + WriterWork::Control(control) => match control { + Control::Switch { + mut writer, + previous_path, + configured_path, + fallback_reason, + ticket, + reply, + } => { + if !ticket.begin() { + cleanup_aborted_writer(writer, None); + let _ = reply.send(Err("Log directory switch was cancelled".into())); + continue; + } + let result = (|| { + if let Ok(mut current) = shared.writer.lock() { + let switching = PreparedEvent::new( + LogLevel::Info, + "log.writer", + "switching log directory", + BTreeMap::from([( + "effective_dir".into(), + display_path(&writer.directory), + )]), + &shared.sanitizer, + ); + let _ = current.write_preformatted( + &format_event_line(&switching, &session_id), + true, + ); + std::mem::swap(&mut *current, &mut writer); + let switched = PreparedEvent::new( + LogLevel::Info, + "log.writer", + "log directory switched; session continues", + BTreeMap::from([( + "previous_directory".into(), + display_path(&previous_path), + )]), + &shared.sanitizer, + ); + let _ = current.write_preformatted( + &format_event_line(&switched, &session_id), + true, + ); + let mut runtime = shared + .runtime + .write() + .unwrap_or_else(|poisoned| poisoned.into_inner()); + runtime.configured_path = configured_path; + runtime.effective_path = current.directory.clone(); + runtime.active_file_path = current.path().to_path_buf(); + runtime.fallback_reason = fallback_reason; + if let Ok(mut panic_path) = shared.panic_path.write() { + *panic_path = panic_sidecar_path(¤t.directory, &session_id); + } + Ok(()) + } else { + Err("Log writer is unavailable".to_string()) + } + })(); + if result.is_err() { + cleanup_aborted_writer(writer, None); + } + ticket.complete(); + let _ = reply.send(result); + } + Control::Clear { ticket, reply } => { + if !ticket.begin() { + let _ = reply.send(Err("Log clearing was cancelled".into())); + continue; + } + let result = clear_active_writer(&shared, &session_id); + ticket.complete(); + let _ = reply.send(result); + } + Control::Flush { reply } => { + flush_or_fallback(&shared, &session_id); + let _ = reply.send(()); + } + Control::Shutdown { reply } => { + if let Ok(mut writer) = shared.writer.lock() { + let _ = writer.flush(); + } + shared.writer_alive.store(false, Ordering::Release); + if let Ok(mut queue) = shared.queue.lock() { + queue.shutdown = true; + } + let _ = reply.send(()); + break; + } + }, + WriterWork::Flush => { + flush_or_fallback(&shared, &session_id); + } + WriterWork::Stop => break, + } + } + shared.writer_alive.store(false, Ordering::Release); +} + +enum WriterWork { + Event(QueuedEvent, DroppedLines, u64), + Control(Control), + Flush, + Stop, +} + +fn take_writer_work(queue: &mut QueueState) -> WriterWork { + if queue + .controls + .front() + .is_some_and(|control| control.pending_events == 0) + { + if let Some(control) = queue.controls.pop_front() { + return WriterWork::Control(control.control); + } + } + if let Some(event) = queue.events.pop_front() { + for control in &mut queue.controls { + control.pending_events = control.pending_events.saturating_sub(1); + } + let dropped = std::mem::take(&mut queue.dropped); + let write_failures = std::mem::take(&mut queue.write_failures); + return WriterWork::Event(event, dropped, write_failures); + } + if queue.shutdown { + WriterWork::Stop + } else { + WriterWork::Flush + } +} + +fn enqueue_event(shared: &Arc, event: PreparedEvent) { + let mut direct = None; + { + let mut queue = match shared.queue.lock() { + Ok(queue) => queue, + Err(poisoned) => poisoned.into_inner(), + }; + if queue.shutdown { + return; + } + if let Some(last) = queue.events.back_mut() { + if last.event.key == event.key { + last.repeated = last.repeated.saturating_add(1); + return; + } + } + + let capacity = if event.level >= LogLevel::Warn { + LOG_QUEUE_CAPACITY + } else { + LOG_QUEUE_NORMAL_CAPACITY + }; + if queue.events.len() >= capacity { + match event.level { + LogLevel::Debug => { + queue.dropped.debug = queue.dropped.debug.saturating_add(1); + return; + } + LogLevel::Info => { + if !evict_oldest(&mut queue, LogLevel::Debug) + && !evict_oldest(&mut queue, LogLevel::Info) + { + queue.dropped.info = queue.dropped.info.saturating_add(1); + return; + } + } + LogLevel::Warn | LogLevel::Error => { + if !evict_oldest(&mut queue, LogLevel::Debug) + && !evict_oldest(&mut queue, LogLevel::Info) + { + direct = Some(event.clone()); + } + } + } + } + if direct.is_none() { + queue.events.push_back(QueuedEvent { event, repeated: 0 }); + shared.queue_ready.notify_one(); + } + } + if let Some(event) = direct { + let session_id = shared + .runtime + .read() + .map(|state| { + state + .active_file_path + .file_name() + .and_then(|name| name.to_str()) + .and_then(parse_log_file_name) + .map(|parsed| parsed.session_id) + .unwrap_or_else(|| "unknown".into()) + }) + .unwrap_or_else(|_| "unknown".into()); + let _ = write_event(shared, &event, &session_id, true); + } +} + +fn evict_oldest(queue: &mut QueueState, level: LogLevel) -> bool { + if let Some(index) = queue + .events + .iter() + .position(|entry| entry.event.level == level) + { + if let Some(removed) = queue.events.remove(index) { + match removed.event.level { + LogLevel::Debug => queue.dropped.debug = queue.dropped.debug.saturating_add(1), + LogLevel::Info => queue.dropped.info = queue.dropped.info.saturating_add(1), + _ => {} + } + } + true + } else { + false + } +} + +fn write_event( + shared: &Arc, + event: &PreparedEvent, + session_id: &str, + flush: bool, +) -> bool { + let line = format_event_line(event, session_id); + let result = shared.writer.lock().map_err(|_| ()).and_then(|mut writer| { + let previous_path = writer.path().to_path_buf(); + writer.write_preformatted(&line, flush).map_err(|_| ())?; + let next_path = writer.path().to_path_buf(); + if previous_path != next_path { + if let Ok(mut runtime) = shared.runtime.write() { + runtime.active_file_path = next_path; + } + } + Ok(()) + }); + if result.is_err() { + if fallback_runtime_to_default(shared, session_id, Some(&line)) { + return true; + } + if let Ok(mut queue) = shared.queue.lock() { + queue.write_failures = queue.write_failures.saturating_add(1); + } + false + } else { + true + } +} + +fn flush_or_fallback(shared: &Arc, session_id: &str) { + let failed = shared + .writer + .lock() + .map(|mut writer| writer.flush().is_err()) + .unwrap_or(true); + if failed { + let _ = fallback_runtime_to_default(shared, session_id, None); + } +} + +fn fallback_runtime_to_default( + shared: &Arc, + session_id: &str, + pending_line: Option<&str>, +) -> bool { + let (default_path, effective_path, configured_path) = match shared.runtime.read() { + Ok(runtime) if runtime.effective_path != runtime.default_path => ( + runtime.default_path.clone(), + runtime.effective_path.clone(), + runtime.configured_path.clone(), + ), + _ => return false, + }; + let mut fallback_writer = match ActiveWriter::open(default_path.clone(), session_id.to_string()) + { + Ok(writer) => writer, + Err(_) => return false, + }; + let fallback_event = PreparedEvent::new( + LogLevel::Warn, + "log.writer", + "fallback_to_default", + BTreeMap::from([ + ("reason".into(), "not_writable".into()), + ("configured_dir".into(), display_path(&effective_path)), + ("effective_dir".into(), display_path(&default_path)), + ]), + &shared.sanitizer, + ); + if fallback_writer + .write_preformatted(&format_event_line(&fallback_event, session_id), true) + .is_err() + { + return false; + } + if let Some(line) = pending_line { + if fallback_writer.write_preformatted(line, true).is_err() { + return false; + } + } + let active_file_path = fallback_writer.path().to_path_buf(); + if let Ok(mut writer) = shared.writer.lock() { + *writer = fallback_writer; + } else { + return false; + } + let snapshot = { + let mut runtime = match shared.runtime.write() { + Ok(runtime) => runtime, + Err(poisoned) => poisoned.into_inner(), + }; + runtime.configured_path = configured_path; + runtime.effective_path = default_path.clone(); + runtime.active_file_path = active_file_path; + runtime.fallback_reason = Some("not_writable".into()); + runtime.snapshot() + }; + if let Ok(mut panic_path) = shared.panic_path.write() { + *panic_path = panic_sidecar_path(&default_path, session_id); + } + if let Some(app) = &shared.app { + let _ = app.emit("lithe-log-runtime-fallback", snapshot); + } + true +} + +fn clear_active_writer( + shared: &Arc, + session_id: &str, +) -> Result { + let mut writer = shared + .writer + .lock() + .map_err(|_| "Log writer is unavailable".to_string())?; + writer.close()?; + let result = delete_managed_logs(&writer.directory, None)?; + *writer = ActiveWriter::open(writer.directory.clone(), session_id.to_string())?; + let event = PreparedEvent::new( + LogLevel::Info, + "log.cleared", + "logs cleared", + BTreeMap::from([ + ("deleted_files".into(), result.deleted_files.to_string()), + ("freed_bytes".into(), result.freed_bytes.to_string()), + ]), + &shared.sanitizer, + ); + writer.write_preformatted(&format_event_line(&event, session_id), true)?; + if let Ok(mut runtime) = shared.runtime.write() { + runtime.active_file_path = writer.path().to_path_buf(); + } + Ok(result) +} + +struct ActiveWriter { + directory: PathBuf, + session_id: String, + created_date: String, + segment: u16, + bytes_written: u64, + path: PathBuf, + file: Option>, +} + +impl ActiveWriter { + fn disabled(directory: PathBuf, session_id: String) -> Self { + Self { + path: directory.join("lithe.unavailable.log"), + directory, + session_id, + created_date: Local::now().format("%Y-%m-%d").to_string(), + segment: 0, + bytes_written: 0, + file: None, + } + } + + fn open(directory: PathBuf, session_id: String) -> Result { + fs::create_dir_all(&directory) + .map_err(|error| format!("Unable to create the log directory: {error}"))?; + let now = Local::now(); + let created_date = now.format("%Y-%m-%d").to_string(); + enforce_daily_limit(&directory, &created_date, None)?; + let segment = next_segment_number(&directory, &created_date, &session_id); + let path = regular_log_path(&directory, &session_id, segment, now); + let file = open_log_file(&path)?; + Ok(Self { + directory, + session_id, + created_date, + segment, + bytes_written: file.metadata().map(|metadata| metadata.len()).unwrap_or(0), + path, + file: Some(BufWriter::new(file)), + }) + } + + fn path(&self) -> &Path { + &self.path + } + + fn write_preformatted(&mut self, line: &str, flush: bool) -> Result<(), String> { + let today = Local::now().format("%Y-%m-%d").to_string(); + if self.created_date != today + || self.bytes_written.saturating_add(line.len() as u64) > MAX_LOG_FILE_BYTES + { + self.rotate()?; + } + let file = self + .file + .as_mut() + .ok_or_else(|| "Log file is closed".to_string())?; + file.write_all(line.as_bytes()) + .map_err(|error| format!("Unable to write the log file: {error}"))?; + self.bytes_written = self.bytes_written.saturating_add(line.len() as u64); + if flush { + file.flush() + .map_err(|error| format!("Unable to flush the log file: {error}"))?; + } + Ok(()) + } + + fn rotate(&mut self) -> Result<(), String> { + self.close()?; + let now = Local::now(); + let date = now.format("%Y-%m-%d").to_string(); + self.segment = if date == self.created_date { + self.segment.saturating_add(1) + } else { + 1 + }; + self.created_date = date; + enforce_daily_limit(&self.directory, &self.created_date, None)?; + self.path = regular_log_path(&self.directory, &self.session_id, self.segment, now); + self.file = Some(BufWriter::new(open_log_file(&self.path)?)); + self.bytes_written = 0; + Ok(()) + } + + fn close(&mut self) -> Result<(), String> { + if let Some(mut file) = self.file.take() { + file.flush() + .map_err(|error| format!("Unable to flush the log file: {error}"))?; + } + Ok(()) + } + + fn flush(&mut self) -> Result<(), String> { + if let Some(file) = self.file.as_mut() { + file.flush() + .map_err(|error| format!("Unable to flush the log file: {error}"))?; + } + Ok(()) + } +} + +fn open_log_file(path: &Path) -> Result { + OpenOptions::new() + .create(true) + .append(true) + .open(path) + .map_err(|error| format!("Unable to open the log file: {error}")) +} + +fn regular_log_path( + directory: &Path, + session_id: &str, + segment: u16, + now: DateTime, +) -> PathBuf { + let timestamp = now.format("%Y-%m-%dT%H-%M-%S%.3f%z"); + directory.join(format!("lithe.{timestamp}.{session_id}.{segment:03}.log")) +} + +fn panic_sidecar_path(directory: &Path, session_id: &str) -> PathBuf { + let timestamp = Local::now().format("%Y-%m-%dT%H-%M-%S%.3f%z"); + directory.join(format!("lithe.panic.{timestamp}.{session_id}.log")) +} + +#[derive(Clone, Debug)] +struct ParsedLogFile { + timestamp: DateTime, + session_id: String, + panic: bool, +} + +fn log_file_regex() -> &'static Regex { + static REGEX: std::sync::OnceLock = std::sync::OnceLock::new(); + REGEX.get_or_init(|| { + Regex::new( + r"^lithe\.(?:(panic)\.)?(\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}\.\d{3}[+-]\d{4})\.([A-Fa-f0-9]+)(?:\.(\d{3}))?\.log$", + ) + .expect("the managed log filename regex is valid") + }) +} + +fn parse_log_file_name(name: &str) -> Option { + let captures = log_file_regex().captures(name)?; + let timestamp = + DateTime::parse_from_str(captures.get(2)?.as_str(), "%Y-%m-%dT%H-%M-%S%.3f%z").ok()?; + Some(ParsedLogFile { + timestamp, + session_id: captures.get(3)?.as_str().to_string(), + panic: captures.get(1).is_some(), + }) +} + +fn cleanup_expired_logs_with_timeout( + directory: PathBuf, + active_path: Option, +) -> Result, String> { + run_with_timeout(DIRECTORY_OPERATION_TIMEOUT, move || { + cleanup_expired_logs(&directory, active_path.as_deref()) + })? +} + +fn cleanup_expired_logs( + directory: &Path, + active_path: Option<&Path>, +) -> Result, String> { + if !directory.exists() { + return Ok(Vec::new()); + } + let mut warnings = Vec::new(); + let now = Local::now().fixed_offset(); + let entries = fs::read_dir(directory) + .map_err(|error| format!("Unable to inspect the log directory: {error}"))?; + for entry in entries.flatten() { + let path = entry.path(); + if active_path == Some(path.as_path()) || !path.is_file() { + continue; + } + let Some(name) = path.file_name().and_then(|name| name.to_str()) else { + continue; + }; + if !name.starts_with("lithe.") || !name.ends_with(".log") { + continue; + } + let Some(parsed) = parse_log_file_name(name) else { + warnings.push(format!("skipped_unparseable file={name}")); + continue; + }; + let age = now.signed_duration_since(parsed.timestamp); + if age >= Duration::hours(LOG_RETENTION_HOURS) { + if let Err(error) = fs::remove_file(&path) { + warnings.push(format!("delete_failed file={name} error={error}")); + } + } + } + Ok(warnings) +} + +fn enforce_daily_limit( + directory: &Path, + date: &str, + active_path: Option<&Path>, +) -> Result<(), String> { + let mut files = managed_log_files(directory) + .into_iter() + .filter(|(path, parsed)| { + !parsed.panic + && parsed.timestamp.format("%Y-%m-%d").to_string() == date + && active_path != Some(path.as_path()) + }) + .collect::>(); + files.sort_by(|left, right| left.1.timestamp.cmp(&right.1.timestamp)); + while files.len() >= MAX_LOG_FILES_PER_DAY { + let (path, _) = files.remove(0); + fs::remove_file(path) + .map_err(|error| format!("Unable to enforce the daily log limit: {error}"))?; + } + Ok(()) +} + +fn managed_log_files(directory: &Path) -> Vec<(PathBuf, ParsedLogFile)> { + fs::read_dir(directory) + .into_iter() + .flatten() + .flatten() + .filter_map(|entry| { + let path = entry.path(); + let parsed = path + .file_name() + .and_then(|name| name.to_str()) + .and_then(parse_log_file_name)?; + Some((path, parsed)) + }) + .collect() +} + +fn managed_log_stats(directory: &Path) -> (usize, u64) { + managed_log_files(directory) + .into_iter() + .fold((0usize, 0u64), |(count, bytes), (path, _)| { + let size = path.metadata().map(|metadata| metadata.len()).unwrap_or(0); + (count + 1, bytes.saturating_add(size)) + }) +} + +fn delete_managed_logs( + directory: &Path, + active_path: Option<&Path>, +) -> Result { + let files = managed_log_files(directory); + let mut result = ClearLogResult { + deleted_files: 0, + freed_bytes: 0, + }; + for (path, _) in files { + if active_path == Some(path.as_path()) { + continue; + } + let size = path.metadata().map(|metadata| metadata.len()).unwrap_or(0); + fs::remove_file(&path) + .map_err(|error| format!("Unable to delete {}: {error}", display_path(&path)))?; + result.deleted_files += 1; + result.freed_bytes = result.freed_bytes.saturating_add(size); + } + Ok(result) +} + +fn count_previous_panic_sidecars(directory: &Path, current_session: &str) -> usize { + managed_log_files(directory) + .into_iter() + .filter(|(_, parsed)| parsed.panic && parsed.session_id != current_session) + .count() +} + +fn next_segment_number(directory: &Path, date: &str, session_id: &str) -> u16 { + managed_log_files(directory) + .into_iter() + .filter_map(|(path, parsed)| { + if parsed.panic + || parsed.session_id != session_id + || parsed.timestamp.format("%Y-%m-%d").to_string() != date + { + return None; + } + path.file_name() + .and_then(|name| name.to_str()) + .and_then(|name| log_file_regex().captures(name)) + .and_then(|captures| { + captures + .get(4) + .and_then(|value| value.as_str().parse().ok()) + }) + }) + .max() + .unwrap_or(0u16) + .saturating_add(1) +} + +fn derive_custom_log_path(root: &Path) -> PathBuf { + CUSTOM_LOG_SUBDIRECTORY + .iter() + .fold(root.to_path_buf(), |path, segment| path.join(segment)) +} + +fn cleanup_aborted_writer(mut writer: ActiveWriter, custom_root: Option<&Path>) { + let file_path = writer.path().to_path_buf(); + let directory = writer.directory.clone(); + let _ = writer.close(); + drop(writer); + let _ = fs::remove_file(file_path); + let _ = fs::remove_dir(&directory); + if let Some(root) = custom_root { + let _ = fs::remove_dir(root.join(CUSTOM_LOG_SUBDIRECTORY[0])); + } +} + +fn probe_directory_with_timeout(directory: PathBuf) -> Result<(), String> { + run_with_timeout(DIRECTORY_OPERATION_TIMEOUT, move || { + probe_directory(&directory) + })? +} + +fn run_with_timeout( + timeout: StdDuration, + task: impl FnOnce() -> T + Send + 'static, +) -> Result { + let (sender, receiver) = mpsc::channel(); + thread::spawn(move || { + let _ = sender.send(task()); + }); + receiver + .recv_timeout(timeout) + .map_err(|_| "timed_out".to_string()) +} + +fn probe_directory(directory: &Path) -> Result<(), String> { + fs::create_dir_all(directory).map_err(|error| classify_directory_error(&error))?; + let probe_name = format!( + ".lithe-log-probe-{}-{}", + std::process::id(), + PROBE_ID.fetch_add(1, Ordering::Relaxed) + ); + let probe_path = directory.join(probe_name); + File::create(&probe_path) + .and_then(|mut file| file.write_all(b"probe")) + .map_err(|error| classify_directory_error(&error))?; + fs::remove_file(probe_path).map_err(|error| classify_directory_error(&error)) +} + +static PROBE_ID: AtomicU64 = AtomicU64::new(1); + +fn classify_directory_error(error: &std::io::Error) -> String { + match error.kind() { + std::io::ErrorKind::PermissionDenied => "not_writable".into(), + std::io::ErrorKind::NotFound + | std::io::ErrorKind::NotConnected + | std::io::ErrorKind::TimedOut => "unavailable".into(), + _ => "not_writable".into(), + } +} + +fn read_host_config(path: &Path) -> (HostLogConfig, Option) { + let Ok(file) = File::open(path) else { + return (HostLogConfig::default(), None); + }; + match serde_json::from_reader(BufReader::new(file)) { + Ok(config) => (config, None), + Err(error) => (HostLogConfig::default(), Some(error.to_string())), + } +} + +fn write_host_config(path: &Path, config: &HostLogConfig) -> Result<(), String> { + let parent = path + .parent() + .ok_or_else(|| "Log configuration path has no parent directory".to_string())?; + fs::create_dir_all(parent) + .map_err(|error| format!("Unable to create the log configuration directory: {error}"))?; + let temporary = path.with_extension("json.tmp"); + let bytes = serde_json::to_vec_pretty(config) + .map_err(|error| format!("Unable to serialize the log configuration: {error}"))?; + fs::write(&temporary, bytes) + .map_err(|error| format!("Unable to write the log configuration: {error}"))?; + replace_file_atomically(&temporary, path) +} + +#[cfg(target_os = "windows")] +fn replace_file_atomically(source: &Path, destination: &Path) -> Result<(), String> { + use std::os::windows::ffi::OsStrExt; + use windows_sys::Win32::Storage::FileSystem::{ + MoveFileExW, MOVEFILE_REPLACE_EXISTING, MOVEFILE_WRITE_THROUGH, + }; + + let source = source + .as_os_str() + .encode_wide() + .chain(std::iter::once(0)) + .collect::>(); + let destination = destination + .as_os_str() + .encode_wide() + .chain(std::iter::once(0)) + .collect::>(); + // MoveFileExW provides the replace-existing primitive needed to avoid a + // missing-config window between deleting the old file and renaming the new one. + let moved = unsafe { + MoveFileExW( + source.as_ptr(), + destination.as_ptr(), + MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH, + ) + }; + if moved == 0 { + Err(format!( + "Unable to commit the log configuration: {}", + std::io::Error::last_os_error() + )) + } else { + Ok(()) + } +} + +#[cfg(not(target_os = "windows"))] +fn replace_file_atomically(source: &Path, destination: &Path) -> Result<(), String> { + fs::rename(source, destination) + .map_err(|error| format!("Unable to commit the log configuration: {error}")) +} + +fn unique_paths(paths: impl IntoIterator) -> Vec { + let mut result = Vec::new(); + for path in paths { + if !result.iter().any(|existing| existing == &path) { + result.push(path); + } + } + result +} + +fn payload_fields(payload: Option) -> BTreeMap { + let Some(Value::Object(payload)) = payload else { + return BTreeMap::new(); + }; + payload + .into_iter() + .map(|(key, value)| (snake_case_key(&key), compact_json(&value))) + .collect() +} + +fn compact_json(value: &Value) -> String { + match value { + Value::String(value) => value.clone(), + _ => serde_json::to_string(value).unwrap_or_else(|_| "[unserializable]".into()), + } +} + +fn format_event_line(event: &PreparedEvent, session_id: &str) -> String { + let mut line = format!( + "{} {:<5} [session={}] [scope={}] {}", + event.timestamp.format("%Y-%m-%dT%H:%M:%S%.3f%:z"), + event.level.label(), + session_id, + event.scope, + event.message + ); + for (key, value) in &event.fields { + line.push(' '); + line.push_str(key); + line.push('='); + line.push_str(&format_log_value(value)); + } + line = truncate_log_line(line); + line.push('\n'); + line +} + +fn format_log_value(value: &str) -> String { + if !value.is_empty() + && value + .chars() + .all(|character| character.is_ascii_alphanumeric() || "._/-:+<>".contains(character)) + { + return value.to_string(); + } + let escaped = value + .replace('\\', "\\\\") + .replace('"', "\\\"") + .replace('\n', "\\n") + .replace('\r', "\\r") + .replace('\t', "\\t"); + format!("\"{escaped}\"") +} + +fn truncate_log_line(mut line: String) -> String { + const MARKER: &str = " truncated=true"; + if line.len() <= MAX_LOG_LINE_BYTES { + return line; + } + let limit = MAX_LOG_LINE_BYTES.saturating_sub(MARKER.len()); + while line.len() > limit { + line.pop(); + } + line.push_str(MARKER); + line +} + +fn snake_case_key(value: &str) -> String { + let mut result = String::with_capacity(value.len()); + for (index, character) in value.chars().enumerate() { + if character.is_ascii_uppercase() { + if index > 0 && !result.ends_with('_') { + result.push('_'); + } + result.push(character.to_ascii_lowercase()); + } else if character.is_ascii_alphanumeric() || character == '_' { + result.push(character.to_ascii_lowercase()); + } else if !result.ends_with('_') { + result.push('_'); + } + } + result.trim_matches('_').to_string() +} + +fn is_sensitive_key(key: &str) -> bool { + [ + "token", + "authorization", + "password", + "secret", + "api_key", + "cookie", + ] + .iter() + .any(|sensitive| key.contains(sensitive)) +} + +struct LogSanitizer { + user_profile_patterns: Vec, +} + +impl LogSanitizer { + fn new() -> Self { + let user_profile_patterns = std::env::var("USERPROFILE") + .ok() + .filter(|value| !value.trim().is_empty()) + .into_iter() + .flat_map(|profile| [profile.clone(), profile.replace('\\', "/")]) + .filter_map(|profile| Regex::new(&format!("(?i){}", regex::escape(&profile))).ok()) + .collect(); + Self { + user_profile_patterns, + } + } + + fn sanitize_text(&self, value: &str) -> String { + let mut sanitized = value + .replace("\r\n", "\\n") + .replace('\n', "\\n") + .replace('\r', "\\r"); + for pattern in &self.user_profile_patterns { + sanitized = pattern + .replace_all(&sanitized, "") + .into_owned(); + } + sanitized = authorization_header_regex() + .replace_all(&sanitized, "$1=") + .into_owned(); + sanitized = sensitive_assignment_regex() + .replace_all(&sanitized, "$1=") + .into_owned(); + sanitized = sensitive_query_regex() + .replace_all(&sanitized, "$1=") + .into_owned(); + sanitized = credential_shape_regex() + .replace_all(&sanitized, "") + .into_owned(); + sanitized + } + + fn sanitize_free_text(&self, value: &str) -> String { + redact_absolute_paths(&self.sanitize_text(value)) + } + + fn sanitize_field(&self, key: &str, value: &str) -> String { + let sanitized = self.sanitize_text(value); + if allows_platform_absolute_path(key) { + sanitized + } else { + redact_absolute_paths(&sanitized) + } + } +} + +fn authorization_header_regex() -> &'static Regex { + static REGEX: std::sync::OnceLock = std::sync::OnceLock::new(); + REGEX.get_or_init(|| { + Regex::new(r"(?i)\b(authorization)\s*[:=]\s*(?:bearer|basic)\s+[^\s,;]+") + .expect("the authorization header regex is valid") + }) +} + +fn sensitive_assignment_regex() -> &'static Regex { + static REGEX: std::sync::OnceLock = std::sync::OnceLock::new(); + REGEX.get_or_init(|| { + Regex::new( + r"(?i)\b(token|authorization|password|secret|api[_-]?key|cookie)\s*[:=]\s*[^\s,;]+", + ) + .expect("the sensitive assignment regex is valid") + }) +} + +fn sensitive_query_regex() -> &'static Regex { + static REGEX: std::sync::OnceLock = std::sync::OnceLock::new(); + REGEX.get_or_init(|| { + Regex::new(r"(?i)([?&](?:token|key|api_key|access_token|auth))=[^&#\s]+") + .expect("the sensitive query regex is valid") + }) +} + +fn credential_shape_regex() -> &'static Regex { + static REGEX: std::sync::OnceLock = std::sync::OnceLock::new(); + REGEX.get_or_init(|| { + Regex::new( + r"(?i)\b(?:gh[pousr]_[A-Za-z0-9_]{8,}|github_pat_[A-Za-z0-9_]{8,}|sk-[A-Za-z0-9_-]{8,})\b", + ) + .expect("the credential shape regex is valid") + }) +} + +fn windows_absolute_path_regex() -> &'static Regex { + static REGEX: std::sync::OnceLock = std::sync::OnceLock::new(); + REGEX.get_or_init(|| { + Regex::new( + r#"(?i)(?:\"(?:[A-Z]:[\\/]|\\\\)[^\"]+\"|'(?:[A-Z]:[\\/]|\\\\)[^']+'|\b[A-Z]:[\\/][^\s\"'<>|,;]+|\\\\[^\s\"'<>|,;]+)"#, + ) + .expect("the Windows absolute path regex is valid") + }) +} + +fn redact_absolute_paths(value: &str) -> String { + windows_absolute_path_regex() + .replace_all(value, "") + .into_owned() +} + +fn allows_platform_absolute_path(key: &str) -> bool { + matches!( + key, + "directory" + | "configured_dir" + | "effective_dir" + | "default_path" + | "configured_path" + | "effective_path" + | "previous_directory" + ) +} + +fn create_session_id() -> String { + let timestamp = Local::now().timestamp_micros() as u64; + let mixed = timestamp + ^ ((std::process::id() as u64) << 24) + ^ SESSION_ID.fetch_add(1, Ordering::Relaxed); + format!("{:08x}", mixed as u32) +} + +static SESSION_ID: AtomicU64 = AtomicU64::new(1); + +fn display_path(path: &Path) -> String { + path.to_string_lossy().into_owned() +} + +#[tauri::command] +pub fn get_log_settings(manager: State<'_, Arc>) -> LogSettingsSnapshot { + manager.snapshot() +} + +#[tauri::command] +pub async fn set_log_directory( + parent_path: Option, + manager: State<'_, Arc>, +) -> Result { + let manager = manager.inner().clone(); + tauri::async_runtime::spawn_blocking(move || { + manager.set_custom_root( + parent_path + .filter(|path| !path.trim().is_empty()) + .map(PathBuf::from), + ) + }) + .await + .map_err(|error| format!("Log directory task failed: {error}"))? +} + +#[tauri::command] +pub fn set_diagnostic_logging( + enabled: bool, + manager: State<'_, Arc>, +) -> LogSettingsSnapshot { + manager.set_diagnostic_enabled(enabled) +} + +#[tauri::command] +pub async fn read_lithe_log( + manager: State<'_, Arc>, +) -> Result { + let manager = manager.inner().clone(); + tauri::async_runtime::spawn_blocking(move || manager.read_current_log()) + .await + .map_err(|error| format!("Read log task failed: {error}"))? +} + +#[tauri::command] +pub async fn clear_lithe_logs( + manager: State<'_, Arc>, +) -> Result { + let manager = manager.inner().clone(); + tauri::async_runtime::spawn_blocking(move || manager.clear_current_logs()) + .await + .map_err(|error| format!("Clear log task failed: {error}"))? +} + +#[tauri::command] +pub async fn resolve_previous_log_cleanup( + delete: bool, + manager: State<'_, Arc>, +) -> Result { + let manager = manager.inner().clone(); + tauri::async_runtime::spawn_blocking(move || manager.resolve_previous_custom_cleanup(delete)) + .await + .map_err(|error| format!("Previous log cleanup task failed: {error}"))? +} + +#[tauri::command] +pub fn open_log_directory( + app: AppHandle, + manager: State<'_, Arc>, +) -> Result<(), String> { + manager.ensure_available()?; + app.opener() + .open_path(display_path(&manager.effective_path()), None::<&str>) + .map_err(|error| format!("Unable to open the log directory: {error}")) +} + +#[tauri::command] +pub fn frontend_trace( + level: String, + scope: String, + message: String, + payload: Option, + manager: State<'_, Arc>, +) { + manager.emit_json(&level, scope, message, payload); +} + +#[tauri::command] +pub fn record_startup_milestone(milestone: String, manager: State<'_, Arc>) { + manager.emit(LogLevel::Info, "startup", milestone, BTreeMap::new()); +} + +#[cfg(test)] +mod tests { + use super::*; + + fn temporary_directory(name: &str) -> PathBuf { + let path = std::env::temp_dir().join(format!( + "lithe-log-tests-{name}-{}-{}", + std::process::id(), + SESSION_ID.fetch_add(1, Ordering::Relaxed) + )); + fs::create_dir_all(&path).unwrap(); + path + } + + fn test_manager(directory: &Path) -> Arc { + let session_id = "deadbeef".to_string(); + let writer = ActiveWriter::open(directory.to_path_buf(), session_id.clone()).unwrap(); + let active_file_path = writer.path().to_path_buf(); + let shared = Arc::new(SharedState { + app: None, + queue: Mutex::new(QueueState::default()), + queue_ready: Condvar::new(), + writer: Mutex::new(writer), + runtime: RwLock::new(RuntimeState { + default_path: directory.to_path_buf(), + configured_path: None, + effective_path: directory.to_path_buf(), + fallback_reason: None, + diagnostic_enabled: false, + active_file_path, + }), + panic_path: RwLock::new(panic_sidecar_path(directory, &session_id)), + writer_alive: AtomicBool::new(true), + sanitizer: LogSanitizer::new(), + }); + Arc::new(LogManager { + shared, + config_path: directory.join(LOG_CONFIG_FILE), + session_id, + config_update: Mutex::new(()), + pending_previous_custom: Mutex::new(None), + degraded_reason: None, + }) + } + + #[test] + fn formats_single_line_and_redacts_sensitive_values() { + let sanitizer = LogSanitizer::new(); + let event = PreparedEvent::new( + LogLevel::Info, + "runtime.test", + "line one\nline two token=secret-value", + BTreeMap::from([("apiKey".into(), "secret".into())]), + &sanitizer, + ); + let line = format_event_line(&event, "abcd1234"); + assert_eq!(line.lines().count(), 1); + assert!(line.contains("line one\\nline two")); + assert!(line.contains("api_key=")); + assert!(!line.contains("secret-value")); + } + + #[test] + fn redacts_authorization_headers_token_shapes_and_free_text_paths() { + let sanitizer = LogSanitizer::new(); + let event = PreparedEvent::new( + LogLevel::Error, + "runtime.console", + "Authorization: Bearer ghp_1234567890abcdef failed at D:\\work\\customer-x\\main.rs and \\\\server\\share\\secret.txt", + BTreeMap::from([ + ("reason".into(), "github_pat_1234567890abcdef".into()), + ("directory".into(), "E:/Lithe/logs".into()), + ]), + &sanitizer, + ); + let line = format_event_line(&event, "abcd1234"); + assert!(!line.contains("ghp_")); + assert!(!line.contains("github_pat_")); + assert!(!line.contains("customer-x")); + assert!(!line.contains("server")); + assert!(line.contains("")); + assert!(line.contains("directory=E:/Lithe/logs")); + } + + #[test] + fn cleanup_uses_filename_timestamp_and_keeps_unparseable_files() { + let directory = temporary_directory("cleanup"); + let old = directory.join("lithe.2020-01-01T00-00-00.000+0000.deadbeef.001.log"); + let unknown = directory.join("lithe.unknown.log"); + fs::write(&old, "old").unwrap(); + fs::write(&unknown, "unknown").unwrap(); + let warnings = cleanup_expired_logs(&directory, None).unwrap(); + assert!(!old.exists()); + assert!(unknown.exists()); + assert!(warnings + .iter() + .any(|warning| warning.contains("lithe.unknown.log"))); + fs::remove_dir_all(directory).unwrap(); + } + + #[test] + fn daily_limit_excludes_panic_sidecars() { + let directory = temporary_directory("daily-limit"); + for index in 0..MAX_LOG_FILES_PER_DAY { + let path = directory.join(format!( + "lithe.2026-08-18T00-00-0{index}.000+0000.deadbeef.{:03}.log", + index + 1 + )); + fs::write(path, "regular").unwrap(); + } + let panic = directory.join("lithe.panic.2026-08-18T00-00-09.000+0000.deadbeef.log"); + fs::write(&panic, "panic").unwrap(); + enforce_daily_limit(&directory, "2026-08-18", None).unwrap(); + assert_eq!( + managed_log_files(&directory) + .into_iter() + .filter(|(_, parsed)| !parsed.panic) + .count(), + MAX_LOG_FILES_PER_DAY - 1 + ); + assert!(panic.exists()); + fs::remove_dir_all(directory).unwrap(); + } + + #[test] + fn writer_rotates_at_ten_megabytes() { + let directory = temporary_directory("size-rotation"); + let mut writer = ActiveWriter::open(directory.clone(), "deadbeef".into()).unwrap(); + let original_path = writer.path().to_path_buf(); + writer.bytes_written = MAX_LOG_FILE_BYTES; + writer.write_preformatted("next line\n", true).unwrap(); + assert_ne!(writer.path(), original_path); + assert_eq!(writer.segment, 2); + drop(writer); + fs::remove_dir_all(directory).unwrap(); + } + + #[test] + fn writer_rotates_at_midnight_and_resets_the_segment() { + let directory = temporary_directory("midnight-rotation"); + let mut writer = ActiveWriter::open(directory.clone(), "deadbeef".into()).unwrap(); + writer.created_date = "2000-01-01".into(); + writer.segment = 9; + writer.write_preformatted("new day\n", true).unwrap(); + assert_eq!( + writer.created_date, + Local::now().format("%Y-%m-%d").to_string() + ); + assert_eq!(writer.segment, 1); + drop(writer); + fs::remove_dir_all(directory).unwrap(); + } + + #[test] + fn probe_creates_the_derived_custom_directory() { + let root = temporary_directory("probe"); + let target = derive_custom_log_path(&root); + probe_directory(&target).unwrap(); + assert!(target.is_dir()); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn bounded_directory_operation_reports_timeout() { + let result = run_with_timeout(StdDuration::from_millis(5), || { + thread::sleep(StdDuration::from_millis(50)); + "late" + }); + assert_eq!(result.unwrap_err(), "timed_out"); + } + + #[test] + fn degraded_manager_keeps_commands_safe_when_file_logging_cannot_initialize() { + let directory = temporary_directory("degraded-manager"); + let manager = LogManager::degraded_with_paths( + directory.clone(), + directory.join(LOG_CONFIG_FILE), + "test initialization failure".into(), + ); + assert_eq!( + manager.snapshot().fallback_reason.as_deref(), + Some("logging_unavailable") + ); + assert!(manager.read_current_log().is_err()); + assert!(manager.clear_current_logs().is_err()); + assert!(manager + .set_custom_root(Some(directory.join("custom"))) + .is_err()); + assert!(manager.set_diagnostic_enabled(true).diagnostic_enabled); + manager.emit_json("error", "runtime.console".into(), "still safe".into(), None); + drop(manager); + fs::remove_dir_all(directory).unwrap(); + } + + #[test] + fn control_commands_wait_for_events_already_in_the_queue() { + let sanitizer = LogSanitizer::new(); + let event = PreparedEvent::new( + LogLevel::Info, + "test", + "before flush", + BTreeMap::new(), + &sanitizer, + ); + let (reply, _) = mpsc::channel(); + let mut queue = QueueState::default(); + queue.events.push_back(QueuedEvent { event, repeated: 0 }); + queue.controls.push_back(QueuedControl { + control: Control::Flush { reply }, + pending_events: 1, + }); + + assert!(matches!( + take_writer_work(&mut queue), + WriterWork::Event(..) + )); + assert!(matches!( + take_writer_work(&mut queue), + WriterWork::Control(Control::Flush { .. }) + )); + } + + #[test] + fn normal_queue_pressure_evicts_debug_before_info() { + let directory = temporary_directory("queue-pressure"); + let manager = test_manager(&directory); + for index in 0..LOG_QUEUE_NORMAL_CAPACITY { + let event = PreparedEvent::new( + LogLevel::Debug, + "queue", + format!("debug {index}"), + BTreeMap::new(), + &manager.shared.sanitizer, + ); + enqueue_event(&manager.shared, event); + } + let info = PreparedEvent::new( + LogLevel::Info, + "queue", + "important info", + BTreeMap::new(), + &manager.shared.sanitizer, + ); + enqueue_event(&manager.shared, info); + let queue = manager.shared.queue.lock().unwrap(); + assert_eq!(queue.events.len(), LOG_QUEUE_NORMAL_CAPACITY); + assert_eq!(queue.dropped.debug, 1); + assert!(queue + .events + .iter() + .any(|entry| entry.event.message == "important info")); + drop(queue); + drop(manager); + fs::remove_dir_all(directory).unwrap(); + } + + #[test] + fn saturated_warning_queue_direct_writes_errors() { + let directory = temporary_directory("critical-direct-write"); + let manager = test_manager(&directory); + for index in 0..LOG_QUEUE_CAPACITY { + let event = PreparedEvent::new( + LogLevel::Warn, + "queue", + format!("warning {index}"), + BTreeMap::new(), + &manager.shared.sanitizer, + ); + enqueue_event(&manager.shared, event); + } + let critical = PreparedEvent::new( + LogLevel::Error, + "queue", + "critical direct write", + BTreeMap::new(), + &manager.shared.sanitizer, + ); + enqueue_event(&manager.shared, critical); + let active = manager + .shared + .runtime + .read() + .unwrap() + .active_file_path + .clone(); + assert!(fs::read_to_string(active) + .unwrap() + .contains("critical direct write")); + drop(manager); + fs::remove_dir_all(directory).unwrap(); + } + + #[test] + fn write_failure_is_reported_after_the_writer_recovers() { + let directory = temporary_directory("write-recovery"); + let manager = test_manager(&directory); + *manager.shared.writer.lock().unwrap() = + ActiveWriter::disabled(directory.clone(), manager.session_id.clone()); + let failed = PreparedEvent::new( + LogLevel::Info, + "test", + "will fail", + BTreeMap::new(), + &manager.shared.sanitizer, + ); + assert!(!write_event( + &manager.shared, + &failed, + &manager.session_id, + true + )); + + let recovered = ActiveWriter::open(directory.clone(), manager.session_id.clone()).unwrap(); + let recovered_path = recovered.path().to_path_buf(); + *manager.shared.writer.lock().unwrap() = recovered; + manager.shared.runtime.write().unwrap().active_file_path = recovered_path.clone(); + spawn_writer(manager.shared.clone(), manager.session_id.clone()).unwrap(); + manager.emit(LogLevel::Info, "test", "writer recovered", BTreeMap::new()); + manager.shutdown(); + assert!(fs::read_to_string(recovered_path) + .unwrap() + .contains("write failures recovered")); + drop(manager); + fs::remove_dir_all(directory).unwrap(); + } + + #[test] + fn runtime_write_failure_falls_back_to_default_and_retries_the_line() { + let root = temporary_directory("runtime-fallback"); + let custom = root.join("custom"); + let default = root.join("default"); + fs::create_dir_all(&custom).unwrap(); + fs::create_dir_all(&default).unwrap(); + let manager = test_manager(&custom); + { + let mut runtime = manager.shared.runtime.write().unwrap(); + runtime.default_path = default.clone(); + runtime.configured_path = Some(custom.clone()); + runtime.effective_path = custom.clone(); + } + *manager.shared.writer.lock().unwrap() = + ActiveWriter::disabled(custom, manager.session_id.clone()); + let event = PreparedEvent::new( + LogLevel::Warn, + "runtime.test", + "retry after fallback", + BTreeMap::new(), + &manager.shared.sanitizer, + ); + assert!(write_event( + &manager.shared, + &event, + &manager.session_id, + true + )); + let runtime = manager.shared.runtime.read().unwrap().clone(); + assert_eq!(runtime.effective_path, default); + assert!(runtime.configured_path.is_some()); + assert_eq!(runtime.fallback_reason.as_deref(), Some("not_writable")); + let content = fs::read_to_string(runtime.active_file_path).unwrap(); + assert!(content.contains("fallback_to_default")); + assert!(content.contains("retry after fallback")); + drop(manager); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn panic_falls_back_to_sidecar_while_the_main_writer_is_locked() { + let directory = temporary_directory("panic-sidecar"); + let manager = test_manager(&directory); + let writer_guard = manager.shared.writer.lock().unwrap(); + let worker = { + let manager = manager.clone(); + thread::spawn(move || manager.write_panic_event("locked writer panic", BTreeMap::new())) + }; + worker.join().unwrap(); + drop(writer_guard); + let sidecar = manager.shared.panic_path.read().unwrap().clone(); + let content = fs::read_to_string(sidecar).unwrap(); + assert!(content.contains("locked writer panic")); + drop(manager); + fs::remove_dir_all(directory).unwrap(); + } + + #[test] + fn panic_on_the_writer_thread_skips_the_main_lock() { + let directory = temporary_directory("writer-panic-sidecar"); + let manager = test_manager(&directory); + let worker = { + let manager = manager.clone(); + thread::spawn(move || { + IS_LOG_WRITER_THREAD.with(|flag| flag.set(true)); + manager.write_panic_event("writer thread panic", BTreeMap::new()); + }) + }; + worker.join().unwrap(); + let sidecar = manager.shared.panic_path.read().unwrap().clone(); + assert!(fs::read_to_string(sidecar) + .unwrap() + .contains("writer thread panic")); + drop(manager); + fs::remove_dir_all(directory).unwrap(); + } + + #[test] + fn concurrent_panics_finish_without_deadlocking() { + let directory = temporary_directory("concurrent-panic"); + let manager = test_manager(&directory); + let writer_guard = manager.shared.writer.lock().unwrap(); + let (finished_tx, finished_rx) = mpsc::channel(); + let workers = (0..2) + .map(|index| { + let manager = manager.clone(); + let finished_tx = finished_tx.clone(); + thread::spawn(move || { + manager + .write_panic_event(&format!("concurrent panic {index}"), BTreeMap::new()); + let _ = finished_tx.send(()); + }) + }) + .collect::>(); + for _ in 0..2 { + finished_rx + .recv_timeout(StdDuration::from_secs(1)) + .expect("panic logging must not deadlock"); + } + for worker in workers { + worker.join().unwrap(); + } + drop(writer_guard); + let sidecar = manager.shared.panic_path.read().unwrap().clone(); + let content = fs::read_to_string(sidecar).unwrap(); + assert!(content.contains("concurrent panic 0")); + assert!(content.contains("concurrent panic 1")); + drop(manager); + fs::remove_dir_all(directory).unwrap(); + } + + #[test] + fn panic_guard_resets_after_each_hook_invocation() { + let directory = temporary_directory("sequential-panics"); + let manager = test_manager(&directory); + manager.write_panic_event("first panic", BTreeMap::new()); + manager.write_panic_event("second panic", BTreeMap::new()); + let active = manager + .shared + .runtime + .read() + .unwrap() + .active_file_path + .clone(); + let content = fs::read_to_string(active).unwrap(); + assert!(content.contains("first panic")); + assert!(content.contains("second panic")); + drop(manager); + fs::remove_dir_all(directory).unwrap(); + } + + #[test] + fn directory_switch_updates_runtime_and_persists_only_the_parent() { + let directory = temporary_directory("directory-switch"); + let custom_root = directory.join("chosen-parent"); + let manager = test_manager(&directory); + let original_file = manager + .shared + .runtime + .read() + .unwrap() + .active_file_path + .clone(); + spawn_writer(manager.shared.clone(), manager.session_id.clone()).unwrap(); + + let result = manager.set_custom_root(Some(custom_root.clone())).unwrap(); + let expected = derive_custom_log_path(&custom_root); + assert_eq!( + result.settings.configured_path.as_deref(), + Some(display_path(&expected).as_str()) + ); + assert_eq!(result.settings.effective_path, display_path(&expected)); + assert_eq!( + read_host_config(&manager.config_path).0.custom_root, + Some(display_path(&custom_root)) + ); + let switched_file = manager + .shared + .runtime + .read() + .unwrap() + .active_file_path + .clone(); + assert!(fs::read_to_string(original_file) + .unwrap() + .contains("switching log directory")); + assert!(fs::read_to_string(switched_file) + .unwrap() + .contains("session continues")); + + manager.shutdown(); + drop(manager); + fs::remove_dir_all(directory).unwrap(); + } + + #[test] + fn persistence_failure_aborts_a_directory_switch() { + let directory = temporary_directory("directory-switch-failure"); + let manager = test_manager(&directory); + let original_effective = manager.snapshot().effective_path; + let blocked_parent = directory.join("blocked-parent"); + fs::write(&blocked_parent, "not a directory").unwrap(); + let manager = Arc::new(LogManager { + shared: manager.shared.clone(), + config_path: blocked_parent.join(LOG_CONFIG_FILE), + session_id: manager.session_id.clone(), + config_update: Mutex::new(()), + pending_previous_custom: Mutex::new(None), + degraded_reason: None, + }); + + let result = manager.set_custom_root(Some(directory.join("next-parent"))); + assert!(result.is_err()); + assert_eq!(manager.snapshot().effective_path, original_effective); + assert!(!directory.join("next-parent").join("Lithe").exists()); + drop(manager); + fs::remove_dir_all(directory).unwrap(); + } + + #[test] + fn timed_out_switch_is_cancelled_before_the_writer_can_execute_it() { + let directory = temporary_directory("cancelled-switch"); + let target = directory.join("target").join("Lithe").join("logs"); + let manager = test_manager(&directory); + let original = manager.snapshot().effective_path; + let writer = ActiveWriter::open(target.clone(), manager.session_id.clone()).unwrap(); + let ticket = ControlTicket::new(); + let (reply_tx, reply_rx) = mpsc::channel(); + manager + .push_control(Control::Switch { + writer, + previous_path: PathBuf::from(&original), + configured_path: Some(target), + fallback_reason: None, + ticket: ticket.clone(), + reply: reply_tx, + }) + .unwrap(); + let result = wait_for_control_timeout( + reply_rx, + &ticket, + "testing a directory switch", + StdDuration::from_millis(1), + ); + assert!(result.is_err()); + spawn_writer(manager.shared.clone(), manager.session_id.clone()).unwrap(); + thread::sleep(StdDuration::from_millis(25)); + assert_eq!(manager.snapshot().effective_path, original); + manager.shutdown(); + drop(manager); + fs::remove_dir_all(directory).unwrap(); + } + + #[test] + fn invalid_config_destination_does_not_replace_an_existing_config() { + let directory = temporary_directory("config-transaction"); + let config_path = directory.join(LOG_CONFIG_FILE); + let original = HostLogConfig { + custom_root: Some("D:/original".into()), + }; + write_host_config(&config_path, &original).unwrap(); + let blocked_parent = directory.join("blocked"); + fs::write(&blocked_parent, "not a directory").unwrap(); + let result = write_host_config( + &blocked_parent.join(LOG_CONFIG_FILE), + &HostLogConfig { + custom_root: Some("E:/next".into()), + }, + ); + assert!(result.is_err()); + assert_eq!( + read_host_config(&config_path).0.custom_root, + original.custom_root + ); + fs::remove_dir_all(directory).unwrap(); + } +} diff --git a/windows/tauri/src-tauri/src/main.rs b/windows/tauri/src-tauri/src/main.rs index f94a6e1d6..dd965047e 100644 --- a/windows/tauri/src-tauri/src/main.rs +++ b/windows/tauri/src-tauri/src/main.rs @@ -3,6 +3,7 @@ mod core; mod file_events; mod host; +mod logging; mod lsp; mod platform; mod run; @@ -18,7 +19,7 @@ use tauri::Manager; use tauri_plugin_window_state::StateFlags; fn main() { - tauri::Builder::default() + let application = tauri::Builder::default() .plugin(tauri_plugin_single_instance::init(|app, arguments, _| { host::enqueue_cli_arguments(app, arguments); })) @@ -39,6 +40,17 @@ fn main() { .plugin(tauri_plugin_deep_link::init()) .plugin(tauri_plugin_updater::Builder::new().build()) .setup(|app| { + match logging::LogManager::initialize(app.handle()) { + Ok(log_manager) => { + app.manage(log_manager); + } + Err(error) => { + // Logging is diagnostic infrastructure; an unavailable log + // directory or writer must never prevent the product from starting. + eprintln!("[logging] application file logging is unavailable: {error}"); + app.manage(logging::LogManager::degraded(app.handle(), error)); + } + } app.manage(Arc::new(FileWatcher::new(Arc::new( TauriFileChangeEmitter::new(app.handle().clone()), )))); @@ -73,8 +85,15 @@ fn main() { secure_storage::store_secure_secret, secure_storage::get_secure_secret, secure_storage::remove_secure_secret, - host::frontend_trace, - host::record_startup_milestone, + logging::get_log_settings, + logging::set_log_directory, + logging::set_diagnostic_logging, + logging::read_lithe_log, + logging::clear_lithe_logs, + logging::resolve_previous_log_cleanup, + logging::open_log_directory, + logging::frontend_trace, + logging::record_startup_milestone, host::get_system_theme, host::set_native_window_appearance, host::get_system_fonts, @@ -104,8 +123,16 @@ fn main() { run::run_start_process, run::run_stop_process, ]) - .run(tauri::generate_context!()) - .expect("error while running Lithe desktop shell"); + .build(tauri::generate_context!()) + .expect("error while building Lithe desktop shell"); + + application.run(|app, event| { + if matches!(event, tauri::RunEvent::Exit) { + if let Some(manager) = app.try_state::>() { + manager.shutdown(); + } + } + }); } fn window_state_flags() -> StateFlags { diff --git a/windows/tauri/src/features/command-palette/constants/settings-actions.tsx b/windows/tauri/src/features/command-palette/constants/settings-actions.tsx index de4eb3ab9..ff5b71faa 100644 --- a/windows/tauri/src/features/command-palette/constants/settings-actions.tsx +++ b/windows/tauri/src/features/command-palette/constants/settings-actions.tsx @@ -70,6 +70,7 @@ const settingsTabLabels: Record = { ai: "AI", keyboard: "Keybindings", language: "Editor", + logs: "Logs", collaboration: "Collaboration", enterprise: "Enterprise", advanced: "Advanced", diff --git a/windows/tauri/src/features/logging/fps-monitor.test.ts b/windows/tauri/src/features/logging/fps-monitor.test.ts new file mode 100644 index 000000000..006ffb4a4 --- /dev/null +++ b/windows/tauri/src/features/logging/fps-monitor.test.ts @@ -0,0 +1,62 @@ +import { describe, expect, test } from "bun:test"; +import { + FPS_ANOMALY_ENTER_DURATION_MS, + FpsAnomalyDetector, +} from "./fps-monitor"; + +describe("FPS anomaly detector", () => { + test("requires three seconds below the entry threshold and summarizes recovery", () => { + const detector = new FpsAnomalyDetector(); + let now = 0; + + for (let index = 0; index < FPS_ANOMALY_ENTER_DURATION_MS / 1_000; index += 1) { + now += 1_000; + expect(detector.addBucket(40, 1_000, now, false)).toEqual([]); + } + + now += 1_000; + const recovered = detector.addBucket(55, 1_000, now, false); + expect(recovered).toHaveLength(1); + expect(recovered[0]?.message).toBe("Frame drop recovered"); + expect(recovered[0]?.payload.fps_min).toBe(40); + expect(recovered[0]?.payload.duration_ms).toBe(4_000); + }); + + test("emits progress while an anomaly remains active", () => { + const detector = new FpsAnomalyDetector(); + let now = 0; + const events = []; + + for (let index = 0; index < 13; index += 1) { + now += 1_000; + events.push(...detector.addBucket(30, 1_000, now, false)); + } + + expect(events.some((event) => event.message === "Frame drop ongoing")).toBe(true); + }); + + test("diagnostic mode emits a ten second heartbeat", () => { + const detector = new FpsAnomalyDetector(); + let now = 0; + const events = []; + + for (let index = 0; index < 10; index += 1) { + now += 1_000; + events.push(...detector.addBucket(60, 1_000, now, true)); + } + + const heartbeat = events.find((event) => event.scope === "perf.heartbeat"); + expect(heartbeat?.level).toBe("debug"); + expect(heartbeat?.payload.fps_avg).toBe(60); + }); + + test("visibility pause resets the entry window", () => { + const detector = new FpsAnomalyDetector(); + detector.addBucket(30, 1_000, 1_000, false); + detector.addBucket(30, 1_000, 2_000, false); + detector.pause(); + + expect(detector.addBucket(30, 1_000, 3_000, false)).toEqual([]); + expect(detector.addBucket(55, 1_000, 4_000, false)).toEqual([]); + }); +}); diff --git a/windows/tauri/src/features/logging/fps-monitor.ts b/windows/tauri/src/features/logging/fps-monitor.ts new file mode 100644 index 000000000..0f7d02397 --- /dev/null +++ b/windows/tauri/src/features/logging/fps-monitor.ts @@ -0,0 +1,176 @@ +export const FPS_ANOMALY_ENTER_THRESHOLD = 45; +export const FPS_ANOMALY_EXIT_THRESHOLD = 50; +export const FPS_ANOMALY_ENTER_DURATION_MS = 3_000; +export const FPS_PROGRESS_INTERVAL_MS = 10_000; +export const FPS_DIAGNOSTIC_HEARTBEAT_MS = 10_000; + +export interface FpsLogEvent { + level: "debug" | "warn"; + scope: "perf.fps" | "perf.heartbeat"; + message: string; + payload: Record; +} + +interface FpsWindow { + frames: number; + elapsedMs: number; + minFps: number; +} + +function emptyWindow(): FpsWindow { + return { frames: 0, elapsedMs: 0, minFps: Number.POSITIVE_INFINITY }; +} + +function averageFps(window: FpsWindow) { + return window.elapsedMs > 0 ? (window.frames * 1_000) / window.elapsedMs : 0; +} + +function rounded(value: number) { + return Math.round(value * 10) / 10; +} + +export class FpsAnomalyDetector { + private candidate = emptyWindow(); + private anomaly: FpsWindow | null = null; + private anomalyStartedAt = 0; + private lastProgressAt = 0; + private heartbeat = emptyWindow(); + private heartbeatStartedAt: number | null = null; + + addBucket( + frames: number, + elapsedMs: number, + now: number, + diagnosticEnabled: boolean, + ): FpsLogEvent[] { + const events: FpsLogEvent[] = []; + const fps = elapsedMs > 0 ? (frames * 1_000) / elapsedMs : 0; + + if (diagnosticEnabled) { + if (this.heartbeatStartedAt === null) this.heartbeatStartedAt = now - elapsedMs; + this.addToWindow(this.heartbeat, frames, elapsedMs, fps); + if (now - this.heartbeatStartedAt >= FPS_DIAGNOSTIC_HEARTBEAT_MS) { + events.push({ + level: "debug", + scope: "perf.heartbeat", + message: "FPS diagnostic heartbeat", + payload: { + fps_avg: rounded(averageFps(this.heartbeat)), + fps_min: rounded(this.heartbeat.minFps), + duration_ms: Math.round(this.heartbeat.elapsedMs), + }, + }); + this.heartbeat = emptyWindow(); + this.heartbeatStartedAt = now; + } + } else { + this.heartbeat = emptyWindow(); + this.heartbeatStartedAt = null; + } + + if (this.anomaly) { + this.addToWindow(this.anomaly, frames, elapsedMs, fps); + if (fps >= FPS_ANOMALY_EXIT_THRESHOLD) { + events.push(this.anomalyEvent("Frame drop recovered", now)); + this.resetAnomaly(); + } else if (now - this.lastProgressAt >= FPS_PROGRESS_INTERVAL_MS) { + events.push(this.anomalyEvent("Frame drop ongoing", now)); + this.lastProgressAt = now; + } + return events; + } + + if (fps < FPS_ANOMALY_ENTER_THRESHOLD) { + if (this.candidate.elapsedMs === 0) this.anomalyStartedAt = now - elapsedMs; + this.addToWindow(this.candidate, frames, elapsedMs, fps); + if (this.candidate.elapsedMs >= FPS_ANOMALY_ENTER_DURATION_MS) { + this.anomaly = this.candidate; + this.candidate = emptyWindow(); + this.lastProgressAt = now; + } + } else { + this.candidate = emptyWindow(); + this.anomalyStartedAt = 0; + } + return events; + } + + pause() { + this.candidate = emptyWindow(); + this.heartbeat = emptyWindow(); + this.heartbeatStartedAt = null; + if (!this.anomaly) this.anomalyStartedAt = 0; + } + + private addToWindow(window: FpsWindow, frames: number, elapsedMs: number, fps: number) { + window.frames += frames; + window.elapsedMs += elapsedMs; + window.minFps = Math.min(window.minFps, fps); + } + + private anomalyEvent(message: string, now: number): FpsLogEvent { + const anomaly = this.anomaly ?? this.candidate; + return { + level: "warn", + scope: "perf.fps", + message, + payload: { + fps_avg: rounded(averageFps(anomaly)), + fps_min: rounded(anomaly.minFps), + duration_ms: Math.max(Math.round(anomaly.elapsedMs), Math.round(now - this.anomalyStartedAt)), + }, + }; + } + + private resetAnomaly() { + this.candidate = emptyWindow(); + this.anomaly = null; + this.anomalyStartedAt = 0; + this.lastProgressAt = 0; + } +} + +export function startFpsLogging( + emit: (event: FpsLogEvent) => void, + isDiagnosticEnabled: () => boolean, +) { + if (typeof window === "undefined" || typeof document === "undefined") return () => {}; + + const detector = new FpsAnomalyDetector(); + let frameId = 0; + let bucketStartedAt = performance.now(); + let frames = 0; + + const resetForVisibility = () => { + detector.pause(); + bucketStartedAt = performance.now(); + frames = 0; + }; + document.addEventListener("visibilitychange", resetForVisibility); + + const record = (now: number) => { + if (document.visibilityState !== "visible") { + detector.pause(); + bucketStartedAt = now; + frames = 0; + frameId = window.requestAnimationFrame(record); + return; + } + + frames += 1; + const elapsedMs = now - bucketStartedAt; + if (elapsedMs >= 1_000) { + const events = detector.addBucket(frames, elapsedMs, now, isDiagnosticEnabled()); + for (const event of events) emit(event); + bucketStartedAt = now; + frames = 0; + } + frameId = window.requestAnimationFrame(record); + }; + + frameId = window.requestAnimationFrame(record); + return () => { + window.cancelAnimationFrame(frameId); + document.removeEventListener("visibilitychange", resetForVisibility); + }; +} diff --git a/windows/tauri/src/features/logging/frontend-log-runtime.test.ts b/windows/tauri/src/features/logging/frontend-log-runtime.test.ts new file mode 100644 index 000000000..ea0de15a8 --- /dev/null +++ b/windows/tauri/src/features/logging/frontend-log-runtime.test.ts @@ -0,0 +1,45 @@ +import { describe, expect, test } from "bun:test"; +import { + sanitizeFrontendLogPayload, + serializeConsoleArguments, + setFrontendLogWorkspaceRoots, +} from "./frontend-log-runtime"; + +describe("frontend log serialization", () => { + test("never throws for circular objects", () => { + const value: Record = { message: "failure" }; + value.self = value; + expect(() => serializeConsoleArguments([value])).not.toThrow(); + expect(serializeConsoleArguments([value])).toContain("[circular]"); + }); + + test("summarizes errors and limits stack frames", () => { + const error = new Error("broken"); + error.stack = ["Error: broken", ...Array.from({ length: 20 }, (_, index) => `at frame${index}`)].join("\n"); + const serialized = serializeConsoleArguments([error]); + expect(serialized).toContain("Error: broken"); + expect(serialized).toContain("frame7"); + expect(serialized).not.toContain("frame12"); + }); + + test("truncates oversized payloads", () => { + const serialized = serializeConsoleArguments(["x".repeat(5_000)]); + expect(serialized.length).toBeLessThanOrEqual(3_000); + expect(serialized).toContain("[truncated]"); + }); + + test("relativizes registered workspace paths and shortens outside paths", () => { + setFrontendLogWorkspaceRoots(["D:/work/project"]); + expect( + sanitizeFrontendLogPayload({ + filePath: "D:\\work\\project\\src\\main.ts", + workspaceFolders: ["D:\\work\\project", "C:\\outside\\two"], + root: "C:\\Users\\person\\outside.txt", + }), + ).toEqual({ + filePath: "/src/main.ts", + workspaceFolders: ["", "two"], + root: "outside.txt", + }); + }); +}); diff --git a/windows/tauri/src/features/logging/frontend-log-runtime.ts b/windows/tauri/src/features/logging/frontend-log-runtime.ts new file mode 100644 index 000000000..b69c5d32d --- /dev/null +++ b/windows/tauri/src/features/logging/frontend-log-runtime.ts @@ -0,0 +1,292 @@ +import { invoke } from "@/platform/tauri-core"; +import { listen } from "@tauri-apps/api/event"; +import { getLogSettings, type LogSettingsSnapshot } from "./log-api"; +import { startFpsLogging, type FpsLogEvent } from "./fps-monitor"; + +export type FrontendLogLevel = "debug" | "info" | "warn" | "error"; + +interface FrontendLogInput { + level: FrontendLogLevel; + scope: string; + message: string; + payload?: Record | null; +} + +const FORWARD_FAILURE_THRESHOLD = 3; +const FORWARD_BREAKER_COOLDOWN_MS = 5_000; +const SERIALIZED_ARGUMENT_LIMIT = 1_024; +const SERIALIZED_TOTAL_LIMIT = 3_000; +const SERIALIZED_MAX_DEPTH = 3; +const ERROR_STACK_FRAMES = 8; + +let installed = false; +let diagnosticEnabled = false; +let serializing = false; +let consecutiveFailures = 0; +let suppressedFailures = 0; +let breakerOpenUntil = 0; +let halfOpenProbeInFlight = false; +let stopFpsLogging: (() => void) | null = null; +let initializationPromise: Promise | null = null; +let workspaceRoots: string[] = []; + +const PATH_FIELD_NAMES = new Set([ + "path", + "file_path", + "root_folder_path", + "root", + "tab_path", + "workspace", + "workspace_folders", + "workspace_root", + "working_directory", + "repository", + "repo_path", +]); + +const originalConsole = { + warn: console.warn.bind(console), + error: console.error.bind(console), +}; + +function snakeCaseKey(value: string) { + return value + .replace(/([a-z0-9])([A-Z])/g, "$1_$2") + .replace(/[^a-zA-Z0-9]+/g, "_") + .replace(/^_+|_+$/g, "") + .toLowerCase(); +} + +function normalizePath(value: string) { + return value.replace(/\\/g, "/").replace(/\/+$/, ""); +} + +function sanitizeStructuredPath(value: string) { + const normalized = normalizePath(value); + const normalizedLower = normalized.toLowerCase(); + const root = workspaceRoots.find((candidate) => { + const rootLower = candidate.toLowerCase(); + return normalizedLower === rootLower || normalizedLower.startsWith(`${rootLower}/`); + }); + if (root) { + const relative = normalized.slice(root.length).replace(/^\/+/, ""); + return relative ? `/${relative}` : ""; + } + return normalized.split("/").filter(Boolean).pop() ?? ""; +} + +export function setFrontendLogWorkspaceRoots(roots: string[]) { + workspaceRoots = [...new Set(roots.map(normalizePath).filter(Boolean))].sort( + (left, right) => right.length - left.length, + ); +} + +export function sanitizeFrontendLogPayload(payload?: Record) { + if (!payload) return null; + return Object.fromEntries( + Object.entries(payload).map(([key, value]) => { + if (PATH_FIELD_NAMES.has(snakeCaseKey(key))) { + if (typeof value === "string") return [key, sanitizeStructuredPath(value)]; + if (Array.isArray(value)) { + return [ + key, + value.map((entry) => + typeof entry === "string" ? sanitizeStructuredPath(entry) : entry, + ), + ]; + } + } + return [key, value]; + }), + ); +} + +function truncate(value: string, limit: number) { + if (value.length <= limit) return value; + return `${value.slice(0, Math.max(0, limit - 18))}…[truncated]`; +} + +function serializeUnknown( + value: unknown, + depth: number, + seen: WeakSet, +): string { + try { + if (value instanceof Error) { + const stack = value.stack + ?.split(/\r?\n/) + .slice(0, ERROR_STACK_FRAMES + 1) + .join("\\n"); + return truncate(`${value.name}: ${value.message}${stack ? ` ${stack}` : ""}`, SERIALIZED_ARGUMENT_LIMIT); + } + if (typeof value === "string") return truncate(value, SERIALIZED_ARGUMENT_LIMIT); + if (value === null || value === undefined || typeof value === "number" || typeof value === "boolean") { + return String(value); + } + if (typeof value === "bigint") return `${value}n`; + if (typeof value === "symbol" || typeof value === "function") return String(value); + if (depth >= SERIALIZED_MAX_DEPTH) return "[max-depth]"; + if (typeof value === "object") { + if (seen.has(value)) return "[circular]"; + seen.add(value); + if (typeof Element !== "undefined" && value instanceof Element) { + return `<${value.tagName.toLowerCase()}>`; + } + if (Array.isArray(value)) { + return `[${value.map((entry) => serializeUnknown(entry, depth + 1, seen)).join(",")}]`; + } + const entries = Object.entries(value as Record) + .slice(0, 20) + .map(([key, entry]) => `${key}:${serializeUnknown(entry, depth + 1, seen)}`); + return `{${entries.join(",")}}`; + } + } catch { + return "[unserializable]"; + } + return "[unserializable]"; +} + +export function serializeConsoleArguments(values: unknown[]) { + try { + const seen = new WeakSet(); + return truncate( + values.map((value) => serializeUnknown(value, 0, seen)).join(" "), + SERIALIZED_TOTAL_LIMIT, + ); + } catch { + return "[unserializable]"; + } +} + +function rawInvoke(input: FrontendLogInput) { + return invoke("frontend_trace", { + level: input.level, + scope: input.scope, + message: input.message, + payload: input.payload ?? null, + }); +} + +export function submitFrontendLog(input: FrontendLogInput): Promise { + if (input.level === "debug" && !diagnosticEnabled) return Promise.resolve(false); + + const now = Date.now(); + const breakerIsOpen = breakerOpenUntil > now; + if (breakerIsOpen) { + suppressedFailures += 1; + return Promise.resolve(false); + } + const isHalfOpenProbe = breakerOpenUntil > 0; + if (isHalfOpenProbe && halfOpenProbeInFlight) return Promise.resolve(false); + if (isHalfOpenProbe) halfOpenProbeInFlight = true; + + return rawInvoke(input) + .then(() => { + const recoveredFailures = consecutiveFailures + suppressedFailures; + consecutiveFailures = 0; + suppressedFailures = 0; + breakerOpenUntil = 0; + halfOpenProbeInFlight = false; + if (recoveredFailures > 0) { + void rawInvoke({ + level: "warn", + scope: "runtime.console", + message: "frontend log forwarding recovered", + payload: { failures: recoveredFailures }, + }).catch(() => {}); + } + return true; + }) + .catch(() => { + halfOpenProbeInFlight = false; + consecutiveFailures += 1; + if (consecutiveFailures >= FORWARD_FAILURE_THRESHOLD) { + breakerOpenUntil = Date.now() + FORWARD_BREAKER_COOLDOWN_MS; + } + return false; + }); +} + +function forwardConsole(level: "warn" | "error", args: unknown[]) { + if (serializing) return; + serializing = true; + try { + const message = serializeConsoleArguments(args); + void submitFrontendLog({ level, scope: "runtime.console", message }); + } finally { + serializing = false; + } +} + +function installConsoleProxy() { + console.warn = (...args: unknown[]) => { + originalConsole.warn(...args); + forwardConsole("warn", args); + }; + console.error = (...args: unknown[]) => { + originalConsole.error(...args); + forwardConsole("error", args); + }; +} + +function installUnhandledErrorCapture() { + window.addEventListener("error", (event) => { + void submitFrontendLog({ + level: "error", + scope: "runtime.js", + message: event.message || "Unhandled JavaScript error", + payload: { + filename: event.filename?.split(/[\\/]/).pop() ?? null, + line: event.lineno || null, + column: event.colno || null, + stack: event.error instanceof Error ? serializeConsoleArguments([event.error]) : null, + }, + }); + }); + window.addEventListener("unhandledrejection", (event) => { + void submitFrontendLog({ + level: "error", + scope: "runtime.js.rejection", + message: "Unhandled promise rejection", + payload: { reason: serializeConsoleArguments([event.reason]) }, + }); + }); +} + +function forwardFpsEvent(event: FpsLogEvent) { + void submitFrontendLog(event); +} + +export function setFrontendDiagnosticEnabled(enabled: boolean) { + diagnosticEnabled = enabled; +} + +export function isFrontendDiagnosticEnabled() { + return diagnosticEnabled; +} + +export function initializeFrontendLogging() { + if (installed) return initializationPromise ?? Promise.resolve(null); + installed = true; + installConsoleProxy(); + installUnhandledErrorCapture(); + stopFpsLogging = startFpsLogging(forwardFpsEvent, isFrontendDiagnosticEnabled); + void listen("lithe-log-runtime-fallback", (event) => { + diagnosticEnabled = event.payload.diagnostic_enabled; + window.dispatchEvent( + new CustomEvent("lithe-log-runtime-fallback", { detail: event.payload }), + ); + }).catch(() => {}); + initializationPromise = getLogSettings() + .then((snapshot) => { + diagnosticEnabled = snapshot.diagnostic_enabled; + return snapshot; + }) + .catch(() => null); + return initializationPromise; +} + +export function disposeFrontendLoggingForTests() { + stopFpsLogging?.(); + stopFpsLogging = null; +} diff --git a/windows/tauri/src/features/logging/log-api.ts b/windows/tauri/src/features/logging/log-api.ts new file mode 100644 index 000000000..b161660ac --- /dev/null +++ b/windows/tauri/src/features/logging/log-api.ts @@ -0,0 +1,50 @@ +import { invoke } from "@/platform/tauri-core"; + +export type LogFallbackReason = "unavailable" | "not_writable" | "logging_unavailable"; + +export interface LogSettingsSnapshot { + default_path: string; + configured_path: string | null; + effective_path: string; + fallback_reason: LogFallbackReason | null; + diagnostic_enabled: boolean; +} + +export interface LogDirectoryChangeResult { + settings: LogSettingsSnapshot; + previous_custom_path: string | null; + previous_log_bytes: number; +} + +export interface ClearLogResult { + deleted_files: number; + freed_bytes: number; +} + +export function getLogSettings() { + return invoke("get_log_settings"); +} + +export function setLogDirectory(parentPath: string | null) { + return invoke("set_log_directory", { + parentPath, + }); +} + +export function setDiagnosticLogging(enabled: boolean) { + return invoke("set_diagnostic_logging", { enabled }); +} + +export function clearLitheLogs() { + return invoke("clear_lithe_logs"); +} + +export function resolvePreviousLogCleanup(deleteLogs: boolean) { + return invoke("resolve_previous_log_cleanup", { + delete: deleteLogs, + }); +} + +export function openLogDirectory() { + return invoke("open_log_directory"); +} diff --git a/windows/tauri/src/features/logging/log-fallback-notification.tsx b/windows/tauri/src/features/logging/log-fallback-notification.tsx new file mode 100644 index 000000000..a3696fef9 --- /dev/null +++ b/windows/tauri/src/features/logging/log-fallback-notification.tsx @@ -0,0 +1,40 @@ +import { useEffect } from "react"; +import type { LogSettingsSnapshot } from "./log-api"; +import { initializeFrontendLogging } from "./frontend-log-runtime"; +import { useToast } from "@/features/layout/contexts/toast-context"; +import { useTranslation } from "@/i18n/locale-provider"; + +export function LogFallbackNotification() { + const { showToast } = useToast(); + const { t } = useTranslation(); + + useEffect(() => { + let lastSignature = ""; + const showFallback = (settings: LogSettingsSnapshot | null) => { + if (!settings?.fallback_reason) return; + const signature = `${settings.fallback_reason}:${settings.effective_path}`; + if (signature === lastSignature) return; + lastSignature = signature; + showToast({ + key: "log-directory-fallback", + type: "warning", + message: + settings.fallback_reason === "logging_unavailable" + ? t("settings.logs.unavailableNotification") + : t("settings.logs.fallbackNotification", { + path: settings.configured_path ?? settings.default_path, + }), + }); + }; + const handleRuntimeFallback = (event: Event) => { + showFallback((event as CustomEvent).detail); + }; + window.addEventListener("lithe-log-runtime-fallback", handleRuntimeFallback); + void initializeFrontendLogging().then(showFallback).catch(() => {}); + return () => { + window.removeEventListener("lithe-log-runtime-fallback", handleRuntimeFallback); + }; + }, [showToast, t]); + + return null; +} diff --git a/windows/tauri/src/features/settings/components/log-settings-panel.tsx b/windows/tauri/src/features/settings/components/log-settings-panel.tsx new file mode 100644 index 000000000..a449f66f0 --- /dev/null +++ b/windows/tauri/src/features/settings/components/log-settings-panel.tsx @@ -0,0 +1,358 @@ +import { open } from "@tauri-apps/plugin-dialog"; +import { useCallback, useEffect, useState, type ReactNode } from "react"; +import { + clearLitheLogs, + getLogSettings, + openLogDirectory, + resolvePreviousLogCleanup, + setDiagnosticLogging, + setLogDirectory, + type LogFallbackReason, + type LogSettingsSnapshot, +} from "@/features/logging/log-api"; +import { setFrontendDiagnosticEnabled } from "@/features/logging/frontend-log-runtime"; +import { useToast } from "@/features/layout/contexts/toast-context"; +import { + openLitheLogBuffer, + refreshOpenLitheLogBuffer, +} from "@/features/settings/services/lithe-log-service"; +import { useTranslation } from "@/i18n/locale-provider"; +import { Button } from "@/ui/button"; +import { showConfirmDialog } from "@/ui/dialog"; +import Switch from "@/ui/switch"; +import { writeClipboardText } from "@/utils/clipboard"; + +function SettingsGroup({ title, children }: { title: string; children: ReactNode }) { + return ( +
    +

    + {title} +

    +
    {children}
    +
    + ); +} + +function SettingsRow({ + label, + description, + children, +}: { + label: string; + description?: string; + children: ReactNode; +}) { + return ( +
    +
    +
    {label}
    + {description ? ( +

    + {description} +

    + ) : null} +
    +
    {children}
    +
    + ); +} + +function errorMessage(error: unknown) { + return error instanceof Error ? error.message : String(error); +} + +function formatBytes(bytes: number) { + if (bytes < 1_024) return `${bytes} B`; + if (bytes < 1_024 * 1_024) return `${(bytes / 1_024).toFixed(1)} KB`; + return `${(bytes / (1_024 * 1_024)).toFixed(1)} MB`; +} + +export function LogSettingsPanel({ onClose }: { onClose: () => void }) { + const { t } = useTranslation(); + const { showToast } = useToast(); + const [settings, setSettings] = useState(null); + const [busy, setBusy] = useState(false); + + const load = useCallback(async () => { + try { + setSettings(await getLogSettings()); + } catch (error) { + showToast({ + message: t("settings.logs.loadFailed", { error: errorMessage(error) }), + type: "error", + }); + } + }, [showToast, t]); + + useEffect(() => { + void load(); + const handleRuntimeFallback = (event: Event) => { + setSettings((event as CustomEvent).detail); + }; + window.addEventListener("lithe-log-runtime-fallback", handleRuntimeFallback); + return () => { + window.removeEventListener("lithe-log-runtime-fallback", handleRuntimeFallback); + }; + }, [load]); + + const refreshOpenLogAfterMutation = async () => { + try { + await refreshOpenLitheLogBuffer(); + } catch (error) { + showToast({ + message: t("settings.logs.refreshFailed", { error: errorMessage(error) }), + type: "warning", + }); + } + }; + + const finishDirectoryChange = async ( + result: Awaited>, + ) => { + setSettings(result.settings); + await refreshOpenLogAfterMutation(); + if (!result.previous_custom_path || result.previous_log_bytes <= 0) return; + const shouldDelete = await showConfirmDialog( + t("settings.logs.previousDirectoryPrompt", { + path: result.previous_custom_path, + size: formatBytes(result.previous_log_bytes), + }), + { + title: t("settings.logs.previousDirectoryTitle"), + confirmLabel: t("settings.logs.deleteLogs"), + cancelLabel: t("settings.logs.keepLogs"), + }, + ); + try { + await resolvePreviousLogCleanup(shouldDelete); + } catch (error) { + showToast({ + message: t("settings.logs.cleanupFailed", { error: errorMessage(error) }), + type: "error", + }); + } + }; + + const chooseDirectory = async () => { + const selected = await open({ + directory: true, + multiple: false, + title: t("settings.logs.chooseDirectory"), + }); + if (!selected || Array.isArray(selected)) return; + setBusy(true); + try { + await finishDirectoryChange(await setLogDirectory(selected)); + showToast({ message: t("settings.logs.directoryChanged"), type: "success" }); + } catch (error) { + showToast({ + message: t("settings.logs.directoryChangeFailed", { error: errorMessage(error) }), + type: "error", + }); + } finally { + setBusy(false); + } + }; + + const restoreDefault = async () => { + setBusy(true); + try { + await finishDirectoryChange(await setLogDirectory(null)); + showToast({ message: t("settings.logs.defaultRestored"), type: "success" }); + } catch (error) { + showToast({ + message: t("settings.logs.directoryChangeFailed", { error: errorMessage(error) }), + type: "error", + }); + } finally { + setBusy(false); + } + }; + + const toggleDiagnostic = async (enabled: boolean) => { + setBusy(true); + try { + const snapshot = await setDiagnosticLogging(enabled); + setFrontendDiagnosticEnabled(snapshot.diagnostic_enabled); + setSettings(snapshot); + } catch (error) { + showToast({ + message: t("settings.logs.diagnosticFailed", { error: errorMessage(error) }), + type: "error", + }); + } finally { + setBusy(false); + } + }; + + const clearLogs = async () => { + const confirmed = await showConfirmDialog(t("settings.logs.clearPrompt"), { + title: t("settings.logs.clearTitle"), + confirmLabel: t("settings.logs.clearLogs"), + cancelLabel: t("settings.logs.cancel"), + }); + if (!confirmed) return; + setBusy(true); + try { + const result = await clearLitheLogs(); + await refreshOpenLogAfterMutation(); + showToast({ + message: t("settings.logs.cleared", { + count: result.deleted_files, + size: formatBytes(result.freed_bytes), + }), + type: "success", + }); + } catch (error) { + showToast({ + message: t("settings.logs.cleanupFailed", { error: errorMessage(error) }), + type: "error", + }); + } finally { + setBusy(false); + } + }; + + const openCurrentLog = async () => { + try { + await openLitheLogBuffer(); + onClose(); + } catch (error) { + showToast({ + message: t("settings.logs.openFailed", { error: errorMessage(error) }), + type: "error", + }); + } + }; + + const openDirectory = async () => { + if (!settings) return; + try { + await openLogDirectory(); + } catch (error) { + showToast({ + message: t("settings.logs.openDirectoryFailed", { error: errorMessage(error) }), + type: "error", + }); + } + }; + + const copyEffectivePath = async () => { + if (!settings) return; + try { + await writeClipboardText(settings.effective_path); + showToast({ message: t("settings.logs.pathCopied"), type: "success" }); + } catch (error) { + showToast({ + message: t("settings.logs.copyFailed", { error: errorMessage(error) }), + type: "error", + }); + } + }; + + const fallbackReason = settings?.fallback_reason + ? t(`settings.logs.fallback.${settings.fallback_reason as LogFallbackReason}`) + : null; + + return ( +
    + + +
    + + {settings?.effective_path ?? t("settings.logs.loading")} + +
    + + + +
    +
    +
    + + + {settings?.default_path ?? t("settings.logs.loading")} + + + +
    + + {settings?.configured_path ?? t("settings.logs.usingDefault")} + +
    + + +
    +
    +
    +
    + + + + void toggleDiagnostic(enabled)} + size="sm" + /> + + + + +

    + {t("settings.logs.retentionDescription")} +

    + + + +
    +
    + ); +} diff --git a/windows/tauri/src/features/settings/components/macos-settings-panels.tsx b/windows/tauri/src/features/settings/components/macos-settings-panels.tsx index 2ae283fff..e65306825 100644 --- a/windows/tauri/src/features/settings/components/macos-settings-panels.tsx +++ b/windows/tauri/src/features/settings/components/macos-settings-panels.tsx @@ -10,6 +10,7 @@ import { import { useTranslation } from "@/i18n/locale-provider"; import { Button } from "@/ui/button"; import Switch from "@/ui/switch"; +import { LogSettingsPanel } from "./log-settings-panel"; export type MacSettingsCategory = | "general" @@ -18,12 +19,13 @@ export type MacSettingsCategory = | "terminal" | "lsp" | "ai" + | "logs" | "updates"; const controlClassName = "h-8 rounded-md border border-input bg-background px-2.5 text-foreground outline-none focus:border-primary"; -function SettingsGroup({ title, children }: { title: string; children: ReactNode }) { +export function SettingsGroup({ title, children }: { title: string; children: ReactNode }) { return (

    @@ -34,7 +36,7 @@ function SettingsGroup({ title, children }: { title: string; children: ReactNode ); } -function SettingsRow({ +export function SettingsRow({ label, description, children, @@ -475,7 +477,13 @@ function UpdatesPanel() { ); } -export function MacSettingsPanel({ category }: { category: MacSettingsCategory }) { +export function MacSettingsPanel({ + category, + onClose, +}: { + category: MacSettingsCategory; + onClose: () => void; +}) { switch (category) { case "general": return ; @@ -489,6 +497,8 @@ export function MacSettingsPanel({ category }: { category: MacSettingsCategory } return ; case "ai": return ; + case "logs": + return ; case "updates": return ; } diff --git a/windows/tauri/src/features/settings/components/settings-dialog.tsx b/windows/tauri/src/features/settings/components/settings-dialog.tsx index dcdedd66e..1bfd48fd7 100644 --- a/windows/tauri/src/features/settings/components/settings-dialog.tsx +++ b/windows/tauri/src/features/settings/components/settings-dialog.tsx @@ -13,6 +13,7 @@ import { GearSixIcon, KeyboardIcon, MagicWandIcon, + FileTextIcon, TerminalWindowIcon, type Icon, } from "@/ui/icons"; @@ -36,6 +37,7 @@ const categories: CategoryItem[] = [ { id: "terminal", labelKey: "settings.tabs.terminal", icon: TerminalWindowIcon }, { id: "lsp", labelKey: "settings.tabs.lsp", icon: DatabaseIcon }, { id: "ai", labelKey: "settings.tabs.aiCommit", icon: MagicWandIcon }, + { id: "logs", labelKey: "settings.tabs.logs", icon: FileTextIcon }, { id: "updates", labelKey: "settings.tabs.updates", icon: ArrowClockwiseIcon }, ]; @@ -45,6 +47,7 @@ function categoryFromRequestedTab(tab: SettingsTab | null): MacSettingsCategory case "keyboard": case "terminal": case "ai": + case "logs": return tab; case "language": return "lsp"; @@ -125,7 +128,7 @@ const SettingsDialog = ({ isOpen, onClose }: SettingsDialogProps) => {

    {t(activeItem.labelKey)}

    - +
    diff --git a/windows/tauri/src/features/settings/lib/settings-access.ts b/windows/tauri/src/features/settings/lib/settings-access.ts index 1819f1640..e71ae403e 100644 --- a/windows/tauri/src/features/settings/lib/settings-access.ts +++ b/windows/tauri/src/features/settings/lib/settings-access.ts @@ -28,7 +28,7 @@ export function resolveVisibleSettingsSection( tab: SettingsTab, access: SettingsAccess, ): SettingsSection { - if (tab === "language" || tab === "account" || tab === "ai") { + if (tab === "language" || tab === "account" || tab === "ai" || tab === "logs") { return "editor"; } diff --git a/windows/tauri/src/features/settings/lib/settings-search.ts b/windows/tauri/src/features/settings/lib/settings-search.ts index 9f8acb137..ed68f95bb 100644 --- a/windows/tauri/src/features/settings/lib/settings-search.ts +++ b/windows/tauri/src/features/settings/lib/settings-search.ts @@ -8,6 +8,7 @@ export const SETTINGS_SEARCH_TAB_LABELS: Record = { appearance: "Appearance", editor: "Editor", language: "Language", + logs: "Logs", "file-explorer": "Files", git: "Git", terminal: "Terminal", diff --git a/windows/tauri/src/features/settings/services/lithe-log-service.ts b/windows/tauri/src/features/settings/services/lithe-log-service.ts index 012a894d9..34dccd9f3 100644 --- a/windows/tauri/src/features/settings/services/lithe-log-service.ts +++ b/windows/tauri/src/features/settings/services/lithe-log-service.ts @@ -3,6 +3,7 @@ import { EDITOR_CONSTANTS } from "@/features/editor/config/constants"; import { useBufferStore } from "@/features/editor/stores/buffer.store"; import { useEditorStateStore } from "@/features/editor/stores/state.store"; import { usePaneStore } from "@/features/panes/stores/pane.store"; +import type { EditorContent } from "@/features/panes/types/pane-content.types"; interface LitheLogFile { path: string; @@ -22,7 +23,7 @@ function toLitheLogFile(response: LitheLogFileResponse): LitheLogFile { return { path: response.path, content: response.content, - targetLine: response.target_line, + targetLine: Math.max(0, response.target_line - 1), truncated: response.truncated, }; } @@ -67,8 +68,71 @@ function cacheLogViewState(bufferId: string, content: string, targetLine: number } } +function isLitheLogBuffer(buffer: unknown): buffer is EditorContent { + if (!buffer || typeof buffer !== "object") return false; + const candidate = buffer as Partial; + return ( + candidate.type === "editor" && + candidate.isVirtual === true && + candidate.readOnly === true && + candidate.language === "log" && + typeof candidate.name === "string" && + candidate.name.toLowerCase().startsWith("lithe.") && + candidate.name.toLowerCase().endsWith(".log") + ); +} + +function updateLogBuffer(buffer: EditorContent, logFile: LitheLogFile) { + useBufferStore.getState().actions.updateBuffer({ + ...buffer, + path: logFile.path, + name: getFileName(logFile.path), + content: logFile.content, + savedContent: logFile.content, + isDirty: false, + isVirtual: true, + readOnly: true, + language: "log", + tokens: [], + }); + cacheLogViewState(buffer.id, logFile.content, logFile.targetLine); +} + +async function readCurrentLitheLog() { + return toLitheLogFile(await invoke("read_lithe_log")); +} + +export async function refreshOpenLitheLogBuffer() { + const bufferStore = useBufferStore.getState(); + const openLogBuffers = bufferStore.buffers.filter(isLitheLogBuffer); + if (openLogBuffers.length === 0) return false; + + const target = + openLogBuffers.find((buffer) => buffer.id === bufferStore.activeBufferId) ?? openLogBuffers[0]; + const logFile = await readCurrentLitheLog(); + updateLogBuffer(target, logFile); + for (const duplicate of openLogBuffers) { + if (duplicate.id !== target.id) { + useBufferStore.getState().actions.closeBufferForce(duplicate.id); + } + } + return true; +} + export async function openLitheLogBuffer() { - const logFile = toLitheLogFile(await invoke("read_lithe_log")); + const logFile = await readCurrentLitheLog(); + const currentStore = useBufferStore.getState(); + const existingLogBuffers = currentStore.buffers.filter(isLitheLogBuffer); + const existing = + existingLogBuffers.find((buffer) => buffer.id === currentStore.activeBufferId) ?? + existingLogBuffers[0]; + if (existing) { + updateLogBuffer(existing, logFile); + for (const duplicate of existingLogBuffers) { + if (duplicate.id !== existing.id) currentStore.actions.closeBufferForce(duplicate.id); + } + } + const bufferId = useBufferStore.getState().actions.openContent({ type: "editor", path: logFile.path, @@ -81,18 +145,6 @@ export async function openLitheLogBuffer() { const nextBufferStore = useBufferStore.getState(); const openedBuffer = nextBufferStore.buffers.find((buffer) => buffer.id === bufferId); - if (openedBuffer?.type === "editor") { - nextBufferStore.actions.updateBuffer({ - ...openedBuffer, - content: logFile.content, - savedContent: logFile.content, - isDirty: false, - isVirtual: true, - readOnly: true, - language: "log", - }); - } - - cacheLogViewState(bufferId, logFile.content, logFile.targetLine); + if (openedBuffer?.type === "editor") updateLogBuffer(openedBuffer, logFile); return logFile; } diff --git a/windows/tauri/src/features/window/stores/ui-state/types/ui-state.types.ts b/windows/tauri/src/features/window/stores/ui-state/types/ui-state.types.ts index c3613f502..c6ded59d6 100644 --- a/windows/tauri/src/features/window/stores/ui-state/types/ui-state.types.ts +++ b/windows/tauri/src/features/window/stores/ui-state/types/ui-state.types.ts @@ -7,6 +7,7 @@ export type SettingsTab = | "ai" | "keyboard" | "language" + | "logs" | "collaboration" | "enterprise" | "advanced" diff --git a/windows/tauri/src/features/window/stores/workspace-tabs.store.ts b/windows/tauri/src/features/window/stores/workspace-tabs.store.ts index a7599a2f1..73c1de672 100644 --- a/windows/tauri/src/features/window/stores/workspace-tabs.store.ts +++ b/windows/tauri/src/features/window/stores/workspace-tabs.store.ts @@ -4,6 +4,7 @@ import { persist } from "zustand/middleware"; import { immer } from "zustand/middleware/immer"; import { createSelectors } from "@/utils/zustand-selectors"; import { createSafeJSONStorage } from "@/utils/zustand-storage"; +import { setFrontendLogWorkspaceRoots } from "@/features/logging/frontend-log-runtime"; import { removeProjectTabItems } from "../utils/project-tab-close"; import { reorderProjectTabItems } from "../utils/project-tab-order"; import { renameRemoteProjectTabs } from "../utils/project-tab-remote"; @@ -181,3 +182,8 @@ const useWorkspaceTabsStoreBase = create()( ); export const useWorkspaceTabsStore = createSelectors(useWorkspaceTabsStoreBase); + +setFrontendLogWorkspaceRoots(useWorkspaceTabsStoreBase.getState().projectTabs.map((tab) => tab.path)); +useWorkspaceTabsStoreBase.subscribe((state) => { + setFrontendLogWorkspaceRoots(state.projectTabs.map((tab) => tab.path)); +}); diff --git a/windows/tauri/src/i18n/locale.ts b/windows/tauri/src/i18n/locale.ts index 016de560a..680660b36 100644 --- a/windows/tauri/src/i18n/locale.ts +++ b/windows/tauri/src/i18n/locale.ts @@ -141,6 +141,7 @@ const catalogs = { "settings.tabs.advanced": "Advanced", "settings.tabs.lsp": "LSP", "settings.tabs.aiCommit": "AI & Commit", + "settings.tabs.logs": "Logs", "settings.tabs.updates": "Updates", "settings.mac.categories": "Settings categories", "settings.mac.restoreDefaults": "Restore Defaults", @@ -219,6 +220,62 @@ const catalogs = { "settings.mac.updateFailed": "The update check failed. Try again later.", "settings.mac.updateAvailable": "Version {version} is available.", "settings.mac.updateHint": "Lithe can check for new preview and stable releases.", + "settings.logs.locations": "Log Locations", + "settings.logs.effectivePath": "Current log location", + "settings.logs.effectivePathDescription": "The directory receiving logs in this session.", + "settings.logs.defaultPath": "Default log location", + "settings.logs.defaultPathDescription": "Lithe always maintains and cleans this application-owned directory.", + "settings.logs.customPath": "Custom log location", + "settings.logs.customPathDescription": "Choose a parent directory; Lithe writes to its Lithe/logs subdirectory.", + "settings.logs.usingDefault": "Using the default location", + "settings.logs.loading": "Loading…", + "settings.logs.openCurrent": "Open Current Log", + "settings.logs.openFailed": "Unable to open the current log: {error}", + "settings.logs.openDirectory": "Open Directory", + "settings.logs.openDirectoryFailed": "Unable to open the log directory: {error}", + "settings.logs.copyPath": "Copy Path", + "settings.logs.pathCopied": "Log path copied.", + "settings.logs.copyFailed": "Unable to copy the log path: {error}", + "settings.logs.choose": "Choose…", + "settings.logs.chooseDirectory": "Choose a Parent Directory for Lithe Logs", + "settings.logs.restoreDefault": "Restore Default", + "settings.logs.directoryChanged": "The log directory changed immediately.", + "settings.logs.defaultRestored": "The default log directory is active.", + "settings.logs.directoryChangeFailed": "Unable to change the log directory: {error}", + "settings.logs.loadFailed": "Unable to load log settings: {error}", + "settings.logs.previousDirectoryTitle": "Clean Up Previous Logs?", + "settings.logs.previousDirectoryPrompt": + "The previous directory {path} still contains about {size} of Lithe logs. Delete them?", + "settings.logs.deleteLogs": "Delete Logs", + "settings.logs.keepLogs": "Keep Logs", + "settings.logs.cleanupFailed": "Unable to clean up logs: {error}", + "settings.logs.diagnostics": "Diagnostics", + "settings.logs.diagnosticMode": "Diagnostic logging for this session", + "settings.logs.diagnosticModeDescription": + "Record DEBUG events and a low-frequency FPS heartbeat until Lithe restarts.", + "settings.logs.diagnosticFailed": "Unable to change diagnostic logging: {error}", + "settings.logs.retention": "Retention", + "settings.logs.retentionDescription": + "Logs rotate at 10 MB, keep the newest five regular files per day, and are removed after 30 days when Lithe starts.", + "settings.logs.clearCurrent": "Clear current directory logs", + "settings.logs.clearCurrentDescription": "Delete only log files managed by Lithe in the active directory.", + "settings.logs.clearLogs": "Clear Logs", + "settings.logs.clearTitle": "Clear Current Logs?", + "settings.logs.clearPrompt": + "Lithe will close the current log, delete every managed log in the active directory, and start a new log file.", + "settings.logs.cancel": "Cancel", + "settings.logs.cleared": "Deleted {count} log files and freed {size}.", + "settings.logs.refreshFailed": "Logs were cleared, but the open log tab could not refresh: {error}", + "settings.logs.fallback.unavailable": + "The configured directory is unavailable. This session is writing to the default location.", + "settings.logs.fallback.not_writable": + "The configured directory is not writable. This session is writing to the default location.", + "settings.logs.fallback.logging_unavailable": + "Application file logging is unavailable. Lithe is continuing with console diagnostics only.", + "settings.logs.fallbackNotification": + "The log directory {path} is unavailable; this session is using the default location.", + "settings.logs.unavailableNotification": + "Application file logging is unavailable; Lithe will continue without writing log files.", "settings.git.integration": "Integration", "settings.git.gitIntegration": "Git Integration", "settings.git.gitIntegrationDescription": @@ -1216,6 +1273,7 @@ const catalogs = { "settings.tabs.advanced": "高级", "settings.tabs.lsp": "LSP", "settings.tabs.aiCommit": "AI 与提交", + "settings.tabs.logs": "日志", "settings.tabs.updates": "更新", "settings.mac.categories": "设置分类", "settings.mac.restoreDefaults": "恢复默认设置", @@ -1289,6 +1347,62 @@ const catalogs = { "settings.mac.updateFailed": "检查更新失败,请稍后重试。", "settings.mac.updateAvailable": "版本 {version} 可用。", "settings.mac.updateHint": "Lithe 可以检查新的预览版和稳定版。", + "settings.logs.locations": "日志位置", + "settings.logs.effectivePath": "当前日志位置", + "settings.logs.effectivePathDescription": "本次会话实际写入日志的目录。", + "settings.logs.defaultPath": "默认日志位置", + "settings.logs.defaultPathDescription": "Lithe 始终维护并清理这个应用自有目录。", + "settings.logs.customPath": "自定义日志位置", + "settings.logs.customPathDescription": "选择父目录后,Lithe 会写入其中的 Lithe/logs 子目录。", + "settings.logs.usingDefault": "正在使用默认位置", + "settings.logs.loading": "正在加载…", + "settings.logs.openCurrent": "打开当前日志", + "settings.logs.openFailed": "无法打开当前日志:{error}", + "settings.logs.openDirectory": "打开目录", + "settings.logs.openDirectoryFailed": "无法打开日志目录:{error}", + "settings.logs.copyPath": "复制路径", + "settings.logs.pathCopied": "日志路径已复制。", + "settings.logs.copyFailed": "无法复制日志路径:{error}", + "settings.logs.choose": "选择…", + "settings.logs.chooseDirectory": "选择 Lithe 日志的父目录", + "settings.logs.restoreDefault": "恢复默认", + "settings.logs.directoryChanged": "日志目录已立即切换。", + "settings.logs.defaultRestored": "默认日志目录已生效。", + "settings.logs.directoryChangeFailed": "无法切换日志目录:{error}", + "settings.logs.loadFailed": "无法加载日志设置:{error}", + "settings.logs.previousDirectoryTitle": "清理旧日志?", + "settings.logs.previousDirectoryPrompt": + "旧目录 {path} 中仍有约 {size} 的 Lithe 日志,是否删除?", + "settings.logs.deleteLogs": "删除日志", + "settings.logs.keepLogs": "保留日志", + "settings.logs.cleanupFailed": "无法清理日志:{error}", + "settings.logs.diagnostics": "诊断", + "settings.logs.diagnosticMode": "本次会话启用诊断日志", + "settings.logs.diagnosticModeDescription": + "记录 DEBUG 事件和低频 FPS 心跳;Lithe 重启后自动恢复为 INFO。", + "settings.logs.diagnosticFailed": "无法切换诊断日志:{error}", + "settings.logs.retention": "保留策略", + "settings.logs.retentionDescription": + "单个日志达到 10 MB 后轮转,每天保留最新五个常规日志,并在 Lithe 启动时删除超过 30 天的日志。", + "settings.logs.clearCurrent": "清除当前目录日志", + "settings.logs.clearCurrentDescription": "只删除当前目录中由 Lithe 管理的日志文件。", + "settings.logs.clearLogs": "清除日志", + "settings.logs.clearTitle": "清除当前日志?", + "settings.logs.clearPrompt": + "Lithe 将关闭当前日志,删除生效目录中的全部托管日志,然后创建新的日志文件。", + "settings.logs.cancel": "取消", + "settings.logs.cleared": "已删除 {count} 个日志文件,释放 {size}。", + "settings.logs.refreshFailed": "日志已清除,但无法刷新已打开的日志标签:{error}", + "settings.logs.fallback.unavailable": + "配置的目录当前不可用,本次会话正在写入默认位置。", + "settings.logs.fallback.not_writable": + "配置的目录不可写,本次会话正在写入默认位置。", + "settings.logs.fallback.logging_unavailable": + "应用文件日志当前不可用,Lithe 将继续运行并仅保留控制台诊断。", + "settings.logs.fallbackNotification": + "日志目录 {path} 当前不可用,本次运行将写入默认位置。", + "settings.logs.unavailableNotification": + "应用文件日志当前不可用,Lithe 将继续运行但不会写入日志文件。", "settings.git.integration": "集成", "settings.git.gitIntegration": "Git 集成", "settings.git.gitIntegrationDescription": "启用 Git 仓库的源代码管理功能", diff --git a/windows/tauri/src/main.tsx b/windows/tauri/src/main.tsx index 5fdf04468..c76671484 100644 --- a/windows/tauri/src/main.tsx +++ b/windows/tauri/src/main.tsx @@ -4,6 +4,9 @@ import App from "./App.tsx"; import { recordStartupMilestone } from "./features/bootstrap/startup-performance.ts"; import { initializeFrontendTerminalSession } from "./features/terminal/utils/frontend-terminal-session.ts"; import { traceWindowOpen } from "./features/window/utils/window-open-diagnostics.ts"; +import { initializeFrontendLogging } from "./features/logging/frontend-log-runtime.ts"; + +void initializeFrontendLogging(); if (import.meta.env.VITE_REACT_SCAN === "true") { void import("react-scan").then(({ scan }) => scan({ enabled: true })); diff --git a/windows/tauri/src/platform/tauri-core.ts b/windows/tauri/src/platform/tauri-core.ts index 04a4d7df6..3122d3131 100644 --- a/windows/tauri/src/platform/tauri-core.ts +++ b/windows/tauri/src/platform/tauri-core.ts @@ -20,6 +20,7 @@ const nativeCommands = new Set([ "clipboard_get", "clipboard_paste", "clipboard_set", + "clear_lithe_logs", "close_terminal", "core_cancel", "core_execute", @@ -28,6 +29,7 @@ const nativeCommands = new Set([ "get_secure_secret", "frontend_trace", "get_bundled_extensions_path", + "get_log_settings", "get_monospace_fonts", "get_symlink_info", "get_system_fonts", @@ -35,11 +37,14 @@ const nativeCommands = new Set([ "list_shells", "lsp_resolve_java_launch", "move_file", + "open_log_directory", "open_file_external", "read_file_custom", "read_local_file", "record_startup_milestone", + "read_lithe_log", "remove_secure_secret", + "resolve_previous_log_cleanup", "rename_file", "run_discover_toolchains", "run_list_java_sources", @@ -50,6 +55,8 @@ const nativeCommands = new Set([ "run_write_generated", "run_write_stdin", "set_native_window_appearance", + "set_diagnostic_logging", + "set_log_directory", "set_project_root", "start_watching", "stop_watching", diff --git a/windows/tauri/src/utils/frontend-trace.ts b/windows/tauri/src/utils/frontend-trace.ts index 47460a333..731a5a135 100644 --- a/windows/tauri/src/utils/frontend-trace.ts +++ b/windows/tauri/src/utils/frontend-trace.ts @@ -1,29 +1,10 @@ -import { invoke } from "@/platform/tauri-core"; +import { + submitFrontendLog, + sanitizeFrontendLogPayload, + type FrontendLogLevel, +} from "@/features/logging/frontend-log-runtime"; -type TraceLevel = "debug" | "info" | "warn" | "error"; - -const FRONTEND_TRACE_ENABLED = import.meta.env.VITE_FRONTEND_TRACE === "true"; -const FRONTEND_BENCHMARK_TRACE_ENABLED = - import.meta.env.DEV || import.meta.env.VITE_FILE_OPEN_BENCHMARK === "1"; - -function shortPath(value: string) { - const normalized = value.replace(/[\\/]+$/, ""); - const parts = normalized.split(/[\\/]/); - return parts[parts.length - 1] || value; -} - -function sanitizePayload(payload?: Record) { - if (!payload) return null; - - return Object.fromEntries( - Object.entries(payload).map(([key, value]) => { - if (typeof value === "string" && /path/i.test(key)) { - return [key, shortPath(value)]; - } - return [key, value]; - }), - ); -} +type TraceLevel = FrontendLogLevel; export function frontendTrace( level: TraceLevel, @@ -31,13 +12,10 @@ export function frontendTrace( message: string, payload?: Record, ) { - const isBenchmarkTrace = scope.startsWith("bench:"); - if (!FRONTEND_TRACE_ENABLED && !(FRONTEND_BENCHMARK_TRACE_ENABLED && isBenchmarkTrace)) return; - - void invoke("frontend_trace", { + void submitFrontendLog({ level, scope, message, - payload: sanitizePayload(payload), - }).catch(() => {}); + payload: sanitizeFrontendLogPayload(payload), + }); } diff --git a/windows/tauri/src/workbench-app.tsx b/windows/tauri/src/workbench-app.tsx index 2ddf9e060..6f3b61d16 100644 --- a/windows/tauri/src/workbench-app.tsx +++ b/windows/tauri/src/workbench-app.tsx @@ -20,6 +20,7 @@ import { Toaster } from "./ui/sonner"; import { TooltipProvider } from "./ui/tooltip"; import { WindowResizeBorder } from "./features/window/components/window-resize-border"; import { DialogServiceProvider } from "@/ui/dialog"; +import { LogFallbackNotification } from "@/features/logging/log-fallback-notification"; function WorkbenchApp() { useAppBootstrap(); @@ -78,6 +79,7 @@ function WorkbenchApp() { +