From 2a9e4c3769c6877473f57035026547020ae71fd3 Mon Sep 17 00:00:00 2001 From: nertyog Date: Fri, 7 Aug 2026 05:16:40 +0300 Subject: [PATCH] fix(watermark): add interactive HTML5 colorpicker, unique cache-busted preview filenames and exact product canvas aspect ratio --- image_optimizer_nat_OC_20_22_1_2_0.ocmod.zip | Bin 799809 -> 802936 bytes upload/admin/controller/module/img_opti.php | 503 ++++++++++++++++-- .../admin/view/template/module/img_opti.tpl | 6 +- 3 files changed, 472 insertions(+), 37 deletions(-) diff --git a/image_optimizer_nat_OC_20_22_1_2_0.ocmod.zip b/image_optimizer_nat_OC_20_22_1_2_0.ocmod.zip index 39dff49cc240af7648bf6bf12b14a1813d9be644..43d8091d39e8701215f4bf433278714aab6efd5f 100644 GIT binary patch delta 51752 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 delta 48604 zcmZshQ;aT57p2>_ZQHhO^E6M}*4sL5+qP}nwr$%z-#^LRO{KDuUAL92?5t|5H<%|7jfCf0~+i4T>GVi~YZc561sAkrtQ%*_s+s zfANkY;aLI*XmSb|h&DbKH+7sE4i#|iYwNwq(Qx+aoAZrWwMu_1;U~Rt^}Ol+yLPWJGz0vH3D@$h1garo?)c@!1?B0g& z^U`oZdG6CVEoy-d`(>c?Q*wT0e?RhjJ3H|^NOONe=I)m0Jx&8LX!rLcwHNSX#uPru zvNqjVF-DnK}do}z;iJPsGVmzRMPDv~ni~K_y7D>`` zRn50#pede}oY*GwSfwUY@ASAR%>yOzXagi3$c9Tn=tbLw@kWPuNJEh~xy(hc*-Gij zNA^3izRo8g>$Q&tZJ=2CR~eung}@CCB_ka2{zpK*!OFE$t|GB1gN#2WDqnkBK(@kw zOX0vMBU>CjDLmqh-zb$xT|~-~h@CRgK*~V_%p&_6ULEQT-at40i$zg}tguZgf^&a< z2hh92D-dpQlg%gSfzt!q(h_)gxA#V-2i@}#vFe7bs4@^#)LL-&&jj#GLNC1>&13GV z-EFiL&gEVp9RGKoDi+#bSDa!{-?qu)?2ipEm*FJ=)Skc0f z4i#pZUDVO*qJ_}WH63G(TtmnOg|q;9hPj8U6E}{bN-7{d@m^bB;&j}sdLJhZkdrN5 zWx9rlQ~Njl@%i(}tE#JV(q8jW)E8YlUQb3wWY`IRA zlN7FDlY}YFhXu)>4DTq7l$FUF7}XY5)}&L2_+XQiql^xxga|LB{g4C9T@(n^s|!t# z`H5oyktxiPD+h<3m%&gONOgxUypJh{9~l}2Vv$Hp;`JCl@?6E7-InVO}goGNP%tFOml{>hsG zasDNJut-us86aU&baQvhy#==x)<^tel?TX&SPQ0lV(5IpDj|vIq^Pea)@6(e`s7SC zN@rx#{=>WuVgXRg8rLCFAYUHIYt2A{K7cKUthbbf(WBoRWAtE3bCbHMfb51?#=`~Y z%|=4^Lk)4l5wMh;4&{YaeDRI9hzv-vhP&q9=@Xhci&GrBZ(AutWK_4yn=|TS8xQ8+ z8|S<)(W(-Vi7|W5A&2Z-i&wtLzX>p~)SX{l4+X|kX#!d`M)zbLQ1i2GAe=bJbod0a z$wcX5C3qd^L3q(Ifd7gv)0O<;Dj)OTf;kO}fRiHWRhj}rU|j6?lwGb$GDl}c%L5M$ zG8W)(mTxNww7)3esu=iVy~%zy@}4whZ<-brX-bBf0Zci=EU zid)i(gQTekV}j$a&_i;{FntWe(xHw>0rSiVss`+U$bZToR~vRumD!6Vr02o6WX+m; z3fm+{HY$bKnlV8RK^MXj)mZoU%ruS{4;5<=C-@*CV+|AAQ|Rurwx~NAOOZ8(kHPA> zle>VQUV3)FIB3K@fa*2Xv$N@c4zK%&B`tSJ!Myq6{Kfv{7@rmC)oCxzF+}nvCC_@e zp#*pmPo8~`@-s@AA-w<7bghHwWs+8rKOK{SNg5=n6h&Oy0!YhLR1;D`` zoDL9u)}pOLeRU5^7tW&K5`6}l2B+eAatEGubUW@JIY~BgV0kd94vwT5@#C*;AQz5) zZ_O#hCfK)?SthbtflqN?n|d~T)^Wf^-{&7Iac}B`gE;g3%pa;m2h2!KsUwg_ z3Nb}~S&TgK7FabkdG^#$Pylvi3*byQRmu;_Z?}Hc#g()5a7{iIOpZ-_3v^NDS%#Pj z(#W7DQ&BjgP9oaGELg|J8I)=E%R0!D>Go?*ag?}fGK6j{^7^(Czx`%>?1~tlXfPJt zmc%3P^GtWC(;e~)=+b#*gK)|0Ma|6?JS^kh?WiB6Cc}3_HN4{zxd$ zsug8)tB*l_=C1~E>%M`=?3dVn(!?Gti0z6Uih8}Ih*sb?t^u91)_?C2~e-(WhlZ3ds}K$w`mdO?X2Hj2;}-Bi1JSG0L}(OR9*v{3zC3! z>Z};z+^P_GaAPPLQ#kUf-dtak3{%IIG?qGkClH%K%!X~Vu5}z&l@x}e*XLlFgS=M7 zx(WoWY|K9|iQYtly@i77{wg7T@AbwY8i>~#UgO{1;N9?(@4mPr=G<_i~N(0e02{3EO&Ujg6vDaO&!a*W&s{heixBWtCC$(yqM2wpJFsY%tQm zf~eR-ZIvzx*>I1aqZB}uvE+?Cqg1aMKIaRm=#7}hq#~AeD#Ps`1Wb66T%goePI(Aj z(8Yg31U&y19=@KKh}VGOFYS9Y_o(8%X0AKSe{u*6vyhpL<5u2Fs4}Kx4Fh>b);i)Z9juM*kz_?huI78A!Ii7GUHnKjg zw;Q__lMlv`x>e6CyGHd7B9U5E3mh@S7R%P{H`0%B01ZQkP^4qF5%MD62OBGJYxELF zyJu83h?-{8%O~2#CHJH?jxR8O4uq*1M`axpfJQ^(QKwnSN^q`(g&R0826`rkw9-(C z{78+o&Bke}V8>Qn_{}2JwEJ2|ED6((*N9AOY+utFd~R=(M`wTZBQ2wOw&AeOh7*JA zy$((cKoVQ@tLnHd(+wQ+sAvL;6YuJi#zi*>-6ynEpjT=#45hM{JqA01u3$9jONa|A zfOwJxKZNZD-m-6HMWYT_S93+>_oR4h^2Z27pW}#M3h*+r>>~2+I!?%LwdU=L^8I=l zl-O;evU!>Kw{lk`s*ONwyGltoNOA;Bl$yQ`z&mul;nL=)lvS0f@`96y*a*!=eKpum zTdm0R#+0SbS=r1vUbC{(S^Isd!k_NRN|ahxYx7cLapd|~TN!5tHX>X~lesQF2gqGG3|WJot{U+PPBWvdI@p@ODjw; zv$CxJEGk!u-5GyY6AJ93rnw{ln`7ztq2>2yGW&Kvt&nPOjT^D@-p8wA^>Q8;uYChC z;;8wmezTHeEcEurb2S^zPh|S=iOVVr(85pn>iD8##bcAi)L<*%UM_S>kJ^$;Sd)p4Z4S?k^q7# zQwO_45GWsi1k-$=hDnv7sbAGSn03-WRcdn)-y^KC!JaJ98vSqc+yJk%TGKNQ!1iFf zY)N#;bMb3Pw=g)uqi};W+UchNfe>~f6GeV-UT~AxrakWb56ShSr?4XBiMo|zM?Yg!J!4A6u#3|z$Z01lS z1Wv5M0tSMr)%6%EI{-UFA=0T2&?HkrADVhhPGKpcy&jP(LdTXrBr@9JgP^yJA%UU% z8MJo^J+)$T1%cxTG|s2g$MkQ2sUm_b{v+@ty6>@j1f3&=^CYHB-U7OjJ{h)Bjpp3` zs0F^D;`OL61?QNlcWGynJZ~pUmp*a#oXQbJCqFb$)I;aVwF zQC`WCJou=2u^5vSKv-6-*&*%`<8`?LUcu?zwbvZoJ*kub*tVMrU;{n0XA%?Q{8dC+ zU$Y}ck>w`c2%!w2rubH6-^5j4zK0%!{B&fKkZUZgG;CNKe?GJ(xh4p86s9nJsx9td zr?p0s8xXJ|yu<{V)~MRo5Vz7%$`!arEPl8Vo;PzBh1&uISV|r3*2SxP86mrDt~w?h zryH2yCkoyUu671(+lX0Ol^1V_597eP8s>G^iBP`9bbE7i0GJGO6YQB_p{9&(YplnO zNIfU1rYiYz$dRQQi_6mv`LN`g&y!)R8>AgQK)4k0)$&;yi$`nQUD~(|{ozm3Y;0%J zr532mk}Hn~#KG0Oy=|vla^`4q6PrLtL;RyuoBY<*d<`s)<%yA$Ueq<`s0fFz?BKei z+rg}va*JN5=DMFsM`ZC`SZSAom~cjmH-HNLAu_s$uCL<=^57tiDjdPF3vDeytm2j1 zVgGwcImL83HYLtFH=SUdk-~PpCSyXZMYh~ER&@ytC|i!ZPIpf&Y}M)mfqiXZuJ)xA z1~surZu>r&)3i#(IwG3SQypYsT%tqLT2f5HkS%cJ|Yd`wK82d@~up^Z+-~WX|KnAk!F7^RW6+2uU9OV zkJdHRyL`WK$A0awW3O!c6)9W!K!I$ZJR8V7{-P7+8gcZb8sWlOJ(rSsXV`W&!u{uU zU}P^AX_aK#;jr558J_{ZbPQ< zOvkdpok3;S5xN3qRd*G~sOx@pC{`G?q2rt?ba?ybX z2vVS?PMRjbRhVMkM;os)6zimo*xVOh7yymbX*nzjn%Ef$+=X9wMZ6Nl4R1f1vII4r z(Xh}@BkMs6bD_YWDKUDVz*0cDJ_Z{w%xfZIIFQ(sQwHvyMGj^cCVppQ&i7v?4z5xn zdp5YcxHuG(T_swQ}5jnndjC(9R8P)h%@Lb5f;yZrL@@Oq-!!q^n>Wc25-T^Y$PiKMM$*X5f5q>OY= zIdvV2C7NDge|a*Ff}9(ca-V}RAv=GgUVfI_Jd6UFzvkp#)NfKpm>NczpyW0~8nq{F ztb(ofE)ZlA{F%2vB`yD7V z4%34wyKy*-5(N18{RE{8_Bg#y{C`FZcyTo+Tn_eS^^TL*F@Y z}(yqU4l$soqI<$%Q;I@@=)Ue6puEHo2 zEfY&($@IZTL@rT_a;4chs-`f3AwASVIbHu2$vT0bLEc zT)69X5lZ)oi$D;-m(qF6xw}=$R+Rw76HD{(WJ+wJ;1Fg9#P^6Y81}^qX&R#_k{P@z zCb@a|a$;EXgGSRL@D~0Azu<4Bx<5L%f_fogm|53zgl2g=ct3h7GceRAR&JWtI%i!*$7E27Fd+UcK^nd)PklYttI<03;@Ekg|CVI|J4eT?Q88TpEu z9@Q%K>+BTfY{uuQAe0d=VCg=G2G&#KnW13aSk@hY5~@G2ct-y>o|zL>RC5ki&zTvi zhNPle6V1qrOdW&oFV2??(^%7i|1{OV97&0wUT&HF zAkyab;)Mv9IZi0+-p3vCyR|i80ohFj0&F}isaWHKfN+h?kmsTcg}WJR0EiZ@m-L@{ zBy;W^VR)s8O??1;N{h37L78P9f)TQEnnWf5VnyI$t%X1za2N1ONAUz7M1$zh58R9D zIIK}9xzM0P`!JvP*{G|_pRGB5r-P%PQ`)G_64ih=%$;;|drzz2vd!#!Rs{Js95B!= znXv3U6oqI0?Z4D9RYxJxGvY;h_nET*v;J(zl-+1x!Cj25F#aXaX_mXEu6n0Rx)uZ2 z-$qu(9?^ydZA?6HR%|D@Ez$mleVQ=wbr%oCQFC1`4{`4 zr=bZ#tGvZoHR5ySU2m%(w&wUR;%WoXxhP;?aU%d!r(0)W%7D0-aQCS4CTPK=%16>| z5ZzO~%`#%9q|-B#)|$9c|G>4Sa_Vx5ZG&|hH!e1^Ho`8j6GiC_AAKshV4cuElY}=f z#8mH>iEB|{tkp9l{-6(T-swngT2*!&_45>^Ew4CcF+APlHYy(!i3ht+^7{iYKh&@5 zM&I(S%jfH!%x%d<*WA#ZiD0Xg5C|P2%$}*FnFWzLt#1|s&>;^?90h)nt&IUH>DXcX zew7XgHFjyv7K(vL&Ncdvc6B})^k60~oJ8v64+F6(DjifjA8$sk1_z7tWN1A^VQd9u zJlPA=rf@4unU&9iOq=nB5`zI<28yjgjFXa=NhP+r3s&!-kP2(+BSnIl40I+SYi><8 zW%JhQ#B%ut#Hbklk4~w+-R3rSrVPTD9P^D(*j;O&L7W@l7U%O!-GA`$a}JbOmKU?0 zmRufhu0)ki5?!#qu7AEi5ree(@DiGDPdJa>M+O}}mANBXS6=s1&DsFpCzB8OZtPua z2n72RDVT9j3vRcQEN>M=i|e8)KL3(J12=)B!`2O)m<(6kzh9COuyAUO;e`v&H&&Bf zR18j%~0q^AY>dYsD)FZ$|32l78j{o+;nSGZI(w6@fJFS(hCZ(GcuIk4+P>ow4)whL% zbVs#Kn;E;>qUi?+f<8^k-K1#-X6l=dpy;?6C6HWalqwyZ^kji2bd2p*0PyYZMk``q z?IlgrVi|SJbe4F<4+SByDxAIO7ITj#4&_z8e&J@vPOAE=!#!Zd+yz5#tpOqNz&>S` zx#PW{81fydQ;N-rDr2Qhf#ZTn3Xc|zUHgSEE{s(yk)W^I>T?Tsw?nWFe{Vu`f)P?ufQ2dCk&>X(AA*wa^jw4d#uMh!`xW z5IX=H;DIcsUW-l6LFe&W?L*2c|JHQQ17zGIa((<%f*werH4(^ zoN;iuW=dMzI3Ku8lJn8PouU<5L>}Lj^F6`Bd{p$Y)tcNp{I?cM%W2u9uXK`PikT1sExm?nfH zgbc7+ia*SLxXy5mvk3K#taWA!>(@Dh?3wC*8H=M;1|=jWAkdg2sqV+{d?mBb*6a(@ zKARgwpNkG{m^AhICltMce1l&;54$?aFlq-}9nlMzfZxlQ-zAp%tpFuAZ0j(*fQ#OyW;S`81ifZS5ecaRrnH z<^{OSb76JfsIE0`eH*zm325GS3dubmj3uW^+w8JCv9fFMu(zDVp+Q8djftS~GE3BI z6^@j>Ry)1eSVgDd7J)_wf!Sl4Z{W7ZgYc}@wOaSnLJ9mUa_Rp>8&D3p#ZFsl*GCuf*$En0)zm@KVo_b4q_bUpGE7n!bDJX^X&s3K7E1r%QpI5gr z+Dl^(Ur|F$k*HU0uKVDizki|}vaPc|e9DKJF3?Mp>!#$xITK-{8gW=_0%{J(He$*G z=H$rO*-o@&F0SrRb*w;Z+I~i~PK73FCJ_DD+!-8VUZht#{VJk^uI8?#RJNy=WN6 z3!PKq;%Gca7=-eGhsT!?z(jF1^f+#`dftx*MR-wO4hpzy!z(pfVr;dEPUja(Y&f{s z7|B$C(J|n8u|NY>ca$EfVTnif2RS-p79jEy%PKU*`&wdw&huJ>%ZIA}S6yvDWjFyQ z|Hc~2#b&VNwj0)* z-&?|(I6ssw#gM<9_`{ifjTXeLOfg+GScGPp8t^rh710A$*WT{k z)and^t#up<`P=9Ycp9Al87EM;qm-*{l-HKm8uRNP8W%it~jI|*8NMH z8o>?c&0r~C6RpcHPISkU&9k(aG(~3ya}4dE9v_pPaEdq&IE1v>)k)xhP1+0qw`A%_ z(XsZ5H~qVuX6L!G>E-%~Lm|&sbbc#_Tpg^nx(0(ppfUX~W;^Y)vW28S($IeTeJ|E% zr^HrUOEtw)9bwS8X0Dk%YjJgjiN^Z;dSoF&k&A!0Z2ERGjR7HyGZVbriHf!Zmg>Qx}@t?TrOn2Qr>NPVXoHE@?_Q!*UI6eN~2cf zqzO5)M+qAVG-&wJ?@KKk@cs)y84~W5_R_P*F$xx~$CY(2cfJyAshcwxXhz@Hf0?M3 z4D=JmdLN*bNNY}G$J7IL{FexNAoF)T$%Jx4M=~Vat5_%P3sL=qiyY#`D)D7z^A}w+fw#_CmBpeF= zwPga3e)weXZs`UE<7jbza*7M*5?XqM+1=Nh_5RiM#e;|$lIgK?nH-zZblr)}tRnmk zjZ0iw>^o?~HVTpLvL$>>52#5}z0h80+h}e@!iicr_0T%|Aqi93qL$x#Ti_A{+^$3K z?z1GTThd9)qOffn+iA?j*l@d%0PsdDdC-isL8PvCo?t}d>BGnsyyJF67C}Ns;G7kh z`Z9IBya^%3;i~t|I!jO&1Nwo^nY_#0G#3lND7iKjT6GdGy+kB<{=B!iS&k3*zrB+$ z8y{0m;ChLtBX7|0&5M{%A`eOd>aRicVmnII$&?ymt<0;G=`gTXd@dI4TQ%!&4!=lS zNcw1G8g1>oynu-w7X9E2(-v_wH=~b)i0+Dh8tkyVrlE^oVVeJ2k|UJr+;wXWuv#-khSA4rQXzf*b;K>_wA?6Q>Iw}Sh?rA zh*|D{@nKY?y-E^3cK}${Sh#*cX`~ZGMs$F^-3>t(7Z;Df*7|m2Ol;5ZOz?#N7k_7D z;>v)%y+}{SZ9n$oCYw3{YQm2dD%(h>1oKK~aOz+c;jG5MxAlxezrArq+MO&vv66Bd zW~M_98vA$76W{8YQPj7N)dtUHTFsMEIIRPQF-$-{TDcV<=M|KhDCfGDYn?a3 z;HqomdpGFN&tWzFSPWo_8@5NAIlu8Oo`?WEN7^`raNOIX=ZGY(nl8ez7s)|xHWDEU)l#AG1TSZsJpm()oa6Q(pSO;@m zJ4Bf?2_{ayH|2;?q?DFu9f0chod7Ld#N9+URHD+@xcmT&#d6v+U?RCcFv6L}T^3?i zhEp2b`G3a9kAM}t#}}5DBYUhBdaXDc2Nv6BJY%`~#sG$owwU&aAhOc@FWXZ|m^Vbg z_B`Qr>_t zLgvck;4A<(9NH>JV(;f|H^Ld!AGw{cKl?=?Wu?;aT>-zTm3n{NyaYok1LcZz%B~cM zH0tl*2B9+b6V_>SW++VgNon#jOhrF>>GXX$G(L^X)?HBLG{o&Ry2i+PEbF{BlQ6Vr zGToNyIRs52jf6JLMS36p6Ujcen5WAXA(d#!mE=f=jj*}xgyS3n z@r(AGbjdTiEUIiTrR*x=Hl~RQH`Hc!bTob@%uqcj&7FM}YA1p#Z8>`0U-|`q7^=Wq zUbxIST^m+SJ?1mJ4E#z7vE!AuKSyFtcQ}31tboP^(aE~*o2a@lYpeU`%#vsASed`D zS(pJ~L%%D|BU%ODQT0AS{!kE=gfe+5*D_LFTpp0{E2Rt8G55o9b(rTw#BE-a|1Fp_ zQ-@u_(md~d4_LM#zN&X)Z58I3msmm|hO#f;-=DA6d}&3N$*}KaB<}HO_5=T8weycb zho~f8w6yjdJLjZXDxe!UCA-jHMQ#e;fq*nfYuqD%yJ$WzTW>8IKlrpQoub%gc(+or z)8Xo$OW+EXk3*8cO@u+`1~AfHS|-Usn$li{dxk`&j3d<#e=W^BB8o}M5C54Aml&hi zu)2QI8&3MQL+X)R)Ft$9{{M<$U-3OyCFH&uF#<&N^(gj+BdA{3EO8wpWqKx0Mt~h^ ziFKS(i|EDr5v!Bpx&?NP7WYC%Plrf6VJ3r*RJU zk=2(ctWX!Id6jYmvITY(1iTBun7fTuD;AHM78%vOiM_l2c6DPAK3Xv~jyx#z+J6|9 zSdFGx+sZwics0MUPhhOASgJRFf&d7!lh^8}X!W;VAPEbsS0L_IJHZFTgB3MSE?{DF^DSENU#38E|A5#QlbTFt`*#u*Soz`Uu z-*}kH24+z#bA?hTamEq`O4MAIKwLxDQ7OPKImnl@lN1#f?ps>q0N6|!6#MXSB+wM` zgK9K_rsC#M%wrZ1A3!BN3FPR5>i$xc?PpmX;7Irx2NGRgg^BwKIo>a-rIc*R(i*h= z*wRE(WVob32sedNv^mL?*ksJaic-hQF|i#YVm~S$u4iiWgx0`h6j z$_TOA`Mdcrv|uF84;prBQmkQAM8kJ4I!K!#ap7sO9_caX=7KJ#S#7uciMp@EW2o>G7z^SmMvP zzcbI`EwH97Dz8mg@PfYVbmEa}PyUBbO;#5)rmF~a#_ z*Gq64v-nudx!F;2;XbXVkJyT~G6%Z0F3%=3o=3dZ#s-ys^SXS-4a##i+uD#6tICjM zlI5+E(4=% zR)db)%=#Us(<4{kk<<;m6aH8n+csaOQ$fubKuza<^q5j&SWyK|_^6aPX_nc z7Qe^+$8n_zwPlG~TyaFzKhTN+ym&$E1;Yb%xA&o}IR)F^2~dfmA+U!bCs*Wo?TpN9 zK$0(NAOmTF<-O*kX#$XZ2;UYm&cabVmJsD>rm1)yvlH^Dw!w~#R|G-1X9`84QJFi0 z&(`~B<`1BrbI_WZx1QV+rF-vyRAncptwkIUi5E)r@A*ErRyVCj{qJly(O1H;?R!JI z@AA|D1>nN8B}ud-pu`~@j#X|iy%zuqcuM10)^804NBm7mY{N?o(8W!%96PHuRwtiH}uu|ZYA8;ISo2!w^4cu zK~k*u7VSc|xi2UU>2wq`oUZEl583Ja)y@&;hw-74L9R~=)?taBANa5l!tf`;{wZ%6 z#uvI7Zt5#@o}nv_t|wbQR+wf0;1oI3#ca(^UP@j@gdWIR$gRh^7;tr?;`juRfFui5 zKDN{JX9XJSJGwNT2Obrf4LOS5p@eKZH%o#)oM!P&1dPoTrxiP;ScTftM5GQ}RLmuI z93xwLf~mIU?J4WZ0IvFVzHde;K9Yl=_oggplJ1K55{Z|)#vB6d=vGz0(KXupdC3^+ zT(VD!O|bLw;1hPF;{D{I7jLZBbYU6hUuS8?48-^d^TnW|Z=w5yu-5;7zjC13^6kLk z^vo1+D(-Ukadh`AEtYeIkB^U6ou-d}{qtW(%dOnbzWi6!%Ue|H7jgOi8l5i@2e9~^ z1ph-jp!#%xEhUx$H#`sTL7<~>@pZ}_W8W&Gt9?|D9%0lmX!=GXXzkedn1CF{;@mfz z_-D}pqH9dp%umy!?O9vfuV>`n>d~Q_p;OH?E}}eEo97HGa#`6kZ!ug-7sQ_qBbl9R zCHpA{*3zE009&X>Z_bVX0#Aoy0039!lby<@W(iG0mX8Im>p+}82DrWexw~o9hGhj7 zY;c*(%*xOv#qv-GWmLa_o!nk$L+XBB*Bdj;xWpG`$hCJlm~GVQZYWu73+BFUS&I3%@6Jij+9g>x5^(0r5J6CO ztX51olw=T5EDPxW0&5s8chtx5xxgJqSmsT#rPVcP@kPinSn<69bkidjlz}@J62RI zIrtR#ba_m+4x{)ONcFkA*j4dxezLtDnm0vx&h)nV-*QI?!P>w?mbh`k|KM|I)b?GL zHLT5)He}ZR5B2&YPOir^X4{}a=bVcWHb9cR;mHCY$##*<{=f~s4|p@>m=3$>9;{{C z^}ULdF=+R0^yjq}0TARKm9*we4dpCzVBB1PmYM$*t&~?x=NLAT#L9GjHhKC zo0~NAM5@wt&DCSU)GS~Hf6`ff)yX+O(MR3$QsFb!u{3&t4nRL@iZpmA@w2Tfxn5m( zWfjx#qLvE(Tw#r7Ju(Tnls5~lZI_Dd4$b@{op%=uSk_gbvbYaghPNU}P2G~$nwm3L zU74K?rAOhdA)j3(f$s539~FnAO&7a2%^4VZV(zZG*cl1wM~>8#w=X;Jnf`&BGKJoO zQ$8e3XK9%F1c=-Ms%O{8J7q|ubu@C*-+UGGqJb`=oARuNkga7k%J~fO&WRv;CmTCP zHeLtDEe!oDxi)T3k|R5BPm9yZlOEhKDKYgNoDuFp+$5d6L5L(wdHwpUXU)PTH(!-g zP~9H!1?+xrrXR0-^-PO`85c=dL;(Je@D;>g@0QT+gKmRwW+lRR0Y$zP=Fla#n zf<8!(K)OJADmpP;WO$}P<0W-Px>ohVEDKX0zVL@Az2oVOuQ=(?f7>q9IU3CWx9N1y zH;O`ITq;!`EjGAi>iE4h0=e0&11|9-#$8n4rY{#hQTGQ~xPj#gGN*_}ox4WOW)(vU zc1s6PPegvlO#6~DN4!h%hn43UG?N7TMUku5Wj;B9*<3T#X6g6u6dS(zsiDBGyN&F432TkPyu}ZPj~{+bOKfYGlUY%*;x|Kvloxu=b74efs#kE)g@$IfalYdWD^L-rQZAnZl zofo9YuGs-^JZ#C3(@Uj{4g!Hkyh;!Y>qZLz1$hspr>t!XqhG(}8|_NhR+1g&kM3M0 zvmMaxbHcCoxOUlo_q=p2^W(%V-JP^$Fi8_TzEiz42g*Mfwtcdv6Du7$;_UaQ%c%x{ zD`&(+l&(f3ek42DVaffDgh;bO`m}-vjr-0`{Gml;tFP1_Xv@4xd-g{`R+k>fP*=n5 zj+=aozjtMM8xsco27PBhZ{Hg72;nv*h5&dMsC4+7y~ZRgcY@aBsn_MM+Xt-|c1P$+ zcs;sJ$A>mF_D{5Et2;Rc^p6RTdWRSQs9t=pdb1~z6+CU_K=HlJuWZHuy+>j%h3;m1 zY^9+K#KCNEg{LsuySJ{=k?iCgp7l1&aQZQSmqHq9fPK(NFK%9@Y6qp7vtgoluV=ea z+7CxDCb5FVxX=KqQ*X+0j_1*=Ok5m>4!O9`u0)vXSxK66ECrOpW3xt3y@(Ca=C|i$ z!0q~nl1XG<@P>MGR~r+h&q3cG3>;1>j=Ik}>Ra0XAaX8m0GXsmeE?`L!4p6tbq-bA zdLt452DUo$>nlpR=gA3j*1hpxH%v($CFvi4zbWe!OEx#fxMwoa>K z&L}cH>m;PP`e@?b(5d9hB+yUf*J^py9}$R;vq9pQj1ud%z<^&c_$jD98urQGiI($o|D+PmrAv+hdF z`HpXXYWo2AODUf|9emKYi=4Z@3sfuVgYJX?As8D+g#6v7kbHbjQBcyi zxzN1YQm^uiXQAI{>ExhAk&;y3jrHhke<|J6`=nDnG_>R_+cZa#ue*pBY2(N&RTf{Y zMWJmZl{)+|)N^pB1nTEe>HC92mX#x%@Wep^1yX~cFssLI4W19^&=xMkRDA`fu+Hc2m}i29j@vJnhpPih zm)G}!c-`X#wf6_OPWiKaMoIE#S`XZKQ0gaT|F%SjhK-8+<%JtZu0&drdc;`rD^c=5 zTon6}zMX&+4eKHRHrB3Tjghi3AE7a8VhN|7Ur+ON-oYebq<+!7I-;?yTIN8-@OR zkAN-hcM(etNUq4VV8CYY*AiWR*Dz6H%MXm=FU2rRo3}bkD&(t=($**M`{@t=!z?H6 zwhm9*W?946Kf-g5yl$LhaHBp*z6IpC-dM8uen|Hgt~UB(j(}d%yHu7hEW)NfXYO-g zbIgy*AVa2*yp2C6*NO5_!xP-49J_4I2e+RuSoqtl482Lg+{Q=`B+Nez`ifr;9T(|aOHmTOW1_iJXj^g{W-)os^vL= zC#*{Jf3y6)kXBFqP>ja{A!b}aU?Xb#2nGj7eU~T3| z+5>+ss*wJ+@x!iXwIs$PpNteBam% z5o`G;uGF8Rbi1tb4lHt#g#<@s>PTUge^<`t5uT9(oY+E&*+T56f!R#%FSFLz9jtG! zbMWxKvG8y4Z}6_;YU@gY_RIxQ7T6mJC{r6+Rs00a0mJWLQ>P7Fv{`UeE%FQd1G!n}M;FmSxALPSvDSyqz=_ zned6)dTcj~OI`mQEGJg!ypnG^Ki#@ z{XVv{v5k$5C$??d8yin-Zfx7OH@0otPBv%X?>ncCuI6I8x-X_`s%QG&zoz4-e;Dg3 z=#Q43IOL2S6@mPDoz(L>p}PFK8&sFJCijY!kx4B=P7>zs zDJJDGVZRo{0gJ{J-M09FGhRVct)&H%!M5KqbBi5tgV)r*gu8Z1`X#wHSTb&lpGf>3=Qr0atLVuL&i}E{MR0tvC#U1OR{o54?^w@Di0CwoYqke#<|c&PSna%7fA7d z6JTSf&KfU`+E$WP-_MVXItXbv)S3cGBB z%0y!bv{`v9N-~KP`Nf+%v8P33^R%%N-y^Ln*8oHLwce+)CkWXMT=jhVvT13}HLbKL zy;ujcM6`dg0S9Cj9j(G>i)0{j3Kg=?^fttt)b)}Ug4`ij{aGMoHb61F3M*5{%>-F5 zG%2nDNnjoVYbOP3PfG_g;TqtOeDE+&DE0^2k6J2bt4TbKqb8JJphG*=KD+IA6#HEx z9xZ^Qe(936x)O2@j9*CB+7kT?blm)5bU=bcEAk4Z?q3OEN33kAX`d!u&?DJekie*! zmvt++Cb^U^`Fz{7rlaO)g+Ibp5yi}#sUS<0k}f}bY?@U9E^a>Ybecd*FeS;8u$oWg ze`FO^en9#s==}ADIs`)q=1A+1?J9=C`xKugwu3d;mg|=*aOme!Sg2dw#4=46#qxo9 zI#Zrf%BokgqA7@$&cqtPb|}k-MJ8aA4qNbPh6iO1r-{tW2*V#+mKvr7k`itjNkOYD z3q7LP042y*l65mDXdSs6&`0A}OR_zWSB(IPV|7H4ssP_4z}=DX1Hl;3TK8fUKRHXO z7fMm>JRD02yj;hLFd-Ex;a@$B#${(>{u$MNwU1e?iPM1;u=bJYUxWEjN#k4ABYSW; zuBjfUZ-66lVM@lxlbMy3>&@&#_<_O8hwGSu9Wdw#1?Tg_nBwymDGrCkQ4r?~J20vetF>209yR#yI4J}d1&hSYH> zXE4CbekfM40zmbEa(yAjWA)i;@u{D?-!H*jQP&MLjzk46pY5 z%5dDHrDiexm?i52T^jO{^v(3YeTKOaFq=~tNXi3wPB6@fJGHRp_3JZxFQ_~S&~wbu z;>0h33=V@KUAfRZ`3d%-2isCLeJu=vmeavdS-KwtuAN&A3N-n``0AWw`5L!>33k*1 z4G_%{AEeDO7@_gZG2K8#@ft;Q$2Th+;bT#C5&cL4wdE(Vt(8ByR*J^|pxH4S$naa$ z!0b?}3{+;PdOtlE(Gv2^M053QaBs5`mw!wG;bjOUYYGz5PC`!B{=%cPvv(p$Cx1RE zQFe)~y@>Rn$ zQ<|dObC1`iuXkdK?8?jXg+dR})`9oa2O}(!pZwW%8_f%MM=`2Q)LOI|z%g2D%Vo@VT6;~>eUA#tzq1>f8>c@XtE6A~Y>|p7 zqU#mT!<4v#u4{`6^Hod(e|UHtL%5T3C|K0oA$~qtke*DTaYG$I_R;3A_q_QrX2L80;sa5FA zC))gY)(JmHT3!JU?nf`$fjaQfPs#;G=NY2&_?d~67eU){W`v?n4A6!>juj(#b5EqX z4rj}BmM3l8`?!zZR+Fwkm*DfX3G&;G({f?aIhm3v=qb5g5n2vw)%4}Zatx+o&wC1~ z=h4AuS-<)5t6wouBo_5o0bSlhllp9z2V9>u2#CAhyj(cEr@!a@3U=@k^CJ`Pmr5M9 zRyijyDUw16sZqtTq=fh=G_SAMyPIRoNwl$8DZ)@b(Eqma=n+88a4t+Wl!JKMq)Q(Q zs9jNN52X6n-B32+hD8wn6F6`ah|etiK92nre7TiG%bMqzk@5*c0PI&+Gfk5pdk6!y zA6rHnUWg1u^-9H5PD{F@Yq`C(yg59SxVQLTg6*{)rrK7-i$7arCbmy4$YoPX8rZjy zfqb$!Qf5t0krJJIa6xEySG=y*lVymhJ!i!wPOe2Zz`q29z-JW%0rlx8Fe@ROginpu zItK^oi!>IrM7ONufFilS#$F|YRY*jcXgKi+QiKO9BMwew_}`cqY>=%U73ph-hhD*a zoSKR2+1xN+!_^q@ zi-;YkjC;uk7k~9V(y$`|VRiOqI}N|^d10c6Lpnndi6Y^x zqL3HS0R$wJ7#xHF1SEBi8G#Xa)x8mmCzV3{x-Iw}M5RK(qAfHmmoF16+@4+`WA3i5 zMp}HCqgNd2@OwJ1H0zqqy_B?|0b+8J|JoSuVICQt4zqE!)YqDAR`BIfc7~A}XaqET zK_8y3kJ?z;%1TuXR<4qUJo~j`GBQ0i&Ha4XIAn_|dZ2~5nJ%_RKCS=^n#ti$$cb$< z4mo!`{E7aVJK8OP=rK$F(I! zOo$(fL4d8OF<=v_XOVo~A4X_LX8zyLR7PHeN1qb9 zlTsUZ)De?Mu?)bm8Bfh&t#zW2H!h=7oKZvNcY$P~yi2-wk-T-TF}R-cRqR#jf5P&V zI{>YGvm7y5I+8uO{E!nMHZo9H^3yUD@#i^s)*T&guUk+^^J5Okeh}!>h2AkUjhVq+ z(`4--MyiDIa~I44HSFz9WP>Iw8>Z1=0s4<4jQAQQEUw_JXJK=ghHSK@`%LT z-CwIdKZD7A79KUr;Y&%oA69Xe%9R#Xwr={GC5YsP*mC>7=jzC?zF14x#wj)KZ;JxJ zqF@J@{dJ3#9&spU9?G)Jg83L40&h#G2~-d=7z2jGJln&f;S@`QY*mkSlw0BIguBJ+q#L;(6P9+W-{0JQQq6{tt)D zpFSetasZ@6zqCImXJddISwS$(VD!~Js<5bu-L#|&z}LP8BR{YKI=eLh9EMw8v2AoL z$FUl;#R=X*U^>9t!`7di%xAp$eRiBa%O^{oHFaA7oCfIWX2e*8MLtdWDjHms1^(^?u=3@1fqn9MSLxFnJ~Vwl3n!Fe}v6gKSc6Mu})rnXR)D1~|E_py@k z!z=>o;WjXM>~|AzmKjpfJ6Dy^wHy2{2?;=Y+TZI+yLMep5<6QV(h-(>Ip;IPhGmQMKj*6jAK;JAuah;>tUHIbQ{ocL$704 z(jdUl5L3j6lC~(ibYc>;pl4MWI_NI0z&y|ar>R^_n7_o5aD9VVI&yTKIY)Iic8Dfu zD;{Y?d}-`fX9x6^UX0JthGEZdV&`89en6cbPjMg`r!_Wi>xhPb-8s5ux-S8X0VnNp zgzK${mMw7>jC??vlhl|!U9w6#%C~TA8wz)nDlckywU(F{1jE zy@I>(I1tUpf4eK;hItnDI$C!4U@W}+@mgoH=P>^$bFVNTx@P3gG9#V(fNGiVR#WVL zG*n}I@UW*F_TdjRw_nvLz;z1ozy%cBSlV8u0ZVBUtL!1~+VjFB@Urea_Hp5t`HO;? zQTz6{nZb(yZ@1|$8KdPcq>Ao{k-S5Ge71j00uHsvtqC;$Anl+M8ftrkrm0mx*kN;7 z=+GLdZ=ej^!5MWmWYbi^792mH;EXfzP}4}c5o z(sI?c={rgV&)4{(4yHZ3{1GqLz88Ar*$=3hg+72z>FDWN{iQEjIOKiiL8y;ZKid4l zBXV9R-TD_pvftc?BBbl~TMG7?o4zTRx6Uq1R1{$vX3MseducVx6xXa3P)_0Zc)9wR zS7n2xN4uv}i8PKshP!xy-Ul2_>kklfbuw^q*folJUk$C@6ASH=SvfW6E*jF;3L&6= zyZ>OIANZ0|6Eep~6XN9E!3(j%JsQdpd9}i{DZ*)4GtmLD?v6i&Rgd6V8BnLSfW93R zp~Mf2$JYPd`|&{(AR9o}SfEWk0eNNU*Yu4#$-o3ZtOIYNG>)_z1P%Q7NX~dbt;4TV zZLtidqkrxXTs{}eDLx=4?B&1MJaZMW+aKJ@79yOAz?|FQwzD@bRl5oxLmF`cyD`gu z-D_^>Z4GTs^&gGIWyyZ^V&uBTyphHFluM>`zC%;YO$-S)rQGrgzRssSe7rY(w9EHFsgBveI>;b}PIu4E^H4)%ALGdwgeSS^`7R4}Vd zU1z#w{`Rq$!+hCdugnW2XXuhQFTM?}kQQJlY#;J~2r}G;rW)s7elx``23eK5)tdEX zQC7^BKpRsE+cG4M{cF_?THeY@$|xTVrJ0t}{g<4f4%91}G6QH7%Dxcf)jcLd2uBOC z8kO9yNQV_g$9MtS4;F(jSG3k*fecp9?fN6peypq5Q1nY|%IKI*qxEiV?{1%E_2stH z5YZCa8Yz>$IbL|lFN*tY^c5z-_ZXGaQwFRo6g0K;R*%dnMZ4?%k?o8IQ z6A&|;wO=NX69PnGl~mZ0hz*)EL(O4j{T!{O`bh*;i0m*y4o`*B{JOqdm>S}69FMv- zK>QxI=+=u`8*>~)^f6#mL`amSi2(@h=aVYb8dlO4Z@<*G0zp@M)09e7MLMSu*K;>>7f44+4tV1+uaA@*wbV8E1b8F3mfa z{DKaBH^N@$nM1`C>o!V9%uhcK!ZX26c{_)fKAC6{NGXdwEGUcADY$7$WP#)3C_OkZ zu?M4xbzg%yT4?@JaE~^B$-*ev8AT_a1h2Y(rVyk8ou+A%zGro z4F)Q;FTqk9EJh_L+Y=~?GJCWpuVF6^;TCDTT@T(glU$5JNyjoK zrqSZD52Y3yO}I@&6tj||b9qKV_q2gCQ7e%)g7y=3H?H90B|^Hx$|#e)6T^tNgS>zP z)xyT~>J-g3anJ(^=mU8b6JFrszA!~^ukQh7i44wzj77C*8Lq(SbdUG+nNVP8+eGl-4RCGDwVV#7Lnb)EWn*1BZlg-mDcLV*ycT}h zC4*TPP)@;x!WiD)gr1nH> zvF)tK=vfPyJtfNPPadx?#h<(_DRCghEF*PiL3Jbor|&x@eq5oL=Q7TxB8b5P2ftT( ztG_k;AWF)}E?{HVLmFGHw$w5&^P`Qv3BzD#v!?*7if!qy`!yWq@hUVX3I`d=6f>{hD9GGtFVaot*8#9<)#U}HULp&ce^V%<2n+lmEhd||R3NqjCapRuu5onPX|KT6tx z1M?4OrrDj$@hH}5OpTTx>wAwaeD-)FK70v|dC?tR_Y7>hJ;^K55Efuf=Vnv7I{Y=< zb$}W6{g<3QMm*syg((Dk41;=KlzIGHU?cN_zdoqwqVYAld(Db1o_Fk1_J#@~lWq`} ztA(46 z$(=`MX%MfzO!NG>8WdO;PM$MTdBs5a8w42*u^QB7u7;Kc|HeIs@TL`w2cO;uKbIn6 zOXc1e{R+H-k8e{}XXJzH>e{TcvNdY-9 z=d4qRx5S-$R#li6Pe>!MD$_Eo>i#Rv@?0r5pGNzvyRdzh8VN|PI61oqhP2wIuArcl z7tHmFS#FG(S`=rDDHo_fB(RLWqPii{M9V<4ip>heq5CwKpj^LTD*;XP=0tB0yDeJ% zkYQBWEaf7$(D3CCxNHo|Ecx{a*rr;j!A|Gn3-^$7UTARBn3RK$smD~8F}+TsU*F>d zsLUVZHj+1MWB@n4NoEPJn$&%l6>V0wciAKDvRGQXjk!8#3zLJBI6PsZk-DAMwZhu< zjX@RAYwhbZd)juVaf*M^X#R!uqa$e1*SE^!Gz-}2CAjy62NR&1=CmbEXh4Ad5%5Qt zNR0Udj&5GA7Q|{!Hy{pvR~v*dx2GQ?-dQk$!ovmqG8lN1yH9Y*>TcVmf$XcyC!~0> zCWq(L7P|j(i2rTaOYk=NhE9(Tselw91PK^_~TCkRFbV42U>93TZE)R9PQa7#0-OwzLn0pQ3%Z}w$VU#xdL1YTb zMtyUl+*QDvKiodPd|WSrTYYQB-hzeII*q2D{s=ZJm-DvuM*eT@t~@(7exW}QJjkGT zbUC;t_-oCLZGRP_*E=>J}*nFBgSMhF3%54@?Q}uUum9} z@V0HMEY`9NWR4Cp1984KztWG>aP*B|N7^8(t8< zus|J|dXSf!ot4_^KAoSF#Ns;FXk--{@aI6YEP~qccwwt+PA>+N!`uLsU|^w0^yD5W zoG&1el@$}z&sV6uJ8q|F%?MX-l~>e2v{_{DuE#ugGSteYoRW5zMTLz}0HEmq0TLhs zh5GmmtX}~9X0MyYg3dc)pKlFBV$Wr02x+tV|8&FgF%-?S$|_^U&aCK0g*GmvI&Ha z$Y6~Jan?HR;FS_UA7<1Ai5%oWd_fN8ic$lO=`GkDuimn@8AFuUU``B}5O70e`8i{t z`D@CWq=Acc#ZGDa`1VP;2DjB6r!S-wu?3q0bxd&|qnT9L)dqAA_sx3cNo(4&?nTYm z{Rwqx_=b?sUcgU-NU;-JA4k#^G~kCmCqp<^*bXV=f;t!@1$K+mA8X{BWKu6H1D&|@ zp z@Ojv!)*}`8c+4bs@ld+)=_8g(hlG@|h!(ggv77)LC$4c4p=2b)tLm7QdweI39pd8W zXW}D`^KMDMpAzw7pd7ldTdF_S%t=S-=1hKyMQRoNsZz466pghbwFXXZEO?7pYThU@ zA*r~{A6(Iy@?eS@@z-$E2Fi!7O34IejQEOGZ!I)S4_wI07*1Wqgw0EVC%PhSMDWPT zi&3Diz5_KwJ=0PgwQqEaa*7Xgp#AxPsaFa&A8@jC=d;P zlXrgBAO51m8N9V!Gfp+QDv24Vkz)zk@R^Uk$c#48-JJ+#LkE7^bzv&F^w#x9K}~2f z-ey5|QOrB0ebL=xg3nXB zH<{dUBJgXx`p)+k`3>G)T_y(}4eYl^2xngFx_ChfS%UVH7q5<_i$fGgJj?M#FPzk5 z-F8fmk{+A;KYi-RvP(mgi6<4mLp|HMti?tIePT6N7MA1raP~=Cn;pJu%QSg?CC3Ne zBw*0$l_xMseel67O(Ct@_PGO@@#D5ZLBE9*1ejueRn({LfG!#!Ec_slKBQ#axYGdQ zD}8t@$w041i4N=SbkZiI%=d)x5iNU(W;<&pGukR_6De?Xtj zQ?0Bp-rRce5D9diOkDgFod##r1?cl=2*%WN**JR&{Xq}1DGDBJ^FEhgCA_4u+*KN< z2eca4n|r3k!#B2z)h@QGWHc0fSjK!v&IU`EXRGOA`JKJ10A!(wQifn@aT|+Ux^JeH zQ)~ZTet^|2Iw1^J%`A%v&OoP-vo|gv9oqhI)b8R#lNX`wNs;a%y~A%!^-$dk8a7{w zV&L@5Z*WU+^Ri*!%oU9fnRfib5^u=yeI5LPRD9kOuUuVBDEIk@Al=?FHvoD#3j!& z$-B%OR6}t+Orshc>{%h~@V+5~@_+y@2nA@3TS%7!q8a-RwN!vD_q;RGC-klsdxY5HO*t zWlt2LP6!yPHw!yjJ;t9&CEPAKz~>L&?+Gp`Zc|TCq|M*Pm^%fD_P9rre493mm4n6& zeWr(fh56KV*LKCa=XoUi&Dm1jWqnh2xm=ERArEdwv45=;w? z$EWq83zi%n8cfgDfT^s;$3u4SbS%#u7#ux@0zeM>SJ3v#NqDIatV$G9j11}Iu{_r; z*u_BCDhz+LLJkqeU z9_X1$vmfphldquO{cdZ0SL`d#MmGj&&kY|#mT)IVSghvJ@xnF+^w(B!M!aYi6i_4@ z;7TspT#lsA&>r>`qebVT@wQT!#Pfi7^Fc|S9yxPk$Zp+yFV+{{agj*FUee|a@;!B5 zLKn0>GD5q zQsIJUh{u1c;vzs@E#%E^;;3qLq#0a1NxhF(`GD#L;gwcf17S50+M_VFv<-2=?a7BL zqzFJDugSKT8KB#3eOI#R-Itx z73p-r&3Pdz6y_q6)^s<5qx*+9lqa0@_m}XnB*Dfy&ej^-0>(g{=biiHkK6HZp<>`P zBpgriA?2hSfcGGh#m5kq+9AtaUq$$4iIpu|O%)>JgGk#&fAGqvrb}KdIt?ug?S48t zt!e);(@cadRpyYHXmB_oKS|Y-qYUrhWcx--@%KeJRyxI$#7VEwg+rLHHbXC8DDm(f zB!a6?UWMT(ou;;c;FKxU3gI&dl5R}1lPgA*>m^DS2fEm6SQV|biWVn`+p1YDXU<)z zSn)?LHE4FH`TnRBfa}#Ce5L+`A`02z*-M@Kom+b=qghV!i3`yZayzlHQE{uo&1I`_ z@9KF}d&$C+o@Q}zkC?}X=x{_ZGY{$IdD!a4+`O#&A5h)0!YdZQ z<`fVr3B;WVVq_NDaK%vuZglyaWY{mQ9(R}s_ZD1LEND-&pVZb`3|ZOV0J~SXSl$#J zXmCf2<_Xj5v=KS#UsgioSGPV!sOUTwRsdrR1wQzgs*cv3kJffnP^UvR(5Q?0I|BTl zmuE7~#HRu6v=s^CglVD0HF$H9r8h(~b%$~zz>pux!<3?&T98;tkMXT&K21wh&o={;4{i}O++l`$)#fzzli&>TdygfjN(TE5)%7r<>Vz<4!CM*k{ zure-~k%ZEErhu39kv)R7ad~EU{H_c_!lQ?k@J(&c>Kf@%{?|RBPE`d!a%A8)sfV^F zu+j=S?y^(M<;1s994gtyC|cS;AKN;*21y9{k&FYt4f`57Omke*cf{XK^5?vy>aQyr zZTF0N_-vr&mZt71iXQLGK?KG6B%$F6x(}tcg<(h&m6ZSYy^TjjBJqP_STT#01fLNL^j$eAmZo3tDO_5lCvOY%PK+8iN6sdlc{3^oc8% z)@lpDA&LI-3*0kG3b(7T57q5_Ade^hg$BB{RT@Dm`hY1#ZS%6N2!h-=nz~Q|zpXLu z^jjZp>us{y@WLeazz}Ksfa7xLy3o5t<^ks7ud8N?&=n;2FZV-ltQO96R)?%X{?=#G zr47Sz!G90^4;CTW@?Q`wy67+>E7vehsi}K-@dcRrr8bD&ZH71RgyO!3?(I-cwuH~rYAe@?m;)5w>JdOrfrjn z1Zi?v@&yy1R)?%Cp)5Rwk!LxIvPS3bgKztft}d?XrTr-YDIKadZ~dHWxdKk_GZv{p zk=F=0e83v`>*}2;p2klvAXi5%6?XOYDv|?*vC^HF-O6)H;5?g$mj zPTecv6d=mH_^%=}-_ao_q@2OZmM?ySgPkamu2$PE@seMAuh%~fK1P>vMn>`6Yz?;Z z^=9MQb=M(}y=5dbr<9`YaX*)burX#_;UVqzI`x~aUi9tvMK})ffmjCC4KO+3D7*jM5zrJn76 zeiyK9P=B{{W4;>-816KjHHDA=4d|sKn^^xZ)q{2BD9-FrS@3vxO{ox&SeVH2aKO9#OGTI*yKqJ>o&eVjs+x zb-h>c7ce7pQhG%k$_mfo1hV;;6Y7l6Q8)-I`8cmF*{`x&{(m)82HV5$(OIa+Y3(`w z%YUPf1h!V2sV>uDSh*3!{wEPVO?9XlkIb4heVggmo3ngR2i#g16JAv9Zwa zB@RyK9(OxXka1YVIBDBE9Aju?SAxu|8so@ITmCV^)q9A4&v+cmSy8U(vNYRyzj@jd z(M0P%loTw$%o|P%7g)U;FOtgqzUZesJtLzizcSA*j$;@bD9wuTsPX|21v)Q3-J;Gf zNzfLobd{Guj5$ge?Zrta&OMEhH`T@k7q$G00n|caZVMmwJe(05faQ`tU=LUcf>aLU z1g6zAQPJ7#F1wPfc&)01(qI0Za6)R=8LoY^lcJxi;M14lYZx9y+d-AzT+f(|p(LKD6KF8t%o|&XT6q(rF9TgQN z)Dk|=JSPHmVB2Hy$`Wy$4W!?v>*kF?XZgJc07HIf^>V34*vJt{!+oaH zp(CCUKp3(6lN;qd0g%0akAAZ))#}MQNP0LT3^fhhP)mw`dD|WwJotEtd$&qT)mSsF zbu=EB(C5)pnos7wt}U==FjEp(A&FhG7~bdw*J6A#MgG()hW^adt$UyDRg)8-0S7tT41=Bo|*; zZY4MK+K8FGRj|6-eZgrfb$8G&>uGf>sjFhFkhI&-zNAM+I_*2U>wS66SMVTOSCwmR zacEcHngOb{G~GPQ5Y+spEa(-FIt9hda!P0PRHhF#p2iZj79Xj1I%sHV|IG;N_=%UQ zqmDRPYmJ#;(4(_wgHdS^RC_+vw#9_8y^>&%*0B zyMGR|OBOtKWkD(g`6^-Z1I1K9;(+oXlA)rKR&Q!JQ{H;F06}se+z2GO9NfSn#_HCcOvRe~R;J z1)m+fL7YbO8*|qF(cQWTu<()Sw_Zus_oFPz&eGWOwY+7YcVmq}xE$?7peCAlLdvek zY>C#hu2sAB>lG3c-Y2H06zUS45#dxLr_vW~I$))x>c?X+%t7~4-);z<9nWo{5#-SY&=o%^bX_+QDI6W$51qji6zHWFl@jnH zU?+T|d2)ytK6+656_JJ3gN+0rT_}1YHz`U;D755Vk`A&XgjKjnY?GLq&p?>72#yiUiIfj3_67r<0I9(<%cO4 zXbPAgWHzDY(Q6e{)(j5oF14|Vul1BlV*y<-v0<;YO!G3sobBB`YLe1nhy7A+tRo(T z8X@a1c3fOw`q6z_eTrEZTCGz`B>|T8uR3zm0Wj;=yvo)f1?V!mr^}mvc}E}tOg)7( zF|6q@*VU>luL6P953xR)5OD!nreaL-Ol-1F)^M2j7t;vZ-H#Tm8z|PFeKE`ekR?21 z->z3%T}wo1d56Da5T>Np=PDkskka6i<{;TFY(-6g#=`vdNfjD5^-HFM$eX&$3LITg zX-uz5Z1^Xr`R|uV1a+Qi4la`ml^_s6J zTL{)SHCQ!BZLTF0j^cpzXb&y%0?_| zyCs@OIn5ArO(Ux@vp2U=$QPHw;4JpV#qGw9;zj6cu&Pk}h!LB6n0Ykq`ScY@p>=}b zCJBv+Sm1up$rz>CUzIQ*P61EN!N&IN-1@{oO)(kRQ2Kk@xr>ITI@7C4P(fF{=W-MU z{i~Ojg3%VHkkHAN-GEi^R~fSE65qZUlqUX#k@3&7L??PqNVYxj2bQ3PaKh9LAduUDc?)=U3!Zp;58hNk8dCCX$AS)NC3xYzloDW-?7` zOZzHu9w4)X4e8$Wm8XL=Gs4FxeP_w9BE8!*#313?<4$FRlA|A7u%t*+97w|+CYW4N z6pCkyyW~)$wTrMFT#-iGOx{-G6+i^MgjL3vBNC&z&w^9Ar0lL?p)kYeZ~F1#BX1Fn zH^2I$EPP78k<_jK_mxaA_F29`cfU@n&~}D2RkQiZiL}3&o>=kL9e|-bhI^7R5g%)ssKa(zCmC|v7 zM`HCST_$=pjgtctQk$n}v+`eGe`(>{h%TXj5oiSI4b2K>gA_LwkIT28AL+Qbw!?;} zjGM69vzn1#%bb_OL(C%R1(YbuGwR)nYfLndW_3)(5b%!3)-6f=Q4XS}ixhHOfemketpr)2u71iBWAnB4Mt$P} zR+R>FJUx%Nt#eQF@+p^#WK&~t8xzuED>Y=%QRc2?|J0)P+UnqOa4>{) zm8dRcl^qT#LlZ+^=BtG$u}$5(sSVJC(=6lC2GEcn52}bRQ3SzRno|PFuSmU<;JGU< z6)XOzjCfSjMa8Am5pgW4;iPm~na$7K8xs4H(`#`uTSYm7>rV_Iv2_I~)#Hr{cy=*w!QfK_5_hvs!zZ(dclF0 zOsDBTqjs4Ql$aKP!7<`E!HX%!)KHK0BvBiB9pxd=IBRt7^;nN!GUS;tzWq+ZN3~wZ z9cj>($$B7=A*s=fLDk=C8akehd_A&0$BuIsISw&4BTl=LQ89_p#A0g~NPTabZN#&v zmg}U^q*K!BDl2D-BlS4OYTIt5`FD7%o^}w`B|3A$v=6AjtjP5lummiH*papUaX(Ah ztt)B+D0pQwg#rU}tn!nw`s#Og_)0##Y^=>Nc}$0FsW}m=jWWptwi{Se(AM-B;efm*33GA^m*Pq^CxhY=bHB588vTB^ zbAw=oP`3jR-5O+MyZ7ty$nV>6HP>(Z`>B#B&W)(6yOERHXe7|-AP^SGWRy*YCCgE$ zOsJUMz1(_{>*sl0Y|JC$v7VZbgTe(;xbadK_1dm7*@`QEtlSW(yh?#{L#^u4@?y_z z*sZdAz0UEN6dBouNn-h@8vAm|#}?`$MKwc1!KF2@R`3tE(PPkQYZIAZI(6LLJ?~&8 zl66-eqVPCZw~!lxgK|HH^cn#;jE`KIvh^iMWu5ja{v~1=HUkrj^gtbyZIdDA;7%9p zDEvi3g3{&>7%@!9#i@qL2-2*$F@(ny!P(bnI2_TPC>VS4$1x5%nTzqc@?_lGxNO>6 zWI{aP0{4L@&3m`cAf3em6V$4X&XTI9U2}ak`UoMKikJO`tOfmXy2QT>>GwfK?NgCb zF?pK*4YEuF>v$yzc_RfHgAwA|n`Z-2m1>e!_e`vDdn*#=6S=d@I>h5ZmAv6D+tC?N{ zML0K;z;-Bj18nsdTQkJ)>TMa2aSv??p^cOQ&gkb~Z9n?uqCt=ios0}D^a-a(b#2g$ zl@MK>pQR6SL~o1^LzORhT^^q^fiiytQCA0u7|n-Grovh)sM~MVPo*L7ByaQ_2>q2u zCp4Dc+P4-aSh8A|uPZ^dI}Ik)&$n5CSFKR)MVPg{`DE;C1(ypVDm%`a5Ebso)8qSl zK^{U1k=R_OrC_sIZs3+PUW%e7`pG!A$T^?!Uf|kL1=Um&j_rdN2$&PbP^3TjTZr(b zmPjtI0TZ>4?=!0p!%*U$Y4VTj27QCa6(nW4;(9*oy4+*aF%^gDN(t>@$rJlPo35>6 zgns_KIO11TBj-mb{7;Sh_<2voqykksRt^{?*OtS>Ox>OuqXeeEfX=c_xoDhysiMoa zyCi7*UD>-nOt)!w8lP;4or3Yz1`J{&)obAcR51Bm#71#qbR_vp$k|5`43KZsTeH6; zQLxOEmo}yC4NKl3&W^Ao(J8aQ8yPO&b_IqQSHt8A^sDD>_-taCgq1AU0x4bP`$cfM zA5u`3CA`n@F_-**P#lSGatJ#W0B5TLK5z@Lp_!ZjplR_%!+h>fvcio=Ocs`nK6_NMM&xfyW)|N4O=|HHt8!d2 zldeHi(@7%Xx)#e}0q7wxa1HEU9wv|i z>we6^`*MzLX#k6OC!Q>Df7A4jXaWpYGNLgF>fJ-Y-ZDx zbk84tm)OdlB=0?&LcsSn{w z#^U+skmc=VdKbJtwMd;WmO?gR8Sc5%YzE*KATt=28nP?HGQQ-CbC~#0)5l%` zn^|XCLVF^>^X~=$!l{{n_bG^e^O>vq$wmZSo%9(%*NO;%DX34}u)rVpP~YLW%z(HI z76(73;&!%>!JPr9^z%Ta3Q-98(1eZDFi`A6z7=H|RIStp?}Tg;bB~Lm_HeIWLi1}i z<{WS=QZt@A*D+nO+hjuAbIUU@j?@3nHS}b?4kBGSa3yJz#y8S}yp>2wKt5h}3%cy2 zfotJO`>XKx&jl=z_kw&>X|WIZnpRvY{9GSn74HijJa~FwOFnl#)JiL7ftQ_#i7Le} z%ZT*y%!~q#>(G|jUt5c4*j)ryvqgFLj(p39?ZSJb_%u%A@{`$k$wKwHf5fa14=_|y zF=FUz9sq*k^d-ZpvDxJkSwTupbb@WMT4<*)ZE!ntNx`03=POb3aHK_2v5Q$liBhWN zKMUeK<`WKpZldms3%UA`6&x}TA*&C}i;8~Ce4-L@6#Y(56GBmCGR)TcaApwKu6aX- z_k}G{O!wLl>j5obWGisd94%lRHw-qr9c2kBt$e?QUPf@s*;#!Lu- zG(}TjWQ=W*eWMre@X=kv=GY<2>+8|NHui|(BomFmq9yvV#;&94@kZC|D(V?0F7F1q zy+gAt%cA_+_r^rcH+;k zD$QDfi6BxVyW%ySoN=cXtR&aCcZBxVuA;;KAJ?xJ!Tl!SyHi-tYU~x9Z=m*{ObJx~I=M zQ(Lv$J^d`Y@@cP^ua2Gm8pNZ?KH;Ne(MmqAO&2@u#mxR>RO+(_ zQ##&6pSNK`a~Q9_zlE;7Dd3%Z8cPRp-`9p}Za{Hw^uV}D)T}drzoSr4#)f~n*!Xt9WL8~dCT`&P`nH{=Ai zepMVTj!fojnD7YPG0I7C(j-#OBU<#e|M>25;by9};hv6a4b1sts-@sasJX7{=UpD; zKx^kI%v{CaX5Mk48&Yk!FV7I`@vB&lYr+2N&niYrxh8#13p$Y2EnP1;(7I-b8MAuv z?j~B1%AGN!vR-#tY=5e1e(OelxBlkGXhQZPu9`Ple8rezy15t43Cla>~;G*R42 zvxvQUWr4oFuwk^8c_RF+ASska&z*FWr~cPei(lN1AN(@hBPHirH3d^P&hb?#H9slr zio3Wfjs04vR`Y?2t%{@Ty@-9x%EiB*gk)raDl5iO4t8e2{WLkmfwDuUK9jpiJ8-az zg7H0?SYQ^kQa_sY(G1O`39yz>IUJs<>oN-XGaZ#DW)|yEWF}NO2T>Fz>azs#e*j`0 z2P7uyQN7EeEIfBFxU;Ke*NI9o>y`-TlC3_?f;%P}eiH-k3nd#WOX(#V4lpf7oZ+YA zz^*O|X)sx6e^d2KG2$vnRwS>+Gt)cLM(CarABhvh1;pN*u=;wHrNAg>{gJhhCu|I` z*=+n?@@BW&%mlL5RoU27JR(GmVrfwF{+gC*7HzPYJr`p_z>f=`_E7;)!p zi~TifoUQr56P!4^u$-)o;#A835#Y$`C~Idr2TEq{-1t(e2aQ?Pi`5XBrh7Vv{{7UU zUNM&j$wncR1@Xxb&O=f;-JQk>QlQ9>hY^BWeG3I~p^mv!U9Bd=5sA)`x&GZ>mK)zL zuhu%RO+vG6#!JT~nQuhCEUWQTi!XU^1wwQhf|f!{G0N(6i8UY@cI4Y%+bH9e2F@rIdX`nTAuA93`HG;UgN?+(+_xi(#r)m8}{q6v)y zHZ^j>E8KQE#m94p6T`0_Byh{Og~DHuBg-DxsO8SYtnZU8P7&aA-jPFV=jmn{)GU0R zxA}z|^wU>ppLAPGv>0Rs-c8G@mX?XFA~*Ub(7y!X>gs_~i-|ZFd$xBIFr0)u%|;~P z)vyNFEnlWf;dO$;%!?*&f5X!A7}rb*{K!jwB!c@O>uDf(QQ~}(rguS$!`6%13J0lw z@%7;=)_zL<1{yQ>N@4NsZfou@@ltAW1&P`&zOSFQ4`gnab0~8mE#@QO!1JBC?2GBq@$Sm<=Mqd0N}M3xkSYVO<@4FVxeMc1yP;Db&#UC ztXUHcIv5OHK^RX6%g1nILV$ewPnk+I-wax&-o&WjDs&dYe4n09w&BR>EC&;^(kP`< zSNeY3VmFn4sp4E>bHR_2{&T%OUEm2_EPo50J*9zc9sH5j?*x|b63KMV8l&QrcPr*vUc>~Nt zv+A%W0fr~Uf;^m^zrr>$8J1ma81$A@3gBt=TIc3^SMIh!TsdyTj1ej6bc%d+A5@Cl zU&jr)uM>2*lJJJslw(VmQ?S7 zf#%HYkcc-pFM{87oA@&C$8jU5@4Bs#MWZxYCpnQ;EW5svI-du&7vANh{jQfUR(5U)nd>eiTYe zV7h*)rHgN)*Cmi+#EM~l%CCQvLPM#Hrrr0^N_pa_6LAmQMvj$#NhjHA+p7epez|G? zx$jWGRwK4ZtybvM892oaaJVsdXbOHIWvlTWVU;=-69F| zu`$Kmm-X0!Dm)T;dTqpBI>RU)TrKGodVd!8KryULV&6+9q3i4DnI_X`13h6N^G?4H zF;H~VGuvlW$ODlfUBxIZDQkX5I#4lmI5&Ejh@G2gx6io=&9NqJcF)Xg<8Vn!C)~oMbTim}mFG-Dxyy0?gCcMztJzRJO((()Rt$jOZd38L4zIfv5 zXm4Mp`qhVEfxROLW$+8*6S8?o2KWG<`=hw!=R*eL+I8T{8uiY)r~y8Uu2$j5S|(d8 zuUqHoHi4Ye0~F^_a@Be1&C7U&)uoHIA%pm>3a1jG30I9V=2rF7yFxIMc*TWwjeF z0R=bN6p_)}TK)U*^z-|C;QQ6(^V|I(gJ1~j9PTpm4K#^vZ*VjMgf;swA8}T?i2+ym zqf3T({CuE*F2o)U6k($+q<->XF}@5^zk3ZPyL3|SF2sXEJ_IjqQ(Y4xxd>{0)4tZB zIYWD51gv7W)$p+k)+fXI*X-J7DMc4_Xr@s2jD0oUc7($5Hd-OEs$k7ypj9Q9gh<-M zrx5xf{gQ@-Xnw15l~bR#u}=boJS2{|IQP)DLe)U*M_59bs4M`~W!+owD!TGIH(Z_1 z=WbM*-LJ%1##X_q5oh<0yjuDr zsNqQ${mEv;Fda9jFtEa~G)^P)jkyU4Roo2x$7codqk}7mI;jA76r)uZvY@ExLW|il zTYjQ4H&^~iMHO8cks76)AyPsZ7xz{zY!#rX^dL;|)P|p`MmsT{VPapV1;pOC_3;v$xSEUWwur&x~ zArkb9ZEy~w`q~iu*gv9>nb9jF;heBN*yTdrtZ{u*#7t5SIHrvywS)dp>v9pQoj^9X z&8?BhBJzDQN_Kp-5mNAqwb_ED(E>hgq#WtGuQQ<>Lv+kz)30&{6MKb`G8vTv=oX|5 z=v8G)qzqr`4LFLzEo%xEG4RS53m9&8_0Pn zb4-04`TpUpsKARne2F|1?ji@-S`S=+9oISVn~&}LsNMa=S*z=LnRhfg($}kjcr}Cn zze*Ni6zO}pD7LM==H8HpUnR?r2+0Kk0dN$P$@@~Rq`NFW*&Z>HjW-MoRaDqyuQ-WK zgqmxXV*wT1FwWt)!eBCNo8WfBBl@ssPlgA1kR^cwoYai7a4a}>oq51u91rwqb8mWk z_1#tWh|4@@6X>a6NQuTbet`&YulAoGdDj85jthcNT8*~2(>83sY*vC#U#6!`XrXL1 zWa_DI-$La<;cS+Uhs}H~rc}z>iAu8Df3iPPPC;p}m9d9iPWb7X?4oZ>FFQoA_X{p5 z)0w*vMd5j$$B0cw)QEu?gO3TPvXWRXxLt^>yn9(tLw@RkUg7I!rHyvN5ea9v16Fm& zJ_z+6Y*ag=ZaW;M#lNAcBxwUX5f!+>XSF4+SVqw`IOvx$X7iBJ7(;d5NpC}!R=8z$ zLs7D0z(^QP+v9&2DTm&qb6ikPE84-bU(s`5m(I<+u62Ow;XX=~h;wFrM}EoDbreSo>ANc0Z=PZ|M>byc z@U~TJ(gqus0X0aU!q`??|$jA~Vu}y@`?a zap)vpF%^UqvNJn7qqQt-vJ=s}vq`-K!Q7W`I}lS`TXuE8ftyo2p)hxn7I)c-*d#a_ zEeSzi;q4r~WdrIFCYoNfRrM=#DuK->XA@R;?~DFMnI- zE(0^f5@Z@L7aCf-iGu7E+|%22!-Z?mf&g_S=c)%h&u!8K@4iu0l@)#{j=1$IKpU@| zlb^JwXTgGsn61d+Cq)tG6;ITxa+kB-;%>G{Xa3ct^!ZNu>!6`?St2;s1v4hFHS-x2FslOA?OfFmAG zfb%wxr$l8?VQG;8C1*i-O9wKSVc*2(t4Zc)XtFuSXw3^wjk zUP)pQ-RWaYC@miP_=P!%@E&*r`3356Bcu=iK<+*d1XV3*7VAgUUB=%jCL=GLMg>kSx)jh?o0We3OY=6>o|T6gCWrLu1VheD)4CJ#kW{@#BbQ^ijIcJ1p7 z1so&}$w^RIcqR6@4`F#gBM!nb@vjH^82drpU*)fP-y@Rp0K?wju-{*i-ku@eUk_t0 z7%H?B?OwPUtwU^+EqzgX(1Wf_&!K_4qxN4^9TbnHpY0)T8i$7_CcP5p$Zv(9Hb=<{Xr zML07+Osrh^-O!^zBq7GR-?CuE=GeTD9W8q%PX#1*?dcV-HkG|i-nb?R@gNFR`^Dme zn-vP1RRtyk-r*maQ8DB*mJ1*5fBn|oT+FL$)3j|bfWqPr+j;ZM8=aCXh&E+%XH#dE z#t^ztdarp}u*p_PKYSn3G)qGowcO&V%GHO*6kOaB)VZ^R`{T4YqLLRA9EosN#U8KT zErD-4T32o+v;#^LOaaj8mnHm2+YjE&b|zkni8 zg}3dB8o7z;wS5XPZA|KrKG9vN_J67ZJ=d+QvCMJ>mg&J5z<+BCu}_h4_8685*TJqE z?!Nmq}4by=2IHzGn zcpb;#R@&3Au>Zv&Wjm>8jy4C|9E?&gE|W`TqerYMMMB&fr&%q`QQX_WP!;XCX~>5pY?Thkwb_tzmmi*Ao|~&k z@o%L`A%Ec($B*Rd8X?;P;e#+2xaG-4^DnkCZWC2S;#M~i`Jo2+vl+Ee{H4u<2_!UV zbY#qDiZ|mu2_?S8{t;$eBm9e4m))`zK{(%1jnz2`?J@ z5N%Z~aCG&^61;(t(V&q+V{m?Dj7U3>9;Jlv^r+@@5$n-`tqB=j*E=FKM1ERN6hyl` ziJLw%WlFJOeG%gi$}eagdBsQA*66K>9#m3-%Pp99;u@tZK#dsg!A+e7x^^n5ykuh= z1T4XC?2naM8kIPqA_~+NBHPQDb>^kyLghU}=v4*~V^CeM#%JZwgYtB)g3qDt=k_jI zsa!k3h$<(q7ZwJK7^c`tP3oJ4jHyY^mIIE<^ChfXUg%?Viv|uQ_{w)juy8dB3{P3UyYvDAYX6?|(c>}&kRoi%a+woI}a9c3kGOYu(`JoZx zMGL2HWZ)>0Ff)Dcy7jQGc>44F$?V=$-;S+lmu+8M`Wf^%6Rw3PT$^EF16QcVE2T%vkSn znKn9n`2n?)78=8(gn(OGn3L@WC)G&78RITz9MJ8p#pt&#Yg+y&NsF3TDqP9YTqeRigHOKDWYwr=HAYC7JsoB|Rx#&UFS z0>C#eLgjo&GSS#W?Rr162i#;?#D$PKdB*I1h-9Bb*a;5(TBTVl7NSEuw>cvJ zN>ED@f#72Ivt1RkJra+Ln?&3xTyb-o`KLFj4<4w6IXIGVPfM_sImO%#^?UkPR|z0P z){xqr46`3@+%O8t8AZiYey)g6KIADS_;bid7MozM5LV;1BDgFyVHC0#X&xDORJxJ- z_HB4#DV-F`?}UV*{?w&1?}t&0fi8@A1mAFn=x`UjGM5DzF3(|`Ng03tzRvf(jjf*N z>ECa+8$kbimfvqz8^F)^D!<>@eC~mHz^A;eSDfpuo|l_%BCoL5$0Q>$AH&mqD(|^3 zFaAEETW?VdFEj+#n*E7wlrq`W>Nj~7bR*&{adFM|7wB(rzrKsxsSZo+6y>qy(J9$@ z-f~zN=?IqPoTdv1-X*xf*&nTGX5hj%?wq29rz!ghIevt=`cij@#9GJN<$*&59UK&! zLfbaqjPMfATZiBSmh1Pl1mrHvmt%F8ruI8qIUbn@WmB+$;^0bf&IS`;Q(6#TsD!fP z7~xE^T&BJ{Z2tTrM~9BSL?GV<)C{pKVYcnbDLNkk|n-aPX3O;mA&9hSmKRy<8t zB93EbkN0;(%fowZ6H+krs)3_gM4S&WP=;-6wQsGCif{5%lzz*klYQgf6y4!#LWAZM zlMOXeiwyaE$y*d}Yip?Qn-&{sjyzg1WJ0L4C!a&BzFH7^$8wi?p24h=z1kiG0>T}5dv{EsYs9bUM7i} zOGhDwuVR(WsEP*R`@s3*Fz&p062nK`T^YXCNS_y*Qcc4%S6YFaGHdi*u+P*wu$SI> zM#uGA1XRXuE)(wwZ0p%e6Dz^L*0wu>$ma+J&m6>N)Bk*4H5njrn!g+PVp?#J9^@bs zu3a~Pn7)hUWYzLp_8SmMy}i>%_A6LWpp_0;L&{N%4WY{36=EAg`;m}n{u%F>N4w6f zEP@h17ekA|_Vpoja9m35^l`^p8saTvO3$gCvbH(PfVe z*BDn!#vBQIu_7MaN<8w14J;g{SC-&HYp@rUdY(mW-J#vyqFCZD=^9O>z9Q zf&pV;NkiD>+T*Z_IQboSMmj?0K6DF$Di<#0cL4O ztYU}|!&=Nz1y@+UNczk#%hOK_KxzxMBxxUgHXSG$nUsMRG!mA56E%xSaM%#&%y8mkw~=I2Y@vz46}~FrF%N!Uu?G>NLf<9rJ!Z^WG#t zYD0nPD5~x`5ZncIk_W6HtIfvy$vm_zk`GprPe7kuHbC~HR+CSE4L5bh<3B>Gdc*s~ zBQYTl87ls>|KcJm{w`ZQ4LD3^{Mki$TcK`YG5>;x`?w4b8Y3kd_uTFNq9SdPCC%MG zCi}eM9;!Y^zO(7cpC0UPQ|_rjFJ!<{Lq0YzjVL$FBH4O@c1wLohAQf)a*q#XpmD<1 zPZIyC)(bTN+v8EY->Rx$q?B`$TJtDuC$?$HMg>uC@>ck1P%8~)4>VK=i4X1x+9`w- z05;z(K?HNN^iEKxkVeUZKUQ`+hICSpxpL&BB}yt)suQbQD@;|6^Ob5~4N7H{1b>-y zkTK)`xf)D#V{``hSn?xDtA28+2|BCg9mT7=z7Q|8g%0MGY(<OS2Ld>(M2y*~=^jxTaW9?w#q5y8u2({KMSbJ`b{)>0kd@`^Qedyr zAA3f%6IOMkq>&)2{8T;i#-9Zzz}{8kX zonQZ3V+|c>z}k*Y@3!iZ5BTx7m8iG7 z9h-uE6Kf9T)A6wcQ;qH-TUa?(qSu2QkJKNvnptTszX^y-XWrvcWj+h3l@?sgJR3Sk zb}T=OdD}XH>0ax+$S;!hI`P(mT;L-OOWIniSPjP1t9s(tyrLer z;3PlyI)@_M7lNxYkf&1jK!llzMreKCZ!g9JI8Fv3$oNv>jEe z?t?ok@8LMfpt#d{=$&!|BIc9V`SgxFI&Do1rqHl)wNDCb1?4lL@OiMSDG!~?&<%2* zHay@bMzHNux-r>mK2FRuk$Nqt?wbd-%$5BJCM=;33PK*PEqPAry$yZ&HqOi_sdMGe zo|#fdXewD;N@nJGl;(1>frflM7C@{Y z4Ot<8e--IvM~Yv+Hu)I zmEkKZ90c4=G7%X=ZcyHUklXR^%QQN1VvSXMdvBCw4R@pY?`S zh~QSBjuVs%v9cZ zF>|wyP{xQe35YCxMj2TENdXCuLVHw)LumY)xrUoZ=U?c$($H7&V8X#zpW6Up@C{CB zkSsmGyV&$Y_dyED=JoS)Xg5K#%kjG0_fMCT+C2!lpC2E;eT0nBU32$$23huYZ+To7 zAW7*Y{Rm5)`^Axo1QX=3c^(EAwJ|0Xt~*pL{AG0@T7h9*^FM)48ok}(=hjeoBMAEH zxA6*`bEj1P8v{{RHw;&W4!GxFPi6NNqkPA}!LCam3j4w1KtQq!CY2VD+a^-YE0x=; z0HUKlZ>Dx--0&x+5C%;$su0$1`hEv@5kYG|xEWHUDl^51!lf_p9tz?!fBFIf*!bHCKx(6Or-9>-XE2vn(a|+e&M|pm4 ziVP9af}1rP1BmL8cNCNp5yC%o{3vi@uUP9i%uv()ybEOe@CnrZgC>+Tx1ndK5&I%b zJzh5A_CoM?u+Pu1=|#-Ad$jxsQ5gn6voR(gFwSeKB?9CA1@GoLQ(-G-I9{)lmsJw+ z{05P(v5x?f?1c$F&8WMJIN2XMm^R$Sm|UYSQins&ALAHy{5f8>u5DRgNq9+e<--=& z4o+64j<;_@xNhzur{L+FC?lIQ^7U?xzzpX}^Pm;Onaj}6jd0V!x`S0x$IC5&+WK#b z%8Db&okUmrPK^vGoss91%HWimra~pdqp%-EzcsufW4FX4_+?sHhxXS%`11`kqEY^xG7d&A?u)`QuJVb8iSS zl`(}4O$o{N`zE}vOYFZPGAW${yDnI~7F>9fU`6>13dYmIF#I?ocq>e;O*LnwFtAh4 zD(zfKF2(WLCQc9#iu%R(cE6c+NQN(_jF|);IJGfygngr1J>|(N+{|VW>To+~Fg*xT zM23O1OyqnNEy_~zf}#56Ly})=t>6X`kr@0s13Mz?tt;Nt1lbU8@JMqGd_VZJ^^QCT zC96;{!ulPN@(is9V-x}rDp>PWQ!An3U^6vUnPJcul^SQ~Q$Z=eLtc#0=w`U@K4qE# z=y&et`?cTQZ!d$|z}Kqn$CznjL2o%9*71*GHtg_y2^V~f;g!)v*2JhS9+{MYG0Q+H zE7DD{eAo<+5?F3c@suV(pkRUtQa623d+MkUqhBFSo1qP6nYg5YOIdhI+-467vNeJiATHDDS&y(da(4DB0J+l4feg`b0;sBV zq5%+L;e!#$67sZij+hLR8ywNbX1XO>oo($~>cIlJT^9oa$}T6!yYMXDkR?*;Df;x2 zSsxjh35AO}(wPcs95`*7Ow=z4$l(1}$gI@inlWI>Ry-f zW+Iihi@8h&R^ku4z4o@mJI0B!vMPMQqX-FTFkwSrJUq^X% zn)6lR`U(9O7g(_#0)N55c{pB0+3R0^3D7E!;_ozK>43#G$(RVX=WQ^WR{m7*_v*w{dK1WDcT7wjR|m9nV2eJWJnMdsTG zG+p?RuC#L|1;-WI4z5S|JXr1Y*}Ol#uf%JN%?&^EbF22BvxM{`_SA)vogx|wYE^Sr z`uZqW3BQ+oByHU3w=izwUhFN;1)W@u0&uanhMO z;2FguWlyTkn1nw)O?S@m_mfu^4@oezQFqM@?NuO&B^%dw2P2~!nDw#K>mRl{Y`m%0 zrLzxnKNpV%{N7`xsf6nmr&r;$j03aVJa6e_A1YymPFi-?8KTdsV@WyVi*3iA>wk=J zKUjll$Ht~ z(AxoN9wL$OdpOPtL>x3!rzLE>U0Mq@Q+05T3|`QkO)iVh8jUCV;a91iL(3rxp&lP; z&(44EzQYU)U`u17SG*P;PoI4sHqeZ_m+z_k{X+2mivrJRV%EH%#NvbBAb6zJV!*1v zSzvBGU6PC87%=C`CiB7L0%swFpJ`5<7?U%)3v3 zIBb&yX?9Y@d~Yw@E;;21V@YqGrENJGegX@c&ZjL^jB9o9E@j6jRSJTUy-feI+Zzl- zSBpMU^{8+5ahG^*?L1wH(sERQYIjxV7sZEPY^f&T?XT&wD;=)*9yAj+fTMhsW4<}t z_pOcT&WZ3l9Mu;(C&=M~jZbWX;U@S3I|JJ1GlZb&pSUkwMv^E{o*}*t0c;J6WTEr5 zUB#xNla`oQ~wlSmdX?tZJN{vCcFf?o~hU;g}?aY4dryrjUnSx+8r{{cVjn$68A3w z-M6ezpPU$=&=0}m>g1`;;iC%%3!_BMgzA|>_jG4EHPSWoSm0u|kpn{ZBBrx|5u_+! zm0d5y=8ruQ47;P@0d~G9)hS)hggg4LeFs84p6v+;*bZ^{3rta zgAHW;NN8Odw|PcLU0blzg>h;?J7O&I5YX*W5L3csxwzvBwa8{qK_LSVz%hjXPb*JF z@fCLj>^aoRKu0U`T8pRV@{(F->%~V*x5rR_ICN;6UeaXCV(av$h|}_0NJlGiv;8kq zLw%IBmfP~$8kzH-eg?}+dnod=eVDjw>V~sV-SKZ@^R}xk%7g+eb53DEhM1lzL#kj)5F5|peu|B zq{&i2?b(URxzW1-YjT4IVga^U;f}s=N-FgD0X*p*M;iI5Eh8p|dSNZSl+=EKc_~V z{P5n?d63B9w7R{_T z0espD?h^HXn17E}=_!by>BH&at4PA7locf;)rUN=$T9pzxgsEtc9JmlJSb&=ewQau z3}qQ5nM-k)Dn6j7`2O%Ld0*hCd@zXb!lUKu{N*t7>W2oNaDUUWVDadADJ1H@S%GCM$79%;{d0a-a>l64St&wqS-L15 zM+&y{bU(73>AZ1aJ^4UUyA1>HpiI84N$;tw$+OvOR3zugyG-89;w)fG>ML@CW4NKoN3 z4DpKEtZigO&SmfJsehiPbXl%B+X~iRV>Lk?IWgeDhctY^9?=xns+wdEv`O4?I(Ia6 z6CheADELCJWv^rKb?ccc#_{ZKScyQ1;j+meX_@V7$Hw9tTqou#Yv>qldUP5do;~zA^a@)aDV2e&0FSFyUT2;&%3LDY0iRhp^H1c^Z~}1x3bG0loF3O-y|t?zOcSlHY8~*Gx-dHP%ET~tVva+IN&q|l6zw3IagTz5q;x|cDYXe9jv<8w11z^ii%4mKwiM%26MX=A` zAj36XI;BbHkn13$J@+4uJZB7v@SKjy2_CT@pDJ8Ck$QUNJC;d<!QMpMH?+0b&0q znIK5@J0$l9Tj00I?~vGRe`y2r&mq}A`iO;d$d3l~(V)LAoWqpA`~?F~VLuw&M}z-p z2;Txv5!HqMYR%CA`2O}tv;cv>y*w@8FBc*xoE9MYw^!i+5Q2_r0n~p5R62mj-(HOl zAdF&92WvQgNu7Kv4F)zo0S?Ng1IYg!G-Ln}Ld40YxN714C0a!Pi=q9+hX2Lv=mD62 zu^{>n3{nns#RMP#wbKIt|5us+9}pk(P7gr+zuF%EfpQH0n*3*(`v1T*hJR=NWAjw* zV{JUpCIbNZ|E@zO|AFD7eDE=XLtuhog8hB{A76F;j*$ZX*8q_5!@1;tlt2lr060(& z+e-RB>mk_jLMK~eno8g(G@H~;qdAWLR| z7$hkkc*>3@&R$!m@&DZyII#a8>dAlZ*S{al|7iSWummBq0|+6J>LEd<-yw-W^6UTvQm2ni z@joVmVf{}5OsXE_!T#Zm&%ZhZpiw#i3TT%dzyaYt2EyS0{N2(2Y&i(S9Z&-Y0QY}5 z_SfnEZJhjn8Bh90Lm6Ur2L#Uf?`9U}{BTfU6BYyx4#xb@I zIDwC6v&{YR4C+(=!x?!1@{k3E|4B@BABvqkABudX|3Rd@04_+G+W(|PUVtzJem!W0 z7vKfCy73Px46;9kL;cry8Q+KTz!>1wsgazBK^PH;L`a2X262r zd*Bg4iTod{VlDrNKl1~4AekT${@T$1eHQvKaVn1RKTVWy|1&58;*~%^{&(>)>Hjq& zjQ^h*!XQV%kL{Xd^q+Jk2;hU%@cK`(7Xk=EN|*m99SePou~q#i4SYkuOcw$GK*7QQ zVo1VTgul;+6_nqBfC}0Z{&3g6{vU_}#32GOgt%@2C5r&WAj}Ryiyu9t_$?v`PZYpU nMFt4~vvqR!Fm-TX_HlGjRe*;1dn+VA-nqD7U~vS159$8{@y{)H diff --git a/upload/admin/controller/module/img_opti.php b/upload/admin/controller/module/img_opti.php index b2785f7..bf93a79 100644 --- a/upload/admin/controller/module/img_opti.php +++ b/upload/admin/controller/module/img_opti.php @@ -6,7 +6,11 @@ class ControllerModuleImgOpti extends Controller { private $translations = array(); public function index() { - $data = $this->load->language('module/img_opti'); + $lang_data = $this->load->language('module/img_opti'); + if (!is_array($lang_data)) { + $lang_data = array(); + } + $data = array_merge($this->loadLanguageSafe(), $lang_data); $this->document->setTitle($this->language->get('heading_title_raw')); $this->load->model('setting/setting'); @@ -95,6 +99,7 @@ class ControllerModuleImgOpti extends Controller { 'module_img_opti_cron_webp_quality' => 80, 'module_img_opti_cron_max_width' => 1600, 'module_img_opti_cron_max_height' => 1600, + 'module_img_opti_cron_batch_limit' => 100, 'module_img_opti_cron_tasks' => '', 'module_img_opti_wm_type' => 'image', 'module_img_opti_wm_image' => '', @@ -145,9 +150,12 @@ class ControllerModuleImgOpti extends Controller { 'module_img_opti_disk_quota_total' => 0, 'module_img_opti_disk_quota_used' => 0, 'module_img_opti_disk_status' => 0, + 'module_img_opti_grid_limit' => 50, 'module_img_opti_wm_max_width' => 0, 'module_img_opti_wm_max_height' => 0, - 'module_img_opti_truefilemanager_webp'=> (is_file(DIR_APPLICATION . 'controller/common/truefilemanager.php') || is_file(DIR_SYSTEM . 'library/sitecreator/trueFileManager/ControllerCommonTrueFileManager.php')) ? 1 : 0 + 'module_img_opti_truefilemanager_webp'=> (is_file(DIR_APPLICATION . 'controller/common/truefilemanager.php') || is_file(DIR_SYSTEM . 'library/sitecreator/trueFileManager/ControllerCommonTrueFileManager.php')) ? 1 : 0, + 'module_img_opti_auto_fake_jpg_guard' => 1, + 'module_img_opti_fake_jpg_mode' => 'jpg' ); foreach ($fields as $key => $default) { @@ -175,10 +183,22 @@ class ControllerModuleImgOpti extends Controller { 'jpg_quality' => (int)$data['module_img_opti_cron_jpg_quality'], 'webp_quality' => (int)$data['module_img_opti_cron_webp_quality'], 'max_width' => (int)$data['module_img_opti_cron_max_width'], - 'max_height' => (int)$data['module_img_opti_cron_max_height'] + 'max_height' => (int)$data['module_img_opti_cron_max_height'], + 'batch_limit' => (int)$data['module_img_opti_cron_batch_limit'] ) ); $data['module_img_opti_cron_tasks_json'] = json_encode($default_cron_tasks, JSON_UNESCAPED_UNICODE); + } else { + $cron_tasks_arr = json_decode(html_entity_decode($data['module_img_opti_cron_tasks'], ENT_QUOTES, 'UTF-8'), true); + if (is_array($cron_tasks_arr)) { + foreach ($cron_tasks_arr as &$t) { + if (!isset($t['batch_limit'])) { + $t['batch_limit'] = 100; + } + } + unset($t); + $data['module_img_opti_cron_tasks_json'] = json_encode($cron_tasks_arr, JSON_UNESCAPED_UNICODE); + } } if (empty($data['module_img_opti_wm_rules'])) { @@ -431,6 +451,11 @@ class ControllerModuleImgOpti extends Controller { } } + $stats = $this->getModuleModel()->getGlobalStats(); + $data['stats_files'] = number_format($stats['total_files'], 0, '.', ' '); + $data['stats_saved_mb'] = number_format($stats['saved_mb'], 2, '.', ' '); + $data['stats_avg_pct'] = number_format($stats['avg_pct'], 1, '.', ' '); + $data['header'] = $this->load->controller('common/header'); $data['column_left'] = $this->load->controller('common/column_left'); $data['footer'] = $this->load->controller('common/footer'); @@ -438,6 +463,13 @@ class ControllerModuleImgOpti extends Controller { $this->response->setOutput($this->load->view('module/img_opti', $data)); } + private function getModuleModel() { + if (!isset($this->model_extension_module_img_opti)) { + $this->load->model('module/img_opti'); + } + return $this->model_extension_module_img_opti; + } + public function autocomplete_category() { $this->loadLanguageSafe(); if (!isset($this->request->get['user_token']) || !isset($this->session->data['user_token']) || $this->request->get['user_token'] !== $this->session->data['user_token']) { @@ -553,10 +585,35 @@ class ControllerModuleImgOpti extends Controller { file_put_contents(DIR_CACHE . 'img_opti_queue.json', json_encode($allFiles, JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR)); $json['total'] = count($allFiles); $json['success'] = $this->language->get('text_found') . $json['total']; + $json['log'] = array("
" . htmlspecialchars($json['success'], ENT_QUOTES | ENT_IGNORE, 'UTF-8') . "
"); + file_put_contents(DIR_CACHE . 'img_opti_opti_scan_summary.json', json_encode($json, JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR)); + @unlink(DIR_CACHE . 'img_opti_process_state.json'); $this->response->setOutput(json_encode($json)); } + public function get_cached_opti() { + $this->loadLanguageSafe(); + $this->response->addHeader('Content-Type: application/json'); + $state_file = DIR_CACHE . 'img_opti_process_state.json'; + if (file_exists($state_file)) { + $state = json_decode(file_get_contents($state_file), true); + if ($state) { + $this->response->setOutput(json_encode($state)); + return; + } + } + $summary_file = DIR_CACHE . 'img_opti_opti_scan_summary.json'; + if (file_exists($summary_file)) { + $json = json_decode(file_get_contents($summary_file), true); + if ($json) { + $this->response->setOutput(json_encode($json)); + return; + } + } + $this->response->setOutput(json_encode(array('total' => 0, 'success' => ''))); + } + public function process() { $this->loadLanguageSafe(); if (!isset($this->request->get['user_token']) || !isset($this->session->data['user_token']) || $this->request->get['user_token'] !== $this->session->data['user_token']) { @@ -577,6 +634,7 @@ class ControllerModuleImgOpti extends Controller { session_write_close(); if (!file_exists($queueFile)) { + $this->markProcessFinishedState(); $json['finished'] = true; $this->response->setOutput(json_encode($json)); return; @@ -601,6 +659,7 @@ class ControllerModuleImgOpti extends Controller { flock($fp, LOCK_UN); fclose($fp); @unlink($queueFile); + $this->markProcessFinishedState(); $json['finished'] = true; $this->response->setOutput(json_encode($json)); return; @@ -803,14 +862,63 @@ class ControllerModuleImgOpti extends Controller { $json['optimized'] = $batchOptimized; $json['batch_old'] = $batchOldSize; $json['batch_new'] = $batchNewSize; + + if ($batchOptimized > 0 && $batchOldSize > $batchNewSize) { + $bytesSaved = $batchOldSize - $batchNewSize; + $this->getModuleModel()->recordGlobalStats($batchOptimized, $bytesSaved, $batchOldSize, 'manual_opti'); + } + $globalStats = $this->getModuleModel()->getGlobalStats(); + $json['stats'] = array( + 'files' => number_format($globalStats['total_files'], 0, '.', ' '), + 'saved_mb' => number_format($globalStats['saved_mb'], 2, '.', ' '), + 'avg_pct' => number_format($globalStats['avg_pct'], 1, '.', ' ') + ); - if (!file_exists($queueFile)) { + if (!file_exists($queueFile) || empty($queue)) { $json['finished'] = true; } + + $stateFile = DIR_CACHE . 'img_opti_process_state.json'; + $state = array('total' => 0, 'processed' => 0, 'optimized' => 0, 'old_bytes' => 0, 'new_bytes' => 0, 'finished' => false, 'log' => array(), 'mode' => $mode, 'copy_folder' => $copyFolder); + if (file_exists($stateFile)) { + $prev = json_decode(file_get_contents($stateFile), true); + if ($prev) $state = array_merge($prev, $state); + } + $state['mode'] = $mode; + $state['copy_folder'] = $copyFolder; + $state['processed'] += $processed; + $state['optimized'] += $batchOptimized; + $state['old_bytes'] += $batchOldSize; + $state['new_bytes'] += $batchNewSize; + if (!empty($json['log'])) { + $state['log'] = array_merge($state['log'], $json['log']); + } + if (!empty($json['finished'])) { + $state['finished'] = true; + } + $scanSummary = DIR_CACHE . 'img_opti_opti_scan_summary.json'; + if (file_exists($scanSummary)) { + $scan = json_decode(file_get_contents($scanSummary), true); + if ($scan && isset($scan['total'])) { + $state['total'] = $scan['total']; + } + } + file_put_contents($stateFile, json_encode($state, JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR)); $this->response->setOutput(json_encode($json)); } + private function markProcessFinishedState() { + $stateFile = DIR_CACHE . 'img_opti_process_state.json'; + if (file_exists($stateFile)) { + $state = json_decode(file_get_contents($stateFile), true); + if ($state) { + $state['finished'] = true; + file_put_contents($stateFile, json_encode($state, JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR)); + } + } + } + public function applyChanges() { $this->loadLanguageSafe(); if (!isset($this->request->get['user_token']) || !isset($this->session->data['user_token']) || $this->request->get['user_token'] !== $this->session->data['user_token']) { @@ -934,8 +1042,6 @@ class ControllerModuleImgOpti extends Controller { $this->saveOptimizedCache($cache); } - $this->recursiveDelete($source_dir); - $msg = $this->language->get('text_apply_success'); $msg .= $do_backup ? $this->language->get('text_apply_backup_ok') . htmlspecialchars($backup_name, ENT_QUOTES, 'UTF-8') : $this->language->get('text_apply_no_backup'); @@ -945,6 +1051,10 @@ class ControllerModuleImgOpti extends Controller { $json['success'] = $msg; } + @unlink(DIR_CACHE . 'img_opti_process_state.json'); + @unlink(DIR_CACHE . 'img_opti_opti_scan_summary.json'); + @unlink(DIR_CACHE . 'img_opti_queue.json'); + $this->response->setOutput(json_encode($json)); } @@ -1011,6 +1121,41 @@ class ControllerModuleImgOpti extends Controller { $json['success'] = $this->language->get('text_quarantine_empty'); + @unlink(DIR_CACHE . 'img_opti_process_state.json'); + @unlink(DIR_CACHE . 'img_opti_opti_scan_summary.json'); + @unlink(DIR_CACHE . 'img_opti_queue.json'); + + $this->response->setOutput(json_encode($json)); + } + + public function save_grid_limit() { + $this->loadLanguageSafe(); + $json = array(); + + if (!isset($this->request->get['user_token']) || !isset($this->session->data['user_token']) || $this->request->get['user_token'] !== $this->session->data['user_token']) { + $json['error'] = $this->language->get('error_permission'); + $this->response->setOutput(json_encode($json)); + return; + } + + if (!$this->user->hasPermission('modify', 'module/img_opti')) { + $json['error'] = $this->language->get('error_permission'); + $this->response->setOutput(json_encode($json)); + return; + } + + $limit = isset($this->request->post['limit']) ? max(1, (int)$this->request->post['limit']) : 50; + + $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "setting` WHERE `code` = 'module_img_opti' AND `key` = 'module_img_opti_grid_limit' AND `store_id` = '0'"); + if ($query->num_rows) { + $this->db->query("UPDATE `" . DB_PREFIX . "setting` SET `value` = '" . (int)$limit . "' WHERE `code` = 'module_img_opti' AND `key` = 'module_img_opti_grid_limit' AND `store_id` = '0'"); + } else { + $this->db->query("INSERT INTO `" . DB_PREFIX . "setting` SET `code` = 'module_img_opti', `key` = 'module_img_opti_grid_limit', `value` = '" . (int)$limit . "', `serialized` = '0', `store_id` = '0'"); + } + + $json['success'] = true; + $json['limit'] = $limit; + $this->response->setOutput(json_encode($json)); } @@ -1099,7 +1244,7 @@ class ControllerModuleImgOpti extends Controller { $tool = isset($this->request->post['tool']) ? preg_replace('/[^a-zA-Z0-9_]/', '', (string)$this->request->post['tool']) : ''; $this->load->model('module/img_opti'); - $json = $this->model_module_img_opti->generateCompareUrls($tool, $id); + $json = $this->model_extension_module_img_opti->generateCompareUrls($tool, $id); $this->response->addHeader('Content-Type: application/json'); $this->response->setOutput(json_encode($json)); @@ -1362,6 +1507,23 @@ class ControllerModuleImgOpti extends Controller { return false; } + public function reset_stats() { + $this->loadLanguageSafe(); + if (!isset($this->request->get['user_token']) || !isset($this->session->data['user_token']) || $this->request->get['user_token'] !== $this->session->data['user_token']) { + $this->response->addHeader('Content-Type: application/json'); + $this->response->setOutput(json_encode(array('error' => $this->language->get('error_permission')))); + return; + } + $newStats = $this->getModuleModel()->resetGlobalStats(); + $this->response->addHeader('Content-Type: application/json'); + $this->response->setOutput(json_encode(array( + 'success' => true, + 'files' => number_format($newStats['total_files'], 0, '.', ' '), + 'saved_mb' => number_format($newStats['saved_mb'], 2, '.', ' '), + 'avg_pct' => number_format($newStats['avg_pct'], 1, '.', ' ') + ))); + } + public function run_tool() { $this->loadLanguageSafe(); if (!isset($this->request->get['user_token']) || !isset($this->session->data['user_token']) || $this->request->get['user_token'] !== $this->session->data['user_token']) { @@ -1391,12 +1553,19 @@ class ControllerModuleImgOpti extends Controller { $this->load->model('module/img_opti'); - $method = $action . '_' . $tool; - if ($tool === 'broken') { - $method = $action . '_broken_db'; + if ($action === 'get_cached_grid') { + $method = 'get_cached_grid'; + } elseif ($action === 'preview_black_bg_row') { + $method = 'preview_black_bg_row'; + } else { + $method = $action . '_' . $tool; + if ($tool === 'broken') { + $method = $action . '_broken_db'; + } } $allowed_methods = array( + 'get_cached_grid', 'scan_broken_db', 'fix_broken_db', 'scan_broken_files', 'fix_broken_files', 'scan_duplicates', 'fix_duplicates', @@ -1409,15 +1578,33 @@ class ControllerModuleImgOpti extends Controller { 'scan_placeholders', 'fix_placeholders', 'scan_watermark', 'scan_small_photos', 'fix_small_photos', - 'scan_html_broken', + 'scan_html_broken', 'fix_html_broken', 'scan_folder_tree', 'fix_folder_tree', 'scan_sanitizer', 'fix_sanitizer', 'scan_cmyk', 'fix_cmyk', - 'scan_heavy_files', 'fix_heavy_files' + 'scan_heavy_files', 'fix_heavy_files', + 'scan_svg_security', 'fix_svg_security', + 'scan_black_bg', 'fix_black_bg', 'preview_black_bg_row' ); if (in_array($method, $allowed_methods)) { - $json = $this->model_module_img_opti->{$method}($this->request->post); + $start = isset($this->request->post['start']) ? max(0, (int)$this->request->post['start']) : 0; + $limit = isset($this->request->post['limit']) ? max(0, (int)$this->request->post['limit']) : 0; + $page = isset($this->request->post['page']) ? max(1, (int)$this->request->post['page']) : 1; + + if ($limit > 0 && $start === 0 && $page > 1) { + $start = ($page - 1) * $limit; + } + + $this->request->post['start'] = $start; + $this->request->post['limit'] = $limit; + + $json = $this->model_extension_module_img_opti->{$method}($this->request->post); + + if (isset($json['total']) && $limit > 0) { + $json['page'] = floor($start / $limit) + 1; + $json['pages'] = max(1, ceil($json['total'] / $limit)); + } } else { $json['error'] = 'Tool method not found: ' . $method; } @@ -1500,7 +1687,7 @@ class ControllerModuleImgOpti extends Controller { 'limit' => isset($this->request->post['limit']) ? (int)$this->request->post['limit'] : 200 ); - $json = $this->model_module_img_opti->scan_broken_db($data); + $json = $this->model_extension_module_img_opti->scan_broken_db($data); $this->response->addHeader('Content-Type: application/json'); $this->response->setOutput(json_encode($json)); } @@ -1536,7 +1723,7 @@ class ControllerModuleImgOpti extends Controller { 'fix_all' => isset($this->request->post['fix_all']) ? (int)$this->request->post['fix_all'] : 0 ); - $this->model_module_img_opti->fix_broken_db($data); + $this->model_extension_module_img_opti->fix_broken_db($data); $json['success'] = true; $this->response->addHeader('Content-Type: application/json'); @@ -1743,9 +1930,24 @@ class ControllerModuleImgOpti extends Controller { file_put_contents(DIR_CACHE . 'img_opti_trash_queue.json', json_encode($trashFiles, JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR)); $json['total'] = count($trashFiles); + file_put_contents(DIR_CACHE . 'img_opti_trash_scan_summary.json', json_encode($json, JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR)); $this->response->setOutput(json_encode($json)); } + public function get_cached_trash() { + $this->loadLanguageSafe(); + $this->response->addHeader('Content-Type: application/json'); + $summary_file = DIR_CACHE . 'img_opti_trash_scan_summary.json'; + if (file_exists($summary_file)) { + $json = json_decode(file_get_contents($summary_file), true); + if ($json) { + $this->response->setOutput(json_encode($json)); + return; + } + } + $this->response->setOutput(json_encode(array('total' => 0, 'total_bytes' => 0, 'log' => array()))); + } + public function process_trash() { $this->loadLanguageSafe(); if (!isset($this->request->get['user_token']) || !isset($this->session->data['user_token']) || $this->request->get['user_token'] !== $this->session->data['user_token']) { @@ -1840,6 +2042,7 @@ class ControllerModuleImgOpti extends Controller { file_put_contents($queueFile, json_encode($queue, JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR)); if (empty($queue)) { @unlink($queueFile); + @unlink(DIR_CACHE . 'img_opti_trash_scan_summary.json'); $json['finished'] = true; } $this->response->setOutput(json_encode($json)); @@ -2014,20 +2217,34 @@ class ControllerModuleImgOpti extends Controller { } } - $temp_preview = DIR_IMAGE . 'cache/temp_wm_preview.png'; $compare_dir = DIR_IMAGE . 'cache/'; if (!is_dir($compare_dir)) { @mkdir($compare_dir, 0755, true); } - $preview_w = 500; - $preview_h = 500; - $preview_im = imagecreatetruecolor($preview_w, $preview_h); + // Clean up old preview files older than 30 seconds + foreach (@glob($compare_dir . 'temp_wm_preview_*.png') as $old_file) { + if (is_file($old_file) && (time() - filemtime($old_file) > 30)) { + @unlink($old_file); + } + } + + $preview_hash = md5(microtime(true) . rand(10000, 99999)); + $temp_rel_path = 'cache/temp_wm_preview_' . $preview_hash . '.png'; + $temp_preview = DIR_IMAGE . $temp_rel_path; if ($bg_mode === 'white') { + $preview_w = 500; + $preview_h = 500; + $preview_im = imagecreatetruecolor($preview_w, $preview_h); $white = imagecolorallocate($preview_im, 255, 255, 255); imagefill($preview_im, 0, 0, $white); } elseif ($bg_mode === 'transparent') { + $preview_w = 500; + $preview_h = 500; + $preview_im = imagecreatetruecolor($preview_w, $preview_h); + imagealphablending($preview_im, false); + imagesavealpha($preview_im, true); $c1 = imagecolorallocate($preview_im, 255, 255, 255); $c2 = imagecolorallocate($preview_im, 226, 232, 240); imagefill($preview_im, 0, 0, $c1); @@ -2040,9 +2257,6 @@ class ControllerModuleImgOpti extends Controller { } } } else { - $white = imagecolorallocate($preview_im, 255, 255, 255); - imagefill($preview_im, 0, 0, $white); - $base_img = false; if (is_file($base_file)) { $ext = strtolower(pathinfo($base_file, PATHINFO_EXTENSION)); @@ -2058,14 +2272,20 @@ class ControllerModuleImgOpti extends Controller { if ($base_img) { $orig_w = imagesx($base_img); $orig_h = imagesy($base_img); - $scale = min($preview_w / $orig_w, $preview_h / $orig_h); - $new_w = intval($orig_w * $scale); - $new_h = intval($orig_h * $scale); - $dst_x = intval(($preview_w - $new_w) / 2); - $dst_y = intval(($preview_h - $new_h) / 2); + $max_side = 500; + $scale = min($max_side / max(1, $orig_w), $max_side / max(1, $orig_h)); + $preview_w = max(10, intval($orig_w * $scale)); + $preview_h = max(10, intval($orig_h * $scale)); - imagecopyresampled($preview_im, $base_img, $dst_x, $dst_y, 0, 0, $new_w, $new_h, $orig_w, $orig_h); + $preview_im = imagecreatetruecolor($preview_w, $preview_h); + imagecopyresampled($preview_im, $base_img, 0, 0, 0, 0, $preview_w, $preview_h, $orig_w, $orig_h); imagedestroy($base_img); + } else { + $preview_w = 500; + $preview_h = 500; + $preview_im = imagecreatetruecolor($preview_w, $preview_h); + $white = imagecolorallocate($preview_im, 255, 255, 255); + imagefill($preview_im, 0, 0, $white); } } @@ -2093,12 +2313,12 @@ class ControllerModuleImgOpti extends Controller { $this->config->set('module_img_opti_wm_target_blog', 0); $this->load->model('module/img_opti'); - $res = $this->model_module_img_opti->applyDynamicWatermark($temp_preview, '', true); + $res = $this->model_extension_module_img_opti->applyDynamicWatermark($temp_preview, '', true); if ($res) { $catalog_url = (defined('HTTPS_CATALOG') && HTTPS_CATALOG) ? HTTPS_CATALOG : (defined('HTTP_CATALOG') ? HTTP_CATALOG : ''); $json['success'] = true; - $json['preview_url'] = $catalog_url . 'image/cache/temp_wm_preview.png?t=' . time(); + $json['preview_url'] = $catalog_url . 'image/' . $temp_rel_path . '?v=' . microtime(true); } else { $json['error'] = $this->language->get('error_wm_preview') ?: 'Failed to generate preview'; } @@ -2373,12 +2593,69 @@ class ControllerModuleImgOpti extends Controller { die('Permission denied'); } $this->load->model('setting/setting'); - $settings = $this->model_setting_setting->getSetting('module_img_opti'); + $rawSettings = $this->model_setting_setting->getSetting('module_img_opti'); + + $allKeys = array( + 'module_img_opti_status', + 'module_img_opti_engine', + 'module_img_opti_jpg_quality', + 'module_img_opti_png_quality', + 'module_img_opti_webp_quality', + 'module_img_opti_max_width', + 'module_img_opti_max_height', + 'module_img_opti_convert_webp', + 'module_img_opti_support_svg', + 'module_img_opti_support_webp', + 'module_img_opti_webp_on_fly', + 'module_img_opti_lazy_load', + 'module_img_opti_auto_fake_jpg_guard', + 'module_img_opti_fake_jpg_mode', + 'module_img_opti_broken_fallback', + 'module_img_opti_fallback_image', + 'module_img_opti_cron_tasks', + 'module_img_opti_wm_status', + 'module_img_opti_wm_rules', + 'module_img_opti_wm_max_width', + 'module_img_opti_wm_max_height', + 'module_img_opti_ph_rules', + 'module_img_opti_folder_rules', + 'module_img_opti_log_level', + 'module_img_opti_min_savings_bytes', + 'module_img_opti_min_savings_percent', + 'module_img_opti_heavy_limit', + 'module_img_opti_heavy_min_size', + 'module_img_opti_png_jpg_limit', + 'module_img_opti_png_jpg_min_size', + 'module_img_opti_sanitizer_limit', + 'module_img_opti_grid_limit', + 'module_img_opti_disk_quota_total', + 'module_img_opti_disk_quota_used', + 'module_img_opti_disk_status', + 'module_img_opti_truefilemanager_webp' + ); + + $exportSettings = array(); + foreach ($allKeys as $k) { + if (isset($rawSettings[$k])) { + $exportSettings[$k] = $rawSettings[$k]; + } else { + $exportSettings[$k] = $this->config->get($k); + } + } + + if (is_array($rawSettings)) { + foreach ($rawSettings as $k => $v) { + if (strpos($k, 'module_img_opti') === 0 && !isset($exportSettings[$k])) { + $exportSettings[$k] = $v; + } + } + } + $export = array( '_module' => 'img_opti', '_version' => '1.2.0', '_exported' => date('Y-m-d H:i:s'), - 'settings' => $settings + 'settings' => $exportSettings ); $filename = 'img_opti_settings_' . date('Ymd_His') . '.json'; $this->response->addHeader('Content-Type: application/json'); @@ -2408,13 +2685,16 @@ class ControllerModuleImgOpti extends Controller { $json['error'] = $this->language->get('error_import_invalid'); } else { $this->load->model('setting/setting'); - $safe = array(); + $current = $this->model_setting_setting->getSetting('module_img_opti'); + if (!is_array($current)) { + $current = array(); + } foreach ($data['settings'] as $key => $value) { if (strpos($key, 'module_img_opti') === 0) { - $safe[$key] = $value; + $current[$key] = $value; } } - $this->model_setting_setting->editSetting('module_img_opti', $safe); + $this->model_setting_setting->editSetting('module_img_opti', $current); $this->cache->delete('img_opti_disk_stats'); $json['success'] = true; } @@ -2422,5 +2702,158 @@ class ControllerModuleImgOpti extends Controller { $this->response->addHeader('Content-Type: application/json'); $this->response->setOutput(json_encode($json)); } + + public function autoRotateImage($filePath, $im = null) { + if (!function_exists('exif_read_data')) { + return $im; + } + $ext = strtolower(pathinfo($filePath, PATHINFO_EXTENSION)); + if (!in_array($ext, array('jpg', 'jpeg', 'tiff'))) { + return $im; + } + $exif = @exif_read_data($filePath); + if (!$exif || !isset($exif['Orientation'])) { + return $im; + } + $orientation = (int)$exif['Orientation']; + $angle = 0; + switch ($orientation) { + case 3: + $angle = 180; + break; + case 6: + $angle = -90; + break; + case 8: + $angle = 90; + break; + } + if ($angle !== 0) { + if ($im !== null) { + $im = @imagerotate($im, $angle, 0); + } else { + $img = @imagecreatefromjpeg($filePath); + if ($img) { + $img = @imagerotate($img, $angle, 0); + @imagejpeg($img, $filePath, 95); + @imagedestroy($img); + } + } + } + return $im; + } + + public function convertPngToJpgClean($sourcePngPath, $targetJpgPath, $quality = 100, $bgColorHex = '#ffffff') { + $img = @imagecreatefrompng($sourcePngPath); + if (!$img) return false; + + if (function_exists('imagepalettetotruecolor') && !imageistruecolor($img)) { + imagepalettetotruecolor($img); + } + + $width = imagesx($img); + $height = imagesy($img); + + $canvas = imagecreatetruecolor($width, $height); + + $hex = ltrim($bgColorHex, '#'); + if (strlen($hex) === 3) { + $r = hexdec(substr($hex, 0, 1) . substr($hex, 0, 1)); + $g = hexdec(substr($hex, 1, 1) . substr($hex, 1, 1)); + $b = hexdec(substr($hex, 2, 1) . substr($hex, 2, 1)); + } else { + $r = hexdec(substr($hex, 0, 2)); + $g = hexdec(substr($hex, 2, 2)); + $b = hexdec(substr($hex, 4, 2)); + } + + $bgColor = imagecolorallocate($canvas, $r, $g, $b); + imagefill($canvas, 0, 0, $bgColor); + imagealphablending($canvas, true); + + imagecopy($canvas, $img, 0, 0, 0, 0, $width, $height); + + $success = @imagejpeg($canvas, $targetJpgPath, $quality); + + imagedestroy($img); + imagedestroy($canvas); + + return $success; + } + + public function convertPngToWebpClean($sourcePngPath, $targetWebpPath, $quality = 80) { + if (!function_exists('imagewebp')) return false; + $img = @imagecreatefrompng($sourcePngPath); + if (!$img) return false; + + if (function_exists('imagepalettetotruecolor') && !imageistruecolor($img)) { + imagepalettetotruecolor($img); + } + + imagealphablending($img, false); + imagesavealpha($img, true); + + $success = @imagewebp($img, $targetWebpPath, $quality); + imagedestroy($img); + + return $success; + } + + public function normalizePngPalette($img) { + if ($img && function_exists('imagepalettetotruecolor') && !imageistruecolor($img)) { + imagepalettetotruecolor($img); + } + return $img; + } + + public function normalizeCmykToRgbJpeg($fullPath, $quality = 90) { + if (!is_file($fullPath)) return false; + + if (extension_loaded('imagick')) { + try { + $img = new \Imagick($fullPath); + if ($img->getImageColorspace() == \Imagick::COLORSPACE_CMYK) { + $img->transformImageColorspace(\Imagick::COLORSPACE_SRGB); + $img->setImageFormat('jpeg'); + $img->writeImage($fullPath); + $img->clear(); + $img->destroy(); + return true; + } + $img->clear(); + $img->destroy(); + } catch (\Exception $e) {} + } + + $info = @getimagesize($fullPath); + if (isset($info['channels']) && $info['channels'] == 4) { + $img = @imagecreatefromjpeg($fullPath); + if ($img) { + $width = imagesx($img); + $height = imagesy($img); + $rgbCanvas = imagecreatetruecolor($width, $height); + for ($x = 0; $x < $width; $x++) { + for ($y = 0; $y < $height; $y++) { + $pixel = imagecolorat($img, $x, $y); + $c = ($pixel >> 16) & 0xFF; + $m = ($pixel >> 8) & 0xFF; + $y_val = $pixel & 0xFF; + + $r = (int)(($c * $y_val) / 255); + $g = (int)(($m * $y_val) / 255); + $b = (int)($y_val); + + $color = imagecolorallocate($rgbCanvas, min(255, max(0, $r)), min(255, max(0, $g)), min(255, max(0, $b))); + imagesetpixel($rgbCanvas, $x, $y, $color); + } + } + @imagejpeg($rgbCanvas, $fullPath, $quality); + imagedestroy($img); + imagedestroy($rgbCanvas); + return true; + } + } + return false; + } } diff --git a/upload/admin/view/template/module/img_opti.tpl b/upload/admin/view/template/module/img_opti.tpl index b28eff0..c87ffad 100644 --- a/upload/admin/view/template/module/img_opti.tpl +++ b/upload/admin/view/template/module/img_opti.tpl @@ -3300,8 +3300,10 @@ $(document).ready(function() {
-   - + + + +