A(&-dPx{E5jRVs5-F7 zY8ogAZ!KYzmt!(bzO^w;3)sDy+kT#QTjbw%w5Kt3bh-jUT$i$By-x}~z00$
E-;^1z2-$q$a>7g4l zII7Y#hu*Q0FRRjQ8c^h%AgHFy4MK{1aYLrZo@sI21g%6y6P^T|9J}u6@H}el61bdp zG%`&V!9ka;7 zds7AN_GH9+?5+$;Vhc`n3(d;Te691Mxc5;xB9HWSUP~Srrq1SVX%Bwqb#hE&C{K%W zwOrDj^y)bZOE^LYJ4>wjN$W5cB!a;KJjZ#VkErf6M?NkBio)`5D0{a%)Oe$#qvjMD zq|bPtPVye5C;^0uD=lI=c;_;QK{6AByJJxhYmTx+GOIyBnAblOpYd#3dUZG5mp`qu z{lp@QGRNAJ|8KVk4lNA+xP7Eq?~I06YX6pnH5x>8`p3)Y(zDQbPZxnij{=3=!Myth z2uou~fIToA?e1aBki(Pasa1pdYVAYZJ>=OzQVUF@GXsXj*J43SLhBO5*4qzxJ!XvX zd>6(2#UA?V{_j=sFIJl+KO-GH3h~V)*;QEud7}jBO5QZMkB{*e?&vBc)Y8rPDw5lg znz?8SC*f%Doo@QZXRKsl7nIMf;RngT`cD5`-}m@#Rm |pw?f} zq;|*21nXbyT@X>`c=W6A`S`skVB!VkJyT@o%WkpWOU{=ARmw7+Can6O-76R>)SV%U znQGDk+ LZSJCIg0T4u>rSEr_C%?t?ht^Fn{ z2wZ=cOjNCCO30s^In3Ss6$84>?DrB9@5}e%1+xqMoUAc@r*vTq#U9Y^WFSe8tPIJV zFi??xZn!#!&RUGL>ZrF6mp`$NQ03LD=Wd?{Q`M{&?dJQD-@=J=#ouEakUoFF!Nl^b zsXOe5QGg?tW-bYbUFOuX+sMj^g7-CU;{Gv;n=jc};sapSw$Zl{J=fQiWcRbZb+`3j zS_T9AoKTFo->?L@wU}H0ylM*cP 6 `g9x#nO(Y%}giFJA$e7QrsHa>!bkZ z1B9=P!yH~|ImoBq!g3U<+V qiz9J3|nW zGC=T$2{g;@-4bR$5re^4<3JfVQoOcoGqp{G1Ev-@y(R|m`|rD6P4D^>GDD!CJbwHj zE2%rbSha6ZRXgr*bgI17lC1q43h_k(3yUpWT$X*?3}}h{5Wh9(bXrN-;$Dz3^C@u= zq4quL&;Fp62+WqI)HeP#WV`RTie}-K(Pf6D=mn+)rGjY2XFG6GMiCUm2oY0anVemF z`)AXg(azkEjo#(-ZtIVK?_Q{)qFJVO>*EJFaH_Tqh|~l5F7q ~B z<8;%i>`_jXQ~7s83*Xd=@dr?cGyGxaQ(jg3Us92#VxT1M4>+C`DPgnNVxFT*alc7b zEBc}?sp_-KPpu?Y7(8L@6&RO!*Swd9H*jX65%VyYQLBOEq#c19;1^$&{;Kl*BBz0s za-G->X8SD;WYCDV6Ju+W^}zTOF*l-A&ag7!nc}HS>jhQpoEqF)p*g-m0hSQGn^f-h z>tfi&W@i2D;1){IoH2@8-LSyIG6CY@P)8)|F zQ1;nt5I>dJ;OeoOFFt;)MNZ@n6N$ML{Wq?{JdzCTul!>FzK06Kl7OA^I2|GB*J!j! zJ>L}m5gkDhi=Dt&dHSEp@`)kke#BJeF(lo-?f18(3pZ>+@Okwm-XRI(@$pr;+zaX? zkH?$JWwe$c>8}(!59RZ=3ZZ4^Ci&j{pjfRN911QKOvpk-tyAC{$0UcZy1~i}VuD5h z)Jy$~7u{?Hb7I%Uup*3F$$EBeyXq5qW+@T*w| 4AniUEJkN;ml`)KAm@bh<=%r ELk=+oaE_ardNmzN%HIm6&Yi z%yRU^p7Kntha%>^6t%M`BE1*G`&*bofjk@ u~`NNQ|h5`v$-K( z#a!l4dPc*94lYr1X)I%-=I79C9&%3&YTsrSE|f!ra<9=ncCuqCR7>U3m?R%NSncqs zrwH}c&u8NlZLbyZ!EYC~@txj8)k1-a;5;_%YSt-5Q~p)2n6a7t7Vx=zO&sGlaOklC zS%*l%CWWf)6X;&}%i^9r%Y$TI5-Y)uzTe}W-;Y${*~G77T0R|DobonlXx*PcoC^fe z<3H_`7YeKgXcW#Ie#%`r9f>_5t@}(7f$G2%6aRgTS1Z}S)w0#ABAK1exk|2?^FHYx z0ExGga%L6RX^I^6Z%K6D7Vro$^N))dB`<6eBO@l}-Q=8rvd#mnOwHJ{#iJ*#R&vA# zDfjBN$H&2)2$ZV+BRF)f*D JS1?qJqZe!t} zoTvcYSbWZ%8bX%J7_7EmSXF-PMQu@JVd{ghNwCOp4mL}bpReVqj7R8YnD)o$JEVnf zuLAu}drvl!SEx?XX>ODgdVU#d8x;|)QJfzu*)5tH@0vF*@XrY|SylaGJ*BF@ZP{YK zMvlH{d%BIw7-s)z5Al4VbM@nRDz@cFOF@X}cNv^Cs9%m)`>j@ GB0I^$ju zTHrljQ^aQNN$S2qzHvgiY)btQ6WmZH64+09aR=AUtsq6_F#3pR9G!;Jhn3)tJ}KN4 z=ib$?uU)E#^lvo=HuRLnSB<|`XzsjLj&BTur&px!yvSO!er^3bwn2ailc@ (!T^Yu@ayW3x-4Y6k6p~_I8BnB3(drtC3iH8EWhpIlsHIm zoj@9|@0tiXW?UqoN9<2h@jP?NigTtJ$LAAn#qS^5!-9BgOz^n=#xS o-zUMJ15 !V^L)m zH?j;&D`U3gmWR{W15ZE;1dg(67wjoMiT%nAgnb2TXesvaJ{3`JSBpm58NQQ0l-;f- zzwFC8(a_a~!rdHvsWnm;W6zwlEBWS`u4Msq&W?x4Oa;#EMBn7})ch!$? _Z%!PYR!-F6=5i{DX-HzocB z?1L-uw&<8+345X*WAphlqbJ@Ga=~o8f%;dRPEsq_N7{mr6ru6^1Sr>XXy|fXU%0O7 z3WApkPgBb102p+D>Zf^5BR_0|_MFpFX=)3<>rqu-uCv0BA#hm4zZUE?KercY^}Dz< z&tw_ VW`Cf+Y+_-W&J={ + cDBw@vmGog@3F4(A7Fk{R`#>j%yBxk>FYv-Qe94H$0oz7B77+Uh=&tZNh6 zg)LXRT?}6cjDVOXNCpvtp^N&|vAVSEbu(dY&c2iRP*&D)vUza+T~j5iV!B*I^wm5l zGKsV$pVl IP_a?pHAzL!gatrkAx=bMNRR*JH!Qb(F-0?&xPuSeO+O)fUR{?Gz(4 zq=JLk-<(m7Y&ppKFyd>ac@H(teA<;p8t7rs7ny{idGU-pD`zU@sCy+N2P3I5=8BV7 zbQ+BgVdC{O!+8$@thCp{4xIlnu!oOw4;lXffW)B1_uy)YQmQW;qGbqMEw?Gz_h`ty ze1u_1X?KE7Rmb#%!Jax3>3m3MViq4EFVnE|?E#t}lHF&L59vzzd>_3nT>g_;bL}V8 zDaadMi|GApAo``gQKfH-KN2+Z1qPT(5ArgLzxSiknR=EDOArdU##(C>YK(%oVp6mG zQUW&Eti(g3tX~XA;>tW0_oENz7-L}QqCsZ>&A?o;SK)&yxGrqtuwLTp`ClA(|OATx6ST0b)kZ23NIjL0M_{ z^Cav^cjl&&?tbQrS1aG<%kNfZ+ON6;oNvzAza4zhWu{-oReuab-p=zBRoj8G){8Fc z$+Rhs9#NVFlMB=S03@DcA<*ZpSdEZlVp;1D3 T55v|`Ka3Cu2^L1Ej8XloI z_)6|VpE< )j*i2Be+RhzLf?xFG#MX Uh;4$1mST0NEXz9tFi8F>>~qO*7)hv_Q|;B;uJ02YzHY0aScaBiLgS z6MuOwoQMW)t@YRK6Rt&5H=;r#HL%~wEFD$$qnx14E#dD5H#sOWJu!{x7UzqfDl>&7 z^#B8p!JJa+pUbqanb%qug4w78Tc>RtX0JV($C26cSAhz1k^rDr=GUH8Iyp(kndOXu z@vgl01tFKVxPDa{)6Yh}scsNW?_~=76`qi*H>yn;a#jvupJoU{MN{cQK$MYhH`SIW z)53P(4h6#>m!s$izT5l@QyKt=oHlKbNnVy1KjWLv$f5W~iM^X5ckJ3m`kfT&m|9W+ z#~L!hP!pZXql5-IKm<+8i?W3+o$?03x<+C5B~R{eAQ}8CDN?mVLxJ0_yXr9xeH)Ys zJ87Zk)h0XHeu>M0N4#M@oj-8jfAm%H3F #WRcg&=aqs5{ga5yDoOE^UVA71l^ zCF3kMs5VFRAzgHZaV|>yi8x1Ao{(ybI2lYVL|SnX!Tg>rsz9FTgb`=eJn~?B _zRbV90|MB)(-;t3A3AT-qaSd7{y+R4~7l!e56R~jY~U_xLyOV z=9WnJ2O4_A(GhKZPbSl=W*>l4-m$%G;QI6xW5V}}tUT@`N+n{rCh{z6%GFfXYF-~} zPNIxpZfI{D^_WR#i-mQtR9C$Irx3b7i(Wi_tZWii$4)Ua&nP?23G#-6NIO0quPlOo zF*jvMh5T`S4;h}gy3i&8QqPbp&3;ie2@2dN Y?-20Wb}@`b zjfH;zrfZcHchL`0AfDy#(6GsbX=|JK^xB=D>y^q*GE)LhjGLI0UMeVWg&|Fnri}k4 zC!R%yX-4)Y>2 Zi}bzMOb)^`LkBPBC5L;cE*u-|KYlc;#8ga7`^xnR|t=zxBQ zKAd{=w`t}v-C;_B{-|y`3z(zbj@D`QpuW2B@Kk9k(l>|zL;v*Rmv8IOFH`2(wwrII z&7DkE^wWF2LpA9SH_QpECGl_X2@YMQ2{uQz$A?RoE|ZtdqtZnsc5?ySjPI4T|4vo? zv-@Kk9hGDi|Gf*n83ro}(wm^vAY+Ro?NDsS-DIAjoJ7vPm7A=}Hk1vbJ1)yb5&Y^} z7U3UC4apk38FR9zcC3$uh$$Mw(e8(0AH<2+6P(eO`i!r*86jTSR})InhJlWn1eFeV zYEE&R9Io_D5LOYcN-413g7u^@$W~(jZI+ixF&NV5y9a%-xu&$mjLcjaRl$);{Y YXuedk(fzM40*9cgvflm?UQ(}t040aR(e61qa!ZU8T5tQ71NSJI8$WO z pWpF&1Fq-r{X;;H$RMfZltC=(j3ek) z1a^}eC2p^n-|sIYJsvJDS?xA;z`i2qL2OwZ`GE|tz^>9Lxf0o7TcMCrj&rVuaJ>;d zy{!dW*1M83yY_F<*4y2P?YF@-XN08Y^fbj3@vdu&j*Y@C*L zDR+jB0YQ|!MCS{JNj*1kRAOFDD4md(VgQL@Y?Am!kFGdf{^kSlolxivq;pWBL9Q_` zed%8acna&T2b8snnK;n1(3;s} `ay-MisFdZt!OBMc@Q89!`D>J+d+O@yBO3KJsqxDMifb?Gh=UUF zdq*5!f?Pz=3XNVZ6`7yYCNH7f-4J*M^uo}$j9 T38&%72BNGnYp&X- zJ5(n7@ufrQkWN9vQNb8|lCa_@vQegf;L%68C}^>fD4ku!0gB&E?;EgeUnZp&buBst zWmfmTH})HQvbvjWN8hLDM!yblg+=~?^gL?MlnpHi%D!EmF9?550_kV=Z$b;mF1TSw zLfMDHBtiTZ*Vg%)!mTv*O)GeICe28fy;U0jKv-l{(jY-J7H)Lryj)FudRBE5V_#rf zzP4O>PI8in&TzI=5ieBjnv%jYmx+y8ka^ZnjE|l6_h(G&6nU;;nMd%?ie%}$#pr!g zn#QKNLFNv5S2vU`H{+ab!8hr>P{tdrLV4*S1$o@oM8~J^pp_e5w`YqB%N7UxJUT`x z%RJBf09Z=DGnRY+ZvLIe{bwEGAC-|!&yvkz65*QDMX1kD)ZDd+4`JPwk#8x8NO}2b z5Tx7^ClG0wv 7MLGIiq0CD8y=y(;ghjXOR>Y5ZGLG2 zhUZ#N{yp_04*#m>W|Z5FHDii;LLL)oQv_8%u8-Kpt3h3{Q~aar;@FQF_0)Vfq=>0j z=7cxf`v(@+WcgYVF6Fp)HU&
@iRi4c<}FV+`}_#(Xncmfi*#vx ztO?vE`Yl-Xi)?& Wnm?STB;Ag zia9?{>q|U+Wv(9WbNsAA^zL~UEXRX2*|zVNPyBDohc~%_$B79*qei>uhF6ppS@zZm z=1-)z#}rw`_kc3QqH2ex%EBH6MP{C#g8pws*CeKYVkW!i0F;paA-}JJ{Qls=D|OeW zKc{AP5>=2W@48&PQI-UlO7yYfYqCB5ap61=IAMklJE#;QInfxOehePy@Nv<5h-_uH z==}j=pCEqOeGSnA=+(W`c*h88Z4eJ!9pkBslAs(u(6{Bcj{e1#Bajd9?GxQdy_R?I zF8uklSM+wDdg1dof7k>JK~nvS!QxBXn`(l5A9^2ql{^&8IEL~Y28v<*QjN?P Ca%mbJ+bdNXN%k@b7Gwz0M=)r^|xn<&idp P#9yro)<_|>bC}(k{Ilne#F6R#2Z?`TuxY8HgmP-0gTBp%)ulh$o^S4 z Jhr-lDc& zlgegi7GONd2g8=~g88C5utn#MOpqG$668r;CwUSqWz~2Z0@XWB>sQ^wUkyplMqjPt zE4n6UEq(ujU6^wk{4VJV)q}IX!Rn2AFTV0axz_k{Ej-EDXxd5KzD~yY)yuqt6&O&b z2+?~}-p$(ivNZDyrQ1b>dj~eJi$xypG8^6=b}dh$1=c_0q SrfqkvIMJ|1$hmK_r1h~FT)+1Roe+p${EVM?t;D_&&M{=_qKZ8h6- zF8m)oUP@1YlVU5!6G^Cmv8Kl4LI =A*3zeZXjd!bG5Z>K)`+Xz$aiUJ?9=@Ku{1 zH(Qe(IA8~YUH+~;;98LPHsLkgaQ3So+WBlO*VJ7YbM>1A+WgW704*2MyP7I_L$K#6 zV$pTc>hr+%>2v<)QZQ;gX#$Z`sM8Wbr|3g{oalz*1*>*C&m%Iu=bA7%9ZXdB#q_Ji z@Y7)o R&E OUbuxEYy6z$YWd<~?sT5+9gRFB|z^3p;c-I6$;cNYM`W zc%B0sT83tRJJTqmt*`6x5^QG%a3PKecetPntZfd=@G(`4Q%;FzNdn8-!1%e~h)@fJ z5djnBWga+%aT&jw>Qzi&p8zkA>Y0FFETZ4v$hHfW{mUJh*5s)S9vLrg$pclf1k;|2 zgI9>&posiRVEs)D$p}eXWPTz9B8V!2^=imUtpWtEp^~=H&s({Lf|jHPkD`GLrhH8~ zJ!+VDeJ%?YT?r#tNDV=@Nv6|8EC@76@2kx?O$+)VLuP8G*DRubcq`JqZ=g|3qZIv= z&>Sa@5U61^C0mwgS#f=XwaG!WXto$bir{&6g9$&|Lc378eHl*(O&U1*MM33tfP A62&Z#+xH zt2~T{uP|*^RbJqP>m7gr+0yBR1Zc3=xIzCRbje; zsQN1^MPB?x`5EZp!5BO6ScKF@BG4clYD;Afb5UzRxNR@0(@`zz za3ACOa;ja#5asfBas)j{By^k;ppCBD^?F?k7;Yx8@< ^#G9)1G(z?(e>r JSK zRG-+grAQw^s{);oQE(d27y3Z5Jpuh4v?Xa8!Zru|C94rAVQxBc2}|5HGN0E;R!mJ~ z4|Fx;If8Z(nI3>_;T!5b>!NlLQ+p%WRWhs@*O%*1rEO|wr4avmg}nx{{&S_!6Lejg z?P258G@Of!>?4B{=3sNEa|SHzXS>=}M!83-5O1t54t{YT5a=PXnP1Cfr=uE^#{y5) zW)S)3G6B!J)uI~VcWeT|6miS>jS3j0V3ixXqDZ6Wc03z3P^qX*77RKPW-o_R ?xb=b z%f8qOebX=0aS$jy&ZQ*HRt{6t*=(3Db>wG(2}- Namdn6xd~Dl?mEDZG?&=gOoes3a!VdTj^JfCM=0)w`WOoJ zfsF6#+wfv?Wf%DPJ(q4;eN(P^a^n;+76X;lkPM|bZK=}K!{c$bhrUaYfhFu_x82U} zVTkJFsiBX`Bvq}+(c|5_8J+e`T8+I16dE&pftnEU!?CYnJ4}B!iVa{1Ntw%_Oz3Lk zvDnf$1b|o=oTAKg^5r7mc%!4sX%MR%7^x#$qhcjznZprN##5`7Hd3JKiQ*DZCah$_ z6bbGk5da03k|wO8!XcmArUrd?9x_HR>XdO|Ww7{2`H240Az3OPjls8)=;m5(R5(M- zq4A`@t-FX)&&EzX3{9&BhG{UU zvO$eBj}U)almT4awtDTW{_Dw7Fm5~vSiRnv;8jz}w5J1rEK+WHHSAM21n_eRX@(*u z^n=bD|Jldk*0@%>qLSl6$yk`;r*`8UfdiGQ`|@JCTBGJ0ZYvc1p^iyO=k@^B*#Rhq z8Ap#`t>PvGBbwce^}r(>*kH0$Ujk7R#_hmD1(h2oGeayGQzyx4 @UdI*X5fqs*))v!5E(jCja;B<-Y@?S!Bp^Ol@D<&ZIyQV5 zhfX>}-qxS^Zo>*K(r<^HkC8jt5f5iGs3e_TLqE$}w2Wy~)$1*BRA`JltA7{8K-bN= zPDmSEW(IB^4UppbL>}};eRE!If4^sftzOl(UURPUxoMLDLp2k?+(B)LT-Jc>z2!T2 zMXRsr2X$-FMvLX?#L}4JQ{_*VVa`$gEIm^DsjH{E^#OQ;3tui60o|3NUS2pLNg-U? zxxr!KBmWM87Cle7hYfu)U}3bvk5LE*pth7tb{(a^_W~ oa1g( z%K|KE5~OGd5lDhz!9!pQxud!KX(k)wd-~Zi;^*2Aa(s50Co3z?jO;oZy4i RqS|(1qj3oEk~XBcj$bhj1506EQh93OqZ+5g%{O$Z{ m)## z>l{bZ!#C73RRJ{_y)56P2l|esN#}>QxnsFv=(wUao?zF9jgz=`wfzJS`1Rrkz+dIb z_t*9FGq_yKnFpfVvgB@Bm;2;iozl3I1tPZ{5PWZR(_md~O2$)Y`02=VhPs?|FElW} zVhvQT?K8QMehD*2?+@k+40NYGgk5H+Rs!D-zaB!Z$s9v!nD%nCfmjHIZz9lE%9+!t zx`Q}SDL&i;TLiDG-+#BhGvZ4ecaN}j2V&>_ WFGaltv1pg& z!4ChMx~a{R>5QsPgD5<*AA6H&05=emI5{Xp$5!CG8%=H7Af|%-qJLRWpXUr!FQSB^ zlO)YG{P+MvEPE%y1xrcvHk%~xr5ursZPCv^7c>$?{BarV>KqS6>)5GlFKK5hI@vm# zY<3w=XRQzLF*XVeU{u=ifgIbJ8Ud(3nyJ{)?h}?pJ#Ryz?Ty%e%q`%S79uUQ>$YoS ztvLUzvc7mqWzy^3na|RnmG#yR(|uih|31&)#4alHcco}m7?J M3x%JK|C@ zhJN4`S(qK{MDx!Os)#^gn9^ayTLQ$13GEN>(dceOs#$3F5QiTs2C J3v-ih_Mti+i^NZ+k7p|4Yq0Zypm zlR`Megy z Nc$6sA2K}%p)2Q7T@TJ4-SXWK)-m;|@B zGYl`@HJWjUP*w={M~l;ks;Xl0Ma7w*?lQ$W$6*B5bmGwr3AcwRzB9=Q)3k^c|I?tR z4gl1^IZd`Z? ttMyt-uY;~}iSOZZU0MVT^Ava(z-(1j<3dEoM)goa<_@Q0ABaKu~?gW-$bDxy9* zamUP0zRIODsSvgsqY-&21Q|qm5Oz~1<@%G(Yu$p?``DYRyq-WdQM<639OxX>%E)R2 zP`*=JTs) 9-at1fO{5F%Rghuo7b0^)HchhUWU6#dbf}@E$G%FD&ULsc^DIZP0Q4R2`b$?`hb9@dA3O37 z420duj^aER2=cC1*t9HpkYX1F^+_dAnZ$5L{V386^NzbraYTT>s2$~7L%(%8pcB3n z(b7hegX9r1L_h_u*l8o3k@ZSb+>@}RndpMZAfzFrKG@fK(tgT7svJ#c 6MGDV^K!iq18mlG@dneu&_U2u8(C8S0GRXKJN%r@fHhYt z#)`i48ZN8%=3sB#jHIeci1N1fmo=Zv0V~m8xXPZwzsXw=HB@-<0lRk_qx*kR3!{$k z8Y|`-Dwg&x5QzL0_oyg2G28bmkx{%HLnv6i4?4dQBdw#i?pnH<`}5vdtb2I=;+Qk< zUFE0>@3>aeoEOpv2)*B#N&*EPKNOaaM-eEf5JjTdYOzDKRI(MC(YznrvHRWQULQJx z@A;POh#9Z!!&2a>z9(})W78Z-!XFn^|SqPE<*zT7)5;fk5OU?X-`+~ z2vJFb0_&M*z{N1>;xJ$)I!lV%R}`=djnflB;E|=z_Dg!J!M{wPHpbO2uXj3^Hs`i+ z5f)Wl_{ k6*+#=K2F{{Vk50Oa@_<}PiF zs>g^T8SUj?e)5Q4v$w3R7~!0gvY&z$Xu#hdWk5U|mJ?>`+KV@p$1zzJ^2V8ZAnAtC z*hgXK&uHlPF_u&%u_=-mvI6wcSH$6az=RT@Kvysxkp#eU#YJmzC^(m}SrLU(DNHtU zf8c>_L!k@=2~egv4&f0jQHbn632x~5M_y@5iNUIhk;Dm<7132L${bgDjSe9y(b`lj zp0jTGKUHy@@#bchp?6acUUc@34oZ(wF$bl62w2JMJY&(HU}cfE6PFKY;K`L=j+yFY zS?zrmvqA(A%KMM%QUVvt`hfxvP!Ve83nmGrW!dbROLRGg(A^qmx^oeCb^idfw~Cdq zzmVC>acT{Zi>Nm2uIu$>#aJjg8r@<8qW3?!Kp#{6mxw$E@hs3Y?)1i^BTE{@+h%FM z@+)~B-^S*I)~o%CMa!F&wpDKZ3XaUpCqafczXUdfa=?KG$k!#9iDPgjy9~e-r79#! zS7@d-W* aeZegP8cs}0dT~*{PPUV#jv{a16cgT)wuIm z^vnu|)xEJas4wPZRl)B4#TzjD_a#({V0(}#L8)c;%#f!*qblUD^9 7aCQ2w&x%NI~)&x@@2H`&0i-y;JaU4N$$+()!$>tcn1o6Kz)K_qCA*vUdD@N_O zwS+HWbJlxtedV!GOsE=`NT{fFvJbbs5kw*pCq68as*oT+iee(EL2dEUx*^=D%h3e# zeiED$^A?8V74+OOVB5*WqTLLxA%S|8&|F@gVYv>0<{-uyZs()~)N~w1=b;r6@}N{D zbZF^tFX 5vBdhI|uPQf !L}GJZd@6^@BlE2R(yOiESU z#xO2DOaz&)!ZP}c7wW0BC5?yX2W=0C1`2}g=ztjKrG0cliiEgyrE>bQP>{3MFrleo zZQKw?3_`4L=(&IK#CMptDv8RK6)IQ!E(|)_)1zdt7YM0v%4*_d+y^n1mZIf!xp01; zXpa(nKcb;GmGuzm`}vwpJp^Wu)2Fo4`A;9<{LMa@4vwbG-|04e1UfP6|Jncu0Rsa8 zKM(;-2FN6hHY2k8^hgWQC@xS%iVI2+!!TDYS$!dOB*?NXfQd46g~}{$Qm>)nWuvQl zeC)_&)Hs=9IE&FervhBb1%ynHF@cnp^ucM+#W|(wm@Aeh0Nh35UDjpCQ2;zeNn!#5 zDTwVk$v{jK#L}ir9L0(SqLRGK9Ltx%ZgUXdOP7g~*=4=s80DzLzF8_gOfg7qgjghV zWKJgIFtxTM2KJEh+tKab5WPIivXh5G#W{KdIEjJ;TM=OBkS=ElRe52mMT?+SiIIh? zcJwHXYE;P#Vp)AGUC|Y9ps{)bE) zvM$fe*rBl+;-RXC4Des&0{;LMAxO*7LU4DC#Ne|*+Z@FMUbOhfZr?gGJ %a3b!zV?15|6d&L1G z2ar4S6b3Q2lij6wt;;+qB^RMpv(ob)+5ozxDiya4-;VkCZiKY(uCoo+Y! zzf*gxeY)??<&_+~mE!IY;hA+FoIR4L++t^%X!mix^CD?( zD!(rGH3!R&nO09^N_2A!ONlbu31S2m=w4q0b=QjDgG0L0{J}MsSp)M}-9HkD9Lm@+ zRoK>P@g8gd^o5kE^^Z~VvOMTH3Mz(ArelB$?9ej#s4*SxN>?Ya!^Ly)j=@GgB7iLN zQ2SGD`gy1T9I>)!+N*b&j3}jWSF^mJfV%ykhq)d{$T-ioE00(j4Z08N{dVTj?vTN6 zz3eu2dsN1ZJ!CH&)oX){VmPOT9&P$n`Ru-91em!g;MMyh+YIu6)bd`!^kX%nFk0>U zj!y@Tad3veXCa)s`g@6uVM&s$Q;*r{0hwAjKO6Ryob%v0#xL!chc hMsY|q1K(6LLKhGGiLybf5M zl>~8kA6?8A%gYF)fel6hIEyodRyE7KHSdF}A9Rc%|Q@6YB{;8f0Q$;2$C z(?{(lpnga8mLlF&pXa>c7xr^JAG6F2U~6NXygnmP1A4=0>T&mbBZIUbIEaK;vp8MX zZ2jk^D67fpiVqWVF^*W6) `#M-5G?qt@mD-7t#-O(}Nv*&2#SQkyyP z<$1f7hPA8l_`ZG-Wn?Yl02R1f8UW%pRBhb5h`$M!*s8yom0`kxjMV^FeRB?6P1+lw z)Yz|7oTUQ_G4O^m*|*42qx*NIhA~n0XCA^wHusjkS{BxYU8{YvVl-hX@Hg!4QxaY; zOjdo+E(A+u?R4Gp!ctsfjv8hq$_TM$8Vw{=j?r;anQ9{>p=Zosd_Qp-nnmXh-$_+; z*L -s#va0hEAi>L)1$mFg=%pMA?mz(YBP{ls)w8ll( z0`kCSpuwA=Z%}^%1ejJH_i{Rj;F=tky?G$bq`Vkg@Jjp&EsPP)^wc$rHQ}b}`~HY? za3F1oYXY?^qoFZ$v0$)=VcVr*lv&Kn@i3vb1r-!i88HKx+d_OGTy5h(B~jRyB`ub@ zUE)5#?l%nrQ@h?^u8}HNk>*pT00sg70Ke5mXj{h_{;H?`0yxM`W1EcC4tKkc2PIJ- za>f%A02~t)ms&jWeY`-90;=(k1ns bjZh`r+9(wB+g%MnrX{{RebgO&tX zvc{vu1oJO7ZxYQ#g>uAvO$bzf&=)eU!V1Nar(amx&-`sO%wrhJ@&N|s+YK#=+i6Ew zsIy8*LuGX!i~j(P&A_s53g7usRHS1TWD@D(3l8a3(4(0e6z)-yBUp_rF+8Bl=)bC% v!Akc(=yYc@Z>JM!yV5;P*|T$W(LUmN{{ScAR`K}%0DhU#n?ioy`d|OqI_>#0 literal 0 HcmV?d00001 diff --git a/ruoyi-ui/src/components/Verifition/Verify.vue b/ruoyi-ui/src/components/Verifition/Verify.vue new file mode 100644 index 0000000..88c3c34 --- /dev/null +++ b/ruoyi-ui/src/components/Verifition/Verify.vue @@ -0,0 +1,501 @@ + + ++ + + diff --git a/ruoyi-ui/src/components/Verifition/Verify/VerifyPoints.vue b/ruoyi-ui/src/components/Verifition/Verify/VerifyPoints.vue new file mode 100644 index 0000000..e2c8b5b --- /dev/null +++ b/ruoyi-ui/src/components/Verifition/Verify/VerifyPoints.vue @@ -0,0 +1,290 @@ + ++++ 请完成安全验证 + + + +++ +++ ++ + \ No newline at end of file diff --git a/ruoyi-ui/src/components/Verifition/Verify/VerifySlide.vue b/ruoyi-ui/src/components/Verifition/Verify/VerifySlide.vue new file mode 100644 index 0000000..a5770ad --- /dev/null +++ b/ruoyi-ui/src/components/Verifition/Verify/VerifySlide.vue @@ -0,0 +1,433 @@ + +++ + ++++ +++ +
+ {{ index + 1 }} ++++ + + diff --git a/ruoyi-ui/src/components/Verifition/api/index.js b/ruoyi-ui/src/components/Verifition/api/index.js new file mode 100644 index 0000000..13c04ce --- /dev/null +++ b/ruoyi-ui/src/components/Verifition/api/index.js @@ -0,0 +1,19 @@ +import request from '@/utils/request' + +//获取验证图片 +export function reqGet(data) { + return request({ + url: '/captcha/get', + method: 'post', + data + }) +} + +//滑动或者点选验证 +export function reqCheck(data) { + return request({ + url: '/captcha/check', + method: 'post', + data + }) +} diff --git a/ruoyi-ui/src/components/Verifition/utils/ase.js b/ruoyi-ui/src/components/Verifition/utils/ase.js new file mode 100644 index 0000000..2bfb114 --- /dev/null +++ b/ruoyi-ui/src/components/Verifition/utils/ase.js @@ -0,0 +1,11 @@ +import CryptoJS from 'crypto-js' +/** + * @word 要加密的内容 + * @keyWord String 服务器随机返回的关键字 + * */ +export function aesEncrypt(word, keyWord = "XwKsGlMcdPMEhR1B") { + var key = CryptoJS.enc.Utf8.parse(keyWord); + var srcs = CryptoJS.enc.Utf8.parse(word); + var encrypted = CryptoJS.AES.encrypt(srcs, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); + return encrypted.toString(); +} diff --git a/ruoyi-ui/src/components/Verifition/utils/util.js b/ruoyi-ui/src/components/Verifition/utils/util.js new file mode 100644 index 0000000..d38fe94 --- /dev/null +++ b/ruoyi-ui/src/components/Verifition/utils/util.js @@ -0,0 +1,36 @@ +export function resetSize(vm) { + var img_width, img_height, bar_width, bar_height; //图片的宽度、高度,移动条的宽度、高度 + + var parentWidth = vm.$el.parentNode.offsetWidth || window.offsetWidth + var parentHeight = vm.$el.parentNode.offsetHeight || window.offsetHeight + + if (vm.imgSize.width.indexOf('%') != -1) { + img_width = parseInt(this.imgSize.width) / 100 * parentWidth + 'px' + } else { + img_width = this.imgSize.width; + } + + if (vm.imgSize.height.indexOf('%') != -1) { + img_height = parseInt(this.imgSize.height) / 100 * parentHeight + 'px' + } else { + img_height = this.imgSize.height + } + + if (vm.barSize.width.indexOf('%') != -1) { + bar_width = parseInt(this.barSize.width) / 100 * parentWidth + 'px' + } else { + bar_width = this.barSize.width + } + + if (vm.barSize.height.indexOf('%') != -1) { + bar_height = parseInt(this.barSize.height) / 100 * parentHeight + 'px' + } else { + bar_height = this.barSize.height + } + + return { imgWidth: img_width, imgHeight: img_height, barWidth: bar_width, barHeight: bar_height } +} + +export const _code_chars = [1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', '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', 'A', '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'] +export const _code_color1 = ['#fffff0', '#f0ffff', '#f0fff0', '#fff0f0'] +export const _code_color2 = ['#FF0033', '#006699', '#993366', '#FF9900', '#66CC66', '#FF33CC'] \ No newline at end of file diff --git a/ruoyi-ui/src/views/login.vue b/ruoyi-ui/src/views/login.vue index 06c09d2..15da3cc 100644 --- a/ruoyi-ui/src/views/login.vue +++ b/ruoyi-ui/src/views/login.vue @@ -23,20 +23,13 @@++ + ++++
+ +++ {{ tipWords }} + +- - +- -- ---
记住密码 @@ -192,15 +172,6 @@ export default { text-align: center; color: #bfbfbf; } -.login-code { - width: 33%; - height: 38px; - float: right; - img { - cursor: pointer; - vertical-align: middle; - } -} .el-login-footer { height: 40px; line-height: 40px; @@ -213,7 +184,4 @@ export default { font-size: 12px; letter-spacing: 1px; } -.login-code-img { - height: 38px; -}