From a4260b3d42b20d2f3b6afa0053a959b94fa0d394 Mon Sep 17 00:00:00 2001 From: savior-only <69495405+savior-only@users.noreply.github.com> Date: Sat, 22 Feb 2025 02:25:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CyberMatrix 量子安全分析引擎 --- README.md | 110 ++++++ assets/image-20250222011558648.png | Bin 0 -> 182928 bytes assets/image-20250222012127096.png | Bin 0 -> 612867 bytes assets/image-20250222012232207.png | Bin 0 -> 584543 bytes assets/image-20250222012315255.png | Bin 0 -> 180617 bytes assets/image-20250222012445385.png | Bin 0 -> 203881 bytes assets/image-20250222012838474.png | Bin 0 -> 262080 bytes assets/image-20250222012916552.png | Bin 0 -> 244049 bytes assets/image-20250222014422442.png | Bin 0 -> 435526 bytes dependency-reduced-pom.xml | 53 +++ pom.xml | 109 ++++++ .../cyberscanner/ColoredMessageCallback.java | 7 + .../com/cyberscanner/CyberScannerApp.java | 348 ++++++++++++++++++ .../com/cyberscanner/ProgressCallback.java | 11 + src/main/java/com/cyberscanner/ScanTask.java | 301 +++++++++++++++ src/main/java/com/cyberscanner/StatusBar.java | 97 +++++ src/main/resources/config.yaml | 42 +++ src/main/resources/styles/cyber-theme.css | 208 +++++++++++ 18 files changed, 1286 insertions(+) create mode 100644 README.md create mode 100644 assets/image-20250222011558648.png create mode 100644 assets/image-20250222012127096.png create mode 100644 assets/image-20250222012232207.png create mode 100644 assets/image-20250222012315255.png create mode 100644 assets/image-20250222012445385.png create mode 100644 assets/image-20250222012838474.png create mode 100644 assets/image-20250222012916552.png create mode 100644 assets/image-20250222014422442.png create mode 100644 dependency-reduced-pom.xml create mode 100644 pom.xml create mode 100644 src/main/java/com/cyberscanner/ColoredMessageCallback.java create mode 100644 src/main/java/com/cyberscanner/CyberScannerApp.java create mode 100644 src/main/java/com/cyberscanner/ProgressCallback.java create mode 100644 src/main/java/com/cyberscanner/ScanTask.java create mode 100644 src/main/java/com/cyberscanner/StatusBar.java create mode 100644 src/main/resources/config.yaml create mode 100644 src/main/resources/styles/cyber-theme.css diff --git a/README.md b/README.md new file mode 100644 index 0000000..6a94474 --- /dev/null +++ b/README.md @@ -0,0 +1,110 @@ +# CyberMatrix 量子安全分析引擎 + +CyberMatrix 是一个基于 AI 的代码安全分析工具,专注于自动化检测和分析代码中的潜在安全漏洞。采用赛博朋克风格的现代化界面,提供直观的安全分析体验。 + + + +## 核心功能 + +### 1. 深度安全分析 +- 自动识别代码中的安全风险点 +- 支持检测 SQL 注入、XSS、CSRF、文件上传漏洞等常见安全问题 +- 基于 CVSS 评分标准评估风险等级 +- 提供详细的漏洞位置和描述 + + + +### 2. Webshell 检测 +- 智能识别 PHP/JSP/ASP 等 WebShell 特征 +- 检测内存马和无文件落地木马 +- 分析可疑的代码执行和文件操作 +- 识别混淆编码和加密规避技术 + + + +### 3. 智能分析引擎 +- 基于大语言模型的智能代码理解 +- 支持多种编程语言的代码分析 +- 极低的误报率和高准确度 +- 持续学习和优化的检测能力 + +## 界面特点 + +- 赛博朋克风格界面设计 +- 实时进度展示和分析反馈 +- 直观的文件树浏览 +- 智能的颜色标记系统 +- 流畅的动画效果 + +
+
+![]() |
+ ![]() |
+
| 1. 选择扫描目标 | +2. 选择分析模式 | +
![]() |
+ ![]() |
+
| 3. 启动扫描 | +4. 查看分析结果 | +
5cP_JWN(wd5 z*L&8tX;5^?fnFB$9*viJLHvjdu#7%xE#dHoeP_*rgj6z9EtQ3F-556C-;-4tpSLC$JR0FRAswtFaJL%27hA!>6<(<}R6U=O`Lrc?yF`(h`< zYo?Cr2ur$V7*gdn%_CWvW3LRG+5y0FQ@IFjlcN(JruN#PZIN|=+I&?MGKY!*E Vbz zY&s%V{o+RQ)GGQJ8Hx$EbEm3c#37U4Mnh7^!w1%&a@y`pAr2QGcww1YqZ0MsZs*VK zPGcUW<-mg>CHm<;JC4nQ_B@5sI)SR&`sH)aQ}^Iy&o?p2Qzs{Cf(M=U4!&!ctV(#T z>9@)_?NfZ}TjCy{OT Ctl zPZxaQYg=dN#O19ZT%Qhs3EQMk|K=6EYZ5K)7DqiQVxSic_%d3o2Ffj)m8cw8)rWfY zM%l@ktyEX
qzkc%1C2F#2oIixeW+8P(h4-C8*2WI^pVT=2ApD2>_2Y_2*Z nV}*%{ii|3b!j+C%a)lJi}cH2Ra0O`J2)&=~PI;s3@*sp$(Yt~(YU(~k#9&&F3? z55h+jQ+X+qJ^GS9%8#N`eVkJIaj)*7l=^)2f=hR4CUG_dg1H*e`{w&o|BJhS`J!>_ z@_m=(H`DSK7E5V$c}5WYxu(AQpkF>b`PNE%kEUdDb|xt0JZ}e0d*(jDu1D+4D^Dotj|1w^+LUoC+IL4&i kXS%?3zN 1>u2zxDHQBDyF1 RhMEM^=FTa+fIc&wp8Gt=6%o0f3Kt a-PgZ_f1Vce z;XV0TJ IcljJc~&9*Mt+2HK#HjQQ3^;8;-*Yef ~Iv|hx4}8oYto-{m^>0kOio1`U zg*4_LUPt(Us5JB-#U(bTVDXSMc3J+1JBG?6xclBm2mfw|{>RMzN-A$1;f4PnE6K{s z{`J1D_U5d=EYA;y|IHQc6i(Pf_jeXH|K)w}@iU1R3W;2van&;yWj}y#ZtA-~kU38z z<^)lRt!%iUu;(@f;8S I?S!rNM-FgdEg&Kkq*3%hvtmeAQFDpub6=O1bMm(ni( zl1J3I{&qN|(Q7|Vu|f~!1u`g@I$n!~+W@ZbY}ies+ZZCu+Px*~1#A!wSuq)4re z0uTL(z6Q)o+BG`We-SC 8Y9BJc+__LA_se9m z!Af^SQuMtFkf3wE1kfe7cRWi34yaTpMY-q}$24>k>@yYhC7w0?@KvH%FGjpMXF_5R zFRs-j_n?zYw|};sQ71+fzfVuHqpSJRo&R#F*9|xdR8_I(+g08JTaA2YP~`VqR3GaF zAH0WnT?N{6ztcA)zU#Jrv_FnnGMU@GXYLtcJbk;-5@YO{P> w~o8W;$r~0{r%HRD$)e{z@KbxNM-Is=aQpbI(p3z6+!>C3bAQuPta x{ogKHSya}fp z?yFxCgiFu^M^GFh e8Wk+3=yF z1DQ)V)2m zX5b$xp{jCA}W31=i=M@tegF{ z>9;M%AIN3OYfX8k+rJ8GRo3hZu`1y!cn2nty&Z`td6@lRy_`NyKA`RC#(IU-z7@IF z#tTE~vHJ=W>f^h;R%C}%MBI#fO_Xc{6Bo5&rPF#JIk<5lJ?cgFj_W6(pKt$4*TA_V z>R_;QpvH5au1M`DBj@ty8A~$X+yX2QZv;VvXHS7(g;@#TR&1bwy6Mb43QwwWZO@y{ z@x_R?hKHj(;m56EW1hF!skw7%4teVj+0k?sX%OqQQhSZtKJoUfQyM$MnhRYi>WXqE zW`OvoYrv~Vr7g4K_cn4CC05-HRJCbg#o0qHq1k+EA3Rj@#8{fb)+8*TrN>XFGCEa| z7!L9e=9@uxbf^4C%Bn1_OO;oHwBD4Sl#`b`@ZaG6H%1-6{gt4md= QC+=8(fjOzbm)6`QUQ+0 zaOt>BA(W7fhH%G{%KC2{YKk1aUVhp`N)pC%in~vSD{OQjF4=>{9@=8um9N fr3mhN*&H7=leGOzTX(SGjdb0OK zwbTH#Ulz22Y$9L$vYOMEBo=)2ikvX-8ryHp) 4IXm)?aWl;q<#P>s8a>KmpJ=yCQItUC)>)gWS1vYcf6_Xr zwEZxuHf3VDx)e-=ZtEkuJ `M771k}c6I5}Ey_1+FRU z?j}r1n Q<^K z25l#VDoESaCmedPY0Vw&)3iS(_;f4B3=4^O&4WI~C=cjg+lUzynF>k;Uws(S7K>C* zhuQLL(GmZPNJQ%Ng65HprbDZ4GGUF_ftl!~x4{PKpQ25c3$o4L*V#15nrcmW(lZRl zKenkMWY};WoQWNr>5#C9)?sDQ-bR@rst?EW9LJ+0-ye r4zQjVdvVtNCIgPSeoEdp1VJ2n)vcO_}HxT3n)%!d2(qx`pJ}ahYK2AzZR=Tyv|p zt>CZ|br4bm?!M$~KXMom<{UOB8(#}J)a? ExKLpr3N%U&KynN`#!R)f70#YV2A8==+sc>iUI4YjbAZu+ur-<4%C~$AUU7 z!=9&{Q)Up#oiGb#&T^_X&SgRG$%i%8dmyWiTXz!gp15e$>?bNuk9#!s?aeF|b~?PL z8Y+Ho7NgNI-WNaLUy4Okj*LXVS|-$I9zQ%^_)hcwmm+8TA&Du@ZZ;qr$gP1@782zl zXJZF#i=t;+QmCJ7rxUdfES!K2id>k}yu_jmvpaG1(?U|$SR+8)35e3Nr4H^QvjO=_ zw5t~7Kr{Lb@AhMgu5m2%-3>jEx8%x{&E9xSFi*UKh!S^-Z++4-cHLV)%0)*sIVcKl zm;NZ(jD&vtct_X+^LnWpUOsgb V~ixt&8c`$K3yj&_lN0vpo{!_kEsRTbBhd ztioz44^_D^?-kXSe<`Y);vvn?S@YCMo@TG{X^T9n_sEsZg&%!r1}tE8{1E0}Ufx|O zOBCud8v?})9MvIMJcRe?7F97H3boeT+bIO&EiukHx`j>f0@I0^5mVRzQ+iUA(agA< zg)WbCTM9Q1%KMI(H>#!Wf_wZ1X#v+b`%J?z>jx{NbgMebr5KI53t!z&!wV!XE~BSz zFHc*`CD&U{+s1&H8NbWNetgHgA3|qc>@H04s{R4-|9gAWaUPe*pSTqge-8`>dwb$? ziEJi>3RH*Ym{~{8Vx73+F^S6CaZLMPI=q7`hJyVXl}^P_r>{UCu00-^ZEAg;d8?a8 zg!vuN9;%V~f_k^yZ`L7pZLwa?jd}bI4CO0-D=PImO|M5e ~JdRjbow^?}|j*Sx~?5pZ(PYG+>=Oo8j1usu$*Aho<#`l?c z%aFTwszR7cmJK{e9T5f|3MG~0MF;eY%Cjlf9S(t$zT+$hy0u&~BjLT9V^z^BPeb?Z zj)3&0K2JjP>?W9&elefAj)BiZlA*s6N4Z)9m<%+0>y)LFgnGRVB&^qSa=@A;FJ=uo zG=z@pD_F)-!2>r?+)?|-sj~AuoitrH?-s}EfgEC&+$5iUESOu>mBU(?2V1wcXbL|I zSxU1T-_=rLzAID3GR0~zeIQ)Vb1DB3gG2E~VcyL^Sb|G2u?%qipj0et8n~rAl$#Qg zn;|QpQwx4VZ!2DJSL5Qg@fK8knl&{cSj3PT3`T@u(4t?q`n+A4-GF )0%r+&8N z)bEoeXIu`)qEM?^v?DFSv2XNAaw=^aQIAKAE?xJ1fMD)t&8Q-I@>sNlE7Gcd0r= zR ZyyU((96n!3P+)rc7Le}B zKg?&lE~q!-I5>KHdoVQ@u+XmVO$Cl-!N5({kbzOTR$DKoOOf ;bv|jNA z9*ka_q|H&Oxk`dT-&HKU_vmisGa1Fd-=+VzG-7yxlx*#sNkfvZz^`ie!P32QS_j?w zSB~3O9O6v$+UNUlZ|PBO?|HwItH(V(whJ|$l3V+fL)`;esGzW6MX7jNPJrhls>&A> z%I$~Krc(wzO&u =08FO|&(kTX|RB5nG*Ut<&DQjp|lqJqBc5Z}A78i&r z-T@S?2g9lW$33UULzj}#AXzzq4i8uxtm`BbW8A@0FoS;fnFm=JIW(Im!qvISwzmRN zwp6+AUaGo(apAThtw=P}!5c4I^!0ai*>lDyb@(Es{jY6D#zN|G#J>&!=9?NSo|>DY zPk_@q)pco-f_oVk<;=PRE;+T$moJRaoWzC5wIB6gyP6-`>Ytag8XZh#_sBbXGY({T z@ScdsuCj&qn)_f&Fs|}A`|-(O`ZZ+~N3YOcx~Sj7oi<=jIznqZ#%{X5w$>@DFHfyV zwS;%!dXaCnACl&%?92KHo!yf45VvR5oW)e=2uwm3R=Zd0wwM$0jJ}cn{Uxm4khZm5 zkaM;EB|fk2;bBE07dh5kTYLg9Fxi=t7LAXoXc2gAgVOL%aqStLtkgjUZb-Qzspz=M z6gCTm8s!G)A;+MvWvC0|)NL9i=p%{hU8Q*jh7%Qnz#|b;hw1Ay@=#roU3i-$a?g%O z2kaNypm=0`Sd{H|$Gr$sQNe }4s5t14T)MYDx)N}|J7;Y54fD?6dF^T%9(je91`lYI zA>qJ{imo-CbA3YrT0<{BFHBVn{%WC6r@mZ{-BRZ%;pZr=?;VJ0p1L!!7GcK%I($9- zTCsQ5x2l!I*Oo(F@$CdPKo|G+QOe@0+!N`+40aP{xA6bOb1w(Bpm&l?Iz;0JUFWa$RLe*QPVz~gi z)Nu_ETR|vWBwYYD-4;ISS`$ct4tf o4o*QEnwbD;=_>sQ}akY z)}__3Hw@$rch<=3)~C}o?}9d`$A*8E@-Wn30wrM;nH(YuCAI>|X*Q=F?mu^iY}s`h z$EF(;CDm32&X#H{w^IPk6;2(Si#46!;-B63qMgOR!Pcm`{~*}^JwOpLB5WXl!M!Jn zY2VwjM}vI${K#q_&3qdnxU;NtsgsmRsp}J8jOpe}8GeV^mF*w}gQ2+b@zb?9I7WZ? z+{9R!fwmK4{H=9o#w0`0Nt z*0lTd*z&fcnVm9etXYBRk+nbl*3&~Mr*{JR`a`mu>?%ZFCD>qQwBW#z{f=&Fz=q_s z7GRC@xdKpM#~{xZJHbP`sTGS*k33pgD+VQC-3*@e2l@&YQ7ZMcZ=o*&8oW%Oi!4#P z%HMc-ZJ%Z3y`TQR(3HDn%B{icG41lPIs)@n9NNAPL-7m#!3y;?h}}-G<(P! zDh)23kPft}(W{k`j@+BvxQ~oi*Z{|$Ci;fdszY@Qkl2>q{pGa`mUyjNuf;KXf9&BN z25{W33ZBB?+H$Q}V#1^JH=3T>n2Z!kPWarJQI6Iz4KBtP$#IPkn>cZfmq!~@@s#V7 zh0KsQ=caHa?-JGc99`nKZkt%>L`ouJS)q$lMiI-&4GepAS0@`}Rv47YemSDG>i3K?H+|nIL-ab%= JCS*@M7G~L}(ZA<9nUGXJ%b=?JPnQP}hlVS19FjJuOcZG8 zIHBR5XKj7$vX_yrLzV@S|3Vc6^4QjG--eY65p*jCT & zCY218g^gYi>(j$?ceQIGjE&oMzUbO+IZiQ0_I4C!jToKmm1!R66t1<1PTijN+E6R2 zaxu#bmF>1<$7Ui<=X%zBco*u0bs&A?XAkf#m%P zk#f`NsoQL-8U4WwW2ChRx1*!YHrXgk(Kso;l!>Z?eY3?Wi-j}+uGi8oN3Uy0VbgdN z2V})lvCRslD+T`|a0xQxu4xGXQ4glViYG?zLq_PirhPED&bGcoxbuj&5rsA|Pu(Mj zeja_>?vNyD1OZMuz0I*zsDIXF=e{T~;lWofg?;KBu{T-ky$A2&rB?9s$0FCTJ@eQc zQm7?D@}oqU1x0Y-9XB>4a?A?JK6(@ilBPxa4@P4MS%CG^XT`|Py g2%M!9T+tE?^q=EER!R#)UZp7O@&7ZsA_M9UNsS!afk#?&UtT`-g&>a z@56|A8>ZO8rCQJF3`ltp#~o#jbu12*=yY?j-?FB)C)VPckD8vMWj|1ZTq(K;+e=as z9WLw<#E=+{Cly}V(HHI9r$#$%9~{2)yjOm&dnlTjwku^sX0Cp2^4FcoVG+>@FH(c< z!(0y$xAm*!8)4GAd|B7|G_`xF01I__wT7DGR5yLrHj7-66_h09x%0hvlK>@1uz(S! zTb!OBOPj%>9M$@u7|q&8<`IyUti84Ex)G=z1duXPPUSaUnmifaldFqN#KoPQ^+)Z} z?&yy8;k@qjitns1l@>>jel`R}AP)mjCFjQ#KRZsGq;9=Dc=T0PMi5*s!@g3pdon3{ z?$mi6Zs40I7nol07aW^z#^7ulUI_&OIW<{C4S=0QXuO>9 ;EHf{#TYn>0?O% xzN;UDqPO6 z@wZs9`MI$>B12;rZnqIVKeXdrZQI|!cDKAZ60khMOS`rfRtK404Nw7He_5XDyixDb z!D>-2wMX9|V`|uTXp_!~@rLhRvqxWj73Ve-Q29VrDJ;VNBml-(Jw6HBTNOR?K{VC6 z;I+g)gMsv_t(PK1?RY&!wb=uRC6EkU =pM*^T+}TL))_D#P7i4Cs@0wi zDswuKHmF&SJvKEp-0M*(vL|cGu1i2C*bMRk$8wc;uA*Fk;9*>z!}v(}BEq1p%0Rzo zEh@joCJp9it&pc?GpBI>3?rZJvZdR-UnMh4MypP>7ezfdr_yGTq-~_$NwUPYPd_(p z=4wwjTMpa=JtB(Cgj@JIb|DPdWq38 xJ6_K5nCV zyY!)^)_NY>Fu0T{GW1LFlZ2ozyxwiLC@sX@uCHZjSHW)=XBuA|ljnl)8VKH*;Q4L} z`)TV>D6BrL_pc!?Z&wj;LtdE$dgI}C4O0)QC;@Ma t4M!dOA67|jzQVIzu}>Ow&b zRn Qr2&i()mJf z#C0Wu-RG3eW&_d%Go+P(>~02i{keVDC(Td^!5=T&*(Pr9+a09dm(KOzAd2%RzgnAa zPWQ{!d_)w{^kK2;im+v4E!PE#)GG=mctvYA5(nI4duzda4Go}%gSC_2*$lp{Bho*C zu!$f3Zfm{e-VED#cf;Bf%N#aocVV*wMG!*X<%rFQ+9^P`Os+U7kJ`3)sI_ Vpje3>+*s!H_ z!sLG&Gne=dI^=h^fZtT`>AdS4bdeJ>xt|`)Sl)T1dpy{|?RQ1WoR{y#y%uVc5B57p z8}(hDJ%jafFzu{&cy!-w^(kDXF^@af+YT39W=n7PHC)#LJ)ho*qD82Q3D3$wJvUHtS0SDkEN^hJlS zRN0VXxLyi>;;!4ztQX^kk9u3X{hJ89oIp5M-w1=k*QG}79#YO{MfOHZ^!Ww%iCkb- zliMRa`#~JFtGz2%xxHAsmS(3~OS1|{Lf(mVRsJ=te~dd4@9p@RiJ%4a?|IiXjP+hE z;%5k=3hE<^AO7sxt?Zee+z~39|IJ`9T&2?+f2a~KX R)DZ;X>U#RC(W5rA;D6_i(dI8t{R7VMiZ+W zd^^T{xmrmy d$!NOp-)1Qpv z|B{mj=rd~BL5We<%T+8Uf=AAIGf38ZE>*Hf*S#uECJGAB-WTvm-nO$i0#E8PBb<&( zg7EyCW^n2T%R^l!{;z+)6c6}G1#G^`3~KlSi)djXFuXV6s%LO`+HA9mHpzn3Rq&ah zn^; sra@2 zgt;a0t~H(tN?)eHnha!t>pSd?5}bP`AhDeGwQBBcnDl~|U^rJZxAV|@(5`Op{7&=) zyd96Jmb)~5FCryBb+Qb%E9Ym=>E7X8eQo9r^|wu#G9b+gwi#;Ibgp%-!@}yfQ}DWU z{p4p``B%HBQHGBbZkC`Hfof{*HqDK`6e6>o#p+Qjv7l)PYC!l_ tX1%Yu2FNFSPspsb^l;5DdWOjdd#tUMUQ4RzCa}k*Y4CllvGh|C`$!l%)IoVjGzndvXJG8E?QxazZv@l7DZ{>>$)HFU`?ea9eB<*-oZD zxosl@K~K$lP8x0LV{JrzbblwBBVPb#i9BP_%pa7H>Wgz#ofg33>e15hY$N@W?pCU^ z<&GWi-&YGAL%pnUqT4fQAGur$(J~RGB!Djr 8bBO7THr1DrknaA8_##^o;6e*mv34C1Tl|5wDwVT=p%pU zuDOVVf&yUo5ABAAW4!as)0}Q51)wwyE@~qfjF-y%ZBn!E$k1^8ai(22oq?oN-jwDn zYRIrh@pEtld(4a4bEcR }jiz7=Q8-N?SL8q`Me(_5CM?t!LtoXO87f}S6e%BHED-tSFT z3CL;yhVi!Be)mr<>*DcqFEbvtNN _ibJGJX*znz4k(!kOuFAq3f9Wdy?R}USn)+y#L_(Nfln5`t1fjAC=K69 zh*Z)1%DOyVTrdxP %#zDX& z^bu^LEW(p-`cxQI%huq}*6i*?bndd49F@XE?bJ-c!W%D~TQeovm%#+M@uswWRaxe= ze>E96>pMyrlD~bkt-{J<@-SiZ{-O8k-7+8$vOYW_5&X{NhprE7UiHQBqeZ&0?_4d8 z5ty7RQTW*Wa@U6eyF+#0>dmT$0$`7?FkyjQuY=K_w$A8S=%tjgT~RMB;P_Q}% #K}sOMxM&U&lveJ)p$DGhW4^KM~Rvj_L@>j?T83Q<>?<8#HXAXakv1iJ5c z!?j;(M(6MN6jxomd-`m#@bCqg+q(fpGX`JEvqg01PR^Gf)q~DVT{U9fBITSoG)RBX z`oaIyjI#*+Nx8vxxs4!RV3N3Bm~13AFF?LF7Yu$!t81k0 9O6rb`D W8SgKa@KhjqFw_SR^9|fySBOMnuR@b*;phBxQ`M8)wP2zWCf_F|s zvG-yMq>~@|VsEI91AT42VK{d 1bVW_SL$WW5uW-Gjl2mV+w6J<@IM!E KH-Q;q50sDF9$^zxrf$2`xQ#{!}3 zh9CGo)VQ-x@uzz4Dje1z6)}1_Lz%;4uLNUyE}`24Oq01(%~tOhn9Y_r=E8$gxN%0? z#4_i7Arh*MAyX}_z~oMMxRPa8UHjUH+C>}mZuv$;`&i^OFYfihS;Ap!pVgb ui>rXX;1KYkON4BcRm_<(CqP0KC4(?i~ zAE^pDlkkifUl@06?*C%P8d_AbpT&5?l%a8W7CgCM|2h{Q(%{*OD#QL}@N)M+jNEB6 z$hniKDcbFLGJq(v?h}=^EJ#WN7;MUwsa9dI8FDXIBDZLLG+wD{#+DY%@9a*3d^I)~ zjDj1`mLInwg-AT5w-$PGNZIvfn=-qV!-s22du>Xbhs+jpg{xykEs-yb*-UIjFDXIZ zm)zvH6K<=G_eOgN9)5>kBUB4PZx27LSZ^qDKfLeZ-W#Rn8r^=r7PAxz=6;Q;k{0q8 zsEIx78YJDTHLN{~H$cp>bt0B5O0yVUTil-D3w~yKf@OQhF_f9ohG(c;hC&d`$WhL= zzhSpKfBG&4wv9w=;uPow*3pVoNd`~&J}~V*?Gh+tdcOWz$fvhJ8B*i>)X%gdwVk$l zBI|KUwBG;*1mm~kXbSyQuxStFssQ8V5sH_atUev*+lz$cGB$-~4ox(@wneqr9oEha zVPZPhOR2K(?OjukJr^q~uOPgU@>X&YX*Fw4^`!K+pop=z5?Rm>^3XG!?HIIO#=iGz zH><3xCB8CI(@r2RhF{=}q%K4Nii7zV7rtJpgkDW7|7;A`JvM9WbE9vSdD~J^uz>1a zCg~2l%S{&=v2@+D5Kw|VbBeimzt574nkm~svx|POOaN*|-EiC*_dhUKJ^>V>Z_UR7 zPY@Huk5N}@)8`!oPF@iPvV9f^;cd;ir8jNXpa&kedbHFwi1ftD^NC8*J>he)d>7c1 zTR*c1x!mLbCRD#2TQ+^J!U@o$us07~WUuZ1fxhyf%FNe#sd*H41)fbrZ@zSHP8wev zv>G8!q)d=Z30u8&^{Rb0mjrCW??oiss}?#kjh8tVqkhKm&8ON|1I^}{mJLR{U%Uxy zuUq!l0amgJjng=Mse4F5Oiia?^3Cp~X7r>||CfU5e@{}9>&aokkFdXgd~WsldMQP_ zUSPOVIG&=WaM(pVMX
+GRYSTL4!Fg~k5&F8H@VCXsCA6p%< z%rO%>f(Vah^z+@Q5u=?BMy)jE6j_aA{cK!5LUq?gRJ4s{m*R^HHE9t9{XE%j0Bf(q zc&Dt|GT`@^P4Wg0$@wzv$CevZlN5qI(_ IHhXl-5;z{k#F#U(K;Y zYaUx!2srO1C8BW3P?!(_ abggkdl<zea+vH zI(@H7z$~}0E%1%)!AJhr*&X+37rgFLtu9^{>hrgX>73Ky_%`%ttejmTl3eO?2iW76 zV=Ghf_ RX483aCG9x{wN 7q0EW=@!5+G2KJq zg++FGeZSchpE2DBSET<4+T#C}D_)T{Qs5LZeH}acaN6d@$#(0**%1EJ3dNL3yrXQv zx=Ec*f=t#obE2?9o$h#d12Az!sERsZ5L}sc VW_Q zZ-w{ldz?_5dyP7WsM6;6K~TSrP=ZmeSs*MR(#U!ui!@ojH8d;c2cyxJK=-Op0vI$n zMaS>uPF5cJGHU4aL;N>HgHTkUg+Ebw%Mg6aYg4k~85px)@%q6A%a}>puqjcAIBLVB ztl$ KX&}ZlSK> +xLc_K#*@Y75gC*=Y^zCyc497I%-@y`MG?cw6!1)lMS&9=vnY3G0L zx;X4c%Wl*VgoOI6y;yNFQ^Xx77X ;=`<%0V6AbL}Y2rwTmdOR}QqcNHxDg1p@z($?SwGoKSLWPQmUVG+}#+ zu5e&x!5>0GTIk|S%hMgTYQCJL6b;YQ{f%Qdv$2F$*pQ+7y(X7F&{Kus_E6I`eKjY+ zt{kf~{1@95S?d_qyaZmbZT6$~kBw3OgN}(oTgUpnskOZIYx=;N@+uC)Fr~4Y |tnHlgGcxOYsHT~X1#1xpvYvHcs+x?f&eQwU3^PGc;a>Sv61RP* zem3besBOqsuJvWvb-%5#n{6`-hh4T)?lNMzusd?iCedU?6kiZ-vn*Xj!MHI}klcrL z`Jo-|&WSGpkA0sw7?V?ol!KFNc3F6j$U0ub!rvRx4JCZ0tjYVi~;%o6r4!3l&kKl8_u8H z?g~%s8vMlAPOkOsbPysayuz0V4MUZUSb`W|Wz^U9l;EmNAQTwecaC!CvgAuPq*8M? z$^Q@`{g<3kz%1ZRP5Msc<^!|OA;dK&>sS2M`{x+DhMf2`eE^zmRYDxq6FYnR@aH$B z2+)KS4StTLu`(ubw_@1Cgy +))hMIwj!DVOHGg_Pp5EXe;>AQA!Z!kk;&oVy^Hc(3)u+ z#+>Oh5Lyb>(`Mt|o17Qidzl}*o54szGSnFN+LbvrX%h~!H5tLPwnd%n>MU{we$bz| zcGEh)TUZ)PCQ)nw8ZKro-Lcm8K1A26VmP R`e6oj;f|j~_=igM3k=Vm!W8U|>WSzKh)(;1&F#)8;o6R^1^X;SVMw zon1b4WR8;d%QK78(d*tXf_LEy<$V!~L*`|uTJb;>gMK6vxFU2aa7t $gL2)wW~KF&z3UDiHCcjnFptB5%29`u)7mdi#ehHtx0{KDD+M1m`$XFNYIQB9ImN z&qdaJ{A*5JMq|+mBA~X|fWw{1n0&+WE`&=As a3>l9L8MypDsHd?hf&;(`mVyBfJMw^^?MVeT_BQ_q|>OL6{Nk!3wK!SI~ zdC_?_$ogiJ%5A6Q8ph@M=z>7y5B)j{B&4HxY}41uZu5o7%n0&s?*!y@8FRMrGPahh z*sbYQ<+q@o7d^KucIi62a_KX)Jj6}q`#(yU|8R8t-#+Zk0_D}9GxNg!K@~xXikQxG zFI%qZ92gpYRO5E{F5Qu~a$uMPlO^qo9CDLu!{l;OY;&2i2aQ64qszft-j>=2>XnKB z&and6;b%jGOL=B1{1pzb6^5$}2~6lRC#t%H)?8qhy;M{%IMNAyPcz*B*x+>;jxn&E zfxoVjH CP&8i8Pvjl@vnx*+PWC zW^xOQlMTJu9+(|&2V>MaKdr~2>Y|_`D=4_UHrfXO?tw?Ok=ItPSVAQ~dUvP@&wpXz zTX@@LK=n*HZ;aJrO8#uW<^~I-t*_0D%Tu{b=1lw)PN2>LG#X93Kc!j7zz0-##Z#KG zMjG3YuufHRy 9$%(#UzjFp&mWTZtHd~S4xqgtMz~KN ziKAO^S#_)0EdLvdx08-i>TgspbKMp`cP@ GvESL2d+GCdWGIOS(G66j@GE&Eb=IFDXiwJ$qz&T`cn z!&p0%zHN|u6U2Dl$D1n()|ev>=;3w;gBT8l!nHv+SS{)tIpx7-GzQW0vb^D(o6XXf zRXIwBDD&!>Y6@sf-9n&2*tE<;xxA`M{P4rii*EHp+RvtjHx-UzD_>kngO8d{m;qqc z9xWV0i}mx73f2=j;7^QrX~N6--*X*(pE&-@d0>9cU->UCfd61KGsBc&@6KeL1>NF{ zu*|xaVblRMy_$9(;`9;_1vITlFx1nZ6?(#s2jkmy{per ;wRg{xkbUS{nVCu2eM&7qZn(O5J%=d}86WK7{=UE}2|!Wh%10Xa y%G9A7c#gPVUKytB2KrnIb;#nWd1qf!+5(%JdbSn?(~~N$q#+s zU!LqP8ww4NuBe!Jv3!?|l?-sr1JjPNg>J0r%5IkV>iD#dNuo7ZGh^A?Hf@3Xb%P~| z{U!I_Vk~J06 }uDSL#s)wLCd@p?|#%dq!;ZX*2_zh@2Cp@zKL$P-fP?% zl63mE%*GiyrpISnch2x1(G9*vMKcwta6}DWOF<32kD>>_n2U;|8JjJ4O?3?oe`rZo z2$nUF?l3HHn`g fNY~QSHH9I6@CJIKSX+l;!~ia+)0z zMW~1C{Iu= ?&i(A0S;Kucf~;fMW(i6=UyKFuv+S@q6nv+uT81KoMKhJ<4SCk zs+|?@{hc+6Mem@3poYQv=gQvN_KC$ySwT~4VbN>*)(|VmN==2c8T{~hGz$!?9VAUW z3WyeDSbkOO$i_nu-3*-?Y^01;_@XoFI9>OhETK-&uT( o;qjYuG4~R9}%Ai)!o03KeK_sxhwxBgKq1dK&y_d(5?SMhYX>zh`S_aIjYAy1y(k zSRD`oV(E|wFaOHQ!OB*k_U8)C=@VD^e&RN+PRtv(oN9PlqD}IE1AYn!zds+g_ePtS z??S7#BOk?&!6}>U{9{=)9`Imdgo%I4q1A-RSO=Q~OWWZ(w$ysrU^?5+$_|_Id=Qa* z0Np{UZ^x(Pa}Z4?7UHLS@}#VfWr=ednmtevzSCn2Vhl{PXIn3rp3U<`)zM}1!RkWV z(0r(8a+%OdFrPz}!XJhM8+W@~t=4acY{4xyh DQR^x!*^*Q4>TGQ2 zJRNp_InFBSn2mc92nictgl76|Vo8sB1ibckk2H&sJ3d 5a3phBT(u|jhKcv( zFs0;kn)5$=_PG4!mG{X{6X!;GoMo?>-iy2$pIW)v!{+lUM`C{b^()Bg!Q18OL?<7Y zRH$5pYbqjnx^WnA?8h2+otff4IQM_!<@oFIVlbJPCcBR-s9^h+Y31R})gWC9sgh-- zj!elB*QCAk1$r`=#y)Q7w9T^ODO6?uMaI!TLgvNrxob%6E>0sBQ&&(0fNT(KzqhV> z-9r=%j1%^ +Xtz8stDimnRR6KCulLBTEtzsooBtw& zKh w#9)@;gT;FGzwD-Gc=!( z>yM;gIs38epL6Iqcn)z`@GSoqL_-6UNOOuQfqfu%hzV!=A2^t3-ur%qCib82kac78 z{ZA|pfibS7m|TdtO3rDPDd|CgG2I*WlTk=pSqJij%u- )40<>&>J#eEbCF1f3iOwXZNO5nPo@nM=DSGKdU7IUh(!%-g49@ z5moQ^#~n9l@54DhFlo-tzqS0oH%5RT1JlK`t