U@Zj%RU8+@Ttn&c2e)nk;T@-|x&X z3Opm~u`qwfaSC_pVGGWWcJ=;jizB9eI?9(uk{2W083`C=n)7ap;4A7pz#Q)|nH=P| zOMf+EVtHv4_N*wUOp|4qZh2nU;Dx<>@s&f?6*&_ea&Y tqXPuHMwOw z=+s9_SJGWLc2Rj~X@B?jL@7P$h=^DF`xp (4nVknUui1d#vI3aTa0j@ap!WUi?q^$D zZThF%evxD^L13N+Uq5}4S2l0vC+R7}c>V18H$m-w=YFTXeZTuzyZhPpeSg~@M$_yp zPhsQ#QGD`G7_rh^WEpfs7;3(P&)(`NcQ+RaaGA~fZ^Iqjv%xF;8r*;DZ3K6~8Gr06 zIETLxpUO&o*P$+!|E`-VTFdO~>^xaK9_2}`E={Z*MCiX3^l1UZF*L|x<4UJ7ry>gZ z-{3S^o@CJL%Wq%535Dw(%s^hG$!yF@ty9=#=^U`zCbn64zIpbl`7neYF23>8=Zjq0 z)yhuA;dMfZ+k4yFaBRWI#>pIx$$!>iIxF;$pB 9#P0& zAZ(=dmJZ=4A*k?#XiVFqYrbBZ&;%+k6E<~CCviF_;5ucEcwmYe>AVrOQRrUq6Fe^9 z2Dz#^DiO5Chi`8xX;q^odIH&hoZ!GXMW)YefZ%a5&GhK9rohx=R<#&oMwybHmWSGL zMRHFLZxM%$K>;U*SpYrf2Y-OWz9*v#ZvVFm+c}^+=AV93tgDP72BoQ1dyK$nU!@q) z*?ma%DOKD{_xGZ75>cKOn57hkJT(~sSX-c{Z*Ich{fa9)a+OME4l^wnc69wVA6?H= zYX6Q%Ye#Q-8l?TGSA<$9b-vM}64b6vPnz<5w*T7^D%OGnkIpsq)PGiWMylG4LCt+$ z?nYZtFX}`x5fiH-&t_Y)0ehgh>lcr!`B{Eadl#mYutyU=nr7LeX5rwIEs8u8<3Pfm z99~Rn)~&F|_D{k+B7$nLzVNeH<(NHVdiZx7@@@%xTUWoIv+?G1@7-z2HyatE81+6+ zkn1e?WYevxlT|H|?SH6|;I4=o+c%;Oh*zX*6OQcIyuxi0P%OPVWNs%fy|0@>Rp%1J zyp0r1Jk4K>UeqKK>Ux&}5^*W987bzUqt*<`P85iZMxO`xb}7q^$XW_-{VR=V>R!k5 z({+k0hY`AwmP*BJ)ao|tHr#kU#A^cbrvChRg$MgW07PysmVfs*4U@?u@r1~{l6;`V zp`FE2ak$ }9(ITnDpdbc@%$tclqM z1>nATBIDt*F@L-iO|2a99ZC_ept K&Nro)ww$C= NMTz_gTQ2E+nw>)KO@QcgmlUihk zVOX&biitD ILSf-G+$(HRXU2Hts!-C|YTMWtTD Iv{G#&YcFyK`CBf-NQK-zz|6$5vD6*_K{GWUujVZKeruZa1?gu{feJ0HykVK@8`G1iF#G!g?N+uOo1 zTt{#!ure%U4lwDjP*%BkpyCw-Opj3hu;JtrioIIGTb#z}9CnM6mmD}`{?>c5`ye9@ zq<;dc-ToJ|Hn%C_3R%ZyB>*C$WE}+!ER$}a6e$La03zi9iVesjlq=#n2Q?(eAQ%R- z-2vt-AK+Idc*vr%;Gr}?7G@qU;&c|R1 zQ136~<%)0^rg{#Q)V`Uaa!UnqMY4d86@O`l1WVzDCDmVW`J4GPSJpNH|CN~rqGkN! zL$48s!w#x|ZX;&wRu2u4xMv@TD@?(>WPt||>Nn8hY~(Pxt@3yf+tJF%P~FF^ zxDUvOiEKU^r_0M;r`7G7ZmAOQB^zYvdq_|Fp>60dT|Jye$12jc>(K-RZ;*q?>VMc& z pPwx>^+kpjo<
juAHVqt6mpC#NKmJKzTN?rsL7zBel?|$UJy0CW$_BN4Jy0Cv z$_91snxmrVS2n2o*8|02v20KeuDym7FAITPspna J7_>Pq;RN$kt}MOBGL5drnKO2_LKF;0Ct(PlBhzm_ hQoX~e7)b;t%E2BUmC;Vq=AOF;c0p-*h=4v zL`h=?9cZMC;=_1ce 7;>Og$;AWjqndJZ}ju6jqAH%*c)BB-NnVrhKV)y z!U>9D8P|Et@H=>G|89Eo;KxBrh9{i}nLOjdYNs*$ojpekwIZ|XZBixv9JCp=sL-sc zi@HbFLUOC)x~&ByO-aD25`yATIGRHwOGe;gD+3|(kxk%$?P^3A>VJ4J7$`<{R~Gd) z2BTFI4%)vBuEHd!-ywGqHS}U>ogVCV(&j1N!^udnkNzQCuyx(^pnXi?$Mi2iIt+|# z4qbpSKt>4=ZY6GL{fuwcE5K1m5C^ r!YSe?wk1}iSW0{ zVwsLHb_-dNF0*+*{C_PN`pT>658YpzwP!R9m4bwBSf7eV#vwUBNfzP-Cs&-Kt**jf zSj`8&knRJnCGqxNjB_9?5bBMszEC6js^EP^K*f8gF$CK$cU$JpLKD*bY>r{}x#doG zw@l&GR3^>@^gsg&ZxPv#pQSE*BznUh?_4i(MbzL9MO5Q* kZOj1OWsG46XR)r@BSVf=;b6V>}tZ>x7N$3g(xL+%V zg@tx+FbliZ^`lx;_vWp*S)2>I?WO@QeyfNVuG?7z7%x+eNiaqfjG%4A!63}g?SQ;n z4s`iw^1}#K@qfs~)uO`$#+N*uO@Kk?mAL%}ll&H6Of1!N(ME(GOqkD1ohBR{>PQiE zC=nQjaS@u^&7Vln0xdN?G-v_8xU*$H6jdo~getI7)xD0v;CSI~bf04ky6WrPsA1mb ztFKn(8~JAS-lwIz^kyMZakTF1=avJc+8w#Wr55X~e=O&&ii}#A=B9B{i&**_kD7Y> z!BVS2qTYTa)DINz^qQegi^OyLflrG)e7KWwDHMNkDVQ~epYoxD#7h;7%3I3_Oy#<# zzFpkLHI*$^+)}#2W|tJ{N`B=#DqH+ISCrY0=Z3PY+~Ngg&2i)V$;QyXUQhpeJ*|H| z*|hTkZYR5g4|qA1HfQDT{u{rV%;|b>CaaR~Vlu=_^d7}~N#KruZT*;B=2X R1DRtAyZ zp`oOE7Qz)ruBp05kO)q)bGy`7ajTp`>)_)$af>do6S~~YY7-UO)(Uym64me9rYR@C zt&x{RL8TrE-&;?Tn$qK@Zzxq>G?f|>9$J4vN7A{mYDAho+A~HTQ%<;8hAZnSS{qRn z$`x0rQhq=I+8(8|SVafY+mg!zBYP9|LoQ(43hMHQ!8shr*?G%~3yaUNS59kJZsdCK z+;GpyA-YJPW5p_yBiUL^SZ^T#qs9$)RUk-=ynrtwUZvHF4s6*VH-!Ukc>r6o@Vb8< z0&?GGWS 3O?L5O?oNXu2YegYEhQ zTOHXLl(Ga=+f=GWrwJOCm9kUq<0L(sLQX_kVn}q*RTce7ZTAv1`P%GBFJKw-C=<4l z$C&ZR!@iP>(W%%$%WUPIA%+3!!Ki;mlW%8Jbd=I?27`!j5*4B;kSQEtt?bnuHK;4o z$HvIm>}6F}HS>6bSMA}b;hIU=NTz2!h%q}<-^kN$<(B8$4ryAAhzy;0Oor9b8avN_ z+1T5zu-|+e?OIz+ZZ_O&cI2mGy1l5e%#=~C0PSL-EB6QU&(M){wX>Xlcqo6c!jXOJ ziorSVN5bdR#Udly4F&hgVX*`Y;&oImuEU;M+ 0K@B8;)}1O(ud(7UVJ9iP%uZ&8?%O#F`Dx zljO(A=rR%>@U|;m6-x>L=r)oMu126<96HHa%(1Rx6i3iX_Hgj)I;L={aoGXfMUJ z7yG@kg?-517$M4oVhxA?ViQRSUP>ueT$5rv%}X@othWwTRdnDEH1K~bkr*qekQ+Kc zZiw6h4@9g@`fRQhUK!?(ai~cxl>C{FxTByJm@nh^idZ}6Cz%C^2jv1KOV(%A1la?A zGlM}BN1Nz?Pq$wAz*}YSa0} {P)mSK0tms*QgiUssH>pKO% Rnji0LUB`R!&E nykcCYU3&uxWbJoTyGd#=COlYv3&4Q z=rGU8LuKxx$AWB~6Q*6E3wW{EbEB~HklDdU$QN-$YCjQBO^i^a&f3AiM8Ix@Dx#=o z{>Jf4%)ZR!F>HU#XuN8Gti!1|(r^Q>h?>^FBN9X!M4*)Feod}dk6WR|r6SIi%D O$7FS}D91qp;jy zbTA0uC>jyT E$|lRMZ_KjX iG=FLmxpGKk8dr`b-VMw&IoI}Qq zN7#p8Htoh|`4W(Do&+a=hhV 5)mBPM>H z `f%5(8ClGYUe!N(i9y)RCu&p?h4)BDpm zU*oq|LdP#BnN24L3>E6}2X%;;Us0YmG~=rDKxSO8$ykG{Q0v1WRs_lPu(rq3+XuQL zt$%+nphRzNR^nXM;~;E@4LNxP*=`$XuL(35Zn)wX*1gG9!ERTq${mSAxPFsaO;Y!Y z9z?ba9GGfO4t#(O9W9ZgAsQGS=%whZB8^`4v_K~ruQ=c1?RMb_5BlM9I+qf>mPCDh z;{wWbct|-+B)FPHNfj{?qHSWNXoff-y%K+-WQA)pwlkw-(+?k+flTU3*DRY?gvK=d zUkQ?UBmjQkI=-%sYf^fkwsHzW-Hn@F^PNCFPSC>_PRRbno>}ltUM5udf+B(!TJ*2V zz{#A)0#3j9fOGXhp|%S!sjDo&^h*)&9Tmb)cCj2C^XTEAc>dz$cW=!8 !}XL@EOweqO5^6dA5K%3j~E7KDC9Wl-Jf3soqp(#DI}9??wHQoDtL!V(xnBp zhbXAsoi6+Qu;qBv^68AMS8UJmwBdiH=d(&O)pZr;T)y(0w@(=HRt#q~nH0j0kvj9Q zxyHmY(c{|6pjux&eIpk}y~LptJWkJHTsTcJyOfz>X9<#7ju!}JlIt5;cPMKy2-?e} z2_1|RsIWL4O-r`3x;ybU=M4{|aSU8L2CN0a;7iOj3Jkmm`_YSp{Uav=u5N!rNvGg@ zz(4e&Zl@D``**^>mK~mv7FCEldgGtW^6wVYExmO3OB2>_tF&;ku50BK9Bb+1uhtx*s*EO$sYhz&rJRhxTcUMi@38DcjS1x&( zEtWo{+ysn;GK-ywBE`(C%iS{EBHw~TDKILXI1r1ox2Lc0GV3Uti8I# 1E6!h2PP_p1sY*qh)cjIo)8 z)7{&fM_+vXG%9RLWDymqP<&vNy=!)j*iG##dwgW~#wovace)YYawd^;&3|$?*XH>Z zOSmzQugtSFFK?c%29LOg1TZq$|Gbj_w~?&nfP#Max)`}GJ~kV^w8?3=iMG%N{9;*( ziCmCoa>_dB6J|KxSCu%^Zm%!UFf=WUI8@d77ng6CrfZ=Nf8K7pVy#QjvdEsm{0*_5 z4C-LrC=pu3_PvIDOp%F&4u6a`1qpY3(qLUtXvtYZ=wjs+W2T76f+|e_DL;d(J>gBJ zdn=Q*UloMsNji!76ZIpz!IuQ0Yxffm^C{@{(YMEjsp*!Zbe7kYqmmi1o;so(#U3t& zca%kPn!QbGhL4k3I+_5vYtI<>=G8q&Af7%9Kz0vS=g#*S+<4!oM}H~ej%z=k z %hgRY_4&tr35!j$mzp!--4d)j3YSX*C5xAG$dub zZ8ay7#?cIdCguz&w14b0A9SMr)mqITINCqxG(TM%z^4uXpLUv`tqtHa2Y}By&Ck~c z@VNuP=bh$OM?#>r5gNE^YiLEi$|%~|bDpP@Vhk?$smTTd_`8gMiN7M3wH~yBdnX2* zD#yAbm5US59L}KKNPC4MN(e7aV4c||R3=GrRf-xKhvd**3V&ngjB4(g6|4^QGx_3F z>3Jvu)}gOHV}XMyn`ZYavNayFCi_Yp;V%BwD;+PWaXLbcQ-CRPjU%SvrvZB@Df??_ zg&m9J42t-S=m_WNn3C5rj}wYhGFMDkiFX?6&*HPilzvnXL3lvQAJ;e+32x=VNHwYt zM5JOo5b1ePoPUUvYZZ?~{&C|ok-IIOg_7(1Qd*slrqf8Ox2O#g4E8DfOyDM|b>jQv zEfVGP^yo-kbMC$07J1}%sd7FLYOBN1_{Xz(YraU|CctyNZ3CX#z+a0MK?gmm-|Ad^ z@kOW8IXHrSadMESKP3lS-yF8O_aFS-;Q`Y_VVuOzZ+}0CgXTRTLQMR7m%y&yHGPDh z(K_d5JyVVZi)MLR_&_-rltAo8@(==Erg_e3f)9Z|?yH }-(>qmC!&IZMG`FgXF% z{T65wj{AE1LFbd^R$o}lA*g?V(kNCCuxsnBE`OcJb|^*!2e>sFm?K;yXr_sof=;kB zK22vJ8jqD_53CIgQl|=vRFb_OiEq>j-3ZyH2b$BDt$iBTn7(x77mkZwL--WyhvTu2 zcLu tPKGX1 EiUYY4Jz)5o?zY$91AssfBns%utzhYCNLRjLIv=#hdAK1TOO!2 zK%E2AKz0Tg)@vii& sF_3a!-})IRtm=zrdWzaDhtUo;fO3M3cvlnE&8%P)hlL7 B8dHQb+ zc*5RlJTkQx+^c**>PJ3}#dzdSg*V1DawG9HBaEZRt?|id@n~7=FzXTk+d}n>3x8oN zhOZ1!d#EcfSsr^`B#)G*tkIk+2mm%H?dFYIyFzl3Wcp}2Wo+fzPlS<>d+{RDVmk4{ zO+CnwODbv!G!f |hhK~_UM*KYStz0qy?mX{l9%bs@vHe7a7t#e?Z31>snv8YhkyFdf2g;Q zPhDPH1{_0ZF@B}jDouc0-r()F5=;uC=@N+-oAaiU4*113+s132wdJ Hoe?wx9zcSTYv8eX&jnLjiF1cF${M?BbmVtw_-(xSukwRxae@P6S6o! za6s5Ul-Yo-H+Y*WU2Cpje;l+i28FzFf}(P^Xk5nqG7gJ~1Mc2Kn=Es5>mLoGkArA8 z6xatw1?RJ4BNB!T%$+gKU_I)Cc24>$>=_0>7(}n0e*Ngr#sju<%74X{>HaS2wR} OxB4k}j0s;bIjL=2DR^kSk>~z~0%MW3Ev!2a;w4aDWX>5e_zI zSi>mRaqxAX;sP p Tr*UBBBUi%K2KfR0;Q>{@#8IQ2P|l^VWDYoz^Py)PEc`)R2Hx`6Q~x z+7&373P(%$#DDBP$gvS|E$Rs#I~67z(lZv0GN?ZW@q7ZZ1{}#M%Wwpn=VQr)@e4nB z96x4@@+wx}?g!f`3p?wmDc3XL8!p#zR4{%i%#uzaoMmBx R`s4+0Un6c*? zXnF&fsSDkA(Lr~N>D9iQll9H%XiN@tH1h&M9g#Y>xqlSqIohKs^y#jppty@o2Vn!C zH^OEp;? O B~&G2m;tJK;3t*^kyEq$q6yOirYzbcEUo?wzmpRorFQ?yJ6EQBBMFL}bUa7gWpe zt5(cjtA9qgVP;PG%SQ!&0=6t$mFlv*aIk2m`XiLTgIxVLvzXRVBAmVH0d=O{!c(!j zAFYm$$~Ky`(dgBczS~5w@yg;=K$*gG?^`s5ZU8i3Z*U-)v6{Ih)e^dUjQ!T+rL4G- zbZA7;3>}9zX-31wzDiHohDo%>ParBYKXkIvxPO^i8n(^Y#Ik!>ccO*FoYYE;w#2D0 zGWR5^_Z`wXO&f8gl}yIGbJxU0eV)0@LvMBiya~=UXB7fg(Ql?=uIsIiD+wudhm9Gu zPK)j&asQIQ9j-LD^0Q!K76bS}stSki;Qy~1yThyD6^!asF>z3@6eoIsXnzPLK5tlH zmw%zuH2e*kUBRih+oh-w=|n|(gdvf0%R*tx$l@Eldlxm(tmf(pj=*E2>Jl8;$) zh1chyD2qfM$97wqwX89oUHHUeQ<;FiLVqLTbqQt<{*MH+KivPY1mlfD5?H3GO2t4s z{bDjv)^J;K4w-l}ND|o5)&bARP`r;*Ol7Bu=daDR(5iW~_c@7|r6lSI-}3r$B3o zNFSrTpzCV`fAjQDZyvpR`sn8HU3jpAm#F&Hdus@UG2G+*H3ae)?#n#}pzDUxU4QQ- zlh`fhjS>^T`sxdmC7(Zu*~ z#8bg&_I8wW#gBExajt4CDEmPP6#uMh%@+w~hc8tVzeBwXx^QB3@4!hyMkGqMyMqHm z$@b}6z&VP!31Gb@qUe}1AgwXBKYv+dr-=}hS{YeX{0Zp)VxYeDFV*Ki_k}|NaD~ZH zc5z1$6f~ZWE|Z09%U`G|edLyBdGeUBRb!;ZFx=SS= -tDuxpR6Z z#%9Q5k??l`oLqOpDS@721B&`_5eJuXum%6sTL?hOrG(M?J3K3y2!h4&;eVU#S#nXE zgFqY4_qOn_?tZ c5H({CU${pl)Z>NCet0dE zCD7=S0tSX3hYjDT>3C=HMTYOV(mOySKbgja-Wc@=2pusG@-L~}Fi WHCCYwWx6)L4Sw-GhoIR7#y#BofpHY*#kciDvM%7BU@RLOzl= Z4&!<2K2tkUL7CS z;Dc#b#ph=GFCXvL_D0R4;bi|^_p0vu{D*ehN-mNyLD6f FG3U{4?&J07w8& z;p1{?SC<}^OSiccCV$u~TZ+g?#pyDK`tvN0$Mo$nY~`h8u}pz|@?N_=ny0Pf6z-Tq zjECE%R&A7%;NM2n=Jt7|MjYqGB<@j5K=|quL}8t7uY)#riNXr(}j?wTDoWO6LCX z5XyXBTjGyV9BE<>6P-n#wGLuf{BFx#wnk^mlWfsq%Piw5cYmwHa%3suL YjQAJq9MKhCe7*fFJx42RxnNL9dygR z8)U10NHXkXKwj2YKv^5HbK?S*z zF a874RVyK1S7wBN)@J^ki z`6&=Yib^QMUv=jp`xYAe74w8E8)vcr8&Xfr$T2|jDStxEU_IRVfBzYF4ujh%*QNIX z!+LG2(;=rFdo!CYs`m2x|NH*`y#F7+{5$yjzrFw8@BjM#ujqCscCSnlZi*`fhhSO) zb9ai6{|^Im7t04IUGGDkh8C%+J+l5GxGvs2>mp9R;9 1waz(UcQeSe}0%9qBu -`Ako!j2TU?o@=&j{`aG4I{70E z3l)%Y%5i_(rSjAuZK*m{?vz6E&K46&%}i$Y%4u6NLEe~|LIWE}6|5I*cYYD%8H_Q& zz`|A^-Yb~Q74QsBERK_XNEhmldx#Qif$6Jh320cOki9N}(_dtR Mp)BeYYHS~}$)D5 >uqAb{SOFQbw&X Qpp87b8cEeGo>-`N zlC^&*psm!NS{hr?8;#0j8Up7yC4Ay`laWf0K?pSL^_A|thP8|_8j6 DN!+JPmQ7O0j*bg61v-w; Y{Td3kS delta 16884 zcmV(&K;ggKjRA>`0S6z82nZ a^MR**nl%G@7Cv~lCYN0qtb|+iWl>Vjxf8idF9 HA!)kIPhcN8yv?A2NbOD#IbGo&RF=2{&sGiD1QKX zGzLGP9`~@(fE~wk(C-7@LMz9ilwMga2v@ETW1!Fwu7Y&jgOR0>mMIfa6h;NosD$Y2 z^{{Om`l3ttXS`(3sTX)zvhi<6A$q2f0Uc;y>avBvxrk$@ =bc49wzW +HXszIokUI1$(tjaJ<*UZMosY%ZcJq3p9>-PXZTXSsf>lmKXZPDps-_DsxS3BtNa zEpod&XsS!I>2jjTS*43ze$o7a4%FQ(twz@l7@N+;*I)pyD+$oOD{WA4Eq_!%VM0&@ zX!@b!UM}E?M$jRp^dT XYuDa!`_@hc~pbt4B*oSRnr{-K>YJ82}Q%r8wTIz)(rvZ>u!B&INW2G$_32F@@n zsiL Z4d z(Ti10OM+Rqd|}Xb8Du_QuU7&iA#_3Gcvry=fOb%x5RYcs(_tuMwtvA}n`WcMGc7ny z0tTOs?*-RJsxT9Amvj;k^B4pFegMYqh{_xvsObA*njC?jorn$$I}y+z0yTZ)day8^ zRo@E$nlM-bdRHX2AzfzFubYuN?m0~~{o(#Td-KDZ{i1(b_Dapi3oy4K%sLpTnA8*L zuC%^t73fHHNh`dW=6`;V#n=E=L@t#CgESrGTBcqUCp;HzR?w-N#>yw3J!DTGW<>uL z#Gu|)s}_a-UsAPBA?jNO3YU?_t>foj@jD-<)jG=bxTzZso0YLs0hYErvUqG|Lo~L6 zXpGEb7KyFWNNin8pJUAR75X?v>wI-_k(t)j#TwRyj@`7M-G9K_DA i*aib!U-T?;ot!=G;OyZ0K>I^QMwH zaTuefd>Mk%46tHBuct{E;Y5P?eV?Fnqc=l}bvCI~#3h8iApFu9qGydYAS;Dt)_vi% z>;*qmt85f%V1HcMg{E>0` {>K&>u(rOB58kY=(AkyE){ zg`HkAHrr#meC3s0_;N08T?cF2z|aurqc44N75y5-LZfecJgE^0LgSkT4Hi2$!e|?` zRcf@1$$z!cz}{8`+{*G)N9Y5Eu$%=JfMJ@VVZvAy%y20xGeA;`mTCj@X;qA)0exl% z((+ZnWD_UAagkA77yz0c=qk;6K78)-q%Wga0B-u~C~tU0!Q)plkKzWN2}s)9<2T zJ#JuEH~9r1gZ06EGZz)&)#kpl$`qD8XMnLS^?$h0yD|D-92jfq#~gN(L}b=@hm>U2 z=b?VMP1(WXpbfKxO$M#c*wqbLow>^!YsRXCh4xZj`IH^dTbHEyp)EJ=>FvQXapSrO zWTW={$o2c9FB}-iab2c_O6r*|!hC+`fL0WJW~e%&e{S^TbJzE7gam(qZ3~J3cTvbC zW`CGsN0q>0FgYxo$|^*#s3f)-w1&oPlb)&9F*p-C$9L11aV5($JzZk>D`zzpYz5r9 zbwH^nA)~bzhu|7Xjv 7w(ixI zt?6`8MT4>*(}OiU=$qy^Ep$|2=b*n2?xF&mW_IP~mUo;Fqyi03i!)LMP7Thz3xcR( zAG7n+B9D`Vll}TDt8e*v-m-i3K2O+5p~_jcCRUky3a(-nf-Rh6hTv^mrex7+<$pt! zp6zoKJM<5+cqqf)5>_$_>vFj#na0S4M#{ZJnNCf%)J^nP(@(flm%iznXfjTG6}n3h zvN?Ul?J3}x?Wf_3tdCQduatII-ST}#RX}<5%y<&eM>gvmsCg>_KFIeImE36c^*F!r z-TxJ|Q4lhCAAxHF2Q|gmQwi!4nty30iOJd#13Wq+lk6sC0=iyI-`QYtcSGM-zu!wU z>R>OlkdRuE6lKx=JGr;~?igBTA^y93>0ujrA_5wmzq?S;Gjj70Zre+i;;JhMS|Mzb zZQ6NrD_hv +*g`d@R`@ THtv;thcciUygFUpVpD)o<&+pL5X`=SI;6c%HRyE zY1cBIyp_!_mhx6MNiAMduzwYUACP$|mK|1 g|F<8YbS zhJNr!ojDqDu=|RnT$&%*8byyE=M_UfnY+VDIG;O#Yt#B|@lnci)PGe7FxOXDX|=IT zUu#rqWPy5(Fc6(EyE#3Zgo2L8qNf>!KHDTAm=n_!&5)}XoBZjlJXKH7fpWXE& eP~-`1nO)qFa3bOS3ruiI>K}KG2ZhN!?xhrMo#h2!ej7&azrZa2 zDVH%*^I;pve=_X$h=11Z2rB8-NauL_njbHd1e45-Wr1$V{B8vy$3FFDt#$7fsF;V# zSS%O6TRJuh^tuF>L_B>>X@;T({!1=yP32Pxn-rn#qBfa{$@MtA(}Yc)>xN?C7B)t* zNXQj mbx4KVpR~G+mLgjil>9ot-ZAYpVFvvH!Q&LXtV;W)+=HIx-9d}k$d*HoeZm8%MTkP;5NM3qv~ zCBR(XH*4hx=W-YOuO|QZCa#+er{u1jU^C_JkjryWIlm (F-`;?e3(7m zWpbc3t5uVYT+ot@FSwdDidKp^%`qTc)`hi!AYM8xnSbeICY+*?t_!WOb0dFajSYii zISN+LQ%55wKk0P-52y2fzw_lq@5*cQ4ow+!jo{-BjwgVVh&JvS$t{7x2^6)BgppJV zpoh?U2zJyXYydu !wm+a6X=hf{z$C}&xq(wG@1de*$tKXY zp>PPQgN6XUN#< RO<)My!?>wlim;;e|ZPBv5!h57b#F6N9mR#{!jvvE~i0}we;6U1>BcR9)hg! z{E9NV^pP{VS5+J1%3~wjrBt6+WLbqR%!?ZunMRuwpUyr?j+7Xq5oTzzFv^92&YF@B zHOf43>0ynGThC2q{V$$ YlWW5yndQ>sA@cdtfht_GIXa8*d`)@ERMZ7pmb| z)pr0c)o2Hfv%@9UeSQ0f_TfJKg9kjlJ~H%K%jb)p;^kx_;&_yX_9LT$rc>ue07c6G z9H~eQ=G&-}e@! j)zD=ztYUn&zfBy(?dGwuS5=w cO0BAkwoTCgM%{({5CXah=C(f}e-SA%>tv_{N$Eo0gwZg) z-f80jA%kVFhK^Ep2Xs4DKc49LpwX!mx}v(Rw8FA^+C;y7fT)~EDhm1!)mY(pjnQV$ zP$6tKcX(xB`_{ViVf*PNPp5QzWyjRW_I)v!pzWkUqYoq|jwb80$YUXLQ%9|zdUB;_ zxkG+_)N8cmf4iOPN(bdrABkw zp6ldAxL7WfLWU_DsNh_le+k7C$m9w%biIjClBpf^QTA&W zyAFhB^mD&No|oPsPS_z#P~QD4TJ!MbZT(Lwdi2wG@>Rdxwr06-*);Oo$^CDaEgZWy zC> C}7k?C@sZXGeQfv|K&ol}9tmG4F`)gjt%e)r{i^ z6MQ*mTi}-)pX%fQi4&gGH`kJtwU#u#`9p~ee{GJ?1_C~H0R0`7dTCLsjf7kdOB+>q zZd8Suy9_hfS>o_g%w-Z@!Y~;4?J(GAOO9q|XuF6jW+^s`;>qdXHO1C=O9pR!t1B 4@7mnxLh*i&7@gj;kLR#4CgeOVs@gJT8CNUbVgUdyCl+-ZHh@TJeh$ zf4p_KVgH@3{TQx;`)aGy4VSMTSvtAbUecE59MvUny{F&1kQ ~1i=0MBM2I5v$s$F+Ro5Jg(q|7q8y!s5jNxa0{X#4OvT?YBx->N>C^n!MC zyeG&H;PWbM)+1R8_ Q&tpP$ta{cas&wuHY=aSV8B(qkHV@b?*f zUcl4F9yzxhyleMY YOYOO4=>nf}W6bFtGelzk%9 z z%k0DVvkNM-?hhY~@+sFf3{m$yZSihZ229<&ZSg+a|GdBdW&g>3w%|%>;V<_;EB`P~ z)&5eNF-|#L$}IyB&4Ni=lQM*|k@>|^G*a1B(Gg#}4?L>5GJ0RQ5nBB#ZEFMPmla1` z7F}R|US2}nkj$Q3=PAaTgtbwyf96%megCSI FJh+7DCI9-DxG#)($Ht(n#b-D;^%W#gh7P2uEA z!nq-VMbq8D9M*69OAQpq?t&=T*A=IRF`{Sg!wSN(?}K#TPNjj;;QO3jf70_2-{W=H zi!O Np2%`@5*^yu^ zDNx}6c~iWB-$W{)#HC*ee<~^4XH^=zc)rH2v}w=(xujKP+E#uRrquJeI(!EGg&mLU zI}R#4z6v9O9S0jmv<;U2pBXlcT~YHUsxHsyJhrW>`qNOIM5v);3qp#f4?$?~K?psn zp3c`{k^z2Hn9|JxS_ndGWsla2=C+iC@aeh`W)4Qde?X8$v+_YMe?_Xq4pVJJI&)oV zRV?^AGmrP>J1PJ!TKhDISH-<7Jy145bgsdu&KguPdr)!9Y}ZJNrbr8<8gvPx+RzK2 zVRiY)bNO&h`8-lVk4v4oHkUY=DSCxD1-Im@;D6ft*5)>jY_ae9730xH0~muRCD{f9 zvSdlNv{#lDNxt5_e*~8W0z-0a5Q94dilk{)CHD{9q$*YU8F^H;D*2G)L;isLk8&RU zoaq?=BxPT3-Caup(A}rIPoM5S=k$5tJGLGGow9i%$xbS0 Vi%9rK&vE>TErm8h=@d)Tx%SF zN2R4K?P#Q!TB;a?95_b9$q&&ka !;1R|mDuR1)h%!2qdD6mg70-Xm z0?#tC1fJUze+YW+yClyX1PvAJ=QzohC?ho=DNbMwM&KhJA?xz~5}5$6=R7xU$><5+ z?a!mxA}`ZWLGu_&ddv$5& sU=TZ&~^0bqOf1N%ndc~tISLi U;h0s|McO%fB2st{#sn~p1dWIfh_F6vJ>>a?3gKlqGbEq91W>Y8qUHg zS~PZ}e|1Bn0sGWJ^8m4^oVO^nSIkIQWd9y2LxsV5Msg=(OwP65`~UhXChf(ho!4-} z--zCX(^28Ip3ChkconRbW`G<7dXq~910gz?-qYoAlEy!ch3UPrZ>czOa#G%d+ 2ZrwZe_G)la`x4^qqbnpT`_K|tF3MI@f#o3 z3U95$A?vdhnuJZe6+%1{A;d>k3~{*CJf}{Ji0doBG8w8 fu$c`VU44@H!N)|u;wIi;RGfzyC4diaBEJIS(5he9v&VJa$&TW zf5}4Hg?9$hOkBm*{;5e(0Q+CS{|1Zk6rUsTLiDysI5k{U)-s+vix1 7h+?xXlh$&Ue|D8OpY3OS-DpK?m>E!FLt)Zsp^L)ke*)Ef zWwYb2j#$@oI`m)1IvFSg@HIbDwiYE;cSZW5X4|>w;FDQ2P9>LO RN);wKI0VPGv zi5eWgvE(?TMH-)gL|IJeL;>wVCIvn@rBUewRBehOk72LLcaub)60qBEe?<*U!chul z8XcTgz<7$q+}JXrT^W+tKV2N9K&O6P=X$V=q1JX0SBxZCfvv+mrV()1&GBp|dB-nL zF$FJ*8c5K@H&SWQPBhOze#f)8CGJoSOeZ~w=S>#3wjOjA=Q*Ac^;noT<0ytZ^`Hgk zN4t7|w#5 fFQR>M)rM T*WiUq`Qj^wtSeF#IOO2s^9>wQXm3_VkG3w@CDde=?VwX1DP2i-;Mhgwp{4!Z z-4&(us3Rg??d@Sal%mqy?TK1Irz$CZoENK>9>O^xKYDGCKYQ< Bn-AXm+qh@FH~7_i@V>MW+ySSsuiza1MtmwN^<9U$SpIu% zs%R~fm&sX_J{f0Gtu9Th9Yk1uE$Gt%hGS@u#m1FRV@^dB^1t3mv^-9r*Vo^^edi0; zJ(z*KNTd0Lm0BmT%i;xKw@qxb@O&%TtLDQHdbpI0pFW>wf6}g2b}A09W6GD_-`av> z3r04H7H~|q4&r&PhwSv=#Br-zN5hGd1-_$ByaT+6%sWe+1jB;syLBdxf`M~{Mg$JT zkQ?RtqT0}H+)RjZhyQR8m@6w&gNnKYED~P#;ts{^2A>SQ`RQziLOuD=q1Qlqik5Jk z!~~<4``p^Me_-Z}uw?=Uk-C~nYPHJ<4E9uJ51mwpWS>IC-FR;|h^GOi zM}b*NVW^}gBLHg)^bE{R_`6?mWk;?uxGZ3%Im3=#xy?tf lD z&6PUee`rw&YFDQxP5C}M`0WT4Yr%m>=bCzIt2!f9?Z&X?J}-BIZqN@pfy{rzs>suM zS2kb|6nFjnakV(jj%$~GJoWoD@xxh?q%{i%pLQwoP>2KZ`*L_8sad;zpY5N7dqe=$ zV140dvC1KP#`N*;(C6La_q$iWpR@7ibYHsDf0S=FGDIQjeV!uMne)k}TUF 9ZE-r&d5X_tcbkX@Y-z}AUjuYG(NtW$fZe=3jKo42m8yEa#;x}Mu8lq zqxsLH`6&Gv|4rLRp+B0#6(U};@N+5Ke FZPHq@kf@X?6989CBh=^a>hKmVhk0z33uv(JJrvr zcDzu#WtBx23$h|iCIL3yuB;AG@2-YB9O^U 0+l8mcFQxC2EV*`F|7q=7={)5AfLYy@PxfJXcIWM ztr-_VohihmX77ROcJ~G{>*BdifI)|Ka)xieYSfk=+2a}P+}(Kk7a2r?M-D5s=PlEq ze#g0y5M*%^iOy&+A@I&K>=vuye=aKY>My6Ew>$>^9tkVAX=Tzw=nLUE@*c{Uq2!Qi z?EWA)n6jsRi59Ce3qvN^=c}nzQgRdZOx09gO<|JnQ|?lgTob3xOe@tklI0?IkiF+J ztn@&*^~S>zvMe=CiOGm*TNU6-=6t{(-=NhB1d8p$iK>qh*wK36!3Me}3ri($iZC zJ7rF}uVL!}VK$NPZhiq&`ndTIAO36emw*27ADSQj%P;@2zu)pO0Mg!NHw5nb%6Hr* zMeY?x!hD;KUlH<&35N+`cQKw1{ht3ZVyqJfXyoHXwzq|2xQ^hIV`W Ad6rp{#Q8 zK=~^Om>!}0VZ+I%6nnLRf449W;|1&%B`-N}$oy^T&0Yo>aUc~??e@QzwYg0ZSI9ax zD*+H0CF>|?V3~9SrARSY1Q03rQEWgKp;!^mIjA8y2Ej0x?e;NM_z=G;!9x}m1rMbG zDt5CQpp?o=Aa&kYofMpL%|H>#z`i2%gW&^srTO$saXto9fO>x+e=k>r!!XrzsH85N z87j9_5LYA%_*ju AX>&hW#~2HaM(c=&~3zw-C9CJ zq^?kFp!y3M<_c3VFIi9m2=yCiaW;0C+*Wx!i0x=)WT@`rR@?{V!$h(ePvYf8ztids zOt(~t_ks ewv!-kPnMIK0sMh;vk6+vSjwGUR+d^)};f7TOw!Twp_Y{G;(E4!YZ zr+!g^=D08DK66IOl2NkCjv^5x%N^y4L_lG;EV8ppF*cs7G3e~<7bLQxTqVnd(205T ztg~t8h`Pj)srd0v0_$!FOay)6kX1IQ-t|CnEGrw-*7ZPfkSiP1{cDbjqF>pd9$XI; zhsCl%J-qfBe^R_G1a_sKXU#@Me$ OTpd4r3M}v5!|IRJGy^Rl9&Rt5XsX>15C>Wf~m;G~f)p zH__3v^F__C?T$v-X!Lfku~P?84!$%-qiF*TZ~c?_e@L*EWiJv1jTv;HkunYs!b$y7 zES=fwU*c&4yYd_6h#USNVBYBGTbtB(e7`@wa=VL*mkkqZ?1kgy!!oY(m{IQFt^K>{ z&4V8YEg7D4B4qN63#*;R@OSncG1Q98s<%m%__Nn$)S^POsxImtSqsUnj_S4+kTfM8 zt4aupe?#GD4v{Pwfs3sSgv>`afdjUy5n!m};c%!J)g4*X-x!QmO*m-(Hn<9tpniwk zMbOZTrFD9++ew?Jcn>Ed!9My2aKYAf)BW}lg&)(u0O>F=vN?1C!T=csK)98-q4hJq zS+4*`AweAQqWP+p9I2wv6qQbJeAMuyYM;RTe?+)%=947C-$&^(o?z@2vLan3i-G@J zF!YsI(;s@jHfzsl8Yu+{-LPdU9vO$^>^Mrr3r?muM_XNmzp$DQej(ilTub8ZJs;;l zSRm9J-GNXemQ}&~ihzpuP-6(TU+$L7orNZ(+35nq>~qWQ-cFIisi{ny3Fv_a6y74R ze;+>!U6hgN4ST$Ey~q_ogF6&ajf;^RoKYK$D0GGyiH2ndq${aX8LI7up($2Qt2!V> zZkVR=OUWcfB#El|6=GGC1OclERAEkQoro2V`Zoz(;Q;q*#jvo@UK-58u66yW7S+9# zR@^Mkh23`3fET}2#0%H$ECP%dsm3H2e N#&CLJua)XU0ww4i0ss2-=qj^!+do&F$t-Bxr$_ znjRXofS=#lvLA}7 $6#>0a5uWoF$P`rb#Bx!Z}ZhxEAx$fvzFece}%jB zW+72=wC?NYmII{P9l67$=Ig9~=dOy3nw#dPaZ>YG`Wug$di%jrt3smQek9b76z}w! zp-%I}bNhi$^F4gLFsP0lTD{3{6e9I{m#vCQee?K)VIi0`hMy`!2Z@&|7*%O4BQTZg zp87VujcY1NSKLy%!e*Bg=}La(3Og!Ef1NAJ?5E_D(J2~#5pE~DgO7MQ6*gz(?*1FU zn#}2z-b_}dvWv+OFVTAx? *1^Yrb>bFXVkdODnbjsLw5=5?RZCRAZ=0r^{I*735;>K6Abf92lGGF)H_L`n z pCrbR?Y{t45^hqdjBfG3A8wWw^2>MQbCfLb>7!Rmu-2K-=SZ9;)a-dRub2 zXJl`pe#ixkTR~m^Fg$|;IXP=tabfWp_R4AP%8guq51t$DIXOfZ>2s`DWpX52iwWy3 zBw*CI;f@LfiIErZWu#PTwW0%CHpoojfLrdvmdw4b`+(f{3E5|Oq%E@vUbWNeM(v}k z3dw8d^dMWNwN7aLsx0<}F+Fd03F6*82~Ag|aj;##XR9L{!$OvTYMV;6=rlpYvQl=c zeVn9!XOqu~C<_dU4!WwMKdJ3rfF@s?OVSHi#yrY|t>7_cJo2!wWI8?(J7}4#+%v>5 zKs^}Mc>3*phK^Di&TtqIPJ&!C1u}&rtQEbwg9deF`q&s5n@d@hRn1Dg!K?Og&~VM9 zXe86O9>ka(s&C|Jw{pw#ZHF|iMnr~AJSM|`>S&FfSAN;p+b*}?$~M}ywwl~*xYz8+ zPx*9vL1URHqg(;n#X?u^59XhtBk5{qIsNcZV1)zw))j+u+>eCMXK9*{?S_JT<*- >|X7cw^yl5Rq$mZ^U zs88a-{&Z#qE~c+o{V++ET%A8v-eOALi5DSxU1`mhF^nQVq)#{%O{vnkg+1#w_clVT z;rOZ?SWNF~S>JG!BX2ShY%(X0;ZDScDsFBa9VOOma27>BPRAF4@PM~n>8e;#06@2q zd~h`a_2SS;&SH*r9iupcRGx{7NLo3M%A=_K_PRx4?Z7Ym+{kYlT;a`D5s7 zQu8H$rX%hss5$1#_`M?5&e?Hd0pdZqK*^HzSv5iSfZxPm(8SRuI^ff-Up(-CR@pn; z!uc%DQy8AS&-HBOf(XBN`;0VCsnRt!bAw5lOfaYW(ECst{c7nyhjqIshjuhS5laXo z+&97{mDn2?m6Oy}SHJogRmn2dQQ5Rh6xBt9Ha)STCBKkJib0mqt{ZS7tc$F?tWKn; zvg%+@`IM$kSZ48h;5bWV!P3cpLxy%gkUJD*Eqq=(JH|`BhQTSsN-?!vP$<3%gy5Pw zFhYykxTwI3s<9Dvs^AtYZGb7&rW{{ajIy6>l>H=7mZXfapH^WE2-}4)pzOv^RrnGW zHbYlA)Iyz2kR_U|#8qtLDi*lHjVWAj7+dDCgIlq9@KETml9PwZ+((ap1=%_$OuIrC z@O*K}jl#}DW(S`jU&Ilq%ZY$$VuT`f)((dz0(Jsa5e0qoH;!jw_GK=QVPi()RRd%l zPQ{Ui8+b+3w80&bAkrWLrBpB1 KpvP0Gg_Y4f zFU1;3?X6xFzBFqT9tx&^vJ(Ut1+Ji07qYI^O5rshh2;jLgFygC(FjN;M>T>})hO3Y z|0K%%hM$e$ucOFEU-VZAv{-s+&|nAkMvz9+AU9Df+y}<{VzXpS`C!8b<`F@^N|tYY z3D5_C{vIZGu%&*+lZhxB%SDQFquLe>bI2}+SSes#BKA@{9hSs@;34co)Apx#ghn2- zG`&7fmdIU>vy1seN2pUpHD<x&Z8|#oq7{wc^Kp2)^4`IZ_FOqDj&~r)HP{?p{ CX{=!&%deUB2owONUCRS!MC?KkA) z5oEh {hq&DhS2l1)E+Vg@p)D_yf}UJ)A8@P8#p;*kLOf$R9XI<86Sf!fL_ z2z4)P_RMzz^*BKfUpOKA7kg&jrMyh2@D)V_&$SqTTor+nIgbULeklXa)rYy-F2JO& zvH;UBdBAs62tV1ya(u+2hlAq9tJmMXGy9iENM$@rqr3Xxs=9}#FaAF8e*W22^cV{~ zSIP5kc~P&tXsf*FetFS@@}h?(YHZK^&CsLQkClr$NIbIndckl#B^8UECX>>*Iqyfa z*ySUChJhJ!IZpZy7Uy1P;Fre~lF2o 5Qyb z?2_YY!%MHsD#=vWRh)C#%5&a6VZ>W8oYiDf2tNku%)jOu6U#)8Yb%3lef{j6Tp0Bd zhfeS~J%@4OEXM3oW`><5NM;#cAe2dNU}W8Yp{&IqXfLBCbTEmaLV7Zu6>Mj9cj9fX zG(3#PF>vh|uoeV^uQ1anFz_PmM?VnukDLg&x(y|rg6|&x&<}c@j`!`~3IAGlct%=O zA@1mne>%^;OJ`lZbofgX)~{PwI9b=Vate;Mbn;j0kO+zq2nx14q%>CRw!LOWl@K;( zH@jYOcD=IM^(to9Gp~7TV_^k6AFXNkR!!Rpq5&&cEP0)z%QB?g1dN3;i=7Dq#mubB z-P|JIf FveyUPIqtb9)J1rS&-Y5$Ra9Iq4>Zkd)Mq5p_|%Q_W0QDjZ=Qyn#FFe&GRdkaAO`{nP+KU-aK6m9&rr`U~IDgStb8(BU#G wf`bun^Xd~7y+ zX_M1#6K$al`1!ItCURZ@B;=Z+^4_6Q&c3{O$D~*Db(C^fKy)ep6?h0k@+O-%KrQ7e z3)lqL5Me2JuoxxLEsb+f(1i &GZFtEpl3DuV4c%Idi zdyN@qojM{qV84u fHH?faLOh zd>A9{xb}-_hS-viI$qv-(lV_Y8 1IM|te-y^47SggXA;*u3eG7WF z^JL(R--0wc){vCRvDKVN8b>qqnwaS#*Rs=m*a-$#Yc+r9X#cR&{A_IipE&@0)@gpe zHh|9^06y FMyj8vogKtw9W1CbuJ#ED25Lh(rCA2&V|x!b~7D0!u?q^ =?CRbc)2r`zqtV>ugD*10zW{!j zUB9+(qdy}Ry5aRHudG$HDrcW7T9bB7?5$5mj!B91QI y!9Kt +HhgTg+|gqpx)pa~Vg z$3EhK*KWD5)&SM)OasX&U|6q>7(>Gk2`v2!5E`%qe&}`C-Y`daPm<)vIHGKee<6pD zn2s+pCEuzqB0~b@K+wd9J7`K8e;!bcz6c7f)f?2_`_${*hrb?n zAIL95zd@ju$=Bb!lb9O_gG&%%jW#~~tn>&InhuT;ce@W@*xXjsZ$J-=F(AL~7YKZ6 zph6KgetGt94S2#zXfign7u>6SfA$yzWg3gg*qy*_g2~Uu;z2=}^iEon<8k_US?e(C z;sM)2^^6Ol8^TwHsQs#yZzqqvE>a%KQ`TtC6$Ahqly*)=T~jWlMl^don=!UB?cKmg z$V%}dk~uo@!c9w%BbQXv5@;gI`N!8urb@I^>(E!k#fj=g&26vQ-I0Tmf4;L^R`2ug zMA2o`G?3K!?)WtHI$iINApdl~_^jh~I(_=j19J5T1q0T2Dz+GF#? `E zm!-7e|CQY0x7iUW6Gn1!e;nmvjPcgCTG6hELiF-7o=30ax#L$;hkZiEobA7~KCRVs z27>y}f2g;QPF%i51{_0ZF@B{t7EORX-r()F5=?TV=@E(NoAaiUZsYkjTgDrdwdJ~U z%W3egSJ*r(^DA*-CIJ29YN-fwhB?P+P8Z$nEY49iD9EZJ3`be+L2PxK$jvjWQAB za-Ip$(kKIsIDAj(cJX{q=Ch0KcH18NmZklUL*G C?U zMF;7&&*A{V0b&0@=CHM1j%})Rt+|4I*K1?s1bO3ldF5>0B#QfG9Oe-R+ 2b(jjQ4s3r?K-<|j+oiPXuuKBf`(vf3v(2BY-|Atf7)6)X4@_&8HFRcwXZXc zVt&!ygDWeJNe(7%K97cF8#|OO&%4J@o`00pQERXqPmXg-P= j3U%5F;i4D5GH{ G{u1o8td_m zKq=&r;J)5nf5^ljd!i>CpvmTHx>QzBEc3oHMZS1i`Y`=OHq!u9#H3T;GhR%Goe~iz zo;u#CNiU^&dHLL`v+!tBMKw<36}cgA8YV^2Jv)7} MiC3-FRRy52Ps4p5k-_GO0NY=l_n1AfA8+K0JYEHJa0|LvstYoyZYUr zp@syk%BMj+)DA4sOt=TaCuZ+Kjtz)wQBUyLsW2at{+w`>LH!Ac=Tne1;7C@vaRb;q zcO?_XFZ|>u`-JVFt5|)zA8e=W!mOjFSkHiOI0}bB&SWDuOFD&cmbnR%zpJt&r*|5o z#?bg;e@0Aepuq@WrY>~fdAHIDCI$O$K{g{N;|aNa(aduMbx7*m=294yXg?gkOm{5> z#T{%q^cw)Z;WvE|WrZB1-iwUx447%JUMfkJrS@||kug>?5!a;=h>U!zvSGoOXxVc| z0;aMpdVr{3x{~*`VZ?y1<<69oYbQTikC39Ye+e)-{h!hiYS*pHvf5W+j~$Y)2IY!s zTF$2;r<=W?T83Y>V)j}!{0;L-%3nUoS;4bC)T#uH#f5`KGu0oy{2k=#znR6fjuPRb zOb@7Y^%fqB)%|33R8O`nq>V |H~?tC-rztoBMfs(9b7Y5 ze`3V4CNE{hjidwmiDu~Tx=Aw{HuhC`$~FvnHGVu%nfamPl_t5=(y++ICYIg9x)aT% zlcZK+v;|Iuk+~~Tz2}h5Y1)V@tz hsKH_H?rwOa_mQS%rXA^qZ-e>w2r> zN}UPaVPgiZlX*KyynIRE4p*96`B^YAf9Vi@kgCGbCH((wV`p?Vx`I)iC?*c-6`~st z5$%tlq|ApC*kvd+%~ic-PjKq(b|IEQJXP@tVMyeXkt%E%xo3mR%b h1chyC<{dP!FF4kwX89o9r(mzQ;~qaM(?_H31%1mj|8(f+WWW!QyM$N zvrJQ!ih*|e`Esb-85~}%!=ZA9kYX`5k+sb5FB~+(9q&a+oLUJ|>`3@}SpCc~2E%u6 zUOY)ofYu_B^hEjY*4GC9?%AK-e?5Nl?D5UvyYOI#+)(wa_tppqW3 zK-UeWyWUGCv0Ka=rPF=$^_M71zIYn4Z9aTpAsjx)>-NP{X@L-*V4m##TF?p_)C#%a zsvVHa*aE@Yb1X!<$*e|9GNNbGkkJIEN5`t1IA&ZJX0sWs3)wjWg`uyjC zFoOrKFgi@m? p?48_UHGrwLI6rGC5+ZD@vLMb@Y17$ zcggeUytV*=HeBp>@vq)qy{-*xC86Z_SOK6W$;Ub*cLLM6g!Ov*TvQM>V-8=qM &>amGD jUzW*&*jBz^p{CfRuj!$j@33jYhp}wi zpqwJ2;!E`G7NrQxDtwnLn3oU+8BpSx<)W8?<{>V<^S QGpA$*619g= zkV+QiK@F7of4sKDpP)F>#LOEy_c?1F#IX3?mb+|?PnX9@+G5Kr<0-e>VL7r8C!qic zk+=_(Okse>DJ;>@-#?g*=RZojN>{%pQI^5ErmZX&C2s_UXsKBScZ#5qn7$|)AwGnD zvLYA;{F}h;;2N~V09KQd*-?>_c<7ZD^jxLdg#L7af2%d!A1~36UVoG3^!gVvsy8c` zru7cG<=zdl)j#s$!L^uTbTYI#0LsK`dfEHpb9Q)LQF#e7xETMKywAo;r7g$6ByEj? zVNgM)WDM7sxXLd5!=}5`9c+Ls=M!#N?)g~U e#E|o#(u@@*2>12EWk$8Q!{W3kbH_zGg$Yx|KERxox|X^ zi*@OJz_4EHb~@y=V{c}&Mb%#Z@P9x2pAY}zmwyL;|F;kS`@>&9{1x5q#O{@;txa(y z=f+A)VD3&4sQ!^>?qc}>rR#mH)6gPSwMW)Je+1XXTgkeJlh1n;Z`X=d@RY=d#72Or z`eMfc=|X1_k=1xKV~yY`Xq NoK&@ zgk6{x)p|8N=f9&R5$C+eo+Y7YxM08+sP+_1WAN;Es=Wyb{6uuR3Fkm>Wf}X*RGs>3 zfBHs!Bqzq=rp5&}N5-g vv<#YT&O}s+Nw~mOTjJ3 jb; + JsonArray& arr = jb.createArray(); + JsonObject& obj1 = jb.createObject(); + + obj1[value1] = 1; + obj1[value2] = 2; + obj1[value3] = 3; + + arr.add(obj1); + + arr.printTo(json); + + return json; +} +*/ //=============================================CONFIG=========================================================== void saveConfig () { writeFile("config.json", configSetup); @@ -159,7 +179,7 @@ String safeDataToFile(String data, String Folder) // addFile(fileName, GetTime() + "/" + data); Serial.println(fileName); - jsonWrite(configJson, "test", fileName); + jsonWriteStr(configJson, "test", fileName); } // ------------- Чтение файла в строку String readFile(String fileName, size_t len ) { @@ -218,9 +238,8 @@ String readFileString(String fileName, String found) return "Failed"; } if (configFile.find(found.c_str())) { - return configFile.readStringUntil('\r\n'); //'\r' + //return configFile.readStringUntil('\r'); //'\r' } - //return "|-|-|"; configFile.close(); } @@ -260,7 +279,7 @@ void led_blink(int pin, int fq, String blink_satus) { void getMemoryLoad(String text) { #ifdef ESP8266 - int all_memory = 53312; + int all_memory = 52864; #endif #ifdef ESP32 int all_memory = 362868; @@ -276,19 +295,19 @@ void getMemoryLoad(String text) { } //esp32 full memory = 362868 k bytes -//esp8266 full memory = 53312 k bytes +//esp8266 full memory = 52864 k bytes //=================================================================== /* void web_print (String text) { if (WiFi.status() == WL_CONNECTED) { - jsonWrite(json, "test1", jsonRead(json, "test2")); - jsonWrite(json, "test2", jsonRead(json, "test3")); - jsonWrite(json, "test3", jsonRead(json, "test4")); - jsonWrite(json, "test4", jsonRead(json, "test5")); - jsonWrite(json, "test5", jsonRead(json, "test6")); + jsonWriteStr(json, "test1", jsonRead(json, "test2")); + jsonWriteStr(json, "test2", jsonRead(json, "test3")); + jsonWriteStr(json, "test3", jsonRead(json, "test4")); + jsonWriteStr(json, "test4", jsonRead(json, "test5")); + jsonWriteStr(json, "test5", jsonRead(json, "test6")); - jsonWrite(json, "test6", GetTime() + " " + text); + jsonWriteStr(json, "test6", GetTime() + " " + text); ws.textAll(json); } @@ -345,7 +364,7 @@ void getMemoryLoad(String text) { /* -String getResetReason(uint8_t core) { + String getResetReason(uint8_t core) { int reason = rtc_get_reset_reason(core); switch (reason) { case 1 : return "Power on"; break; //Vbat power on reset @@ -365,10 +384,10 @@ String getResetReason(uint8_t core) { case 16 : return "RTC Watch dog reset digital core and rtc module"; break; default : return "NO_MEAN"; } -} + } -String EspClass::getResetReason(void) { + String EspClass::getResetReason(void) { char buff[32]; if (resetInfo.reason == REASON_DEFAULT_RST) { // normal startup by power on strcpy_P(buff, PSTR("Power on")); @@ -388,5 +407,5 @@ String EspClass::getResetReason(void) { strcpy_P(buff, PSTR("Unknown")); } return String(buff); -} + } */ diff --git a/mqtt.ino b/mqtt.ino index 61e1b97d..ac63248c 100644 --- a/mqtt.ino +++ b/mqtt.ino @@ -22,20 +22,20 @@ void MQTT_init() { server.on("/mqttSave", HTTP_GET, [](AsyncWebServerRequest * request) { if (request->hasArg("mqttServer")) { - jsonWrite(configSetup, "mqttServer", request->getParam("mqttServer")->value()); + jsonWriteStr(configSetup, "mqttServer", request->getParam("mqttServer")->value()); } if (request->hasArg("mqttPort")) { int port = (request->getParam("mqttPort")->value()).toInt(); - jsonWrite(configSetup, "mqttPort", port); + jsonWriteInt(configSetup, "mqttPort", port); } if (request->hasArg("mqttPrefix")) { - jsonWrite(configSetup, "mqttPrefix", request->getParam("mqttPrefix")->value()); + jsonWriteStr(configSetup, "mqttPrefix", request->getParam("mqttPrefix")->value()); } if (request->hasArg("mqttUser")) { - jsonWrite(configSetup, "mqttUser", request->getParam("mqttUser")->value()); + jsonWriteStr(configSetup, "mqttUser", request->getParam("mqttUser")->value()); } if (request->hasArg("mqttPass")) { - jsonWrite(configSetup, "mqttPass", request->getParam("mqttPass")->value()); + jsonWriteStr(configSetup, "mqttPass", request->getParam("mqttPass")->value()); } saveConfig(); start_connecting_to_mqtt = true; @@ -45,8 +45,8 @@ void MQTT_init() { server.on("/mqttCheck", HTTP_GET, [](AsyncWebServerRequest * request) { String tmp = "{}"; - jsonWrite(tmp, "title", "" + stateMQTT()); - jsonWrite(tmp, "class", "pop-up"); + jsonWriteStr(tmp, "title", "" + stateMQTT()); + jsonWriteStr(tmp, "class", "pop-up"); request->send(200, "text/text", tmp); }); } @@ -134,14 +134,12 @@ void outcoming_date() { sendAllWigets(); sendAllData(); - - if (flagLoggingAnalog) sendLogData("log.analog.txt", "loganalog"); - if (flagLoggingDallas) sendLogData("log.dallas.txt", "logdallas"); - if (flagLoggingLevel) sendLogData("log.level.txt", "loglevel"); + choose_log_date_and_send(); Serial.println("[V] Sending all date to iot manager completed"); - } + + //======================================CONFIG================================================== boolean sendMQTT(String end_of_topik, String data) { String topik = jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/" + end_of_topik; @@ -161,7 +159,7 @@ boolean sendCHART(String topik, String data) { void sendSTATUS(String topik, String state) { topik = jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/" + topik + "/" + "status"; String json_ = "{}"; - jsonWrite(json_, "status", state); + jsonWriteStr(json_, "status", state); int send_status = client.publish (topik.c_str(), json_.c_str(), false); } //======================================CONTROL================================================== @@ -172,26 +170,46 @@ void sendCONTROL(String id, String topik, String state) { //=====================================================ОТПРАВЛЯЕМ ВИДЖЕТЫ======================================================== void sendAllWigets() { + +#ifndef layout_in_rom + all_widgets = readFile("layout.txt", 5000); +#endif + if (all_widgets != "") { int counter = 0; String line; int psn_1 = 0; int psn_2; do { - psn_2 = all_widgets.indexOf("\r\n", psn_1); + psn_2 = all_widgets.indexOf("\r\n", psn_1); //\r\n line = all_widgets.substring(psn_1, psn_2); line.replace("\n", ""); line.replace("\r\n", ""); - //jsonWrite(line, "id", String(counter)); - //jsonWrite(line, "pageId", String(counter)); + //jsonWriteStr(line, "id", String(counter)); + //jsonWriteStr(line, "pageId", String(counter)); counter++; sendMQTT("config", line); Serial.println("[V] " + line); psn_1 = psn_2 + 1; } while (psn_2 + 2 < all_widgets.length()); getMemoryLoad("[i] after send all widgets"); +#ifndef layout_in_rom + all_widgets = ""; +#endif } } +/* +void sendAllWigets2() { + File configFile = SPIFFS.open("/layout.txt", "r"); + if (!configFile) { + return; + } + // while (str.length() != 0) { + + // configFile.readStringUntil("\r\n"); + + // } +}*/ //=====================================================ОТПРАВЛЯЕМ ДАННЫЕ В ВИДЖЕТЫ ПРИ ОБНОВЛЕНИИ СТРАНИЦЫ======================================================== void sendAllData() { //берет строку json и ключи превращает в топики а значения колючей в них посылает @@ -216,32 +234,7 @@ void sendAllData() { //берет строку json и ключи превра } } -void sendLogData(String file, String topic) { - String log_date = readFile(file, 5000) + "\r\n"; - - log_date.replace("\r\n", "\n"); - log_date.replace("\r", "\n"); - - String unix_time; - String value; - - while (log_date.length() != 0) { - String tmp = selectToMarker (log_date, "\n"); - - unix_time += (selectToMarker (tmp, " ") + ","); - value += (deleteBeforeDelimiter(tmp, " ") + ","); - - log_date = deleteBeforeDelimiter(log_date, "\n"); - } - - unix_time.replace(",,", ""); - value.replace(",,", ""); - String to_send = "{\"status\":[" + value + "],\"time\": [" + unix_time + "]}"; - sendCHART(topic, to_send); - - getMemoryLoad("[i] after send log date"); -} String stateMQTT() { @@ -312,7 +305,7 @@ String stateMQTT() { /* //----------------------------------------------------------------------------------------------------------------------------------------------- - //jsonWrite(tmp, "status", "1"); + //jsonWriteStr(tmp, "status", "1"); String current_config = configJson; //{"SSDP":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1"} current_config.replace("{", ""); @@ -329,7 +322,7 @@ String stateMQTT() { state.replace("\"", ""); //1 //if (widget.lastIndexOf(topic) > 0) { - jsonWrite(tmp, "status", state); + jsonWriteStr(tmp, "status", state); //} current_config = deleteBeforeDelimiter(current_config, ","); } diff --git a/push_pushingbox.ino b/push_pushingbox.ino index 6e89ade6..331f4eb7 100644 --- a/push_pushingbox.ino +++ b/push_pushingbox.ino @@ -2,7 +2,7 @@ void Push_init() { server.on("/pushingboxDate", HTTP_GET, [](AsyncWebServerRequest * request) { if (request->hasArg("pushingbox_id")) { - jsonWrite(configSetup, "pushingbox_id", request->getParam("pushingbox_id")->value()); + jsonWriteStr(configSetup, "pushingbox_id", request->getParam("pushingbox_id")->value()); } saveConfig(); diff --git a/set.h b/set.h index c3be5731..cb408502 100644 --- a/set.h +++ b/set.h @@ -1,12 +1,13 @@ String firmware_version = "2.3.1"; -boolean flash_1mb = false; //----------------------------------------------------------------- String last_version; boolean start_check_version = false; //#define OTA_enable //#define MDNS_enable -//#define WS_enable +#define WS_enable + +//#define layout_in_rom #define TIME_COMPILING String(__TIME__) #define DATE_COMPILING String(__DATE__) @@ -15,9 +16,6 @@ boolean start_check_version = false; //----------------------------------------------------------------- #define analog_update_int 5000 //----------------------------------------------------------------- -#define ph_shooting_interval 500 //интервал выстрела датчика -#define ph_times_to_send 10 //после скольки выстрелов делать отправку данных -//----------------------------------------------------------------- #define temp_update_int 5000 //----------------------------------------------------------------- #define tank_level_shooting_interval 500 //интервал выстрела датчика @@ -26,7 +24,8 @@ boolean start_check_version = false; #define dhtT_update_int 10000 #define dhtH_update_int 10000 #define dht_calculation_update_int 10000 -#define statistics_update 1000 * 60 * 60 * 4 +//----------------------------------------------------------------- +#define statistics_update 1000 * 60 * 60 * 2 //----------------------------------------------------------------- @@ -80,10 +79,10 @@ AsyncEventSource events("/events"); //--------------------------------------------------------------- #include TickerScheduler ts(30); -enum {ROUTER_SEARCHING, WIFI_MQTT_CONNECTION_CHECK, LEVEL, ANALOG_, DALLAS, DHTT, DHTH, DHTC, DHTP, DHTD, STEPPER1, STEPPER2, ANALOG_LOG, LEVEL_LOG, DALLAS_LOG, CMD, TIMER_COUNTDOWN, TIMERS, TIME, STATISTICS, TEST}; +enum {ROUTER_SEARCHING, WIFI_MQTT_CONNECTION_CHECK, LEVEL, ANALOG_, DALLAS, DHTT, DHTH, DHTC, DHTP, DHTD, STEPPER1, STEPPER2, ANALOG_LOG, LEVEL_LOG, DALLAS_LOG, dhtT_LOG, dhtH_LOG, CMD, TIMER_COUNTDOWN, TIMERS, TIME, TIME_SYNC, STATISTICS, TEST}; //--------------------------------------------------------------- //ssl//#include "dependencies/WiFiClientSecure/WiFiClientSecure.h" //using older WiFiClientSecure -//#include "Ticker_for_TickerScheduler/Ticker/Ticker.h" +//#include "Ticker_for_TickerScheduler/Ticker/Ticker.h" //--------------------------------------------------------------- #include WiFiClient espClient; @@ -134,7 +133,8 @@ String order_loop; boolean flagLoggingAnalog = false; boolean flagLoggingLevel = false; boolean flagLoggingDallas = false; -boolean flagLoggingPh = false; +boolean flagLoggingdhtT = false; +boolean flagLoggingdhtH = false; const char* ntpServer = "pool.ntp.org"; const long gmtOffset_sec = 3600; @@ -153,3 +153,5 @@ boolean upgrade_flag = false; boolean get_url_flag = false; boolean start_connecting_to_mqtt = false; + +String test; diff --git a/test.ino b/test.ino new file mode 100644 index 00000000..c8bad15d --- /dev/null +++ b/test.ino @@ -0,0 +1,55 @@ +/* +UPD +String br = "\n\n"; + + +void info_init(){ + server.on("/info", HTTP_GET, [](AsyncWebServerRequest * request) { + String r = ESP_info_html(); + request->send(200, "text/html", ""+r+""); // отправляем ответ о выполнении + }); + sCmd.addCommand("pwr", pwr); +} + +String ESP_info_str(){ + br = "\n\n"; + return ESP_info(); +} +String ESP_info_html(){ + br = "
"; + return ESP_info(); +} + +String ESP_info(){ + + FlashMode_t ideMode = ESP.getFlashChipMode(); + String message = "hello from esp8266!"+br; + int sec = millis() / 1000; + int min = sec / 60; + int hr = min / 60; + message += "Uptime: "+String(hr)+":"+String(min % 60)+":"+String(sec % 60)+br; + message += "Vcc: " + String(ESP.getVcc() / 1024.0)+br; + message += "ESP Core Version: \t"+ ESP.getCoreVersion()+br; + message += "ESP Sdk Version: \t"+ String(ESP.getSdkVersion())+br; + message += "ESP Boot Mode: \t"+ String(ESP.getBootMode())+br; + + message += "ESP Sketch Size: \t"+ String(ESP.getSketchSize())+br; + message += "ESP Free Sketch Space: \t"+ String(ESP.getFreeSketchSpace())+br; + +#ifdef ESP32 + message += "wifi station get hostname: \t"+ String(wifi_station_get_hostname())+br; + message += "ESP min Sketch Space: \t"+ String(esp_get_minimum_free_heap_size())+br; +#endif + message += "размер свободной памяти:\t"+String(ESP.getFreeHeap())+br; + message += "chip ID:\t"+String(ESP.getChipId(),HEX)+br; + message += "flash chip ID:\t"+String(ESP.getFlashChipId(),HEX)+br; + + message += "размер флеш памяти IDE:\t"+String(ESP.getFlashChipSize())+br; + message += "размер флеш памяти SDK:\t"+String(ESP.getFlashChipRealSize())+br; + + message += "частота флеш памяти, в Гц.:\t"+String(ESP.getFlashChipSpeed())+br; + message += "Flash ide mode:\t"+ String(ideMode == FM_QIO ? "QIO" : ideMode == FM_QOUT ? "QOUT" : ideMode == FM_DIO ? "DIO" : ideMode == FM_DOUT ? "DOUT" : "UNKNOWN")+br; +// message += "IP address: \t"+ WiFi.localIP()+br; + return message; +} +*/