From 40fab1d9b521a82dfc14090235e0c05e37d6cec9 Mon Sep 17 00:00:00 2001 From: FourTOne5 <59261191+FourTOne5@users.noreply.github.com> Date: Mon, 25 Apr 2022 15:55:48 -0700 Subject: [PATCH] Yeet Hitomi (#11613) --- src/all/hitomi/AndroidManifest.xml | 36 -- src/all/hitomi/build.gradle | 13 - .../hitomi/res/mipmap-hdpi/ic_launcher.png | Bin 3293 -> 0 bytes .../hitomi/res/mipmap-mdpi/ic_launcher.png | Bin 1890 -> 0 bytes .../hitomi/res/mipmap-xhdpi/ic_launcher.png | Bin 4113 -> 0 bytes .../hitomi/res/mipmap-xxhdpi/ic_launcher.png | Bin 8424 -> 0 bytes .../hitomi/res/mipmap-xxxhdpi/ic_launcher.png | Bin 11750 -> 0 bytes src/all/hitomi/res/web_hi_res_512.png | Bin 57327 -> 0 bytes .../extension/all/hitomi/ByteCursor.kt | 93 ---- .../tachiyomi/extension/all/hitomi/Hitomi.kt | 504 ------------------ .../extension/all/hitomi/HitomiActivity.kt | 38 -- .../extension/all/hitomi/HitomiDto.kt | 16 - .../extension/all/hitomi/HitomiFactory.kt | 50 -- .../extension/all/hitomi/HitomiNozomi.kt | 257 --------- 14 files changed, 1007 deletions(-) delete mode 100644 src/all/hitomi/AndroidManifest.xml delete mode 100644 src/all/hitomi/build.gradle delete mode 100644 src/all/hitomi/res/mipmap-hdpi/ic_launcher.png delete mode 100644 src/all/hitomi/res/mipmap-mdpi/ic_launcher.png delete mode 100644 src/all/hitomi/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 src/all/hitomi/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 src/all/hitomi/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 src/all/hitomi/res/web_hi_res_512.png delete mode 100644 src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/ByteCursor.kt delete mode 100644 src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/Hitomi.kt delete mode 100644 src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/HitomiActivity.kt delete mode 100644 src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/HitomiDto.kt delete mode 100644 src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/HitomiFactory.kt delete mode 100644 src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/HitomiNozomi.kt diff --git a/src/all/hitomi/AndroidManifest.xml b/src/all/hitomi/AndroidManifest.xml deleted file mode 100644 index 10e2eea17..000000000 --- a/src/all/hitomi/AndroidManifest.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/src/all/hitomi/build.gradle b/src/all/hitomi/build.gradle deleted file mode 100644 index 94c1905d1..000000000 --- a/src/all/hitomi/build.gradle +++ /dev/null @@ -1,13 +0,0 @@ -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply plugin: 'kotlinx-serialization' - -ext { - extName = 'Hitomi.la' - pkgNameSuffix = 'all.hitomi' - extClass = '.HitomiFactory' - extVersionCode = 16 - isNsfw = true -} - -apply from: "$rootDir/common.gradle" diff --git a/src/all/hitomi/res/mipmap-hdpi/ic_launcher.png b/src/all/hitomi/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index a534633b8c9d4e473fa917d481f3bdb534627c3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3293 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 diff --git a/src/all/hitomi/res/mipmap-xhdpi/ic_launcher.png b/src/all/hitomi/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index f2477f79a43045d75921fd587084d7a1874b7048..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4113 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 P00000NkvXXu0mjfPF08^ diff --git a/src/all/hitomi/res/mipmap-xxhdpi/ic_launcher.png b/src/all/hitomi/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 48549d3f40b9147bb4435bccb68196d1fe9935c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8424 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 XbC`C{`Tc+Q{%xSDsHIRQXCC^0OGEPE diff --git a/src/all/hitomi/res/web_hi_res_512.png b/src/all/hitomi/res/web_hi_res_512.png deleted file mode 100644 index a851e879801b204498185efb05026692599da557..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57327 zcmXtFYc0068PO$@C80DSri z2H>#M2PJfz3IG`3qM_cEQ0MiQ!$;mdS0zJ(t6xjhSDvfCmUro8SH9Qx{EW67^^4zb ze9o~&ePsRer>KoE%U&>s%>Y$t5`Kjelss;r>PnPMmC1mbs|R^<(ul`7-s^9~#g`6O z{Qqe#x9mqv^Y&+aGVDBBDt)v}aD2RV+i>bVN6^Nyywcr{TO0NXbc-!)5SqbFGlNbEAT-&5TlLRd}A~*k1KJ?|C|=(3EO$70ZEL zryNlVxkvAIWcIn)s%9Dee&0H`I={1(D8`2qYmH%b-$1|p@Pb5)=l#Wdbk^pKhL9_`&Iy@AZD4t)7<~ z3L5ta**CdI_7%*E6=H&a`};_lBm;%K|9yUhfk;sN4{PLaJi(ek)*ywkk{eIKIHkAi z#`>gu;}){!a+Sn%HV<7s<{Qb_P7t^0C zydWFzq`3*yifuNNmOhhv0Rfit$8Btmi-ywG^{qGvLmmvM4e-#Gk4~V?YO*LQGT^$U z8bgV21G{=p1YXOO_nzx**zXu2J$y0LLEuS!I!kS;R>Lf{4-sIswT zZZO|;;kCycfU(#)SqB!7qKfDb!}i5$&D({L&X>~__vjy!2KihB1rkcn6@Pi6~hI&>{q_l9hO4cGpi48%)ycZ>$;xXZ^biLo?yt?R3`CagVWlGPY z;Lhp;k?>A1VgYUdY`30lSb;p0|AhMJT7+Vf7=xmAmn#+ER-RS5)7_q=kKneCw$$IyUKhVoT_!>gPZ|Hw^H4KZX z>DIeyxRN&zghg_{tP?6u-{f7NOXpT6E62ASvHlQstG;&vee$rh#ywy8oNH zHI7>%ymfu||M|!=fV1b00-9_AP+jE89R|V==lq0B>dM!BK6k8%JJ60oRiB7X+!6=7 z3I{kL2ySh5+jP-X5ZvyM69RA}EZ_h~RtZc06;XXRMV|!3}hd0{gfAMzVgv`jO zP#^F4gc@|q-j(Cc&{SIY-j|USbEht`EhTHsd&l0s<>&VE$<^U(*k{fzMAEbn7!1RY zZwuQq643X3G9cOdEkZdvD?)4<@SwRZ{%oY!7tOHa+q{EemhOiii$!=qmc#x6pv`jh z11M6dxYaI)M+FTbul&6BEWSVsA{&(zlbi5Qx$oP33Eh7KaGVLf5GopLzq$2in<5bc zFhnYCXlu!JN^{M;9JwQ`b+2t57MdSJWWy1Qd7}`(V(hv*P@oefiFI+g;WhRRM9hYD z?Os!3l>r4x<^nTM|lr@U*bX&YBda#M*}};0S(*HU+B-c_S7P{!4Gy!_$28a6;I`!k&I zsSv^tG50`rL&UIAJ-u_DThBF|If~Xa_%R)1VhvE>xJz`BLMA7RQx>4Yt8XZQn@enO zdgyggo4<;duLolQegS+O!2kVg#ZIa8xT{Y7Ld3p(yrF^1;Wt2WYAyH!^kxMaWIql0E*=7GcLU;Q zfrbxh*g+1vVt7BF4gA=lz$#}INZ|(|`O{lt-?6w)4vv6^f2>5CV##6SV+Z z$_*o+c_+3kE3b$L`ioJ)EG4To4dlb@)kOP7@Si@Sr636ar}BXogdW*D0YDB1vs135OeQb4E8?@ZP6JG1m zljM1{a+s#+>Z4MmlcS4%Dp@w|y<$`gakU*ZO#$J$Iy`)Sh5*@zp|yNvSNJ>Yfz3;a zvDO{w2)i^4cx(~iOr6hm*C=cn>N10kGCL)fV-UHp z3B!{fl3GPcmbU=Bro{DONER@YKtN=$KCETPboGt#*}DB8Y?+tl0tvJ{4ff9hA*}zK5n8VihlXpv%b1v1X%?6_1rGFEnzh;5IU=G?TCd)L zf2#X@^z;xTj-7;g+5XI9Y%>Ze83AqWA9?7h2N4|Pw9EMo6|91ZSdLrlymFv}G@v6`P>T72|v8Bv^O)kEGd z=|5`YO7+t{-{@rt$9ZCNqb$2RIe0X;r#xAeY?vQBlW@CU7n*OFk*gA5;sSFL(LxB*R_2G!F#~jwZU)ZH{1a;&pb0x{j9T0anJPC^y3+@ z-=EPf(dV5&*=&3dhwuCCF#b`hd#B)j8j}+pLchLi&O4ar{A~x;)mY#I%cmbJUt*kP z;a+;aNofzOLIO5S#;clF0>7~I-5xewN2tvlbahE-tLKdNJa521RndyRHMiQ2x-oiR zJO%60%=!mk%EP_~iO9XVlMUnN(Wp8Ih^GFdOYhZ#LF6TaG~!tXzuIbO$2i$oiWqyogwFs@~=Udmv^P zK32Og=cUJvfsxtYZq^eQ6E5+gqj({>LgejqP^Jp}_HLc7ceBx&=rrxEcpqCXoDkJ+ z!yM~Ha1$`ow0!-+*7WHQBnRz~UlOL&RcJD~<;Hp@ZO&@Iz>GxF)e9pjC)0N=H<#m+vk2KvLoN3&NgH;{z zJEbWB`TD*Ny|-`1D6yLh0Z&@p9*9xS_6vSBwqpS551?>B2C3#QngYV?OM3y2-1{d$ zcKb@ex1j&@Pz8N@`sk0(%F(VW*LsaiNDj95Kp7LN0_-I(1_62X0?^_FA1=o70T@$) zP6i=I?%&|H^2UYlyRFr;xdVc%<@bXg>s{l|aOgphc7J@OZ)8X)1&uG<*dj$GjMhke zc}cT|ow+o9gd49s$#d{fj z^(D36aAjZ88>8pS69nNnwqlY3+mmK|UVXn7u8@_tf|ga;Ol{_HnZ8Y}f*IPcG*`up zE{9Pg3#2VvkS{lwF4g~Wr_!K5JC%T&h)f*Fm9_bYv5Tsw>HQ>?0b)$wy36GRw;n7( z7T^N;U|~e}#%xeoH!=ZWfQvV)5?l-^k#!B4^Quml9kS*B($^b46kLjO zVB{GFA65>V2i$u2r+cM+M?=H4wH!-VFLqEOp7x?3gl!%hjrSMeGAr~)MLH{YZ#wzg z#I&J50UW(anlGZiB`}0uOdpnKUelIZ;c|8G0|?e}si)T@Q%Q1XV-rm=Y;_Yl&%~ zil{&FS){F$9p=jX=aW$Ea5Mf~RZJMU@GF)h>i5ijUz^kQ4?&|xDkj9@q1kV+kr|Fx zT!@-lyA&wgVA$B=r;S8XGiU@JCyphhf#6@2DolYhPqh32eIM;J0Eb|{P*XNdt?2@}z;<*;Ca80rePa*Ma;l|3Ua7RVNI z<*&JCXn52lcgO6c5&y_m!b|l|aQTHzD>G8SR`M;kjaDw!+Pl`DOZc4p*W-!H50j#8 z_S?S{Sd?2__x$+v&gkfH)?Ze~!xe69AFWs$b}CkAVwQlJS7&Xf+-fhnbcdB)-45y+ zkbK;lJ=@|d{h=yR)>CI5;I)h}JCWa_D-I?n1#&Q(?v{UZ2kOB8 zEyS1zDQdB$4)WUStz2i5TcZ8+)o9`H-2Uvbz9#o3s>7@A9Ne!dE)}%0apoD@P}AO? zcEIz;;GWTP*1+jTvs~U&T;UI(|f*UDNaO&o`NME z)%-S3d$6-`0t6wbs1tQ<<}Zw`O@*4CX0!mFxfgf7ea{`JjFwIK?-Gc(>>gl#t$EkZgV4OZ@X-7}j>&Q1lweK9v_gOAXS1^n9+)l$pXzp zQI>X=ru6t~p7P2&{_%uftOvr^z3_tBP`U$!w_^-rWZ)Cp~PUWs5@Qg6yz1YoE-Dc3N67WYIsDRcF zVp9_2C&{4hK6k_%bc&MwRsK_8Iw%Wxzs6Cfa3fG-MclHk2oG9GQ)&cNci) z#FSlX;i4{*)<``Md;BQ`c6Z{j+=0MpB3A<|8ZZ2WuE7;S8P=Mgw+{Hrg5P>kK0ogf zPSlgusAyn^9Z_AXkw|-hx+Uft6RU4frjo)SdJrS0^k=Ic_Q+fbRV9|k(H-B;#d>!2 z?Xv>i(~5N^Wn|_UTQ6Pw>s4&@u1Lr%W@m)2nIQ&v{%}lQT^rM?WmPT2U?eX40bOsOy3X}15b2drO@SQt5Jpnq?! zk*cB3pC5u;bw^czk=7W2t>>ezqujuym}&)|exr*Gye6_YJ^kv~J zQnyqwY8}iiEoh`1-7vs5!Z+RtKz7Z0f#F9HT_9!Th+HlyKDZT;u!q)VXAC;p`?93kfJ zN-Xt=VK8ny?AFa5{vT!T2+P-(OweN;PMwMp-Gp+5DUr)hV#R$g7JHF9f$SnHp$>@v z&@gkN7?I6jv>uR(`|{;npgXI(ypK8JbjzQc$j1i&t1QA7q!p3N3lce9J&$r1mpofMa71-z;y7f#0c) zZQhO3JDIuy9=~Xmh4N^hT#>HZ;a9+oXlF}NV>1TenB8!xGu5NoCBJr?PX3}Mc}UhsLZAfB96{LN z%*ZZo?jnm;hd*HucD)}3B=Fx-6_NtuoODvA zIS$Mv5e(}Up21+9L_OCB z0L#wXZ!QU@m!l`QDzb#% z4M2PFD9+X0`Vn_veS*b63HEiv1OH7BWD+TCsv6+za$n`9vxMZ)qkZp+=1RVVcgoR( z3Hjvr^zn5ms7+Hy8po=G2f8617>_eh-ClY$GSB|RC$rl{f6q}KDuNr(bi2O75!=gO zVV9p(iq5AKIe-DM=fTEDpY)~XV>ll&Tau>Q#+kX`%CWp&kK&4b~5q44+I zsIMEa`eA|g)%p8_5%q!3+yx$+^DzML4g?NIj}D^Jic_|2pN8H^YgWHK8vE5WzShDR z1H|r#y?&=HNL(^LSb$JJ;`IvkqHm5jW0m^oQr9C`q+coH$`>EZEwI8(J#Lz5RgPk6 z2qU`7(gi&)6_V+XWD6GCE2#GOm4E?Qlg&T^Fsg4 zjLB}dlfsa2*JT3Ah6|0Z8j;j0sbk4q$o*bScsU*>`)S6GEtDsICH7x&7A*d@FXDYo zwE%09;(?fXY1ZYbvPofDYKb2Ma0Y1|(rJ+GA!=6e1HgnFYRqH z+RSJue>V;;Irj_YhCPrdy#Lu0F{0+iS57b zRe`+Yb{>3WG$}$je%C8w2&*W(jT1v3or~N)&nCmc*o|TK=1Y#;p?6B931-EdX;yW` zu*yc+>OGgeqfiLi&r5R$s5BqvlQRn^^(;O+wPDl3Ka;?`OdYOIS~0zrX2n@dqH6#H z^)nBISf-$d3XL=3^uQHKAq-325x+wl6UW$SxmpnZc#%yQLE2cVtp_}wu<*?Wd#wF3d)%FIjA>m7B;Fdh#~zFnat0&f_aHeidb5_Ez`@qzoNY%xTYD0=Y!%Ib34Q)n z36=qsnYI0%$c<@M!^_wMFouA!AzsLEbbgG$XyLm-oW^NcCHa!m)y8)?3*@Rus%z(z zlJ!I5U*mrKmma)nl6n0OVZZ~rMS*CK#u!p4XQ7`-_+b=~Qo{4m=`)IOmw||Pu~S0a zR>MsxlXr7VV*!B=4-XC!d^O%kBetI5m9z!YW5-3i`TW7O3pH~*RxRve+;O>(>pf7g zqeh`RDhqf$1O3r8+*MzK+_un0EG^o6Fc_ztO%!{`H2kQaRT*tIYw`j2iZ;mxyo+iUg@_a$lDK}R$hVV@Jmo!53uqpY1iE1DM$P-T4u&dg$1L!~`9A0wdh&I>1;kCtKH1#a5^uU+()E36eP#F%nez4D z=7LQ?r*?(XLFeR_46D}bhBto9>tHRO3x-b{dxYHy33DZSL>+5H91SaD8_y?v*+m{d zML8T{hMC|j?@(iCg|veg%MTAj_lV!t;e>kf;p$Iq_dqzI_nqLk$j7$mE^q#TH&i&z zH|9FO-1F3jj3|4P0h8zFFuWr8utX z*!>R)iYCs>JHkJAYAvq0ZlNH%0>Dz3`HS-=?oqv8din2~IUzr@qWG~knzgT7O>k)g z;k|MzfLNV?%-v&R&&xYK+FuU0{O>gnZH6*nFvL_8@LfVrNjw`$+$Ov8TLu>s;e^y^ zGSN>NHe>#-+5c2p&`%I?Oi_b<5e|Lpm40h6pqL!%hIBA2AHOSbX0#4jCseueNOh%| zmLbK!L4(RMUJ^le^1Jpt`v-QHg}?ZhnH)_9a&**QxGLmKcq`w{u08ph5L4QdWmnYN ze2(YlO0+v-G_mqdlA=JtqoLkIidybd-Fq>jGK+|$as?}R_D+lOv3^t65no@FV&m-MW-cJLBLR!0=W}(9ny}cp|}jj?ZsS39u>PXKsR4pB~uL^D%%S z9s7xJuS8rGOyn}T_$;OY1+cc`e8fSmth(K}$6n-u1066~R*L_tFkpFzvT3?f^7naG z7&N2s6AD0sF!HNN(pk9m{bk9N`y-wOR<;45wasi7EaY9{s?VUesMtX2IuJF+R!J)o05^gOyZ9Qc}?p5H&*t z;Jyh1i44AMd!3XM)m+Vw1KQ^;2#!zTiZ2(&|C1~F=EL87{5p^K+L#V0>$fxEnDY14 zjTBJmnA}FgzQk;tLDV6~$nmJye=v}pOfh~@pXXp^abIlcw(J*$m51yu*{?;uWA&0R zg>_d&mMr^KMEA)zL(64$e3671TB^~P`2e6H7GUr{Vc9-W<@spkO{AgX0wu^Q3>e2k z7j6jA2oSdiBAu8%Bn%=HT?4l$XEVeXw(~@QgU5qUWlzohFz!7Lgft9uQ4fqdMMns@ zEpiT0gP> zAev6z8MlMQKTo`h)RM;wGeY2mDJ|Z?a%0OD{7ZX}^X(};US#O3l*(4mo7ycmW^>Lc z?*t`Yb5YtQP<8=9&W_p)5{tZL=@BL)@0u@X^eaAa(O|+@SodIow(DcEWbPvviI*3b z$7!hP|HX@x#@G&?IiSb!OBX%LvZdQ#0KK?3m1nF-=S+G43^O2uk&mr<4I!g}%W~9a zB_KE2S?G*!2rQIZa~|`iASzAJ{EoiCQ*jEdIZ`tU=7#e?tgJ**-RI9h zWlt)0IvoP0x-XVzv68zXT+|mN&fj&mNTwT){u`fK%+`c$8eJ374Z7 zOgrS(UMsEhC}y| z99V$@3ZthYL#eslzm3vCzovvqSzsqMkS^_G4VhM-Scj z(nSz?RU&_qI8Zhs$;{Dit2W4wu0{jl2ft(_((T!!Nlc8%zm_>W6@8Q#7uxs~vGn1T z8*Cbp!0M`vq?8aRCY$F4lludKgx{kcsCD@_MDqI}b(h9UV4-evZ36o19sEb#aades zP0Mt>j<{~#JlJz2*IUu2hzWP7fL_VYQpzzt z1!Vi@S%~k3pX;gMRlqu8C)F5rv4w8Du&B&)%jTV_K3WM7r#!wC_riB*e2G2x+rCWF zoi@9r3{EgVWYOU!1E#Jnry?>(*P~ryS%RwN!bbHOk2HG*;%mos@vq4HIF?|hXGTJ1 z8gE|(nFtE-EB{$BY&sJTgwZRBxrW@?sw+B&W)abss)GvcfkitXQ)_IoWx5_YHt?XN z$^SfTSnS(Qe*wFeMq%j_-Fwa)g~Lt5V)tbHOVs6?m%!GPj?tlbpci4?4(7V_WGvmq zWiiug%v<(Gf?l=V)#qo=yB1*`YuTU=pIxS1&&*lb7^K-8D{o}gVqT06RRZw{A_08c zm+UiME#2pwYiqEbrWE>Q0{QtJlwx(_M%Q3`3J-#R610P;qC9XI0Blk;SJjBIb11n! zLHzsU#AH0OdNO&L!_jg|GRqr;UV=P^k(`PfSkDjbiBci0=MpjunF;*@;kt)e!QLl(lz=f0u^+Z=MuXAP ztk<;7l`~p{f7%VPm!F3?+B9(yvNhgQx%W2`|3-4*dwXhYUZI1wl&MV{%3tkfVz=sO z`y9xHSl%ng^W3uP-L4)BG*j6-xisO936H;c?WQ&@@FcWr4Npfq5!=gKxRUDA<3tL)oOb^4nQXZDo=)&$rSF;G!DZ%bG#e8M&Cv;An zsIc%?c-mfH$nd)Sd&bN;;+dDF%SLWOCZ%JuKPi5v8?el-7kJ2Z211|?SNrp@5;$jbc!dV+1wqGqO-NZ3eO?aN1pSNQ7o}1X`}diNuaK&`O{_^ke169> z;W9-Pp4eH>T$A@RrFm*4ohgFFqx&^hCcSU2)BdQ6G$y#hR`VdwLwt&gYhXfm^jtX? zf{jjRyPI$`)@+tI!5HQ=?C@XV9MSKjP%mk;WyIyS%f{Nn&57$DL<`86iHr4GeoXb{ zX?9QVCdXNW$0@H^k}QegG*@A!@Td^P#F)3rwIobg_N#@5Vg8tBt%f2#&%v%6dvA&u z2TuX7cQa0Dt@{CDe$#zF)n$*Dgy#FyJC=9So?fqbS_gX^LI2c9^5`};k@er&Kic3J zp$rwXd*%m)kXg1jQ*2KT4nOd=60u(6*l^Nb0OBLo{4d@q9kgd>Eu~PLO!wxKtvyZ> z1^QSGCX^~z5FDvzmC@7c#n%d_e*vulzl~9bFKLQVBfBMx(tO(#2vW@^kZbv4=IqLr zfheGFQf_Q#&4?=_7w}tl6x?MXKhE;VzF`a)QvMdep2aS_8+-!A=mCM;Q@`|KYz2(zZY1UX-LT}bJMVz~aPLvq| z#nP>r8B)~;&sKJ&9Xw{8ty4zRDqUo%AMm;etx+ivl}=@-IBSs4f#~jRe-t$&7mL0o zZTrc^p2`WOvb30a@8Zvf8l^sN7XC8iKYVgnlZ`eP@pCd`!EJm63U`_4>&6re*|7 zY;|@mP%!$^l`*!lpL*sxn~EkomzoD)xIY*bwk}5Qkx?1T zkM)r|nx3W82Edaadp^#sYaK&#V=jz5Sk8K4=0(gNp?j`2b`;7(@)jB66-`kIWh^D) zAwk0f>=SSm+GoELM)n!Yajf+r`zNW9xWa^j%^xS#*XSP0Vin35dpjOCoI79_{hj{} zn;T9R%G0(f7mYR57tR~%K}m7IWc|LNG6mb<7(_a#?A@>gV!s|y5jHHHI99AY6R8Bt z)OYJrTrdFYdZMQaK14?eR{!JnL1zFn6n*WdoVX7O4}1rs&NX|bzN)xvdAXgac>BS^ z0H%eWA&n-qk}Tz-AF~eZOz?f$kI9U^c_p{`vEcTrRio#h`)jGzV?78?Ymr;RjMh7s z6mc%Cxh;y|)G^zG1-|I5BZCk6mxGIRz1&1u3Nu>6bj6N3nopi$`z_GU1V09hBEOSu z@8Kj{l=`h&r7wA-LxV%I=bxsjr2(OhtOjATbJL7ONEG+Zl}|v?R_&?1}$fQcQ4B3VRU{d}` z{KQE-c--$Veknwk)b4uuRIhczppf;T1)h%!FE)qFi*#j(@(VdCYBS>A~GH6a8Z@+vFT(NgpHIZ!q; zP@H4wG;u)dX_1`f)v$qP4QW~aP{=ggdBPqdoU@&ImVu`yFzS(uMY-)Bq|hKdEn~$3 z1ETKE#+t12A^z=Rcg_4*FA6HJ;K}`x``5rS!c#F_Hv!G4ok$6`Cjc0;tg9@#JaiaI zX`xL?M;XMaWDS|M?)Yi{%wj2+xX`&vh@4w@5tCA6k2(dYhwX|!$VRnAv#v&PLSBk) zc&grHF2)xGacb*7^HN-CJ|VIT;Mcl~*sVe(x&8-Y)*&8Up?7dFUUR`Yj^#8*-ubDt z<13rf`QwE1C?-Y8=iNE(iu23@(#r*TP(>%?1x&# zaRt4ELVz;FxN zj|PnMp_osYr*tkQK#O{Cm@W!zuYol!%^!iCym4yLtykGWD@vR!5AVj^G*EY7;nl@P zw#4G1V?O9N#376BOMT~wqKmGu*uazZ4RVfBJd5u;yD}!1)CRuX{m{6L(6Gm!^S>mp zYk@nN(y3zswVXVuIGOWA8!lqE4_$6Mr^oy~`4EbaLY3X$h`rxJyEmzL-o^_{F5Lz8v66zI*2dUPDYKi5+h z7Eay?=?g3-Srrzgtxj@Ukkt z1fecQ+r{%5$JhBST~{;F8*<|=4|&d!HV>&))r=o4b~VvYi+$TvqbirX=Rx(r$Y62*3ZZ7-DMLzxnxu-m{6v&)EcScV2Xh)LUs*jox^D ze>>Vh<{kgh2i)ZKH^WsArFM2_mFk2TX8tn(^(tsfr)qK#Zd}kGx}h}W%Vbm|tN`6g zk_~bfIt|MK_~7e;|N8s;H<$5;dDtA3z}$Fgcz3U2OVO|&ZP%2$@zw`8< zHgAf9o86gQ)niNE1pEFQr3;O@hkC*jlM+pJ2fqw;OeJXA+1t>J-^0OVMkA8-+d!?;y^vLVxICU=&0*PiL~v%EhSn1*@T zKH9;MsP`XYOJ1ICnkATM>m0?+#rXU1154dUYs;_c$&(80P`!HHiNq~u(b=34dl|5^@cECcn8Ec)xBr%CJ$4J4ekZ2iT+$Vhm?{QP-3zVt zqgq?P3$TvTegw)Ly zpS3CjlK%4e%~!RUI$29KpQ|7g1DH6pHgTQK31Mn9eI7|~f?l;#3uxIj3OzZBu82SR zRNO3R=jUW31QE2_(NI9U=4QyvonXW#c$88>5? z8TcOjqVHm!eC}yk8BFA0d^_rz`z%QexQD=Hssokwq!kW8BvuBlzna2vwNSa^c1gF4 zs6vHyUBI;P`?bC6Gf`M7L^Q`q>^x)Z@z;o1G14AB|8P*cBAXj9j@#gV`^wy@@q*}{ z6@`tfDloH1K?gkiKJ<_9)fUB_t^cK+0dPey%kQQr;5}G$b(oAfS_+oTaE_6UPn^Nr zy!VQpPWi&}vqqWd%J!3sh1nBptyYHwUUmKB$LYnHtc?vhe8Qd|$W^k7EDp*Un%;lL zL*wl-|M&jye+QpW4vlk7f2uwTB*N)OqqhHITxgBcu}SDCvqXRbjf?(*%w=cT#+(=OKowIyHPtg_2a3Hm0RA(BnGrY|H(Bx?p~5OpCWtLti)$9tWu36 zOB;I3&gbE}ytr==bmet72TZyfcfoo1{Z(FIf^=mzJA&&KlBRWzi%;F>*tpJKE~Xu0JARQUR#LA8zUy%izc5$+BHa3SFYXq~{mK7! zZ6(HdzNNcW*dxRW5_tTyyy22DV3zR>l>&)*wI8Q`HlFyVWNcMi=!p_gbrYTz&6Is9 zE?kttYmWpPUrrgr^sQ)T8;>CQBtmeyZhy~|_vT??hitbEgZi)Nwd;Kt@;^x|BhRD! znX%$S!N|>j?7_+JFstn&E3EL=SGhgi-&7yIP|H`8cCr18#0$4-wjQ3IdJ-lN-`k@i zZ_zJ-R!;T)jr2r!VFvPE-aZGQ`%Q(Ygj#OC>Wh3gFwYf{l2Bv~^tJ|x=fQ$&gRe2* z{6-3?#J=U!YvFJG^7fdYdnz1q)nRkO@3IF(cG8=bs^){D8`Jxb_l*cn*^bpz4R6kf zk~7eeCuySHbL!hoPQ!2;q80<@UGGoICFqQDaa{39Z8DgwuYYg$ztc+j?zMHJ@o_$! z@QK@U97$fPN>QqktFu{6QV(_0?Edn&_;H)0F09^3i11B~ISXK5m^j;zD7+yJC9g`B z4g$f8KVF(zQUA$AF)SlUfpxb^Uv(#&B^7aW(txG7%EvmSXfd{4%`ueDMn2l?d0`$Sy`jBLBVDES=; zl)Fe~=-T8)k6om%f#TK$d`gmnr9KGUzI_#ZQ>>df8Lh>DbNK$H@gSH=nU6Z=2T}|G zX?TpZoS@VLhl+J!FraQaT>3k{+>7}oO(Xe z!grMbcdM-1y<&i>Z=ZgE5{%GyZf4i)53I(q&nG?Rj6ZVG-Lexf99e#(BMr~KAnn`r z8^yiEb?#5t!$$AxbMSLoH(RCrC73~^|E{I6fh^CNeb-?D58Kktraw~+r9CjVTew|U zk}8x=RA)90)~hOYEjT>DcmF|5)+C;OULAPFLlcbaCkb3|5(BpKmCFJ(;J9!8?Ru00 zad`<+2XjnL_WKVR04i+#o?OJVw~Me!B0GtG|CN&0)?#g&f0XktFxFHgJi2o&97Ovt zrEq#9(=Puxe=3qdZ_WCA^v;D=U!(A+*$^XT{~J4ZRL+nd=^(QH(50#mpWpt5dAJKO zOlkQeCJb6(xLwAjCs%2swL33u0j?IhZRfyZtHdKkS%rs3T5k>v`nf%TtL|&KY^5D>9s_sa9-N^6MC{48(`IS5h9IKK zEVF36qFBfx_D`e;642=;8}Y|dlY@YV338Jt2-p{STVsdNv@fu6r0{7)1UOB1c$;mc zs1YEQj%`t_dR{_>D>?XDzI0_kSj%){k~T;^kybo}^~L*LcO1+kmJG2k@Oq*XDo#4Z4^=!5-<~~OC+3S;4t9~iQ%WYg`HGV!Rh_q zCM@dG?BBo;C;!tYHk=_>>ab0(1VOGC8Aj`?Vy}NQ2p$Hi^qu!y+# zng7oM_0o#x~gp^5z`yn(m|nl2uSW zsvn#I5*g?hu^dl-#{snl)u2+4Wu?JN2gaTR^Q`foE<(!o|D}1&L*ci^Ax#3?qW<;$ zXt!UAP<^50HPe=V_=E9wm;Ax58Mg{f{np47YE->h9rdu?RI^W1&b744qkSlAO6mka8DnXC-M_`IWp(ibMoCGys4T*t3fnOp&QrXrVV9Y)3N$DG^1SmT0rhRjr`bEu z!I9l_jL$~1`yQ`={9$C;+;hx&d1OM9ih3SI>)VZSxW=RDI((AD>47fGwczuPZ3K|n z`%DV7_RwFnsqrI+_Mn3N@b|2gBaWzyPD{DoU4UpXMnfSd?RvpQw|bN*`Q2s0n@zfa zL+N`lPN}@*UZIKX{_j>%+iyM22`_R5B9;_`&Z}El&k{YN=5Q%BPUH5MFReO%t+Ul8 z-VFsi_@LKaL@e$^_6~chtR_Z14fga_l92~}O zkLVZbaGDSR3?xd=M5U=(@C(Y%&X_ZwTpZ~PrGLb7bkUwx)BnuI`M%j3&8d^qQj15x z&EAzvp9?VUWtBT~SG%9?(WR?vw!fEcl;nG16M7y&15SX}kxAy=V9vprFm*@zdq>Ut zeUf7--Ixw+J4xXtyW4|;zTSre=RWJ8RqyVi%vo(IaA*%eMKZi#t6D$-XV{1Td=m*@ zpxL6oT6XSKY0$hie*|3kC4BaZUp=_BQ|4lkXyIi3^~wN_nc(RMxDY%!wJNP7BNXO9 zj~25PefaNWs|VXSrEE$M9YGHb?2&Q=RM{b(+d+q5OV4M;O2w8-3amdy0v> zsdGfuF2a5ztAu>r~@TMuQ7UPhlwoD@kaiqZxy{M@y8YP{sHyZWz)(6t(B7x zysji5f3@)G71E+vAv)#hQV#qS3wS28hQzc2XwDM``+s)t!Tm-MUS1jXB!=YrCwf0|g^HjE6UJ_8i}u^84<@PkZXEiDrhM?z6Nk zEEcw}UR4=0TDu{Gz!~hbB*^*Lq-3tbSwB-IBsyY?a=UNpy?`jvHf9goPFIZmfM#C` zjBVrJkXT#t;K!4^Ff`4<vEE~xN(a5`NT z;|JUg*)&k^Hz8ZyKiSOd2P2U@M}S?|@is0FgR{YI6k5~T+b?;N2ug~lGY6i>9WTt3 z0~k}-*=_B1pnW#AfRkQU$myxy$(cekB}*J#SwJA`?Wic*TA%M6UG20$AFn$7R~4Vu z4&yHr_uEd!ie;@uDH?p*N4F%mrj#fxY92N^hcdRq0il)&V#bGYUj7M|`a@0_?NB!s zYAavJ#+uq8a{Ap?3>c>4Y#6+y?jItPUN~wxCa&OuU&ZgSAWTZ<*G{J+X6gU38EE*I zL{%X4qkwK<^U2}cz#GbqeNqO$mV=FsWH8;;zqg17M22=m-_8Wpyw9o>?uV(hmHB#p zJYSR(uP@NAwx{^!&!5)ga^?wnc_@pJP?@6x=dZ{pTZ%|q-`XEaW=|PYQ-tYThkIxx zi;CJNJGB)tRnYu@91DasPPfS#zNgYn^v9R#;oduwbl1T5dVFcx&Mip@rVbsnI6-$> zBClwI!_o8yL($J`z71Dx?j2&JT0Zv#GH-aY!A9@`6GNoG+&sV10M{>o=s^G0pFCQf zs$K0+z#%<(m@?Kp8U(Q~G!cew?7(ExQrP`V;zAS0n<$!O@_mLBO~BZI`~ebixFmFC z|B{i}P9=*4_C}?V=gQ6{&*v}d8fW6>FU^!wUg^4BH~x-NkKy{#EW?1&B@0%{hmiMMZCX6dkw>AKv%{<1 zAzEhXm!SM+?+>rI(E}DSdhd_B%=?Vrgjmt&U-z;@J-F5*qBn!xIeo(wZ8G(w*u*w3 zf@bEuxQPA>i~d?l7I&pbkA^a(a}@k4`D}O}k^KW!FZX&bwtkP(j1{_J2?)+< z%RixmOe*_-#Ov*SdO_2W70HY)BUZWw(p#%H!R9<|FIp>Iql~z!Pl%?c_YS6({DGSC!7FESR(AtI|xmc;g;on0Z(4;9-0gx zgHvV7$h6N=9^V98fCOzKbhd`h zy26Wli-#|)d|{!djVWqS5e{5h(zGDi^~;o&q(ryuIigvNuE_@dDO`9xj$!tG_@G*% z5td^u0icdP4YW?~O99l2>sBBB9aPVi7y1*K!V+$(9}wgK2g()-N-e`v8T+w19pyv> znui_Z{9*Vu?0D~h{p~AkllLWPwu71f0Y4O-_|rYrAuduFYX)yphS{B`E>MqTVX`J6 z`w5&wZCO$CHq4EtW@q!&PPEb)GgKoiOJ&vf=UqcXHl@udGqr(X@58np+H@B03dRj6$Vy0zVe8K@t&J^PK-;yksd-vaH~#+iEu##C{D zj=)*7>blgwvXOWvssOakmtWYJ+*CcL(JcfJJZosKgFydD#P4cVfTo#$R3iLxG*Cp( zxlA@O?x$W0xax49C#@W9=YI~pzp&2)z2v6zfELQ1R3T`FBMe_{EQ5LmuU?nj#=uJ& zwoN8#P&SY6*b0%>DgeX%{dE@3pm#NlGzbCu51|}ASGzxwM0%kGCkh38*Fgv=UCm)v zGN~gOC^IEux>~Us^Qg(dKsN)L{lwAD{vxDB6338==aU^IEFtK6j6B&@6rogho!aEE zMf`Nv?S&t+NuJxyR-Wsl@~Ih|G6zRVY_B$KCAz*x!bAJSW}x{TDOklfEh)OCXtmOM zDrwZ|BiU*%m-a6Z@ISkG%%ID|;UC%UO&wBb-xk2}^sH%p%ST8Yqxh~;2yh-;xF`w) z{S;L9Q`l8M+;t&Wapv*uuPiMzQF3np5Kz*U@K($rkjW zlybGQ* zR+=1MayNPpJoNoDXH|yU^d02&Ig*HJc62Yr9_|YOJ2QHHQY}LheYC1$aQ_xZfKJiY18=WvCsc`GUc+u!qBlk&0KCd{|gZ3ALiix#g%**I~0#15@6 zr~3abT=>lGfexZ(a)V#aHUUVV`=HLupz1XIGuA^fUhPRX297gway^%2{}X(RjjHre z{z7B;epb1gP)ZJIxo!BWswxJ$B!d!eTqseo`{qeqbU+>10Y?kX2O|nnUc95Q^*enW zbZ|^jRP~EJ+pp-bEJf@4wge?msgtLU*Q{ny?PpPzHIxk8w0&>6W*F?7Ld_dGDgb;J ze2ALA1MHCCNqCuplPD`(3Gg>&GbQ5w>2gdW<~}MIVUoLRQyWrbAO6Yai}M?LNZ`Pn zmFM(AlV@lDw*CxJu-E22K8qKYz>f+!`eb1q(v<>Xmu|T5oE$&Tq~cSu>kkp2K!ZTJ zKDC@K^*bSdLnK?@>^1$289E$`yxtxE?uJgn&jP(^Z6KE&MMi55FXwz?!@nQSUQqeM z8oBSvyT1;CmOo-rWAqRW>g^K>%6-j#D{M}+{lyDXHn-EQHawIS8GNiOI2hftG>UD% z-_%V2mW?SApx3mvUJU5pqh+`q7Eo?YM{Gjv?6-_iD>eU(4Bu?lr>4i%YG+7VKvOtGRH z*7fUW+rESi%%^!ZV^f|N{SE?WrRq!gxGOl~oTvGoi)}(%kWLK(@yr4dGC-9^GWBxU z4g*-E1Gj&d8X&5w&Z(Ll4Y{JJpr>9ztV>dCXlXjM{iDNqcZ!w}{a*;Tqs zmE+~e)o_w=GwRFl?M=EuS#?!tX?jNJZc`wVXGY%O+iBf$Evhmz#a8UOjE5<%#iz=- zoUa6&0Z$*H^KW0V-8k}yRA^f9pSW5cL3}>Qa0YL2Qm1z6F>Luqt3-Y!`L7^o>FzC$ z&W!9(Zv@rX{wNxqe9?=VM0?x-xn7G)6`Ea(%R^+JXkckMR}S~6Z8$1xn4C^QKDeRl zQak{6AsTVyl(&3V4Lrn-I+x{ne88WcSD(CxsmUVU=g24B2ur!@OLMPJA-?PVf>^z0 zrxH1&!tFc8a}IJ*@H+ePuB?`;K)SVM$elYiZJWV3Wa~n&OoY_Z5_3ikJ|+qG6N5!;LNhHk-RqE@|78l*6u2w+hW=yr=fWHxWF8W#X^c!05;%wJ9KDK zfNwmXyR6HK7K!}D=Y%#$Hr6C zf%?Jss*Y+pAt1H@g}>d#K89;u@}Qe2Wy-0vle*8n=z>6B`BVDynwi&$<^)rjEUF6G<(i%bKz z#uAxAO7^iu|C2A3fZ-FsIpn!aZ;P?$jAU3~H94)P_OI%9TC{6*zg8(`Z+oS1?8_ac zF&A4oqDy}l=UMQxtG^*ayENP=5WJjnj9f4RTy_I0)VdL65=3TUR2~b<@%VM!bb)D` z*FUy0Im2A>JCW0jyCF>$bbLOJyE<%vF~KWir{&7 zg&Q8XgiZf+*X7ULH3BO?6g>L`2QJ?5kV)Tt85?UU$GN1#Z{ox+aoq!7!(K|RGn6|# z&N!8v^F^I>Uh+e}CmT=&!a1qn(o^@wneR zGOckv^fd*ZK1YX)wM3kC?Ne`&G|rR}Tlh`-v5R(U-|l@_JlDY6AcHR+&-=18Zv0EL z^M7itS(fol5sE%s>DJ1*e!joh?V}vz#8?a}hNv_~Nc3#WpOD-)wErYYgCR4!3FF;i z)#q#mB(Z}{1lpUi`m=ZxkkC|lrO2K+0gmS1)_d|^g`;uvfa8=D0p0xQU(Nik$)an) z{myY)8dG0O%6n$&_tDW1eK*sFV`TEXIErf>v6fU6*@}?Wl#f`Ic8i5U28CAc=glwv zY{Ci3(#{cDtW{X%<0oi6+I~^_t(suoAAeWZXTl#kSy(K{e z#pw(C1b+4mP+O7P-hB(jEgb4_njpj?G_rwkR`Xx`3R1zz(Cn>&m8+_K*5%kB~=7uPVY_z&+ca&$^p6n4M!K3st_3O;W{2sps zGWJ@)Hp=zRKYhSCuFM43ccoTq(MaHm?E>T3@#zlL~Bjl@oCRgtCXVGxc&0kGn(L~B@8U< z>?<;i<6%~L+!8n9p-S@UXSuU@i{HQao=1qmrN&5i?!of=`Hup0A+~JhA(Ydxd3^qn zH(uG{_2{cK#Fs|h{Rx-2G6kff(o`KU3IfJ%0v5_@% z^-s$IN~kAZ2E|I+0QJF2r-9?`?8TdzoR=a$NiCJR_L`ldv|IC~gxY15uhZMN>;DRV z!^G6ujq?=yqCNE0E3UV!s-9L`Y0@5cG22&YT61L8s9o6~vMZMO@{#V!2^! zW=|X9(s7S&yy|4LP4!3Lv)3q~(xMAH`;iyDJJmo3k{|w$8QHX+48t<(W^uv+T&a?xH#Mli(cDI+Y>)Kj@a4d z6VbkhZ`xb8S<1WuS%1dA{eY2~^Wo&W7&^4@Wq-aC6^G)uTH9Dp>(wi&&uYcfd;9RfPaN@|2KLHY+<12?dEmpBz ztXF7fsF}N7W`<5~6UWF>52zFA12^f&^mi~PloLvpf1I8_&W9ngVZkHPf=+#2}nJ5^GYtATT*#B#8L^>&neKd${p3B&Em z&foXt{E>H{*C_hcZ}~(w7-}D!8|*Xp3$I2jgKt#_4aT!kSSrfX^}E|sCr2h!CUM6!YyAF3W*<_S17P&`hSX-{tO zX?Ztf$I1I6o4|t{K9WI%hz#_%w&xGDf@`jI$w|89_i5(^F`e^rpJ+eS>ZdPi$`W+h zrYHq>!n(~zTC};>h>QOdzUGFdarqxMUV%EyfIr3uu2HYEDVjhFxGpRhoLr#LxPI@c zy?nG*P*c=bvi2ZyIx8(@{Lu8opKhKUZ~dCn`^{U8qtSS!%m*NjSLQzpWCg?Z6XDn5 zbUk0Waa)pzyAg#pd;2Ef=Lz*k22j02da-8Kl2ve{3eAv%cs1z9`|e>xi#Uyb`pw_7 z+}1C{i7s<(`&W6=EW)YvGQvDE6dC4~Ur;@ikxVXu5xOQ@`Zp6eFN4J}Om}$3MmAB> zS>{H-Eow^_p@l*Vbt-g{YsqGT=ciB5ujj z!97(+Q!!AIgymsL*X@MI6`aUqeh%X!oieo@9_~nTLH@2_0GqRXnKlIy27@Mgtzw6* zrfoO7J!7t7UrP!mq$gZtZp6Cx@>OQjX^JkgK9rGeN2;Ex656kcVAoDhuWFQ^8kjBr zP@sqUwu>WoK9|xMemolavS}VjFS@Bi_oV1v3=h1OTQTU>y)gZGa6zs4eIwiiRr9JK zk%p1Ba=s|W$uT>7tBV~+cuk*9G!ut! z3Y}qiKNW*Df}$TgWpoZ#Bm?C?&(}2NjySRfxxWdcfm}^)qvdGXu9=;A1pTn>{93|* zUIQ#qp;I>wuwivAVZ9Ctl!g#n1QP}qn}tVSy-t7UN=+Nee^S8rcmMV?1M-(~a%jYX zA!rjSIN>XcHfY{s!yU(TvYp^3wQym`J@wS|&#|91n3wURNqVhnS!8OnTC%z#pj!qr zvD4jMl#w(ply45vPmL%v)+x9MDd;T^m)iJurTBJ5ZG|}%C26yq1M88cNEM&1zWZ1F zo9hAoTLxk=I_0eR{Ra|iyb_8KHl*PzSMZG0vw5|g80Hie1^*e#9SX}e0$pK`6iftw zCv+tjsn{v&N=CQeeT_kw+hadq&1q1PhOFkMQYMz9cUQQvM52hKj|08 ze3NSk-l8~bVv~v+tsTg!1$K!tWQi>`PYt3m?z@pp3lTp<7azR9XXn45>XwB8jF!IY zJ9rvzC9;~pukoMzv&aEQj9zRr*XVR{+euDX-GL@xUN!jQ!#`=x=&xmX$pCXk-2Zt2 z_J6vN@u$zmNH!ng=r%z|o30V_jqlque4mZ^Z$xse-#t_|R=JUOFTBa`5v_&+HMngI zrZ)}$1jS{?J&A)IZa&qkf+i69zh_LQXDp|L2nA{Ul+71Uo~d%S9p#GBKC%aL1M?G3 z(~RzD{p!@; zj!_MuZ9bd%UXiWO^&$3bZTn7S?rLN)dh{%bpNb!1H~99!n17iZu=Q55?1a*wvf}$e z@dU9yDcb@r87@wTeR`ttkussj{qWqG0?3Q3qqusDn8qRB8c|eDa%IU}D@DJxQL1E_ z^EwSyZ2a1-r*K1rtmS=<;oK)l5n)R@sSDaGjXARYZLbwtUf0Y}H01kK2IQa#e58ID z?xYFdHWP+#@2|}7*$7JR)RUcYNuZW9C`E<>##Evhf!NWO{DD8M7*!uy(&;)2&h0ye zqL61g$?xei>6m!MGCFxIRWcO2e5a%kRe3Qe)jp9eH7TO9)Kj4qo zFJ}?100a@}oQ8-Mwv(QY=e3(%!4!-<_0dH%pl(R%i%pvky@Me*a{BGdO;lFElPqq( zH76x^x||Zu4P0P-=XeC9Za2%kTQF$9?%)8&G{6%zfDGb!XlW+OY;v8940C)ZL@)jF z{hh;?29HsiV6L}0Ma=N+ho7!GNpDciZyq{GZvwA0(NoFEHKx>%SV`O!hKK4Ga)pI_ zn+dmdf4DPKb=Tspm=Aqc-v{Al1AG`Ice5T8UgE#GR?JyASk7>3abH2CzugK+gw!tg zd~8|MF?caV5|hsHTJ3Kq;sY6)iTJFr^$`(U@`=u=PW;i5nC!D;gS^%6&oD_;W_%SM zq0m_@@|~SFZrO{29Xk?_q$3mh?kZN+(n}O-|FDf5#@t`sEI-DmELYzFSUH-FTg*Ds z3w79NcMhl$zLbP;I8M98K!-E7p8&OLnTI~0yJVbWAkJG#c-l0Ux3-O?EXKTKchxfw zY0%0S)9IlxYNl^DJ1~KRTQ+!zG;UVF9B0V|pUKd;d8$6coDG&h@{T{{xQy_wje4_; zx);cHZnQ6L=6$hD&pYUD)U2dM;@&zE~qIUb<*Q zHIFKL_ePycqYz;26Z?Q(eDQ_6hr8yO(();yv*Nbn{t}YA>=;=BP*7T?{u?J})*^c4 z{jOtkS>{h_kA})Fl|8IwgmhO=K$Hb3T4wkbKF>b!_(|{_LqF66Zb{r!NEAK1 zZx#Pxxc&$mi~Sif-b7>VwZ!0QOKv8m(oK-(G2SwSUXLK2=e5q?0^?g%pGw~P4tka3 z0QY~yfX9%R6fHG`mFSqdf{6XYy>s5Mt^w<^o3o3#?dly9D$G<7}S>Ox(RM1ejsRzM-Q zKHn8ASd^K&2RW@rg! z^I`4Qu+WM^=Sb6h^QtROCW}B}S>r14rh!Dtd4DTpZzlwokh@y^Z17N=@dGC3a9jN8 zlqn)n+ybh>%z4uJRRlZ0t3(^0QHREwGp9;eBm|yMso1EaKHjc*V(-clmr_G%m|OHPoDOlk4uPZ$4)!NXN7H|)}pYVT`~D@ z7BRb-0SlWbk`rz???Cp3{8V>*h|XX#j>_yDgV_mfJhdJT20M$ZSO%n|+vnB%=+)1c zK}b`lBxb$(o@K9+7uC>ZcKvk-6!9Pc%U6N-Gk1K2Qg@4TgQeU7O{*26-yv~80^ZLt zBn_@HY&Q{6vjA9S@gzB+)B>LI3nsDXuH2Ms;b4UUhGt zfwFw+X%EBAvW1vy99S9NAok|Nt>62?t@6Qr{O$5$F}#PR=apuiEP3D z;mC-OdV1fK7}*{JL^=(^zo@y2r^0WoFpYlXQQu7E07x@oOU(DU4Z1b0%vkz4Lp)CI z?c3|($=$2*%S3x=DYlBK+uNuJ*HEi2Yqf~Qeez~krbHIYyVJ?&YVxe#6)`~W{zzc^ z+yIm#>7tT`?`K1`eOJn);!LfeB5foa3aO= zr^P)A-`1&eWiXn(zs-Kv0Jb-e^CRESh!?GcpxYSqJD`0sGVLJ4COYSU+b38pW;Wgp zm24CGkU8)KCS!Kamy~MOe`B8Q5gQT@zHlEsbtV}}9UH{uGwl)R`1les7s_APT;UuV z8mID;&oy)_{DNd)h_K+^p4Y(^EBf&5LxTcV^g!Ex-c=QG^R)w!?fZKVKK@?iQ^vuT z%4pG7qr0#ZuRH>Umyfd^$gJXf-Ozs>bkB8EXFU+u97$ z_XDcnSF^~jPD1AK%oW~)_hY1i^>ZI#J4Z*h9Th(+5@E<`!L`d80gshJB=(@Bu==4d zdeVwO5=;B*2ffEbiI))58be$=twr-tP+m4JVpTXs0F<|d9^&bS?rQ)p^fy%viUgJn zkI0R*+5i?+yC~?}PI@+B&IYWJb-cqai`LG|yoP*bF}->{#;?1}4Zm$xvG}Zv;6QP6 z#y}_|@u=kY=XmC^$H4Fux#!DKT2{JEILiM_k+3dw=Zo)M+3hY<#PC`*`So`|l!5L2 zKt`pT5m|bUT;G`V?}obLpI{`$G~u<-V1Wun_Ur>&aiCb6h}Tn`Lgb3?-bg;)P=-OL zLnkLJi&4{^21ob`t0Y`W?{WLz2=e^HYpVm4lu%ocu#yDWA>I56#ex9Wuhm4)F$-20 z+F0<9$#`q;xlg>QI$ibyitMNJS~BTjNWV3%lOC`9RP7-lK&t4aNg_KmK{w22KxJqC z0_Ek+qB=;#Bg57J$Nl#ev`QL}X>jj$lx&rZlBLdRTcXtaKEImqs`;^VneI8l%~GdY zJK6b*9902Qm8?)Y+rT~Nx2|3r=wcyTY?-s0O@*EkE_NtzDW`ZVOnWmf`DlVUwu>X` ze#acgl{WkF2RZvBN?Ms-M5AU1G;rY)3oc;ZucC+rabC&nLT>P~sDW!J>3 z@`7JSdR|s)SE;sg5v4h0>Zf&9^aO+0X$c<;_a#1hpOE(Xyr{WF*0}+4z5U3kTmD^kR^OZO)bBfYe}NhF^MS|bNUuXoP_umA z4xfq_Z}4Vw*TS^OKxF*e2m0rHkAM!U7Y^oG9fAowW0TX-HymQM_6<5GBtR$6s>gj@ zH7LIho{k~>h`Xq=@Duy_H&YXXUea6YiY}zG%6XUDp@;O zc4YMW-o?LvvY?PkrFqRvr`CnNffVGY5lUqwLB1>E`6QT`v=d{Gi(*ojB6e^@G5pVi zTt+mGB{Ect)NxB_x`Ry~d_sjtcp$-&)em%o@7@`TGN<6b7YySricu-qn7{D9p^bO2)~`6VU*tGyHw%@fSt-kr`Y?p% zE-S@5j{hHAkcZlqnpF(UU%Kf1h0|S@&hoI&BbxFaZ1m$xR15N~B5t9c*kJe4&Dd?P z9A9vG7ZXAJp2Fj;RT#!Os-+)B4>@%AwfZ7d_O-Y?J&&zWr`pB2-|zY=cTp0ni#_?^+RGbt6=3{K^ODb9dwN@H}xBRLI1o(u*;<0c@?(bQ-sC>J$U|F59=f)=AcR+^9~h9**!vgy&q-*M$A23Aw!tV!IV`Rcr|li1K?XI$KkTD5E1)_s$QSl{+z|#Y@t0<`|89E~Pbz)dFF~@Tpl1NGx+RSVJvjI&A{(%mW7627Hc*%QAxPhim3$Covt=0issjg_a8r>B)o4Tfjqt8@%i=>HbhT^1_z62 z6O-sAYx$;X9hl?>(0Fv^N!izTyTxD;Io)WNmsewB;?~cYnM28- zTl|qgcGdowlYs@9)Pg$WH<6YKe3!o1`FD2xk#>f=YgFnMeb zh<7)tW3<^_aBt%%=288PC>eR(HZD7E5AuneNN0PCjo;5$7)Tl0x{KbWM|)o0{5ClS zUguNzL5$+im0t;UWE>*{=8_~-8VS89+iL>hRSDo# zCsap))S90^wV-r(>pS_Tnz!Hx6nI+OnUyb(`OzG5%f1YLcEvabcqNT~b(cvW#|(5< z7it2d?21=y^He)W&qS;k3jyTIzn!=%78|&m_PEkNyEE#iDZ_W9L zO-A+{-1w``^6WAg&T&{-oIU~LDiF_xN3jCOC-FV2rCakKJ(@bt<|L#;6?oGlXKxGe zk60&By+4958h%aL>OQGcnHXAtspHSSn0A+47Jo(vrE_3F5g#XJ3Q7m z^tlcl6ao#Jh5=Z(%(&ykHx(sObG?;!f_sKWD* zT^;}ZB04J?$O^lAik08MpNWx%I@CB9)V8SW^NLLkdA#R?a_OyCXkQh~EnLv8v~@u5b+itq#!vn9;&GAbQ{}{mWKfe#u--+sOZ& zZctwTh&3mvMuXamLLg1|f<5?ro(}|z?6ew30uew}*%VCRI}?=kbh%R@2Y3~~8fL8J z{=mbDiIZdR2)PytEREajJAw~{)4~WodtPHFC0*lZb&?;ltj&RPc6fu`Z#TL}5^r%- zscFYs2Lqsom8M-Q;^J2wzN9T`R*3#PBTV86ha_y0s_u3UAD@MD2;b*J0&CWBYnz5^ zRdZ(OUv7Rt_2ro=;a?4JSd_J*Q&ojh1+xUX&WN}E_)Nu=&0?ZIE__4d>%mqYD*lpo z=I-D&zfxJMD2Y^P0<{r|^zCDhKtFG&D}=RVnHosxP-xiieZ0{^q*Hg;D-8WroGnmb@4Q5l_#8OjcR3$sNL5$iM16$ zcK3111VKVi6H_ZuWZ>d5GX;N>`JJB&T?j#D;PGga&10EILHZZ1355>PUp0NnCf`1& ze8B>g?BQ2?zi0tZI?PEA+Tk4t8^&hR52UZh% zWT?{hN=P_%YQIuXdkoR(j_$9Z%e|O?%dYz>|I@I<&pM}40Z>2o$5B94#mk@^15NY< zza@5;*HSc_(I>2Xm{5bB%7%HyS^^0(##>^aT z#JGk3+)FBJo1W+{^cn4!CxNtg-@3Y}J}j@Thhl=}mvDKj4_iM)Y&-z^RxXSWot?U@ zO>NGbsQVYt{+k504cK*sRV7=`Y8WWwE{qmhMnG{trKz&3FBypgStQB-(!PaZcg+t@ zT@io;Tn3zy#W#?i{G+Q&qbHn=OWo?ez1o$sa>_HRAdNQT*fe&=cKlb zrd2xzN!ohjekUjr@x@8L)5Es!r<4?siPU7WCF4h0ji*2FBqhxa+=NN`^DHtYvwsrZ zn_p|>w-E=x-P`wW6~iMr;NHjUk-)9Tqz}Kf?@u+Z2usjUjgVroas1Uj?Nc{|8# z&DQ75$98f|?EK}v*DzCmytr2~#N1O6XT{8hd@``weBvLSAoJx1WaasmD1Fw+F$*q! zARR5p+j0}|e@xC>X>3Kwt3oyQZN$qp;g^?3;wznR%CU_WhW|(PGFDmw_eAf90nyUI z8ya``mG2g#-mjEu^7tDJP!dq93r)C+^}B*}wr{_ZV6^wm?C-`bJkxx5$#2Hkj|}@x z7+1-cW9Yb-)bSpzH$$c%ERBftm_nL3(F{B1rH`Ko0K?~rS9Qu#l}ehHXWZ=qPA})t z!^OvXSZ2QSMFh=?0ox^wqHsh5|9d+-c8vI%o|hdnQDO1-=jiKRG;}ApWt0D0{-8;4 zL{{0-7WxxBLq5&GQcDBm2D4>vV7@2)uu^h7om?Sqa-d%@6Z&ghInZyxNYKR7)5kS% zpvQKd@=}#^F1uQm$kf2D-r=5CIfo+x>#oo~KpKtrVE<%cdN9}ln6amxy+(H2DH`RF z8h7j`!SJ8?Ue8$$Oy9nf-AyGr15p2baQIWJ-<-Uz{#yMX*uPtoir-!5dwuEioWG7# zu!M5cpU>o5`dNw_$nF95ca%Z}GG=~P^|KtgfMEQzUJD0!To}QjgKf^^;me=-fz7^y z5n1aWwiIj{W6J^@by@%whI$kZ$laocAT-GWpTjBN1ugDM2t#7D-Ky%`R^@9Cy47pF z=btM<`KKVR4tC|!3h%S(I;XiARYG!^b>h34iPdulB&~}R;w_8&w1hJSz7SLp>3W|O z+lEF4WtmbadE+}1JtR6&wYuZQI*lO(uty`{ccDU=W&``OS8fnYk0lC`bijmgguvDo z!})6@^C4dtP{n-2r_l#?I2$bq;m(L7j*czc_FqlpHDq^f(mgI)w|Q!%V8AObE_p=0 zs3+_a1Bk1{2E9-4eG>J;xz7!Rp3s7gU%HKT1QT)72iu(FltCargp>`>UW-Kq8yZpy zu1)C*VD+NZ;t`Bsi2Ag%EjOA9@`OY1Dt+G~hZSL1%=SiB{2_;+yAa2W8qtKR}$&?N|)9e$Z2L`I5N z;;edQ{w(?obbb0HO~qf@Jv}N)!T)PjPaH_38&<@$tCKy8QCBxG5u~`6Eg--Zql3L= zwP#XeY%w3^dS~Jt42`oPDBIN=|N2KepoBwqS{fGA2>HSTYJ@~y%qPm?mH z=44jEA`?>v=OfiDN};_#BBFU?Gw$YRXj$_=L4~?bszl@V)}WNcQYCh8IMDT_3R4LO zGvh^c>W7_<5;DsA1MM9aHJ(~wU|6wKC==GQYiKeOm zb9P~c1ijIyx_->S-DgEgv;VERand3)JLC-K#grTql1Q3$LW^(ewl+$&FSKK!hgM z^=dmT0*$z8mlbfOmySino@aq1#$evcWJlg{qhrP9Tw=jxl`7NU`Sw%uF&m(L_?X2+ zZX)_y5i~crk^c!IR`2rC1K({u|KQGPr`zVvcQ22q8iuQzAcOfu!ipyzeWY^gKO(`AG&wa3z&DSRH4?07V>G zs0^y%?gjHxLVGD)JxZ(sc&>JxZntp@c*Dd&t3lMSKLp+vb4n0=VD5g#-aTftvRQF(T+Z8rIQma( zd|hcGyYokniRCPp|9`0j|XH~89*pg zLUA9#*@G|>rS4{hd##RI1EWuAFPnz$c{obp%Le94uW7Ib+p)SHK7RFW*j8~md-Z@1 z>f71J3O+B)b8=LklbhE&6tf)RGU4cSDphvUSx&pz-;D34R3@XqD+*gF$MydaZ_mI*V4KPn%?PrW#WyZnrDpp z`U~In6I@d%+TR(@j0z33u4BQun@(j`Y!TN)zho9w5X)5=3#os z{K-Fi&#kt=sWW#pc%lQ$7g;!h_|8%&4*K6#Y)-PdcsY*gu3M8Mv%-WkPjMcybu0(1f2lFkV z#Jwky_)`{kjFHiN{N4A(j346+NNTN%d!l38`19MhP@%@lOJ`ZH(pg%uRJIL_26G_>4+%6A)+Mt|55eUVNtzN z+vuKQhVDi{MwF0lqz4hCLqR$O6p)ne8A4DI!J@mR1tg_JO1e8GMY;!O=Ir15o^!76 z`*-G=*?T|xdDgnuTKBpaAx$jsK!os{AfMOJO$YHXr)_UBs~LwyI>7^6qpECw6yqOtv3IcR*QoD!Aa(y`6uQvN_1ek!%@ z6;LW1qm=tRwU40J3}G>ujp+N?8@NS{?vF;Rya%P1l%3xd{yw@)m~yJGZRML?nrJ2X zb8s~j2BuCUNAO!J2G9Whk9gZ@8*^rQrJEGiB2E2Pt&T zWKb8sk^3OKQvh`+YwUHBT6h^Olc+$2JQVDi*bY$?6@ykJB}dkA%upHso1feZPZ>8o z`$j=1{p5jiC4CY)QlH@S&4=YU=5ZdlP`JPqH`COs0KAXiCS&4?d!{^LX5g}uiOJ0M z0ZMfL5oGvsUS(gmsny*$g!;1Pp7O^%>dDd9MJ~+aTds;Ao~V26grd3y2tUbGijy~S zA`3P}TLqxg|JeP@XvOaJ2S&~%C4^pf9IY%<5>-GwnCU+6&;2&x`=0N*Rq6mQ&aG%qaJcqRXYsbG|n5&CO+e z$Qp0(S?}iDjfKX%CN~;@rmjlso^@(w-&{p-@I>1kMnz+<&{}Kaq7nkcN0Mi`Hy{^? z0-%zK)L^Efd~H(A72oz|*E~sQIOx^6TtHHz zeR4SdGN~8ayry_a(*8V2bti{*d2TU~?E0S`wm$TFfk}Yq25i}Qy4Ho@@$gKSNxFo# zA}n&AZ01_}P)5n3<&|m%OUu>fj&RD|KDc#F$bC_b_DB(U{`ErOL%^a(+~6kL6AfLC zuS2bTY&GAGan5IKndazLkb-!9PL%Qcb~Nj2O=n^xzx?Yj%ZP$bxYE|~8Cgt5N$_h2 z%VmS+FHrq@5b$PEB)^~r9zbjahb4=5hfJ2sj4?5LOYbY0IatEYsdmG_W{IB=Z4#Ty zOah3bN^zh>x)+bse(U!-9hg%{wi*6(pUCVuQ*-B2i%x{V`Tx`*L;tr9X+|G)s*z#@ zOm0@*e)#2a7&02M+vZIp5h|4q7y2U?2h$y1SUT(c=Tb{Xp@kg_o&d%eHYPAQpoh3=q8Rn09 z{d1KAy^j+4juThII#gbCB%sJhztnNu=EKso;8$(@ulrx&TbqSrKkn2IHYt#uwTp=Z z%C@(Z<2gx$XzxBM5uDj*;qC5~xm@As?R{e>_l>jnZ)v}L@0i!# zHdt+WJBv)d(hY~zhnbL|lUQsfGX?`Hu6$aJEl>YGX)dnwMjaEm_%;^@S{wOx^Hqsy2$uaG$vg&_7ye~DVF~#W z6}MCPy(RJqL?mrV`EXe}u&?;piF4umks#^vT%SHRZqkpw^>>s`swgNoaV-2A26tjb z)NdxISZ5JYvgOWM$vmjg)tRd^U*Q=b2K)#noU{v;`aWwsxeqPx%W*c9~ zU@=a1C*`p_jsqWWsTDWT$A}Ca*_5~7rCJzC z<5wqJvwkzhWfDu{(XbP(zt)FSkdBW87k3!)mNp|HngwU)^ zMpMl^LdaVN^Tr;zI2PGmquoLp=o@%>?M@k!S~Ua3%|L})Zyv_qUOxG-eggK>jLGSm zYVk)!&JlbUx?yVA`1?_hn6p5pky%kcgdt@eC%gSma9tq2p4?O6tS}<^56FJLqAI2+ z#UsyJgZ5c#T8G}_I-k1I0?uUSn_feh=2!4cT8i1HYgH7fLET~HY#km3Ixf9$Z?bmW z1?7{F3H$k^Xj=t!@rHH(LF@fv<7XH3vzjdPjtz za~x3z(Z7)+<6UWXf-i|XN*}iMl6RJ}_pJkrNS0QGCH^kiUw1B{R97<#-|G%jowH@} zyw|qByezt|UVj2uJhCXsUiC%rZg#CQHIcyEUMx>j!C}kqoAwKb7A}lZ($lq2y6&Ug z8T&#)se1p)Z*bU6`Ar$1QpQ?$hRU%w1X+qkCO@n{{k`lpSx)+xQ0p<=si{KH255=M zF@vbbC20uPw_0hwLVg8)Wr}Qn*sQ85($@IY?XbDMkw`T;C5d zOIj87OySHvY}mPKm#^b77?lwv(m_&K7kv@C$oVFDBIiEypisbCGlF2`FnrK8Fx~4# zm0^X9I{qhR$>3?`$4fn0FM2qc9Mg05G-%K1bY`>{UO5jxbjF^~(He}9hYatdG~fvF zXD+V4G&Os#7wtC+-)HTT;;NGtvXb>cu+&M_(Pb=TMi@HOKAIpI+G?i{#5K zbbjZy#`NVY2t7^0?8*L(`>8)sC)`qwdqZVa87s6{S-?V-wcApQ#`n^@E6asCDS2bc zXK{^pw@pZu9gpa-{@X#jl@D$x>tEo`)6=r?mnS7B^WS<~8jhqXUMfR8o`vzJ>y{ln zdeb@Bvqq0OXja`W3BHogRP0;bET5j1C1XIB2o+MHsFMM9ocEpL**ZL8;pETUHVVJA zKlbzI{eLZI8{RteON$Q`@#9GZ+X49ZoTD(4jx{=NFTca(osv4Ytn+j!&D1A?h52Em z@gEC2_R=U&Pu9KmtYcCrCkD?c1#lK2c+1wfcS%&c!CU>mwqMDHxKHgoUCsRCg-twp zC^goX4fx+qm}fWcdNV=z@P`C`v!nbDJs>x)osp86S!isvpe4QJ%cO8PUVSn?HuN~; zn~>Jz&}eG7Y2rMIBy_Fs zdvF78%u4#Hfm{m5{UFm&Y>ow92bu+&w>k3XO;KZx+}L1Z^`7G=>c~@i_1IA~5bSG_*_=*gU2`#zR5#&0sTsad$ejh4+;Y7ho}Xu9m%k=tR}79kvvrZMzTJzD&(C-B8KS9%?|z4yDaemQy6nbLQ~WO`D@Gbn>#o_)TUAQEd1oI3 z+?!Zav%-ac`fgi{Z(o)Yg{^a}T~ZxkIpk&L5?Szu1glEK!;XB@o=;d*jI6s^7p~l@ zI9QvbT%T%0Q^Op|3KqOh1JgIm-OyoSXkdCGqVOLzF>%}Ks_oUva%-Wk_6Tmus&Fd9 zKm4z7vpVbZ0>^>Tl_Wj07F@26+Z0_)VT}@Rnmqik?*dL%^R-$`yzlG6e*NmU&WYP> zOkvAcN}|?OaTu(}P-tMl(H%kGH5udPVs8aOD54r^#`yNtkfk4M#$J%sbA^R~YZpev zm`zXPye@`f-@lTME-s)9_!leNtsi8t@Y^XB%^1GsgA(hJf8u&0Ut?u%kkG-mU2Lu< zn=h`vY~mD5aKD*>@14SnxJ2i!){E1hA7XwPLStyqh?$|WhddoFs3Er0cMW3yHXl?d zm^S^JDi@^TS=}q*{F7)3$aA#ZfxLKWM-I=r2aYt@rXl{EoM<(#(&Vd%j9nNS+2{-~ zlVz@VT-#|qVESlU%Fuht(Fu5S{1ITAnD(e+)(yIlGoP`qyyQsE3$jwuj%yXAaUe;j$3kRwN%OS>Io zig#Inho3|`y!^_l<#q}Uwbe#5TPWkjC##*?hA@a#h)l=@)l2etDhbUqF{rqBb&bPR z%t=qW-{@rSm7{l-8o};y3cN*z=k)-(s2(HvWR^p16G!$-(ru+X!gJN2$}qRHi!+fGyWZC8CU+Vy|)9HU7vG`|vk%bt&m* z%60R=*;RswhegJfG=gvPbyMYqxm<9wvV^F#p3)rZ-QHYKl9iI^nC!E$w+!F+?A?`2 zz&XL+bsw^zQmROn{pZ3jmDjfoi_ zv`KnNdV={wsEocY3Z#p%^n1+{?c}J`WlBs?G67Eb6ashwfg1fHJTmW%vD+He^e5OqxF3}$cNU>=i}1Ur6^jBNY!8JcUN0tPY8cXQb}x1 z&hiaOAG^-!MnBtbMp{APd+p(B&;r!7D37C97yMtiUf@jW29iNO!+=kAKR^0|x`5HD zdV^g1=xW@admPxYz8pB3)ncV;1A>Z-z-x`bQzoUt4+Iq>YL97y5|*}%nJ-4OxOqnY^<_+f8Rd%&0jG>r__-7JTv(7VwE>K zicsEShnMU{iCH;*i`h;qLcn&JiIG*poT}IGtGsZ(K3>P*Q-qXvONi=qRI7~@`SG+16_2iR6v-5 z@Lo32etr7nZa{`qg-J0{-p;&|@UgZ3K$_T8YqvZvr7mQR4@-7IxOo~u9;!UqVl#%q zY{8l@HZ(xORk`Go@b>YRaueUwTX`rfY+q<40hm5P^oiF-MyMc4F`d;1V~@h#4iLhY z1M{G@Hz?%Cmxy5+;Tb_kcLUc7I7Wg99jYTf_`WN1RX%p-_=dft-R1HE!xe^rn|D!M zJwsDWDw(*)54pDwZ_}M%#w7;EQ^i_m|LWa_Apj{lc@5xR_pAlSwV#=_reVwPXpZBs znY1yc+_THffV+GhhHb{yVe)`fHS5rcB((jx=UR_J;Kin#(^9kFNPbCTtsCXLJ9aVs zp}P;nM*@x~TNQ_{y5{{Ez=uGQ9XZ(9|wB}uZxF329+fBZw-2T1U>r|C= z9vCQV{Zss5@oUzv%=4hxDYE-VM-z|0VBk5Ac$mW>k0tCmog@O7vJQa@5qOGO73D2a zn}GfyJA!Dtg=0Z`$5%l$^@%|K(>Z_OHXI>0nvB{Tb-UVmBv5s3{6xjWV!y4IWmZ~J zC5T%$>Jk310iI%26wQdYC2S2zLtJc!>`%?!0oXL=zvgF1npvO9pIe0XK`VRuyXy|t z&x2ES@A3i#ue0T;)j2`!$%jqW(>ijk_>e}M6<8UY<4m$uFz(1_e{FLtY^e3q?acjR zkz_p{roZ0HYXa^y66~@vT91!U4{BR_FJ*(q5*N#c^8qAAnuX(AX)-iE z`6D;|P24(E3f4)=P_CMJhx#Z>NnFc%!jc*&3Hzmj%!)-;e$dt%8eXVdQaz?pKo*Y4 zmoeL?k*Zf;bYR7IqcxO(@=)EmW*chQ)F=wEKqQ9y^-rEXEh87p1J%OA*prhB|9BmH z2m314oLF9eCsFRR?Q})W7@U>@c~@(>TQl#WA3ka=Ewi=E6$OtSUlXz_{b90kAr}Q^ z3T0kw`N0^On6|$+Uu`idVMJq_abm7T6HdKI!5@-B80?B^+Qi9aQ_VF2zf$GKQko_4 z?Xw6SrAkahUqJXTh3@AYj_qo*iQH#2wt_Ht*3zcWm=q0n^oJ4iQu|+IKitZ1+Ru6XzEwF_B}_$lU09G;Hdy;f z8~aJEQk~OVWP%+kYzY^;EimQdfz1O{@ySDk0TI>;k1S|wxyJ2XW`OTcE-?H_LKh#C;!G2ccR|InL0#-caeETXe zt7$B)g6EuT&EM~dj(yZVRj?Ov%FbM2h7v5nnOs?Xx2eR|!0Ro(>f#jCkKHIzM*Zqi~u)d1O;nCIyFzyDcvDn*{$D4B76Ic7Wr`?nzUC%n+ zT&>Y1V}BJL%MV^%-8&c7xS+e1hqrFGcgj`AP{@ji>k&D%N9OqqP8bR zt2iw&q)>2D1I9KvHxa|i%NK_vfy)_JjvL>ixBjW|Yh_Kg2^S721(wvRE^<>>&5@+$ zM;xE?gx?P0dA|LfPJDd2{*BsDD4FYGOKfdsL#$LrAnC*lg6v-$7S-4J6(Ol^EvLFE zX|f}=%~(_1uJp${gyARqp6pXX6eP$;&~t19sHYfBky&z>pMH}z?KJ`rDwO*Rg_cox zy!?=X!odR%7lWL7V}^zkjQZ9|3#A@A`gmf8geSMB=b^i)rdeOVI6KZnQPlYMJ(=~N zRWn2VRWp;5)$B_U&gJURa^&@mSiSxU4cX>L=}Iqn66xsbaxtK_AN_a*jsL39A4(Gj zYV^X%{fOuVJ;sK%Be`}hS~#q~aD|fBBLRVLopwlMMBDfqx|53`ztJ5fEJ^x8Qg%K; z8M$(m2&Ph~`j5uD_1)gh%>Gjjwi&XIN7@3G${ne-qbWM6P8|t4HBNnuW>vv5f>csi zt^pk-dB(ffTqJGw0*<4JV3w7mrowvPqBc@vmoY3J_}sy{iP`X3XEQsSXK=9@@oQLp z^fQV8KYwB3&AN>8kUJ`(AU=_SwqpVhUoD*cQaB$SWy;8Q<&Wy15cv?%60V3xE@qYs zkA{6^NwJc-U*r2Zq0Cy(S=zmT!n|&D_M3s(_ZM7cW(^-D2_8U~H8Ik^n}8)H=TdDl z7CvB}-C(7|sc=#9`$gx`OL*H#l>1w&NpQweHmHHgGDHB8gofo|`*Y()_Ja1ay&QO) zOg#iDvB&uoq&+Y}yURj;*!^*oN5^8S7n!%m^Y?^OX_^sse`@~L=t$HC(8ao$=s8c7 zkx66ge+&gczCz<8=rjATiI$WcO11k8)gin#xtrzs4@uGSo1Fa-0KCmxGgqEkL}mH3 zxneB$eDUGQbcFZD@BH0^v**R8qC@JJ!8o1>!yhq{DL1U{d-1CkwFC;LH`)=oPFE#& zb$2@s{GE`Hm$xU>EUoc_BQj=xY~huv2nJ3gG4_U)rU3np7tkNTQ=Z5mi=5z}wSSQC0hU3Qz-DUkrpdz9yZc|pcyfC`LEhPad`*Y}z4N^=G5vtC+0-WIxW~IEmb|SGG zxDkNqRKn6V$2@m5^)S#6Z+AdF-W!V0rYVxXAz^Nvw>^t!mNhS&Ic0Ui2FN*HHEa$~ z3Z^&L4K7bko>WgY?cir9!k=h?{~$Ju zfh1Q*Z%tpzE6B;He6JqNW#6xVH#ql_GPc~@fo<45CgT zZstIGlS6csbo%OV1GarmkpQgCJI&=c6A0idm>(uINi0Q2VoHKB>F~wfF{Y5~#vvUj zxY?h3{$WAbgd;063JV>!IPhmpHQV`?5>L#txCjX5GYLXuCZ2r-x8A{}@Hp!Urq@aK zUQJq*-jZ7Cph9A8dI)2zy9o#PE(_qA(O;fz7&dev0bCOBlP^mU}ABs{s(P@b=398Gp|xN%SQ!B01H?e;f|| z(xGT*yld1SCxi_eSxLekbbN0C*W6lo8gxEPXqE*Q06xJo0=ba&yTZf=L0-NYl;crO z%i{wp`SOJsK2MTzQT7v>H`v%D{0Yug!OK}d)SF#tU~O2SV0}={02y~;ip=Ts!Lcf0Vve zsuM9eODM_emei)JrVc42>MjJ|C^N0*eteYit|HTaJ_E=*=S<$NScf9VTl=!dCcoSP zYQ+dh@%I2E~{IUfKK(LypE7AP?^G27{@HVJBmi`Ufe}LJ~$qQw8T?<1tw)2Z&RWB*i zsP6D-t7grTq6MGQFhCwE2GcmbhawVrW!Zn;1xjrY@k&s#Q`v==V}cR~zdCAO`o2w| zOd(qA4b9m28{-{LxHXWS|CBcK8<`MjlIq4x=Z1RlT*-p7w1DMl&uN895B}T}o|VJc zJb2l4y5e`COy60dSXfcLWwcb1|8^}aF82NC={@)|iYp6_Kp+l!a`lGyERwW483T&u_PhN9}?s{^ex7u~3NRS$W zp|^azgML21u4i`mxwm@>qUK^-8}7gE>QdXrln58bT|3xA|Fxe+8}rFPTdyy51F^U( z$BvN*iI(6uGfrqV@wBZkU!4M~0kXm&S$QsR1~&5%~baD)^b})emCZXj;a^o!%4{$+?k9>UuG zT+NvrSU^{vbtKx*%oF;D_%i_(z|BI^VnXPn|A|RPqB-)X_V6UG@->N1gtymV@z@r& z%=E&L?@wR2%<0Yvh03J|49?W}4&1oG{Q4o4A(@LJgnEfTmKyQLn&r82IFOeSLnST& z|9ZoGbIm8yZgWdDrkTz&KJ(S!>5N0{tb=o;vND6pn@)S!W_U#_hV&Qk`RVs8s*pEr zdkexN)#vj%1bRwp4)03!qqN!6O2%0G9y+d@59aPBT4<-%xsg1+c!Jdf`SpUhtsf}* z4oe@G;zj)I+|pQ69mI2Rr9|vllIRH|d-8rfIChZ9y@n9>07lvRGV*5YIgj^AqEbHD z6G0~wJ60BEfQx2y_I5etEn9dANe}AntT`Ny&F@`H^m(w$fVS^@jTw@q-OJRY2Fl|s zYqoqcOKc8z9uvy~nNJU6bk%qPN{@#ONCd%unc0&qVc$`$^LY)XiH+HANW{84=tMhW zAt}sCUnZ^nY0|GIV;t=|bFO{BiDUo*yK^vje084zFz0Aizjp%5y<)ZzVr|)0*91sN z09!!&!-D|CGJP1&&49Fw#@#2f&a2dAH{7}){en`CORIp6>%4ZMbs$Ug`t>oNSM3sv z%^VIi;B@qb3S86yS(*LnCF{(IsXa_UA!~ESw<7VY6mFpx3va%; zpNc~(b{8K0mtQ8Nr4XBfEDS|2tj?<^;1UR&d^@-i1d1D{`p8$N*y zo1fiW)oys#W$?TcA$&gzSf)p^BvN9=^@!R2^E2MZ>?cYsXRc-qo-)`oim6eC*3%tt zT)^hZ$p*)}m(jqyE*%{$Jc~gfy%<2O=-o|>F`~|D7_vNR-+6p|B<)Yd+FX+DiDafG zSbia*Peon%(B|pWu>Yz+LyCAPTpFGcfO#_O+m#^Fpyw~q7>%DMMN2S<2;jx^Vt>*D z#}te0YC{Y0a*9M(ZkoZkg=9*VDbuT(rzas7?)-5-FQ$2If!{yEhwEC9h)TDeQ`v#R z!B;JNTv|~b1Fal5PUt~Ls(WFt2w~QxO3L1GTniC|_n6Iz21tKZj&HgAIL|Jnb6Z&4 zA}T~YOvONw9#H8wU?T<~g~UnxK-mIt9yUZCr5Te3B$D5`SzK+hpGD=J1PP5cJk#Y| zkFL@oJs~1KVS+*+7psY_s!EMta=`>n#ppj?FjePP3BL<`Wo(szJ@T2$7AmUx^x`QL;SfD5(X2{sEURxY)~zI)oirY8CJCP9iZh!CU2 zv&f2yGyqN8cCU~l1Jvny1EZW0U*=8+Q{T2g$iz7UfR~a=kigJL)-XdjFpA1|cxw(v zJ99dGzZjzjqC1{m$)-yH^EbxZiR{Xl(MtEp(H$RDjgSDb2TeRbxH}pyzBE{5lcE>H z6Xz3{R33kCF3>pmp&g9bd24BU!QN-BsDlLecJQz?V)%-{Wt4DRhrB99W2nv^FbWvddx zRgJMO0P@T)(r(PpM^b>F(@|OyKts^rkXCK&s55q4AVJtH*Z$r-p<`26F%^wr_iA12 z=zi#+jjad}4Yfh@yoLS`n7ap2w<7xY#FL}`RDp&sO1vhpctIY zo%P#(?Z$We5Kz@^HD)#ppjLkf!W%yab#^2(7SvTq3)$aJqUEqlCH&XQVoa*hT87IOPPTQ_> z>*7L*ZxTPJZrp3S!NSItH;^hdny7eABI`BB0_HK+YOjg}AN;qec<#plB7&5+-HU#w zZvMr~G1Kow{R77mn_P3sf@REiUYZPE$H(4yJ-^Y!7R;vi@^ZFeL|Q(;tZ~jpqWG+t z_>oEi?oeOq@Ts>JMY#Z8*P2zL>IFjxwhx~!H2qRY&{V8Hh~l%@eQ+}omuoTzi9(8i z_ZHCh72}Un6gQn|fi&oWBr6o^(YJd(T!>qX!Eldu8F-0Dws@M7P%7JKQi@JRz8l(@ zZJl&hz2?$FsXZyna}Qqk`p*Z0qy&nbv%6p?%!4n2`T#_v?QK*0+g3#5P#Q(@EyGHI zz!7TAQyM=agZFj&P$W6Jz5gkb4mI%9%Klr?x`Wm|R@rmUSY7&N%pOIE_I+9X=Zg5X zuYl_3R&K(usmwuWG_)<_?<8CqD9z@_Mliy%PWIO-B5ETatmI7i(37Gmv;Qp>@&PwE z8mAk-QkgFWb=(lNr9BBz=YL9~@2tSwl3sILAE=5&Y&uZ`l$sL)kDD$QjLqEiZdy(I zMhx_>GN~X;NYPz9rCOHc@U{;57$c`LfcX+5$W!DU?(^^x{PVk;e@}a6d4c}N#DpWb z^iW?s5(ycOvz??x0H!no`^W2?K+8){RS}66n+a!+)HvffW}x-ceNEsOHf5#S*GqB9 z!`6x1!_;+Vc&%Q;pflT(~@ zSryOnjevK-*ffgt5`g(RXU)e+iYtC2Ktd5!5-Q5|fEQ>@q7b0rMga3_rYiRk?F;Y%$B?Qw;;rO&_AV;L3-=^JDcZpMi6eDHWuQG5cw917 zxRD$&xkfznK-@B;#dm9X+oZkJf1VUg4$S!~4HovNfPN&(_-xb_dN8x6jlRLur1~d8 z(VL85KF8}3S(BW!XKB)g&%Y^1-MKQK4KH9(~}O@-EX7%v%~NjO7{g zx&>TZH^o8J{2SuS2iSP5dZuzgI0bT%+;wpAL`Z6tGOy18xSTUFLsUb~#C80x1O zoc>A}m*pdnR*)|#C8a5iAZ(k{G@wD}7357Hdbf)UiCv0LMSr=UO(N@WjiEXK=>Y|AOeND4`x9h)EO#QoUQ5t=$;}rZ7^(v!#LnS1PqAVf-IYL_DZcMpJk+Qe6aX7dG^6N&*}h7?gTRyiMvBp!WO$vcQf zLWqxmVEO>yM`^(wh{!F^1;*kbFRY^HCC?S><+SAH6~k|syGPR7$ap_Q)pc%Cq<_D` zXVMEOHLyr+@)-)L1j;z$Kt`VV)zrA{keMP*e3#L|9Cm#Q)&u8g7@dy`0TB#1Y(j@z zG55YDO$TG6fA zVUB03wTz9rULqet2LfFT&5ipdEwHdXDKDI5R%XmMM*daEba3toEjs(+gp$tmmKIa?84xUT{7Vy3towt^CAC#TM~v}RcF1{>vn z{#FLA?JNw*zSlhi(_^h;0cO{@rGgT8*Ul?a;0W+%Web9%N4RD#G|Bhwwc3xr(El~M z$su2$r)4utLE8L~z#UY+y|AoiX10{mNRa34$C>Iy@1&@I*^_0_N9=}PDvxFt0 zD@H;$V*JC`vw~S{E!JAtJ-7%N3(3O(~}Vc^gzrv8^s)B z;1S<%8xQd&2a|rzE#$|G3I?dnv{Yd|i%pfhnHcmy#~!+dcDE#iwcThORWiwfwzWky zWvB1~Lh|HyyNf%Ea1Sc06({9sZb9H^Q9Utw1AZW(;Y!QDeCfI35yB@MIQUFrgvtUA z)cCaSQlka7zFf_a!?NauyZ)y0hqu#<)DLu)5I}5V^L(=1;B6qG$n~0&;~A;qJ3o<^ zG~UsNOo@HgVXtjgy@GLKa6~;B@DmOWSNeE*6V z!64=BHV0sM&@&br{dErPiTPw@!b19*1s=r&< zh|vnZ&rnqsq`=gJN$kz-mQ8Bv-kurXI2KMsI{$yBHaim9_QpwTxOxvZ?H1H`i})|) z%*A;1X(r415+66&dr4OgSR1|Q@eu;pNHSV~!wp$>dCelWn2edOPS6{0EtjR*{Z+Mp zwj#Z+{aT9DD+_#9OU+x5`dv57TBbKWkUD?i83U&1gJh>Nwp*bm;yBz> zY!rz=wmQRLZNe?8lUAir8|Ozmp_#w-b<*C_M(`DGWC8S*v|t)Xt@3=#Cnk%aw*hx? zeL6N&!;quTE5L>Nh6kVFy`#PyF&gzQ=0*Egs7)%%P)z6kubiocm(#9?F^a*L4lT4I zin5wh)-jKP7RJ|L&&BUGp0m+>s7=zF;a8V#|&&mlrj2J+WeQ z-aPyf$l5qti$8b3M*PR5!yY4mz<0%FoOggHie8p(howtQ_U$o>SEY)>5oVq6#&J5i2J+rnG`TyOvh^mgNzPyedJmnWaRpVYrc^lbMtkkv_Eu{sMxM8M>^G6W8zzp@eJO#8( z`D@Cv`%nZa`WZg$RZ%@Vx6o5+n)M&b$1J>n+e7WrvUK7taUo)Kc?DZIb;<38&OLOc z{XcgzAyin_mRS|{CRlCpyxv5DIMArfzMT|}oBuJ$Q-M)*8u5~vXOoB@x1;qWdG6x! z*$sReSIh5qpoTDV5#d0vp9nhLp>uw1YK_IPiPw;WTB)43%D@j53loAb`oK}l3n}(! z0aBo%?3)2KaPyIG{x4>r$*f-Q^k+k;PY%RX8_L8o=cy04eE6e81a0dse!-={51cWE zj)ohXzzQ11kKcRhr$>x7>%Kb#&3jWGCw%!+CYCezRw5~~)(h*~O;eq=BOP;8x087f zwqSs#Z^{sVt$>EMCDpRTpaFYW<*&FPZs2S885z2B(w523<-JyW`;O#mB*3xE|E*0#H3xsVmyg1?tBjfKC+h(ZE_s%6n^5X7d+AYbJj2 zE)5Q(SZyg4eWw^(3|^=l+tH`}jd%=5TLi&FPE=a0%aV;gEOIjdgM=Akai$H2k}O9* z(sqnXjh~>74^C50g)>k#r#+gOE@MSKrhoSm69ibwdrC{5NGk)yl2+W!44|>fHR9d* zy_$$ct{>p^fgcfRnNUOkL-J2S8sgb*?;p8O8FTd`hpY`@DWU)ZP%I=QM(cUUlr^aW z_dfc<1ush9qBZ}}U!wC7KaBwoCUnKKj~Wnt3Y*om;D;=>&*r^9c4W#Zn}Q>uzIn{* zff2|?T}+@dV3B1qC@aqovUEY(Gl@hMxTkd=msNzgaSNaVau{M z`xlHeNHs9Z_%(q=*kcznDV|A~Sol9`1nrI5YgQ&HaL&b?2bYfXTW9&buKgTTTdB(B z!^;@=_yRz}l1`bt4TSJp(TXZ0yZ}oZ|79-7|Eo_v(Y_=YTQ$yCi^H{cAzjF*N#IB? ze}ELd#PC@aqHb0ipmx5)?eBcQnm&dz=eiRoebx6E_;@b@v?UzMy9fX$DpdT6lm^X) zST+0Czhr&)>FZ{~!Uk>#k~*tmM6V0*P`k4p*ykM~89k4^L1rd?t7Q3@NR1YZ5CAybG#)4$s)%P*c^&z-d)3<6uN*U7)Vuci4)qeN6c!K< zU5F7tDph9JK%yeIqfv>=ZrT2iAJrM4YuAMiVM4wLfQ(D@*J!%V?Xf#R7#WZZga`<> zK=mK&g&xKZ#R6y`6nMiyB&MK{kO#Q8=U)@lEN{97#(L6Z^c85#3gM`*f!7u*wE=8R{9Q}J1xfb z-jYfV?{*u#uCn>9g~2=3$~K3nI|(nS3eL`j%4KLG;2QS}O#C(0oiV?`W;SZz@w@6o zB1q5sr>4&8yuh<>%RUAdtLFkSOEIeMjVr0*Y#`iC)CEg4N!s*ZV~(c!d77+JFE7Rz zfQ*VI27@nrW~6X*zM+U6%`&ty)#?AYN1ZT;tfx$oMVc%GdETsX9!w=24q!RicmT~e z(NFc87SxUQ`)?78h6&s&<8AEm{C+)lmHO8cTza`fiWfu>5un6YRRt8m&hlaWu)ptB zwLGT6-YR>gL+^kjYqq|lF&1!UV8NSY5d(Dz3MP$TH`#2-+djco7C}x z*Sbnm6+OtF`HS3MkkipurEW<2zZmx*7g)2uKj+phmguM%T9?zs?ZQNgw!WAF_n-Zk z`~I(4{?Kyk_<#0(6iKTjP@A_&0Rhy2SAX$Qq#RfiU~Ft?c9qhv{oD~r!}Yc2VvE-j zB}flczg$h6M**dPg4$!Txy+1O$a4NY%()=CH_b0LF>)VKoUf+m0g9CCDN1xcocFqnT7Sgx~;7Z#+A^y*x|NdPDV8+*+9_cnG$-}D;%)dvQn5P24 z8*1CPfY!3qdg8_iYJ0_#Qq~u>=Q_8^@AIv{OF)h5QKMaMcLm&lp(7qi_R*IE_7MZY zDuUyy(v2CFmt-=Njg-uVK-B>K#F!YAx}Q%PCB%T155bPiHR%JRUY8D?ETA%HIA&8B zIAJ#W9w`phHv%QVcHi1~SP+9m5Re5y6yAphvkraqbR_6Rwa;HXiSKVd{o390bhAl0W}4C1r)-JLASFwP$`UiEMAi_pjCh2ylR=iT_QVrfkg`*^8nYXlZ58rbHK~5Jx|3aN1E9IT*nC#A64UA3!Q=9L8aciU3t4O@Rm zFJsPgtq*vY{RBbCy~H`OO$8Nv`{UZ`%A9Y!s-BVAcM`FQ=at{@u zl56^TCJk(m0lSx!lhNNamP?{#VOTs(E@$Xp{7_kl3?f^`DJzbA%+qm3Wv?Zu7_q=c+!NJFIh3VW@YGMlQP2-t`nwY~RUo z`%Fu^bIAHu+luST@i5%c=W#TfrGL*Zei!~5g||?U`$~DX6J>SW4ShLbKq~W z=|UpvHgp#}y6dJ4w|N?ahIfu(KwNyA+d`i`9U3#K4toMHd3eK`EKryGp?u#>$WFtl zyUvYbllc}3k3>2 z^gS{o0wB?lz#6)YODo9imStx@)zv`V16Xzby;nLy7-~ znKxigcXh(#;_5rw=!Z=!!yk24312L4S?R|dMIjHPq3SRpRY)pd{H*AYOWxbD7OX34 z>#dw_UI{^W_JAfL`XD|4E8JA_mR&6qO4~tCp`vo&=tbY`@(X?b5aooU9~~(+0!N|hCnZH6d>wp*Vgs+9Rc2T~>?bzG4bq-Jgkn4Zbq+W;~AJsyBsrVr~XNl%?edUnyDcxrAfakfST=fi4Xe z>zPq&?Rox?hY25WyJ;P2?_Z?F>+i0-qj0iUn!KAgd3|!#a6k#5^z1UDuD|H;#SLPQ zOId!fKcgdw(HmQz3nP~^ zPz&Ep$F{44JnfeNCyuHB=a|iBzP@_#L%eTJoFBtGIt5>6Rz?xuJX)WU!t05Y)3SHC z`cUwihA;m{)#pwEI_{dfRpc$o8?9J8ulkA~I+w|Wv@HXb?(<9iIJVPJw(-vwo+s8s zUDd<`f8DA&%tH1wsG<{N$5|`)$6rNPaZqXDHL)s#Eg&4I&ui1-NQIo#?P%{74QFVQ zoMsA%@&nqC3IEG%tsE$gLNV6Ayz#YZDuz7z@{3u%>&^l;^v8o!KD!#tgzZBx@pzUW zlZsHAL{#YGotd8Ad#Uj3t}sK$lP6zc!RO3K?z)q`A~P<;fU zfXT$x2Y)L(V^t+^q?%vT!$aOV|7ceJai@oZ^N*2IWV_23hK~MYh#nI}kvccKuRtp! z;vdBBxG=nfn#u3>W)#Ej07D4yd3W?V4v-UOxNR#e_yW{PL>@^f>NKW;3aj|rwM{-H zDO$xlr2@e%4l%~e$eOuvTNaX*AFsqqhvR*1o$3m^pR5z68W;I8$sPT9$C=U4MalCy z?7ty-rCLPN+x}mDxuU#BXf>LKFI|vT!;t7}`bqaSVee6-;*e}1OD7*NoVB#Iilesx0=%7*dJRUQ zq*sq6KjHS?E`75Eu3Q*U-5tk*js2oXDe4bL;sDr{mvOhBjW?h77**ZX|CBt4uI_&Z zZE9t?!zHL7*Bwq#8&l@?Dg$&-P*`hwBW9f*QDYZmrv}jUq??be!3E3ZyhC=R+;gzB zUVa&a&Xs1BQS-jlGYVT+7UPwXLcSyPs}4bL;7$Tyhx%zh=G4zOyFgoGy0)xEw&`|# z#b^?T88M+CFK=)-<&xddcu4(-q!=^YJlse>VOkPd6FoL`Aea zVIzI{h(62pxAju%#nUg z1IMc4Z8OQ|wkXJKBSlh!-L}pF6M?wzfyi3v8FVcE-r_IkGS39Z{PfY`j`dP&QES`5 zS3G1o$3qpr)Tk2?SY}d0@KH1gL-ykE8JAS#0pNz2DW=*(L?HA@{#Nn8V}N2d-Hq(0 zMPhN;s}9Y{@JM2Rtft#5WttVsf$?8S+aiVA_TBz)^DyqkQs5+RNpZpAfsMY#)>wZgYxy>9!`wjREKrkaUa{I{Vkv zNhP?`oavhL6dk@Sg52+|T6KxvChyJa0*7lwgdFIq`Ogx+LSU(@lggd9s#|qK^N;9M z=F*cZv;0-iNx~;5*VBX{Zu)ALFN4oN_xNmY+HIS(siTx+PWmmk7c1&=270;%|!ch>05ioKZgX<^9bkZ_u+&8-%fz#*Zm~lan;G$ zWiC1D;G2iXI|H1a+ZFT@7D>2U`L?Y~C#rUtIc`!FA@AIPwK7F0w0@M> z$_xAZxbuhjN9)di2QPBu+})Y5oSQz>Z+Zo@B@V)@W6G8AF53@8@9lPCsHSKTJO0YS zic9}l@jJ+*x8X6Vrp7HFlP|YhGEYn>o~p@;r0wbhcZWHd|_-i(dHilw%sO}{>QM%YeIISZtEd-tfIAL z^4HW)K5IK)4Uo|O4?Q}-0&7MkehTZhRM>S9;A>HMzi$nD`yepF+cNToG)!=-W|~$_ zl5I)<8gkxNP)-8!ds!iz{(Xx4+9~Y}r0kk1r5~R^$`aU*3P!uFb4kFMrP)sIO7fyAE0itzpn#h!7%MC#$#KSDs!9~XF5*L{Yx_bUUqAgY}wt@IUk zquq5TSGS8k;bHHtgztg!OiWg0RQ6lAwrChG11;DQBkUj-1oWY*J^?l@7Dk9;{2y(W z+yoAoVK19bF+a+rpD7*O6gc4zfw)L&1=u^Hg!7TLFP^?9&Sfqt{uehkM%3I142#VU z6(n|B|J;&1otZF^%Hcze{TXOr_{&sgvcVO%jJ950#hNd-b|GP(WT)0T1EFb& z%)5`$;5FT8hk8DUiTFwqD!-&ehsdS3zn+UyHq>CB1WGTEnLpFfb;9bAMjnCN|_;+J^uEsbC)*WEnHy zHTe{QNKWea;9-3^cHgYK87e2gWM|44E!rPGhBycj?jT48>1C|m+eSxN6A%B-=DHyW zb)V0EWISM(I%O(vZPWb<0bpH}cNZL?6l;MIpXSjM(}xcw9Y##POv(E)5Q_w#}%80=FBAvQ7B)M>^M zLF3_ZSVL>~UTN)C!L-KdLnzW2i#wAn2<-X3+#D^O{Dp?>VnId@{H`m6!1}eV-jz5B zEi|5^cHL)}AD$YWMbGJ3Fr0DNFr`lWFaunW5EO_he&tvhwmX-;+pDO|fbk2nk+WgY z$D+hzWFUAXeOs{94KpM*b&^MSSJS?G8%qAKbs#f)|vG()t_VBD-4mnI(r{ByRDEa}{16{{?G0}Rja1ZtIXH7fq&Casz(1sL2ymWtph8lw@ ziQZje-i?o#-Ky#sER`u++$DUD*_$7Jzp=hE)~YcU~aaW2P9UI|ATCEC=7tV>Bt zYhUK@s%j4omfcw=?)mS|=Iw=t^T>Z$T^!aDGnB(!g{U(PVV(xANb`l4=iT~13FO{N zH!h8>HHNKcfyZIJ&w!9#z18$;+OcXQg7xDeQ20GS35(k`-L3JpWwa)=OD!- zqd?H%vnsd7j4O!^$0RO&rV$dQfuTtjPS(Y;;^O$JIGa24_89!RL%gX=4Re*X!FYsNbdJH|iX` zDBY*0LEpM8V{w9QdSf&=7JZ`g98GQlW8(^WZ zD9<{(`m5GYcu`}g>N+WNCjh*4qv`XAg`=!a3XZo-iNz{o$SGRXRBgCpK*_Ok+WR<{ zsmgk=Eb_^#%oU4XuYT)qKOfpDIDY87M9G(Sqo5Xs{YY>=^rwY&D&P6zVZ8VcL-?a- z+huenw~kkJ;&ZMB1_rVkUO27Q(e=Go&t_-Usiu+eCb61?Pbjz@ceZ@Zf^Ni05j$p4 zsj296dbfZVo&E6H>GYY5^u$!tasu6+oci&=>I6klipi(UX=kWd)3Y*peHiC3Qcf3o ztDyD{PF`N4M^f@zBcTeXujf~ou3FbULRmJ@LeZHtX!^`PZu3D?AGq7rbyP>??;m4ba@ zBN_+rYV~4cKFZ0JhWZ8V5uVtbF_5mf*!X_w^;v}B_UOaIjG$UwTM#Y)?#|%)D=2wk z)jc+{1SB+5E*6g6pZXk2l-9GT7ptp_5f%u}Rg(hRA3}eE`9B4zoY9i5Qw+4Bjm?Q( z#ufq>yvc#JIuN>d>H(`Z4iq3yUdCF(%}Zb}N6&sdo0!*-r~#W6peL9hW>)>P-VK}) z8lbdpJ_|Af_1Tdea2Xa-g;{ISi6%sYAWGbw!L(kB+Vn7wm*J)&X=!0Nm+8`B1PNS- zg9Ux)TuJf4CyZLUOYeWR{w3qV`>ECbd1Z%69yP&sP^Eh->iJsO+Dv^h*%+tq!G(no zCj4DfpvkPR=Qz7@V&(j@ngb;_-MS3k#Y<{;DRAA&Z$0BfWLiH21HTmt#)m=QE%WC@ zyuNN!iR{_|sHyJa`*~seZ^P6zE3TrPrztg<{-v9<4^i<*I3DYVaJdO_8;{H| z!Oec!PyLsA7;~9H_W|n6^V>69oP51>2=J&N3IufNHN(_-`;#7~KfQYv^S{Z()4gTb zpQN@67*&ZPDm&c9w7yw@>Vd~~%W zLHjN9{<9Dw(;pwfLb}TkP!?n4O+k%jQKwV)4(6PQS_3t}dXSL)GQEPgAw{8|5wr_} zuk?8Qc}_!~5n2g~B-Bvr1GjFTgLR2Pqfw;f1`%qT29BPc_&l|W@g3;lTx*UQQt4d% z%0FQyCaPRPf50j~1Sk)#8+q1%Im&8Ci4CD)KGdry(euzBTk(=VK$ z&{JBh9otgW%U(S~WTwXmbNnXVo3G1~j+9IvxL|>%eH22v<~lX8!kx&%dH?rVBu>zu zgtarw#i>Ml`t8uSj@k*ONbSEKLVbUPZ(t);i0n!slcJRJ?$774?}W8^d3IR7M2>V**ad?gXcHZLVx3xU}Kp29;4~pYOO+w+}mR0KR0dgYcku# z6Pb?j1$kpO$*l(~00!db)wV$5E%TLAh*C&x#^1!R@x#Gjt`qF3KiIfry%%?+MVCPm zdw={fF8`tM>!Tckd%X%(Z-!pn-y=j0@Rn}z$o4Y-o)^A`$A8F^qdG6vgU9dR*O2gJ zAb(vKl^=5e?R79x7qC-MA?!ENBs_)>eE%>o+~7b2z?&dANd`h3unM2Vd<23`*DE#& z|7H>pc32HJ1phPALlkKH_?9#g1=?E<{z-z&nIPD2K20kF@ufO-Ew}tj3?33c{Civo nwZ;p_LO#;d9#+494Z-&?LcY9ET)5Xa2>hvD(Y&0iWFGK;B8u)3 diff --git a/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/ByteCursor.kt b/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/ByteCursor.kt deleted file mode 100644 index 1c6b03061..000000000 --- a/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/ByteCursor.kt +++ /dev/null @@ -1,93 +0,0 @@ -package eu.kanade.tachiyomi.extension.all.hitomi - -import java.nio.ByteBuffer - -/** - * Simple cursor for use on byte arrays - * @author nulldev - */ -class ByteCursor(val content: ByteArray) { - var index = -1 - private set - private var mark = -1 - - fun mark() { - mark = index - } - - fun jumpToMark() { - index = mark - } - - fun jumpToIndex(index: Int) { - this.index = index - } - - fun next(): Byte { - return content[++index] - } - - fun next(count: Int): ByteArray { - val res = content.sliceArray(index + 1..index + count) - skip(count) - return res - } - - // Used to perform conversions - private fun byteBuffer(count: Int): ByteBuffer { - return ByteBuffer.wrap(next(count)) - } - - // Epic hack to get an unsigned short properly... - fun fakeNextShortInt(): Int = ByteBuffer - .wrap(arrayOf(0x00, 0x00, *next(2).toTypedArray()).toByteArray()) - .getInt(0) - - // fun nextShort(): Short = byteBuffer(2).getShort(0) - fun nextInt(): Int = byteBuffer(4).getInt(0) - fun nextLong(): Long = byteBuffer(8).getLong(0) - fun nextFloat(): Float = byteBuffer(4).getFloat(0) - fun nextDouble(): Double = byteBuffer(8).getDouble(0) - - fun skip(count: Int) { - index += count - } - - fun expect(vararg bytes: Byte) { - if (bytes.size > remaining()) { - throw IllegalStateException("Unexpected end of content!") - } - - for (i in 0..bytes.lastIndex) { - val expected = bytes[i] - val actual = content[index + i + 1] - - if (expected != actual) { - throw IllegalStateException("Unexpected content (expected: $expected, actual: $actual)!") - } - } - - index += bytes.size - } - - fun checkEqual(vararg bytes: Byte): Boolean { - if (bytes.size > remaining()) { - return false - } - - for (i in 0..bytes.lastIndex) { - val expected = bytes[i] - val actual = content[index + i + 1] - - if (expected != actual) { - return false - } - } - - return true - } - - fun atEnd() = index >= content.size - 1 - - fun remaining() = content.size - index - 1 -} diff --git a/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/Hitomi.kt b/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/Hitomi.kt deleted file mode 100644 index 2d6954d37..000000000 --- a/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/Hitomi.kt +++ /dev/null @@ -1,504 +0,0 @@ -package eu.kanade.tachiyomi.extension.all.hitomi - -import android.app.Application -import android.content.SharedPreferences -import com.squareup.duktape.Duktape -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.network.asObservableSuccess -import eu.kanade.tachiyomi.source.ConfigurableSource -import eu.kanade.tachiyomi.source.model.Filter -import eu.kanade.tachiyomi.source.model.FilterList -import eu.kanade.tachiyomi.source.model.MangasPage -import eu.kanade.tachiyomi.source.model.Page -import eu.kanade.tachiyomi.source.model.SChapter -import eu.kanade.tachiyomi.source.model.SManga -import eu.kanade.tachiyomi.source.online.HttpSource -import eu.kanade.tachiyomi.util.asJsoup -import kotlinx.serialization.decodeFromString -import kotlinx.serialization.json.Json -import okhttp3.Request -import okhttp3.Response -import rx.Observable -import rx.Single -import rx.schedulers.Schedulers -import uy.kohesive.injekt.Injekt -import uy.kohesive.injekt.api.get -import uy.kohesive.injekt.injectLazy -import java.net.URLEncoder -import java.util.Locale -import androidx.preference.CheckBoxPreference as AndroidXCheckBoxPreference -import androidx.preference.PreferenceScreen as AndroidXPreferenceScreen - -/** - * Ported from TachiyomiSy - * Original work by NerdNumber9 for TachiyomiEH - */ - -open class Hitomi(override val lang: String, private val nozomiLang: String) : HttpSource(), ConfigurableSource { - - override val supportsLatest = true - - override val name = if (nozomiLang == "all") "Hitomi.la unfiltered" else "Hitomi.la" - - override val id by lazy { if (lang == "all") 2703068117101782422 else super.id } - - override val baseUrl = BASE_URL - - private val json: Json by injectLazy() - - private var gg: String? = null - - // Popular - - override fun fetchPopularManga(page: Int): Observable { - return client.newCall(popularMangaRequest(page)) - .asObservableSuccess() - .flatMap { responseToMangas(it) } - } - - override fun popularMangaRequest(page: Int) = HitomiNozomi.rangedGet( - "$LTN_BASE_URL/popular-$nozomiLang.nozomi", - 100L * (page - 1), - 99L + 100 * (page - 1) - ) - - private fun responseToMangas(response: Response): Observable { - val range = response.header("Content-Range")!! - val total = range.substringAfter('/').toLong() - val end = range.substringBefore('/').substringAfter('-').toLong() - val body = response.body!! - return parseNozomiPage(body.bytes()) - .map { - MangasPage(it, end < total - 1) - } - } - - private fun parseNozomiPage(array: ByteArray): Observable> { - val cursor = ByteCursor(array) - val ids = (1..array.size / 4).map { - cursor.nextInt() - } - - return nozomiIdsToMangas(ids).toObservable() - } - - private fun nozomiIdsToMangas(ids: List): Single> { - return Single.zip( - ids.map { int -> - client.newCall(GET("$LTN_BASE_URL/galleryblock/$int.html")) - .asObservableSuccess() - .subscribeOn(Schedulers.io()) // Perform all these requests in parallel - .map { parseGalleryBlock(it) } - .toSingle() - } - ) { it.map { m -> m as SManga } } - } - - private fun parseGalleryBlock(response: Response): SManga { - val doc = response.asJsoup() - return SManga.create().apply { - val titleElement = doc.selectFirst("h1") - title = titleElement.text() - thumbnail_url = "https:" + if (useHqThumbPref()) { - doc.selectFirst("img").attr("srcset").substringBefore(' ') - } else { - doc.selectFirst("img").attr("src") - } - url = titleElement.child(0).attr("href") - } - } - - override fun popularMangaParse(response: Response) = throw UnsupportedOperationException("Not used") - - // Latest - - override fun fetchLatestUpdates(page: Int): Observable { - return client.newCall(latestUpdatesRequest(page)) - .asObservableSuccess() - .flatMap { responseToMangas(it) } - } - - override fun latestUpdatesRequest(page: Int) = HitomiNozomi.rangedGet( - "$LTN_BASE_URL/index-$nozomiLang.nozomi", - 100L * (page - 1), - 99L + 100 * (page - 1) - ) - - override fun latestUpdatesParse(response: Response) = throw UnsupportedOperationException("Not used") - - // Search - - private var cachedTagIndexVersion: Long? = null - private var tagIndexVersionCacheTime: Long = 0 - private fun tagIndexVersion(): Single { - val sCachedTagIndexVersion = cachedTagIndexVersion - return if (sCachedTagIndexVersion == null || - tagIndexVersionCacheTime + INDEX_VERSION_CACHE_TIME_MS < System.currentTimeMillis() - ) { - HitomiNozomi.getIndexVersion(client, "tagindex").subscribeOn(Schedulers.io()).doOnNext { - cachedTagIndexVersion = it - tagIndexVersionCacheTime = System.currentTimeMillis() - }.toSingle() - } else { - Single.just(sCachedTagIndexVersion) - } - } - - private var cachedGalleryIndexVersion: Long? = null - private var galleryIndexVersionCacheTime: Long = 0 - private fun galleryIndexVersion(): Single { - val sCachedGalleryIndexVersion = cachedGalleryIndexVersion - return if (sCachedGalleryIndexVersion == null || - galleryIndexVersionCacheTime + INDEX_VERSION_CACHE_TIME_MS < System.currentTimeMillis() - ) { - HitomiNozomi.getIndexVersion(client, "galleriesindex").subscribeOn(Schedulers.io()).doOnNext { - cachedGalleryIndexVersion = it - galleryIndexVersionCacheTime = System.currentTimeMillis() - }.toSingle() - } else { - Single.just(sCachedGalleryIndexVersion) - } - } - - override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { - return if (query.startsWith(PREFIX_ID_SEARCH)) { - val id = NOZOMI_ID_PATTERN.find(query.removePrefix(PREFIX_ID_SEARCH))!!.value.toInt() - nozomiIdsToMangas(listOf(id)).map { mangas -> - MangasPage(mangas, false) - }.toObservable() - } else { - if (query.isBlank()) { - val area = filters.filterIsInstance() - .joinToString("") { - (it as UriPartFilter).toUriPart() - } - val keyword = filters.filterIsInstance().toString() - .replace("[", "").replace("]", "") - val popular = filters.filterIsInstance() - .joinToString("") { - (it as UriPartFilter).toUriPart() - } == "true" - - // TODO Cache the results coming out of HitomiNozomi (this TODO dates back to TachiyomiEH) - val hn = Single.zip(tagIndexVersion(), galleryIndexVersion()) { tv, gv -> tv to gv } - .map { HitomiNozomi(client, it.first, it.second) } - val base = hn.flatMap { n -> - n.getGalleryIdsForQuery("$area:${URLEncoder.encode(keyword, "utf-8")}", nozomiLang, popular).map { n to it.toSet() } - } - base.flatMap { (_, ids) -> - val chunks = ids.chunked(PAGE_SIZE) - - nozomiIdsToMangas(chunks[page - 1]).map { mangas -> - MangasPage(mangas, page < chunks.size) - } - }.toObservable() - } else { - val splitQuery = query.toLowerCase(Locale.ENGLISH).split(" ") - - val positive = splitQuery.filter { - COMMON_WORDS.any { word -> - it !== word - } && !it.startsWith('-') - }.toMutableList() - if (nozomiLang != "all") positive += "language:$nozomiLang" - val negative = (splitQuery - positive).map { it.removePrefix("-") } - - // TODO Cache the results coming out of HitomiNozomi (this TODO dates back to TachiyomiEH) - val hn = Single.zip(tagIndexVersion(), galleryIndexVersion()) { tv, gv -> tv to gv } - .map { HitomiNozomi(client, it.first, it.second) } - - var base = if (positive.isEmpty()) { - hn.flatMap { n -> - n.getGalleryIdsFromNozomi(null, "index", "all", false) - .map { n to it.toSet() } - } - } else { - val q = positive.removeAt(0) - hn.flatMap { n -> n.getGalleryIdsForQuery(q, nozomiLang, false).map { n to it.toSet() } } - } - - base = positive.fold(base) { acc, q -> - acc.flatMap { (nozomi, mangas) -> - nozomi.getGalleryIdsForQuery(q, nozomiLang, false).map { - nozomi to mangas.intersect(it) - } - } - } - - base = negative.fold(base) { acc, q -> - acc.flatMap { (nozomi, mangas) -> - nozomi.getGalleryIdsForQuery(q, nozomiLang, false).map { - nozomi to (mangas - it) - } - } - } - - base.flatMap { (_, ids) -> - val chunks = ids.chunked(PAGE_SIZE) - - nozomiIdsToMangas(chunks[page - 1]).map { mangas -> - MangasPage(mangas, page < chunks.size) - } - }.toObservable() - } - } - } - - override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = throw UnsupportedOperationException("Not used") - override fun searchMangaParse(response: Response) = throw UnsupportedOperationException("Not used") - - // Filter - - override fun getFilterList() = FilterList( - Filter.Header(Filter_SEARCH_MESSAGE), - Filter.Separator(), - SortFilter(), - TypeFilter(), - Text("Keyword") - ) - - private class TypeFilter : UriPartFilter( - "category", - Array(FILTER_CATEGORIES.size) { i -> - val category = FILTER_CATEGORIES[i] - Pair(category, category) - } - ) - - private class SortFilter : UriPartFilter( - "Ordered by", - arrayOf( - Pair("Date Added", "false"), - Pair("Popularity", "true") - ) - ) - - private open class UriPartFilter( - displayName: String, - val pair: Array>, - defaultState: Int = 0 - ) : Filter.Select(displayName, pair.map { it.first }.toTypedArray(), defaultState) { - open fun toUriPart() = pair[state].second - } - - private class Text(name: String) : Filter.Text(name) { - override fun toString(): String { - return state - } - } - - // Details - - override fun mangaDetailsParse(response: Response): SManga { - val document = response.asJsoup() - fun String.replaceSpaces() = this.replace(" ", "_") - - return SManga.create().apply { - title = document.select("div.gallery h1 a").joinToString { it.text() } - thumbnail_url = document.select("div.cover img").attr("abs:src") - author = document.select("div.gallery h2 a").joinToString { it.text() } - val tableInfo = document.select("table tr") - .map { tr -> - val key = tr.select("td:first-child").text() - val value = with(tr.select("td:last-child a")) { - when (key) { - "Series", "Characters" -> { - if (text().isNotEmpty()) - joinToString { "${attr("href").removePrefix("/").substringBefore("/")}:${it.text().replaceSpaces()}" } else null - } - "Tags" -> joinToString { element -> - element.text().let { - when { - it.contains("♀") -> "female:${it.substringBeforeLast(" ").replaceSpaces()}" - it.contains("♂") -> "male:${it.substringBeforeLast(" ").replaceSpaces()}" - else -> it - } - } - } - else -> joinToString { it.text() } - } - } - Pair(key, value) - } - .plus(Pair("Date uploaded", document.select("div.gallery span.date").text())) - .toMap() - description = tableInfo.filterNot { it.value.isNullOrEmpty() || it.key in listOf("Series", "Characters", "Tags") }.entries.joinToString("\n") { "${it.key}: ${it.value}" } - genre = listOfNotNull(tableInfo["Series"], tableInfo["Characters"], tableInfo["Tags"]).joinToString() - } - } - - // Chapters - - override fun fetchChapterList(manga: SManga): Observable> { - return Observable.just( - listOf( - SChapter.create().apply { - url = manga.url - name = "Chapter" - chapter_number = 0.0f - } - ) - ) - } - - override fun chapterListParse(response: Response) = throw UnsupportedOperationException("Not used") - - // Pages - - private fun hlIdFromUrl(url: String) = - url.split('/').last().split('-').last().substringBeforeLast('.') - - override fun pageListRequest(chapter: SChapter): Request { - return GET("$LTN_BASE_URL/galleries/${hlIdFromUrl(chapter.url)}.js") - } - - override fun pageListParse(response: Response): List { - if (gg.isNullOrEmpty()) { - val response = client.newCall(GET("$LTN_BASE_URL/gg.js")).execute() - gg = response.body!!.string() - } - val duktape = Duktape.create() - duktape.evaluate(gg) - - val str = response.body!!.string() - val json = json.decodeFromString(str.removePrefix("var galleryinfo = ")) - val pages = json.files.mapIndexed { i, jsonElement -> - // https://ltn.hitomi.la/reader.js - // function make_image_element() - val hash = jsonElement.hash - var ext = jsonElement.name.split('.').last() - var path = "images" - var secondSubdomain = "b" - if (hitomiAlwaysWebp() && jsonElement.haswebp == 1) { - path = "webp" - ext = "webp" - secondSubdomain = "a" - } - if (hitomiAlwaysAvif() && jsonElement.hasavif == 1) { - path = "avif" - ext = "avif" - secondSubdomain = "a" - } - - val b = duktape.evaluate("gg.b;") as String - val s = duktape.evaluate("gg.s(\"$hash\");") as String - val m = duktape.evaluate("gg.m($s).toString();") as String - - var firstSubdomain = "a" - if (m == "1") { - firstSubdomain = "b" - } - - Page(i, "", "https://$firstSubdomain$secondSubdomain.hitomi.la/$path/$b$s/$hash.$ext") - } - duktape.close() - return pages - } - - override fun imageRequest(page: Page): Request { - val request = super.imageRequest(page) - val hlId = request.url.pathSegments.let { - it[it.lastIndex - 1] - } - return request.newBuilder() - .header("Referer", "$BASE_URL/reader/$hlId.html") - .build() - } - - override fun imageUrlParse(response: Response) = throw UnsupportedOperationException("Not used") - - companion object { - private const val INDEX_VERSION_CACHE_TIME_MS = 1000 * 60 * 10 - private const val PAGE_SIZE = 25 - - const val PREFIX_ID_SEARCH = "id:" - val NOZOMI_ID_PATTERN = "[0-9]*(?=.html)".toRegex() - val HEXADECIMAL = "0[xX][0-9a-fA-F]+".toRegex() - - // Common English words and Japanese particles - private val COMMON_WORDS = listOf( - "a", "be", "boy", "de", "girl", "ga", "i", "is", "ka", "na", - "ni", "ne", "no", "suru", "to", "wa", "wo", "yo", - "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" - ) - - // From HitomiSearchMetaData - const val LTN_BASE_URL = "https://ltn.hitomi.la" - const val BASE_URL = "https://hitomi.la" - - // Filter - private val FILTER_CATEGORIES = listOf( - "tag", "male", "female", "type", - "artist", "series", "character", "group" - ) - private const val Filter_SEARCH_MESSAGE = "NOTE: Ignored if using text search!" - - // Preferences - private const val WEBP_PREF_KEY = "HITOMI_WEBP" - private const val WEBP_PREF_TITLE = "Webp pages" - private const val WEBP_PREF_SUMMARY = "Download webp pages instead of jpeg (when available)" - private const val WEBP_PREF_DEFAULT_VALUE = true - - private const val AVIF_PREF_KEY = "HITOMI_AVIF" - private const val AVIF_PREF_TITLE = "Avif pages" - private const val AVIF_PREF_SUMMARY = "Download avif pages instead of jpeg or webp (when available)" - private const val AVIF_PREF_DEFAULT_VALUE = true - - private const val COVER_PREF_KEY = "HITOMI_COVERS" - private const val COVER_PREF_TITLE = "Use HQ covers" - private const val COVER_PREF_SUMMARY = "See HQ covers while browsing" - private const val COVER_PREF_DEFAULT_VALUE = true - } - - // Preferences - - private val preferences: SharedPreferences by lazy { - Injekt.get().getSharedPreferences("source_$id", 0x0000) - } - - override fun setupPreferenceScreen(screen: AndroidXPreferenceScreen) { - val webpPref = AndroidXCheckBoxPreference(screen.context).apply { - key = "${WEBP_PREF_KEY}_$lang" - title = WEBP_PREF_TITLE - summary = WEBP_PREF_SUMMARY - setDefaultValue(WEBP_PREF_DEFAULT_VALUE) - - setOnPreferenceChangeListener { _, newValue -> - val checkValue = newValue as Boolean - preferences.edit().putBoolean("${WEBP_PREF_KEY}_$lang", checkValue).commit() - } - } - - val avifPref = AndroidXCheckBoxPreference(screen.context).apply { - key = "${AVIF_PREF_KEY}_$lang" - title = AVIF_PREF_TITLE - summary = AVIF_PREF_SUMMARY - setDefaultValue(AVIF_PREF_DEFAULT_VALUE) - - setOnPreferenceChangeListener { _, newValue -> - val checkValue = newValue as Boolean - preferences.edit().putBoolean("${AVIF_PREF_KEY}_$lang", checkValue).commit() - } - } - - val coverPref = AndroidXCheckBoxPreference(screen.context).apply { - key = "${COVER_PREF_KEY}_$lang" - title = COVER_PREF_TITLE - summary = COVER_PREF_SUMMARY - setDefaultValue(COVER_PREF_DEFAULT_VALUE) - - setOnPreferenceChangeListener { _, newValue -> - val checkValue = newValue as Boolean - preferences.edit().putBoolean("${COVER_PREF_KEY}_$lang", checkValue).commit() - } - } - - screen.addPreference(webpPref) - screen.addPreference(avifPref) - screen.addPreference(coverPref) - } - - private fun hitomiAlwaysWebp(): Boolean = preferences.getBoolean("${WEBP_PREF_KEY}_$lang", WEBP_PREF_DEFAULT_VALUE) - private fun hitomiAlwaysAvif(): Boolean = preferences.getBoolean("${AVIF_PREF_KEY}_$lang", AVIF_PREF_DEFAULT_VALUE) - private fun useHqThumbPref(): Boolean = preferences.getBoolean("${COVER_PREF_KEY}_$lang", COVER_PREF_DEFAULT_VALUE) -} diff --git a/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/HitomiActivity.kt b/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/HitomiActivity.kt deleted file mode 100644 index 324595d34..000000000 --- a/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/HitomiActivity.kt +++ /dev/null @@ -1,38 +0,0 @@ -package eu.kanade.tachiyomi.extension.all.hitomi - -import android.app.Activity -import android.content.ActivityNotFoundException -import android.content.Intent -import android.os.Bundle -import android.util.Log -import kotlin.system.exitProcess - -/** - * Springboard that accepts https://hitomi.la/cg/xxxx intents - * and redirects them to the main Tachiyomi process. - */ -class HitomiActivity : Activity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - val pathSegments = intent?.data?.pathSegments - if (pathSegments != null && pathSegments.size > 1) { - val id = pathSegments[1] - val mainIntent = Intent().apply { - action = "eu.kanade.tachiyomi.SEARCH" - putExtra("query", "${Hitomi.PREFIX_ID_SEARCH}$id") - putExtra("filter", packageName) - } - - try { - startActivity(mainIntent) - } catch (e: ActivityNotFoundException) { - Log.e("HitomiActivity", e.toString()) - } - } else { - Log.e("HitomiActivity", "Could not parse URI from intent $intent") - } - - finish() - exitProcess(0) - } -} diff --git a/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/HitomiDto.kt b/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/HitomiDto.kt deleted file mode 100644 index a38e49982..000000000 --- a/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/HitomiDto.kt +++ /dev/null @@ -1,16 +0,0 @@ -package eu.kanade.tachiyomi.extension.all.hitomi - -import kotlinx.serialization.Serializable - -@Serializable -data class HitomiChapterDto( - val files: List = emptyList(), -) - -@Serializable -data class HitomiFileDto( - val name: String, - val hasavif: Int, - val hash: String, - val haswebp: Int, -) diff --git a/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/HitomiFactory.kt b/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/HitomiFactory.kt deleted file mode 100644 index 3978ca8d5..000000000 --- a/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/HitomiFactory.kt +++ /dev/null @@ -1,50 +0,0 @@ -package eu.kanade.tachiyomi.extension.all.hitomi - -import eu.kanade.tachiyomi.source.Source -import eu.kanade.tachiyomi.source.SourceFactory - -class HitomiFactory : SourceFactory { - override fun createSources(): List = languageList - .map { Hitomi(it.first, it.second) } -} - -private val languageList = listOf( - Pair("all", "all"), // all languages - Pair("id", "indonesian"), - Pair("ca", "catalan"), - Pair("ceb", "cebuano"), - Pair("cs", "czech"), - Pair("da", "danish"), - Pair("de", "german"), - Pair("et", "estonian"), - Pair("en", "english"), - Pair("es", "spanish"), - Pair("eo", "esperanto"), - Pair("fr", "french"), - Pair("it", "italian"), - Pair("la", "latin"), - Pair("hu", "hungarian"), - Pair("nl", "dutch"), - Pair("no", "norwegian"), - Pair("pl", "polish"), - Pair("pt-BR", "portuguese"), - Pair("ro", "romanian"), - Pair("sq", "albanian"), - Pair("sk", "slovak"), - Pair("fi", "finnish"), - Pair("sv", "swedish"), - Pair("tl", "tagalog"), - Pair("vi", "vietnamese"), - Pair("tr", "turkish"), - Pair("el", "greek"), - Pair("mn", "mongolian"), - Pair("ru", "russian"), - Pair("uk", "ukrainian"), - Pair("he", "hebrew"), - Pair("ar", "arabic"), - Pair("fa", "persian"), - Pair("th", "thai"), - Pair("ko", "korean"), - Pair("zh", "chinese"), - Pair("ja", "japanese") -) diff --git a/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/HitomiNozomi.kt b/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/HitomiNozomi.kt deleted file mode 100644 index 9ec7d1c62..000000000 --- a/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/HitomiNozomi.kt +++ /dev/null @@ -1,257 +0,0 @@ -package eu.kanade.tachiyomi.extension.all.hitomi - -import eu.kanade.tachiyomi.extension.all.hitomi.Hitomi.Companion.LTN_BASE_URL -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.network.asObservable -import eu.kanade.tachiyomi.network.asObservableSuccess -import okhttp3.Headers -import okhttp3.OkHttpClient -import okhttp3.Request -import rx.Observable -import rx.Single -import java.security.MessageDigest - -private typealias HashedTerm = ByteArray - -private data class DataPair(val offset: Long, val length: Int) -private data class Node( - val keys: List, - val datas: List, - val subnodeAddresses: List -) - -/** - * Kotlin port of the hitomi.la search algorithm - * @author NerdNumber9 - */ -class HitomiNozomi( - private val client: OkHttpClient, - private val tagIndexVersion: Long, - private val galleriesIndexVersion: Long -) { - fun getGalleryIdsForQuery(query: String, language: String, popular: Boolean): Single> { - if (':' in query) { - val sides = query.split(':') - val namespace = sides[0] - var tag = sides[1] - - var area: String? = namespace - if (namespace == "female" || namespace == "male") { - area = "tag" - tag = query - } else if (namespace == "language") { - return getGalleryIdsFromNozomi(null, "index", tag, popular) - } - - return getGalleryIdsFromNozomi(area, tag, language, popular) - } - - val key = hashTerm(query) - val field = "galleries" - - return getNodeAtAddress(field, 0).flatMap { node -> - if (node == null) { - Single.just(null) - } else { - BSearch(field, key, node).flatMap { data -> - if (data == null) { - Single.just(null) - } else { - getGalleryIdsFromData(data) - } - } - } - } - } - - private fun getGalleryIdsFromData(data: DataPair?): Single> { - if (data == null) { - return Single.just(emptyList()) - } - - val url = "$LTN_BASE_URL/$GALLERIES_INDEX_DIR/galleries.$galleriesIndexVersion.data" - val (offset, length) = data - if (length > 100000000 || length <= 0) { - return Single.just(emptyList()) - } - - return client.newCall(rangedGet(url, offset, offset + length - 1)) - .asObservable() - .map { - it.body?.bytes() ?: ByteArray(0) - } - .onErrorReturn { ByteArray(0) } - .map { inbuf -> - if (inbuf.isEmpty()) { - return@map emptyList() - } - - val view = ByteCursor(inbuf) - val numberOfGalleryIds = view.nextInt() - - val expectedLength = numberOfGalleryIds * 4 + 4 - - if (numberOfGalleryIds > 10000000 || - numberOfGalleryIds <= 0 || - inbuf.size != expectedLength - ) { - return@map emptyList() - } - - (1..numberOfGalleryIds).map { - view.nextInt() - } - }.toSingle() - } - - @Suppress("FunctionName") - private fun BSearch(field: String, key: ByteArray, node: Node?): Single { - fun compareByteArrays(dv1: ByteArray, dv2: ByteArray): Int { - val top = dv1.size.coerceAtMost(dv2.size) - for (i in 0 until top) { - val dv1i = dv1[i].toInt() and 0xFF - val dv2i = dv2[i].toInt() and 0xFF - if (dv1i < dv2i) { - return -1 - } else if (dv1i > dv2i) { - return 1 - } - } - return 0 - } - - fun locateKey(key: ByteArray, node: Node): Pair { - var cmpResult = -1 - var lastI = 0 - for (nodeKey in node.keys) { - cmpResult = compareByteArrays(key, nodeKey) - if (cmpResult <= 0) break - lastI++ - } - return (cmpResult == 0) to lastI - } - - fun isLeaf(node: Node): Boolean { - return !node.subnodeAddresses.any { - it != 0L - } - } - - if (node == null || node.keys.isEmpty()) { - return Single.just(null) - } - - val (there, where) = locateKey(key, node) - if (there) { - return Single.just(node.datas[where]) - } else if (isLeaf(node)) { - return Single.just(null) - } - - return getNodeAtAddress(field, node.subnodeAddresses[where]).flatMap { newNode -> - BSearch(field, key, newNode) - } - } - - private fun decodeNode(data: ByteArray): Node { - val view = ByteCursor(data) - - val numberOfKeys = view.nextInt() - - val keys = (1..numberOfKeys).map { - val keySize = view.nextInt() - view.next(keySize) - } - - val numberOfDatas = view.nextInt() - val datas = (1..numberOfDatas).map { - val offset = view.nextLong() - val length = view.nextInt() - DataPair(offset, length) - } - - val numberOfSubnodeAddresses = B + 1 - val subnodeAddresses = (1..numberOfSubnodeAddresses).map { - view.nextLong() - } - - return Node(keys, datas, subnodeAddresses) - } - - private fun getNodeAtAddress(field: String, address: Long): Single { - var url = "$LTN_BASE_URL/$INDEX_DIR/$field.$tagIndexVersion.index" - if (field == "galleries") { - url = "$LTN_BASE_URL/$GALLERIES_INDEX_DIR/galleries.$galleriesIndexVersion.index" - } - - return client.newCall(rangedGet(url, address, address + MAX_NODE_SIZE - 1)) - .asObservableSuccess() - .map { - it.body?.bytes() ?: ByteArray(0) - } - .onErrorReturn { ByteArray(0) } - .map { nodedata -> - if (nodedata.isNotEmpty()) { - decodeNode(nodedata) - } else null - }.toSingle() - } - - fun getGalleryIdsFromNozomi(area: String?, tag: String, language: String, popular: Boolean): Single> { - val replacedTag = tag.replace('_', ' ') - var nozomiAddress = "$LTN_BASE_URL/$COMPRESSED_NOZOMI_PREFIX/$replacedTag-$language$NOZOMI_EXTENSION" - if (area != null) { - nozomiAddress = if (popular) { - "$LTN_BASE_URL/$COMPRESSED_NOZOMI_PREFIX/$area/popular/$replacedTag-$language$NOZOMI_EXTENSION" - } else { - "$LTN_BASE_URL/$COMPRESSED_NOZOMI_PREFIX/$area/$replacedTag-$language$NOZOMI_EXTENSION" - } - } - - return client.newCall( - Request.Builder() - .url(nozomiAddress) - .build() - ) - .asObservableSuccess() - .map { resp -> - val body = resp.body!!.bytes() - val cursor = ByteCursor(body) - (1..body.size / 4).map { - cursor.nextInt() - } - }.toSingle() - } - - private fun hashTerm(query: String): HashedTerm { - val md = MessageDigest.getInstance("SHA-256") - md.update(query.toByteArray(HASH_CHARSET)) - return md.digest().copyOf(4) - } - - companion object { - private const val INDEX_DIR = "tagindex" - private const val GALLERIES_INDEX_DIR = "galleriesindex" - private const val COMPRESSED_NOZOMI_PREFIX = "n" - private const val NOZOMI_EXTENSION = ".nozomi" - private const val MAX_NODE_SIZE = 464 - private const val B = 16 - - private val HASH_CHARSET = Charsets.UTF_8 - - fun rangedGet(url: String, rangeBegin: Long, rangeEnd: Long?): Request { - return GET( - url, - Headers.Builder() - .add("Range", "bytes=$rangeBegin-${rangeEnd ?: ""}") - .build() - ) - } - - fun getIndexVersion(httpClient: OkHttpClient, name: String): Observable { - return httpClient.newCall(GET("$LTN_BASE_URL/$name/version?_=${System.currentTimeMillis()}")) - .asObservableSuccess() - .map { it.body!!.string().toLong() } - } - } -}