From b95d55fbe4b2bd6e026917c2d3ff234a580d23d0 Mon Sep 17 00:00:00 2001 From: root <295172551@qq.com> Date: Sun, 17 Aug 2025 01:10:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E6=8E=A5x1=E6=9C=8D=E5=8A=A1=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../17.13.439.2385/CodeChunks.db | Bin 0 -> 200704 bytes .../17.13.439.2385/SemanticSymbols.db | Bin 0 -> 77824 bytes app/api/v1/endpoints/websocket.py | 5 + app/core/websocket/manager.py | 48 +++- app/utils/system_utils.py | 15 +- docs/modify.md | 213 ++++++++++++++++++ 6 files changed, 268 insertions(+), 13 deletions(-) create mode 100644 .vs/TermControlAgent/CopilotIndices/17.13.439.2385/CodeChunks.db create mode 100644 .vs/TermControlAgent/CopilotIndices/17.13.439.2385/SemanticSymbols.db diff --git a/.vs/TermControlAgent/CopilotIndices/17.13.439.2385/CodeChunks.db b/.vs/TermControlAgent/CopilotIndices/17.13.439.2385/CodeChunks.db new file mode 100644 index 0000000000000000000000000000000000000000..f3fe8ee623b1d0b111b5f3980a84da85070b944f GIT binary patch literal 200704 zcmeFa2b@;L^*?<3+Fh_?9$pxgofPpBtNSn`e+{8Q>`d@1>V z5AO9(@ke;8ypP;toeAzd`(|so`HU%d6(mrQKtTcp2^1vo^Gaa1u13-D z;qtcuPTn%AtvU9hUTrMe~D5f7KnDKDN^K4@NX$;|RW9j}aPS-f&weeL>j)Mj+X z4Omf8k(^n_+0AQQQP;qWE?Y4e$!Q}8jq>b4_&2h$cI2SS+4IVGDW5ZF_U`ir&E9L~ z%t3q1shm|jXThM|$`=eO-fQ0Om9xQPR{89CeZ|38o{raJ63HAw;#3nXIHPP`|i!Md6j3@H7unKwXI>_09{ z(lUy68~&g6Y)3&=g**PTGy5@CGS}jwZfxLHxBN7}L&#gMZnG`6 z7e_}syIC})jSVez4cpq)?@(4gl&$2_aUTCsFd12AMS};+nOS^(TSmJDGq#@9mJ3@Z zL_2tE!{6bS@%>Z5u8A5((Jq7k)8cIDuPVF+XAK%Fiuac@MVq%;Sz}G>Du{}2Gcw?t z33}W3#k~khw%LAeuF&2>?6l3~&AW`>3`Xyv8l(pcxR^HIc7@e$zgM^Y)V31XHg!ie zV7rWKu3IxYvq)w|{rk%~hx6Rr?PjQK#bxAX^43D%yrVjZ`@8SZv~R>+ZGQ2b(iz2b zM#V#+(OYiRrMu6ZNskq?cZWUPYz#-vtZr`Ey9v)B^XgaC?bTAVz0S5Ru8{4h&Ap7q zs!mjlqSF5VX;n8*rz*S|Q}J+R(gT)`|K;FoLVE;X2R-~}{FD6!elPD;?<{YBub=z0 zd#by@?dQDeoaXH9xb~fPvz@RWv`)1aSYyoB&9lv=<}mgdyMi6arm}9v6UGU~?naUR zlzyVVw?067Lpx7ftxZ-xRc}xaQHxboxl=hrNz0$fm&>hkO8QE=T{;T?Nzv(=w8AW# zv}i_sGxq$3(#G1lMf2*KR?)6(YFt^o6#BLZca=p|RrL+^Emc($R&Pj8)1-BIHEM0C zU)kKT>6EFOv@x%y&2>#{>uc(^YCU;pO*$yQ)-}uOR#k7+I5kC+TJvgL1LN0m&}EZ# zDdXhdbX9$A?aI1!)mw8ZnFKB@e=f_a8^EP$t2vaVcWfke>uc&(x70T_Y{g}I3S89u zM^alyE74IR(~~>Kp{B86N&V7}9Hu1lRRq2o+i2jF_>Q%%UEHznWK5Hq^O}D3>iUii zCq*@BL*5P7hC8+`k3eMJjx?@os9g>3p=GPJi-z;ruq}1XEmbQUmoCM_AU13yq)GLi zcFh~ruUg&M)PgqCCStsDevR7ItcokG=rlPYA1U)rg?dyqHmux$o|EJAX}GPCny{*N z(ztw=N7$v7n$=YtL#NZn=B?49adS&kYfVcl9+ODW#9>U{9NKMLbMvyQwjbb-7_CWb zI+ZwWh2}Q%hW6C+sJwe7g@#^kQLQ!(BlG6Kw`1FWZmw%-!D2UK3_Fj|q(kx=dz<*` zn(C`pwu^tva7|j!Y4fJm26Q!PSiZ~LZaSJ8TU+Xy&^9(ylU8-!4<2*so9gIUt9e4p z`j*lm5RcVqGg=wmWrrI8cYB*@LyaG-NmZTlz|lw9ta2!G@gVf6cUqro!{%G%>Xi*E zI_Oh!U_KkEqdpM>47GSb-hFSUP;D&A`-4U2=B}}+9ySV!P+hyYs%B+9J>53dEvak5 zQ9&J~Fuq?tLR-~XTfbxjs!!{SUOP8h?F-d*XIoX>P`#Av$HYFGRFjv`S5?=OGRAu6 zqfpeL(0gGk@ZcBk{IP2(p10ODHmz8)vT+?IH@PU^r=NDcUs7E|PjwjQ%$|@;-@InV zTem-bY-8K;Kmu-+J;1F;UfkMkU0nls*1%lSQg1POl{@9lYCB!)$P%L}=?+#q@PyU2 z`nC1VtE*dJQOQ7*bpwz5p7pjHj^Ib~Nq5cn33;<67j4mWa+e)iH-|)HTx-rn}&>0}rPi zxl}jTkr14`h0v~?)h!)Va=M-O5IQhe-+@Ei(xk@xwny8YyqZ6AnR$JRZ=f&ah68|}XDUgoZG zq%K(iTY1Ys1tx)$`TmYC>f=12|FHUx~_J%XiB;c@McC4dAE!SFB}JC7+@^V?%jl@X&E`cHthzcqjNJcsW#`= zd~4rkLO$)j!?hVdMqSWpf8z0YcuZZ@dDU&6aEFdpt2%Ae{%kt9T+4W!R`2ZDuKxtJ zs#9HQf3%bC&qp)1d1UG}N!`%tIJZ2Ub#w^FO@}J)K-=y7!Ld85hwMoEtsSBf`K;oW zk&DO5-a9tkj@F;0)pa{C+773I)AANn`^|D|w|5MThMrg7?F_bYbO!DC5UN``-mmSv z%mInJeF$4UF*rY909)NUjVbEJ9TP!^6_}b(*W}lDt7C)F`Pd>p=eA~TuHC?VRb{(p z+pcl7afb%VA8M=}ou0U@! zjhmWoIs7Tg*POL?+hNR!9n)PX?AAvL!H&(jt7mr~JI^#dhsGNK?8y-}P_f z(xGiM-zOAm+M!)6A6J34NQXAl^UyW;%Hw~Eo3$6bCTYRdQt(l5b?|8Lr=QjbFK{bJ zpdf*Q1PT%;NT48rf&>Z@C`h0nfr11I5-3QZAb}q!fk07*${oJLv29H)Quw!0z0U8V zs>9`uAES&xFM+kCx+kmsmCc_4$d`2Z`~SGY-~S7L|KH|wi^AXkw|sh1`1^k+-{o|C zt+ep>|IWT*>hS0L!r%Y%Jzd}Ycl^TN|4X<1Dz5PN|82faQll<^yWc_Kj;?z{$Kd}e`k+_9n>YyzyFW@N&fy%hY($U z;7LTGSwR8?2^1tykU&8K1ql=+P>?`D0tE>aBv6n*K>`H{{GX73O`|OM|Nke}sxZic z1PT%;NT48rf&>Z@C`h0nfr11I5-3QZAc2Aeey9XG#Qz@@d~M%ktu@2Od-{3W0Ocf^ z{ZOv|=i23LN0Sckeb5m8p~O5SR~j#|i!DqQKTY{Lxhgm<59Mg&ani$iG z@0DV_O~^l$(cU6O%n?E~em)^4{(C}9e7_LGZPxgw7b51kFZ@C`h0nfr147cO+0b#z2-x zMNXB3BPHo*qP!v&DG8@a62;M2I+BV<;;FK9G?GlmN@JzzWGqyXN>!AmLwHD!;zFXL zEEY>fqY3FYyK=N(Rh~*D6D5)2SZPIRtRzxak%&c#%OhpccuB0ZG#p2Ra79TZ9F0ek z#o>5asJx;)6c3jq!m)~EI$k0F+O7-)tKxV#8LOyBCd*3!D#EEyI#v-*h9YH&WLbGh zX}ltuil$4FCCPL#Dwc*5k$((z22yxM5gj;nIq- z5V}tnr$gnXp%6+`!N{TzLs@a6G#yE%Fr0Wiod~5PA$hc3=?PZpa3UVBh{a-waA~Bp zA{LHd7!iymS&>MU$BWbDq2g4uG?@&Ai&LfLCCT!17_}pzcv(169x9PO(Pp^BN|r-q z5CQs5h2rT{DxM05%1dJLWLarxB9=@<(iO4dR3scvq>IZjj&MnFStOB;mP33Mp(sYU zw_53lLB-;caB(t;(ZnkvC5d<_Q4vqXBj_#_iKNSm6D1X445Or^G!{=JlW8nxNht;f zVrfN1s#xAnt+WNJWJM}b5{;BcQlU~vEF4Zn60!1V0>eP(pv5cFC75h^Dw;}HR7B&& zSk^=Z<`7Gigv-n16>6m=SVby|OG0JQlF~$~v?QF4loeN$SCm2{AewMA8o_kJB^6~Q zrKwmX97=@3(c;o@I1&p%PRX)#LY}Qwj%u4=EFKOeBPH?TidZxm!V<>QC9znzxHuF} z$H1jH6)I1bltwBl5+x}RplsxB_-*SNNKn%nhclAr`nYx+E|67WhE6+>ut+il z5o3m!a6B1~lt-iCbTU*LNkmKI;0_^{Ky>J9;BWLZ(;eu6pMI@1k$KoYrk#tFM zI96I74wZ!CC?6C@z&xvnz)QR?yc_ zx)eJY+FTySGDE%6A@mKcN|lzDM(I~Lolcckgd!m^7`ySxG|PcZMQ3 zrAyK=taPX>9)%3T$&y$_aXb_%PN#}fDOj0!X>oBJ9h8+-6l2Yx$k;gLk$7nuT9qh` z$hXdr+r|XT1p5;Wr=ZZO3WyfGu{4p=BsOLVW)1a$9+kvH=_qz`H{6eLiPKtTcp2^1voGf04ECjPO<31c{yAA6E8nsfQFhX?`Z@?*~re9q;^9vyg` z%a1)Za5^XrYX7nSE2u5)(KlXHBq~P)+4+chXE-?S1c3Yh!I@I)j{urDeoEe-F92XoO91^S#RtNP#b+B(RH`pyG3#J6IU|cXP z=ojo1c!BPJ>woUQ@4xB40jiZE?%VFG?sM*A_?F>r_h$EM z_fq#f_jLCp_ZWAR`wO?#UFFufi`;qcZf=R2awodO+&*p>*Kq#je1b0@UU8mw9(3+> zu6O?EoadbC{K`4ZImlV#EOqw7mk^cCG$-zibp|;-9oJFqFYOQQH|-bg$L;&dti9fDu2<1XU{<1*ts<5c5U#^J_6#u{U(v7a&5 zs5GV-abt`z(CA^fhOB?Czo);ZKdV2i|5?9Tze2x2KV3gT|E0cBZ`SMe{q=eJuKIL6 zp^wvt=)H7b*R-#+54AV77q!Q*%hqc$c27uU*<~E-qp<8!QBP*sC8FLdEL$gN zj*+cJJxjG%wnmT+V%f#K>2NTq=2%ZKIY2c1f@P~XZJA8vkQR9s@wxj_7TKhEW5YBe3qRru$@?TFOEqMvg|zG-wL#t%dx&- zI7ig;%xT7PP0XLF)F5K@}Oi87`&lQVKb+fC3kmfe-pM(Ad? zQZyNi%QN_8>F;KC7fzJk1@j7Cvl7E7=hy=fQ|Bzl<4F{YZ?Nu06V4~)~CxF4_-$Hrqy zNx`NY%O*I@!|3CJ;fE|66IVB~Y*b)fST@4z4FZ=i$4m$z#Ifa|P2^YwxJ(c&Fx2q^ z>uzSp0mCwqVvOY#hXEVIFH8Sq+0mS)fi_As`GuJsDVhud#}WLp;?SY>r>npqoG!rd z9|wD(!o7T8B-)&eFg(q~{}3gUY#%LMk0nKi`a ze_;kXM=?c~)x`C`nORj_e;q_c5dUpvWkLKFODzfFH!O1qpP_27%)y){GnUyXFo|V; zAuwD$NVNEpWeyZHnPoNz+M8x(JunRS6_sVyiOY_WS<5BglVw^(y;oVLMPOgBOtZi~ zW|<~|z0ERfI40{Xvs%zzW|>Ao^I4`r(B5E~Rf6WR%t}G~+{}G-gBLjm7vF*_e7;MTBCQs0WKkw11izZV?sI;tVVzF3$x9iwG=EFyZjMlmzoBr4J) zsL4&DB0bGAFo~$yRWmbW5>fMZG>1(DaXm0@6P4L$!fm1w!ScW+;%X}}*hFCUz+e)A zHA0-Qh`?r{1zALl_D+_8K?E%Xe%v4`0Tvzx5j5O3GBAi#?_rjKK?H5BYGhy!A+IRQ zkU7M~yUYx%A&u{9#mJC3w3L-*2G)>hw}A$G2wFMIz#3AE%gqd|Azgh6lH>MJk)CB4 z*hBOYM++E4v>47Zu!kTm!|=F0RJvez+#V|93^T*+p&~tik-{Dl>#JA>_K>i9Sccm} zMY@({xII*Qp&slZ7{Y>PU=M+<0&CbqV5=c$*h3oDgBTV!h{_6J+#o7_9hTt+QJD!E z3?iB|VW=>O7;1uL$R48KD_I8Skg!Kt2Idge!jKx7LrZC38CXM*nlS)aLtt(C6t~(&uy0QUY3C+#N|Pd3oIe{ z?Zq-MgdnX07Z^fd%h3Ra5Lkt7X4(wlEw~Ir2;vgV9EK3s8jK2t5L~*m49p-%{V{V` zL6GLN3>iU8=rNXo4a7wajL8Oq_MDj^6NstZsxn~$=O`vwK#*=!7%U(fC=L?_Q2MI@ z`vj{!wALGI>1V5Ev=VGojTVAy6{DHpYSm~W2=!S* zuvyVp16u2hM*6u%H5v%kYx*i8*Xb(>tTa{-b(vx;C%8&A>Itq;^<{Lq!B|Q^m+Hn6 zg3DE-j^GmAs3kbpFlq=U4Sg}7)myJ7P^BM0V3bis7t@NqKm9B-_M@LE#aKkJtD-L? z@~-;61geb%M4hb~`w)yUeQzS~V$7$Xvs7a*f~scBBN(!bxda16p95(1G4`aNQBB{2 zelFB^Cos*JO;kfOW)ZYheI}91jos*HT-SG{pTmtx`q@*_XVA}5eHQ{_j0&Q5QH*ke zj;fatd7NHKU=O2&s68~Jm|!p4m`<>tZcHP%NHL}o>}wl46P&3TQwSzBV=}?8X-pzm ztLkY$t5{DF*xg7H)$L*=2->P1C-PV$Mn6YrdX#?duSWm&k8^Z|h zrx-&Cj@R`efYtBfa7*W z+3%>CDEl9?JId}y3`f~58&v@G;C__SsNl2Uo#18swg3L$Ih2nC4+MV>?g(zi+W=Pv zmj)LG=LBa2zYR{rdBBmuCY%Ty7_{O{U`4P5rvi(Dy@NTytYAh^8cYq+I2)K4j0uJZ zgMz+6&!B7I1}sqgfBFCPKfx)%+y3ADm;LAcr~F6#2mO2eJN;Yy>;0?zKl*>b*9K?$ zzw=M>kN1!A5AzT85AxUgYy6e|QhzbNL)gck>(BNp{W5==Kgo~d{9vpFd6_f7X@_u00SgL%TgJK7!M_H}o1J)AN8+xe&S z5l$IicV2X!avpZ>b?$I(bgptP!CAu@&MD6E&Jj+=InZf#RyuXg{?6Xc9yoI-aV9%4 zXS_4Q8R+zKx;i#a9=@?Zv){MhvR|>E!|B6=_MdS6aGia*{RjK^_Nn%XID}ht&4%=hwp>{vJhwa-8=Mi68A6xHQf3yB-J#9T=-Dlm2Q;Dms zORe**Gp*lPzp{?BverR3n^u1n*PCn1~Dv7K3hO=P2Rp3#SO$BBk+e2X)U4~@5t*Nhj8CvmQEk8wLrHm)=-HqJFp zH%>N=Gk$3tYHTo?j1@*LPB`WpyBjl%Vq=mKHO3jkjR8iH(Z#R~MgLm=RR4$mrv5Tc zJ08;?(C^l7(XZ7n(=XJ|)_2UV!5SI97mT z1UOoNqXalofFlI>r2vNuaF_s_1jq@H6(A$Pp#mHtz`+7+6yO&E93;Sj0&Eaqy#VV3 zSSvuQ04)ME3(zFM8Ua=d&?rEI0ILL8DZmN=mJ3iXz%l`r3a~_gIss}0s1abX0M!B< zAV8G>`wOt20E+}zD8Rk~ED&HH0rnPPz5sg(Fi(KF0?ZL$PXYE2V0Qs#3ouK7nF8!4 zz^(#R3NS-}T?D8Qpj?150ZIiZ5ujLr=>kj>V5$H+3ou21$pTCgAT2;jfTREk0pbG0 z1c(X{5g;r;NPvj~Ob}qa0OJH0E5H~5Mhh@XfRO@>5Ma0f!vq*Azz_mBKoek)00RXW zAV7Zs`U%iifIb5B7NC~^MFR8`poaiE3D8}DZUS@_po;*30KNd80ImRz0JZ>@0Hy#; z07C#>08Ic@07U><0Eq+X-vWFqz`q3eMu4vc_)35;1^A}`UkLEI0G|o)sQ{k{@UZ|N z3Gkr+9|-Wi0RIr+JptYo;2i-voGFfY$_gRe)Cncv*m#1o*1} zFADI20M85XoB+=X@QeUY3-FWxPYUpa0FMjsm;jFo@Q45p3-FKte-Yq80Ui+GegW6?*MGFWn2JGE45VTJ z75%B`M@3&M`cToEie6L{QPGo%9#rf^MRzK?QPGu(E>r|m_*8gQ;K_dk>C`BD6VTy= zjKnR`#sRUgt|sIpnV8c<%=o)pYDGw1%CYe3?8)xUyXM19i2wv}9(OH+Z@C`h0nfr11I5|E^% z+AMeGC4Yziua8%&I&IhP|7$$PUuWHP=Krht^x5wJ+Yxnz)mfL@`2Y0%zZ$$xdNG=R z|Nnk)XK+2f{68-^HTYHV%V1;BjIaKyg1v%WgK2oHe+=H}?-4kGj5qn;$6Nf*`;Yj4 z_HV|Q{ulaZ;5+{#{X_7T{|dhv-}ukMTl$mmhW-e=o!`y3ynlP2dGC3zdC%j0{QK~2 z|JB~b-nriC-ii3K{}8VgZ{RQX7I=Gj75J(@;*G+)_d9uZ+ZX+BxG%VmyZ5=bx!1TC zxo6^A{-fNiyB=@b*SQPvuKlj=bT{FS!+Z8cc*|aOzH~lt-gN%zJmK8$-0ob5FZs`P ze&?Lv{L2RM5m%z;>jmpk>(Bff{`0LdhmwZUqzYODp;Y`h_# zwkBG``4{{;zTp1^Z^r-CeB8X(yv4lIyZ~>+|H?efJkV@3Yt4PlJTl@J>yP5Q{af{`^*`um z=qKVG_6*)&U!m9N`{=Xu61=-k-|hF*9bM8s)85uz(w@-n!&m#)YM0`x{gbq#v_rI3 zZ8_djpQp{#inXLRRvV<@lNa@0>c{Gv>I>>)>OJZ$>XqsR>KW>Z>XGUpYOA_jty1Ty zGt`~&#r`P%#Xiotluwm+l$VvKm4}qOl$(^xmGd?mD|1s+m5O4~NIGP03IPo#kn%;} zG*Okhrjq8S2_VJe$Y5h^8m~&-k=nx8G!6)|h?twk(#2RJ6=$2qs8WwuIvlY!jaH@J z;aEBvOR!BNK}|(NU_Am=BS@2xVw;A87)6d9W79C=mQSJ*2}Qz}l)0%F&{Q&GNR5%<4buppoa6Dz^s;L5I9ky}@@X?1;si>K&0y&CwMj;eu~E9sSwKz#5{mO zoBGj=ko3vS^`-X6;e$o#17a*3MjPxAG>5vGxh_B>STigN-!MtYmF0Zmlq7M|E{R5v zg38Qcmq4XG z4VDIyO~)e$!2n_$TZ(02UoZsN!7LYHB1D%-givu@hMnn=0Dr_?K;N^vuD2vDpL29+Tzl!P)z%?zzf680-$W@u$dt;1%9 zRwf-w!d7Mu1R9AZqaiaxwkd(F1P<$gh9gK&Wn^Hcx+8}cqAmbI@+~t%E0=c1!Vu%8nAr=xbJ~M3H6_%=@x?s%_4zLr)DtrxIPWnlgRgGW~PFOQ;nf{ zh&aKXLfIx#)mREjOd1$TAXy!Q0`^FTF(#;AQ5Z?_;wJPDYL6!ZlN2z4G$ zJ;k*T)x#!~4;DKe2{TeYJXfR{=^hfWg-udDSRq(q(md!bEF$inFcS2fK`KZiX3#)L z9GXP>hYVnehza#8N+fZEGD-bnY3PXw?ZaThp{NDjgV9OizG#x};Z6^$2Gv6sxX+lR zdST=r44Xpp@Bqc2cs-Jlc*ua-K|7)*>0BDj!Y18gkwp-9ekflLWIT+Ti-;HH(K8mJ zdK{wMmv}}Y1QS|`VIZ5G1)c1TyCf{S1)YT9ibDTP(#bFqq$N$LBt)4`M@*JsRI@t_kpaEz9t}rLXk}3{gxjx)yDmhDyPY``SQLrk zA|^BycSX8ylBOnMqQYh+Fsx`iX>yf~Con;1EDTXB5@XQU9^phd!ODRkX=0L<0YMtQ zkXedK$nyqs3QY!E+=WfjWDEmcks{*;3_+3}!@x#$sBzbDQilq61w*JW?)u@B1?9yv zRg@Hslot<|u+`Ar9xz66mLdfC^^7EDn8s`p)CKM|F-A&_`*YNUPNNypBAQ&MVUEL$ zR2oxAm_nnIxQUWNCt#{$Ch0REhB<*Zg{3sd6D=GHrPw$$MJmFiIhIIiWYROo0E5BA zU2QZqz+EkDjsgZ#16>_S^&-eTXpSI^wz@eS7$|sX8wQM)H);+g3|)lHAykjVX$~eV zn#4VP5M50nd!RXxXdou60VEsTNRlbDKV3$G#Dv)oSTv2Bx!IR6Jfp{1ADV6mTG|^V zJS&1rFJQ2dc+xH6T)3|F1ThX-#mpXb8G?;jJMqgjFsnOX3rrwwb>q|ondYvjnoOl| zzw1JcQfbUN0EVpv0sFurxc|gW++Q&RJV`MZ!-=FZJ%<`#XQxe@sv*r}oLRU?&nKoy z^^^2e#poik9i~kKSUi!!6Ryt3l1xTomPRPqw}`3YItGR3HbsR;HTX9^%HBsiD0^+< z-~X$@Q{-xmMEw811yAYU_>ZcU!EV~2*74pz_f4&*f2Q?u@SgU2$HlkoFKQ>V#r7-K zx9S1@Vm35*#(Z17O0(@s|0MTX{Uq-it%}|49__z?FAAosdpVb>-)cu|?=YYJO?QpG z-Co)_c8>CyR$}aCzpKCCo~6F%ou{X~J@qq{E1VCFf9e>uU*!x*hRtX_zif@9ePkidYcxvlzo}fN%?y0Q^UNZ)G4of3G z!B@@^-Y&jv-m1T;o}~TJlbsdnC+3CjZszIM&Dt#cL2tBmCA-m_VqT?}2J@{(dysa& zdX)FLwXcOQP1LnsjeUR>vUXQ)R#$lUJA<_+{guwI)iX`gT@)zVU~Mn`G4npQ4guUM zycgUj5MAY5QcC{MR*Mww{wq;Jx%;n#nA%lIC6$Rp;_kmP!Bo2|aQ~I@guv5M@B$4k zlKZcWwbUL8x&O)-NA0Z$_g@)JRC527kyMqt|M+kQL~{R?;hbY4tPCR(x&O-0wtDHL zGK8b#{wsqxPwxIJ1BlGsf2BW1$^BP)6UyCxrI+Y5l2nR#PjLU09-IdAuk1t^x&KNx z>K%_BN>^&j-G3$E9LfDxJgP|Umf{kTyZ?&ATf;|CY+jSxf5qaXOVTry0=rVA;PE+> zRtzBsa{m>L2ee@sMj|K*Q(EAIZw{}4F2|MGhz4!HmFyVOx6 zCjXtcCih={lThyd%WrU$+<*BsUIDWX%dd*jllw2fLS*j#%P$kk-GBKdUYXo~`LDb( zcmL%V`C##IFTcQ>k^3({&+C%=FF#8tcmL&Qcm;C*<);bd?!WvLA8kl}l9R~&mmepT zyZ`c|#Gc%L`4OrYPRkE-LBRc&AEIj9{g)pQD1w)b z%H4nYC_=gWFCRfw$^Dmq$*+_9FK^^1x&QJn2<7g-d=OP7_g~&XS_$`GUQ1WG`!Bb0 zl-z%LFmF!ozdVTAkozwWBqDeJ?*8U?xkGPf_>{g-_{ zUOd;y9&zLDzw8o`+<%!{8gl<-i!LKOcswGTd^&LdWjwV&LU8|OgD!LTU)DJz7~#0A z5z5_vncExg{!@@Bs4BU-vP39%|D}I(l-z&mTaJ?ZFa3+xCHG(YhEVSQOWYuF_h0&o zS0MLa`jSxY{v-Mz77UMH(ieol{g*zci`@N}KI3zS`!9V;MDG4epAeDUe~B9@a{r}| zh(_+e^dVK`?!WW_XGHG5^gdmOn3B?aMC9(j^e&;?{g>Y1JYkKbxA}E)|E0h4CE@PB z^cIo1`!8|h#@&DE4QfX2zw|fGi`;+db?*2=!3I=fhC2sJz`!BuByWsA> zB+MKhKp}(Ycx`h3C2rBU`!8{e#@&DEY3iBWf9WZb8_b}@EgE2@M=_g}h=Q11Rq+(>fwU%G|2qQ_&2TS@NzOWaDr;f^Py8;KXW z|I)RDk^3)kW60fq>1uu%?!Uy%B6t6#D>+kg|D`MV0LcB9F1OSonfw2+6Fp=+*vHos ziTnTS2;=_$T8@!}+RD`KGW`D*qD0C6Z{`^J|4qb#{QotCkpI7$wU=%>e%Y0d$G`|5dya`TzStgk^eu3x8?r-p41!s|2+u8@!p*( zasPidVch?pMHu)0XL1(g|L?}@k^jFdVch?(JhI zREhilrG#<+zl1RE{}&4yp3A25mhk_l8ERK3%2W;#I}@4w|0#Sn-2b1<83=_uv{}5r^|DQ-0 z{^AmgPT(~1|M9flLni-!94C?gKbA1=|BvAf$p6Qqb`dlif*r-{k^euEV=$8uJac0t zmEabrbe^8fo2#{K_( z93%g~FP|>_|2{S?|69C1_y74t z^8az0#Q@3w$88qF!ZJkQGz}pWg!@n=t=xs5d>Z^ra20;>sqmANLHPb(j_SRn;7fS_ z?*y+0F9c7(bN_R2YjABL{(m9<|NlVze@Rl}2xMD`|BryZh4}x4`2UJri2q-R|Bu++ zh4}x4`2VaB|GyCbzYzbw5dXgr|Nnm?{=aPPW*C$epqpao1P3TcxrXcjC5B2ri!5EC zpVM`jz)lqZ?{w>J39;#IS8_gg-g91ao^c*>?nX@d%bg3H)14EYBb|etR%eA%?aX&( zI>k;Bap;FSy&d1tkp1p``)~I1_M`Sa_AT~Rh&_J>-kLwsKE!Udm)i%}^X-{-2_nu< zw1?Y$?XEV%d-I=IZzI>hyTPl$Gl)5GcW`5HIsRTv-y0kr9E6Mlb-}`5&!7Ss1|z|! zpnuRku>61fpZV|lulmm*x8R@soBS*M3;6d2MzcyIu)p+}Ovynq^k~h&C=JoZudd&S6QU2d?UvZyy zA9DZX-sE24UVzMjC%C_K4|ZGJ74BkpA9pt5`cHNv?kIPF78L&bJ_#u2|JeVapzz=y zg!8H^lQf`rAoB@cb&-_o;nnNP6~O*TSLLq_py%+4vysc@@!);j|gRvYgM$7=^ix6R!h? z(Lxq@3rsQ>b98@*#oU{tJ*fRm8gLj$DQ{B>EX}VD$LBug1R~-jKr)B%%X5MC;n;1E zwEjG5GHn9*=#PL8O98oukVYW4q8`%*1G^fdrI)BA{UW+J1_(`s$>>5qg=2ky(Nvf= z02ob$X#=xe+xVxwx$ z5>dVZqtYHCqIvPx767NK3}y83Hi1}9#DPSvk@)k86P^+UR@;M*_tO&U{A^rOB=m!(%R5cM(M{A^(N z5>Xigp6V@}xCz)*oaYOWy?P-Lr3ZkW!C6At)e||RdoT_42;xq9uO3W9%_m09oF{Do zbs4AjCUif}=|Ny~snJZLRq~qG5jvH#-yc|vlnyGcjwO~dfW2-A81 z=Qeb_Es60kB1CCxx9cjG%wdh{{lBz0u z1N(sY1Tn~O@R|wKl%MA{Pa^aYPVGasX@>!c-V~d1t~D z>^(V3n1pR0kLLBx0ydD-pgnRA!qjVk(fS)Ill^6 z?Thp*MqreIhWVr31;GByvGal5Oc?39bR}U5aUuOTNV6o;e?!GGNYH;=rQVL@oFBn_ zCFnnhBZ0N>ife!^$G{A{{w+xd@QM#p#k~ksHxRljp~@VHTbf3V}&N~Zk4%sm2PbZJC9M6WS$`2bk z%7$sFvsezvFzMn$MvjtUTIwj4LoQ78kXBfZ=fYHx9WTdoVXDrg{L&l?h(=nmHuG#2+f;`@o|_5FcPUN`;B8Zf3dZ0=t3bkO`A$w-`B|2~+K5 z?W2&9!!jK3C4yzm}pSLay$*DDxc1BJPoEg zS2c2!2GdgUF&VO8(vXf&%^cET(w|YT0cYgF1edPBcp6MKqOly(U{W7fnK`7vq&C-} z6Uu{WsezH>X)x8bEXUJes`3de$J1b{($y@7G?>)%_bi7rn1mhAa>#>8*l{d3QebDX z9M6NPB0p#jc`&JqE6~L--bELd8!GBu%yL8c@W$aHrNP82D=ariTs+mt@hq5XKO;w3 zFfDa8%OMFSb#*qrw-ea)Mvk&zS}H!Fqa>KPc(j?L9GIB@9hfUmf~m^qu^dl=iDcX? zM@cYI@mDN|9GHZi!*VPOiS%=d@VOwb$a4_$G?=P{9K^_jNtcm>7@06hYLtU`14oe`)6A|HXc00GuM<^YXW6v^ zLk{9rep#X%#4UpO4a+uTg0k8QS`)|Wk^6cL#~QJ%SMz%E29|B)G}UI=20>#iyGmei zD^>!-y!tDi`MT7Xy(I;YB6nX8c-JTU3;bT*tKM1O{$4+L!KbnPSFi)wRMyRS!Z-mL)Qa?{@HP3~`T*?>WHno@O;$fuZ@{~$*R;02rf#d&lXupngYs)#v#f4a^;V5jQ#7eHuf{cv zO?4dyT{c;lGEV+YSJl_nuB=;Ey)~DTN#Mfr=d!H20bH84nnPK7$3{}OzNT(uJ71zQdE;RxMSP$2t?-XNaMPO+SQHq4J})(T{Nsoop0Edy5^Rum5oc6 z);BE0hK+PpPTDiTCmv77{ksZ zH0hAM#@;5rx~BT-mF?mmGhCAvblSYBwE z+OYXnxq4;8iVpge9GK5W>Znh|08%O*kayqPDO4K^Yk@Q}4|6xGKYH>yl~HFQn}pE5 z?rFKeea z2IjK5c5w$K1*_fiWVM~Hb!3TAm2}4(ci;)DZS`yGn^#x2z@n0YDC-6u`914xHypu_ zEtduw90Lk7;8rTP75&l&Trc7`j4f+MrdfLtD%QPFqnj6;{2X) zgpN`BmGu;>9isE{79DTgu362C7PmInH`F!L6sEi2vI7sN9l2CD*O3qqH!Dvev@2(I zO9z#lZs$FO4h+_J;1IVosWHFp(RL@V=FePa-Xq^m`8b0~EZ^l5)`+$u$4KzT5192< zTX~9}?^8K$m343ose6H<|Ae-qPd{i*%dO@uv~AT+Fn}9elBdRPFLgeI39=?tce>mY zV9)E9Ho&>`oJXaJ+ECe?7#tJK5Beac-{t-)f2{Wj{#xGXMcMoAo$jH?WMAZ*SgvpGFkBCGh^2IZwG?v7yE*$f#av==$yYfqGc`Si4B8(T0+L zU-(y$KtTfk2PLpG4t4Wzs3xp!UNnF1-i=Kw@C;K^H@Bs_rEbFV=EjE7EZvQ*PK{Fg zqrkel#m$X1E9zQ09$Hjn6>tgi;?jOAZ0FSBhBze)6Pf41U)vqAoegY!MOMmt9NXFG zj*Ln&%fM&{o)Oy{FWTZHlx7adTej^|5f6ABL{gkt2rl_~c>Kn-Whm{BTqT(WKXf`Z zcp7i0TM6Oro|z9OgLiC^t6N(dtMKGp)3~;-X~QoCn~ z_$%}nSd!W8ht90JwtBVj_RBM+VDjS+-KJFMqr9{i_h@Qdj)&>Fn-4~4D^8>HtWI6r z?>NumUhUMW^WuXwsq^E9_9)1rS<$lS^n8vA$p942_B%V zI`sd$v;E*PNzY8n%z&}k0q48z_+iU^<^Km~`|(U=KDMmGQL6K+Cq8)fk=nx9{`aQN zqusdOgHPdX|2vWlHf?jZUpfT4b_br5JKO+>75>nMrxiFD6RSFXfNH-(+v**1FQrvC z%8ZBDzm)g+d-<;fPimKI%k_7(KEeI!+Tga}8pCCW8AZWG`pdzY!LRvy`i;60)CLRi z-as+a)$u_*7#j=>c2dv6+xp-7pKAO2Z~HGBXZuf>Y3*~PNgbl!<=^k$=3nJss6XVN zW~7ZJ{_*-Q{$c91h*KxCkNgdOgFe}>QIFP7*4Fw9v^nffy^lWJ-`y|uQ~r2=h~JaF z;oIK7%{`T4%yM>-G2Z)B+r=2{{oQ+sb@84+R)JfMFTE>`OSOQV;9cOIs_EWwh&Y$^ z*6RBiN0~jm<=+0vm#XH?@haFz^-xw#xdzmk-bk;nI^PS7_tlfN5uWaT<$j>utbXbK zO`GCA>prBMi*u0cmFw9C_Y(K_TG;)KdyJdWFLl@QZvy5czTRisIR!) z*tN#NuHk&+e5B8D-f*7Rk8~b(?oyv-4>{K zUU^7;&|YIN(Vw>WGxpGZgvl(j=h(Yw@7R;oq#ai7vPal`>_Ba=5(KU({m zaZ7ej8Fn^&pn`@NU zwRaF;c7?f!2X;b);#A5xhR6Cz#zN`1Q$ryu5cndIvd-jW3Tu-#&!k{G;V1(5p3bpU zD4{RmRilYWQa_QS355I6PvF<%>6E@7Z;!}$(U88csDMzI0m8|k2ZUsg>nCv(VM0?n zj~9nXWTB)!fCp5I8wZOvkw{Aa2WJ`%M}sOJfe4Y4VtRK@L?ky|gyTcpp0JL99T+Gg zcIYDVUL+k$>j>EaBBH(+<>GQY5*(>=6tR$W9_|W#$HUscIT7LdwQo6wKsy=_YZVS5 zaE>k_i&sr^oJ5ZyQx(LUx>%s!!s*i;B}uKj}(V`1FSc@Qatw2wxN z!Ew#w5{e=cTv|Uuj4YNg_T$wN1Tm%~qX2>=h7j^Fq31Xmp=ZMSK>|&rBSuo7h)ZSi z;87GrCT@#3f{1(ui7n+k5GDoTjHkBoOCYN6C4vqG2$_gxgEc|?ySSO;WJEGS4CB#y zh$fbZCfOIf1}dkShzy8OM5z>epVy8eepj0DSXl_HhS<_$3d5`|=3hDq{4q{X zApCPGIEdpU*A#o0;~@klOfoTEBtVE`ZoJoUG9Jg~KwrR#_QGV~{K>%H+vn1=sxy523#O>)LxFIGU z>%qwgvKCGUSx$~pq?a#@g)|I=W;b~3GNe67B#q}NE*Io(Jj#(o*m#6DK}f2&@vuM< ziO+b5Gew#Lgh1yZxR5jfQM*49HL&=`ST_gQH5 zF~nP1!*N86M8uwjq9wv$rK|;loW#b2vSTAY&0{F~^}P>5#K8$0JYbgqL%;M&zjPLapGF|og}_hT5{!@MZICyDcregVSmRONc;X59Tu_$* zMbZQ1Cg6*(jna|0QY|J&ap~yW3#klr)RDXJ<)#q#Z87dBSXEnKI*O-?$fBs-6BaBM zO=%a3K~qdB(GHQtl@~UL>EsuAv@(7%iIr8R2qMLFZo@+Hb$l#{z?DFtZh^-`h|$W! z2Zob~C8j;XcPOGGDq@8?#CD~y>}geR3m(RsQ|!;UHnI(eqRB7v5hQp#QGp^4gL-%y ziU^oO{SlZo9#VMB#V{n3R(YU05kO9GizCgA!Xq)Zh2<42kg`O6fZ|s1SZIRAqouY5 zGvmWYz(P%IzBm+5ZRXVwUq7YPaOTJZ5{+tsz>^S{`b$xT$Fvn_Jeg82<&m#8hl#`O z1mS=~3J*hwn?f?J@F;#jV`_zH#iODMzQ{fh(|Fj#w%~w*jM%MFO<2mdn5Ke`dwD{= zR&c>Hj9Mj79{*OJWs!CSL*8Onzw6JSgXSya#_;avqfg(y8Jk7e18U)PJUFx zkScqpX)#YrE@_Ibp^~vQSygVy4-_8}vh*oA@gA)4k_6Q%b?%j5j7@Bq;KR^_t({5& zILD~8hKNkxxaj&88D#CWmyE@gWe%G^{1;2T>_5n2d!FP=sKhGgd@xj6UT!brPCzyb zxd3vCL{^c>QrSPPrjgOIQnn3>Zz0|in>C~Xj@WJ!tAJ7{yogjff8(mdQmi#xLd#&@ z&ACzTz?M)Y7#xY6#uAJXr1OZ}m`vyIA)&CtX3KDl4eoNbBnAu>j*LMuoWqZ>i4#LE zvj+38^qDCHB%Zdyk&ms|e3m3=rD99^GPyK~{KOB&2H)j9h`m~=E7{(YY#{HH#pW?-u$Hn< z;^z|c)SLozT%NL*iu_NzpkzU_)RvDb#8ithO|fd*k{HgKq8Kcb!9Fs%C=#fsWmwN< zHRX2rMLIIP#19Cx_B6juylz`MFou!IN|>9c27^6BvivL=(bkp>5=)Y>U1&YQPYq+T zm6h0MkIoFymLEimfl~=BPT4Zh#(1{MdPJ&5Rt33O*!eDZE^ZOU-rx#Z#yqKYn|23?anpMMb5cSgL4{o`cHR`bPncOgm+;{@Nw7?yftwR ztmdDSs7sudn2#BQ!xN(uBN77>0}|b>OA{Ru@q``!8T$@Ch`;WX;&lJR@w?+U#xIXw z5HG}Q$Nmw!DRyP-f>$2!ImF$Z?2Lcl`j7ed`M3Mm`Iq?1{S4bfm;-wV<6#eBZ@# zeu4)6zIoj|V;(Yhn;Xp)=6rLGsW+#a6U+=V(Tp{t%$_D`dYMk9tTq?S)0RC7_E)>A9pSIR@qYHc_BML!ycfK+-hJLG?|SbtZ@HKC zs=brFIo{FmDR_Xlw^!-)_qux>yf`dO?BMuL#QxF#+& z_9A>b7Ksb;r(~DGEtl7GCi;Z)>O9hOpIz73>Kg@oYR+N<%+jSBRd+81vbp~y~ z9}U|*{llauZV9J1-s_yZywc6_ZJ?IAr*dZ4Ypu}yZTc63*`?$G&f}pqJ9&%pR~+N! z@+!kxA;eTFn8#(6Rg}0fE(;&UlzvT3E1#OP%44B7I2yv>803~(Z7iJ zmbv)Uf`r&$EwdEHpKy5hyd;22s$hPLNH*SEL{gMn691d3z|sGrU&3fI%4*#b{O=ls z1i}uh#v~5eTqQ%nErDBg`4+vRCAhfM5yh-U#gJgu^{CPQo3KT#OeRi@mQ*i@j z=3L(*riy)@G=p|u?!f#mGQpU;^AJa4=A}|!+9E;?_<(O&kuoc3M9IdlC8Wd}C8=PX z*?FE`uh^C5KxjCXx|oY*i{qS^3}H(wI=6j<#KPYaYyqPRFy3ri5)BPlJVZd{Dor^n zrEoGI%o4eXI)GEc$aZ;zClbkhL79zDEFKnOv3N2_K@D-cN?>VmnZ?6{R2eM2+iVt^ z-Fq$ILfKL?rz9th(Yr*%O+R$IS^Cj#qKeD6ZTLefzaN? zjRJI=3hZB%cxbl#VMJhYxpRdih2?&?o5U9vyR3DA*UMAZSc=DcgUYx@M7#pGNJLWp zucKejRx8zFn_6O%6;-CTMa0+dZF+Ky){T-d_V+-yB(2&TNl(OX!um)wX5^!5Y5mR#(8a4@Jd4_09K-OVlj9;T6Uwf&NrK>Qf%*p7)tBVZ zQk`X7Tkv9F|0x*a44cIIb_LfrVoC#uy$6ry*2*6XebVd+rm9vg(_fOONY&2iO z#F#u<6|RN#BT^6uSDew%lz5p1Ck$wke{r0F>EaT56*ptjg&BV2#)P@GmeY|l&&cB< z!f}W{M5X4u7>FVIkmQNecBqoPofvLRpn9 z{U3`?DeFf`zz)Ae!~~_+uSLY%!K2(1@b$!lEsU0vNr$VAi72>Tm_aGoUv(5CZyE`c zBLzu|8QgL;T@sXI4O13M;8mw2Wr6c3F*$6I#Nxn562nca_-VncJ33R9q`)L#iI!PK zc=jx>v`?ca#uu*Aogn#AWtHx7vj4vyT&*X5V0(P8CZ0+>n79j;|F2|we2t04i4zmE z6O$8%CiY7VNt7mfC%Pnx5iDhkYuFxNI(}CCr1+fp6xP{? zLuW6J_hfr~2KM;AhdsXc!#Behuu{J!ygghQUJ+ij)gs@V@R;z3aCA75*5t$8!p`9i zp&v$KKgGU|ZHTRly%>8uwkEbJc3td}*s@qARufwkn;)AVJ1RCdwqI}e>!*n#QjH|b>-u||JQ9q{d)wk-aX@y+Z>(lgn zJxw2}N9z%K4_%^r>Ya6Kt<+}qmHI%v4vqaG*4O{8R;aA1Rwt{uYKl5c?a$hJKh;gO zSD~`7DEPVezW18K=<54>^l`d4MHqhkYHzYP+Ux8W?6vm2_O15S_Qm#6 zI}IBUC)vl^lkIW#D0@#kY42w5Vi(!)b!mNPeQLdHy=pyUJ!IWu-HcAz@=w>1mr`~B zsO!ilDX%oRb#O}B8s1{-$R#N|0QBnMle8@+54}3LB!v&!a$QF*N!bCQs)J8bIB_mX zn!4S|Jtn3IO3PIpe38OEYjLrzV_&4?BtzA~8EFwY0QBnMjI=G3VO0lTq;S)Yb<#Ta zMM_@_UDpMrV+{yCLF>fxD13_`SX_@{JfiE!y(lI!;DNf1{EM;!Kvf3^qqr%Soa^9K zw1`H?st#U7;kXrF%sO}yg)3GpdDg*^Xj=@KbRBsQWe0$|j-7_mWU#7Zuc3GjjpB0B)owa1W14ghuS6iPtLbf)%bu01Vm=-SB$ zW(R<}b`nH(0H|x>oET2)G5c<6;hwkyHcLRkQng1>Wif!!wdA50pF}v`t%YY|^g~Ps z>)P=U*#V%gCC|iIyCq-sheBirfNt$Ls%^2Z9YaAh&eOG{A+iHNReLasCkKFTEqoET z#uP^Ffz%LKkI=RIAsIUW)U~5n#4Ay?@HPxjz^N*?mR$p*Ht-D$2kUSE2zy6}BnN=H zmYoBW13+C1r@-(}On!`ODRSA$;NTWZrKXmDRlHcHYj;C1I{?(R_yxiFGkG+x#cv321Cv#{ zR(?bnzUbPn2xSL=x|V)VtTwA!`1CCz2Y|3gL{9_%hO&a9FcQc8@!M$64gfJ3ilnq8 z27^8nPYwWe4Z1yfForMP8uWUwNh!Y6HR$$5~Kwt@u04uXTr@f z7OkOYLT4_mQZ@8Uq#EiPum$dkhEp{l3;dGMn``i(I9ebxje+!vUbK0iCqRpuDo!)UcCcUKTVp;1;|)8b6pC zG#C7=(=xZJL3Gv%r(-8W2u;O<#&!d9K0idb|aTTGNDs(ky3%`4ISAQ%-b^xfVXH%KPM%A+@ zo*V$0>Y4OP*a4ufCURp3fV!HS@SE4ghuaR4R)c0P1RDJh;cMf=GE zfL=8S4PRH>Y%C?D%@L;h5Gsn-J$3bH1oO0xswQ?L2Y{;jAV}l@P*v{_i8fm3YT`F` z0H~`+L1YJjrW*W)eo6Z*boEF|K@I>_^-#J$902O-y%ER`0Cn|Vl#QkhRP_+VW4i(} z4Mre40MylcLZszOw80<}u?GtxND{v^H~`eu#FFd)P*+!RTC7y6>N1o?4ggg(*szEk z0P5-#qR}rY5WHA~PJmmLAP|pQTBWOtsU&g$sH+E1QgQ&OsRy$EKZOohgl%zU8r_e) zc%z}w|IqER-$hdg#KIv)9O!>-F_o>k_mTfUjm`(g#tsQZosazgDe8MP1*)m*fra4q zjd~vXEf^7BPmlykRn!Hk#tJx@|I@>ei2eU*^kfu^udt?`%#(ncIx;WMD(c4|*p!QI+`6Q~MHg<30?~c( z)yEDrbY6_9XcL2`&dbXw3VpW-WK^aqNx*(RuL4g9|9`riZb7rkiaIsE&nb;QjciaS zHTP-IafzZXP5%G1^k_`|Y3k7I|4&nYX8(V>KWBy7s{2tGDchB=-NOdr>-?gwQ=nqMy3%0g3(p>F$u&|DWEKB;2AzccXOFoY>e5 ziKbU{7m6kSe|i@Rqp1wjnc9XI)paL|radHjXGrY-Pwzw$`Trx+)nFs^(hdk>|9^T% zNbLX5wC7T|ueC!U`~TBL6ixpB%nlq)6*F!5UEl$#OdAfRWq#cnN!kCOZbg~M|DR4k zV*h_S4vFWxG`_ER0&H#Wf zgT(&-$S6Ac1#P7<4vD-SMB9i*r7+2DQ6Rp&m6bY5*=Z__^#8rATqN;b;*-QXTUYF_ zZn4HsEB0iK|KNYI#@{BP;#=b1#6OC!i$C9@`(M?vT7N25>!-pJ|AFzn|@?-+)m1%3YuS*NEx_gJOB zJa#^I+t*^1UbOv#W5cmZ-#@l%tV1jgUH>O|Em$AC5|TX^9nEfod%AmqJHtK79qo>E2e~C~FSnE1#?{Vm z&UenI&b!Vl&Xdjq&Rx**FL%y&3QisNcFcFC(cTVcgfqxVI=eZYoHo4L|GoXGz21Js ze$rlJud-L#m+@-<+4jlyT>BV%ynO(yK9<{k>@Lvr(Yvi5tk10V(DR?P?zir+Zm=%1 zR-gmopUNVdKC5LaOI;o-faL~@In=8`U{zigy}m7mdn$`g4=%*wd=@>OhILh?CX1eq z-#+bFSDD2~P>!W`ojIKn(1MN5oCXmi1*oqXe3pw!vFxrh^bIb<2e(pX@DVP;7qLud z=;K?Ck!Mn8=1jEFx7^>db6PK+6z1GYcZdfyEUn zGZV#P_B5$7Ga%uEg!oKp2@&qH-j%E#t@k7(;50M^4zb=fLHNh0M%xQO)D|jM@5NF zQy5>BstowFh?gfb;M3NWj@T4R2sk+dIz{VZpQ_4$M4?v}m#7R;C(d4^ybQP#UwS+k zsI#aF!+MV#s80dR(>6YCZDq-4OI&@S*_Wx$<9__(4Dpw1#p5+Dzl zvk2Sba2GHq)S^T*8@^=t8mTlo9Oh^6 z>eCAmh)-H+iI+x)Ym4=Cou=-F;c6wKPau&Fbg1<4ba#67>Eq}|&|p;>{SL!~l1iPX zZdZx}E+smR9tOP|HBo8mVl>08(^C+@q|tv1`($a(4o`gP(oEns!FBDLc;q+^k_uW zA~VXua0~B-MnUO=AfgxIWWa;$2lo{j5 zq)LxMDtx!lIwKH>$G{gnJ)GiG*x+f>!VOI-#wHCXL?{Zb%zjb(%&aysod)G#tT} zdeBjtel+-yc&Z6a0lGp5Xi8Fk%&b)ErU4MK0UPhPsXyY; zElYJ1T8f4*CB>?#F9M+(A{tGGUm3>rO=z*UhEZfAe$J>5 z&Cr_0a*}Z_hr-LaG};5M8@cz;0+?z)TkSXrEmtMw8S)krAV>D z8j)@wnkqxxN=?He3Wg4bmTdrKp;)SY!$~Bv2G_8VL^|K08%`vVHu0+l5LgkuXBA!p z_^WLNbohqjDVB%q4O1XiCM(dT8i;#1QM3dFBKHH?IW{)Nn7AAFUeT{R4+ zTF_1&-2n1|nv1cBY9Q{Rv9{Z=H`olyXv1Ed4x58?gY-Gv+B5|GBJs;Xc6xbG`zWys zkyE#U5^d`tqyY&^`}s2v;eB>xhK$$ zWL-}^fzDkP>w4-5yqat3(G$>ZNcB_o+!erUsvcbdzelLY_2>&l_(fEy`uQY5_w(xK zp`$?cGxf(&X8I1{_Hz*p4Xo1C&!JG%zpTQmpMj(}W2Ne+Bf1pj)dRWk*i)$< zXxB1bPaO?YsnBQZsiT!*mk%mR9Sw7n(8}v4p#X3X;?d7QlbCAO_0-WYK&vb<_2^yr zS`f5 zl5$gzZy70JSjpA(+{b7=Ti2tHL5qVLsp_ed(JH#GM<+wOq{GjF=>ec=R&Tit)p(A3}FX;wkXD22(KY=+X6iLc|A<9(WK$%$U;y?*S37s{)Nb zkn-`SL|tD&DN>mJ*7cx2^lxlh)Ae9K{7mV4QP1Q@dm~JJ3FYHG^17ag5OdO~Tphg& zG%5yJb;qE_^y@Ztcq>HLIB=!v@GfWwj0GvY3XB;sYohDu=Z}>>Z1bzbYr%8iOI~5> z@LrG)UoEVYfdPsz0zkQVMNkqjm0U+-5}G-Oh<617!Oz*$feSD=rlT>cZXD8r=99XP z*nl@Y={kCc_>xgJdU564Jar&}_MkFM>DA#KQnO-+Tem+KfS+6)y-a+5P!+sPP)MrG ztHY~oi{>|VczdWdozGBpL=qJ!NY&x>VR(okY#rVnSdX@m*5UP`dKmg6Dc)ZZRwGa* zc%rBZGl!;*UnJ&RF<`Hw7fFPVV7y2g@=xK5(Js+C5lg6q75^2x2EN6EPsP{9AB^7{zYCTD zZj4_WzaoAKW)qgho8y^yJ-qv!4*z~9z{B56oCBDMxrMRt^S3WN{SCq1f->wb=!5+Q zU9rQUeY{OPjAM2M^9?_T--Ta=pN1R4^*AH&DrO#@4j&623hxW=#;${#!t25-!%M>R z!zE!3^AKl;r-lo{IpH*%8aOOG80QA|hEKp$*f;EfJqYc?R-wVH#AbK~{35n7_AcxJ zybya5CkXD1-GSMOYhst-6v2{M7Uu{S!ydr=*sR!;*pb+iZ~*)S4vtmCietNDU&2oC zu^7T4!0(u^_$K%?_yFe$UV%-3$ASmoYwxAHj)(J29Vet^aq-Xe{+} ze!YLDe~N!R_AeX*tBvFQ1O1Wy5O`xO!7hef{hj?HKkh3(VtzK8%xC69^R{`_JZBy^ z4`N5d?dAsTX}H9khtmjY*a0}*EQAe!8D_FM9F`yV!|sMbrp)xmxr8pJgK1*|qqq(eV4vPU#Bm}Zii($uN!bqVUa#TAFHS83Hnfdklsh{rK@yO z_klNwPB^cS&{{{;FX~&IS=gZ7!I_2U)f3nQv0ANCH>#`ErRscjE_AqBb%r`g%~Lbg z(dq~_2Kym~t34GCSYx)NtLmuQs+e-U->@&@Ywr{6j9BNr>^*~%4EJN^Mg*DhH2hJ?2|ay8--I11F=`4FXmA?d+ohe9=tYT$HaH;7w$&)UH5hO z1@}qJsNCz`;ojt4<6h=o;4Z=5i8^;Nc2CTAXSq|{Bi*s?0qzKQF!oRsySrl-#ZK-H zZs>Z>@6J!oH<)Glz1@RV_}v%+b1nw)CPx18wA#c7&J&Uk0E zv#&GM*~2My`Z+zFU7Q`A)|h#*?Jf5A_LufYn0z(oQV3j9sr0)g`d&J$Q6uv}o7z*2!F0_O^xBhV~R5XcMU1TgnT zuQ(%+7HATH{y}jK0`&seZ$g2!0$3HMzp4e!7C1}bOo7D$X9%1waGJoW0*eGr5ja`k zB!PtjCkiYOI6>fef%yXS1dbD!D=v7${IBP$^I$P%cm=P%4lTND7n)6blRx=r7Pu zpszq5f!+eU3+yJ)OQ5Gf4}tCiy9#t8u%cZBx(Mtd&{?39z|I0Y33L?bAh4rAdx3TW zMFKkrv=wM0&|09CKtdoc5DLTu0s&vZ2xtK%;0d?_j({y-2}A`V43XajeiQgrV2i+J zfnNlE7WhfvM}Z#%z8CmT;9G%B0^bOHE%24VmjYi1d@k^rz^4MA2z)H?k-$cQ4FVqu zd?4_?zO~SN8oLNw*=M+yeaU8!0Q693A`%sionYPFA2OT@Pfee0?!FNEAWiK z(*jQkJSp&mz~cgs39J=(RNxVThXo!Icu?R0f%^s42;3)dufS@7dj$R=aJRr+0(T1B zA+So|c7fXjZWXvi;AVlF1a1_#LEw6Ul>*lZTq|&mz|{g*30x^~g}~(ke;2q+;8KB0 z1TGf1NZ>+&zX@C*aK6BK0xJZT3oH{@DzHT0T!C{0ngt31d4ZfjRv;sg7HAS^6lf5r z7pN1c6{r!Y7C0MziKEt8d_9w|i}`v6Ur*=jX^w58r_yB+T~49P$#gl1E(_^$B3%~H zcQ(`6c6rqbmYx=f+V(R7(imq~P) zNS6t8If^bv(&Y%c98Q<9QwX2GL~?x(uXC6ni!MFs(t|GD>9Q+by3wU8UAoX^ z7rJz&ODDSQOqZSL(vdD5=&~bS+S8>SU5e8aBi$@oiE)HF6x>zuLVMzZkxSb>3JZ~mWbRXf3@%D!;z&*WkZvgg+clA2z z=k(+HL4A+DUEiRu(wFG-uxmYyEq|xuy!ml@22PwGt`EV9^I_2Le~5n-|2Y00H2at0 zPh)Su8ff*m#IM6?{tKbe=i?1H9k2-6{IOnJFNXE$-(Yv(YxfiPeRmyf4?Lp>;naG6 z-Ai}T9dsKVXh;33e!xEXkJWqXP4$v`T0N@PsJq~A;5v1=x=<~{3HAnc7S6DrppL~U z_6h1xb&%Re?WL+zQuR^Yv2NZ@C6rcC?-%b|?2zB!y@NgS&wEdJ4|%I`ru|0mYVT6) zlt0&lyGg90pM+V0)#0k}M%WX$6f*?phMBN7JR>|QoEOdvkH&6=G2#B74+r3k zLf5ck*fxy8V&HGFA8}6M6YN}A7kfGOOl)oJ{@C5ITVpF@SHv!gEr*?fMtD*$Vbe5=1z07xz_w0ryiEVPGG$`)0|?CH?z$# z<|s4H9B4+GA*RxlnBHbrvorQa#Emi${j=VL{ShDPxAm)-Z~83pVdCw?tC(wg9Oq8% zN!*TkrmJ9K@;um!NGEC%rzaLBj>G)YWLS+j1Se32B?iIHWdB4j%qw+Bw81$P$6X6w z6L(|R$%Oc!m>Jq9zE`{|p2VzB_jspxJJ^cQ@o4x9cA$KY*`RmA*I+T?iNw#aak0|9 z!oA2{4m%f(?%D3C?gDp?JI$Tw9_AkGj&k>Q2f8Voe&_+47wz3vu5m4AGj>OO;cUeI zh}WGLutVZu=U$wIxC!>)5vph}=pphBQrpiH1tASI9#C=nfhuncSOQUj2!s2(z;6P- z3Tz<=+z$la7kH1rIBNwS6?jD8VS$GP9u#;$;C_KM0{02rORybhNN^yEZ{%{j7?<0{ zxZEzr<#xe_Hc7(mVq9()<8r$ghug(C+%Cr9b}z7+UE;B$e`1U?n`MBrnAj|4UfY!LWRfZv~S`288D<^8RfxOWBK z5qMkRErE3cZwkC2@VdZj0(Y(<&<#cElFBZa{siW+&}Fo_fI>@{nL(e|FomrKkX>@Pdm!}(~ffg zgd=Y$tfhahmcQ;1_=mvV1cA#b1D8_YPfn@?q1(pb$D{ziLvp_*0FOU<+3S$;8cM{0;dR^EO3&*LV*(n76_amaJ;~Lfq4SQ3CtCkBXF$1 zY=Kz8_XL6aoxryOn*_cQ_*&pAfiDHV5cpi+Gl5S9J`wm>;3I*J0viNA zBrwiufqMl0A#k_AT>^Is+##?^;C6xA1a1|$Mc`(En*?qYxIy50ft3Q+5&XyHslZ)N zae@1;z&iqO3%n(;PT);}Hw0c6cun9{fmZ}x7I;bEMS&Lto)>sd;8}rZ1fCXnO5jO> zCj=fBcuZiez@q|>2s|wCkidfi4+z{Zu!bP!ZVvqiB3C+L1nb7vW7T+tpY_l7Pxi@D z-C_Rzumn`@_wl>>?fjT8`{3Wh3h`6s0dp5D)m;utbp=z`a^n5)mJ{#ArY9`bwJ`>J z;lJ0P>h2<=yZbup9n)==rPF ztyt~75No{+Sm|AWb>4|;tlAg*;mcHS)kPJlKt;SCywAM%pwT~r9r5>gw|G}!NBlWn z1Mi5R=}o|n_>tHVpY(d++hM1+!x))-8DG(ew}+Mbij;zmb=iM?M}j~ z?I^6-rrh1w)*;51&bQ9TIQRat^Mtd;Sp|QFmpRL!=~X+YV10IqbC|O~&b^mAeWBmA zhj#Zr|Iq?QH!gIdR#Zjab5-Ms5RI}g(~S!_(CY1|#uFs4PB$LUfzfrAYMjr3ktbE- zJV-4o+Tmm_=~+iNMLDT`s;iqKELvlbGh`XG$cck2@7h{O`Ea z0FHM%>r8(Rv_h>j{Um7}Zq-+k{?FNk;# zwJOt-B;)qLK@OIjK04E#5*l|`RC-qqv|=jLO%is+i4Kvv=}Z?%xHE3Ki-50Q4!nGO<--j~@?0=uY8dy(+;?IgMt3MvvY#KY|% zVryh-D@o%z(?$Y!KwxVLY=hGtA{F7Zhe+*k+Cvg1P*5l$jL&9b67P7KfO>}MfYTlv zt4tq$l2sR2y*Z`gJAYo?w>k#KYIM8`jXB-Z+_jXjq=D^6OI%9EQXjO_Bz9qW2`oomj>nF);NVggo7e`+bYeBW1Mqw7(}w%rqW;>B(!au1(AeLAt4iv zah_CZA{=9!A9R}e##kGCoDbnV9W9*(-=J{oH3vsUB>Q?~XF4^`XDUr}Y7CeyO>Bz$ zOh6{4Q)6{kD$R6iobPm+=oBTri;|de3}!G@dM@X8p4Mq*9241OsWdT;F_BMHng|EA z`$VUSZ_wdlC?14EC2ce+O^k#1M{(4IB@3rGKsXfkxJonQnCSB=O^k!?gbESiAog38 zX1+1bOFBInVQ9hYaqCGE{SZ!}NZy3 zk%$xRvRb8yHz93OX`)SItaUogtZCc;^=8&I&U0QGtce~tQl~+hRLnPM3T91Xy?|SS zH4$o$#4VXOG0BAN%$vq}2B%;+KKeG2GH)8^3)G%@(>V9)H1Q@%-H1RUPE_f3oo3!N z_VHS!i8m2=BM#9>%12NV^Cl+Y0+nXoG_KKU=1thpQ##GOiJ3dpgn83MUeIagO=E?q zDf1?VTs!MD^QLir#;YXW#H}925gfi1<^ffjXcK`?L?Z59khF6xq;i(7fz+3z$nTK4 zkz`*DX-Af>f)r=zGDuX4c3^49`GqBThj6~;*c%{i3m3Q z&{oEtQ=;0*I=9JBl zF#f?K#2_8Yd2oCn;_S!K10eD9M}CFG&mZ{!5Tzxvb+?9qwp7!@1X@QLTqKxCQSs@++t80_j^03=kjrm;=v&^bQ4DAqBp~fpw6c;J|Mwa18>L^$Vm` zBsob)D_O$tGjbVA_#s4AaJtQqawJioi_~z~7D$UY9bSB79!b>Dk!dWUB_l_YL?jRy z&FRofBlP?#vK|tiANNJSk0dz^{XRnPUpeT*5qkg1K|hP^z!Kh3#Am4&o&UGpnPmU( z^Thj!*Aveq9%B1{mt&`Yp~YrDSpXQ#763}H^13tDUC9E#CamF%{=@-8! zer~)menxx&cIr=zkHJdpAgsgo!p{8GaWC8wZVEqw4S*NPM<4d!UyJ?s%ffVcCam?( z4ky7{|Gwdnuq^C@74`NlRsgy5JI60muet2PeVW-(*<(6Dt6HVC}C6yXVE)-+HWz zKZRBCJJ{OaKkf8S!R*HYSP8GdI(Rp~J?!+`*dzZXtN^@Wp2h0-Jy`p`+FWGLHBDIe zUTBUrN1MaU0cNPFfF*!ku^&E;-SEHYuk}X#7JTEag~h+y^fme-*aB$OXXpibCU(D% z!QS^hvGctbTl~}5>##|Eq~205sI}@|b(^{de)^VS0DBhpxzE8a_d~JAeQ#Bv`oThf z2UzHLv8Ul{>}Yt?d(L|lyBYp<_G5uJ3%l9JU=ewUSLXHcx_Cui;6>aY+|RJv;x+df z_aXOg>|Vc;EdtcDMSz*^1ox1Cu?Vn(>*Hhn-B!DQYvAkQI_J`s`Hz#GInL3}p;+S{ z>Qv(Q+TH2kB(S~YXY5J;(0?k?fnyv<#~MWFHL5%`2!uIFm1h+qwA!dVs}P}=QF&G&LX2SZtU`p5 zk5!&j2$XWT%JbMEgqyQGX%Gk-ukx%wgkH|eLxG5zaIDI+`Ve}@s}5L(}>94il@w@Bq!c?hEsm1E^0v^J<5D-U6Gv(Az75DlXq zs!Q4f-r#zjBjo|reF%lK_7Hkqa7)r2(186Non!SOwE7^F)rZhK93ra^q16u+A@u>z zaj=(z_JHSTr*f=3giwZZP#&UDY^u>Y(j9Pj7dcpY2(67e2ju~Q-c*#x>O<)Dgb4M4 zLc5`&tU!d(zo{G)2&!^tm17MejJ~UKq(R^XZO}PVAW-2RuF8=HVZtan2`LbGDQi>? z`U9%rBaGAs#Nxq7d%#^r;x4Q{VCRU=k@|pg`np~Y`U9ROu5+Y4Agm`6LVZAPZ@kX2 z{t#MS5J>t10{iJ4s}G@9g~nv{A@mj?p4Epi@{-Dt`hb+9RgSa=R84z1C=a;JV4Y*# zA&kC-1|Z!5RqKk(q&y(Y(JIHfL+Bl*a?l;{G$Zjeq&lEc&{tV=2)z+H$C^Xvor!W- za|lUY$&u!OBB!HBQXS9)>s5|42NXV5=U8zFy$Ylx#Q`a&L1fJ#v;$;f%^~zA>fCM; z-ye1F#dRN}b3G;OASCP|WzJE#?kq(=SGip!Y^KU}6X__G>&lX~TIIU%9c0m|! zeF((PB*yr+)rnHZtk+a-XO`SaI=2%?yEAdajuO4e%XOgY#0IO}j*>2+bL}~u^FGqG z<3MMN$`whpuX8(awDm2z1F>W@=0JZ*je}sdOcAk#Er;ATnQ1nS&qpv=6rF=fWwI;FErnK4Yqt1MGy z%xzRzrp%c8sm>B*;`SfdI?J3Hi~MM-EI5-2{Xk`zG-K}3DodnkV(ynJ3(h3zGnFOM zg!F~Z5@(_usPb7R%>ZvJOQdN6_fwT6&V=-p&N5{NXit@8$_(f(M45<2+02-MwX4c9 zV+M2=X3W6-LS>mT1Lqr+1!GckGy4g}$@MSa_bVZ9WUk2_5M`wvI5&xM{St3l_`W=-e zzJ&Cq$`V~dit8-1W#GPz?97&dI}^7gwnY3JI!k034Xhtg5ZDrd&Lb+zbQw6m>n!LJ z(e93}$`W59PY;!4x(uAJRhH-yVK3_}vt{7?;OZ>1WdN#IS!TXx7JxuCgmTGq)eKD^*wGyq>0c;s32GqjoZ=aERkk3uqWXD#G1HOUS)|i zA?0+II1_oY$WEjQu?^}^tO@aGv@U3qL^x^65^*Bed0rO0iPt?%XNfftI~xg!HX*h{ zN#IS0)+SG9i8v8D4Yz0J3|v@=Cgwyz4LZxj894OnnK%QQozD_+q9tBKQN*0ck2R4j zQ)d9*+d9kC8Mt;El?8R;Niiv(CFVrZa}m$f8Mv65&4M}+>b#GqV)6`}jWL}i@)PuqQ)uA)7V0cfD9Swy zX^BIT_FIH9i3V;Iw;&QlVaw2*U{Oq>NALq?8ueYRvP7epSU*o?nMHkfh0YR-VyR;} zIt$S#qMKEgSQJu0Wr;)~;jI#fLdvNuQ7ELW$`XTO9b<#af`-9|J65h(7BL1C5|)OUCEVC7qqo(4l#EIIh0FoF8kH;85e_1zvi z%LM8>U*pM`Kz(~}on->`X?Y+^1d4l}q%+K)e&p9yD#QHgyJ=X-;^^p)I>Y?wyVEg$ z&;02-7$RnfKT*5!p3V?~LY#$JduCAIU92<2pxAHz6p|8!Lc}jJ!yM{c8??$Whx%~; zogofI{z+Ke0EuFmrz4hzm_&W+H5AGu>SG|6AreK(xmc+n7KL~+M558CZ+(sOiASS8 z=6+y%OG3X=D#J|b+h@ZHmju$H26L(JhFGa#F7=&HV1*0uXp~cRhRM{oHsbk+OmQn( zm0&jYF*luIHuYUv69Jo2rmi}}Z0h5isWQZ-2*g4Olc`UOGeo8+=xD4bFq`@o7Bz@X zkr3-BOr}14?=v7%v;%&*86s0eAEPqNrM}xuWtdBSw+P0(q{P{1I_6T}#o`EYDcWNb z7DtFoamNmLUS?C@orb0-Hbt59REEjar!^uXQ-m#08RAlO+jm1fJhIt6GlCP?{q?Tc zbsxu``(M;ITlLV@*lT|kR^iWSS%sgaCSetR6i!+v)$VE+UWJch75;Oq!oTW0)na@8 z3hbyac=g_C-to{2{#b=idAobNupS!4zW*=SGTn2qKffBgv9G~i>?LlKduGc_#A}#| zcsOx);-(f)1PzHZ5(^SD6B85Tun&B%M0uibqFbUpyazh*U*ccKH^kq*rT!4*wudx_Vh2oj{e256LH>uQfypo zU!3(%#dgC!{HZ1+On;(37Q6F@!1;A=?8s=39T^tp zB)&2m;Dg`=oY`N46ZlAO0YC58REt2g;s|&-DBHb)4&X zRIi2~f@@%*a4Al7oTX3Fb9BqD43|6soZ=qm9>bmhhPhSl0PKa|$!!fQfxp8Sz-P|- ztyThWbgp14f%VSm&I!&;XCijKkHWt96n4Gu0&f6dKKKOu0{h+Hz^uTd@CR@kW(6*_ zm)jYe>;%rSr@&6&f$$1gWe>1!|Ih!o&Idribg5|-#e8050lI!Gy9x815lojt- zY$CeYQqA<6H3`i0G}BKO3CHVZ`o%^Q(K8UuKiP!U!E44(Hfj=MRWtu$6FA$_OoJa( zq0wvJpCdb{=KZ9&_NtjiK8S2q%{=f)csHtM8u;KA15`7Odl36Ap5tDUFrm~;!yZUV zHPfgEu}7$88uXZiyGb?Em4!;pt!d+TN%@+2^jQq4T%NvLCVGYxsL+HnMGPh%e3 zZ-i>5A&*H!epAgf;z2oURWl8EP|hi;xl*JFUULOMh^?B-C8$z2mqCgqFj=6QOC@lT zYEH4FW_is?&M`zamq^e=-CWE$tp1j69w1^LTQ~O?u^;NykCS=_t7aPNpoVy}_6Ta< zc3yLDF0i+1reO}^AkioXwf{slV~`V#Ca?n6Ok*6x2CA8cI3|JVp=KK4KTi6tMS(2pqc^`VB9)F6_^0ym`y8y0HY?}TNQ}^kgT8zOn-40Z7DGQ#WC?y-~me< zgNp*QUmVlj1s<@(L3#zIzc~1+!1NafOBFzWC=b8S0`p(oTH_VKf4JF1Rbcvy!>&sK z^oO9sRDszqjxB_R5uDSxSQVK4;@)+t!0Z=~UZe`le(|W*1!BKwT(!4Uf$1-feTN02 zKNANz7MT6w_!tz3{qSg4s{)f>9M)$FOnz|>_I#QA;@)Yhz~mQKd#D1FUmVlg1&|-| zVotxn>=*YgR|R4}6SsU-VDgKrVy^)5!*dv20QaF*)|a*_F#E;5YrO*453#dUfw&J< zxk?p?`cUvrs=&+_$AGQC%okVvy+R+(P^1cAK1#NOE)ezMOlb#C6`1?tkqusfxX;AP zb%Cf4jZuZhVD5{1D^-EHFYaBb3dDUVrbHE(`r^(iRUqm^U8+=pnJ*r_P!*W@;;N@A zbe0@Dt3oG{2B^Z$B6U=SokSX@3LRN;ZdZj45;jN`c4Wy8RH40u73o4dNT@z0rV2$8 zI9wH&VdIvi3vD^t`qrpI8;*{4R)y9qdALg}mR!^(Az_WG5NF96pbH_SXx#f2<-}N2 zaJf{#$OdgQ98Shqs8j_bId)J5&62l^E-1;{+tvk-Mf!9WT#3I`7aR%v9c9}h{-(Tw z#YHYsg(xS)+C(8DSth9bSt8Bw@@I0g`8vOtv(iL+{tOY1b#?x97M-rH%7bL-WxTEO z%(8Jzx#t&gShSPQpTY^Fn;o4$S@NvMTFFV0r;E-n-;>4#!jjHaU6}WX?`w8!yR&d4o62_L?0`G8J(ZaftXcS z`B@U!Q{`uh)J^4QuoQh>=cjYRXh&3I8jIc|$TOAivooY)B+p|iKSiW>bpB{gX!Srf zCUZheK;$P$Zp@|UCvr-wugXv0Xe_hjkAh_4xb=}76i2cnBpE7pI7=Q@oyJSpdnzw{ zs3I!g!iTr(Jou2h(nEMr#EAGMAC7WBiDoVj zPIhau9S5ttkfPUB^RBc|T-M2!gSuT;K;8?izs+=$V5UbxZ2izRME!Z*-;TgY*y$_qJqN2$D!qxY=N zgB+32T8-NfJ)&+mdwH-UnqsKVgB+=tXV8u<^mvHMGd+g*YUP<8Lwk#t2R&jSf*OJy zF@sNBl4pJl@rlS2KbjECpJ#du!S{L4BaK)tS9#(`NY{FK&?8EjrSi;jSk&7Iq~+elmw znsVIqZUegwA2?ycsM#kjoWJ1IVe_X=pDRd zo60|HTUf>2wtakSH9&Ng)Q)Z>2*3!t^inRaPig-peqW$D{ zYsB)ut`W=syb()U*m&DFBAyYAXw^sR)%NL$snlQA6H}=_>xmWHts~+Q(T35zBlXek z(}vsOBeeBr^zWSbr(c`W?bd?$tkjIRok)FZTQ=a#*$XG1GJnCG8FS~KLLV2HvETN6 z@xR>U-vs6v|Cb)}@7?uJfBo>ZxqTZIB!K<@ks#U-iJurIgO~ghOtJdRyV{-P zw6mT?@c;b#OIo02L~r!$?KHxNbNOx075^7sGu-RXXaZi(wr!8zT8)A9l#6Rd?7kh_ zv8?2;Ysaz{J@Y?L%)tB0c56pGCE9Vf?bnWQJo}fmBkuKQ{Si*Nw^uvTQ=%PvZO3*j z{R=hsKSrYexj$|lb!~ff2@b;0jzfE*9k-X}p8U(YV^s_N{pVJMm#*#A8>^Dkh&{Gn zBbIK5k<(Uk$NTx0N$b)-A2gM;=%m}eE8-a!*9`8CM*RP_)>*#YKGM{HlM`sbVcT*L z|6kW$So7Qt^ZEbbKL6e`lYcseU%HK_j{ie-1|~6SUo#<&7T$AvxA1oO!T*OR`u7I@ z(_emS8>{yJp*91V0m5y~0Aoh%J^a8C)NQvzqi!wy|3Op!u@<$hICN_rr~zyJ*k8WZ znk?Q9WB32v3h%!+II8fcL(y$LGxfi#-9Ty+(*L7_t;Ptv|9zR*n0PDkLSijE{@nsA z>=!1^O*Fs)`w6hWeiW>)?+d?vsl@Jy&WW}O4O{=;$3Km)kG~54eGkO%j9(wW414a= z@oISMn-iZBA0Iz3J~Unt?~6V6?czZ^5`GVVeD8)YhfjoSu;cz3-f`au%lgNMGr}X` zb#GW$8TRM>_K8r%w#2@Huf27A`u`qy*}FV;9-sbS6q^^D8aq68U~DKn>-B?Qy&d6I z&kBAFJ`di5KRr7Ae`jzbeChoSp7iSBM{j;G4ZH0R3WmWx{(zuI&@pHgIR4M@ocDqM zy8n#-5cb;N;9u^a2Y-3hTWufihn@DN{_cKfzpby$ujX4=zh7sbH;>}%|4rr!c*V<_ zvvBf%wwVZTcq7dorr7i_JDFC-)0=Vbe*-+=J*ywqck3JB`|dm(kUSgy5@zX1eCmIY zF3~;pPOy2X)D}K%@iw3OzenAS(-znkL;1{qS9mfYi-+HPpL*}Y zm)#TI8t*oEFCcq|b>1THIB$w~sJCCsdH=57j$XpE-Jjgg-SzIP?o;jq@K$#{tQ{_M z)9#t>iSSYtbsOI$tEB&x^x5Wm!47ZapuAn5=}CP<&yGDP(y3OzIWn3l@%Wi_6Ul_!%Ytqs3Ll zW(9i^El(y(%hU>T$Xi}oiW}OJ7*63=M5$;v)lRA9XL3B8EH6I;fpBnJQlXc#+vHR+ z+}SRlP36MJY-Ocdj%vV%I~;W`$KA+dZ%LI|&YoxCK)SL-FDKWsm8s$~q<{lbxFs!3 zp)_**S_wC~#olr_4sDx6WtPKlDEzxt!8h(Qa!{JAgtyUU;%&4N?pBu}Pf;lxh^l4e zVH8eF5zRhBQA6Z`chDj@mrm(r?Bx}1h^zFnK2#>VxL&q9#1tGaSE^;5k+iC~GO3pB z3<-X(OZBoMM3b}m618jx1STus(0EyE1eTRn!2#+ryvQQ>hepbP3W8U1#M5g`!98u# zTL$09cnnkyo{uRv5~7{i({!0xhK7a@<0QOX>!qhqCb*q0H%n1Hc%Dtd3$M4dH#=ZW zsinK2fYRcMa&Ku*1XaLQ{L(JSQdvSS&6n;Xx#8}6DINo^QQ`JlE$xInm1UHaoUT_? zq66rq?I>5O7;fN~($nFEByoFmL(~ecX3bJm75xV8SF7|=>I(3(3fH(xEr{r4R)Rg!1-C2*&Vu3Q19yGu@nSXr8a*VZM}FDlBb;Ol(JLP}5x&#-z4bzgE}TVj@+ zz&EKPpT|qscQSnL>Lt{vlkjL=u9wW9Y*l!%ddVb+aI#*RQcK`Rm;A98n2QdpeJ3BKf?(U==F@t~^#e{%JSP&&iP%)z(6U*)_Ojr|`bIv)7 z9&^q)hht91e4l!sJ<18+aXnu+_ug;!pI>ctS9Mi&)mvTFJpKG9x@s}+2wXBR);+&aC=}IVR2SZt z;ahvLu5CfP*tHjX zofr+=DT4`J46&#(oMvaxb2_zWV07^;g1aFIC*>Gnop21?uO*+$AekO)@b#N-v^%vs zU_I7Q{_W(_*<3ECI`zoPN)B-Ni@S{Gvpa_&m}_jz;c7z>g!lI%PSwtT;m5Z{b!z9o z=rI|m6JwC|EUHfJ@fW=_>vUo~!m_m#b!p(-7xo9;#Od5nN5cg@9FKR_>yzOH-0qC) z>lU*xP@U`Q6B^+f9_=9gx{%8u9s0GtNUn&B=m849!x`0ChY-A!7wr;kS-)%+?$+&+ zc7>eF=9;rs39gXq;4a%PjX)eaB+Nr;2L#d68xbqjMVgFV(sj(k1vp|+$9_dPnnn?WrqwQRu+%BqsCB|NJaoziAfOE|MGI3;mmj7q@Ic4-rdhY@VFOWGb~^Vved zE{WsfmL|BJE;S)G2e;~o)&8Y3c^DtNv=M>@)ID#PHb5|sR?j#km?>>s;Z)l$H6R)t z3HQ5{&}TH};rG0x8xZY;v0NH}AbLS#MwQThePQX)CVKWMpkubElA|MAU|dTWA^mcw zQqJzs_NS>O4>R1sSq5H|?GEYK+LAjR(wX5c9g|ka6kVJQw!MpX$0U60zA0z7Ym0$*qL@9~VKLAy z6064y+Az~(x9fodSJ&tb?Ygrd2ru33=q$RM>k}|KV9OBiv~MG2%i$l@jxo`tGhMh~1964l|0|V7Kd=4y%XJ++IWwKCE%m+x1Pyy~#AHcHDGKl5l6< zuJ3shZWvA-h#(wy<9VSS_q<=WkSX8j{NhO zJ?%weuh4x9_?{e**?ci?EkehrgCB5f5qd=(8q->YE>Wi)rZ3Wl3f2|vut*PAOownS zzDR5qMhxb$MYt81a9hx~7wLPEDe8x;MfzS~!bX`FVZ6e5dQqQ{=?+2>2{%AHS8ui# zNvk(zidlRpjY!;g)C2P^reRF!_9ET>@XX$lw-+T5%wfn9$!HtgeeEt*Y_l!&F7lbBHWX{+8w>UXf>T2GeW^xw6Zic9HBQmi&oNMtX%N$ zw8+ziDZ(TzisIyE%+y6^5gs(OQN$VcB0X1U^SE#JB7KYSgomE9D1acE4(6myKRmYJ zsVg6BI|BE$DF+oMT`X8n)rL6?1{&pW(^Gdo3-hbma8vu{i>P&*9{lJ4#k|ud6BWLt z#gk_nCaQkS6(Gz;Exri#Z?SUYkma-_Ow)W^v zF#K&Y)1eb1R>m@}hI92;ZYg30hjNiV7fqLea*+<=Q3AC`S3|y8JjJ$2XTvm{v)eG( z`!yE|d6YqSu$D$V=&3fCq`oLZ21-P_~j62#0gIhlvz_{6M=yJHX+RC-*K8H){`+(lnH;Z}SZbLu9bFWlT+w-P; zG1Ckw9vsiX@ToR!*;^X3S$m-#dfIe01sCGx^?~hKI1^F23+3&FGZ4hUMdcSxmwfac zT8LYVmTbffx)66(8-@ZDTI5t%b;z;kQ=1DdEy0DjgMA7G=&Ij(oCD@2QCP`0$=1y0w)HJ49p8m4P6_!HSk2>vv5n`o!}t& zGnZe2tCYD^tsVMO?FMb%ZB+~!br-8MRZT5Y3)K7Y-2S9`03O}zLhr+)`&e1`zN>z+ zH&u5+6K^(D@s5Ws-p%$E;WZ-LN4AXQ?eiiVhPR5W7hXwzb8m(RhX0IT-M z(VG=)h4=Rn!J*hw`9$sGy>0gQUhp0ZTy5U!-3uRgmqXFuWN0fM4%8L5 z_BK(Qd(F^ST&sJ3Me8fR0zZoPhyDmZiq}Lh!VXI{x-fcF;3e#_Ov4__p3xoEfzhGn zDyCsKM>nw#3nxOiYt2RVrJanf39Z4;qkYtMqQ3Z!-+s$R28)(5ivML(!lLneO-Qr|vuM%kC5I{kV&_s5{-;?BPy7_iFb- zcbR>kTX7e;N4xXYL(aPHOmivx2#$6(cXxJ&xtqGp&Ngm?y^Fi1nR8cmmF%Lt@4Twc zbe?t|u-|oVcdmhA!7``pwCVmAY;ulq4pA{@R&Xt+)fsKCjNjdx{ruTtKG*1fO$TL% zAk@xSthPhYIPPa);hib&E64SwKg9iEwmuFsR45FVNO?@Z&oTS@@#x-S4jZF` zdNq$NA>_{m(VmRVWh)jN zjlOcCUR1k%-Qw6Cj@Ix23s=Oz;kjc*8KiYq!i69{tbDw zkk1)cFfNBpEQsa8>SuC12n%cN#H5+Ld6cv&ejd_N&jii>k0lCky|b&xX?TteJS1t+ zB#pk;br9PvP1(TO{qzZV_%Hab)rqiJZ^^96xI#-%b%*kfv>1+N8hx)axqc)aBH8PO z;4C>4&q~HAdrPEV?~d(`Ecmz8A-za-Oi7J$Xm*X>x@^Aler?S8+h~LsYHA65D7nj$!R`(s(JOxmW&^x? zc&t^85?R3RQQ)}lU`y72OLs8SY;;Pl*k|y6%1A6Z)aMN5(2Q5h&BAOwjd9uLym2Oj zdezj#U~@~8(ZQUWGlq;IOcG5w-)(a1u>5YaO3B={P)Rqutb1f zGCFX+$sd;lxt6T4Oiq(^Rh+>>wkhx>gGi#rO5$9uu(c%4<$`!VlN*rFnTr|3^Q3F0q)fa{l!hMCY_eGMH`28;43s@E8-=pgWZDJ-%=NL`W6YX6 zNn{3t*MGeZa;-Z;g0iX|s?*~EtuY{jQufp!5v%*Je$24el~eU{)82ro^tv)3C+NL0 zILy)KV%ePWKca)UMc9&gl(D&N!M9uoWsRoxl~`G%Hkfi@Jk(eT7NI5YyQ({s3oh(V zk4IB!B3aw0^>kxmLjoF<7_iu|C`g&`V3lq5J+Ov0 zGx7LoO=Kz1+5XHldK(I66k`cb>(*I1Ql8eW)0jNp6zn5sqNVb|Xm=0`oZbHtZ1l^x z(2v#D;gSgZQO1kR36Is*!Hg_41;Y}lpP#M$#vV;@zGRtiEM^QDAKYg< zT4MFaZfFLBdS8aaRzGtEUy#@=)&lTWVD|Cn^HvMK!M|A^Catv2UOys2DisG?nu9X7 z7njQO2|wi_e~d>ml|g%qj)npAfnNa|xc;b>($#S*&EdQ*;R9qS>oS z2n%Dcs!zeQLQ~f3)Im(3h&@7r*wkD>UYd-c$+Z z@g(6*lA}3~rlF8)^v1IY%|&l-o`yX>Z>*fw;*FMruqD3FWj4iHC@W)3uZn^)1|7^6*Wg0wgY{gJhvp+4i4Lva;*VyW=jpD3IVRt%b3~vyJ51-3Zz%@QD2PI5&CZhqc;%H3 z?jezdVq=rs0c=iSPLn5qJYGQfx0EvrSjPG{mSDb!tDM^%Y%B!#mGpZ5ccyL)7~QNf zpKaTxxfGhu^#t-C7I@OjfOm^ zVJ0XB50@LC4Lm5vuuS#4Qbkw+nOO4Je$N>`9?did#PH-Zc=UW*GKS&F8rMj$86zk- zN6y5RE=uSERE{w&T=X*_G0860eCYkVau%<0RxfT{NS>IjS!eaMr zv@SZH)iRsw_y0TkFEXPE==84~wIe@8zQlX_*CNkE9**1{xiNBicpm)Kj}PyGH|~SO z#qdV(RKG^J4;1cx4t*8+5bxZd4LuyXJ9J~{^3b`VQ$wZDaiPOPv*DS3@6fKHZ9yKfG(`^H9gi45=dB+x&y3Oosz zD`@vE@7C_)F2a$~kE3rzUx+>yUEZx5$QAa2=s{RtPtfb@=#c2f(ZkCu zybrwB;IIB6c&on-zUt3{r}{SdsXrKA>L}(`o1@ys! z>PL9Kf7gD+e#(BpzO(zgfG&HHeXKp-o@uwjAHdG=2e9Io0ootHd$Nymzq(ajtu9o{ zR7Ly&%vDpN!?-J?j5b%E=gTKjKca6Nn>uu{+p{1Eso z@NVGcz?1NYczfX5z{P^7G+@Hl{m0$@0Pcl9 zfGf=N;SXRjB>Rpq=a~DNW6fR6;pV1hvzav4HsKM?|0BEsyz772|D^wZ|84$j{TJ~k z7k0sJG9tJGG*PQLm*wJ4N!RKG+9uy|my(y}i5LsTF^W zdVj{WJGJDGQSV!hpw|2`>g{#>cBdBoL2x*NTJ^`MH%?hgb!yokWH3Z^YSka7-dNS{ zgy;_rs~FCN><@xk+O1QBf9maJ*mYqf{8V*{@=v`FQrn%P{8R7yB4~GNKhmTr_Bx4wih3lHV>JBtie{h&@n( z_6~@hCqeaA)GmqkPrbjtX_rL%r(X5J38MW|uf9R7X#dn3XXC2S{y|ajBDo~mKlS+j zr6k%v^~Opl3bcQ4*xpK&MEj>c@Te+j?H`nWFI5uhpL&J5Y3U!QKG2{_qWn{DFI6Qd z|DfcO8nO=aqKTN#g$3&`hHI6USa9UcE}JJrY4E|KJ342fHNF zKXKp3XecfHSWx@t-*Q ze@Tn~IB{cDywjCX;2c%jf}yijNo)V05L>B|mi|F#GrJ_pKXGGibP7@ai3eB3D_$H% zYxJ>HNtA!$cId3{Ubee6QP)r3 zC%h}yCew%qE(%&D*i2-)y((#wiDF!*O0bxyPagSbgNb5%;kQb*oQLKTdl~oFBSY9r zoVYixBIYt~ZG&QHbBRhmfi$p}$a|Dkg1JOsf+~rzjQieDC7)c*9$o^M40Aht?RqNOef(@ci|vLpp~CUm+dn91tyaQ6=3saNbbWp}Ph`+gKgw z87TcIs{pSg?Gfj)ujZl*fWC3H3oszY}P2&ulL zI?y9@+&Zd5cL~J3tUAym5K@Cxhwc$L`i|<*9Ri`NRR{V5LNMzc=nx251=S%v!t)QY zI?y9kfeg5RF8C&~XvFT{?tk4TQ)aIt0=}t5W)drxhxt zKX_W9QuhZGY8$)#K!glW)CcD=66%9<8G1yu&yf&B%i3p4NQ+M%AR+i9YM;gPrr7N> z5rU5H7eUoNgNJWc?b9V>U9Q@vG4!x%-=Cp2)xMt&MbT{SQyF?$weKq-%n$8T7@DHm zCo|Nl+FKB>b%TI~}hfLc!AS))|@c!nmZ_I(&a3yqTy^l#humJmGJw2$S{ zy;b`d30Y9s9L@8>s(mkp(9WY6im3KIc^*`Xx7MNm^*Y3=L)tJ7=N28(hH-R?4r#-< z`dD>H8^-Zm(Y^;;?%yW0+95ab|9JsyyF-R++&DYn``NHN^oYeYyx6olFk~?&K)72* zY}|$&kr5lWQ>sHoY&`I&-JwS;W{kZsp~#SpD+o%h=OIUtku(he8fgKPWX zWA0#efZ9(@RAXS)c7){a7LciKR_m*{S_@yEd&*V@{LOuV73SM`Xa2197`{Ni3ts20 z@xJvw_dfLA@?OTu_)+hEtc`E-uJ$eo9u=G)oE_XhI4L+bxO;G?;PBvw~*P zw}h?@T^2e&bO!YP7sCVLv7y652jW)<`-aAc_6m&*Z6De?v>ASj&=^W#Uu2C?3_Bwh z)c^nNeg^&jH?ceNwEKvAA6_}#=w9Vs?4IMEjy;kN_XPYp;ShI@I}PvH_jdPiN5C7v zR@f`a!bf4kUB_M3?SuUi)A_;q3Ogq6I8TTVDz*cd`UFe{ozewWjh3a5=|tr z84}qvk`LYvuZUL$FAAOwe-xEqd+_+++QEL<`EY{%!1wTl_)*}Uz^m|{{dnMkz}fx`m_VjpDRzFiu5NL!agmnXJ1Y&_mz%qZv zp2%nB2k?jRlKHgxhB3x{qgT0Ze-tRC@@YHjbY4|<$Eb$ESH1QPiB=H3C zIPnFL4iXH*ptnCvgXHJ8>IvD{%{PGjS7fBXI+9 zJ#igzEpZKTHE|VjC2<9DIdK_rDRBvLF>w)bA#nk5K5-s#E^!WVHgOhlCUJ&F1i!2i zY(oquh7m)Ft%)JTU}7s`OJWORb7C`MQw>ioBbE}U6Q>cU5~mO+6J112BdS`7NyJ2A z0x_Q0hZslfO^hYR5Tl8`h*89z#2&=%#BRi{#7JTnVrOCmu@kW)u>-L^u^l0;3vG7( zC#@S*(z;P4ts7O+x>42Lx{dnG2rPzRAh98_0kJ-jCQ?L_Xdn_qJrO6?Bi1Db5dDdD zG{V?E6|6<9NvuJvPOL_(O7tUEA^H+AqE5q8bBQ^`Y~lc77BQ2UK};v65&LUI)qccO zVqankF`1B#8CB9Tqe?nvR7uB-D(RR}B^@)Wq+>?aCQLVo*qA61EkuFH6FDMFWQb;> ziIDpjRdWBd9=#M^?q5{N{fjEOe^Dj(590MaMebiz$^CaRy_ypF^#81SJ#1F*x#COEE#Gi?8h_8vS zh%bpRh|h`7h);=6h>wYnh(8e@5+4xn6Yml467LXi6K@f35^oT%6R#1k60Z<16E6`j z5-$+X6VDOP63-A%6HgIO5>F716OR#(5|0oM6Auv&5)Tl6BMAfhzp4e zi1Uf_h;xZ^h_i{ah%<>Zh-Ji5;&kFP;#A@k;$)(Ws1a47LX?Rm#A2e8C=ne*JF$pp zBNh@T5hoHS5XTe85q}_#C63YXl$6C&QWj51Sv)0W@syOsQ&JWWo0*b8%Hk<0i>IV4 zo|3Y7@bo9ANLf53W$~1h#ZyuiPf1xkC1vrHl*LosWjUJ37Z67gM-oR6hZBbphZ2Vn z^NE9rgNOr(c^VN*t`M>03K2`L06#rECRc#FXZ|Nwh*)w3_?Kp+TminF`JY@NV#yUE zSP94#<`Q#=*~9_FEMg`xgP2ZCBlaiuBc>Aj5>trDL@P0gm`F?@#uNJx$ejo6hKN$f)GOpG9QB6cKpAhsvABQ_xh5gQXlqJ=0Bc_K$-i44(9 zG`Z0Oj73=g|3_>1|F(7dKU}5%SFGUv@k;-H>#F;oubBTcyFULF>-m4M+WsedM!~iJ z9s4!^d{zIC_oe>vT7Sjes$bXrdf$p`f4zIf^*;vX2?zz6OLHwgd>(Z;fSS9IAW<2j#%o1BbGYhh^0VzYfI^l?=PB>zz6OLHwgd>(Z;fSS9IQu|PYIMTc zmQAn?F`O7i3?;TEh7f~^t%xm&Er`vD%{1!mFNrUR&xy~7Pl->6kBN_nKM@}i9}w>o z?-B13?+|YjZxL@2ZxF8&uMw{juMjU2FA*;iFA&cY&k@fO&k#=&PZ3WNPY{n2j}ea& zj}Q+N4-pR%4-kJO?kDaemJ|09_YijzcM*3IcM!J|w-L7zw-7fIHxV}yHxSno*Adqe z*AQ0|R}ohdR}hyIml2l|mk<{d7ZDc{7ZB$Y=Mm=;=MZNTXAx%-XAm;9@l6Z=JDoU< zkbz!r%RsNUPiABnQ6ps7*V{7e>+Lclmk^7IPNGC~5beYwqK#NcoJ5>RoIo5;97p_t zIF>kuIGR{M97P;S96=mT97Y^U974<|4kivF4kX0d)Z26U-yC8#aR4!km`TharW4bM z{fYgEsl>j-6k;;bN=zaq5)+8=#6HA0VsBzBF@_jT>_v#KuICXdwzj zp2!hdB11G2O++KH5iyY1kl27&pGXraB1tq538J2e6YCM{5(9|-#5%;<#9G9f#2Uov z#A?KWGy!5{^_Q;Yd{yj#MS#NL3P!R3+g^RT7R=CE-X_5{^_Qf$!KP z7pY3Zk*XvdsY=3;sw5n#O2UzGF4C9b3@aV1rWE2&CcNmb%X zsuEXHmAI0s#1*TezLYDdFNn{H&xlWnPl%6+kBC1J9}*uB?-TD4?-K72Zxe43ZxU}1 zuM@8kuM)2iFB2~jFA^`{-Ihu?r|bVb^*r$$@htHS@ig%i@g(sC@i_4q@hI^K@i6fa z@gVU4@kio*;yz+IaW8QXaW`=naVK#HaXWDvaVv2PaWiofaU*d9aXoPzaV>ETaW!!j zaV2pDaXE1raVc>LaWQcbaUpR5aXxV#aV~KVaW-+58yacs`tMl({|E2sdv^f-tKYl- z|Fr|~kH7Bt@9Q=HjvWWS|4+JNOOmeGlB6rPB0>545$x?)R` zuGo^KE4C!*iY-aHVoQ>)*pj3xwj}9_ElIj!OOmeGlB6rPB0 z>545$x?)R`?pfNTB;7NKGl*rxQbNpr(mjp;ol2ZSoJ@2PHKIyXh%&K+SWI*hC8C39 zCl(QH#6sdE;zZ&E;&|dX;t#~J#4*It!~)_d;z;5M;&9?H;!xrcVm@&&aS(AJF^`x_ z%pqnI2N1J}nZyiYIx&sdpV*I>O6*HaAtn>8#3W)OF@YFQ>_dzr_9n&>V~EkjUK$PV zC}K}y4`O#>H)2;}B(V#zGckhLiP(|Yf!Lndj@Xvih8Ru^BZd-N6GMo>#8$+X#1_Qn z#Ad{%#3sZbVq>C6v=9X%PvnR!ks+FiCZdtph!{w0NNhl?Po#+ykt7<31W`}KiS>we zi2+1^VjW^_Vl84#Vhv(-Vl`q_q93se(U*u3b;Qap&B9pY``E#gh$4dQj;HR4s`72;*$CE`Wm1>$+)IpSI38RBW;DdI`u3F2|$ zG2&6;5#nLuA>u*e0pgFu{ltC5a^ha%9^!7|F5*t&4&rv=HsV&|7UE{&CXIx1BXI+9 zJ#igzEpZKTHE|VjC2<9DIdK_rDRBvLF>w)bA#nk5K5-s#E^!WVHgOhlCO+P)rb3hT zf2mL_F^QN+Od!S+`w-)Zy@|2J7-BTB7cq+1lh}jUo!E`ol^99vLhMY8Aa){lBz7RS zC$=NDCAJ}k6T^t1#MZ_$F^JfhC=xA1fyfg%B1>e5W}=B` zBsL-j5*unHoHK}J#8TpP;xyt^;uPX!qKl{zRiZ+ai6z8hqLU~Q9Yi~^h-f1g5+@NS z5+@MH6UPyMAdV%DA&w>%5JwS55=Rh+6NeFp5{D4;iGzuQhy#gv#9U$yF`GDmm_^Ja zW)RbfX~h1-e#BH_Ut$U&W2I*=dze7RO2Uz`l5k|KBpewl2}j0C!jZ9(aAd3`92qMK zN5)FRk+G6+WUM3{87m1##!AAGv666PtRx&6D+x!&O2Uz`l5k|KBpewl2}j1tf8+b7 zgd<}m;mBA?I5Jiej*OLrBV#4u$XH1@GFB3fjFp5VVCE+yU z`+whsPP0#b+5W2cwD+KQhj+bqsdqLs>Pp@pyhFTM(5TxB3U$N0O`%Ws_xk@2Meo9w z_?Je{c7{c}qV3URqVuCOqLc6q{?5^%(M_Y7XezpPv`(}IzKFbsZ?d1n7uk14u8&+2 zIWtm?EQ}l#IWV$6zQf*~I)IT4@TI=~<$f^yJ-*U^JN$xp0k|=IdH8(j|1HM1`G@1n ze69btYj}Hnm0!R&`2)hMgu`J2egHlSz2P)NmEh6PJ)xUIS2~-9&I_G}FY%A>)+HDl z+9fm`U*Ko({r!N@D!=FwyzRc|K92A1ZxwC3rEb|h(LDm++wY67?MLEU`_0`Pq@4!1 z{oF8A3BGndbY6F!!T0rdJ2yC&I%hd2J0*Nsf2ebSGuasfp8)@te0Sfw{_okB|Nr>A zk$>O%KgRWcjO+gx*Z(oD|6^SL$GHBFas40T`aj0?e~jz@7}x(XuK#0P|Hrugk8%AU zr;D+n|1no)+L$XdZOoOKHs;Dq z8{_&v=E_VPb7iKDxiZtnT$yQOuFSMCS7zFnD>H4(m6H4( zm65YN@K1(mBw6oDvi1FR2p;l(KBt#m6XOyD+YrNvVZ=~Eo=WRnc`B`Q<*BsJm8a4=SDs4i+%0(K=EP=% z%(Qi`%(Qi`%(Qi`%(Qi`%(Qi`%(Qi`%(Qi`%(Qi`%(Qi`%(Qi`%(Qi`%(Qi`%(QiG zBd@R#F_74h*nn7{NE0a{Ni+}%qMnEo>k;b`1Bm{_I>g$f8pP_vYQ(BUKVlW4 zFA*c^h?R*x#7cxmM2QFyCPIWuID}0o!Xko1fG`O^VGuq6*Z+0SPyFvk;s@e;;ydD7 z;?Kl4#Mi`E#FxYu#OK6k#HYk3)Mv{>;@gAR5_IYyQtpYUA%wcJ-eFpcNyN~t3-w{> zga5SvphRl*=X<+DkOGu6;zj}5n0<}ERt1!U+9QN5+NIEmYRW)KNnZx??)lIdt?Bfy z%LYnDT9exv%;4WB2udj-z~LI z@=VBbQ$N?M}8O3gw!tlbi*{tQBz-GY=NIu%p~txFmD&uSV<*5cpfDalae4H+sl zJEzNG3LP@Cv1p6NoH!}4zL4YE)e!t->56N&HI68XQ4^7o@c*E;(<*RU_)?;@I|L;X zaXnE?WD+R&J0f2w9*^9|r9i(+M^W<8g8tT#4F0X8B4eRFY>krKMO{$}4%JUR_VKkWayiUBB&`YjGQig9dR2Y`hen2!8%!TgtaLKHj?Aev~@(5vRe&RjzizH(Rj8y z2*)ELu&liySfcu=9oOLJz!)zGIV>bJ{`0;cnFMuLgQRHCOO>m@cYz_IjNfP6YuZ*0Yvp`Ou);q{K6s*J3718FxwYDN zg>@z48uPx}C5d)aqdt%48sn_hxr6*QmOK+NIDt5(`Pf7T?cO*XF!=0OKH@ zXI>$hLmtpwQ}>)gbFNWzF$>U4^^4A60WN);0~bgV_$|r!ev%|`hF}e0B>YSHWl9m3 zGj>EWg0Chh;^Kb7K~Ce2lB5x~t+hMU=pQGgX>2w=lw7oT1hrfr)vhV5gBU8b_*d44 z(ej0&al>DNO}-zxgAm>wqksQ@d7$t=|NZ~}`1}8V$4ajER|o&-cl!UY{p#R9|NH;n zrx3yS{{y)GAHenh0IvTBaQ#1k>;C~<{}15$e*oA21GxSl!1ezCuKx#c{Xc-~{{dY8 z58(QL0N4Kmxc(o&_5T2_{|9jWKY;810bKtN;QBuumW56_EDN198zx(qUQXq{Fh%Nrz>jlMc&5CmoiBPC6_L zope|hI_a=1bkbp2=%mB4&`F17p_2~FLMI)Tg-$vw3!QXW7CPy$EOgRgS?Hw0vd~F~ zWucP}%R(m|mW56_EDN198zx(qUQXq{Fh%Nrz>jlMc&5CmoiBPC6_Lope|hI_a=1bkd=p_4*?nl7&t>BnzE% zNESNjkSui4AzA38L$c6Ghh(9X4#`3%9g>AkIwT97bVwFD>5wdR(ji&sq(idMNrz;i zlMa2t>wQdoMEr^PkobUjpLmaWmw1PGn|OEh`&}ROeOXurVx{fR$>w{k(fY?C-x!65qlG3i7~`zVlQG8u_v(yu{*IFu`4l> z*oD}c7(whr>`3fDY)@=QY)foI3@3&WLy4`4A;e%}D`HDx3u1F(Gh$O>6JijtF;OI1 zhysx(azvKM5Y0pr(MW7W3?w!rHXzm~(nN|#5)DLxs3+pYdc?ZK0HQy!4zV_|7O^I= z2C+J^8nG(Tk64B1OT>seVr8Nau@d1CQ6fTwi4fru4q+3Du!x{WG87<8!cQ24PvHJc z{6zdn{6Kt9d`Ems{F(TM_?q~N_>%a7_?-BR_>}mB_?Y;J_!IFV@d5EZ@gDIm@ec7e z@fPtW@doia@fz_e@e1)W@e=VO@dEKY@f`6i@eJ`a@f7hS@dWWW@fh(a@d)uS@euJK z@c{8h;(p>jVmWayaSw4faTjqXaR+fbaT{?faSL%XaT9SPaRYHZaUF3jaSd@baTReT zaRqTXaT#$baS3rTaS?GLaRG5YaUO9laSm}daTakVaR#xBSW28uoJO2VoI;#TbP+Y8 zN>qq4v4mJmbP^?^gJ>rf5pBdm;w0ik;soM&;yB_D(Es<z(Q?@fLbVdGoxf-rnBs-VWYYUcuV{ntZExVb6db-v`mxqEAO3h~5#sE_zAy%xEQg z60++3>urJF7U*q(-WKR>f!-GAZGqkv=xu@C7U*q(-WKR>fxl@1XW4kuw;Dd4$Tc0t=z54xPChw4SNlUrn7X4R8@bzWiOqK=u9(`*h?qrGqjt{;L?dYQ7*W20@&Q7mZEX`X5nsA zEgh#Tfs|_L-a4+S841TqLO9;Em!i4)Wl(YCFc?f-9k{~12-Ybf}??mg>0?A`6%;9d5MkNQL4qka;;|KAB7>NoZp zy?SpAc(zl~AEKW{-=%+g_|CfuI{eG9{%?yOExz-{M|Y2I7u_#zT(!SDQ@ksTsiMGBD(BkMt@f2D|pum3*_zZZTb z{B-!i@Ezgn!k2{43|GSo!wbR(g{MQ8f3NU}@Ydl$;ihmhyjHjlJ_&z<8vh5O*Fw*P z9tzzRx;}Ji=;Ce8 zq_Yjw^mESoPJbxrhwyv;uc4y<8Z`7DvhT95hd;ElZ0+~&82J601?BwF_6U2ZJqWIo z680MQO17nb5Wjyft0&Zb>K1jCI$xcpI@NLNFf|)~|Hi>T!?y6wkb`fA{;IEXmCyRh z`p|mAdd_+n9vQBOGT+(O$ySG@{r=6eCR<~yovmTkCRVf6V6AEOv8><^!Ox+q|0-1V z9|+zNycT-*X9TOkw%~%`fx+p)3Bf&sI|hfqS3_ek5nMC4a?lR^82CK!Uf>n@{d*vA zN8q}^C4sX7U4eEe-X9W}6_^|t6WAp%99s7oDBZ6U=o<(H{N^|2pUgMR=gf!AyP$7> z8Px4hF+0pZn1`6N%*o~$@%*=$nKe`9I%dpt{6G7@@_*oe)&G?LkMR6=wf{o@8CG>8 z?T#ZgK~)E8mlmn0->z<`y;r1+FoGLM(EobCuEHG?VwDfEX~ynp+SQZHvu}&Q{g_5^~>H z)paBkLP5nVQz|r3RmCe)Dzv+*!YdOBKNOdSS0-FgeP&m+S0+^BCS)jXnNsR?y9&2V zi1hD)NH}KFMY~#6#WPb19zv?xGZPN46|kz}nkhBNu8PO5l<_bME*`s5?pH`H&Y4nh zbW|1ROsUXbc2%4+rOXh{)XtgETD$qJD!enHg;8Ab&6I*ykScsL;nLRgsw&QzQZ7Q` zoGAszZdL7^$w&oG$5q5TQ_87843|kBR@ERwZK^8XnXtXDs^Xm~8A5}Kcc!FshN_Bp zrlk9ms=_;y-${lHRT1}0NxMN+#643|4OA6z&y;k3P!(~{lvF-d(e9a?r20lx;GIc_ zcC#vQ&ty2sxpqZ+XEKu3Fu$sZd#0q_q$=9qi<5MfT@ha|$-p^&yQ1AQ8OgxeI8(g6 zB+=Rx@%EB*zfu+P_L4+1RK!11(%wu}w6hl{>H9=g#645eeNa`zJyX)ZtEz~rm!x}_ zs)&20r2DvC(Vkw6r0-|bs=(C?ir8#d#M4XC-T-9~PcKR1dz3*uy(Ills)~4eN&25q z747K-a&ObF>?V=cHUU-H6+sm91-mj*BH^P=Rd!+IovO04gzS4%WrU>O5Jz{CI1IhY zj*>)sU#sjOk?_7&*Z^{%_VkaONq30M3!4f(0v}k%_XQidu1~@)oQaV zoAUVDh}=XX4bQF&l1P7_kg9CVGtnW667oH2Ra&GNLsX?8QD#_G^3oQ4(C9fyYo!s) zO3?Qs+BYLX|EQo{X=d!3mZ~%%=p@Z6>`J3Vx@)3S!%XV?^ApMeLy4e&WfWd4WfHy* zRYhA$CkfY)6&Om~zj?Tmu#*VQ462GYlTadi*{+C{Od3A4CafefGDjmd%p}fiM3!PE zlm5356f>DL45Sw`ne;tkSHw&v&G{&^Hj^mRT}oBNP9_za0d^AIaI~t3nM|riRS`3p z^nYqsU?%ky#~??slSyNlT@gE(^nZ*3!%m_YtKiyVCzIx(xP!2hh)knp#7-uI7z^4? zqC0M7S70V}YoyVfVknd5u{cv3O4Ro`yQ1wRj>B1EMGR%qKh~~@p-lRg+jd0^Wiqe? zm4KntnXa!Yu#~vu2sDgX%A|9Fs)(gbIu}_LSV~keuPWM5BEc4RMcYYSWp9*R8%ngw z7buXnlt$7WgzCanBF83#Xe!;oc14>?B&tWJ(6$oY-Nc>N#uCARQe|38cUx7awRB^4 zSzAkF|Dj)%VJ?y9sDLWNTp~09A(%^qhMTIa&83lqE7&sar4hF5vbLAFBy3Ds8%zZE z#0j*RzMCyo))v!A`j^{fZ7^}6n~+LdOcd#C*`#YC2S z;p#A%xcX4jE^CvC$j1@XHq%Hd_(v_%X!`dE*ku?^#F}GKBW*UFWT2laYpdxbjnC|| zHkwEemy%^|H4$73`O|EgC#bSEn@-X>$}ZDtnju@2X*B~SyR5Ay(nNx)tj#8d$or}c ztBKN0M15g3^%aj*WtvU%I=igRCX#%C%V@ia=D1mvwb^tUFsjSiYB~+RH&t01O{c-Q zL6u=M_0iF)tZgPj$WTmXgMk#tt0HliA>3S(UZPbQ)j*%GzQ=aPVbShQTz9 z28`>nwwFc&Zj>s+VB#6KWdjCiSsP2I!QD!g#a1>L=w{kh8V%M-xcxAe2>Rfo zxvb5l(crF+ykReOqAgTe+e?H}c3I42gC0X=Z7vZx*eb(X;(};dv6T(@%~%<>5>ca6 zSzAgp!$)>m3}u6VUED`)C{dOEsw{T0!C1*EYdh&QAWF<+103U)#Y{Gs*V<(SzAdI0$oiTNgPFg5F6Rx zzekl}BN1m_r^;d^8{qh_EJm`yx=@w1kwgohrpjU?8v^ZiS!`s3o_or$kvQzT#x9GE zY_N7kX<#D}>71_0Vj~;uEmavd68C-xYOif1j#gD!n@EJtP-U@@4c0JKhK0m=eFCa1 z2C~8Fvddy18!Q;zvNn)Na-Ln*_7OMjM~qn*NZk;lU>vlC#Qj?nL2V*&!cQ;-u#x(N zaVVQu$p-U0s|+iN7H@_x1-axr+*55L(G=%eWo;o5vdh{)qNn=8c3CWBgRvHxUMyq- zyoTFlv5*aZc!^yC3yDOlt0iI}8}JylL=0qu?=I6`0t1Ph)T5?a0t<=j1ddZnU?CB5 z`=}+bkO)~j*-OMiHuygdswJ?HXbnt3OT<7n=qYFk3?w4=MWnWmsN(0y5(W~Hn9`Ss zeQfZjgZ2__A5rfR$_4|8vTa~5fqm3*85|Z1*ILvF$Ia5n$4+3kJ3z?K5ORexk%Eud0>Ijvox&-Pi&nvck0X;XdOaXH1)q>kjNmy1#9(fzu~#m^MfK=JjUJn}JKzXU*xq zeQN6g^QO*josQcvXW-m}=dQP*Iqo+T?XvZjLw492r5UhwU_snXWsS{i0jF~fM-*MglAcORlfd#=HUHg{|W=)&1{|Y(u|NTW6Klk7jGH`oj z4s^@?QiSnyS4bcF7YcyJ|FsRQP0Yi8UlXiw2R6eG!Ufb6W@QH)rMyqdFw8!1>Mey8SS}wT?Ncb;6vP6ZdbOJ7$GD zXGDet7Qj_{4<<}Zm17QU8q+#s(yWZD22S`QkJ za?Qp}faw&OtcwbT{-r!tsL`P90}IyZc_uQYw$7e2=5Js^CgbPmjvwx^efirA*q6_ydeqmX z5FE8*rjMU7eoE_XRKj=v@4Fq{8BCgrkuw*jK<82S`&zO)ixn!-^7}I2(-*Av+_`vg z)AzFBH_gI|1Eo7X8bqgE>0i3|3Z*af^m#}|Ef@b?<Cx$FvM&i}r?iw+BeH)BTYME%T+i+jJX&N{g~DlW`IAnBhUAf0M?(Z^@dDk9_r~Dq-i@!_1 zLTmc&?&quS zm$WOcdfvmcSkKn^ztn`!U@KI^_ZpT?!GEP7zdQ^3Ui??#=SKt<4CqnI{bEAL&zn1Q9JY=o z&OESn_I!DT^y_Z9@0lJi(SOabcfzZL0y|Nl=qiZ)1mROo&G-?MKu zdLIXR-~a#eDO&IQ|K9iizkZP@J3uSGy6=7ekFR!C+zIP_|KH|M$NC|4+V#>P_C;0=+HJ+XB5U@ITxFz3=~f-~a#f zp8?8u2EQ!0dw*Tm`|G;@_=lqZSNyuJ_x=BGyo>l{cl~dFpV#~TpRbI6{e+?S2Y-L{ zbMU{slK=1h!QcNa@Bg*_Um#f4`hS1w*8jW9yWYFRJIkwii@amJ`Q8j~qPHj1|A%-* zZzIwFTN(O)KSn=~z6bq3t^a>}^cv{@ErtHy!svqNfzfHv3DG^HJ46RZTcR66|8F(u z|Cy0*BcDXxio6hc>=*sN(<4hFCq|Bl%!y2mjEn3R*)FnWxBlO15ib%H{l9m@FNL27 z-ygm$d~NvR@EPICFZzEI!=u7GiT+<>I1yem+~=?K{~iq85xOpPN$AW_HMB6aAaqb@ zdT3&3RA{Hr)}f6ux_BeZ2ds};RJ7=fub?lh! zsGrqW>O=LKdPY5{?o`*SOVnAaOD$5zs`+XbR2D|7oz+nI*KAbvY7Ny#DeFh;bL&0p z73(SM0qYLyI_nbaOsi_OSw~w3TQjXzC;;vP1;9KyM5DTU$VNiI7p+_p$1Nkdfa>8=t8zQ8G&VuTfo4GD4hx zEvpMsMuwA)sxGZ$gs62@mk1f9t&>!j2pOe~)m0aSjBwOBMs-2S2qE7aRu`0vkaR=U zrG<=;w7=@oIz~=fB~+J|F>=zOHoHr!7#V5*7*lnLj8PiukX<5Ul=fazT_R(Yh8#_o zmNCMK%l)cLbd1vey{s_0zX+&xn zBV_-)T@w|fw6zVcsa1?{zsq(FB1SmVA4aBH#Rv`aR=}=_j8WPgZrU|1V}z_8F;z`; zjMBl$swO%{Y42!N6CIt= z7^i>|BP8Eag1V>IwveELGFxqP3Hnz?PMhgLlWNBCO(hcD zTGci|5N$fzt__k%3};o_Sk5$&rYMK47FBCu=w-WBkP{7s)Om^YCaPLaLV*WWEh{0z zXVS#7L(6X;l*=nex4_YA}+z0^?OptYpfYs%l~-Q{Gs+rmZBh9)u!jGl>%?shU{H zRA`2(iIq%wb5u>NWXfJg)wGqwc_^wF$&|OZs=-L=xFhVEwvtB59EK4BGl`(L03$>j zO2q16CzdkhjZrnRlqqkrT@y>0GG4&_5KEad7UE2?l&L^Q)x=V!d|#@XSjtrBNL3R{ znevZRHL;W_^FpfzONka+->zvx30Y!2qP3-TQlUkvCWbO)53p<6P@>_(utBhty5t9{ znpnz|QBpN+DV>z>J5|$$5=Zw^HEk!Ilz+LZX)}oo(I#RgQ{Dts(^eAa?Wt;FBvbzW zb`3@n7YWToe-bm95~~0+i8JlxRt=*Zn{ z$*yYih)(uB3QYTG&R131M>lL$VIOhrj9t~{(MV~{{$Wm8n9@Rj*O7jSbN~;R*3n715C^AmY(jaoaYUonqk(801CThUb=1n$Rc#%S=h+Bq^N5ClG;@{q z5mMPz*hkb1db3q+9&t;ziKr^=qwhmig?-eQd_k}OxAUK+{r_qG|7W}hy*sSYq$rfZ&uw|~?4cjH9ky~aC@*BiZ!7f_?%XN{jWwl=mjHZ;~YmNj}B zvm0M)Ol?eRT-NAnbe^gH|4)7Uf4$yYf4=^!`u6(6^#|+UNA>?zsQy2vKC^xus{hN| ze_0=1A6O@S`~SOr%f4n`w!7>v@b>>Bt^R+HU2gBtxBqMHRrU%y+K#kCZ9kjgIpY`~ z=7YSKU*cc$)BFf;<;{FAui>S9JAZ?3)aw72a*K!a04Dkbl^EWmx9E@bDm_O#>2X3W zRoX=BX%#J`Tj^%Hmae8NP#OIq8b1pj<{Z;uvf`tnuQ-f%|3Bc}|Jh^qKTYT$cEw2zsGb<#-gj1iYmB4%wNjKA1-`_`z()brO18j90EU{c(#;9xBqrPhY~IFd za+SCxDQ4PkzsE6Eqtq>ri5e5!NVTfxij>25R3`Yr3+pQD(v-qI+ST4mVXdm{NeXK! z+iD7Tt4eRCaF?q5DGsZlk}}%}=WkaX*Hc)fDr-xRK}(1;u2^?{W}KCS~ojCI{tYiBkb6 zfRos$m4*T^2_KtL5KP(8H*q$|rDU`(IPvjI7 zlV#e)K`@Ds1yc}Cf*jZ?!DLeM9ykdn;e_u{0iZJF2&AAa^RXNRl(+*NMi){d5K#aqMPcaz%A_HsPs=`ivtu*9w&q;Q6nog9RfaNmtc0!t9)Hb|i*{O`u3DqJR5 zM1@Op0|mh)0`+kaTB75I!UW(F3%Y|ssjbN#3ZNyHF&S65&=Q0{PC;Oa{2*r)E7N@( zgq2v?n;5QwrTsbwfhCOpfU%+_%KHbQC8i6QgbJ5tItRfejHvq^gqLtSjm;BaVv+|a z2rn_@EDjYe^G;lif=l!~23hfvKY%}YDc1K9AH>Au=fWt!gz-4mA;d(e8V3O;27L+b zLQL$@GuZtz$oz;@G7CW+v7Rp`gTc7L7_wC$}t!nc{zmu#q69C~TRj z6e0^TVZ$5*nAT+*OaLzt4k;I0S|=%2S~^Lu(9$|HgS^1fIyz)LSP6$K$tx)x&g$?= zN{4R)UP9ruw3D5c|c_CiW@JeIN-R6-tykFXN$HJri>BV{klo;_yYP^urx^CkEN(f9` zFo`IylUGVQ{yll2B*qxQULc9J;-d9RNyi5vm69&q&BhBQts6&PAc?hG*y2fFzpb-txdCB=w;uKq)=1VK1OeTyg>0K}yJCDDtbQbaDuW2P(18cu??4N>}TH zR8l(rGSUiCVwqndFQBxpIKf^y>F_JdUO0&{&qg2xrNdjAS5P{GuLE8|>39s5ETF`k zI@k**u_T-V;}w)H$DS%E9bZfypu~)D%#IgMCT>YiUP0-ohrO$uaR7=JQevZDEZ7Sw zF^|3Is;qQ;5qV*yb+xD23o0?=l&`A3)d(Didd}M<8J(wgb1H zpb}G$?1hv__g@RV|JSnqx7P61{{a4J|FtvF&Okc@?F_Ut(9S?R1MLj7GtkaJI|J@A`dOL0MRk3p0g<>6OfdTsodr<$`8Bw!o(1 z$B)OR#Hwq=p<^@fYzoPKbt3I4~SL9-jyYMEEjaj8Du=nlF#!GWoQuDYmiyd<8Uik}*qniWsRW?RKeE#mq3 z%-H1F8F6aze0;Rz2?~uzkFupL^>s+)lB#mWqTFU9VLl&p(89c|saZ*Z?aaiG*;VMH zUJ-}KCx=@~8v;UOR~K7~*Vh9qy=IE=T)<&`xTL9Bl^2j*YH}gdD&`lmxmH{U{N32{IU9&nT7t*=pl0nOjCZEvQ*5>iMvZMWiD#$d6UW7QP3>wn%(tn^LYrER=fMOuIjf0B#U?Q6wl;C3AWNF8ijru) z1iniZb>&1+%ZaLVNfy!cE=Z~@s(C3X_lS#{mREZ^I+mB0+YKMqo+~VLpz+%mwM_b6 z`7$g{R!Sq=M&l)&JOY+Ci|Cgi!y^=lHFYgVbH#Cu`e zz_7=wh8@i%iy2@to-#%hRvWQ=VfA3xE3INv43;RXO>0s?14}S}9G9~T+G117hqrlz z#!Z{pkKmrn7}#5HE5KY#yNjoq>Ny5+=giNrA_EuWUOMe7NVX|QJ};%CmrfC6iaS{K+7#)h$;M*GvkYHB&n zc^micWoHe?Wkz@M#iE=|+QFXrBVVyYtQgOHu{jG%->S+NTS{}R(70s_dn2f0TEkl3 z8!Axjt+K|QW>2L4CK4<6hqb51B~?3LfIxOe$;fB5eotp5f7C;hYjJ-#3M{=&E5+bO&wJSAKa`i1r0SGnP-@fz#pb_ zkY|>BqdjwDimK%bDs&i9~yT<;VcfEE5S8 zH6^X$qJ8~5bCpOGQh-Ye7#=R&dz5D$B$G}q${DFb_;4T36p4hBaLnSvj`n((QjlCU zqoh)4d0DDN8SViTfgEKK0*bU;sF=g(5qFx%my>cHB{~%-gNFfyBiAG)qm{rJ8SHk4 z05KAz1vo#m1z1>Ucm)>I(cS=Sn$$*TsC$9C=0t0 zmb0lm_!6yR?K=09Y*+|)wM06%umDjZY}f<)ct&v?S{G6>DAEL(fez4@B@?pEETJ2% zF=%%?3CsGRhIu4%+4KsG+}%bZSnZ_RGpU|d(&aJyl9tRT^hYr0;9g>jHiRMeE+*0W zpF%_NxqyOBV4>|E64Elclrp~pmk(@)QJtNZy-?=KmXWd&6d+;d9e49gl8E$-q#$EF zxQWD|(13>B8@{6RE)p-k0P)sxuCO!@#Q>OGZzE~+W83|_ltfV-=sCU-nAuD;GhNz_ zKB{~>1SEhKzZ1~zBto-&oty>CB)Cho)Mcj^e;+YajjiF3pw;jOfN~LGnX8{tpymS= z6x{$u*8>JwtXHFsfrt1xatCRIY zBmzKB#GP+N^7^g?+0igDb-Ib!mZi>JD5^>pie`W^7y=X*!6}Xc^*cmDkeCG9I3*1; z$-w}z3K+m;457=lY9&`DKHLo!~9iT@bT|UDbp{-~g!Gqp4%(`ML_jyR8 za&Xu(B!*~s;~^~DA>M8D1LA18IbzbP&CUQAY#^R^E$g}pkjL+n9GANt{J8>`hQ$W> zpN;Cx_w~`Iqb-rQB43CsM0SLK02P4wa7*Z|&=aAHp|0S&!LJ6d2Kxdx15XE*0|)%S z^ncNx_P6+6^L@fM?TZTkCVWImxI>%(HGoGO?r-R1Z?ey^H`vqcJ)p*W{58avxCWAPf@yzwC6SV0StK~7(C%lx z)yXZfP5@Qu&He+NLMCHpH~R+o5=$myI~Y8<>FDNEGV#jXrkzBtPHNM(hnsaA&j^oq z9pp03msUl%_qK5fM-?9h(+CW&QKg-mz#a4U{_mV+}q zA#5E4Q+6R+lMn7a%3X6KUzrf?CRxR@=0;e#$=!5u?=KwTmR)FzRRafziLwvN%CvV6 zI1LZc*fu~_q9eLjLDKN^IzZ$O5Z$&46%j*l4GL5oo!&m~syhm>73e?2T_h8(C>ykp z_#%DIrkI)9Z6h_6n%MS^E-vRvQ9Y>fyPckKtV8+xL05xej2-BJKyO^DdPR09~c%&mDA7!^lg7A(1) z)zn6qZ@62Idg=8BcTAcP*dz|S1E?)jHj%moeI+W>>vd}y9Mis=^nlg}M_b;mT<&zG zHxexue;P^MnLR9~^C5S(3kF+RQi!^nGhR`MxYHX%F}=GEb47CBfeH2zuX0T~XjIdi zi36G%0P~35O1$4|5R5H@a;f#i3s(c8pS!+e5akp3iyC>1P3Ae$^*2#4*-p|31&LyE z2T4)|v_&wPK>}NYWciNw;;=?H^|R4mFz}atQ3fajlmW^BWq>k38K4YM1}FoR0m=Yn zfHH8qFc4PT?SCE`fso<}|BJzM!7^Pl7Md@uJl_cV8n8{)WzXB)0H9AV#KpJa>d zVdh=t8RjF1+~~`~CzpIAAF+vjRN|2Vo>?XmGCrIf6YcBgnX5#i_9t~?(!ED{=0P&) zQWj7O6>}Ip z;!YFnlZdhT3?2p)j$D(Jd`U^lIG2On?hul>?7XsoBlI02H3a*kaIqQmb-9zS{AAef zgFK@WO<&3@xY9kHJhMV9cxgW_8#@4$h203t*;GEKWVH$l=-kgU&Kp*fRV|UuEi5S6 zh4%c)fqguqI1a4~DVcn(pn=Rl2k6U^3E5_r(2dp@w7Z>zWqnY?JQBHVdId)AZX*$# zkqa68*MQTj={A-8pNr#f~Vg+?gKP3>T48~(Eics0<{jYJR>=3)xMx;%0f0*kPW%UMc)q@ zPpNMc&tx2h5ygg48kVR-3_kw$z&6-OMAE8xT;|i+B}@0g4ZC~hy6@(hBoRbLQnHrl zz(08X6U;rUxw}(afZMPmYObJw|B}*ZofFBlB4@QkL7tZjGORvqcVn72H~L>-x)Y9Q znOsVlU$Mph$vf(SGsIC0aSNhyTAf2`7!R>|2G29ejH8#VUZKvrNW3`ML}EEt=tUPh zDr#Q5G@s5bW3!yu2wZP=ltv2b&d82BY_DYabO=Q3S%3PSxCp2oB2+t$L$;MLf3lzk zrLp){VyK#phMQ~ump&VOo#Fd=p1DY-m}&Ev7a4eS`)~x#5F&XaE`i9xFimSp{jYv0 zzY_W`v(qU;9=ZdfXrhs<-D!9!Yamc|WSuKlY(`(*5$OU_*=s!CQ?%M-fvv&bw{xJBf0=1v%l?C7y= z7e8`pY`AB1EC7&XC%z3SX_xCD9rg1}&XrM=4;wIu=$DzJWC5yiULcodML^83Kx+E6 z!iF!te(rdX*qAUT>JTyJT?3^sn`#HMVfS&4Sfy&?!d=6qpFz5Of^d~quDD(6e*z&^HidrrK(Qz^dC7l&LK&ddi5B&D!{KARSEFimxx|ih( zYA(4XYja6BhO=_oaIPlU$+dz>DJid6=>UNBUORamIb1){ob^3X)(lI+Vb25F`z}vh zX8;taJtjC-c3g+sZ46lnm37ASbayeps)G>kY*7 zu$`B!f2HTq*KG7U#QtOso0v`a`z4z21SHe&!A#AHuB6h$IZ}w zNu4`4eLh!MQu9($p4KEyZht_{Wnouc``YdkYF8=FGp^E_;Ge(p^VeTGRT=?yowF+x z@z?Ce>fQa)={IA$Nv2ayaDZh6ayBcfFam?e-#)p6*n;#m$7-kr`C<|3SyrS8$>s1) z(nv+eLdq3#Ma&1j^dItAGblvnH)?27)kRAiNIQI=f=vB*X$~ddju5MA^RlH`jBphmcVCipUQcm2#|2vz-w^fIFlR2C4b^F}>(dj#OLpH^^^(eiRk|$${#b>Hz!XC~5+@K&fm3=(<4GI*e-i zL@1^ksAdLsT&NK|z#!@`5drB2RRidoNkcjc2#9fg9c8y zpwj$&J;j;vR9xb!81-Ed$R&&)c?7K(PQ3#_*9UXsE*id>X}oPo-<+OA#J z3?sR@5#9g4LwJaZemnYc;i0G$ZHc@U`9fqNvLpP1@MnC%@O-!>^j7GJ(8W+!@ZI27 zgI9xnft!J+1IvK}{$KjP=ui7we6RUF;hPqo7v_Zy?{B=%cpvhf_HOWe+w)P+8Bdgd zk^dM!%e>0(}mF%_dczLF^3ySI$!ldXNako zZ!wI}?F3Ne*7hIZ6qZQF?r!cI;7cr-OkD@q(aou3;+0;nokXsVvuoSK%{q=}nCPy9 zT*mp*D$BgLjY~KR**klCj4y>9FL&zSY-#5bj<#aAZJ2L%a!Zb5R&_z{>fu%#W$GUd zt%H1tb0J%EBJ4fNU2`K}nK$hwS;eyEM&oZ2!*K69ZG^HAUi}r0aLX>V#iEx1Vxm?# z@b(PxB@fZqHb7M`Np!D5W%)fos1`BAKw6 z4;g_%3yCk%=Umwx-bQLFR#D6DTiwyc!dU$15_A0XO@NvErB?74_LfC+)6v2#uGPj;>R)czvsZ8DK$_|)Na7`GP zE%uJ{rOo6Zb|PGL${OwFjl+CNSOXZQPmjAv*=oSOIOWb_n0R~ZOO1mVH}r&v{Yy1~ zVawc_XMs_11ZKe!*_y6IO@WH}hP&l30V-}H+Tf1K+G50EcL23XO_QTrz&DC14}_qE zXx*9y$CjX*G#=4c0Bu*hZn@Ky-bl23*Ht6w>0%Fy>3qnY?SjFA!^3V5h`O6IenUmX zo!*rNp02}Ok=%D+6Ye8kH+k)KAMid>Ei39S)6{9O1(csTS6;fc_bp{(~up@YHS1iuoz z9vlsFfo}vp7LWtm{J-%3o&OR4tbe=jb>9=dEAM?aPZ22tlmW^BWq>l^mI30#)~=}7 z2`yGwVH=KeSBYW}tJq+pptP8Uv{)b#*CStBcCLKm4D$xWVq|%~Jrg4a!=}Of08%H< zS`@MGcwxS`*142#CS(4EBru}Yb-3SuuDS?6N2}{||Ie%Ikk)ZTdwA967HKME0$_J% z|6$kXPxGbiM9kSP^p^MNG2bOl(aV4p_uJEge_>^$uA4(?v2~W3)ri}s;BQv;tm$Fd z|51|cA5l~9yEpV84N1C#;E0A+wOKpCJ6 VPzERilmW^BWq>k38Tj2Y@ITga@Pq&W literal 0 HcmV?d00001 diff --git a/app/api/v1/endpoints/websocket.py b/app/api/v1/endpoints/websocket.py index 5a9b988..48cf728 100644 --- a/app/api/v1/endpoints/websocket.py +++ b/app/api/v1/endpoints/websocket.py @@ -24,6 +24,7 @@ websocket_manager = WebSocketManager() # 定义缺失的请求和响应模型 class SuccessResponse(BaseModel): """成功响应模型""" + success: bool = Field(True, description="操作是否成功") message: str = Field(..., description="响应消息") data: Optional[Dict[str, Any]] = Field(None, description="响应数据") timestamp: str = Field(..., description="时间戳") @@ -57,6 +58,7 @@ async def create_and_connect_client(request: CreateWebSocketClientRequest): logger.info(f"WebSocket客户端 {request.name} 创建并连接成功") return SuccessResponse( + success=True, message=f"WebSocket客户端 {request.name} 创建并连接成功", data={ "name": request.name, @@ -91,6 +93,7 @@ async def disconnect_client(name: str): logger.info(f"WebSocket客户端 {name} 断开成功") return SuccessResponse( + success=True, message=f"WebSocket客户端 {name} 断开成功", timestamp=now_iso() ) @@ -121,6 +124,7 @@ async def send_message(name: str, message_type: str = "data", data: dict = None, logger.info(f"消息发送成功: {name} -> {message_type}") return SuccessResponse( + success=True, message=f"消息发送成功", data={"client": name, "type": message_type, "priority": priority}, timestamp=now_iso() @@ -149,6 +153,7 @@ async def send_heartbeat(name: str): logger.info(f"心跳发送成功: {name}") return SuccessResponse( + success=True, message=f"心跳发送成功", data={"client": name}, timestamp=now_iso() diff --git a/app/core/websocket/manager.py b/app/core/websocket/manager.py index 4e21cba..acf3971 100644 --- a/app/core/websocket/manager.py +++ b/app/core/websocket/manager.py @@ -47,8 +47,26 @@ class WebSocketManager: # 新增:设备事件推送支持 self._device_manager = None # 延迟初始化 + # 新增:缓存机器码,避免频繁获取 + self._service_serial = None + self._init_service_serial() + logger.info("WebSocket管理器初始化完成") + def _init_service_serial(self): + """初始化服务序列号(机器码)""" + try: + from app.utils.system_utils import SystemUtils + self._service_serial = SystemUtils.get_machine_code() + if self._service_serial: + logger.info(f"WebSocket管理器机器码初始化成功: {self._service_serial}") + else: + logger.warning("WebSocket管理器机器码获取失败,将使用默认值") + self._service_serial = "unknown" + except Exception as e: + logger.error(f"WebSocket管理器机器码初始化异常: {e}") + self._service_serial = "unknown" + async def _get_device_manager(self): """获取设备管理器实例(延迟初始化)""" if self._device_manager is None: @@ -561,6 +579,30 @@ class WebSocketManager: logger.error(f"WebSocket管理器移除客户端失败: {name} - {e}") return False + async def _add_service_serial_to_message(self, message_content: Any) -> Dict[str, Any]: + """为消息内容添加 ServiceSerial 字段 + + Args: + message_content: 原始消息内容 + + Returns: + 添加了 ServiceSerial 字段的消息内容字典 + """ + # 构建消息数据格式,去除data中的type字段避免冗余 + if isinstance(message_content, dict): + # 复制字典避免修改原始数据 + result = message_content.copy() + if "type" in result: + result.pop("type") + else: + # 如果message_content不是字典,创建一个新的字典 + result = {"data": message_content} + + # 添加ServiceSerial字段 + result["ServiceSerial"] = self._service_serial + + return result + async def send_message(self, client_name: str, message_type: str, data: Any, priority: int = 0) -> bool: """发送消息到指定客户端""" try: @@ -572,10 +614,8 @@ class WebSocketManager: # 所有外部消息都发送到send_channel channel_name = f"{client_name}_send" - # 构建消息数据格式,去除data中的type字段避免冗余 - message_content = data.copy() if isinstance(data, dict) else data - if isinstance(message_content, dict) and "type" in message_content: - message_content.pop("type") + # 添加ServiceSerial字段 + message_content = await self._add_service_serial_to_message(data) message_data = { "payload": { diff --git a/app/utils/system_utils.py b/app/utils/system_utils.py index abf673b..cfe527e 100644 --- a/app/utils/system_utils.py +++ b/app/utils/system_utils.py @@ -44,22 +44,19 @@ class SystemUtils: def _get_windows_machine_code() -> Optional[str]: """获取Windows系统机器码""" try: - # 使用 wmic csproduct get uuid 命令 + # 使用 PowerShell 命令获取 UUID,兼容 Windows 11 result = subprocess.run( - ["wmic", "csproduct", "get", "uuid"], + ["powershell", "-command", "(Get-CimInstance Win32_ComputerSystemProduct).UUID"], capture_output=True, text=True, timeout=10 ) if result.returncode == 0: - # 解析输出,跳过标题行 - lines = result.stdout.strip().split('\n') - if len(lines) >= 2: - uuid = lines[1].strip() - if uuid and uuid != "UUID": - logger.info(f"Windows机器码获取成功: {uuid}") - return uuid + uuid = result.stdout.strip() + if uuid and len(uuid) > 0: + logger.info(f"Windows机器码获取成功: {uuid}") + return uuid logger.warning("Windows机器码获取失败,尝试备用方法") return SystemUtils._get_windows_machine_code_fallback() diff --git a/docs/modify.md b/docs/modify.md index 90b51b1..fa44522 100644 --- a/docs/modify.md +++ b/docs/modify.md @@ -1,5 +1,218 @@ # 修改记录 +## 2025-08-15 WebSocket API响应添加success字段 + +**修改内容:** +为 `app/api/v1/endpoints/websocket.py` 中的所有WebSocket API端点添加 `success` 字段,确保所有成功响应都包含明确的操作状态标识。 + +**修改详情:** + +### 1. SuccessResponse模型已包含success字段 +```python +class SuccessResponse(BaseModel): + """成功响应模型""" + success: bool = Field(True, description="操作是否成功") + message: str = Field(..., description="响应消息") + data: Optional[Dict[str, Any]] = Field(None, description="响应数据") + timestamp: str = Field(..., description="时间戳") +``` + +### 2. 为所有WebSocket API端点添加success字段 +```python +# create_and_connect_client - 已包含success=True +return SuccessResponse( + success=True, + message=f"WebSocket客户端 {request.name} 创建并连接成功", + data={...}, + timestamp=now_iso() +) + +# disconnect_client - 添加success=True +return SuccessResponse( + success=True, + message=f"WebSocket客户端 {name} 断开成功", + timestamp=now_iso() +) + +# send_message - 添加success=True +return SuccessResponse( + success=True, + message=f"消息发送成功", + data={"client": name, "type": message_type, "priority": priority}, + timestamp=now_iso() +) + +# send_heartbeat - 添加success=True +return SuccessResponse( + success=True, + message=f"心跳发送成功", + data={"client": name}, + timestamp=now_iso() +) +``` + +**优化效果:** +- ✅ 所有WebSocket API响应都包含明确的success字段 +- ✅ 客户端可以统一检查操作是否成功 +- ✅ 响应格式更加规范和一致 +- ✅ 便于前端处理和错误判断 +- ✅ 符合RESTful API设计规范 + +**技术说明:** +- **统一响应格式**:所有成功响应都包含success=True字段 +- **明确状态标识**:客户端可以通过success字段快速判断操作结果 +- **向后兼容**:不影响现有的响应数据结构 +- **标准化**:符合API设计最佳实践 + +## 2025-08-15 Windows机器码获取命令更新 + +**修改内容:** +更新 `app/utils/system_utils.py` 中的 `_get_windows_machine_code` 方法,将获取机器码的命令从 `wmic csproduct get uuid` 更改为 `powershell -command "(Get-CimInstance Win32_ComputerSystemProduct).UUID"`,以兼容 Windows 11 系统。 + +**修改详情:** + +### 原命令(不兼容Windows 11) +```python +# 使用 wmic csproduct get uuid 命令 +result = subprocess.run( + ["wmic", "csproduct", "get", "uuid"], + capture_output=True, + text=True, + timeout=10 +) + +# 解析输出,跳过标题行 +lines = result.stdout.strip().split('\n') +if len(lines) >= 2: + uuid = lines[1].strip() + if uuid and uuid != "UUID": + logger.info(f"Windows机器码获取成功: {uuid}") + return uuid +``` + +### 新命令(兼容Windows 11) +```python +# 使用 PowerShell 命令获取 UUID,兼容 Windows 11 +result = subprocess.run( + ["powershell", "-command", "(Get-CimInstance Win32_ComputerSystemProduct).UUID"], + capture_output=True, + text=True, + timeout=10 +) + +if result.returncode == 0: + uuid = result.stdout.strip() + if uuid and len(uuid) > 0: + logger.info(f"Windows机器码获取成功: {uuid}") + return uuid +``` + +**优化效果:** +- ✅ 兼容 Windows 11 系统(wmic 命令已被弃用) +- ✅ 简化输出解析逻辑(PowerShell 直接返回 UUID) +- ✅ 保持相同的错误处理和备用方法机制 +- ✅ 不影响现有的 ServiceSerial 功能 + +**技术说明:** +- **兼容性提升**:Windows 11 不再支持 `wmic` 命令,使用 PowerShell 的 `Get-CimInstance` 替代 +- **输出简化**:PowerShell 命令直接返回 UUID 值,无需解析多行输出 +- **向后兼容**:保留备用方法机制,确保在异常情况下仍能获取机器码 + +## 2025-08-15 WebSocket消息添加ServiceSerial字段 + +**优化内容:** +在 `app/core/websocket/manager.py` 的 `send_message` 方法中添加 `ServiceSerial` 字段,该字段从系统机器码获取,并在类初始化时缓存以避免频繁获取。后续重构将添加ServiceSerial的逻辑提取到单独的方法中。 + +**实现详情:** + +### 1. 初始化时获取机器码 +```python +def __init__(self): + # ... 其他初始化代码 ... + + # 新增:缓存机器码,避免频繁获取 + self._service_serial = None + self._init_service_serial() + +def _init_service_serial(self): + """初始化服务序列号(机器码)""" + try: + from app.utils.system_utils import SystemUtils + self._service_serial = SystemUtils.get_machine_code() + if self._service_serial: + logger.info(f"WebSocket管理器机器码初始化成功: {self._service_serial}") + else: + logger.warning("WebSocket管理器机器码获取失败,将使用默认值") + self._service_serial = "unknown" + except Exception as e: + logger.error(f"WebSocket管理器机器码初始化异常: {e}") + self._service_serial = "unknown" +``` + +### 2. 提取ServiceSerial添加逻辑到单独方法 +```python +async def _add_service_serial_to_message(self, message_content: Any) -> Dict[str, Any]: + """为消息内容添加 ServiceSerial 字段 + + Args: + message_content: 原始消息内容 + + Returns: + 添加了 ServiceSerial 字段的消息内容字典 + """ + # 构建消息数据格式,去除data中的type字段避免冗余 + if isinstance(message_content, dict): + # 复制字典避免修改原始数据 + result = message_content.copy() + if "type" in result: + result.pop("type") + else: + # 如果message_content不是字典,创建一个新的字典 + result = {"data": message_content} + + # 添加ServiceSerial字段 + result["ServiceSerial"] = self._service_serial + + return result +``` + +### 3. 发送消息时调用ServiceSerial添加方法 +```python +async def send_message(self, client_name: str, message_type: str, data: Any, priority: int = 0) -> bool: + # ... 其他代码 ... + + # 添加ServiceSerial字段 + message_content = await self._add_service_serial_to_message(data) +``` + +**优化效果:** +- ✅ 在WebSocket消息中自动添加ServiceSerial字段 +- ✅ 机器码在初始化时获取一次并缓存,避免频繁调用 +- ✅ 支持字典和非字典类型的消息内容 +- ✅ 完善的错误处理,获取失败时使用默认值 +- ✅ 详细的日志记录,便于调试和监控 +- ✅ **代码重构**:将ServiceSerial添加逻辑提取到单独方法,提高代码可维护性 + +**技术特点:** +- **性能优化**:机器码只获取一次,避免每次发送消息时都调用系统命令 +- **兼容性**:支持Windows和Linux系统的机器码获取 +- **容错性**:获取失败时使用"unknown"作为默认值,不影响消息发送 +- **灵活性**:支持不同格式的消息内容,自动适配 +- **代码质量**:单一职责原则,方法职责清晰,易于测试和维护 + +**消息格式示例:** +```json +{ + "payload": { + "message": { + "device_id": "AMFU6R1813008221", + "status": "device", + "ServiceSerial": "12345678-1234-1234-1234-123456789012" + } + } +} +``` + ## 2025-08-15 实现系统接口获取机器码功能 **新增内容:**