From 8fb7de056e5054b46295d45a178ade55827b7a43 Mon Sep 17 00:00:00 2001 From: dxfeng Date: Wed, 7 May 2025 14:07:47 +0800 Subject: [PATCH] first commit --- .gitignore | 41 +- WEB-INF/lib/zip4j-2.11.5.jar | Bin 0 -> 210027 bytes .../secret/web/AuthorityChangeController.java | 12 + .../web/AutoGenerateNumberController.java | 12 + .../QualificationApplicationController.java | 8 + .../entity/autonumber/AcceptanceNumber.java | 24 + .../entity/unpack/ApplicationResource.java | 24 + .../secret/entity/unpack/CheckFields.java | 15 + .../secret/entity/unpack/DataConfig.java | 29 + .../entity/unpack/DataConfigDetail.java | 31 + .../secret/entity/unpack/FileConfig.java | 23 + .../secret/entity/unpack/ResourceInfo.java | 26 + .../secret/entity/unpack/UnpackParam.java | 24 + .../secret/enums/ApplicationCategory.java | 32 + .../engine/secret/enums/CategoryValue.java | 15 + .../secret/enums/IntegrateCategory.java | 44 + .../engine/secret/enums/PrintCategory.java | 41 + .../exception/CustomizeRunTimeException.java | 22 + .../instance/AutoGenerateNumberInstance.java | 234 ++++ .../service/AuthorityChangeService.java | 19 + .../service/AutoGenerateNumberService.java | 18 + .../QualificationApplicationService.java | 27 + .../secret/service/UnpackZipService.java | 43 + .../impl/AuthorityChangeServiceImpl.java | 67 + .../impl/AutoGenerateNumberServiceImpl.java | 42 + .../impl/OfflineZipUnpackServiceImpl.java | 1135 +++++++++++++++++ .../QualificationApplicationServiceImpl.java | 239 ++++ src/com/engine/secret/util/ConfigUtil.java | 24 + src/com/engine/secret/util/ExceptionUtil.java | 20 + .../engine/secret/util/FieldConvertUtil.java | 166 +++ src/com/engine/secret/util/FlowUtil.java | 81 ++ src/com/engine/secret/util/ModeUtil.java | 480 +++++++ .../engine/secret/util/ResponseResult.java | 192 +++ .../secret/web/AuthorityChangeController.java | 39 + .../web/AutoGenerateNumberController.java | 38 + .../QualificationApplicationController.java | 49 + .../action/ApprovalReviewEndAction.java | 75 ++ .../action/MeetingConveningEndAction.java | 119 ++ 38 files changed, 3510 insertions(+), 20 deletions(-) create mode 100644 WEB-INF/lib/zip4j-2.11.5.jar create mode 100644 src/com/api/secret/web/AuthorityChangeController.java create mode 100644 src/com/api/secret/web/AutoGenerateNumberController.java create mode 100644 src/com/api/secret/web/QualificationApplicationController.java create mode 100644 src/com/engine/secret/entity/autonumber/AcceptanceNumber.java create mode 100644 src/com/engine/secret/entity/unpack/ApplicationResource.java create mode 100644 src/com/engine/secret/entity/unpack/CheckFields.java create mode 100644 src/com/engine/secret/entity/unpack/DataConfig.java create mode 100644 src/com/engine/secret/entity/unpack/DataConfigDetail.java create mode 100644 src/com/engine/secret/entity/unpack/FileConfig.java create mode 100644 src/com/engine/secret/entity/unpack/ResourceInfo.java create mode 100644 src/com/engine/secret/entity/unpack/UnpackParam.java create mode 100644 src/com/engine/secret/enums/ApplicationCategory.java create mode 100644 src/com/engine/secret/enums/CategoryValue.java create mode 100644 src/com/engine/secret/enums/IntegrateCategory.java create mode 100644 src/com/engine/secret/enums/PrintCategory.java create mode 100644 src/com/engine/secret/exception/CustomizeRunTimeException.java create mode 100644 src/com/engine/secret/instance/AutoGenerateNumberInstance.java create mode 100644 src/com/engine/secret/service/AuthorityChangeService.java create mode 100644 src/com/engine/secret/service/AutoGenerateNumberService.java create mode 100644 src/com/engine/secret/service/QualificationApplicationService.java create mode 100644 src/com/engine/secret/service/UnpackZipService.java create mode 100644 src/com/engine/secret/service/impl/AuthorityChangeServiceImpl.java create mode 100644 src/com/engine/secret/service/impl/AutoGenerateNumberServiceImpl.java create mode 100644 src/com/engine/secret/service/impl/OfflineZipUnpackServiceImpl.java create mode 100644 src/com/engine/secret/service/impl/QualificationApplicationServiceImpl.java create mode 100644 src/com/engine/secret/util/ConfigUtil.java create mode 100644 src/com/engine/secret/util/ExceptionUtil.java create mode 100644 src/com/engine/secret/util/FieldConvertUtil.java create mode 100644 src/com/engine/secret/util/FlowUtil.java create mode 100644 src/com/engine/secret/util/ModeUtil.java create mode 100644 src/com/engine/secret/util/ResponseResult.java create mode 100644 src/com/engine/secret/web/AuthorityChangeController.java create mode 100644 src/com/engine/secret/web/AutoGenerateNumberController.java create mode 100644 src/com/engine/secret/web/QualificationApplicationController.java create mode 100644 src/weaver/interfaces/secret/action/ApprovalReviewEndAction.java create mode 100644 src/weaver/interfaces/secret/action/MeetingConveningEndAction.java diff --git a/.gitignore b/.gitignore index 9154f4c..e3de2f4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,26 +1,27 @@ -# ---> Java -# Compiled class file -*.class +/ecology-develop.iml +/E9-bmj.iml +/out/ +/.idea/ -# Log file -*.log -# BlueJ files -*.ctxt +HELP.md +target/ -# Mobile Tools for Java (J2ME) -.mtj.tmp/ +### IntelliJ IDEA ### +.idea +HELP.md +target/ -# Package Files # -*.jar -*.war -*.nar -*.ear -*.zip -*.tar.gz -*.rar +/src/test +/src/rebel.xml +/src/META-INF +### IntelliJ IDEA ### +.idea -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* -replay_pid* +/log +/src/test +/src/rebel.xml +/src/META-INF + +/log diff --git a/WEB-INF/lib/zip4j-2.11.5.jar b/WEB-INF/lib/zip4j-2.11.5.jar new file mode 100644 index 0000000000000000000000000000000000000000..c08f0f3b0c62027d84acb7b8fc068b0deee870d3 GIT binary patch literal 210027 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

n|?(? zrU*dpAy&vHoLbiT{rs?iz{C;v`n#3zpsg%oLTio0CrxN#PKBn}Y2*hP9Xvr=9K%fj z_54(2HjnurejltMY)bPbYynCm!U=dctlvn6w)g1U&vb2o^U)|s*pDy^T= z%v8@cKeexL!VqUPBOi6Y7A3C)H30RICW^HVEkL56CHPrnss0%s57IoDD_(;46?a%U zjD5NU<%qwF+g+TD;E(6yNb<>ikT#1oC5PsIS3|+G6i0<#V&ov;~lxC=D9Bg%okkt9M zYV+Yv^NA2B9QA)=*DVC5pYsSk^i=chNq(%XlD9aU`U61IL4o$AaYg@x_$yd5oG-h{ zLI43F!2hRU&GA1D))J;3V)jn9hAuAuB#~yR+A7a$p!(9wW?(BfP)0mMS2Oe~fq?x0 zc5M{MQ_^!Aud6s8|D9|N7ebm)9Lc~x#J>&kp@ii=6vMSga3jyb?QN&!56x9!{JwF{sQClLXrdbCEH`5iZ41bhCPFoed2I8{R+yJHct$ z)p9fTP!{VYA#)?XYn}R*x)>9AnQj=`j(H%`UlrVROcw+8msBzdI!*@KPR(_=Y<6|L z_Q50d6P;yqmeh4mIZI>`E>ddK!9vUABt_Th{@$O5ksxPEhxjt( zaq5pYGzJ`X=#7;Nt+Ek#)}A495j`FTty78X4kP2?Dr;l+Ji_I;*Qfnpm%)R|j>$w= zE!?j#TX}wj;ZbUCIKHZ=w4MUI-Z1>6#xA&`>~R?iOjX9r)aWj> zMv}wKzDqYS$&fbgO+WhUmV;{wBGK@=jZ}y2pLK_If6oI#_+8$qFz9y}xZ*yVA^Ufx zu~MjU^09yHtWoK9Y;t8qh=~Y`WT)P+F?)_{I_hR%3;7V@A5bUvUkj7+WO=^Uw;zM% zlc!PeUM`C&x(T?e;JOZ8`%Y(!EQl(=XVBSI9vs}Ilgm4*k5h>$(id4+YCSI{Yvf?W zP_;CnRALg@Cz%{bWG9MQ#AQwM%5$8-u2Ld->s*B7_PE$GFnIOH+PFrn!vS3M(Tg$D zSXJNRpA|`ra9(FbuS8xVW<@Vx=LA_2#Ker>=V)qESWg5HHc;~JFh77h8-Y7HSkjsmAhw9Ac?ix=Er^>^eG)v#Cv9k(;Y@`_sab~@hU;%;N0at?jNF3r%cbGk3kv%uB|@r(?yJxJx_qPJv_IEkFeCIqu(bMRuC z%(k=gP~uAt?*zClZ_rxBVS(#284{8wRLtDXj>mq7J4;q5C&9fKIn=+g0#Xw_QoA%r z@_u%qUsC|@*#Z}!&Lj6QViKGD`CGk#6aP<_-8Ueh^Zy9K{3Ss9-yy?)PrwxnoeXVF zzYO{x2ys%Pt^B+K>hSc&E08vOQ?EkiuE1=y4JtS#UmRmBhoGpZM54MWtM=%Mgto-B z^E1$e>5`JC?VKR`bNYXCJE*nazquGb=qp% z?Zpb3ee`fJ-51Z6pJi0rHlE6V(?itQ+L+ZU3r>hFZaQV3Ai3-X`NigHl?qhFb4_nM8npbfY%?|{`f0yoQPw4j z-~q3R%-a4u`U1$Lw%ey&s8xv_h_D(x9K(*zhuqFfM8y+RA$p%3>4A%=nJ}x;e4+Y6 zcXuJmN~mp9%td;u)ohkYV10IeIW%lvEXcQ5A+~kxiXt$uxmYDa_;3&?3F=rPdqgML z;y+JZiql}P8J*wi5Bo6r_AvQ8kwC2ivITrvL}BgbvnQ|bKpFD~*dp}VLUSP)i?hDX zuV9HZ$lSw%I*HQZeYk=nzuc19!L8^Dk=BS{T z4MFMHI(FDt1%xzywtUy5H3f5n_rWMKwg6UX0Mj$8MmbF)ieY8Cj4OwHl5kJ-F4Wn+ zaMEj+$0W&{boNOotdY2tB4wb7Z9`%b(L*{*RM*Y(RI4vwl z-Y2+ED1qjz_XsrVLHM-o3n@Vgc}tBdGMIt`f(#YVF_`JjE5KzB^=BiGPzce48`Xpv zR|GPkV>lCmS6~ibBJL>h^9%2UfQ$&zZo>F7J-x4x`tR{is{e`U{S)`Zi;{)zW5g6W zs_#|VA#FmnhkPZvLpA3e$RxmoHHQT;1;M-cp=|N5aDgZJL zplM_UWuTwimw~L7C1+Cy?WPd5QY4!&V_@wKOQ0j-Vr#BOO;ZU#JRG*syW^&qXke6) z)O8$ORc@+CPueJ8gBzdU;L>KSKrZf_KwU=T*0EB=CLn~J8FsvY(CMj$_|pw6bU!rn z2sDfE*Yuf16`4xECfED*{`b>o{7=(Yb}_UwF?2Hdmx^bSsnq?>5Kq9fbq zra7A0O*qv;hJD7>@=I)%AAf-&pS=8DS^4p3wQLGZr%umgaK{lv zZq1HS$Zk!?v2c#bfI)Xucd%;JUA^#*~3(nz(Ud0bDD zkTnMd5~DN!Cnn0uiH53QzD^y6ttNJ3+Hlt>t1Nq=YP_D?V2bKNf+=TXdB;8jd}MNG zpBSrSl7$!_)mXTFif;P%q*KdZbX&+X^LML1x@e{&n`wU?CI-o(!ZZ$w`b#V}^W^-B zb^&Vw-0lves1*UL0?=ZUR9(PKitHp~iqPqj-7K6FgwJ6Gpau{O{HDS94`vY_BO8 zRosd+^;kb}<{CDnCfR9{%{LM&E37t?vspLN_pV1OtBqNfq1dHObkH*7jbJenFo!`) ztfpw%rOgUH@VLkmo)PEA9LU2ob&!vJKNO9=p$2|=t`ufvnDIJ^DQ^9f?oozJwF{QH zy+5zh&-hv3NnK2A57BeUys`__L8J_0XwgZ@Q`GIkHRJnTt4ZP5d9U)!S8a3Sjtdo5 zna$I(^0L`~N*(OX%zZC`U*Iu!aDfNw(tQL|IAZ@Bs>w?LygxSoX?e=bLD z#bOh8nHi3OYqk1iw5tw01Fy9$BcA$3UMI0xbQ8{Xa<9#or-gKd91Cavs*N~e zc_6{Nvzut?ZJ)akWMMR?))sC(hgzmH8(8f!%{U>_X>lWRpp5 z4v5=3-T@qH57oVdNvNrM2i9ia;a9tA%#S4{73 zhZyIL(Pj1Re{XGI*gb2B|0;J~|3`QKKk|3~LUBk^Rs37E%dW1Lh!(L{Q6axV6$hD- zdTA}cAwY2U=R&TUMTN9e?_$fS&3Cm-O9C#RW16dnLB9Jz2<`&IVwdZ(3mHGjHw-Sk z3-=V)Jg%vR`ueAA?@P|7A4l9rm!F^SC9XjIv0PIFv%fl`!#MIsn)5Ks_i(39QX_YM z;BwKIW(6q8m0ehp=`Jv#h*R8J-8jOgEa<3&)LXSw?n&WFHf9Z|;^iE-6dTLso^|Qs zxTjd_v0c%wMx$~lITWT;tW3qL0-S#HxzVWK(mBnsk4}E9n~LOq6gP~`;b}jb=n^vX zlh1g~x!KsO2*^*z)CDlnBX-iIfDL$pTP_@!+TRR_EM`I3f>MPZ zT_u@J)>pvyTS7MqKuptbWY<{%r@FNw?L{7Fg3z730KWR$8CcOVK46E*DUyU%esDG~ z@Qxoa&4#;t&qCvMk&1zf%{kVs5HglxlHV-TeM(tRE+o+%Pe@7Ce30uYNyfj%a`h<^ z@Y_jtT^?IBE!$b!bgC{5>M<1=w)3ANJIPwtiuVAlIY>M8sg2tBMYRZ@3izL&sj&03 z$7i@$>}jB>den*7*Vq{#9D+Ihsn>)(7wYyWN(DJt_Bj|=qU^4v2k~4lW8=9qb(C$l zBfHvC-ZF@OHuBbmt@+h_NU6Bm8u zLRkxtS@fF~A-imi`Uug#j!SBwsh?}rG{IH()-L@aopv>%i8e!Tk#;;@Tl;Z>*?XYJ zo5OIM%MP=)maz72l8i+GM4Rbu>rICc0QI!nN2h62bKza^2ff=uOLxGet@cF!UWY4+ z(nkj1E=XT*sO4$>A-!Hb2c41fc|PD#FhqI~Qgmv*b`srj1W-&2a0m8&`8fH8A`Z%1 ze*E4gin^2OdivC}@5P{w)^H8%#ZnP!vV_>#1bsoJ#jMFvR+axCzU53XjBkPax6$JUCus|(}J5$L)o(Bl_VV&V``XHueIvRhyx+vUjud@!aj6eDVVH*vDA-_K~a z<7F?S3JdRK&wykbC2QjBQP$Z{)FJdq6wEL;mf5$1W}5m>Vmor=Pob*x%;cqKqKdAz^1vEGVxFi`966trYlM}-Yr3M*`j8c`DBu-*;lnSeCrJaNtU1NV| zt{r4fe1<%-xx{Z(o2S{Zwr`5;DniyI)W1Sla)5su_Q70d#}&qu#5Dv9CSZm(>_EP; zK)iYTIhD8I4xF$NKKi+*rF160;UPgON!Rb*5|+Jc&-&%1`IR#y-13w5Ab322O2t;i z379`A6L>EQxQ6=ME!kuwXIW8qaiFiMPINEDew=U=mBys~>6_|CLh`$rkUdUst4c(@ zKWk9oxxY|SwKLLY*ZcACFh~f@n={mC^*W{G@uVVo_6xF?AU_3{S&csRmH4UJ2woEhEG;;?q2-yhK5yl z8w*>^GI$pv;P}ZiiRD?`tG-u9YE$?aV^&IIENs2_L6!D35qbbc_q>=!_h8 zCVbu@2aTS#iatL)r^Q23y)Tb(KVc{_b|bA%Ep+%g*lPmvLc1Eg+CH$ikIB3u|Da-)-9uBlU|yde*uqU$TLePu5g6<}fu`f9JquG=If9EM;$pp#`}?>GJJ&lz zjHTw&)7#H4chVl%$aU!O>NR}G%pG12VA)j~ib!iY+|BS^lUeK7*_B$VXl`;j**JVt zIa`S2L&IBvhwW}(BJWgGVcVY<>$V!4b~>8Ju?+gQ7U+nGaA@NxS76@>_`4wX0LCA= zq5vbLYrEcnSB3M>k9mW)*9SkwYUL8{Scj82W($o53vJ4)<6}5@>?k@`4i5*ARHvhA z@T$klEMPr)dQpR^fiN<{dNpeVoMO2LFz!x16i~_}h~kHnJ#f>j->pzD*?he4aW8kv z!F$%rk0F|2Ve&nbQ*yl%z8^e2I<*GMl;@{fu+XioU_EQ8sn*x|n)MIYrjO@`*Li}0 zFA60tCsT-CJ3`Qz8qL)dE({8}z=`eNPh2jy54KK>aNFJddRdHtNFZuiHKEgi<<-leMLDm=eSHJy1fD|Ee?d92o4 z*cNy^oq$BLxEj$q^t*l|Jf+aH1qV;m6yugY$Y5<4UKaF@{8klPOxz!GtDMIH6a-Sq#Aw(foSz zR_MiO;kUShqop+%kj7KcZ@ zg(8W><>DEQ3WIhN4lM!#KPZBB({B*I)w-A7pr9ZK#&+2ZUB*`XEgOe5i%h7_8r=+t z3#Wr}kj{?IK*QDJ*`mCy?Ov>HiAJmbyq*XQh@JCdSw#hMYc+;rue~ASmih88iMEm0 zUMMd8&NdLKtu|LQ?6;R-;f)>v7L(@YX=wGpfT4g+xg(%i&)bEc-gH_v0mA3TF0R zA2=B|Y2@fvJ}z-1X&wz~~) zD@9=!2*Tukd)et1S4d-S?eCbG;hkyoxPiacPavn+SvZ`GV>H_qFt=#)enK6&+ChTM zFrS)0AhX}OHrMinS4%14!TPHP6`Zr9xKVXUslPa8V}33JYxk=Ma9R_V9WYY zx&|=Jn~f6QBYELyR5p$dEmZkoHJm!pHJd15;ZkbfJknx>_oIKeeJIV?N0#Y=D&Bsu z9Iir3tB7iva%!o|N-33U3Kt7U7??E^Y@?u)Y6z9U>O0$ut%lds1T$;Y>Hx}rJa z$B~__NhCm*J00;Wf70WWh0mK7AD*(0e_d9!gl*$vg%vklvakn%OD z8ujLi-SJ(b(l0NsXb6-&?vgICmvjAsODS-;rKEv)CVXjIg2{1cg$_kT9$FED2{i}3 zVoD33D6&DyCNetttM#@$^3FDu=0YMiJd^yIM zoSB`NoLD-Z4?RuvsG#5dQfg2~Sk7_qu;(|ISDFH;BI_LP%RegW^Ek6XlIUkN_6yn3 z*}c^3P`>lnS*>2vYM-ZhWwI=`DrK!3smqNUr4vSU(oPYQ$`-I^9SMtz84CXi8adA* zw&^$k2j1kP5~?3UE+tfif@8v9f*_02HbM3@Av$%e(<6tG)+eH^B6i`Xicr!fDYZNC z>TXz9K{nvr+RW&;KKb5#X<+|C$}jr#N>}HjW%A}itn8^tGLGP4BR#cSFHE4jq{}aD z;wHX9Yj_mhR4)qd?h`Z}tx3G6mItHwifY(CpTTEWFSz1agW;C`{q>`7lU(830inQI z>BB0My2@zr&5YaK-OR(S4_H_{0z6%#$Ita?&fB+SA#4PmQql^R$QD{0ozV+ z!ngYfk?&(JU5wXZUf9rC5=WrNoQY(y)fns>Rf-#&RVY+LeYs6byH2BM-(u`{ zRk(Qk&$=>KwJZ=|e)>&51;p>+GUM}Ok#eL<0Fw(#UaG2ra}!SK>fhAzbQ#@!>Jo5% z>DBY`XS2xty$j`I6RHQ%D?{eP?+f(%^x|+2Xi{h6MpS$RPpEkvFSn?M*Yx|Pl1Q3J zDJ4}&?7Z+o3ni^Kgms}}eMxEzF_3vl)?zdZ@oL3MrQ})>T*M2^@kUEO=ERg3Y)KzX zM8_+gBZfhf)yPigHOx}UsUw)*Z&YTV@ZeH%%Ci>4r#tW68ICUY1Wj$Jp5gjtxlKA9 z-WU53M7TPi-5K}^f8Tl2QhfeCxzhM^zq{4Bq#@@w;B+{h^(Xp4p5b%DI_ltEoEGEr z_rd@F0DX7Yiq%|72_m^x;3J4=&^nXifWa$Y?W1VV{u#3BAt9HoV{jQ1eTeu zjN@!)CYf?M-!N0JrEJ5+;~Uba+`RoHKfTlI9&yRn$7j{cu;`SZ&i?zbD1A5E zpO%q>m_ znV9s4p>am7m}E_%v%9gFB=n(xZgL$R8SfVQ&rAoaBDofhobNmL`36}Iy2!k;_ok&6 z<~|@j2+$NIdYJI=OdRcNaoWG#o#-r5Kr zk95PwLO9}1Rt)l`jTnAs2b^_}x8w=udsCx{(ouKb3P&!1ZG|`sH#xbi#Xz!FxmyKa zUl*A+O6C5D6tzOl6obF=mK(Pzeo<;p-`y8J?~R1!adY=jc;@=%mLK>9@f!bxxGWU0 z7j$$a6L#-f&WDw}v1f~WIgdUVhTYI)UT!(ypO}Sc@`#Ql4m)r{V{wj zmB8?^e(`I3>DI`oPF`!U`R)>{md*cEXma_knZw^qDt$B!a)5UdbL-NWY_26?>qX>x z5_JDeW26<_rbWX_mrtJ+ihpuY`ttQlT$@(Jy}3xtz0yJ}Gq<6g)S!P(m zF~o$)4t?=V%A1N;LAu;k2g^yP8~VcpI>R8Yrs_lz%OKB-&O|d63Hk~w3XH8?7@2|& zZLpyc)^GH2Hh-fcvlfk_Rw6a)h)}jQ6TnoR;lON71=aUOQ@ZiwYo)H_M!G9))dN<| zUt3NGGG5;*#_d}>c;A0(l$sVc8&ZKZ3fAG<(<=Nfu4aRVO~|QK+-}OWj>?BBoGi9m zYiIuW{!R^YfRO>#05f}KbVe_7)o0){>FRv7b7&`bdiT_RJ@jWsHE{rWE zl7Lpbe#C<)0(IR+7^pu$n01AOLnJ~sK-gu4mqR4RK0w%piJAk{6;pa)&o`eAooLMx z@^K|Q71$>f{y8fZi2<2qhuO&NTt_>NAv)Z0GLb}Y?m(32ItI#KEgt}7 zie$(b%m^f!INgz!3CSFh+gQ>F26DDwc} zx==ok%tZ`5jZq7OhkoyFbAjD8}$pO|pswcTJ zE;Wh`8bzZ30A~&RXc{F-VvVb395t*{33WV~9$KK8;J|3jtY$3Ri&0tD62=BsUst>b zw*+f5m>!0uQGZQs{e9DDQjmX12i9a#*n8-r7Y$G@VV95w-iR*ksD~3b^=bFcwWXZH>8+nO5(#&>f zsFLnEx)Cj>wka>H5w9KKwk@?J*I;_lM_0L#IL;D~=f9InUTVO=twnDPn;)R4bnI>X8~;2jpL#5f-G3S-x-ao{*(n=@re5D=$auzWXZj&fvhCW3R&QUA z035|6Qot5s@gTP5W)szLksH^9Cr@I}jTY+Vr4ZF|)q-@v*fWA7&&u>omTuJFYJNmp z9?yu}i!ZX{=^5Me%2ISfNYrG1k|NR~SBucJ$b5WcUEYzzo*yst-pV^#m zv~AAe>wxZV(pF{8xZ_5rNXM*^5pIfu8cMn-rxGMe1nht@Ibj7(3&=5M(4>T4xlT8b zDt7q(WBnuwo}Qr81PB5LNAF1(M>Wt6uVWeW>U^19)FWSKMP+tUPmI#wXBJTRwN~V3 zw%_h8B=MV9hdUmIiyszyH2qeElG9EiHB&DNe(C$PpD@13;=d8bWM@$trMRMJkL;3T(v5YEfaPDkw&pi-{U?!HDA(W&_aWoPc~Q z!OB7{WEvX1YwB_~K)IE0WwB7$qN=tL+#niaVP6rZ8y+r{t^= zxTv#)$QHwS3w1n9h$)-kU9;Hm9v9~C-1lkzR zrdVYrt7NT_u&A|!+8E8IT4gS)jH5BXD7FNf)R$iN9bi^AS-ENjV;#LVmR`{WI4rxU ze6fPC_Fo&-Ds=;(mu*xIS|M16t&MAyKLV1=J}M7RfvkhMMzqS{0cvIam5Zm4)=^wz zS{2cNrLw)shf`4NK(5iXQaOOqg5?sqYe=JJmZ`1ck%so7=hAmq|3+P1lM96u4emwL zC3@H3Mr~cw3&mv(??u-oKG(oT{S6a5g=P(iMcXAJ*I%w08>V=QPa5KjK1)mwKV5Zr zO|leXG$2mv7Oj`a9zt9-J56;JuQb#b zy_eV?{9Sc@Og0p9G}ssYDz#5p&YE8P+6ubrF3asJy-&H%x?X#|3}OR5W(djN;sn=f z32;bjb1(}-J{AZY&&|QhjQQCmc;A8r*Xs1K3-R8P1lQ{IaZJD;aROZoy4gk|&)vb( z!ag<$S?c*QN$dErP0$}H0#(lcz|Qr2+Qe$E>ch^(eJm1Yt!%;0rG0D=>aOs^GUM3F zu0E@`H@wqNn7p{Q=`QR3o`VSYURYna&0yO9ds#7fySDSdBHaW(hB`}bSn&I$$q;{!;e1p^`3I9+2~5f>LW|q)Hg)mAt4$0;F?IOA z$eB;Sox85uj}G3tyL{jca9O^$IkbL*LTywrJR!L_KYuO3&YHIA2>H_DsTsFaiWq)^ z#bPh|xV=vxf+2%Z2ff$+oJtn3F_p_LxRpET989}?ul%W5&StgK@bf!Q-9W9B^CZS` zb`9J6*?P13hrz6Fl`{p~*8T6-c$|g(w$8F&IBevd99!4@KfX3B?q_zNc2%k?6W+aY zG&YAHLtHEeDb`itYpJSdRQ@fr-m-?wztpM6>smApDDNr{>}-8jV3$ZYp{?!hU)cK* z$g95x1{a_JXbmbagSw0czxuX>mfIhi)|IwtGwU3*dN%E1{{p=i_D5#3*3aYwA~k;wL!IwjR;b%iUX0@L&7S<4Sx?dclLYEMSDWw;eyeyghg_;~o^ZX0>Gx!cf!-3G{NxNSRr+`e)ImNm1ndc_F=<0W1|% zhFX1AU=fL9HG|kQ{zYq`DWSnZLz}tRZSYI%4kJ(pr_-C&53N|g$eOmd=x=95Y*94a{FDT^OJ z#4H$6ytR%@Mw~-}*xQTWJ8s9RZ1BtEJ5956xn|)M%d$&3-u9GB3MKJd2;O1>fGSBs z^VD~TRLMTf^9tm37wTdihY=Xe%wC=8=Z?=_6>+&sBN)umTnw(z@W+{VD{p-JAc%e= zAJzkECzHdMbQ4JD-M$u_uKhOj{D{#)ue6WsKK^6Z?|!7TUa?P3c_{+AG73s3A7YWg zGS#mK-Onjh@4_9k8<4nNAqfZV_jd|tR`T%H7Z2_It5){!>twk9PY+`1VQlK)Vrg&p zzp9b3{5NBLc_Pt&4os@z>F|$+t|XPeaY=p0#eJiA0I@L-4;8L>}pt`%6Tg#owK`9v$#~u}MFlUtVy2o@rbJ zLXlp00u@uKbFrl`m`$W)~6d+7Vq z=b0B6q#;nhuo~m28EOXT{AfIrm|^a^T5z4-Tz7sXC9Uh4m++|WHuZMfZEWZ6&T`OG z%i0LhzC(%mt-HsbcK9L*Wgc$Xq&7QWY-dtGrPF1=C>EELsi@N^p*$@`Zml9yp`i(oBBz5*mQfo!suGG*|NbDv zNm&JIdc1Y-#ih-h8q_*$8-dVW+ev=)rbWBy+f=!nJqPJsUwxH2nI&7I*TBxJr6{6# zmIlh3ywRk;0yX{Ej9jT$aysg#rFk2vl`XaQUIpV)G zqVC68a%Nf)(uUn}!(tK^;qw^-rTgR)D8^}YL_>XlGCNz|lk{DE##L`ar$h&ZrUgok zI{U|7EkOEh{_xkiR2L%1>k>~PMAD2!39!ftaDkaaK`&H~EhU!7A^a#OqyXbY;|;|L zrPdGorRDND?gT@j(OMsDrv~3VGd?B-<5OALeCe{n%sSg^wR7fhEGCXF&lpEN>;2yjdRHC{(!l;Q6(O-__pxi}zh?J)Z}_Z6Ra2m zo^B((&eZ1NHiHt0rXj>{pn&ANjy64DaQsBabr9zlQq4|%Z{OI|st&ZI(c zni48uvxG_#)kIY}WqK($iH4aEV2flcZ43{b((BGmv*uIh(Ya{`4_!bjLS|R=s*1$F ze{n~yy_en=-aXfwAOxC1p(TBkPo|Zo-_~La;>hlI!^qClYd>h@^E?)xfD8xt6++Pv zD1fCqEIL)D#^fueHluTC<(VH6i}#2j9{1UX$iNmG!vRqNp=04MqMT}S>Q;~lK2HMV zaJq-7P_MT=etbONUTxJ2`5__7zc@K8?liQW)@W-_eK3BhyU0xPmU-Z{yiM+`I`G5( zO?D3Hs6Q>=2jOM12M2%00~A{AbH~ZQngnI9Ymtussrhn5z)Z?-mt_Yt3^kEHo(@~SSTa@`rUg0+7E;ai< z=_7O=DMdDQi8Q*QL&Htm37EP?7~WHy1Q*Z2qC}X7l=FMxG?tht$W4_+D8#*QSkXaC z1v4;c-h63?`V2XFkS@A8rw*J0eEE@a|;yn=e$CU>N5D@i$2`Bt_2M5moc$-+78JYe| zA^bnxOaC)#;(wncVP$J3`5&iB7@4>_ID7r)_fet=t*N`>_KgVlVCbn01kINiFVTvj z9^<}|NbmDomtBeNlW#Nfmy`$Cu zF4)XQLwH+by>&^pjVC|8N*%f9hT{;;fNGCZqbUOuOd@vD`roO z!S4xyeUE$Y8b5s~=j0jRHU*_2@2QF!A@8^a`l#m)A@2o>0hGz0uQwsyYB;~T7-60w z6@Q45P0|CHWzF$ye;5`o=6zL!etv;l-{uMM#c}$+GJdvc zeg*h$b}Rk)8D>{H{PC6Lt`bb`;Orol6rE45N3Lkj=7ULji|;oxCuUSBhEmfPMn6n4 zDp9Oto1C!fuq%#ugn}lZs=vP7hv|lx_=@B2Ae~)V|GT?)@-zR9)Hk9)WYmk?NT&;B7&s z&Ef9KGb4XY&iza0=bzx%Tkt!XSt1Dz0q5XXb2LY(4xQ7Fp~qpdyEbfTw5y}3>SX%V z()IHPYT3YJ+D(R=(+9)Md1laK%*Q+u$co^;iYL1d|y#nS~ZzPj4;IyLwQPf913T z{4GJgrTeozR?_!&vtkw7#!f9nUZtdq z32QFL69?d2)*4#G0HZ)+3;zGMd%xhrL4l}n>@*~SJ(t}LRTpz|y zV^jz6=cAOVV&9tL?KnCHTb>37R7;U~(-_5|1cJl4fCjj@f4ncCW+4AU!sV-jvqv>Y zN9B@hce{&LESE3Q8LOMe(XN`~`Db(Qk;bLUpO@%VE7(w77t2yxCt=m85H69hRxZ~n z!LU}d%#s#fuboF&uh_S^bD_B^+@iTEn8uS4KbQ81j7gYJyex8`v6hk1DwXy*`n_?6 zkaAtDE+Q(>B%lK|)a9b~M@10#n-8jfMPlKuzuX+6+I6>`z_1CN0C!0Rcx#KSGV2d& zHYzZ{RXs-a_Yvf=-^_B6AI()+muhDgLb)sAR@J`BYqK=5e!s=7R!ULMUaQQ4uu%w) z8jqwNP1=qq48A(G2tUnJWUv5F;k+N3T7^M1W>LK~sH+awTP_S2R6A+Z9MbKAAIBkM`bi(l_Ym z*gOjD!;;+MRQ)6%Wsgn33lm%&rE~wZpVVAhtTb^4^x%|-w>6JXvVaDttTfesl1GCW zMRnI-&X-Qnt-^l7y!~>$p)U!N5-n7023WPLy=_f4H0Z-uLe%j13z7L%++?w;(qVgR}Q^M}57xi#yHr2!Xq&xt|kUR-1ys!L_Lkhtx0!59lpt#s%Ld^P|s)iK8n$ z0S|V^iCn;7+b9kOvjMA5cB0hkn&KyGMH$7&)UF7Dy5YvO6BEdc%<{*v0?c-L5kEgi z?q509lX4mX>-MgHBKNa1&Et~<7pyy-vt#bR$W{t9#w==Im!~OO5;<{OW=RN)E_LAW zFnYU6IN4|n%Z}CQ`0Hg%;RqdD7mbo)m|oO-cf2rPk6(|`a`9Zrb-50&vwd-Hs4!%W z7S*Xcz4=hLB$5^_>O?$ec4_9xeXi2yOg%}a)l>1o2()M% ztjZLYOVTwGv0``kl>l{03~ZJ_E&;Y%qLPA>wtKOhMqt@qd^nQNApvurXLGynKmvU> zdnolvesT(T)blr`!>_UZoKZ?TYGkuZ1~1yzEiPw!>o=d! zb+BV^K)0ZY=6iLlR~^ez1shz$4p&(h4`Q)IBXP;-mX=%n$CzUP-Qosvq9<8p7JwikvY0bB$66LKyJ!33J!oL!|8f?QpJ{dd@b6ad#LXBHX zAPg{-my`s%Hovgj-fK&iA%6zzGSTyO>(uh;&S-gScBNNf8NkKChjfA08{~8rCvS;T zwIXh&9xHYfN@6rqw``jn_2ETEys}KMAYVedi48qG80GKn45J|?SmPq$?ekH{Uof_B zkQY+@p+|Tkqx+epC8YW$X01+LLis4gh21*=SC4xt*8Rft(Dl;h)M7Y2n|-*E)T%rh`d4!o8XJt#*AE_SE#XCd0AePL1Tu zg(WdLeR;AUz~vh~DbBX(!?euaZ9)mT-kQbVI5G9B*93a~MA}I}Y{jI*~yLFIu>eZBm?2@ZFOmX@%g;T%QPysaU# zt-ZTu@Pj3_gT$KAcny6KzpB>^=ezE`$M+E@Ot__?HR8i@#YcnnoPK`Vuqp;(`!81n&vmAH!J8;1 z7%uG+4{YPO`yBI_Hs)4q)LKe@%#|}2ZEKMh&}DPOq?T24!v^v5>gvTy?+^ro8{RD# zhhx{DX2W@Wa3g?}{wMw9~4{I6us`y}?G zCr*&PGrD!gg8BfxSK#ZBI7h_o{+`Pvj!L2Q<@_XjQO>Io;!fPK3RL9LJH*bJX&(J@ z%G+WvP!$J&3Lcn95B`nelt>TiP2gxj?uZvOd?)73h!0n~Km_KUJ|AcZvnpf8fJQd;qe)D3O!g6}Hw{MPvo3&{@zw(!&eO z82={#iO@MHdjg9{bm)z?J?G#tHaC@e)5^pE7T3QormMJbV+8o@ropN1kr>x*zHQ?) zUck0U!N<)se2YY_ODB+E~c?$f~sIyJDm>(C3*V7 zAl~g7;R2G%YhR{z6F{HL=Jf;rO|S1Q105~5Xt9|4xQ8tx)X}CZ42DN&`!2W|Q?S^4 zbNh?Ik=}KzZeBA&O4a)u(_@53x3fb2K2I)xw+3-qZe#gvD>*onFmcZWQc$uH@POcvCDhM5k7CUWSkgQ)%EwBcg z5HQt_4h57n3{7$!-MRHK<)Us*_WLfjfiIyVe9iRR*XnV%9kUhdL*2 zY2K43l;A9~A2VehiiKvGpu)cuC?r&n+nn(nJP=R-;s3c3{qMV! z{~7WAzsJS@92J%SV_^KxNwLKj(pOdO`Ih@-dMZm+-`j*JI5^W3O1J_-SOkSA87xVW z-bj+dh%F<66_u=7uRd+b%&Z~b2Eee-BW%KW+S%TDzMj_7wd9s{O*8S6{juFWMV18e z;rGq)lH;*MUzX+*=JyshnhW;ZDpF_I0*?zLPwkEylIqnK1Y`GMvwOE6X0vWT3Zed> zNqz2TQvHsc_j?`~r+2Ez|0w?$2+>P?*npP^-=O8d=JSnn^Q{vU<__L|`|wZSQEywj zSC+w!(W##Owo5<$tAHpWS3OF=r~%^r#SQj5Q)5@ij)3x=iGG6O7nq>gDeK6mOK9)z zG2-TDLYClNm>}yTrv3K>ncuiyz`;tLXG=&PsC*b!g=kUx_>nnV z0?|DdjtS=5C*7_&9Wwa{Gh1!}^rq~gIm(NaYh*jMJQ4$QMgdA_DcQcak~AHPikee2 zXeSxtPy-xtiJmbI=YkqD0Qe*_ZsSNl52qY zILaCFeHbLH94V!;+_`^=490j!ByfntzLa~&SZR6=MZ&6rCY9R|61G~1&LY`b(oKy1 z1zDeW2qxE`MAU6_@nHp`OLLsD>e9G{X1V@b%6fTyn8&{$!XrGX9eI;#^95X#(!~Xa zv&?y6Y}(s?6PZ3|$^kcho5DV`$B5BZ0UMR3CME888y?dAwH|lBM3o72~xy zB*)50VBfuI>X;H~`#U`4h^~t(YiD$0n0qSErGq=pC$gP8FAG)^lF_tW3|$8ws-fpbnrDO469oPm-fl6ecWUR*UgrqG^KI+2Iheyc z2r9(sdGpkX(+6Z=e)wLCQfHl?TS(DMCu>{IB?~4k=Xm>&;prV()S#)ar@LYt6^`Mt z)$15e;^lFH=Cc>W;Uc?m&k+)OZJ!I2KP!t5pSW&kG^mP%k&SqAsIrrzbBEz%sUyOV z6jB0@*hz*l5(+g`99l%#Z*0r;-Pt2-z#y!H-N_oRsdi#TcSCvaE(GMdRobC{0qq{L z^PEraTZnb=ne@OcS^G0Cn*fZq&^o!Vg!~kG7+P61_zO8Lx)QrHu z#**|(wI))pvK^Z^No$QT#U(a3z&SULg2T=gGJJI&=8GF@;r&_x%Z9#LEv9R$2)CU7 ze&U$Y!_wtLTjoL(SUWbf?DplKv)3;)$j5a<1WRyt8FpH!Sz4lM^n_SU-4%l8Q+Rfe z!-LjJ$Jz7->Sex=gO&Td)+If-mJdUgwu6d%Gcy6yFR{F~<|CFdr#?yk11l zBFad`ySg&XWVi4(Q50LNA zoQS`h65en)OPS?M?&2hfGU$9b)mUqAd|?0O4)*LWS}tMQ0z%rXjWO+fP*N&MU4}X zE?e*{*e1QpB#pviGv$5($W`t%n>6d6aw*P}T61yH>8y1QasD!s1{kJ_w`)K5876N= zDe)5AfbuDQzWOsMN1iA^0V>8 zg!uVQA*nZ-NSIZX zD-GL0r9Fv%N%Bqn*w92lnVEmW^rhuk2K6!2-XW{0(jgf8%4kwyR|ieLOB}m_nu7mI z0DD0^icsQaQY#Uz&6~%DKh`dxTt&Nem;7N96u`KE*rsy_M|j!JKb#Wzhx?I(CaNW6 zx4dqe?U&wm;O8~c!7YbEvS~6axPVrFf{&Yo)UWdujfdb2i5;`2ARKodlJ>yMhR`ai z>gcrh1XktuWit&8TJ^`vUP-Lvj%y}LG#RIXb|3u!<8Kipv#CBg`&^lZV1c3Jiupzu#h+`N=p}*{-^d8A?b&eW+ zTIuEnj?K%Jpj151UT!ahDi|SOc1gfbSgM*4%lSh@7(S{#oh5GIQ2_wWr38@DERWb2 z#!n81E8#qB4E320nUk)2yL5iw2Ay>v)jtX2==6KL($8z_Y2x2$>IhmrvO4}O^Vm)P zL&XE$2y+nY~_ zNKA2wC;K!js?GVTery*-_ze4Hwj1!}M?enaq0SiLoz)zKSfaE z!s{tIy*35z$|(p?`Ek_uMCAAwa_4S^H;at0Jcwj@BT1>%_$ngGh88kCCHSf$PKF*b zJ%ukZ>{!I9Dk95coE8&z z@CGRIcssqtGYz=pQEwt&+P(6O9TO-7kop#egpd1ghW*ui%Om23Ml)Z7#qX&(^CEt! zafHtfV`jbvd8(lYEDq%j<+0yk-f77Bj{AP#a@IxEvE6xueh*9wdQAs7Jvi9+mM(c^ zI9P)Fe}`#(84$eESA@LE?@)MTwQ&dXmQcRw=hb@R!nb}BA=tnm9lvr3 z6i`cg7UFVRdQ$6`?%8>El|r!qix-rjM;WW3XO)&m>Zzchg_V-A6jMuOCRP{2k!||p@I~+B+BB`HNp1F( z`_Cz$0a9G|=aZ=Hi_fc{9YjK%{ll_KST2JmH+FrCu7n&!R1t|Ol`9n6vHDs|-)Qz8 zh8O)jYh>E>K5zmKV?Z|boX$UIdfI6-xgk|IQp0Kj@5nRQr09`vM`pXdsU~JA&xA7} zjqz+eZjty+H{5bU*DSX*yT4N)FItt_0-N5j6a&61^KUXtBlTUQGE;cvQw5QyXGy8* zojdHB5`UR$Vpr|0M=QHb9zYWH1WwmGcqLie>_;y zSA!^y(F6|!TZ7f*PFhZ@kZvj2?2<5*);%}^Kug6|5(@1pSD}`IekpuCpNyKqBUfQ@ zHO6YJCtz0a*4Q|GGBF%4Xht&(P|#s7`NLPxsH~z+UBzw|)2Obp9Kox0L?*|r#VxKP zuZF|zoA_7>F@bqVYjv2qUC(b=pIf*GXb-EtA2a3~?EYp`x+g+R4{H3RT~cwN+2dXB zF6hN319wpWe$ph=fV#V;Gx@Z-3SAhRK$3t!Lnh|X#r193vpng}S$1^=ByG z5&z&Yf3Gy+5Ca3=y(V2a?mLkNJDv8c7Q<_l%ZO%KP)rX#ro6JkwpwphQ%P+>QKPrI zp|P{Jvaq1l-tH5133z!A*08kCV~bk!r?Jq3gOq+Y`r-}4C4&>q`XL^!+kOY>1aygK z@?8d?tT`PO8~5;+i#$$%C=Ua#)^F+E`-KYUneKos@%&VCJv-6D*Jm+6!rxI6wiRt6 zX$DN+hnSpW(TtwY3i!qByezMGc@^I79wp-QVzqqfgZZB$C8&kjxs%zS%BhwtjNr-> zLU$P@IgH85Np(iPNuy(fN9vF5bu5B(nKz@PiHL9?Ly>P5fI^*r)xu}2&I36K<{-DH z808<{m%;gRGNK+_uQNZo7AG#uxf`NyN|dWG7JC=U^bh9{U4iS!HT=8`|3+U+{A-_l zTPlr#N`4frf2G73J4aCEx-4??u{o~AzHfDRqtTvirdX(gO0}Gwe_k0QvUmCkuTo}P zxq*4OB2PT!-7C*VPzm~oILN{^wB6%^L`RJ>tZ^46#OKxfO-(5#g7bu6e_^nJInzvK z_d0SNIpW7#BLE+c{)N*=r<;s`@#lVM#0M<2oi6@39wS8V5FunmckQNMgtx5Md($DK6nj+n$>@R@GAw zW3I~+iU;T<R;#nDcA%=OpsOn?RCMCx ze343opR_nZF)DfcD2(=RBe=(CY4lcd1LfX*KNn{|f~UQxL`s|rH`P^d9_cNU_~q3@ zTg0CGoW+6sfEpgWd$x^mupK1IHtZlHl-o4fFJ7nB6R!Tcu^vwLMHvj8`y8v7rmtR% zIr5l>ZieUSfEWYFl~`2_Z?d+ zuoOrfd(NfD!m0!xHybW9$`VV)=i*ITX7UAMa?rRQ=?vofcVzQpI(ovfuraG3X_sWd z4UV6q%Ar)0mmT~Gw#XRN4e?5j=`Z6A6yyBN)t@K^Pj(kt6??cT!H+HABUe{nB4Ik)M;k)tCwnX0jw`PKc@ zzZ8>|IG7qK8qRqx`Gj=|eGRBy!m;I`czV^WLyL@fc)a0ua9CPgSR*pm65_uiM%0en zmX6rr7nL-0n!+vTu{E@|745YLg)X&NR*7}{CcU;qhhS$*f<8_216)(xh@Ln{2H5^O zrgzRDc#h^jL@P4SyXp0C>%|=2gdU~9<+MH5viypR{yT}FocxkSA0R^`1NC)GXmlU% zlIGp1iRH~Uz0{OfE>K!N<5!v+M94~~U1&c07j><71CJFhvrr@9o+Kx$x45Cv+URY< z3_b=uYVzW|3MU^3){zc~isxC*pC6`WixM6LezT zzMcMWRlGXXmGic>@x(b8risgwAv!ua5VG+y}=_T5FvCTA1A!boxh zevO@6VJSJ7SX6$D?ku#r%u^Gq5fJafzxrmTa3l7x5pM4oYE=9!U`;u7g}(sbVT4r^ zFus9U1V;sD;x5e6r#Tqkhl_%(3KcCv3kSZ%!~u73*h;jEr3s`q1n18X>Z(Wv&<pzq#@WO3wg>0b z1;;hSWE=3CgNvIBFDpRT4_w#-wM+|4M^M+6*=^v88B&F(29rwz`4~e&5M^~NMO*#F z1#7WzdZ0<$pPTAc39}A@KCd$08*xU}CZHlaLr+=DZtYRTgGgK8$T*bEreQ9irckvOQE@v>XTrN^HbWgPV-B-3 zN|z_ZBAJV~9V~G~-UP#x zVPGsx3HMJbYD>rK5noS_M|w~%NZ@s1m?0I24YczFnW4OP8z7?_1<#kBA%xs#x&%`j z20^D)RaC8RE>{fyO|y!)5YCkc<~N81thOhjCzR?S3C%L5%Xs#O1!XjwMFtU1p?{Ob z3i-oun@)#Wbjxv&u8TH{i*x6_y=O|eR6n(RYO%4|ZteMsb6&SqR-vH@%k%E~<%b@|{VwjFFfNPG&7RN6Pt?#UhdT@Q6Yc&_&*rJx;ev zX3@wZw+7i_q*>6ndN>*JY0RvD{z?w_q#!DarH%u86{KdQdBqkF3&2TZRjTD$%P6Ov z(*7UZNV#NER>kkBnHZ@D8APO6s#>`&jA9M!;9`ZYPJqCDFMnl5%H% z+1N@-X@sRPFF|UsVz9sokaeL5DJU@|Y)&m%IDBNX-L!iZtea^zCUC;xEDI~3hr1eP zpzM$!d`cpGyoigfUesfvpk=o{DlTsUI6?sazUeolIbSu zc5k_sErXuanpMxj0^a0daSKD>k(aA_L!lkv+jl9M&|3j;?Xl60 zkl2^AV{cbvD&4@X12Jsp6y9AKx;ylayq|akfjWCq?ePBM4mbTdx7eHD1_S)J?3+;_ z*P~>fK)?D4@IVn0xCNqB_K>r|jaUGF?N|f=oYR4%U1(Q8(rHi`GuZ5|*DaoX(8-;% zCve@LuXb4dA>Li`Zdm^apFN;npt@b)SN2}ux_zHp+)w`Q*t`MUR|`+nzM!@ckehHZ zPYqMR2MMA-Bg`HTGq?Z->#hnjq5vxUZHFefLHN_{uLk6AvYFq4QLKB6#<;%ZITMrd zQa*7*;%M0mmLBMsChXuBvqZRQj)ZgrLG5U1!YG%6laAa^WcG|%6`rJ*mKrT#NM{=(e*9K^fJ?ne&A~D{7 z^%!f0ftG_UU~5K|nn4$qW{^`zPb>wJWHf2JQl2c9o{Sw1o#CuFrp+i&- z%jF^&kr(ubi#VqN!3)IYss*2rbjKR9uLu}%s)#CudsvM{U9Y-9-6wU)@hxy@2I)u!tr#C?!nT!msyY46&UUgkT!sx5^EF6~ z%K~%>Vc=+Tm1U`1U z|DMJc#eD`MSe9E?Wrmzcvt-A;Z`bVMMdD1Q#ZJ5a5fNE)Y&$H*H;_R!LWyc~l2p_RZe zGX6crG%Qe4*D{9IXn(%{Kwswfu`(GJn*y&V+y=p>cqJ%0VCVSIdV23#dw(>*eX6gV zGU>7|95Xh(G<36l;}ss3Kq=JxnV|6?d$em<6JeN9#Pc<6jaOi1&gjo}Izkk1p`wiQmnaJylCg}UGAB79B=74|ky0@E7Os}FihoAb3peIC|=YSOQHvm|KBXrq(4uThujhY(*TcQ&JO{?)}z z9)ROZdY~~68GnQ&4^k50Spd(D%Ua_gLgp~RWaMjFw57535SDNChF+5ioXqHdi%TKgv!u=eH3@%@ISlMM z1Z<2^wgRvolO|7zc%cSe=MOtPDWt4erAlGtNrtTlo60MBac72HBn@WCDIEzu(PqoM z_d(hdayd~oZboX7w{3&$yTj)*?ULtpC8#Hlk_&Z#9rjXgf%U=jcG;B&-AvgXgi-9t zZ452$I;byZ<+K9q$GqXl1viSTPv!|Q_lC(Xq}$cf*wwPVJfZ#6VkZ73dO=BO_d=$@ zcqnFftfG*9$v{(jjR@5)5aaKI4~<@b#SbE$@pFM;Jm9)`5`OVZ2gLm~P~ha#SGgzg zJEnRB`{K`lR!HbZefyG{I6AwNRb63CK3h0gE3dVnMlBn4**E|C;+{D5DXP9M@t3xL z#E&DjDP22&Ww+SQaEF5R1@uIPlPxpkj^**f&PCh6+H?Dizg{)4D|+z>|A z%t^yyV0ixwl0lRo?7A&a+|`wRSk(1ts>n(eFs`!KlKuFIHeN>?Betg#WKdHZp2No& zLk!1wy6Hn4>chzN^1QGU1uYG?qklfzX7GHnG1()V@e3Mrm-G+}kZd9V1OAE?a!W~N z%`XM#6^J*vaM+pmhx?U}JMC*I8MA=EfTHvhM*B8}N}@S4+A<{qT3XU#NS2Et5?RVn zMxIhWIzF3;T`~!;L;3`Yd<8=SUci+frcZ>*g$qAU*}(e@T-T>|KvT*e50UE28mRZJFD>5Y;(g$4QKijI-0Fh#c%fVF(C zK$%Hv+1bHPt~HC)xv9n}v>TsSEQa+k=aiUR3;OJ48>Hg+_sigIugXT#hoh7#8b7+T zB$`9~aF3M#R~r-ZP65>m!Q0bI0ZahoRC2TkWWxQpk{!cSoWN?7&eWceV1JPd^7Oyz1}3m?km`Td;vJzb zY3v2Til|rp5krb$lR@wcvyCoS|AtwCcF9IBt6&>8Xi_maSkNL%Fnv>h>4ovaU1-_h z@gJjg-Lo16Qlbjnp3Xw&+NUr26rRPS$AdS9s5O!r6y}*EW|(x2;$Z{*+Y5_+VspcE z6tL(Z+Ixy3;*s%x_`#njVq};W>C>1c)kLok886qaRPo-cBTvWJ2!^o}X6fPg5O$AxtVQX$Bi*DZOf zlF@=5q|PKbf|2>jmx*RoiX3MU<0C{Pu5MgB^82v^M=1xfZP-N^-c@lBGH7^bF_dV` zaVGKNLA(SA7jX#HNLfu`0gIBcKN8F!-Nt0DkxGueVViWic)cGr6EAhQ{kvvtcM^i_z*ofn?Ok)Y&zw zy=KxkFE}PNT^&4G=?Av!lgFATFM+TAu7R#odYFjFK?l%47XgM(Lef{WP!AjE#CT1i z2>*IR97X^|qYI~#iI}ow6&m|jNGVX03wlU;OUD2u`~u(1Nfx1&7|3_LKTu`nrr6z) zfKH{`y8ErPMv#vdo?S%nY$F|=zoTb7;v2OCp zqflDODa!JZ3YUy2&z~+^nL^?~XNgeCW5;(8!&G|4s#a##s6r0jX--%g#vJ6=uvMYV zU9H){&^q2E&zt9FOd+SfWM$>}n(dd4K4QzgGUGD7V;s96G2myU>bN6>E*MVuM?4#x z!-)Yc{K2r0i!gFXJ)NE*5Orv{URD>RYWS#LUl$s8SPcnDFqFXwUYDenobnNMmALic zhZm1K?;`)#T3XIcO?BEi_$l&qFp&>$vvmp5h-|*U)-b{> zQq5lW3@-Svrumqpa3^2<3UN_}iVpX^^TqfOnubv8#rUMo-`G0ZP70?2dZf0!gSx>q zWBLs5!+{^}kbB`-tqEzZBFz3AA>|L7#T9Vc9y{5Ep5W|xLp->PG+tOuO(GtoZy9Jd6p7HIX!et=}=_;To|vkeQoXGWAR3 zp88BN_gnCP8OdS_KlN_Nfq-;0|8GXJ|Ct&4UyWocRu=X~u5Ql%e-?H}<$pDAGrToq z)tA6F5jCGShqFWDi=b1*-6?Izvy@+_2EzY zaVD$%nmpo}MGGMNvSXymN%s-B462ahJ!)pi3peko#rXmswf7t(GtEXNrVZDWaC#*F zu3{0U`cGCJKttxVrN zlfCu|{gyLZC2e#Yxy(PYMWUu>ts*CJBbob zRd)3At?Iu~flylR>G!Ey*rmbU4ydalTm7TSHLBL@}=Ylmk!}?EFrK|mAp_=$4uE*(>X1<20rAgomFcO1T`{iC_ z7&KxML9KWD@m^;bF2Om0z4H)I9#+2o0pO&LSY&mO1FP{+4*A}o9rhU(LVw^TnlBXp z`!ymx?%u=5`|Y84bnP}=@R=5*Za09!`tjr@LCsrhjF@r1nW<6ND2wG4wQ|Uu!hi&; z>y5Seq>eq53dXXSJyJLtx`sK@X}It-?B@Xg%`ifRys|m2(W9^3qfh9PQc|$jttFzj z3Y?D{JMTdMhN()K;O6`N=2k<(G%s{c2Cnxv$tSHpyy&1th#=k^6N#_fYmqR#$si%- zcX07u<}GE&PjB@e=-v*}w_FN>EVQvU5@E%>SBOsFt7Zu)vhWZXb5SVUCdN=T(Y`eo z-6r?mwh|<}FG;wU+FKBn0cNDyokxLoiV$X|8nipJy;?B?MNQ=9Fnm=Z3cH-pCOrs= z30MJxIrJ$YofPZRc-tHJ`SWR|A)MAYng;#~f^6z973ZlA_1rSy{B`bJeqTxUjb)kO zE{&z_Yg8-8?p00T2MFQkf24z{iyRN={?5Y=Ng>IzoC7Y}pzyf9i}?6nvX zm+5l2Z0OU9*>@!D>9ra$4{*}+8ff?+&e(ehhFFZ2~rj*?%xg_6(K~v2|o2rB+ zJ?nY)^tvlwF`0Gm!TdFKi54iOc{m7HpLRD*cKYemTg}^{?}28x&|Iir^Cw0xxe!!D zxy8`GxG=@eIII7fvKXyvH%}8`4w`DAuA-{hsfqlJ_)1o4d%w~w0xcDnvQ!Mj8xL>v zc4xMve0TXtuhF_PHzuQx2)-J~*q<(lLMm8vb^;|^MUA=(3}x-GU4q+CJ%DsoiCTqr zksUk+ACjFWhPH7ro<8UN*SfZ_E6qJI2Ip~}s>d{UFGNPCesE`{N=}yn-9*E|yMf+e z#g;l%JU_$7GYtz}-y_G;OLJg@GU5G1EZXu*F43F8papzBa|Z~PjEq?F;Dy|leS5YX zM=CSZ%<8ZHSKuN|K;`HGK)RNI^rd7F9s0A(Rjyn8?ay{r1 z49V&=9iLZXWiYxgejQW(eGidPU%_tHX|m#crfvBSxqR<1PIJ5|X8n%(Exs$wD?=~k z!3PY(0VIt6FrwL~d~$@4Y@3dVSYY0o(e`^UC=euP?-=3c(nA1Z#sfqc`-30;Vs5i%tg0zzDOs(T6e^JT$D6|sa5IlDqwoUS!fev6I7iI5$Sepq|V3v)y=OsDJK_e5L+-N!;pkS zCL6Y9%k;Q#MsAyIB6i(gepQTc$7%=;u6Y=lVsn&MZZb4{#%Ro58V&VH5Efyf$~UWiHfhi6OgcXdYtS!p{Uqyv@mh zXXzPfrVej<&`uiH_wz2AaEF?VxX$^mtNeeAy;G27QMgYTp@ z4z(A#p@`QyDg}*lr|^Wz)+ZJwK=d)NIWY{PuE|pce4<3WfwnBKbO#*N%+cG_JbHhU zQzyBZ$9}qgqx4#A%!4sU;4|P-!PRALsrQ8@YlcYHMG)3q)zp~q?3NR@Lo#OWe|nauvF$VFBE9pi(;>d{mHCPOr!X7`mN@7UJ9z{Z5X?nut)j`I zAV5tg-|rv%*npN|Fn+iscl|f-Pf0FJTyl-K?mK#sKUlY2(bkFXfak2MDnag0M9oH} zCUw5|r5YcJ5uQ$)Ci(qyt5>T9dY~Envkor;dDDb5`eg)@!`pXnR^L6Ba#hKt@TeDH zGrGwxEycD-KGSkJ>X@@&0UBZdf&Waj*Cd$V?#x5_lxkLr$C?({b?QE_jrYW>7-aab zBJp8cRR10?AK$*|xb($e{jS;NTS8OPr%Rg6)KV?y9CI~JrQ<1T)zt1+m=tvjw~L-h zDt9+vhTC2}U-C+O9;J@)s?c#qtk?xdUdtWdq*o#{-vn(_6f^vb1~2#hq(XOO;vK|f zFGSNX@|&3U?~0&Pf(gE*I|etFz?}fT;&Z@>Ia%W4g1E*aZ*!}nEB=%u-Jb?BdN2 zP_WKQL6z6nyS(g;NWS%r5vd-j=r^O!0I!OgLV?_XO8x)BhuCh0^l$ugONnUz-Cwu= zNe4*73E=X76K=bGpbb@*mw&k3DLfO$NrU3RLfFBQ;(~t*#np|aNUf0ro5nMdB{Idy z8JiE7gEtpo=w2|CwW$@NSLZ>Xi|f#|_$|M?=5L7GTKC>WR%>Dg-MZg+Ke8l7OZEN` z9``ukc22gRe%@%^;QD?o!Agc%W_8T&MRq;$FfzAo$uj6Ch^^}q4=YorV0UfF66hZk z$G#ae*6t-QSSPD$z`BMjS{KO{D_VD7ow|ysjc;0cBF9-pqcuZoCMq1pF0FWz-qviKWP91sBFx#j!3&$3R zV&@p8ruh02V)v>Tn$VBf?jC z>vaEv|MPdM+kK#Z#Yw1XhP?-MAENAiSgOve5~85_9cOowjJnovthYyRYVICo@dG`g zAo(mPfq>=RB7`96VGoTnKdpGBoUartfxmLmIX9pJnTCjtk8#Njpu;!}tIU73kIDa; zuw-5AH?)`9-4q-vbsraM5P#Zg_T&yHK*Q(HnciZ;?3Wx1{T!!Q8(!8!x%9W#L(lZh zV4N??pJ*5tqL-TWb8gUn{IS=pIkNaQ9<8!ilXO^{x}s=}YV*6^sQ3z;M#vLH=_wA7&oK!#{bK~`VbA@7QGTu z`!S+^3bVaQQh$>T=N4ZxHq`G*-D|`T>;?t*ZZ1HW&V3^y`lmT;eE-|})TrOI74bgh zzGMm9#7m>fpE?n@viIR=xia_ZXt}sP3DnkR>jwq*$>f+Cbm>am-V(!66XfKL81(6S zTKX*wMNWR_coYm47wnb9Xfdy%@n+v0CqP7U<#M8(_&Pk29q`6DOoc^VkqQf>>D2k- zz3n#0i*axHLPd29SQXE!Z?LW4xTE$|HZfqAFsWl7<8nD2A&S>iCmA>t%~lkN$Z+CS zRtHIjR9NXFM-$l1QRDoT`8<6~-hNDInrphf40Edc1{$F$O>gjO-yLS(C3#EN67HtH zOjAjV;}4gh-xoqEZ4NPh4E8V*Ao7M}zKx1rH4BD%eO{AI-Hp^2{W5y{6NZN%#1!u9 zh1)iXr}lUD510_RFqrI;IGLo!@g=`|ckJNv+pW5LsiWG>wPwc~ZrS{abQ{PQj&iSK zUsJ&Ey7!tIexpWdxC# z<2GR?jE&CVK&~xEz}Gd+z~@PlpK7?6uej_Ja6EQ*m=L)vuTA-3<2nt+G;>(c2Zq=Y z>F?IqqWA%du6f$dnA<~BHAc&Z)28>me=;7}iG?3};?@ed;% zhGHoh%X4@UV-gK5&_OaH%aK;*`J#!vc5Zdlis%5#4IFT5M|VC~UiG|9MHNtnjUCY6 z&hvO9EheGN@Ya;k$NghoWrQd6n%Ao`z;>Cq!v5td1eM{9^MgC+!U7By<%gVt7NA2Y7dsj`y`d7GX?V>`{ zFB26}^cI_H8ifGBgBBwVs>NA!lVGi!!5d4X+YNq4EPBUgZN4s3Xhx%^>h@1A*X@kl z-4FY&kU?G#b3?O_uc(R`MQE&*^OVx85=I4}4|Wn|qzxHYY@8h@==pgL`btP{`lc_9 zgLI^X%MRw$jmf;ys^-yJ5FM8z=s1e#&qchME;Z6Ez9nIa%XJ0s2o>pbPb%2O7u1JH z^L0CQrB+m7r8`%%#Yl%NSS~8*{>|q~i{1QU_u+di5~*B{Hv|PZga?bB8;9;j;g2&% zsO$ANK0@bnriCHW%pgobhl=Vi^e9!rR#(iGFf|%;%*pTSd9^j$E;J zu}S4yH2sR< z2ua3qXo1T}D)7l9vhb{`E#)DV$RRwVs;3q4B@;@8a>=)sbV1)?d;RiUv{*AR?5oSi7HV&z`5|Fu9}OUGcyYzf`*hZ%ifI|f73DOu zs*6kDa;MpjEtY@CxOGynU=tx9kx<{3_!2{%Qp!svIV{Rx<=9oGS(a>6lFO7u^(-s6 zVF$5ABjsj}{3!lf2$_b{aH@gBjBnT!YiVT~KaNWG$JJOg=gy^%$++6cpNHGHmKVp-|HTAm zRGE}_t?#oA&hscPS1(_d3*zhaJ>XQiijC?Ks}`=KLXAOyG}Rj$R7@_>u2j#Qs10Fm zm$1hr#b0GEpWjRy$rhIYkHqC)G}Zt!RV%4TX~c{xkTBg%b=0;tqr6l@N&x_*?sCxq zV=(qXuX}k7M}Aav^eucRsWSmHU?t)fCo+_(XUMZ_VP#k3jq&BxgZqfq+3Tg7s<=xM zi9LBLa;!65%2zN68j`5}4<{oMVn-zvD$gM>=@q~q>d_Z}uvw=~<(1CGQb^)Y5V%$92lOVJ0OQzseP!yHKN#uXKwU(i5 z!xV~8$DhGcC2XgAq`+8_+fu)aOo4Xy6G zk#;xg29^732%D+8dZ@HejTjZRa3ab9Z0psq6-~vrDE{Q8K~)izHja_*5b|vA4@f+> z{VR^p755UIdB3;Md%FZ-JqE^0WrN)a3u+S14R1@O_vFM&Gx2k@Ga>yht+bp&LK8P! zX|PnUT0DC7WMz695Q5^Z)!EuwI@=O%ca|7G4Fcmwn9WjSH7j;$@2#&5sN47h6vcPY z>X(5Sh0Q zqo6GQH8NB@Q*6R>v@)(|Mj0we>QWphD-4X-U$^XQ1d5W=(SevR1LH zZ-8UA6IEHaft|x*Vyt6-pO;x$1$8r)_+9+TxJY=8rY@dgf2H0X~x~s=b6Wq|Z|{)XD^3+Z?Ufiv65qw{|1k!pFCjDBjU7&3A}XFonEr zH{1@C>80)s=mf!?zc$Y@EBT`23~0z!+CR%4PZvL(nTIHa$}aq?=2WjraL;KJlM}V7 zKnHqAi$n6=ktSU+kOH0hR%Om#=_-<4%T}&bw_YBx#k2oq{DnXL(3BE;F@Zf!bdRZN zE44XvZ?FbJJZYM}xemCQdL)0x#WflwJGmH#;_c4FBiyismjroEQPSO7n!~b0$vq2a z6VqEK8mq}He?J<6mGC#Oo4q&)$$PG**={F{{9w37fCRy%hs8^lcan&PupJ^rj5I!43_0bJ&E>hu@6h zVCZat%pT!lJ!iP)r87{@-`u=|)4_MP+pzm1>9Vk4q$WgsCib50NWqx_JjRH#@-bKd zH6~a@c%Pq!2_U)1W$jYmpSm_7I#{wVl)>6 zT6Uer5pnEkypBwoT3p4!`1>`=v#pe7?(z;wMjKY&bFH1r1J64Y5bL@lW~-vn7Prh> zLD8DH!T`)%(~_;$Si3PPa{V#l2Z^7+g`66Wf6 ze8mFQY&@TUp8SY8odFCo((^(W{Z+P+!;%{W91d#lu_intGcf03s3-6}*-dQ@zWH|x>szJBwvfFL;|1pQ$UEch+9VOh5Af5va~Dm)oXGgSitti z1+SppRsi`H1-T+iNG!h`!BmcFR@?_1 z`76qU&iJOx_-b>)Iop#}F`E37U9oCu^Do-s{otj0&iUYyp6aBVMk@(gv!R}eDF5IT zzw@P^7H=x>BOu~iiotCWI}Igci35U+J-Ct1*Lr5toX%v3lR~T|kwxRw%T;zt&<)3f z0n63M9AnU12ti5F7t0igkFDAHIpe{Nnpv(t)g2Lh1KJ16IWA9QJQS)8%fy4EEG#is zq_s~WSw*LBE0ck2Qz(E4wO{hCQjxj)3gAA7ttSYRgtboufgsswWgoA}Df8Xh4ggLR0&!g@6(L@&k*g_cc&e;Mn7Ui_X8v*|= zKcwi0t0~}ip`9-7v?OSrBjE`nV4O#JM@T+2r3V*FoxeRZ<`J&TYKlO$g!e8_SOm}` z7Q1FiF7su8@WoiQg{?fQ!aTTaj6Ig+Fcu&g$W8k|+aBO-OyS;DmC|&6pjI_=j zcZIe*`Zfh3&Y^#@=#AUYt9=saO%u*3e8<)7|2pGI7VA{Q(TmMiP&YY)@Xf=a#y;ej zt3BsT3feiHvv>6CcA>q^L+o=T@m?4G3FH9%^cCtY6^w&?z>)SZ65Jo#?^_R5Did5Z zIQsqPo%Rdf3H{>s32{uN4DmddYwky6Rp!Dsp@wtpFk^=D+=oFxS|Ct>M>;)g$$sIq z>71=txj=XwBAe;VB=FmIj`B>wMsXiNHFWlhVE<%2TdMi0LU#Z`o4bE|>ax&)?1PV` zFqBE^IXX7xAMJ%-Qct@u!z*^E-%>pyBCOOej6-O`@-#ltsNf^KDQ#N}?QI!$lWVch zCo>6bnIB$n@-ZA8?aNAZBkvagz77(-_&t0Bf?EeI(E8gwYPK4f_cuYFWc|MVLZV9_ zunqOIuqW)13oYFl{+TOfbOAqG_{#!a2jpEBCexNAa7S(i^B{s(m|cN=o@8Xstx}X{ zIKg7ySnwyrUU!+6pPnCCg}GvZ?n)As1|az)aWv5-Aw>xF5W|YzlSpd>8pJ_Ri4t*XV=N@M;+ll0;!UVf zE)ZHyLBQ{ECe30zFC2zvY)$q%sZdLH{$FZOAi-ziLI>m>fAj;)xMW%v-GS3I&W*g_ z3wuMAc1s8AOeOcYZ2I^bECEu;_@KT!s57$BJA0|QXe{hTP>JH;(Hx)-d z5Q@}E%19LnsJP(cSB1JJLk_XvSDArp^3iULvGIn;6)(KX8i8T9Ab#t@7H@+jZ;KQ5 zuVev12?pqVqFMWdsO<6mK}lO7z9-#9@nb;H?n~jAwS4qPgQaXCZ+b! z@a%kqF{!Ot{b;I36a;>Wn&P|F{2)2NI;T*EPv@T}#mb6UDuSfu+yJfU6)Q-UUHBa# zd(@1T@7m!E8-2A_T_M^!sM>wN1g`$d7g~0Lw2VR77Kv0vfdPc(zCL z$gpCxJQ|#tuj|4m29JHipF}5$t3y>zgqm5FXt^Vz0RKj&Nr}jo387~$u@6#zay*ZZ$tm1s;D{`22G2Qhf?6}(HFHlI zaB+KfS^)Qs_jH^0VZydb@BuM>Akb$~FtSD`^FWp@!IxHa-zY08)x+nM@yw{Sf43-Q zf^x7cYYB2dHtj+=)F(S0%YT(;MuCCaM+j!c(EJc_;?^#fQy9%5Q}9#L4E<`My|bqd zgV+-r0?TCUQY8Kxx~W#yy2XLQAsO&!ip`sb?4{CaIARr{#qu&;>}bCM!~`#mM?4~b z;)Bx%&IVF{WSIjsocoK_^WVDTVUDFlDcKR4ZaCY0m_osYHDz zys!Nntr@rN={u@z$I;g5lz{?M4aXzWir=|qpCh$k!a2x@1p6B90`q3*br;kAlmR;A zT(WC9*98eL(TOlWCkVhgQxe-ge~aaV+ipyb8 zMw?rAHOCCDV2v`xI>J3-;q4x3`zP)9{B zU|aqeI)N&eL@$M20tH1Mi7Ins;Swjv0_ZsB(PH`}*cL^|td6_T!*?;Xr#Bt0dO_;! zB~e;Ir8m(L+Umt6U3l^4uj|B1&z$h(v;^qGwD1IAi+T6MCx&k;Kp$ni$wH|YFhbm-vn6|+t)Mk z8@jX!eF(%4xE0329VR&*DLT*;ts;aBI1#0*Q*F@i5WG9td zyCcWRj%P}PN1CS_$|KhqqpeeU2@tjIoo_ts9?8e>5&sN;88D2;za zCF_$cZtGN*Cu)R^8rwZeMHFkSwY^$-eKTH@vna9As*o`=&)dkDt?Wb10BB;!hVh}s z;3*pKahOQHd$$`Cy6qeKz_`%MqEdV!Cn)en)?qC!)4PBul6VK|ho2GkWR<(5XR3B5 zLhndy@I;(C(x*A;1aRz%KECO%#e9^d+?L9|32*cx?i&ioaXyf`aJJ43ep2~H5*CVn za&=F9#H;fQ_a0E5|MmI(Jpg%b;)kQO&=?k&BboFBf-*c9mZ^Wl>=RUaKgpNcJ9zAq zq;X$)b!wtJSnC+pJDU0C+VjW1kM|9}Cw=$G_Y*^KLhyw0jjQ#6H*Fsi>rM8_2a$j0 zlIV0afPr$o|DN^~xi6*ecwWe{N6LgW+i^u?QbRq+U#)XifdmPXu#>BngGwNRA|tE5AZX z2lRCzmxf&O#-*<9wQEhw%LZ{s)4Drp-jHQGJGlg{Fm5%=MfL+Yztx`z0PV|C% z#Di9W$ott=QGTw<`DxQP+cQ9x-|f6>Fc>VzvPAeV*(i1w-;g3t2+*OOtrBNP34DT% zu7-L}2v3=*;z!Ipil=7E_Oz3}MHK%vT zKzM++!}SJ$zSMwV3nLY+pXwhY4DGM6ptzHJFUHz^S z{h);86$t^8NF59N+aDU6gNMP$gbfCg90#ozb7`aDlK`YHQPF5Y`U2FzAt3^;<5q=* zI7NiO1QHJP`nN?ZdEib8+}`zz_Rb8-*Z_zQ9y@pp+ZM`qlk}l)=LSVIC;8g4@WR)8 zrnR28;wB>BUt-RI$9xke-V7n4WvBNUj#y8EG;(%0-% zS)=4n^W7K>zc7yU<_01{koS;lOxI(hHD!6ef^L$q6smj6rdboEgUtDvSjq4&r2}Xr z+g*2wOMCXdxD2WE3m=>c3Z)pDl6or^^h#=^an(Ev9C|g(IUII=3W*9A4*ha_7|mAk z!B81qpRnx{E&_Y|M+WaqZtyqA^YJx3KUx_+^y9xk+8d8LARme{-SPLO`|0^7ivDU4 zovfiDW$kQo(}l<$F{-e}uhWjN)BDi6MQ{K4aUQfAE)`Lg84Rs1CR%#Lny!mFR+<_( zUp6c=kK89ff97m8n}>mWc%7A&l+LCEH_+%^W>E7rLEsstO-W%vQM#DF`4SHq8$QmW zQsNeqF3o%`-NAp(<4wKPrbEf4=jjtsC zlwnoUxm;(N@_r)& zkhy8peXsty2TM8=R8l$MhMUWEsP~}j_^p33jukJ~c*gV#I9bk~*fs}da95V_0ggps z9_JOgwNs;)*;he1z>T)vFe5~6qqv`uDKWU@RDAFd^9g;qsp|#7IP8$fO$(vGc<$>! zwe9$+GtgZi-@^St#1*`KIT^~jCgg2bx^S7DO-V0O^picK!j1dHk1c&eVZ5Z2*EnNl zG5)x*#N3LxnB*y){DeTu|H--biKc#W6U}L`oTA?!0T;u1cEqV1PyOgb=35k=cd|!> zMRuG$pi6#*-^MM+H`)o&$=-L6yoh?$#EI70x4|~`z7p5faPF5czG7!OjFP?Vpvi;Y zCJJnB_|b%`ykrdHPkQR~w0dTy53M}9J^vTh+Y#_bnnI|3VkA)IOHg*Ezh4W9vd| zb(UjEB5Mwz^{vG z*&)}e-J{*Im7wO_=0wEkwbC=~{3ETx2pDz7k%bdI&C1eQmTl^;zf^2gS}gZaFVs4W zfEFaxxEcZc5)mo&lvpt1j4K4Ek!l8*cc1vZ4^-2|a}HN=SetoI@5@`_zhT!@8prKc z5~Ii72N^y5*`Se#S9U}NpnqZQ*&oszoT=sC&xPuTXqGxclwYayKg{ROZD!Ee-L4-) zcA5dG`$ZR1-%{+$G8uI(p8JdACMeUZl|- zg%|wQSU85BqZB+wo1juS3Pm~EBP77L7^Z}AMna!#+*->n#a-huc^le$9|I=$+G)2a z?aqY#$_n*1uKd7y6#JtY*{YQY(hh|(7dVYj{XqEvdXR#FeBeA9Mj(6-NTqs}d)8`2 zd(oo%Oe~u#kZmJx$;;4DhGl+)y1KK8$=IzG+ohIsPGT0{5e@htV~$z$2ma5tPdan$ z$@&M$LHuvIPaOY~ZLeTvW@=`tYA^2L;`9%3^S@Hw*(y4}P?eCrQ|vmg8y zTA+?^iq!xU930e1b;Z)lMOqupbXqMXn8rRYr>{if!?CpLxXt#X|uI$odMZ*HD~Jr-wbh4cS)wXJjORm7ajEy?S%g0U>z1{I7Cp}3O$;;DEZh*?Z1LIea#zJYJ7@n&D!#;zT8HbYI+y92}dFof3t4x7scwjwheE!0A$U z27*h6DR!#|+LglaDD&3zv>LT%>Pq%$Rl$prP0yf#!{3*}7YQY{EjiFwJ*Gi69NI+> zD>>2+z8PAL&+481SfqR;%TX)oTpDCDl`j;uDWZ~)Np(BJ%z z^y$@Ka71H9h;@pcy8nguW2W7{l-KcUOmDlIU~Eva0>|5&?jfK{bf9NP6-V}Qfb^=LD!p8g)EN5*9Q%dp_&o83E3h{kT zHq0@YdSvFtk^d^1+G$^)HbSwK%6P`d@u8}b_XT@l)L#Pk3}^a!&XYM1QsEww$87eJ z5J^_JmX;{D&mAs(P@fs;Kyklr7C-HHZq}%mvTn#o=v{hkIX||A%q`E7+#S-d`skb} z4_}mv$G|?#-MKKgBr_;TD}!9R!3)o*G3`*`8}mQHnFsl22L1^r>Hj61|4Nra|KAD+ zVE^BOrT*)Xf2Y#_2EY1m2*A$4)y3Jx$;`<1za98riyFNDlYzo!&Y}PZOEV|w|E!|& zf3EU>H#a`q(T=hG%x~A>>cCLP;MKw9-B3|#{t%^r%_V^`;pPz+n>X-g!r8bDUeO^{ zty(p2Y^YbORfbt!!qZccsd8^D8h9!E1b@@MJap~Kao}pwczGo}`rW#F-`+k>e;@7| z_<$RN_CO7WlY}e7qi|6lCB-d@lmurXKZM2Q!g#8VnHcdA45NCmOpL3D_+bRclm>fC zjLin~(K?OuhZ>AMc@i^1y%on9Kzl0HeDOr=?zI|qq4iHHH60{V`Gsl>zWRdIiaYY^ zhwnX8HF%Kz5frGV`IU&fLXVhcR|pZ z0h{%H$Q<#gT+>Nwn36N_vmBs#QR>;(4DJd!;RfEy?J;s67FiS<&pMfN%Q(K8i?h9) z%~a5c;lSZ8yo_RRzSm4uJ8O7QAul~!D`8%D9m?3qcDJF~)0U~Wt#q<(h+}rv`wDJ~ z-!wU%f-IkDYK?w+!3PKy5zkH9!ppu_ceU5Dahq?5j%dcvx?YSB54M=z&_m#L6zu2N zbH>D9G?!4wbuRG0PtI&vHib;@&T3_3>zt*8yy(RI4jD^QqRXLK!=^6Kho5IwQ>MO* zdNrWQfXu#1;RpW^dP{Q)Ds{_M$W%#?kuXj_nq+b6YM7MUTvVwTLr|aGnSO96${3eX z&9^?iQPrY@M_8*M`m(*QI;gwGhzSv=9+e^_WGd;R1K*VJItt<#Q91f}H$AbyPCPjp zX<&m@p{Z*dWssY3RhF7*A%rPZ8B}J?UC&h`wg@Ppl)JFCxfC?dVk2Wu2An1GR5a6| zY8yP~g&cdT8Gkg&{0&f!ck+fiFBPYh-<(kRi?LSXDJd#HPrYVt-Y4Z8ODvn}6mmG7 z*_fi|vf@fh{L$DA>y9a{tNhq%Z|vIHC*iT>qAU^f&STGSc43a6>G2mZ%Hf6`!)#fi z=IOGf3W4gmeQtX|szysWz%^Smm)5S#OEzCeMjgPhx=@~YQ51qfn@jPVS>}%fCy;KQ zEd$|Bc@6;nKI(iLf;R6LbXH)_#shLY)9X*g-o!(-wAP{LAoY6HeBtiS1Lxl8i;hha z{t~)8x{TWf8m|_}@|dFZvPrd~>dqLlhh~!a=oqg!{$In$7zCFKP1+*Z zZJrfqEk@J8xM&d$==CT&cx$`y6Q-TzdxGz>!M?N@N4c;X!Sh$*7ijK0(%^iioz;6_ zfh9+{QCB$_Ppm>738tb$QlF|r5CP~z6@32@adp-9yT7TzvV&jxqND2v_aYoQM)D(# z;JgfbGvX~il0H>OLs|!p%PH#G{Cf9Q{SM|s4YEc)C5O(sD|2pzfhSok;G2&boX^L< zP-s~lI|wYCN0v!DICgZXj#=(~`om>!MI3G%y0>9COauH(ibFa=36ev@HLnU zjr0tL^AAs4bSI>&c)d?Vqd zpUC5`sz82OZ`ytHsDqbHb4mu#oJx90dP#UKX^6|A>(7kEx)+y3#z-4j!)l%;b>hii|Uh>$as?Z!Bn7=jh-Cz-s80my z^Eb>h&Te>j&O4i=D@}YG+z(ueo&8I;=$yN7$u~S^+p)&QWl{wg>z1$z4|1Wqu}EO) z5PN=z_t(}uQ=b;p24@&xwS4EayeHP$sg)xBiLy6CcssbEmiTzE1O}YljL^C+_o5cl zs}H?`f1p$NMpwQ`2DvFIa*su%wvaiV3^je21%bW#v~66;2Y%G}G+ssu4aASwVETX~ zB}zvvRcW$}t!;T2*P=TTF7ayI%C+B0ZK#vxUjVR!TahrYsTdY~88Qev8_^@>7}7~t zf>`D@wJr`v)1fkLzcYOs!Q2(K@D3=lJQo?uSRoYqMG0bUNR+OM7|j8y^q%yaiExCK zYa(|7@sRJA&sc5fuk??|B@*VHvym#i!%F?AVDGT=Cu+O6tXvjt)d*0U;btgTn|bYC z;Y{^(lw6REG!xkc0{HDt(rLpbtd&n@=qE6U?c#Wp10!ISJ0-CTzyjfMM z8hY9qvy71B18qE|2-?E&TaI7jA5kS_mAuS>CA}i{>B5ganortCJ3^(s%zLrYuL;os zm6o2Mkv(FU4%-u2RqtK`Z1OOp1i>+*Ys;~$*}qVfb4U~f^_1YY%_ckUO&H0xbIf@5 zPpMWvyLwRsi8(dkHhSlV&+hzzx9&F=S$_cfC`17CM92hu4dh+nZ(HW)m;DZ2bH~$F ze9Xxf4l11-a^IMR+)?GO-{xJKz<$+cygJ=b5a|r{Yo&AD2I$wnK@hZ8tDH2jwf!W$ zTlDU1HffkX-5EV9$vqmF=9mN7oh#kPE9j>7Zmi>d!)LIY@NcqOH|cv*!>$<@Pc+U) ztyN!maR18p1lr&Ko4r4{(txPL4`kn$P1hIY#ZGE-I@5sIQ@ooeFx6B26d(x7M@aB= zr;Df``6P?og0G?XDGetF~8pla7?fbIIfLJYEY`o4%MtbedUo`)9h4fd|4w zcE`wIB*lTp!15;X9+=&Ci1NkcV4V^jCv!qUHg<*|+s`t3D~FC2?-`8-3X0uA7Yw2M z_`vJT%NDcznlVlk0!tG5>!IX12Pu2C5{MAH{kd zS=9u6892SNZ~{@eOgU8Xv9=NzSQnbjH3~;v8yWL@+1iT!k67>1zm!D%=~B+0meSGK zuQ|ebg9Vk3sk#uP0pzzj*4wGB$FA9~)}z~>Zx4h$ydGHMC|u#C!xB6J7{|24g)Th1 z;5%jk=mQP`ct@t=ojFv)Y-3FGv3`G{o=IodXsJH>U*Zx zNUmuyh`mb*8s=BUN#`exDZl;QQh1+Z(w$4`ogFv21Z_G_;?gxw^6mW;^LQlrMsakV ztNVResIT#y7N8fgoAED6ZpX5vuqP|e#V5mK?KO()BLsNOI=?{1U%vRgW?N1|M@~pq z!JCK)5?|V~8z>$sVb$GMbRF7MD(!SR8(Va}Gc!7EPQg0#|=(rHGpHvN%ix$(pbVr+xnAs3~S+OBz+c)tD*g>awS_PssCge3{NobU&m|`=YEV zZgiPhVPqvGM)mNKA8R4*B6^>n){@~chhxPJ{#B}IJ=}-p8z=%^h1FeRpXRnR7`5hB9G&A*x{9)_*TTh4t0WJ?#%^tw)$!Ra)Hg-7=+ zt75mfkvaXTHk{ksl=*bC7|-CLC3cL7S&J%aCF5#PlleC(^y98Pkbo9Vl23yo(OpOa z?pr-elFwGAmS`5D;whMRn_pz5f0$zbKYEQySlNrkF^|vu8qepv<>H!Te((kFr1e4R2p|GpYLC3j0+f(fWba~Vm#)dGMdAGK&fx;&FjyL`SEfMCl7 zP9?p7DU$%^D`O=I=0`4$Oj?q}OO2c3hkKB)1AJGchir*+PJmw$Pa(7?{xB(>{YxUHqCe6<7^m>rvkex z;(+dpz#g=beU}+(;$rG~rD_|9q=79Xo!5CLt9|vw;HS$A-VoHA zgTkQ@2$yqxt6|({(tL8nZTG6KecGHel$YCwlIhZGKR)8ZZ%sZ!y6C9B&wNlry7}-e zw1Kp;*K_}5u>w<-zb4#O-qpUzS|@Mr3Bfnrg_PXk5f6!Xh9O@LqNgI8tYXEsRgKJ$ zuN*q+)}tr&3dQb?ud$jRqweJo20X|1ozHWgw@+RH;jwTiOR>b>#Ec2HCtj&EE%$?Q zK=t3oZ8bXwJPDc@HER#T$H6|zeg8e3Q{?{5c^)cD=(OYJ4xyO9kOy!u@x*Dd4#DkI zqY0DUk7YHZ18~2r!M`9T$CT_hD3D9ie%&+i*iDLNbv3EW?>Rd*)-{0ZoL;Qg>H5lv<@&5D~^A$^v>DuF(HF`3< zro-tqnc_O0+v38{XUrF}RY^)G?%;farS=V&NpTFP5-7IBJFuUcnH0$EwT*<3$c`s~iKFo%c39vEYPwSXftyvvQsa zZ%C=E`656G9`e#dG>cbIz?r7JofmfbD7P$nv;KQ@Wm_Y@aO16?{Ya&T4(HzuiPge< z6n|eJZ;1sXG>Fev*>+@lotQf1Emqk=qZyyCv|=vH%qh&t2JyDXHPY2^L3INk3=pd~ z4(tg$qgn*2dhbS|PEN2l&To}8d>m09cezRHR$mB<2n%+$W=;gn8jvG{{HH z?s*PQol#9I$M?MyEw%q5{sL9FZgoRo7M8R~o2qL3yWw5?Ty5{`eOmkD=MS<+*MoRK zRkKuxso_cowm(`RR}+(cIu-kxvLjo^l)*G7(Oe>rxxHm7L8dmeSJ?FpY9u5+Tts_k+u_tcXeIntf% z2p_O)%v0U(?kpp!((ksyva*z7Ek937`Gq|>pEu0Dq_7rqtzhM0&$O>;$2Qn)K9b}? z+FIboVa3~CpyTkE(vFp(;j2(+e&%Ex!VFs|2TZ>`W*wSo%Se;sinFzwkNc>Q;#Nvi>gYQ=x9xd?AZR4rvw>y3Tip3{- z6*En^zr?&|A9acJl)x5*>P0CLW454vv2_UJUo=aIL*St6Fn@S4V?7mypRuE;&a$?^ zXVGQ#aF%JYuH+kVGs?t%g65zjVd#eVY zl&jGZTV&Ua=%>+N7$WX$5WKG4D%%e$JYvbkaKxxVgN@=Hj$p%^b|e{$0KI?8N^XJy zXYDN}{v>J7(y89zVJOD&e9TE=r}toQI?>-L&HvkMG-k|_NUs^;buPLwV>-W7 zoB97B?Hz+e3A1g%Q+CxU8>j3#W!tuG+qP}nwr$(CZC6e8y%R6)Oiy?8ycd!AD~oNzO$E5SlzXOaR8kY$9b!?P1N0%Uznf zAncMvdSNf^kXi+kxS!1&iK`f*o+mj~twhdL$3_I_GHbacuG(pqj1zpT(Yw^3|<=ND~la164z?ZVqy$iT;q20HGKeO3*D+j!>~p+N%MQ zp%dCWr>N6X{3)|sPJYC}k`ujW#j|^@v+yv!tWfCp;OvVWEA?GW za_j=^5)m2gss2@WuoCB z|Ko1~r`enF`|fq1byUFU*_MsLDh5u)R_VX{x=wc;Z%HRCQ&)Z|X(47lA6bOw#xIxz z-KZhPe$Y^FqDyll3V@C!rU^Tlf%lON`vO@iqO*t0T&z*}07N*vM`3BE(Oto7KoYk~mGEGDL|g ziK6`6u`c&UpzOrzvI$u436IH-p&-RhjT+s4aUhVl@5Xzh)65f_$6e;b$LdyUPsD3F zaPhU<^gu1&plOa%ZML7dlK*{jYP`m4=$2g$)eU{v&f!ZcZAgUV$X|2;EhEpCUpD{p z{zph4N6}F){{hRQp#EJ*5c*F-f|T_?H4X@+tbg)5J6D_krIk@A+b#vji^S*Wh*TZQ5R1Y}>0F2v-prngpA5&ryPL#;u;CO= z+ewcF~gOSidz4Yka zKJ$^?SVaVM@Wg?_fW_LgOrHkEpnftd?6K~jN|aT&i5=bAF+#ilO4UIp_sJ{)ek4zR zP|<(g7y6H4{{P1h{%`29Q^DIBf%ms3lyZ(wQ=!s%wAo@APkFL}p2QjhaYG~_Fs3ZR zsWuelCDZVxA#1~-{3$on>;T+OFx?b2@Q-3w+yixMW~Tf7(d30u*Z0dEOpkoUAbjs9 zsnQnThu53zLvQV@Ht9MV|8URF%VkcrPZO<;5{n zDx`m6aW^!*;Axm#u_EFbOf~C)XsQpSvfTB%6a`B{!QHBhB@qqH=g-`BBkhFqv=|ra zW{I3=l zyWn5^Bqz~qrQMGmY+^evOO?=@=yF+S4TI}BuO7?t?*14miMx*jY7z+3I8#iTNnq4) zY+-A599m!Kx9Rc89fEXwhSm9Je91jEEckn)@ZQt$DMCrRg9T)a(`E?FHt~O+xecJt zzqiQS^xMEADLODVxPp#AB>c;8z;+#q{0uRa;ZI1Q*}P8BlX9?0u8}H3FV5EXLB`oY z-UZfw$2~0K#UKw8x%q0qg^j1sDnLx=MV&Mx_I2=**nmJK2&gOD!l0mxHi0{4b}hKq zIqY%rssAjh!hg6z+Ku+FfbVB9rZaL+;T=jD?T;wD4~TGt5(l5QLVUmUQawj9#xJcX zoUZvYh(>=h*uJX$oFUNR9`n#&ZHvYIi#%Ni7(L z2f;`fR9q-wtJ}VQVFh!`{F*l#XVRAs_eHv&dMUTYC#at`mBE^P?O}hE@pN2mef+EF zR!j&j9wCmGV}Kwvi40vb1vU?vp3dl2h4?fy#>6$un9q$mi521=0R?T1YLSKEetea( z`O;DH82VFv_{^QLG<9^7Z5@kWM~j}pI5w9+&DLJBmJ{^5%vI!@dNucL%Oc%_>Pp^as+{*ay)KB-$d=N#R$IHTI}%hR|E8LTqDS~ zqYw*I-H8^VJwjQTRJWESME?x7$veON)F3Kfm3Oj(m|oP#LiDu!cM3gYFlfnl3SfaS z2elFpBWhvLKc^cyXyhs#Icgk^XDVh&JC*54BelFP8+vHbTK16~iTu)9ZLNZF_KLds z-iU${^=+p1$;^KmjIbEp>nc$?_{PxdO$=RIfn&Lm&E*n=dBOIe!@rfD-n3$B3U)w} zkSlZ)d8)`v_}c>#`~aZCi12kad&MnCMfBx)B?>fOs+WyYI%&V&TB^dQM6MOw{B+A? zUt47-)|EkZ)-SEUt;}2_b&Gb_8DWc>Em-%avdT~)O4uJ^5Ti3SrjDZ6Gf>UUY9-t9CSM^eXD3&1@E-^eig2;g5N-zuK}4>2 zNHW_`5_suFd8|L6DZj8Ktr4?#DSEwwj;g^u@Z}NPes=H(n}dBIt?}nJpDf737IvcA z6mo44zj(!cHf-n8JjN%Rg-Jy`CB2{mi^Xs$)c{p>Ee|S;ap4$I&BX*a@UX?QqDj9X z91}Gx@WUv~LMfeq*rGmH&4eqE?-s-TMtDE~@+Sg5*Cn8~=(tewg>kLn!x#!lX9$pu z^I$B!(w`7-6hhf8Y$+9s5eL^)QggD@51`d@gei=Z{^Qwjg~5=8^HijK$mIJ8WY@Y9 z=JTw`X#j{oJislZIJ@3~1hJePXig{5@`3XK`VR|y2r0FO|0xxF{;dTH{QtH8Cc} zaV7K9`Vbi&*X=;yO})P@XVZ$WKQ4H!)#;+nXD(o+0ozJAqT+QE7qUKY`OS;G6+0?z z@TzIL6@TQ2%?-0}3}1nILAe#Z1N5OWOoLz2&#vo1`YAm3K^LJd>Mc7wtg8XJzs%;9 zpUaReN_?S3!DyAekaIaNqe~nQbXs8<2|KcsB``N;s^Zo0oZz}-AzGkrVAvjntV++A zmUV)KUTepyI)78*T-0qMJ#~ywdRwsgm}lvDI6PEQ0lIxl4Wmf#YOy4?8ce4&R^P&& zDZOeZa6bEcObSON8iD(4hh%cWW!xu|2*;M69icR!Q@nrw5vm!riUHaT{6fiQ+#QkZ zT*pgqWekTlIDU-BZ9oDxZ8czGbI`|=ju#~BN>bHHJPyrh&cc-})|8t_0`UiNnOapH z&oHsA(bz?a#fzaM0k+{wjdqZZR6%Etm4f%=|Mc)ow(*cS?WkZuv4s0C1MTeJ^O&lW8vo)-eWf>@tCBfgHa5EC*Y`Zt;9J1!wiP$z)n?l@0O-^;3W~Ez z0~L-t%_vL?RiJL+EZvmCfIx{SpR_n*v~Nn5b)Q@Hipxd8C^Kwk;o_Ky$7n2KKpP{Y z0Z~qG%}8uycctopn&nI!nU!epg4bkpYwE%Slv4Wb)z{D&LvLb;FmXk;E_R4?9=GA? zax}!lmW^GTA$kdPZx*kTHy`MQwh}5`xLUqX50q>xNc;|M(T@n4B@hgN*w4nrd;`+O zV1v92?Gbq1zNI&Z6TEId%2>!g9j^4uhY{VxO@u@lh=gQ=;TVv4<6X zu>$$e&?tB0zru-4?qCTgqE8S+gr>AZ&*IfL~@< z;2?}-Xh7XjdyW^~CH&D&Q6XqTMDc1OYYH9^V%NjKNna=UW86;ARNClhAKzdpNjr`+ zTXX(h?ppCS=x0)*Q6M$m8A{cV*o-KeI3vue)2cGuH{<&4nr6J}S!5OlsoU>oTyB|* zJi2cXK3H;qQjmXt104PMjCESH65as-_nyYo@8CWoaTMB6*QGlvJi!*v9JtG23k#F2 z7t+McA&$Knry@gR7T!t?s-b0*ojSK47q%ObI;omL4G-mNHwi6Hxb1s12urDASD*1z zruvCngWWVgh45X|aQ6-M+fTZRMVPDgq0AUWhO<2JOtnT~n!Kkg<2%Jk5A|5ub}9JR z$3^m>H9w|VMqsrm%2)c?$Gio>h413WeIsZl)?mi`NuL!@WY(XuBB4#J*P7t{U&>1q z?CzTEU>fX&w?jok>fjUjDi#H4pKE{wg;}w39=M!iBByymPpv{tgOC`8_T2B3wK^na;yFPO%H^2Uv7Kdd@jQ7A;ZJw!YiBTYJ7F_3SE(0@ds z3_DCQ$_JFY?;2r(?*0ZqhSed+GUy;<)B;GF2thqF&nGjD)dhNMt=p#T{+6;GrjM5I z9xmNJBqV^y#eHY33UG?{0l=RknA_&7a*%z+UE|{QF@u zrqo-U^{UgYU;npa7Dwn$sG(ES;sw98Nd($;Q|Yt!l)#d7Mf7{ZRx%Mhf@?o=wv+6l z3T1x7yq?f`grRBpBY2w%2to2L$;HSv7MslyDVFLZClq|mzF>BEuL8Z7GOiblnR;WX05h5QW)(}vO)5itkqS5O zAskER&vCBfgfiOM^g_%j>~s8WJo;MaKG;)ir%z@a3`OVKRUf6KD_vewu9%DcB{cWt#y|zMuv)2c0)V+WQ|GzP^ylJzkDl>P*vfA*hK` zR&R=GqQ5kDq2|wE+T6TC8|((CfpH#5LtgfR;hkxy{52vznZ(}%0kb1P@?H+C%fnxg z5qZ1TC|ugyZ1axMByVD*mj^lk0QH&qCPJdrUJ*#0Z4@@ZN81MHU zv8w}pRrZeQ816u2SX4nbIR-2RSnbxrcDhA+L1EJ9`~Pi=WYZcQ&VQsgDaqpH7&|W2 z1(oc(?~rbfYKyYjZI#^6>i;2CugTf`Ez#_Dz9r@?%S{J+?P6(Qmi630e0wI_ew%J_ z2YGzSkX}gUaLy#Du4B>YN57KZGZ*wmm2ZunKIuW(}P#^sAUWFmy-v@Keg zFPiOBC5o3GRfyiYGTDX^nsTucrGYx8?iF zkLIWb!oRC!{v-15zpi02V``=P|Naj8HlGLO%bn@#@f#4(?cwKz7Njge7Wq+I+}vCM zRJKBBg)MWTASMLG@d@V30P-uORJqIin(n@y^7?l11ezI?3LtOdYv5~uc(l*_*??B! z1S=e{Lzhm9c?JCMC9%3G%AJnhcGa!*58!_!wUiyC zMfg9xki(z*Uze54|4C9S?_h2B&!uFh+^pC?x?A~2M@Feh?;HB)4FP_#d*SfF;=q_) z(dRh?=T~&>mVAOO+cO!E!tB-Rl(^C% zz^!@^E+FCt4ls1E?Ci!+nBF0)&dI0JH8eZlJ5~(1(FeKJociR(4>SAUFK>w7nb)NA zS1+H%8w@7Lhn!2qjyY!8VxZH@u1C`&hp?M|Ffbq6(C$xngdsSgQGas^29;MbHsgmJ zha#Ag51ALT@cMp5sYWoN=X6M{5)1+k+MR!3Uqs5lqhvnC6*{9hL9mv0@G-08a4LwJ zX4iy@ANj~c+5iLxoIx$T{MWck9DM39{m(z?{y*b z@~kDo_d-fk$Wv3hh=Q>G;Lm3+ZU)FJ&tD3WqhfqQ)Y?;-oGxKki#zQ!ggb*eoVs)x zPV?A{o=bnW)4renl_7P`MzZ|dEL(#3_`-8))xEm$iS>2=kjDKNwGLNAe+umG?>V~` z;$XOg7zq23G2J1TL+^uCbXEg)T1)}z2=JqWSUCTe5=7Tl$4*3Cs1DBTSBu7!SBJ)w z@rkM_Dr86s2Gnqh^3=h>jgQH}IG+(HhiQe)Amg^Jx>E~vj6aW%4y#s{>lChz;~NMe zC|4=ksbuYGW7jm=@GJ*b)|IM{fsYrS(`HCi^?eD;Aa0mV?Yk;=jPlj#&me%!b%30Q zXG)b;j2KFV2HZ8kY*lMjmxUlfLt84lZ!dK|T=JDS7S_E^m6&B)d96n_h21h#=~H#8 z&4t%AXIn*^zf&k%l9KJf`yD10fZCaCg^86bFvwlc?Aw#J@~C;;Ls`c`@MEytm7xnmy$$tHzK`%I2C4%N*3&WA3yjPhk5xC zyv%AT6Xl>EAgqPTR^&HRSh|H`i^67AawV&J9orkI_s@fTNhPqv)J7f8UYNCskF7;H#q2!t~GZpicTmkZPnO!S_wUZDE zg@6t0F-X*ON|pL!+WNU%XUpZ?3x?~!a)JvW;&<^fyu_{?`w0;0R(EvNsZ~MC$cFMz zGW;<+`vjPtOelcBADaNJU;ZDm@P_gPjPk^c-Gv``(>VGZ*+iXGCNr$jgjxKAeC*(a z58Hn1GYF&DC!sH}5!nhiwo&~jG1hSan&7vM&$pOFF}e@?z|MOy)=t3JJDNPI2w^fw zlsGw_2*oVpbB0p@Q~sd?(=$%5z`}sr{oow&RZhF;%?yf7+J89u;`~p3bPtQza+MTX zw5bO=X$uEfI$=XlPY^|BmReC{3*)^`O{+#%WbjLgo}Ff2D+X)%cO#pT!5d!!Zg2`c zI8RNvPqiZ$S&~Dx(RglVn?>fJMV@D!<5o`iO~)C}XZ0T%GOXt^9t)Iib1*$`jeN?$&qE0 z!jgto01C6J7NGbrG2DDtc*~5{-#Co|EFKg3I>W0@(bSheDex&iH>YRs-6>n2f%`)Z zE?C`)6X!QB(yBN~bcO^#=ZYaYKZQx&<(is=?=nmx}Vn zZvce_D_|UXxU_H|w-@-ec2*CxD&m%i9WCeZnu=3G&U{H&5E z^p{-|530$#;7{6fWj$FW-*$b|#L7vdPM*K*n_CZ>iR-_Z0=tt-YkvNuxM1L=+EBvV zKl@>p6`rC z0|?iuyQ`U=H=Vazjkm9`Kl{X`IRpj7vC%Q4mrhcK*r8`iM4UJJo8n>Iqz3#>8MnNZ!*`(^El-t^(Oxw>ZbZP7(FiRf4-qk7u z(V>qSs^FcVj#cm(g&Umf<<<>Mio2@9at@9k_Cum8K@KWfb@?feFEi4qQ`9@ssngWM z(6!4MCD!GO{Z$^X5DHR@Jg;-fPfxl(RP7j@)T&B+ob+=EpEzUOBG1M&FqtSqZ5@?7 ze<263MDamMZ5*2+u3k4-q3&PAXdbr@PVeZDH(DOCsT^8vE%kMVkZ!ME9md9Z7o3n{ zW~~21p^4$#Zia%EAk1`*i3=X!VnrxjXfG?5O!heG}~}sc|u{pBZx4dVJ5l?xjY= z#u}x26DG~sSfl2PB*#23*SY1->n2^hbcBO|49?`9b687q`zu%zT4XKkn8%CT*T<{(O3iy`$$yh$1jh zu9fzTvhClQ_6s-O{2F0o2|>xXPM-2-v@R)vxeB48IEEI95R<_oV3CW7vq!=F_r6#u z;^8T?qK({VGwr{mAM}&b{*^Q+;7SaIK7gAAIxE*uOCWwj#No*f?au-1kvf8&bfiwk zF9ctO;wg|4ROI+8va*{RoemIP#~8U&Lse@sly*5~)#c(d>`qFwlXvfYRLsC`=Fh{w zbRCw8>3Z39NCn&3u+AVI=#isGmZDfvOqLcr9sfcX@^kTrEHf?rq(L~UqZ*jtAbRJi zkm45WBpAkDKg3$bzxwu`cm@m)m#2U6E4!lblRCxkz%z2~j2bmr%sgnbGdqd`6`0H}%GiF>=gHMY zOpzx(7>g)Dz4-b12a&1iRniGH36w?6tLje}TGH(V%WKmX4WzWeo!ou+Zs8Eb1z4<} zjFibc11v5a40z@^le$)Wpua37Re_C(?_uDA_BvRzB}Vg}eHZ1}$4x}u3Z=emmA713mw3sbWwtRm3g@oowGVvdbt zegJ^bFNZ&ea4xdOlb8eT<5H8&Y%`1;y4GcTvKv5R{IVv@q$qU=5Sm_J44@hrl0amS zJvNId;YK)#3=}>Im3%Ub!z&D5GZz5V1PgMEJ=_;@AL&RY7|#2?_LHtw0gWQyqJMsi z&8Fh|+5XlhIbu%)0b}in7lxuA{E#;4PQ4^voTJ=ncZUFJVnvQz#7HJ?J}jZj*>T8Q z^jKOE4dySBYDwPCwkQ0q1C7i%T7uDyTBu-jg5QxF178Z8*MS~WfDZ%jUM+^tPh)S$ z4Lk`SID7^uBxBkKd6vdAaMOPha^)Ad`zn50%=W{_#j%ME)*{vtRga+>Iz~#Dwe`(o zI*7)S*+|75iU$AeJ2+q(7?Y*<>6!~EDwd(83mjWZQn&|?^}w|$bkluxso4?1644o! zVEFqRV^F48Iu|o|qei%@g=b(4%&7g)3gTJtBj^_&&1i65pq@fQCP72nmdr#*fCsMy zA0{SY@mJ? zY(HXvy}KS~SB&xN9#IyoDYRfj@Jz18ffYYb)VTvqr)IJ99Bt;7;PuieiziPp{R3I% zRWX>uRFSdc*Dvmhd$3o2jO>|L_^+BN+}(IKPyepcdHVH{G)Z0P{y=xw%1X;U9FJ>Slt zv(rDWCG1Q2w?D5HXYmZ1KH-QZ$#scf+&uY!_$rvn-jhE6Krf&&Ijm>%l&m=%vq_ph z{a~G4z`YTp8Nmo=r*vnnj5Q&aH}TLa&YqEWd_(?pqb$Mb>xXR7dG(vpJ}74N5;~^2 zO-@aU4g)VWVj=#5lmK$jUVJt8Gul)Uz#IcJRoj*$YBDyqeNcm2>dUo~=E!v!Fwghw z?A#TRkVwOP{uqinkKJ(eO5!fPU3UBe^_D-jP8E7>8rq(HZU5lR?3V7v4xj4Ct;(Tc zk}&4x$!0v;LPAlT~G7&?tPYP5ZIi7MRr}(~(KH-#HwN2PfV^Pzli@ zyvQouG9Eu8=B8JYl~q!6y}FEe^XvjBTWFj8b0!?lJ}_l(tR26wzqO9JLu9-UxO2bJ z^$BwB?LSI}LOzbs&0fj_UbbJZF~0eaz3;jizM7|KZd^0950V|aeDdikYouy)+T>M~ zI+ESl-t=(12d-tQ1beRKVdnyY=xnoGdDBx=iN^|+x)R%i(nG_ z$+HkzC^kq6@Uwgh?R&vgVw9>%TmTT$`b*h0;`}LwTs@Oh8W5D{OK2~tB-O%DFP~+% z_YDW3wx3F+TzgyGC|Yz!N0be>u+P-MHA7V`CWHtrt3g^$Pp!*3?k1@^muCVEWJf>3 zHATy|OjO>x^f!`o_FF_TW>RaXEJ?=C9lRdk#kW}Wp|Y12%Z z2YKQet-7DjZ1yGmaVOcPHVB>R;%bFWPXeA@Lxi}FheH1)xv{meQe&$uZzw+gG<1Yf z^u(~0>~zfnhu-&Cq17OyI9eIoT;6*VPMAj_y#X=*$ww&Zto5M``<`bNFe1|=>5lol z-J!gyT1iRAdU`^az?YmOyxK!m-SAj}aH7DyaP8B#B!fy338p=5 z6jw|;G@1TYZpcjTstA7P* zF7aJgTuGh6loJI9(m!-mthd=`vsglMZdK+Rzew1gf}1s$E^vXM)k6ioKLJL5gWLQ_-diediOi&cJ|*b0+&jdUCS`4#bF zm*K8pMa0z$zSoxNMdS_vw<#|=*R#IhR2dqX=9w!uXHM32F4!U> z7}BE$H)lcC@F~#QYt7>q?_-94{%r6G@R0D0k}$Q$pEMP;`uMGc#w-Ueaze3G# zZCS)Kpl{$t@{%TOqJRYT?x#q#eXq1o$4Wa6d#U<+l+yk+kke*?Gx~mO;P#XObnXdn z08}MlLHX3UzRPSJ%u!)#4yJiHSn!TQJvDS>XNh5)Ry202`ksh3c9 zcB70UYj}o*aV9w)W(tI2lT=KhqdynQGaVu_D{}3yFi}#bSOxlknh=rESiHmqM7Rp3 zVM*p{UIU2#ffP|K%!Y+DUaV#ONRz0+`ketqHlt_;j+Ec{eC!GU0=qB~E#csAh+vKS zG{RpozTP2D$*_GN#iG`@1rVPhq4Nw7^BZ1c6pl~wUC{A{DRi5RJRq*Hz*_OC3T-*rMoCi6kMoqfW2G$GzCQSEC?C|hqAuyYCjdCQ7@xF=FM2B?o%IagAO$qImf>%m+Y>N^Hj z)}SM=W>0E_U?a2UNaF=SjKOoukh)aReMBe>L+IWMDz79Ov1BAph(iVkNN$h&#_R%5 zh+D*)OYe5lV!qJL%PLvxYE1EjeJ80jiG zL>2AQ-cufqHKj(&(-L4##G_8*X+{Ze{Yp&8EKIDEW8%37D_Ka}`#xN9=>0|2P=pNB zP=a(c!Y!p*q)KHF{%#stSJjc#V7d5fngo)d&Rw^h6j>fOab8PJ1T4k^7T?b*=z9~; zd=nCCQ;2!a{DjzzYBS1vOUN0|bvsny)97VgQ)XEm;ZC^Qvft~C!BeQTA)70l;Zo*l ztSCaX{-}$`v5F8TyU;$V^l6VQq^O-MOHmtgHK~fij)Mn13ej+?(A8l#39$)DK5-cf zG|nBK`Pzr@Sr+GmXll|S91|6J=2%9|rUP{0_!NqX`2+vZ^g&Q+_sBFn-BF2(w}5Rt z3nRynL{8(_Hvl0Ht&q6UpkP`>s$n*4(*N(+0Re*5`1-vv^xPOdeY9$CvzVXtk?fdF zR!zpppLileL3*&0FytygRENEw<4Ufo59;cQl3!V!MLmvsjpKEnYXk}|X-kdb4^_#! z{bX%+G33({&Y1w*Q1F44I};0r*bKs?^%#_i!FOstb8MI!T0zx=F=be(c7N)=%??H> zVn>+xyeC7dnMPW$cV_|2ul*zPA|Gca&DsP`R|Bh)XOmCH$)m9w7#(KjVkWxsF8m4a1wMNw45gQm}7V|l2_b4Yr-q6sE)d`JH&tpZ1o_%6)ny*&KCzA7}$(=cRDj+$d zto7;plo9?^g7ZtziIiDEJJWclULaSuiYfQ1HQ$c`6*302Uj=z5BWW=L@8?a=R!W{g ze_CPX7{R4@y=-tuk}0klje@?Jn7m1Rd9(n1q3tBv=vH03c()tOhTSYsfl~_&M+Qm* z_m5XT!hw?~8j!O}5yKYrc>feIqKwK;$jcY^6hrVGqKY=Je=ySEEng+8f)x;bIe7%q)&=fVqF|}+jTeyLW zK>qXhsMdd}CZ7DZ0&xB@gO_Wnz>342B^=hKsWJ~}<(=Loob)E9vVvbsu)-*hDflpI zDsOKOc=LmgwU_4hnc}Unlz`!Zx-ft5Zuq1P^rr3nPnt)XQ*-hv+g&DyB=+Us-0uQD zBD#Zd;;aCSRAIJb{wP0SdX)7HWQzFOwA2j4o^>yv@9^~5fHzvBK1Y;WSMs?NXQusg z$|3LQZtfM@o0`Pk<`l-Z`w%gtSEa4L=54Q|Xa!XOXI0H+R?-~^V0(!#ZV6{DcB#Q) zJRF&KE})0^5^0n5G8e{k9$Av(EBu%)u$D*Sh<=9QM0Xx-311;Kd$|em!lGNRSbUR6 zJ67U8hZ-G3P8by*=@&Qs zLz6Gq;g@tr-u~uJn*1f^El=IGapc5$H^|+iwqa^;n2qv{IFjg^MaTHIT=)&TT+}^s z0kW>$Wl_qm!xo5sKR=P24tjDV?=b$WbIlI7V$-b2z8RZ~uUu-@{A_R!ydHt{ee!6*xSG-)p)t zM$>Y!qOa~_8D=IozaaUr8wc^ECvfj10#$fX!PeX_A9<~aLO|-h)v!du?ucEM0Q=4w zP$j8#ux=uct^m*F``4ydKpo*P95Q)ds@@Fmga$H);ED~h$HU0r2w}O6FSE3sOYmj$ zoC9-H>T9VTqu9yGJm6-q&5w=%j{TTy6{@PM8Ut;OqOf3=u2V*!ha!Rk@tG|K5$h(U z^#wDdDldFqvZ7(DNSQwb{LS z{{X09;Nwq=8*nJUeyRTG3jAw8^*`e2{&bw>9e&7xx^@QtG)C}$3tTCf|AVK?DX*rM zbohq`M4$)N^H;e~2q0rF4`pez%)p8l#u^#4s#E%T~ViTBR55TCsm(q-oLA7v)4< zR9!{L>KPXE)Zl48<~GXCIje)~umr0*$U^F9G>Z|2C<_bMNLnRHk_CI&N#Di9uPThb z%BWiF6U<4M-;`$Am_l*4P`=2%A=c)6X-d?4O(?quX4>XYpno2JBP@}Y5K%N^Unz5v zZ!KkGx|y+|P{(=4fk#%TKSJ__8lrt}?nqwUEoc0(P0KkGUl(HsKD9~5lUtDGyQLtO zXrLXKt|p6kCqBCA8Q^b>*lX)cVXpNNMC?b?Rrx6HhU;G#EElUUjZ?NgHGV8LL}Nex zHM1$;pL7QaEjhb_(L2l3Pw|D=Oe!vi#C(90xE*pNZ*Kld8Ddx1D=!V#FTalFyW%-k;lA($tJXeeF=1uvzWt7T9xROX+R{cXA7Z;F)qOD z1}?4Ic``psOuY}eSvz(%{Ogv?{I@cEpG@R8M&&|OS`dPogTgi#Lnnqb)*q2=nGdu{ z{$cR$%5u}?63&OK!eU{HuoKexcmy;`r7}6jVse$XWaeZ;s^hhi2EN6==={8``1j8LS=Jh%w^f z9yCguiGDg;i$8w}du`Wr+Ii71QkC^Iux!%ZVnETo19jP3yGTovsNNljA zkgSjjf!S)&`jZVP!*2v$ARKb=&6@RG=z}6jt%hw#d_g*h_QvxbkXNe(ZWl?nmS)tL zGX2`QlBU(Om`zcsV1$dUQ<^7q*Ri`g%&ispAEGqNN*fmz{VJpKPG9c}^Db!?9gHZ> z$CXt5ljdzko|>A5#$FlUQKV;*7#xl$4(kpVE(T0CDp|Tzupcap8%+$Y-vf}Ec+q7HM^TtKgq8i z5fRh1{9wI`AC4^%5~J_bYY3klZXQMcl@Uhr)Ld0{A*r?3m6}A_cG#`n<=t*_L{l}F zQY|WIOKz1s)zDn8pC;Xv)nkqdDoMG7T$Vj?%YU3rUk+VrlJIGv^~ ztI*{pz^d7RwcR|x#ZIbs4ez*NECgObqGs(v1#^AX2%t*s>td>qpJ78&qfDylY)qrM zYVB*Syr`QvRIyBOUKQJjPQ>@jl4I76W5~FxPD4F%@0^hHT4~I+{OEW9F^-K843ov* z6lhv^q~{)O*2bXwDr656v@6sa{e@`@zWy5RM0lv@7bpz$zA8}hVZuEcBCVAUXuYh* za?i6(Z%@0+bkFlG5Rm-d4WkCr4HwtU%sg6{>T0BzEfpK8TTPXFmw=h(xkrt``^+Z?Z_^p&I%N2X>&XL_S}bT9S0!}wrp zBJ%Xz;$?H;_*18VU6$cy0#hfU6n+^oN8_kFt6tK|Mu(?V@$;|86*(EZ{Pu_ABx@Dd z@9wi<4`&L&(M}Djg{lzSd0XssEHg=Oo-M{Rp;YzNVHqpg>beV%VCMq+R!;kw%q@LS zC|vEt;ukG2d=IGlRMz>zY}TNH^u>`SrG5Ke`f7+M+8Uc1!0hR}Q}{F!hzKJbp78)? z_^}i3C`RU_%l( zjtG`GlR@~0T{1pSF%wPTIsV~J7YH&Bu~UlW7Y5}VBR*bvdH`HG`dq{#a4f$k>#{T1 zjIg~H;;>^R`=HqF` z$#la~H8OtA-S5r))=9$0N)F*>n%R^W99QKmecs^bD2-Q5IuC7^z#oqB>J0Nw6=c+R zi+ihvhsa(`B(scjtb* zP}jth9q)D#l?MSi*GUHJE3&gEH|)tWn+l6JNp`~aEA7s3K>|?QH#i9tuC2o!2(FvN zgcU#iv~2HYLI-&iZub2*b~xN@>&q|UwXCu|(&X07&tIJ05O^g~*cKNnmNLSMuNt`@ zSZS|=nM3CnHG)c)aeyght`%Se;x}^F@OmDJoam5qgJaV5k4|{UsJuQO)r3@^42yyy zU{|+ZFKD;X0t&P2^G+5`<&0nK0&8;haJC-dlR7RnmDORztrfRg>Xt1kMQ090fNY|D8OCUQ4OqIQRlum> zzB2dRvp9o*-%f;IWoKK<|GoA-BiJ2x<|lqi!~D-Q_5UsCivO>O5!Q|l|9gtAod3}q z|Cgkz^nZQle`>lmDsKOXDg6F|6$OVtg;1N($!mHPZUN9k_LljJ%r|55d%c8eMu}z= zLJQN1j+t34B{T)?cVY946|=+RqOD&qZGw*oPlEpTMzakS=wg9CGs_O#^CD(iGyr3X_zC=ne>~#iZ_c38cj2> zf(ybO{15>K!7<829lLtd7W1(V%2jc6on(=54XDt=zh^qzW}rgV$#QB+L=jlI!W`v@ zmX1_m=d$G0v>P>w8u6*xdi?Z}x>f1StegYG6U{Ws%8BEF)04la=bTXS75*|)_M5H@ z?C)~9*;!jpU)3v^hM`a^U^>ZCr)4~q9RJk2TY#gTIWWT&1$HR9szQNxlQPb1L5B;B z5qm8`@K}pB(6YYt?|MiBs2EB$V^`)FQ~Lxk+Iti*+WT=q!IYXhr-0O8w<7+&jxd4= z3?g4ov_=eswA40-KGl9b3%rn0`!7w*cH@`4j}vS8%)miR1^gaX<5WZDoxR71TAy=v z$x8b5S!){+44MGUbHsR^vzO`3(zy0-u35sW6UBLPnVIz{QpGo6<96{$O$rJtI(B^f(5u zfHv;apm1L7^DOQ)s>aPU`pdUxY`_JvbAt56mM0q2X$BSMW3I?vq!*h%zz!qVBSoz3 zaH9x;h#WCYtU;1!tq8%fRDiTlw1CthSOHEtOWaI!@i*FByktNc`2Cjj`?&K+M$TLo zVT*j&gvfZQq>%^+ye2QOdu~41CFPV z!8ktsP)S#k{+2$8^HG%yJ{v!-L>&zO2C2O4Fz+}kN588_gu=g)h1mqAsd1{k$Q5(z zWVHU46MOC&{ctT&xTAjIdChSasE4iUNJ&*Po9+n?iG;YjfV?kXLmRcDnu__wtDRA8 za{&7iuOLC|i@9333LvwO#Q5I$GXuY$*I{9u5ik@bvkLLT8TOb-PpHfe))@p{1(nQo z+YO2nvqPLp1W-mCmI~<(rMz1hKP9nFB~+>b&#nPs+H*GT?Ic%=Z$sCrzoGuonkcTF zt!DlaHkkRh!Uq3x?*0Ga^Z&ac@z3tLP~lSUN9#tDr1cLjuqCpuQb`!fy{`}w86ZsB zZ!rsU2N6e5FU>v(Es~A&*4ENM)RTFKqRi6M2JW|Co+VQM7i;enC0VzvYgeUh+qP}n zwryutW~FW0wrx8j?MkE4MkP*u-`fA*_Bwm7)z-y{xR}veM2m|tXMe{SeZ2kYE1c~l zj3bQ0`y?VT!}+Uv6Ndi@y2~d4GKicWK>j@X3L=|sL5WJ6xbpz zcW6UNgS*TMPYQ{B)#dS1!YpVM&oKyH3XL|OH6Ff1s}0^FM!Sj=mDxr6sg~6_IP6vN z5`qSnkoI;(Z<3vU?1-E#ye6;Qn+wlZ`wdZo8vz)`#Xa*^u{FR!+@)(kcis-$c`tiF%zH-sPe>nXa zz(sj+T`E-9Gnzp6I-I04LOVd~rKT+6WLaD zj`&=xbC8nTgD<~lNt1+f2jq(=;eXN4HZ{$rxsrJqmPAgIUkb}#UACFovZ4k?kxxyl zYLnH~Lh`5Jj`n@exnx_3*lAtO$bRu6xU1^o?6;whg6c%=Q`3yzK=Q%vcXIR$WigF2 z^%M z9jM1rbBBtz{|9F$b{c@E4ZN*>p)VHo!BI1pYj9v5MKJU^zKD-devb{JRDS=KO)Uo9 z&(7exuY!=+lxi@iSJ)jxVOQsYrW{4nGI@i^2i{a_5&T$Vl)*BQ*^fS?xXrqZT?HNt z)$5e<$^L>FwYfLSdw+QGJNO%5@d`r6mT(ajWdYeaY^Mc{2_Sb45zdrDppi<&6-UJx zMzu8{!LOR3a(7iM1uK~RWkkSK-pV3Mj?c+?K{f=YXSuqUfsUuU1Kn!&-kb-Gxw3v# z>1-L~J8Y!3&yj|+xPt38h%G4p9&riR`y8tCHZM+-^E6w!z9(TSilPb)@GTLCFcxKQ z1`zQrM7I*XKSN&)#y;$uhxdN;-n>}NQN6(y-0#GG%=hC1ZZ;KG!RTj%^>2{%9VKu> z_5bX!dG82a^#%L1Js#>Y!8~BhpGn!z^6afVs?}9|u6zLhB?iNeSw_WQ)y(5xfYg7T zr~H?^x_=gf{~uTPKLsH>@o$vC=;s2Rjk{%gQlvyXC4p(B%J&;Fi68+b;e&h-79LvD zpM<8ZYg-l9v~L7_aTc;syTH%+QRZf;N>E}8p*hY+Q+~eYGpFaZzxe6CP3@;cBBy)@ z=1iOtw!}+MgO%0G7@g+lEBZc+w5!92DdKRsDLiltMy3!*FEcr=rv?!RmDSnYisB?dG}h7^EXENy~x6H#qrOew?GibNR=oxBT7zY-eGD)Tg|e z?SR3A+!mh~ag5sx+G+gpMBRX4g)iBI6rpDSOoKqv&0X|z)J+}3MGGZ~=MoPmj@CIe zCTXH(b|tHiyI4i7Uo|5CI1XGr8+8~{J%Zh(>_n{_Ngur-dFoq~*RV?Y?WR?r!to$3S#`ZF{<835whgdI{LJI+W6_k%EM$gl8cOA=);%n> zCuB59wmO3UD-alx6xg!AvWb7e8~=46@cc*n7GZl=I~Pkk^ZywJ#VWea3t}i=r?q2j z4Z_*02;iwgc^pm=+DJ(2MTBk=5!&n}toVUVF)sIK3~sD|2!)g9iL3V|S>*GTkWHkcpqm>j+QSW7>BNbEKkVm|eGwd&DhM zO-Z%WvgrylhVppZNaH+1H{?t;GSXbSlbjVnGAJBw_cmJ!IqM-b8uK|*0GKB zcXkUU+Z3C-WVlUov}Rk?I%H0Z|mqFiqWd7OSG`yw@86RC2z z9J5*s+ITjDZ6+Sj=?fdOaL~%hbcUYM+4a)4Y2Ez$$XTxe52=@!B;Iep-$^LkJ`vl! zs1Pbvmus_S+CNC5(bgTjsE9|e)mttRo`6i8^eLjMJ_H7hRfeFNFxU~6Q%2fZau5{- z^JrU-KLqAf%dHdo>fw#G`Mk7#h<^9};G~b1Ps)g+9 z=zV~a$AY*C#xu-&2N`f5BR+>%AA0O}{o9|~E>`87g}p&a9GPePK_5G$LhZRQQnQ58 z2}Tb5Kfs*dB`|l(}sdJ0j5}#;;ZH1?*R-eenMBmKm3b$hH}Fm5jT_{ zEp#CrV-R%GQDhPpBM3LC08K(xL zXb`8I7f+fay-yAjqvmYK$1X`HCcP^%x#>-wvmXGq_pqFJks|Z)xd2_fu7$v#TtU(e zGab-@syhIpS*%vBM0#3y8e63@trEfPe5t|w1EbE{5aO-t-!!#KA4cJgx1xd{Zphe5 zVTx*XXq7j-;JaT;S$uox5yhD6n6qttMR>)X@Wk8y>xa7MJ^kYtT33cBsVM&VF7yV0 zsP^~OGH`5>&dU*>kH1S@rRh@D?!TtljelE!@}H@Ti0MB7lmAm)vekYmW2>Tk*ddL< z2L_?kvwja$gTcz%cdZ!D;V0s z7#5#!mk(DpMN4iep*sz9CB3A+slWY!Bt{t}4=S{Dd08W1V6IA_l-db9nOM_zcrpn0xAaGV(d)~1iscl%-d+l?X5PbWXKLL(`nk$q1Sol%A>9&+i21H zRNPsvi+Z8ev!m9inhLATwPiL+(~@DU?#AUdNjWLJra?Dti)+K~VHQh9@K#Z)^ zr)uZKEfi8f%7NYdR=JP8EGTmU^#fFZi0)$zy%p1(BL`x&@Q{q#v8S4g`b!BnbJewi ziJBF^vhkMDJ~@nB$CkBiAr*Mqc?>fXN$voX(1zk=&egb>K8@i+5$EeY5MfJLo9J^we(tDpDAdHD)z*kiib4PEmO7_}< z#yJ`o_Me5q=@rBG$bv*@sT%&2sH8 z0dci$M(m$X(0#MBIrl!vca-I{6uc_wM7XEPIA+I5IFx6&zYG=!KfoCH8YbzL&GnaG z;(wP%#mnJh`obr^MSwkzIx0YyuU&IO^(*R@d_q;@GY%jdtdC_2VDu7SU%W8}q_6t^O<+6^vW7zgBC;(!nrz||3VO;vp=&{yg4NV6o#CQoZX zk6ibj-iNsFL0_^Ucq475z?J!JG4J~41pM_7j35_G&jqQd555Pw9aIR>oKf4+I+=sfcIfj?H%d+$ zW8ou+3s|qPjf(rb zQAKu5*?CFscc=(+{gcW3HRa^DCy4h~?OWxy|{gta+>2I}jF$f0K z0kIbdorI4My2#4G_L8bZoFnx2NI{~m@>79hgtDS ze>Arx94*G1$M`r3-_v@IsX9?q8BkordV>RF86-@b!ECpUA|SD29N17c4`_gi)#FP~ zBV?1Nr%xCs%XhoxZcVm7lUPv@SLMfu6KcV9f97Tx5~Cm0&!xV(Fr_MIoW1Dks^?r| z|FHj<#ho za>dxX_0!j_Lw65-dq^8@|7lf4!Z>kwfJ2W^o-R*ZHT(X0l=6g zJ5XFsc0D(goX$JKbs((5=X{Qh>K{&%*Af)&qOTJ1r+-@_{+~@P|J#%C4~t2&itgVQ zlLfj9H_8AMg*PD7VpfL_0W`jur5?mD|jLC4jfiO$xz|!+Ty*C8Gvuhf!LUg#3AvcBoMIUMQVs3AJxv zCu>a+pL@2N3sLyNI>MscTLO$+P>0ADERFf+tpg@_glXEz{iKlwo)Ui`t^(lKYsEMM zHw7cdp*t+1$o$g)i4zRwJ4!-l1Mw@~xp0fq#4iU~`=*8!XW|t5@~?j3zU#dz1MU4y zC!`zstFbZ5Ek4aF$Wy;z#MKLi5bmMhWt3Gt&u_}A%YwJz2|w&lu|Eq9~O-M#tS!k+9dBA`KaP+`Vj64_ZSYxSY)|G*au>xQ;0gI4>E5#Pa-QCi;325 zv%S2)i`g0mEaPqlvpys^T)K*$!f=HaicV|g8oq}oF-ce&bL$rU%G%dpxQT4De*_OI z*iYNd4SGlZOU<~1dZ?tno>%>UyV(-|kJRkHtC+f_i^bmtj=u~Yt_}|NPXE=`GdPw} z4ww-^^fM?f7=eg{%L>ZE;XAqjqD20hgf;;nJ-K;mVl{77c`yz#!9+aAk9=@2n1sTsuFF#Ry~+teB?RjWZq$)rw~u7IrA82OQV> z-u~XU5?hDBFMW*@^}hvoaQ;Ul`S-~E_u>3U=x1yE@k3cc{giWKZ|syIIPkxPpiyMB zkudTUIm{+loI_AT>IcD>VH0MmOW(Sj0ur>XM6GOTZZ6hB@X=n6ct{5k6|`NFvbMbt zuKeN0_YVB3&7Z4w`ZP6V#|FQc0>9~fyy@Kgly%j9yxE!cauTfkEoJA5st1ef>@(bm z)h^Zu_EN#o9A&tTSZI7jD2^X0Z|}^|hd6?=O?sG}_!;dors2g6MfnC-k(XlHy|`UG z!@Kw;Cl4>-sO|(e1@L1YC!8pzP;oOB+~huw1wQzuE<(H@Etb2;lO<}j;F&LGd=!4* zIscv?YTprcRP>Y1-$zJ{U+u;OLq7P%1?7P#c0ZjV2bDf2(gkMh*Z_C0)jYzJ5}0JhxD&P_O$X4+K#16EDI?Tn2l`%vS?JOlGW3q z(3*T{dS`GX%j9Je~9Jch7@CywhGaHPu{>7L;K0J7-J1= zrSuu!1-ljIm;eQ_UmFdY{hMl&4p<2#OQqxwV0H~I>cY#6iA@oABJ_HeS|yEI{r4I5 z*z}tf1Z{Ln(upO_87Y7i+!IEoY_C`h&E*WKlksY=ktBP4441a<0MkSp$vKr}Npswd zag0}iz_S@M_4!>X3rUC4Ge4L2o}hTQsU*`%k7VuWM(aWhwfWtX@U6`Ire0SIdQJpn zD=ibP)BG|s@5ZRe7WPCv-=;QY|3x`5@;DY6p$)ikE9OT|PcKeYVylIB4;$ueU#%YB zTw=M-5E9qQT7R_#LCE6T)e`uy8%the4Y^J_M_Rqrt30n?_8m9RT@gI|CxU@vB=? znwoXLEE>GH$#w-SiZG!I?vZXq4e3F<{ZnZUWM{+9N`5ggR)`eR^7C=7JXJAvoGl@0HpwApM?N}7 zmaAd2lx68<#s?C11P(clpwo8KVWhfGt7~pkrz_Q~-|pNAxDgf-#~1Yq+1bQso0*r} zY}OJ+(xe+P9y0>&W>wQwx@vY|-(&_eIfy6tSLTAuV9y+aLmpQ1b{pH2gd=_QqA%uk zDhcheH%*ZlgtA?G#uaKc7%(Ft}|oy%PiL zLGrVGFnBJ$yr`&t^VjBYqJ#SJD89W#2F0fLr!noLVV>1)$*+>M82b79ol1b&;+@p3nux=7I#Rt$JF7i-`(sM!nt zlp4i{1C4C?ln1SCFf+1E5o+`x8v9n;WD;m-3Vsd=SvTH&DYVhj{ z*?4WUl&DFhx=53CKGSBfnatLHLFL$`P3jgSMHE@P_w&J-F1b_Oz5rlN?fycO7L`99 zl_^$Kg2$aa#TDWnD@tMMe#Od%e($ng=Y_iXgNlcLQavjAChr1+M@t!mJy8l9(>$(; zvs~x;_?qb%qs)ljzI|x2Yi5z87F`eWFyXLjzS;-xhN#6$cI);^1MM?7_tnR7lov_< zQbWJ-+K)ReKIU;bW#+6?dtK8Vni9KP8r|-2!-Z9U7Hau+Nt1*$_3DVIyu)sG;Ow!g z+wRxiq-S6q{b7fi&7M1UZwA5vMA(ouwE|1P&O*&^vld170yIM!A#QPI9#J1W?afdx z5Zp}(LGn?f5mlcfsCza1SJxm2xTaxogos=b#}$Z0!XV@Lz^8mBHUF`GVhYZ1N?p@+ z2q`&bQ!Dig<}|jbc|;j}Ax$2(pj(d%1gbrMLX{C>;WWZWP@O+}O$a`L;EI8k76Pbr z{ljnNj+`k8Ii^L0@gO=<>h#VRv5vUa;~T$@Ht31-Yaljwyk?Nd@{F1z+E)3Odn*Bl ze_C@sAc;wDb|QCc`p!GKLmjt0UeyE!CxBk1ZZ}f%GLJm(LDyC~cQ(jJNEN)TFpguv z^#-J~!vmE(7Fqk=MDzlYYrxaJ5(-d6=&|4_8 z38i4xXhs~>{MDAeQ{fD5Im&M=b>IWvtRqhGxzJq%kt3OEns3rMdrm9f#8d#kz{{5_ z>Bk(1cMV~c8XELq zNRxqyCALMV%Q+wuf&lpnXXz=^)P0m{Ts^!>a`J- zBO;mxg!w-8?{)go$7Z?4K8_NS3uiPh#6dJJ%z&l+I~U0LPU#?GJ>kb(BG4vyFZ>)+ymEK97*x$IsUPu zdLHT2*BDxV>w(v{S}jkX1AIRMi9RpezCMIp)Mh>C`w`3jXqwZduA?)(aOVgOc(xuC z*PiP6X1j#EPvdie9M?0&d?{)lNDW+aT+<-j?r<1*DA=R~5jjrwIcc|YCHe0~^Qr+VY#Zy!T$B;{ig)VFW6|F*B= zf4KDh3tIQTEPa)}ItVjh{5Ul`J96P_Hjm}%$737bT{Yb)FH>0KJsU^?u#(DxzN_be zz<+%6OL}h3+*vhc@%OpvCZUgw_4)Mi{eIF{T^L{tP7WuBdEOIMjLC36^R9tGpKy~T zzUiGP>3%7BSUyFPE*XvHvkPm=g#20`7a-KpiNUB6YDI*R(GxW++=2o9J~fI+Nvj{s zgXKu;+=EnUMy4EcM!O9iHE(pmc?-iX#ITtJJ-bsw?j!r5^eDyoxB<*m4eEsDoM?G_ zntEn!m(<#VS0)p>r+1XT8SSex{Q_;D7l9ih7w*fnX%{a?i$puGBJ-g?j7jq<`C`CA z3FMf$imV!0vDNeT&6`}sU)cIb`B!*!25q9&0^p#ULcusMkY~=6I0+U>Y;9J;lkn>+9f2^~yV3c$?gZ)|phAJ7pj9&wPOul7 z2H{^+G5`z$niJEov+KChq>lPa*5?7hKLC#8OJa4s#XrH($t%@QM#i^!etAA+-oxD5 z>+8o2%n&T@c+!R}j7=8A7~GCc&P+MQ3#+UsGn&8K15tDr6#@=}+1k=OOg+i%49-{E zQ?=SNyCquN@VZ_@*XDcp)1TLTt~*1&=7rifSo;r5_b~5Swds0J`{se))ZB>ZOxM2Z z3!AAOgGkP5%>}=y#Gw{>bS-1q-8P%~3B@{{e!`bAmo}6~SG3lI(^_p9?YOV}l_bWn z<;3Zii;eq=6U|+qZq7FHb;o=~P$ssUrkkUv*)uLHl|*|0#caz7HN#iaj8u=cR^HYM z!;}H1Oy@nmCeG13Kt91Bs=aw=)u3+3P=tN*c30hme~X9YJ)Vr*c=$Cy_mckIc>+b+ z8E(>Lpvt3JDx7{jAl+(dI0&O8#?Hi*WUi(Vc*Vt~KzbC`BnZKBv)jZQk*rc!6oqlz zmRtks9ze9MQQ^6NVrx&;#mJQ2EqG)=0W<&A8(bsT;&Mz z0FCr3zuH|?9`TPP94UVspWvnjzYxVcpr9XjqFz6WTDB0cC?9?SLyRFrk+Q#x7#pd< zAEX|;I4f>*t0+4_J7J8A{uI0LtfR+LOVnscf&RVPYsHv^h+6vhLs^~)Gj-_A4sP0a zYMJWb9ySHUQmAET{c{x95HZ)BlX4X-!Cr^0Pm}ad+gIDpv%WLDPcxH#es7dS8MFEp_rKWICHvB+gdmrA#tyVL2kftfn?PZqdbpT$B!h=aCRizK<+h z&!P-6W4B+jJi7*+ms9 zUk?By>Kl$qv+S8}n zH9J3MMnRaufMX*aZRt5mp&k8BuC~!9v(&hM#3{CSv-W2IR9P3(@C>O8C+>`aLnHr= z*@T96xc#}_sXMk_i6v!S%cPQLBWU2evChY1%uhrZtV@xc7(68T@<*V`>fwD>Ii@T- z;yxB$TKvgEg;nPHGk4DJ$$hpNxz2hrM3hePVG26;4xx`ewGvLs$5zTX0~||e91a)f zo5i2xBnQ%9tG-G&ByMJ%Ks7ISX<{ojE_O~S?jbySYYKXr`ka0_Rp42fm1k)Y%6Te% z4-IgAlG#0Jf>=BoQHLJ_#+l?AhtT07T>+MD>tE@qW)H1&GZ>Qth_o@YjH>xFa3caM zFe2eNF|!cd{TolAQO0O`#^9gz$W>h4u*zzr3WF-Fc)5xjYd!rCEL`j!jLLa54I`M> zW38;|s6fXuccD9y25jTOE`9;rF_P0LI@MN@lP3_KZ+wKwA@0u0p_b~I%m^Ud$!4`h z^Hq{1kf-0%$w~x!T9o2wWIDMRZeUNJV22w5N81oE0SHbVGdic|3Mqgx=vUBkEo14i zTN-gH`&c8bLl}+?*k`XfkycvY2+L)JCnnU6F5lc;JGsr=ZcQLaIAtZ;llb`XN=DrV zw{jozDqSez-9jx|^H*)HIWJiJswoK{< zSsXsmpXzvy*P%Af5!rnjJGU-PnEoO@;&8#EzJCtJWT%p~xrtt!ZU_x|MjUktF#iNH zY{g042`7B$Th^-etZ-;f2oldn>5nt<@o zY9}`M#z;{ne@BOlyALO%bDR|eBpgGkVNitX_*df+mTQxhBZHP(tM;8ZfJKoIReq!= zCBDKmvOaSI(wmYFQB$t%mRs0axbM~r-2KQh%xDO8C;uQf;gTo$hgjeW+ zD0i#tqNDJmnqHvPl+*?}bHUz<33Ratu9b72%dWGF$WSlkbwQ6}R%owW(Cg4H^*+(d zegp(^=})EZEF*EtRCenDb5jFVXFJV{LGy0Hq`0*-VSM*SIGwq4diD8;`w?jPH1Kks z&sI9ya~Vap ztFo6|DgDVTS2uYf{3&s^8^A7GuRy)XQ?)b~IHp&)*2AF$If`%P1*`A6`S~E*CwpY&%m>&{{h01@`B^O6{l=B+>L}BtC*2-! z`eXNy)l2tS`-Lsr{;O$ikMJ?K=_g)~^l>*#axbBReS{tqakIIrZkE@b?CC{Lo-V4G zUG^0s($nn^u3z*pyaW*V2huLvqwuF)`bT&v?c#0X#|%$aZ)G#FH~U;qH^{>CeidCc z3-+h(1=I2_z6thNNI6=5pCaUrcPMr)@9x-$<*4r*s3Mn3Za1_^0$lhzf0Mq34*ypR`!usc{{=zA^h^r&@agm5JumJPI01b;;GP zT*9wLKgP_dW&6$4p1#Ed4Rvz$j@qBS^*pP%zGZL7Q1-L=m9EfIf~K^#egl1OnEbJ3 z407>-=4}#qLK*}$gNFj=`XMlIAPhMd`;3nDsdTJ=Q_K1hJ%fK|@2HJGk4da~%$e;+ z4tVtb2%O0sJBdZo%Y}N%J$-8j+01>GDj|k@b&3|IUW!I$^_6_Bv~q3icy7ibWPZqa zBHK)LkjGwL+jX0Gw*}-cL&y|rEoD>hs)3zTI}pI=VH$YXeLhwtpbp$s5%LicVgij@ z>ECWKfM-=ZdT}%2kf{{uQ4Z6$@kUiHB5lDt&s`SOQs(y4F>SeNh26Vk+)4@I?*u))ch<37Esmhb5qa+ zev4KX)m}=8+jYjaD-H~MO(~&oPWW{;-^+j+m`j!0Swot>WH(x74mTy7-f#4I204<-sR8pOWX+*F44!in(v3oEL4j_IkFf#Mjq2romd&C@e> z_fu2125;i5kFd)lKO#owP*#YzzQBwMsD^Ep43(E^Z-_q`F!TLRZmXda*%5t;4@d{1vMqM$_f`nn#` z^0hdoBVX45ZcngN0#u7%DD+v+g~5=c?raM0+z!D#ch*)zRe7ter`-#+hA^JvyxKcIEbMF6bLS^dqwfu-G8LUDO0JMH%3v4BVe-ko z=)XPSMex4tzYtKWDYG)*dfTCty#-MRk6y}85lwMK{8m|&fL_7;@m`^PDjI5EWp7bc zrmLpd8)a$qcKphU`mluB9GzBHTgi(!TH9C%JPNmvr4nl1tFBQAq?Z7K?>UJ3jgS0* zy>usx^!@uV|NcZWhw~Kv;>kPPcg+_;JHz=DRodEeiz=ZPcZho^u;oI;^Jq2aRBHgW3BM=z_oaHilk(na8c~X~%mcB>= zwnA(mYSSkzAmhoXp*%xXj*PK zFprdD4!~y(6lqKa=tcbY3!rIjnTyKdq49V!4p5Y0)>-`sayIgjqYlt2g{8REFOEIU ztQbrOP6te9)ZaBuZ@doGm+Jc$AuOmaiq66)Vwnzhp$cIS>hHk!dB2~^eQD~uQg{Ct`eX}eVjv!J zNTqvI?h}H(Kxk!V(33~QmEuK>q&c9J=n=7cCE)?rj55v$=~rJrYI>*}&@BvTrvP2~ z?C9oQugkXidYImW@Is!5K*>LpDx^f*6$%&v@=!#M$5G%kP_*iDf_;G~?iI}zvJ_vE zmZUX*ByBB94|+*Tm$V0sEZjtt3~pi;a}r892Z$<*5$T&DJ(SA+)(L30sj_ju7aHN4 z0F~8-haFWIbr69+G~_@Ue8a;EHvAqE%&T%Rc99Q=slvlzCYLc55ATgSDRh(t-S@T} z`2J1KhU%hNl9y#oaanjchLe|Nco!r0&?AWKDWN;Ggp0}B0&5J9?ADa(B}J*ns?h>0 zx+s0;2bvh^b@WuBTlImL!b{fEgo}_yg;tk#)Ts;EKgtsaR4{H+**GeV=98-S|_`LB>&F{d9gx zjEe+!WvG}h6R#*a;@}{mpIHF3*CLI>sueMdOB4gJmMo zM;sY=`G7=vmw`1SmQjkpw)zDDD{Fs%)+vKkBy{+x;_CwKE7L2Y$dp1MzHt%;QZ3+2 zO=7A}rbE3AVnL^on*aOzuJV8j$gAhc@g)0)c&MenO!{CjT>51(apw*aSzj3gE^3J= zTGUH3Mq#-jmlhd*At|Oy1*fA-T1>Jnpxx7ut0oePVWJU1fO=F|o4jlldG&|nt}~gE z68FGpD9L%~XBKES2m&8r(XQO{BUxL&nt)9qblxYf3*6=>PtoUH{55@8KIBPHDpAmwPd7xzfwN%;HNtSK$dd6bYJJiRDAImj8!eLc zM6}0e@;In@o*^6Mu9nC2v$FmPOTy1KOYXMNH(8#)uod}@OW1d*-l7TxY%X%Q#8uL) z%8p6{AWe=R25F|$ju)^cP?)!$MgSTf5G6%$3)dYPkHER&v}jpOKksnXRz?Y}EQ@}a zY8Gs1O37z6sG^SLjL7_c4%D(m!q14h*MuLsX*)`ZFU`MDU?iv99={|(6$Uem(%`Qb zcH<4;@o41$dv)FW9F&$-UQXMhnjAWb7;uq_jffbWZhmE8Eu&>ZEg8W(+($f4OWh%; zG)7~}-m^Qo!1H+C;vl&UR^E(-@c6dl8++PCZ8jbl{ zI&y+mcHV&ha%@<3g;-WgK4T|}R_y_WFG5+>C{(zrB*$*bOF|Vt`|hHZmO%%p>^#LU zqZLau$QN?{34-%E&Y?9N&d0>#e-e7H$kK0?!77AbZOb&fz2GRYo28|GmKJ!4&G?G} z_tp}@11x|yvt)oFxeWLf{a#vuGKkVww0C6tm&Q~&Gd?-VD$L6R9CL!f-A6>f})WN<;vgDDY8@(>gcgqR|Jo6xDqb9k`gXn}IDltl1$1rh?WH?vy>>e_ z@l!zi8fji5ab)gff)a8)EtK%Gw8XNpOWN2oisEcYYd<{z*eKg(woBuNr(WpZj(I&M zLmjK8BO2JG(_@y#OlXZnoG*;2&jtr0XfHp)KIIXg%;45-Rl$6`0FtH%(uQM)-CLvPTSJ5EOI2(H01P_iGo2!ee8LnVUs~O_@UC-{gO<3tkohRa!28bAq=Y> zW}xL^HW~{zR1*Qjjb>r=gd5@oGaOuPaqns&7|Nrdpwcik$zql4$}wJ>01oU*tkSr( zR3~w;n$Pt{>X_8Fs+V*}o7-D**BGok7nkDwr9}`=0LsYZq%^Bo<7oUy8)x+Y_BQfReu9*qH zQ|FF6qvd<#TT3ZSt4x+IpmLc-@`XRWd@sYv%G&(xP&IwzF1mf_Zq^ebOnoZ%Fqx?4 zr+0e-5+az?RH}?*``xLQ>+_9}t*Q9>aYIHwZx)$NYUd@m>_)xyG;ZMw7WM1|^^8^| z?eBCJzF;IfPT~@7B4x_SPw!NY61 zHXCukPK5!ay*N;5tKJ}U!j1R{A%y8|K zLCWL z?K%SlucD&YB(MS4rU%O27ncr*Zz4K`Kk;s15GVz$b9g`w7NiiWI}_9fN|UcGNqMxO zL}7^~Ngo7;A(Rd{^Cu)03h|bBh9ROJRZgzPysjT-55bZeb$^q`wG}OFz&xHd8N)n5 zT(fwL0OykBhQ*f5_urp^5t;iVFP7w^?UcdeknYIOe*g9KbMgTBJ)&s-{f1a%_KOVS z6-sJXfqA?y#-n5SLu?Uv-b+BOj#OP>6W1hMhm~HPXG`E*-DP2a9bcgoyc6)DY<}EN z?c~x`@Y7&YEFz>-QnN6LgE$;!-U~eW0n|290_%x#_)v_ACkf+R?U+W=a?8HyOX z7%G_>+dG;3!vL6^Vy(QOfDrOa8M+%31f)y9r}n%ZGP;ZiwW}GgEpE!8MClTKAJ@HVOm{Sp!KzO?H+>6TkSU2BJjf{8n6yHLK0{ zW&>&YN^Q64s?2q9YxAS(maVdh4zi0aTlEF)mM6)R?50Xsb5eQ+6%Xqk=H?E|m8OK_ zIR5S{@&~z@?3INkfOm`tE&+RA9d3ZM8xw2G^fsLUX|`Uicah`z=?)jnps;;vrtzkYtVfp_D?oe|rBs*gS3HZVlCORdxmvkV6ySp)l~fx`>9ELNjYGC9Mj ztA;I3m5f)`k|NQbR&E?V4>)?EMf$0rpkj;&{7a#h8Hx-Lgn<~h6dYg% zA*-l8LKH!XF=Thz1Bm1(IAV}pDm$-q{OjdLYOAwNE!B#N8Sq-xZuQ%>7K%)kY!)_L zPdtcGij2Bw&>y7q=+BZ1>g)81=rY2_biffOdWBx>k*7ruyA#>Xc{VPJ^E$PB>*ZFi z8Q#el>a4mdk|sorZOglK(tB8`^KcuOL6AI+>+@1!qX17Gxjj$3VUFXLX!}-wh?my! z%cnjhP)itr`!9rM7n+D@ze(Bq4aL5CnogewJg3J6ji;nYvuQ4`xj8cp(90_Q$Fu|PeeE`TjqZaeWFu=jGc z2D(2=){iz9oO&b#GiIDkaE+}WSP(x4rT%ns-U57r0VPX4K(id`IL}OmA%b4~-~uJY zf;ID}0R+fNjRa#fFPoR&28Q?gG^50Sk^~Yw5ecfui1>efaz0@G^*yLF7+78@eSqMU zU~FF^F6#;fND^ESZQQ&Z7^0OLyvM&B0)Z6bmITQpDFUdEn%aMb_urR)8_7n_UvX^wcUN}_Q$rI|r~k6@ro1~N zi(-uCO3$YTo&AAUX;RQ4khKK1Ew->mTt|WWk=XOII%35{vbIRFty2J+isJ7#1Qo^1 zNfbwcF(U3LAUEqK*2yPll2rETF~XJWhg)OkY-8^GC12;$6Mydq+&A0nWO%C`R(h2| zPo~;L&p~MW0niFvk~_5Y)^Q!8yBPTG;HNUT^eI%PtHhU|Q>sk(2`^z&qb4=+?RwvG zpX<7I12eBJzx$90K1i0FS`qOLX#|OmAmw`sD-VQ#DD{FIDx#TZAYn^djt9-W8cC@D ztt{$6P7H*%7mc_$;hK!d5E1pq_;WA^FtXyQ8cAI@W!U7x&X5w(pqbn(X5pRh>T;1% zL{oM!riGP_s$}VA8*|)zhuk!zr4e*ALqfw;l{Z$mq?%zz#aA}Akw`ZNrom%1bATyC zy)UOh8)rc^8`+5fGfPgCVkj9Z>{k>PRtwT7{GIQip)G+0lS(M76nB4>wPfoz_FE_m ze55*xB4mE@zOIBUItVR8-BnopV$Rc?8)|xw!qe|fLnwf3^d#}k07j>VVQaHYFKY(@ znw$k>^9aL8-XaM*nvsgBAS(9ZLdXLLbG)pT1;J5zA)y$C6%D5kHLuoPC3*yvxH!Kc zTgN?>7;JVfJEcc`Ndx0hGmfBFI=WJf{j#^$Q3yyL{#8~Tk!x*1n zg~wZT5{+s{8}}@KbLu8FU@HX&sp$p#Q(R2-_kh90hw3O%6O;&cT`>hzprlrQ)I;^Ln6hFej=^mIoxFv_V~iDc|jhtV=UA2OZzwSO1Y`Dtmz(Ktlx)xabX8s)sq4R zTX=4a7KtE@Xiw^{&E-9kJv^?%mPwg_Bh(b4jz1?p&;v~z^n-Y$iH+VMD;ASbJOhzQ z4caIaCo&{q#zf^_xhG0BGn|T(Tn*;#Yr(oXoT=^VkIF40OS+3|K^knT!MVBPJUElJ z$H68?5tm1ywITjQ$~^~N=-U!A8~t)cNog~to7eX=a3@7N&g3QLsea!yvXM}tv80}# z^AegkeiVi$p_vtN=2-mc1PC#jtb)pq)j|F?DI;I_<_db<4%2Fo2_tKQ=l{U;e>i)~ zpg6Z?Z5Vfl;4-*};4Xu^y9IX%?gV!k+})kv!Gb%%-Q696hnKzgIp;m!sprXC->Ip) zYTbXPW~zIwzSh;8PNoenKyMmy$ovhR-+5_*m!Dv(Gijrz0IuopV(5- z%V!EI;Z(`*EVqddKlov-?+7&^0EH*bAuY9ogoz8`eVVx6=cCT_JsbQ0>l+P(3I@D> z5rW#@11?XNtbqspB$4w*gQ){lGlX66q7;h2vA~IFp>h639|{q>yaHq$&g_8+!wUg= zwLt2Kg&-l~F8pj$HxwDeWK+==G@Of7a@`@;?ckP&;8T&DR}{o06UJQ-THkmeAyz=+p;Z*bR|}R{UeEaQv7m8ilzRd*g>yV$(V#a-)7|mange%lA~MkfME%0Ch7W*0 z^C!4r(L5zBw~d9xq&>ubA_DV`-WMRmL#HY5!X;%B7*%jdyqY0O(jkUyB7ZVdz9G}w z@7rM0MskFK+~AVjsE%rI7=y+%V6+Fo>bwaTShT0)yzqpcsPQ7lwANaX1Pb2-GVrSFQ({~kND{Rule8e3Spn*MA29H%GqKKnLgoxJ$H4(jljd5(rA~7V=4HDoqWvdPfHHGmYD6-6@;(=JnQN<|m771?m@I)pT_Wnp)KsJW0wAppFM{257t zU1hNq2>reL&iv8+I@hf%CND>4Jccl$j!X%SGk>XGdzNDg+jS{e4hbsz&}$9aQ4PA~ zNrH=*A#Kzvx@p<1q}cIXR*ggZ0=crdRFYkNfS|235kFsZ7EM^Q7lI6_|84vyD2uu! zB~~M#IVhOH#~$>1RU(pyo7YNQ0InEp$jW(onDqmrw_gXhrHqM){3n0Yx@9hK`mneX z3E(QFZ|H@oc;+uGYEWjF3<`lM4h#81aaDo5a|Ro)d~l<~d||+HnTP5Q*4lUAOARYP zO9A9!(;|c-aXAriny_zx66UEm$8~1G@%3*VVeqptuZ;JKMe}#a_3w@U@ejrqF|~V# zTQ;JWj;6-%g`^(;acxquwVqML^0ixG;}~sSZasGHbgoD@vl5`mx4|+oejt@MWVzh2 z^{Q$%Ig(V#`%MQuDAfJlFo`kIQO0h@q$=I}-hzLymznYMa(4#nH@H}2W=L*tzthvnkH z4$V=#*>{96SB+^Xd@ZgZOyd@)OH1!DZgg}^)WgB1!he*`Qbv>J>r$Lg7g_JKT6l#8nl>SXL_`Q_d5{_(r$_%``oAvCdzn(PuI+1s|NH7~Kk)KYrRW+p(csY!G-+67-`uD}mP-fdxw)|0>4j$xePlhkiPE)2sO4;>>ymaMQuA}UfJq{0 zO2pQke*9Fn30UKzmHDz$zpc8k=n{{7B;Po!%O2sEMF!dvt+TsrtOO{;^;|d?a`Ij) zn`j`dj|F9@#wZ)p86~ouRFL)9rq}bW-Cr;=8`os~nG`Dm%v{A7%w=;BhaWwr8%PYw# z^ax>P?x|Rzi(Vosaa+(){mSKx#)*y#It1_SUdgxCQ;wkRhx{=dNQIC2cggzIS%4BP zMe*>;+R<2sM;l3w{RNooH#YdpJ8x0sZs#%YG_sroS5AwBC_B-{GT? z-<}nt?}TlNSBxI2_YwCqQaI$%@Fs}V%9b71NFvL+8&oExka@Q(xApn5m_D(^secXT zzK934Tk{Kj8&Xm_HN;9$$m*W!=l2HYQ;s`_GvlKnzqY#zfJv&WsN!2vqPNTZ4~wz# zaxN{o->hQm%lMoUO$0{Rm7kQ@*^jfbzf#H<;^%$BcaX4@#ZBdi6PoVBQbwBpN^L@; zkgq?|rqW##9Lv(7lS#}fOyY4!v^0qit1_=D$FtPH60EM@oz2E5$DY^CJ*LPG3uOW- zN;1U$4tl_g3q`-0*1RIT7P-p%DSj$_1sz9XEmA-^U3rXh136zC_#Rpk9sGX>2a1wN z1SAf^XmuIU4E;jPF932#)^n4FwJMsn7qX9j{+rvQzU7L3H?+_n4gIfM6#n7l#OzEI z%>HM5`S0XhR??aMj5^jpPDY`ek!+r&yJ>;b9f8x>bgsegQmpr$SgJ>>Ctf)Rt2r0k4sVb56FN-X^L?Caty}M2=VeCewbre{ zmC#dBnK*rV?@pe@W`5}v=+x=@uXOGZtfgZmTlTVaMEH;~zrX)hY*tX-;K~p)7^z=R z?H#=1G|PJRnV^VQ5%LMnZEjuGNIK(BqFQoAL9tK+sQ8$A+hetctkJT;51v=TN3A#8 zjDE%mGk02n2+yxKN6;usI% z>!B@<<^quo<^n*2kk+bw$>Fb94HD)Y7QUCtqgRe#ySeu3CovG@3{OMf=Y=^C-8U2&D$s#4B2(y!ie zrD`B`RUbPff>RBf#WB>D>4WNKM{sjXNmB3zMcemqZGpY>j5rWQNWIHNE73Y?keN)L zkFKfH^{sYhXxO zwzSzM-e)8dZ$0>Uq`+0>fK|mnie5lY+<`pQPz%(fDttUbU?m-}&I+W8yG!gbPbS2I zK~VxF6$+eB0(h`X@*rJ<-cto2N_a;V`21iXMM4ym%kqd$bZycW%@(J7jrkZaWOF!x3u}|asE$ckN3`gK>!8@ z#u!H46~@&S21OjEddz4cVmEU-aTZG)28f(f*;gm}I_B-uJeH|yJx-Gwu=z5bzpILt z69+^p$L@pNj-Mst2f>KLjJMBXyk?HI-}YsSzLt+cBrv?Lz9h~P`XC`kAwd}MI%3>R z-@PW(DJRG*;^N`rrQ!uyNciya+m%~r zaEO#g&9yP&oexXi@Y8D#=fyym-^EA=D7vAT&;+vjT<_Cx6$=>FJ~D<=p#HAZUMqc7 z&vnm@N5vzIrf4_v*7^2gTTByYae%@G58sBhQKS7EJCf*K@3Fi+9`iE}g0FEj<+=Pl zn^oC;dfuRuBE7_Q#jRqG2r3G(J5A5sCkTby>l`om#8BEFhY7zOX=WgoZk?%+vPGx^ zC5qCDm0SV1f!j1|5F-JOdA|_1&FQ>Er{p6QE>rUta15f(b8on)?8d~+I{h57Stn4~ z6pZLtYcL9ikC%l}2hJ=~SUxFa2RHPZcsAFgcyD*4dg8Ob**JjTc%hg$yc6U5c0y6V z!xEgFUB61DtrWBMz2HuvoHZ;Gua*>4Sr1z(1&X%5h3yEYKRFHg-3+H zwuM*Rdfvo)oc!^}I7#ydPx)&<{CB21I?47gDYU`23|Qz{fTz0t|OO(fZ$K|9(TyD?xp{BPZtY7`mzL?;Yf`sUM|AN7_`0 zS&RENn#_-vBX-H%8D>E8xlSy46AapyZiq(ukay}hS)X-bHoxhi5sH@Hu(psuyI8%- zsyJ(AtWGa(^7Cv}=t=akzxu?A)mrkW%8Vv;PBr7;b{w0wY7#b^@p!aFokF!U`m1Au zD%CnRUJd%v0iWpd`Le_Ep!KGFj1b4rusRO`PJPfm>9ziKlk*S;uEY@Q$;`2$cSHui(PLZC zj#p&Vpk=bp&!C;xd3POxED7;7OBE6*Mn@qfC0ao@!j%E*!83-)DBcr;(J0aVHQ`N4cxnqBYOb4m3~JPV&WRZD+kS$F7+$&@pN zRfiyh7b8C4_Y*}ftJ-1WGKPGl{2)_$@Z1TVi(XY7)*+*DDR$Y(G;}|YIQHpxS`B0N z5$f_OK;xG#D=#P}m9AW4%f;5Mru2)Ch%o|*SN#5d_2ZGv6(nnEdl{D4jYjhfamDtS zaT`GAmXcuDt(_?NCpFw+5&$0fJRv`{X7o?K=EP3s(|N23SeBho;bO8o$ewKy zuHpOLeXNqk*hP3@Qhk=idVnn|xv4Sh ztv)6=K}*VG$0*K~fZnQ23cK&!H@idz7kzWAK@-emG3-EQDeB%YGo#~O3ah9ey>;L) zE(2r{fyMm*aHgRQEY=-JmhFJTAb_4eh*uc2(Er!so`&iSlI1v{9oUiuxQ-;9$x5uiDQyt^vhf5p`t5T z5Y3NItOm#AGn}xXwcVxLZPsQ?A?7d%8VbKur%>WGjnvZ{@z!R7=r!IG@s-Los^|j7 z?beaPYW~)W1V|(n9pU;Fj)yX|3`()ECQDrU4M&FbZCvBW@Fh`d)=DUdHLqpv#dYs>j<^cvPzj&B;aH?DAKFFFe`=E z*|tn58BJvv_wxgMNMn)xP~vNEE|v3Flj5p{H2&Y&8Ms~1SjBQ(Ob*ccZFn?=bblM6GhXA=Hc6)1Sbao2x8beI;m_&u)gfP-9Jf}DJI zEiKM{)@7QQUp#+p2+N_k4fiNo6_41Up;t6MXE|!jm5oK5-X>@0k~#iNd_U|aKN7ve z!sn_W?B?O`s+gfgD097cYK-KM)YzY}qnh1&ZHuCzqoJ+oJ4$x?4~8UeT>hOQ37$x7 z5`qSbeR9~7ewU+gHq3udmW$0onReT0Q*$kn%%F(-P;tIfBsc*a~?XYbw&-28p@Z{`Z2w@HLh>zXi(TAFKUo)cRitfCC44z zLHL5M_&A`14@0_eiBv?#j2bb8^s9DB0(|4c+G)&fz)wJ0u|HSR@{haFAG}-l?IA35 z?3%TBO>f_EMO0)uK!e5?t2tpphLImFrp54(kP9kBxxXFh6dn6LMdj~w27ccsh{7pH z;%b#Z|GwUXVcNJv(eEj*D_)T6j&+x@*V*Hq4SCwG^+?&YzfGl%;1FBf7_Fh-XW+h^8XJ%>spH$YU zbnmH9d0NGnO>+jzkXjM7+_Z56@o~FNcPpV6iu075GBQ;><+kaRE8G(MOR<#f#bq)`TM5Mza=!ulvc+qCs9teg~~A{ zeq`0={aV89iHK%4ab9t&cC(gYTFd}sKp8%6o&>FG6#?PaH6GluAl)9Xfb z-0Di~{K*VckKsD_aD%`wf3l|5ulsN9@_x#CM5&bML5@<+BGUk^2ehh|g)+-OF$-r^ zXTJ=B^OtqVDp=L$Q8%toI71{1o29fG-Ek{?BJNZ#VoRNycTE9lvhowBGHgdLju!XKMz4{E4$dNApHWd@}OBgTf z66BS$*Z-8}ChsC_&y`9m;TxFeLUy~(1qm?12h!uIoU^%(MV=^m7l0^`<;nr=jR@R(HtJveXWX219%rCA(jx&~zT=3fyJ{6na|pEUo*!T!Ij zs_ozYWiF$Wiw&eclx|te*haWV1%l=WV;l3N#CO5BWG1G^B*HiLrSA$ znHXkB7>?Jn48n=79ofvT%DK|Dln~4&oWSjew&O}x*Pmt7{~~+h9Ec-ZG2~bE$-<+T zQHL{{y=v${!GU2EKsPYY&2(+FKGrVg(QPQ&~_%;WOF6U94&JWc`eO&5+rHIe94q5_A}Q-jniE$dqHs^*JqBwVvlir z`bZDyiAeWD;E`G&?@^uIskJGiPcca>N%3dnY{#bsv$^X0Iz85h&lfw=$IDt2eH}!# zC(-xR>K0PAng%BqzFo45=(euoL4t9VQZLPg#d_OK_qwph^VY3pz3S1$Sl_a3la&iE zk%)W89ub@OQho5$>dv)sb=-nSP;5LKzOMetCIIT48zF&#Pq!15{naj{^qCk7?=bu~{tE^WB3=zm z9U8tfK`34tgoUII^iIMkJ2^m01coTGo`MT|i3DHJ1My8kN|Zw&{6Zy|G@Vo zBzj=F35b?bQX6@iB9KpfJQG&31Po6pfNc~okq9WT0-51a1g2A>f=az%A+mNus5(CyCOz_RH#+R>w5ZuZEW7{5}43|qnZ4)$1 z_CaERvxLePx5mvb^F;qq$}_G)@UJb za;GhFvQ892kjQyLn6StB>VB%Kppm>XvKF{oh;T&CC9IUb7$ev`0Zd(h5~)KsGlU!D|-)%`qjbC>|ZcC@oiY&KPDMWp=Df`y^C&UGC9=*S0 zgJXu7$TWBbQdIesUws&(A$35YbhbKFhQT{?QrzTQGA$fZ&)sB6Y85V0{{pX8r=e7g z$(PL;TaLIgs(uLh40;GOnQ}tld^ZiVv_JlIapoLXPM|$VX8YS9nWF0jr4< zVc4)9;^`gSfJY1Qc?h{z&c8gCN86}J?HvgZ{4qvR{}}}RcP=yO@3bzOkB&B7qw$3YDoCzLp z?mm!TqC{Y+ejyAQZip`pfQyi-`_jaFP~hQbDN^w%<}pEZU(B7Fj7caXnPT0Hvbp^T zQNX)4r&E>6Al0b4!yUUh0pAHvQq9m&Fy9fnID@mQx1OZFp4&=XP@ zVqWU7>uAO&oQxK>>DFsiRW+6pyyZ5RTi4#1%DeHz!dwd<^+#?*HV$mdx72>y>JiS) zyS`vVqLkbAhx74WBN+u6sUH$h`Gj^)vIIE>NhKNi)5)hPH61e<#6lr)VckShanQEn zxqeGR_^|a#D%kD*Am*wbFSGb_$Tpqh*16*f$=LF&aE;8NT{W*gbp(s8P8rtIXJqLW z>Mz^aF^WG)yyFMIKi*WR{%jk$zq&5|IYhEjY@IOQY37M0shMJ#CpZyW)!d?DaQs5( zr^-p#Z;AO>K!mUrXQ}35sns=ggn<0NKHE`D&I9*6fvje!@2wJkB+{=r<95sIt8ygE z!yO0NYfe8eR^Mm(3=6*fe&j@VnVR`@R*uenCkeX zwg*cRdYJI3?6JFqw3Vbd{bdsvCV;5o<9o@?i5mF!{VU&7KnBzI$A}DxRlfawYqJL` zQ3c^!+ptcRQjR1ki!x^NqMZ3gt+j^S^wfpqhKGFH!fnhD(|dYVc2kO(^bU(-ggeAo zSgPq(A_cso!sO}g<|vzcZ*Nl8ik&0vg;$YFRo057H#lPN4QvQ37R4%?k=iv&4aqe1 z(q$#N!=ple*zp!&Qm#E^C7SpeSaQq*=F?`pWK2^AOX8+P)A{SEzkta>C*5+V^Il~oZEbg^q^vk12aGnP$Y5OTV4rb8+ z)jZo8HBVa3ugn?u(!OQ*F$xNP;L#3PydSfzdm(atbb5L)?h7-NtKzo*g0R_F2Fz`I z5^_%8KqW8g0V2jIJtx42{T~^TT5Y zLbqeEGYS4!w;&`GSoWuQ|&W6)+H$VA9>y%?`Hu+F@J5e-52* zdsLFxj`uv-DGl*Bx^c74$jusCREb=&84!iXmiGI#75S*&qro4snF2nKyJ~k+;b8zmy)hFkNiq} zXy!$`SoY}{!n2pP@Hdua`Ev0UAh=bJLYCfx{Q%*qxV%@_g0OLF8RsV)oVZu^-8Y1F z^_w8)c= zrF$_cwFUeLD<21EVqSErsgvb-5%0B05v)N&%}455fTB+*TOC>aP8ARJa^A!UvuXa_}X}pF=LRVdAWHcuSN46b7s(kUbKF zu=1PHMj#$^3R>u?qY$J*c_^uFvu@bJ8RX1DZg|N8xcH<1Ts9_1ODrI^Vf`*-PYO8f zdEESv>o@V_BEZFnwMiSCBP@rTkC5jo{!vl@TO{DV5J1Z)OU#S|iz2C`_fpcWFoAzcf{xJCkE4Q>`;gD&)7JQNV>B%nOVpqcjoUZS9q+Q;`_ zu>t+95Wp)2A}Ini5t@|1U1Qq#{sKR81zxgO9%_5bGj3Nuia}fp2!LDIZP%Z+e?9s7 zR~TZ*;kaOZpMBu>N9of4$2Io)>LpXiNc2QmYIV~7QV%!P`|IAMbhQ3&s} zv+@Hq3pSp(^d7RYSAC0h;s}!)y=lQnZd%T9W5|hS$c_(#rvJ<(?ri+Q((jPb47s-9 z%hk(MAvYrX*f!m_Q$mKble+=lmAMTr*qWA!6IX-h@!LmrkB}?7>Fxb<^M}v^!1hxrICCRalt9R9DfO zJ!Jbal1=$cHNVs4M9}i7IN;3Ch2)muexQPnHmr4{3Mt*=;8RW<+i%^kn*C)<5131P zo9?Pz?Krxe+huBn?l^tCgZ4}fye%)fgU`bP2rgeqZG}?zYePZ6ul8}_Qqi7X)2t3;eNv#Opyy!# z2nzxx#){?9cv}l~sXQo%?nPwr9ZZI@;lEj;U48HsDz|dng}O4P=n;zR$rVJJwZKK{ z^Hs*OoRO=Nw!O`mvmk)nXI`B8;n7%Y3IjQ$#1|S$K{ZYKRVeOKD=NroYJ89!sYc-i z`Y$J6Y;dIVc*j}tf5gG`f5uw>*UA6!=*AQ;Z$h;XgA=rzdZ%(3qyYQEpEUhp5R4z@q!P-j!+t3Nq0+ZIl=9U|U} z;WSRA=-!$>A*7s}U-?B67uGl)kz%9PKcq)?%9nh19uPA>BGB~=5{vIIczkR8`f$XI z9b5lU9Qm<`y5-h{xle_mvwzzXd!p7oxxZPXY{&H@F~6{MLFNxlSsb)Ec*QAC?)t-oAk9D!XiDrOwp7EJ1fk(I6S38d)t7aQZaI35+ggzE()3)I1wc< z#c>`!(4*Z~fR~^&GehdSl&{zi!7E@Z9Z55r*@0I9TUnZp9-*K>(RvHlOABkTSgqaF zoM>1x2^liFqy4E}1vQktw@L4NE)_PswZm)@G`mwX2R|sxdO&kKS6EIaYBqbGcn7Pu zM_{o|_e{UFc@3MN-h~`14axfTo2C)AWFFbLWM2vI6Ypk(o(0Cdcwhqhv&&}?e1-Q; zcUdkq2HODNW|wBI8cziGQ=n4SAXlyejcT9;wWqP6kLp4X-y4v>oOZWv4E2zehN+FJ znwsq*F32pXv6cxNLA+&4o-17HW0;)fRSU5=;+m`h)@WqYzuyhhwnQkOXfV|Oty9Y)5QH0f-& zI}*&FsnFE)mNO3erGI7N$?t~^Bu9^48_!RqL8jBTcFmJOO-y=h{*@Ym#kjpDxBlrn3_Go=<_?5;_; z##m)^F?7i#{uqPa=fKrsm*>|ZhLfS5e(%So5t$}dr;FbgaP<+6^GRf~Jr0DO!a3jm4{{ds^8@EEP^^ z$qutuEMJO~vZ68rFj(b&I;W}QmS}R`7ys1M$G=hNhx|6|K6LD7%V6s$mw7;^C-sbY z#7Wm7pP}Z7YWuN}Q}v0_R?QMIa@10X^i{ry)3Qxkqt>FtmhNoxc%$ML_E@znkO%Q7 zmaaogkIqBO*(pQ+SZR2ItSi=s;kRfY9da$)beOafi|Vw6DrMGy8qXMILO+FE8Jip{ zo!)5d!VEIqnTZNXacpTrq-%vUYl^on&xpOfu|pIAiMa#ykF{QVg)e0}GSo*ZbZc@s zN|sD#Do0q&1Z27r^Cn5inpZbEA_gY9h@?(TUTxuppaVkGufYhs9eSO=fJ~0NtMVMW z9WVaB*IhT_`B@e2`M!3=q7zK)f&436z3x#_k$!o-t_AXja@xFKc|&X_;7+dtMZkl9 zo?N*-{BrdS_2K`$w*GUgnmEUeYxDlB1n~;F34J54F|n6BQW>SBqA2cLvUr_#>zePn zp|#2TYiaU%(@C6uvbdwxviXUA+q(UU-&*Iyyw|DgYm>OE4nDWp5ov`UIc@ta0Cn>S zZ$vEI;>RQ;KAhv1 z%PO;L%+{8QMYdAR<$MeAW!gn4_d6}(vns~0%A;Erx_j{Z4347@Ma{AKyeyIdV5-+` zAwn@pdD!gYKlGub`YoWTXzqXX>imIC!OY#2W#lGR7Nz0(Ej`NXwZNH}AXp%$O89eE zNZv+&a$d?ehr>M^5>IGUu#R{MKVME%2p_|E^>3XtQWaV?Qq$V=I5!WI$VgxvF?hLa zQQ#c{Qqh%6Qp%XtvEy@@h1l~1@v}S^w+Rg}j+aDSK1_PiFWh0LXzDfgj^Q^E#;Czs?2OP@7!7U zbaIgR2cW)04kw||gV2t@gI>H}VmQEF3Me2%lIZ`w{3@37gWK;id<60{J+j<)-1M)K z!0Lq1VqK_5oTr!fF2NNPhN?~5~Mz!m~> zK;}*baE>2@LWqQZEiQQrBTQ4gON0RhXkjfefJlCQghEfYXx`h>LdRktTG}DKmI%qe zmM3729guKeUoX2J#*+OS!T_97!1KI`5g~0+kTKZz_wH7~AMTqf(Hn853CsWU+kmD{GNv9X&W@&b=FS%Xpur@y4Haz-wBIrJ*Q^?1Xrd6| za<;n?biw6v`ASjUeG$tMrUOSJ`_lIC`w)07g$eDqlwT!Fn0$@`nc0UMW@NLUV{bnn zs!Xr#%zw?3)Pd+6fBF5oy>93Ge7@fCoObHsza+d?J8jme zKPAWi+VEs?{z=dJ#URzPV7?pR>Q@-Sa12sS)bhSnl}h#F);T-Jt*d$w`~F(jiE80+>O+>0Vb#+X z)aYM2B-KI986Ge|j9(}Z49Ej;^1hQD94shaQJgE0l zkl}x<3#$wJmfAy&Zx&~kQWydd#;4K@LeFncx--{wv<5^A>G5$`1T4{v`+ zEA!sKmX9Gz|HkDaE_&}SpxI$>KlxBBjA@Rs>O2K4NUkV6HM5BESOGtRo z1$;E_GY&}Y3+q?YiVK_q#p`W;xCh43p9j%ttVXK*NEL0Tx)Lm*I~uXItNd;yagEyI zdy&UJ0~|G^#(c=PuWjSxn&ae};ar>{$UG;=JR>+gL)JgUJk5Li#?AX+e!bs0);pan%^%vm(UMx8&v{ z;ygNrlc%U@SJR~4kyiJ_RtP{ns0Rctc*9+Dl^A3Lr8lHlL{(yrj+^#&kyj>jw2O|A zI}~*}ZP%R3gChj&)$7c@8-2*qqSNY3F|$~yv|TO3o*!d@)G<>0X>y=KKa3=D+HHv2 zkrATDPLE`~HI#?22Q7@tqnvC!AH+al&2dH(!2Aj#MVGh5%?Pn0kk_ARF(u26CM=c! zsEy&d&eP~*w*F+|74P0%6kOe`+tVlbv57kg_xN zoQD)X5n86pd)oGnec$yceuQRN6fa^~Ic7gMFKS&^XA0c_DpV|FW@Qv^IN`jq4mtVg zG72#dk;hzq1Iv2#?n?AJy6`iD3c*Z7R@o(SAvlGM@eXbf!|V0q8fGTRLN%=Q^-X_x zsKy5skZe67c*xvZ2z-rKuX05Y;iCM4PhOR|g-tOnO`ZSEpUAx+?_P2Jea00$H0`hW z{er?&r#p-Rya_nL7Xmkmt;$mTJoy5+g}Wmx4|9cEqQnK*LSzo9o7tn6Fo1T-uS`k) z%w2Ntvc+{ZT6BE(@ZXvi#}TX4n1*kN?$5hb<``b@ZFC=BD!^S}C4MM|Q!L*`T%(f_ z7xBrSiA(N%4~ew1A}&zFmhSIBqtks0`t0AQIf1&3yTd8P^2#>uuoXVqM!)DEt~XQx zE*I}M`3w7u>;%M5c5>@othy}jWu~?+ZobdBm@yDNU%VpzEz*&MwtV~xL;{)oE6iUs z&OE`aIPd$mH2CAJ)<0<@{Ie}Z>}|g|nmYZpFJ(<#|0{u}y5hK^ils-LOu2+!Z8gn? zET7?J(;N+N`JFPTC1xgd#P!>$A}T6gzgi$m-Rc!3D&GyfHw@}5^hj6Y5$ju5&8JhJ zO4oP}CLpR;R^z?Ev+K{Pjkn)dIDRf{#)@BZ2pmG==;s)~v*cipQ!)g&_) z(G{w``OB#jhmgB7;d$N5^MGsNoX_<&lK^SCLpN{6ciF{@zXntDJp9BS&Z5nuO}~LQ zolb)tJQxRJXK!1+Oi2Kjxly?)=?0tem-PMpq8$AJNzzDkolq1Vmxbn?wm#qq-$xz* zkly{?lGBVYrekon5~)#|&GozM48F32_070V8PL{6If}SClIwHmdh#<*0bg#QN&tOP zN@wtAc*0HACXM-h8TsW4~e`N(2ub`x+V!CG0lv$GPHvPA1-sCzA}2Lwl_9erS*sv)6AZVk~F2 zbAwq+ZaZ;c)mV4c+Cze|yYBd5nhP%7=J|~QX8tnTKlW-!2u4fa$7qws4mZ`5dC(}k zA0ko=TZSQ7tFl&d2ZleSeta6)<}u4JB3sg29y#CB{j}+6c5!WnmFYpgrrBYgk&7Vd zmt3}+dfMw5yJs@%t;naQ8izZuEt@bW(*Hx*Hw6h6ZCR#m+qP}nW~FW0sJO2(%7@*tg;@YYibq;!SHuEL8!9UX(9fGZwt2#eR9*Gx9dzQg_cOV9bhjpu`pm;#z- zOmiEbpMAV?c?a?7eZ8P|buZls4}eke_d5c^165I(H4Y|WeH&^P?h*CbP>Oil&P2g7 zsZ>t!Kwf-P!hA0Kaay(UK-#A%UxNEhlB74d2Bo&^xgs*IaMDTBG*o3dc9_?fpgGb%yp_`cvenP!N#h^$ZZ+Zbd+N3$gneM zyWL9pPH&LUeoC%&7_o3)gtLz8bG^ts>J10&3sQAWt#BJ&N^zOfGNUSI)40vpdFs47 za1AG^>|9^H+BA$vqTH-n3tL6BL&D6oh$Y*7d8W!R+qq1vaHB#?GZPt1ZkWai4%Xl+ zScGL$D2LEN3=bBX!rUEO6qc~7U{AHHWDi%zAUr3u;j5bSu6+xK&7ZL8VABappYwq@ zI*}GvHRF{V6R~4Swh_S(c6yjLo>ZMy4`3&@87pCHRq`Zv3s6yuM+lA zBlHUue+zHPwvkR)(3>2CX(fu%iT0)UjM@(3_49c!3}xmhC2BMO=#g~ePz#vhFp{0` z^}359?Gsr=q?zY{zabfOHd22?AUvuN@k>-%HEeNnFI= z#zN4FCafIgeL!r_!P|o$72c3ME$;a71!&#rUkY-M6q_ZHLYDXoXpErbhdLxYZ7^!lp@46RP-2geujrYBY0&f%L{Ds1NqfH%k!sDB_QI7dyw z?;&p&T|Pjp&~H+v)>3U+Jl`Bj^S(s=-VE9)Yx7KF!wcla&}-H|P0zbQVf9JDI>%*u z!P-WC^6{psN!s>p+TMov`sbKHHtXzR=_hZ@{Z%>^53NmhbO@x7qIJ&5fSi-kvXjy1-IG2@Qq%aBwCv6CM@BekAseK!@Z&E;AbH zv|YYxf{{;RP={-EV`GdW!}2sU4Z60JQtp;cJFb$ie!eM|M^md=N9V~aHg3=D>ed~6 zPuEEw3lH$>ZknJc)Aywq#c|YD$0OR%iy-^b3~IZR->6&^slVwlKH9tb31(HDLRLQX z->z<9gTzY~o4H`9$N%^hNoS&%VNkEus9v(URl5#vx}1ujxk%q&v?PRtdKjO_oLygp zu9V!b{khF92vPg#6HGUbVc&E~R;;ynT+4xFTTDA!T4&R5Ep zVVT_v_TWreqlhaE0y8n#9Yiq2=;8Vi%D8D$hlUc$0|2EvVJolWcbEE;ZMaNJ6T8nz z^{O(qBo<-A=UAbvWgIX8UL$&9|N3OTkFnsVrXdNng;FxeAZL)y;x~goVfHY;@FNyj z39wNZGToWk7tYT1k;^TWHQj;+FiT|JboTX1s&Sj`q1i@qTt(2-#)ank4ryy-af;r) z;GZ#FJD#N>XL%{u=U%qQ#j-&7QSA^c6*PRKOh5_&l_dZW1DOK?4gf`gfnp@~BHurs za#u<6MqxAyz#9~zT^dYr0CImd27&+y$)=_7$U z_Ge!?^CQOlU-zFJ|JQd=$-vgw&PLG4=%?8I2XF2laIt@(#s23y-e#rd4=lBe#~rQ< zwh(A&84XAvah!}KTNa^jM-rEG$BZ*B*%y_bccj>$nP1Y~rY)iH+i>$Z@AIb9%mdHK z=F@ZTO)tPyVOnq$B`!Q;HBq6Vm^fC7242KiRVX2>6PL|Ni2mF!OAUmLQ7SadLn({D zoWl8+-1$fCzS&-zZ>K%UscN|>TXN;Gekgk3^jht!Gq&g#+ZsGYi_!% z*c>`)25o8F#N+ zgSQaRV2B+on1Un*Al{Xm!tnGfhqiy4F*C%Nf!P|4_o2ct*9o|{!och?4GP@$`%}7> zKV;9RT6)QT4_LRjKI3v1!J&DUb{yZSSy5gWa>Poxq_=fWEvcEFiAyiWQq@L5SpaA% zYrsJ4_06SWfW1N`wEecq>yLK}t8#xds-wr?2yvFc8^oxNpdeHH;vnmI1sy;x?VvpA z732)@#&CE%)-PQ;HQo!|E#a7sQVXaP#B3NFlb7`tCF1|YJfFuD`(02#7a-^v4M8o; z7~sx*E`BK@j%0zZ>K0*v^xW}A(-5dR?icu0+vFU}QVd=CBa`eLN$pIP(~ckKCL_y~ zsGpzvi@_0gtqY}{@`(I(ff1~d`<_v03AwJYG2aDCA)H!pT6$8b7t1v$7|5Z*L+pQSC|nqBO`rp&q{5Tq(HJ7}CDL6|l2V+p@jq0VkQlLGb3YYF zoTT}0(F!|dXU@(%u79vAo;S5SJH9|^!laOZvBo?jQQ=kLgMaMh`-+-Fp*!G-5%-9*q-zr#*$H2{S7x7Is$SGa-!&* zm@!uFV&+7;_bYtZQGq5>P`8Cqf(~LRGEB&ZW->-Gz~tD4%BcRb~~~hhezq zgi58TQxJ*46QGrl$Ha4dOu8aIw>$GdFv1fOia)7@OGn=}-{A`J(vHLs;u2zlH6Va} z8srTP{vv<@LpER_`O2eME*{iI?>J@uu~rA0@+^oXe1N#TU4Sr*59NW%&mC#5?8Q`4cJsy*3-$e;+CT@p}JwM>zklw_wK(Nf64s1#J5$8nQ&bRPVhN*dXUC4=u>9Meo5ua9k{A$4l=a?1N* z`ucKKU*8Xaq5vf%YLqI6pzxQbpj=2OEFl}QhQfF|B~gwT0yWVxmMy%LF*NrK?2-uk1U=d8LyuR^oBD*+XuWV9#p|5eMJ~r>QA$j5Cw2 z{OZcy%M4s_ui<%x5|{=M%bhPB?!QEAr!k+XS5A6_ja3G5J#iatA(yHBhL1!cVIdin zC$U--6zZnyT(+dJ5-2R&f;zF#5Ec={qYNB605gVSuDAll$hhY>4LZ$Sy$dqlzZ(o4 z$p`}T>GWN87EvaafOz4fx06(4Axi+x+UDw29bgXQ5r?5{{cB>Yz>9{J#DC>7x&fXc zYr?cjgaYd)>?cY@A4sP`yDkN1y$8;L8YA+vqyB6I-jPE#G@w6zz&M~nfJi?62^$*R z;xCW*XHeIW=WX~yRm4KhE2ARkf5J6h?c%f{MY+TeVdnc3j{4HzeaNM;<}q3h5s#yp z>lUS_C5;}#B*5PgQ-JnahQ;RE-g$NGRp&M<)dx60^Femn@Atsm+7^JD` z`#DjJq0~$xn8zkE3|;g_3Hek;zxOJlEJ8D)Fhi}7@E{PRj}pWbnzigeC_rZ$eU_TF zXgf)N2|i!Cj<|G%9%-e!%{(obnr_&!d3P>N@IdyUWacc|zBN_}sR^+3c4#e1E&Y}} zqSC7Gs==M(W38=}|Ld(=-Wh^5tBk`gJZ zgivW-?5%hp3Ak|SspmJLvZ9yOXLeY9{8g`>r3!AQ5 zqRaj@8GyFjPRp)3%E}`;YW}I*m(3+mEy%Ocw*4aIrVdUJd%m&7I)!^V&~%bh<(Fn( zIzIzIqBhzi=mr4iyt*ks3YG|&gcAHBs-ff)fQeX0j_gbe)$SgZV zTcHsuzYq6~sbdB6-t-EvfEUl<9qNj3Mnq&iIu-U&;{hV5gRsW1cVIG7i&yBB$@sy}>Xq4Eq~M>1Hv>v_~$6VwM&g0BLbsT?(yo zx|ZbsD!XXwzayJ@cqs4+rx8;_>isG6!68uJOKWa^BI@zql|=tb)un4l%#nN2k z$19m4u?0IYi?jthXyfb@*=it3WUVp^N>$bvP>3bmK%k6K3ac^%J@pCvmXl;b*UQce znKKN@mI7PIDjo0T@>x3KY0idObs3`$1H02`EkPU0;I&$efI_AVC@ZN&arc6qfLykR zm{d1u%72$1f}T@QddkgDl^28}46wL5n&^(op*plB=UE4)BvEljKI?rVwM}?b?P#M%BEA>)lj_^bX92G4rf)-O?n38UdiUR>-qNz z)8+-0mg-Ct5>iJGKM&6`3Xo?ccd}8Zw(L`BZ668cT{+CEtm*m7zF2CiDiVR3{Jl`c z)l!!63Kcs5|C)Uah8Z2KcfWwckOLYrv;k9el*u<{u@<|FsboR4ru`F32E&+zIM{p@ zDer{h%d5)YN?c89El<~JXV1K@w48!Iat1JCaf0v|IDCNNjPaNL?{KbPm~O}(l~Hc0 zQ8lS5H>23}=v@j^gRV6zlPXBF0ZZaR^)tOyd$pIBho12$gu0@ex&}sMt@+v z0&gWxz*7USHcjD!4%44MqFh5XNVvs_5pwkyMX99glZN=+MDq-|kPEsIe0j(~R}}&B zRwV@&M@XSF1}Ue)TqN^?X!!LUGQvo>dBGyj6m;{xXwMe0BJ}kV3y1+o-`!;tlC)nR z=b;J0+6lBVn6}3$8x(W#YOz1Im-`(xV;)}w<-e7LQX8bpRk$*T<+u{lXY+iV9-J(A zOcxTB(JkP6JU8y9txMTzP}FQT5vAeRv8L-;EG;cm))pvwiWNPj3&&FMS{?x)H!Xhv z#?gY%b3ckhB)fha$QMgSafnES&x!EY!uGy6@=AYAJd^c;&`w>r47lI2Kim_|xg72& zBRY?uA|gr;q4_^T!H_i~x)14ZXO4rQK5?Mm>3P4#zaO1)h5(&=*)!yS~5gM?DYmEdlK&DXo7Us+>Hi5Q7jR8!6AAVPk z=0HkD6g~(hi15U6qjEw+%QbM{F}tWy7$UPJm261;B>{EN<3eN?vs+Fs-JqQ1=r-`` z29PF;=(j@m;??+(t65~p$_XuGMgf(g4M|HBiXw|+YrQH0?iMOQ_4L;z3x?Vcram+x zBonz^8Mw>?IP?I?6eKpAKju_%!dq-nNFDUYt%=31WeKfZPC@Hxe?j!h&`sNI z!&1AmxW*j8p;}bpg`MPtm-RyP7@#gUT+jCctNNdRM;*V^tr#bwmBA#Eu zXs*lsycO4H$XCT8?jt*{kKf8EKG$cWUg{_|m&d8>nQx`PZDA{PS!&Gq0Y9s!c*joi zXs!2#FS42ag$=>d<&q1S4^94>sSw7S;6b~F7P9f3NIt)0X{mdIcMefvcZ2nBo)SwQ+0qam-BOZVDr8d#WxiME$rBk( zKIxM+9`RCej~bd>@*(*|@rbaKMtz86uJJc=d92nWF~F{HAT<&D{JuBEn9M z1LiI76uD;a76dIKnckIYR3ZEF%+&T*oHPBJhxRTZt>pW%gzAdoW+gmUuG;-2JkNj? zh?Qop+M@^KJh``J3!U0US6hEv_ipE0`Yr6>Rt`$P{LI$KC%OfWyv5-zVZMx`d7|7B9<5<>8?06<9An2DSg{pRtto`Xs*bvJ z3V6^#n*fD8oX<$N6t@Y5S2eF0rKwo3{kyGr4QS=<7E7|iEtsaX`sw;#15u30hj|9m z;iJiCjIsd^;zX@Oxw7&wopUd%ix9qa>#=Y2sN-_(;6-i8|g1yZ0JXTn>Lkr z*VmlKq;-B>I`u$-1JhYJ-n7}h5#x%{S7{^5po6A9>L+l_%P6aeLbER&5>5n7lnBrh zty^ajP2hxmn8G*h#5v)h8OX`Bw3UGxX!XxwF~5P^Rg@V$pVG-p9#(O$P9821ncJ$$ zEzTU{aFFZ3_AP@g{3N$#`f3C`)QK>tYN1Dv+aGbGMb`~YdGva=ZL1;y;Nr7dB-c2F z6Od)KyBfKWY++j{tx(y+hzuG@tymW=1~)^;7b}cIZ)HMKe)UVVk45&^Ypl&Bhr5zu zAu}@1jW2ZRI3F`mu)^tpX?a$fKo8%w1(X2H&Ra(_ zCr1zQ)je-p>!MxCR%TgT*UdvPK3|xvQ>~FLCzniSRsqb3J zfMjqlgBC!IVBP#_6F!I&Yc+=8iP3Pgf4?bhOyPo0N<3O-tMn*zJ9nBYLtHxOrKqO-Z z!VCyL8~@%hj0OSTs1Sk7An2R{S#LwzMuair_&bzT)qHkcj3o}B3R2Ogi7YqNk^Xc% z;Z~?H$Z$BR^reQ_ha9yr76hSv6>dnXP{Jup<)vzg7NtXBMTK1V8dDPtc@k7iPV~Uy z7P5PkNn9VJ8lQIWLejKH5~Tx{-HV1uXBuc|pGrA&&It5{94|sZ;^prrqsfgWj&Ip3 zsnh}joWHBb%&oV>fs+Uet+5(*gx^k@m@g@3mn*hpDR=4aJC+w$&4W z)vtQ9rk5|bqg)sqSSs+%YRX;*iNx`8D2Ql!Q_tOmnC*_5%A%oTu-vX0(-Fm!VJ?;z{K{w1@iiKa(OYN2*?n@U zx-cD42Vhsl-wda~kAgvT`O>g*w{+2N*j-_ru-lUuUJ1SstWiV|Rv&;t{9~yY-jw=e zow~Mj#E)hD`1?L!`u*xy-l+P~9dwJpusxx*tfvm11G^XQz5Oc>VX!>`b}Xlwo-=u! zr?%1jhPUFcMqqwfc1))TTSm9!FIpn=P4^k=M)6xpYuF!>Unp|ugF=95MK@R<7HiJ{ zc#kZfBfCGEh|C|F(ROSvPTrCIxhLANUx6~+(RS=FaD3+W^g9*`__&NOkwj~$FH$Ar z=?Nw%wgpl2*xu+nv==>wx9YD5Xv`p-Q~HZ9dO%9*vC3z(?jK&1Kw z+)!S;GdsVyTFEwXF4VAJ1WI@p_O0NDd?Lc_!p>j#r{D5vg&O#7J09z`2{hqDxq(6yYq4b_8s(XaeMI*+Hdze zwr3b$m<{Lb6B+2<9>%{>!nNGrn(0HPkHrha1CM;`5wBT6UVxTX4)+O*>7$Bc6fw?X zd3+KX#}({6rQADMGx{t`r`;LkITtw|B|gnfM5y1C^HQBn+cA1}sr_<@lUdetW_L;H z1|~pIaYBp*pv%Eg6i1rEzw&pc#TEthwGL026|4k}x~gdv;wWFqN5X3}r^jRsXxvEk zTffx7fz&a47e5V(s#H%k^Pr6qPyo|R+5xyuL=`I8W|S+a3T@25L3FKmDF_GY3& zumU9Kz`2po_(wk|*DhfB_mQA}w#hnx!2L^|pQ3@leAnB0iSkSCT-mWJbpiKLN{8QPhmks>(n_#YPt;}hH00Pq{63#u8Db@AK4U*0AR zV4b4IgMxjD`YyqcUZh#tgPkpEpZ>qLJjYxTB#?oAX&DP2B|XR?Y&TpF{1}rXd>Sd4cuP*kRy*bc%r%x)AA?IK8VMD2^J^yWm7Vdho(ieOITC%E zjW9%@<~Alfs~&u*W?G^2Smii(qiP(M66bqlZE67mj*bw3nYKiZL4`0O@V#bmPnbFg z&m`Nl6W5B=Tyfy^GsN}2V2tYC~7_T0&|NLtu!f&~#fznzRFWhtTxjhUFg-yy&QSkb?n_xC_cS>a;{!o=Cg z(7P;xnW11P@de42Q5#J68&0*5QbdD}3A9|lzl$%SY&5@`X){nQI_n^`3_VVFR7HJR z)efc5wsu<~o7*n?5~x(+UQL|_EUfPLP8R0HkcvocDIB4ZOVwIJodR4RL|Xxda|M;x zBl?V0b%vCt()e|`PP?O*tj{9YAC~Q@^A@ha-?X~r9aWuTI5R6vWX8&r%X&(J*7?S?v~9*T|u#BO1H*HK;1h1wKv@Rp3t{J zX);+VYiGeo#b*%2r{qIwk^AlBsOlR;Kc5IrcX)m&HHgT$|ub^ONV5%FF6rjW;P%_r$b-yWayS~006$$`}hvE7^zbuK;65lyy; z)EU(iT^r@pvP10ibA_atxiaN4yHu;etH)9|QWv)g-)1n!g;lp!%{R@q59c=7jot!- zluNCHKyrro@SZE7$Y)D;?=h8*0$FbhwWjcJZNE45KA}jvHjs~riltXQam|QoQ*Y%{ zCH&y`=tX<(2or9ennkqH8yTwV=@&`#GyUzkiI0koqQdb~A`77;a`zizhO__idv_lD zE5PfA-qytvntL-J*Aat9H|Q@)NoBaW%IBBt@_we;#@Lc4yziowPm1Y>jzpH~RJq~p zm#klYSg0K<#P3<>e|Zj<5?BgTyLJ~XF`3pb;uW8Tp9REE=2rU7oIRuPO7Zu*!*fc| z?|jqsiun(&6k66mq!Erg&UB~>P+6iY7#gv7S)Bo^3nI-~uZmbvN}KB@J?89ieS*)= zoc;*3Dk0+*M6a45yH)^w%C6@B-Y%J*Xi?PgA~)X*M+MDW7Qru$jfY#$EsR~1U3Eg_ zmCDVNAJD5)g908sRerQE*)p2*j2-A>e1j=FtXwubGqu+jsr8?s?VDxs4CRYOr3-=1 z<*md=7rIhYXf)mWt*I|S&%p(^>>T}M?wl#sYIV4H3KtDmAs;JN$$C!enc8Bh65QWf zRwh??Hd=m55?O+Lu;-h3uU7ercZP52>&dhQS%b6t5cx>@$}RE6^wk@AJ)-P=#W_Z) zrR9|5t&R3LKLu5~at7XGmP}^hia#y6pi|4t4|&T0zi1&z1z428()$SUO08p}r=Gx2 zKL!7iIsk}P)a``FL82jE`n;&p5ofyKnjsHJRciWT2~At7_A5_T(>Z!rctXi4NmR3W zsKBFQ$*!Drq6JPtuZCe4q}%Wf%4ezNhX&n5lbpgY@9SQ7cua4k3Mj@kffmjp$@K}) z4PSeY$MsD?yQ#D;eiH!SCfdi`l2v@PC8SJf^CjXwOjPSs;A)b97Fqjq9jagE)AyP2 zI+KqSrC493SUu{bS^N01m*>F%x^^_>)T^8Wiy=TF3cd}giZKE;vQiX*tXvILQ6?_H zZl9@=bpih7h&i1yY>HfVCtMf51Nej|DH(}NMdMPkx)%LeHKI|HAjl%`U0I#; z0rCOLWJz-*KQQa)0h?tRAwW1HG zN)=j|+VfmYg239r z$eV3|@j*in&c))T5GoBJ@q}=YKf>AeAKn*#=TR+I+xGWc_aLUC<+f`RnOO89dFurb zOvTHyaHr*#Il(EqV>YpW1>s`HC_66(x?ol~a!JO`mpUvVQT1phR-yIxOCp<2f;*&_ zK@zBCsXu@D%X}kuc1?p7bn-Xu8%)BTI2k~(cy5}>{DkMU7!hM5)PDW9KUH`K2;jY= z#AfZH4NGPZsM`|50ZK77`>9SD%Nde^GS*Hi)Y?0W?ZfTO(WA{9+@D7M;xitvufOH5 zNJ*ldiJ;XTz!wR~WCcCVl10G2!qBuMkY3pp~D$1gFkg8{42@LyGTRf-Mu8 z&MB(5iE>{}7FNWq;EGX{%hd3KJv|9mQK^&6qTj!wPIzgM5pt>w7N!T%%LAU%jWzq_=Fn;YJ{rq6uM>OA55S&%=o8 z>eR9|%pg#l>5qQedbh$}wCd#j9t(a5r_#tlIJ4SBo6sxUyn$qLaRL?YYR3lvrXKit zVTqnao*C!*+`ZVWEc*s;W5|vlfcy?-m#BO$c`+1 z`+)t|cM`0c;DbnQ&<;C7;dU@=%--BRUBgGOIWDu!p?60(u5m-6&}9L~{Vw>bY-)X2 z%>htH1oW9Q51lHgwMfJ#@#!XPt#;Mi6<{~?>F8Y3VQo$luIDMaE6Y`VVR;h`x5Ols zze|+F9~aZ4Zr*YTY8H|Ktw!5nn)(H6M@s6gCpZhL-8V%0onjL#-jK&9G!Mt&t=#=r z=C}5%RrrnM(}Y4}+dc0rKP_q;@p9ShlA*OD|0TUW9;tp>`@(GTGT^_K5MZi5h(TPS zlJLxX5GHq`>0L>dF!Dtqkj2Ke%=qQhqCX8Js7NVAGoaE*O!t6eOz+klL0$H7`hk-n z3V)w>NzyHR#{K6Mp{e8-?Jkk8e5;f+^PIg&BNL&Cl zbtTtb%B%(C_ACzf&Qu0^2puQv00F3jc!HK89iMW-n}v)^}&!OYL)NR8BTd)%?+X|sOp(REao7={6H1tn>B3{}bS??hvuu-{;WsA-Cp2hc`*d_~T z!dY(S&WvO=k=ysz+;qF11K!-{m*Y=6U0-m4MlKWqe7(xPPj_8BJCK(bApkqW0-(e; zls>Yq;yp(IU!C~Tjr*5^OHXqDWOsJ|#+L+dUrjuI^uETI-!vaxJida1UcTO{F&~Bi zOD`Fh9{PB_B(eH%yXv=<4R>;am;|Hz4FSs8yp*zsOczyZ( z$?w1cc>?%Rj{QiIzBKs0MFv-Z&HHjKUzqbBPO!d&(7u&UKa;0En(_UR`*!wkK3=?D zzrbO?G5YxTa#=qjt>4rMAM6J1c0OO=J-$ovzmG=QgOB{)@Av_`2#{D> zzeiQ~9Aw9QCSxyrL2Iaw)J*_YYj{xIH9c657L!VL`H|(_N<*W92Qq4k3__9b4kOHo zu#P{L!v>8SQ26#QEfh7=k4)=gne^{3U%E4~ zAxy_~l%Hjf7sXr1i!^Em<;Je~n&lr)^$v+8UN#y?BP}2sEGHvWnj8Q_<+vgh19t37 z7Lv2GnHz%@1VPTIxD*@C4*}21==5Yu#&RN+eq@@RaQ=`c=F`?3);+HxCg(3HqMJCh zCK%$iQ}yyoG=}b+^`>mtsdr`q0#bB~IA+r_)L*PA*@u<)+?leOB}c?L17~~!7%G1-G7t;SkM8!{sdSwf`{VtO>(TZt_AV$xk zOektfw58!8wrnFP8R%%I7-TNblEms(bP`cu7Dm-#wa7{!=5@x+PoYcE&)+j`GO<@) z&2QPftrJ?CXS2kceTt2REkU}&P~@q|i$N)Bz-{kK`Mo~LE;)6>URXbWZN3gDlXu`e zC6Rfj!ci0dJ17_zgOTWfuw9hQTUVgcM$+3l0X|GWhJM6%a*w`rl*jNwh zq=xI>_I!Z(aj*fE%0^QH2^k|M+PAW7ZTz^zSe1QxKKW8^WVAE(v4mxraLO=_rnV|) zN%?DrR$iUN<#rC1G*@&fYxy7y^4?$50)Xv7!6W*ihK0SGbON2RJ{*+0ZI9 zvJ&@G+rri*YHy{xRb&a;0&qPdF`FgvAFeEF)?xnxmS3b@*&J-huGalLU5X)z~gBU0H_2q~2QS zRv$`KD-q%za1kS}mWByQpky{So0wC; zTZoUl)gxDmTT^z|8ZEsoh=D&K&d{o@gguATU8+EpIk3Gwvn-@oLXszefkHsa3r+wL z9>a;q$QN|PoDPMURj^D`&T2u@XWZdZY|vvhuTWH%rK+l%njX}}qrfj#%KT%hYoj>b zv0icgXNj$T(-qbDR94gN7fB))sf)fk_a9wRY0$(|Dk8F~tZQW4+&(A6NHpCm6*uNQ zQ;iq{W0F#oh{n?j-Hs0Nt78*mOZND2V+1C-(MB@Ju(UeTZ{-WM;o!C&j!*FiR306b zS=ObRN-tG#?iB1lz`9q8u!d+*-Rf6H*BMB{mO>QAC?Ro#9_nVYwt3fTNO0MPDRsD| z3@E?N+R0Ne<(a##NY_b4@3=2DGioTEMe5M7q%bujMcGp2N|}zQvSIVh*+|%-2s2Br z5{lM~DnHNpLbjNVrx-hw0n#l~c&ucsv>lzBV2@>0%TAU}%y^VRct94|2@R~>Y>YTqf&+`o5;CBwIgI{gvG$jp2tMv-*cgd%?;M?v6UCQCAih$UwMw-4hnR)2pnYHmk zr`&3yFC$MhI;1P?2NMeI-OBI1k=ZXbO}IHebA@GjE(rR3a`%Khs+%7FGD99sxf5-s zH*xzwEzCeiVajIkH2#t|Qy;ziirHT7Sq=aWF4~cRGbui9jG$B9iPi9?sH4x2bE*|O z$XW*|l^GwNl37y*QLq{JH6T>x>Ccg3a9g|1PG!}(l9cSni@WC2KCP$7OJ*rAw6jhM zNY5rKS6;9qu`owd)}rGai~p#VC`CRPZY2-lwkuF~a`R1A@m|-Z6OcEN86|#@Ynw(m zR2LtA$L=iEsx;7JjRdoCP(C~n^W&L}^=+4Nx7y$u?!_A~x*w0kxY6BKPH&^!!tCYd zt_EXG#WP&yPMU~1riT(9aO`!_Y<_>3F#z;1OF18cQF9~2kS=N)xFG%t* zxoJz8q&rE#*ZIXcU~kCha^0Lzy``qQJacM_K05`EgtP2ZUJT+GGXu4AwnCMg-jJ=N z%sm-n(IrZBUqiJ?t=o$qY9$>{!RppzC8z4kR{r^?%Vtw(*bok$tT<+)CVIWiKB@Nf*US% zw6W#JQ^{1GF5X-g&fyPZ3fpM)H=$EI+8RG@)w`rsAdB17l}0&?soPmf9Ogl=1J@>P zc92TSL}GiA1;B)RlBIY3Mo2d z&xvsT3Gc)Sqc86OE?y7y1r~Y!`T35BrtV-Sg4ok7>BZ1 z?x2G=`mgBV*aoqI@+mA)MhPy)7#FiEj?kBzp)Y z??4meyS(tTR?)SC?0{E1DY^mQwe zg*ODJbwHOR2t?7kC2`#ow};mgpza)G^M=E92ll!}d(vFyGu1Bpbv4PuX{hDwWW)f>rE*#3%IxW|yeh<8}ZebGYmFdeU%^D^8>TT4PwQ<$(%} zrAAi)vzt_0I$&{s@Hu~{k9^{-<5A@c)GE&7UBeOfS5SW2W)hbeoY%Hjlt;bpo?)v| zO3ou_8*`&ubfa4^b}D$rsCmPovR#I!s@^T)q9jXEybov#r3QS`9>5^Om)xKuRlp~l z4x`_o!T|)o7|ZZbw*?E7nBO#AT$7m5CY=?@Db?vj{B|oP-ff@H8(v&56%*en-GOkT zmZ-{LQI+M+Lp&bUqt=b+F6@Q02YSKRsuO#gxMh2u57_RN8n(wY(0YsdM-4KLM=nND z34e$PY*AP(P74I;9-LNFlNxg3rto1>2MJ6UNiFY^3eEDxcbK*-kK6YXYz^WZtoBzo zho$h4Iz3<4!7ZEJT4WpTDYWNA>Ku7e0J;=o3R=tg<{jym)iILWPyb^&5=2y4<2XGUsFZB0NV$xMa!$xQ?iI4;39^WmtKgQkaa;cUGQp z_XT@3ni-E>uGG@nF-ZINJ+ACs`uZ_at1Z9mgx8Wq)B=-RIsQ>#*%fo?9#c*=klE7P zCRniZ>&Ak!eN<~MnuvHxw+E6Ik*=s7Q|fxUW^tM72U4NR7AY36?j!x766rSPeXFLd zo}AiSk1A*IJ2vj{hw;?GD?$9(tG3`yINiRdaCw4N3WPu5BtkVNK-@tYLCn3(3&f~X zGpK>gy&>fcyv9s}zG)>N9MgYcX7)y3TNs-o^}rA85U(0?yat9ugU8HC(Vh@t8FRQI zV&exA9}hLJ-G4L7CoX7qO<8BpP9hTB8ht!Dh*yWuM!&c2inl8xxYYZXMTS)Q)W*Mv(e`3I1^HV)8;Be8-u;whwY;7u@)zp7Y~Sd9S?F*Hc_wdRIB@ zQsHCS+NjtQ{^&(M7ayC(JN(xwDA`wk0LVMzYEZu3q^-~LfeCpIGU}eP>lEV%aweiX^WuR}Uq2WA zmB{2-N!qK}R7_Ftm%*n?N)bB-v7Oey%BnH+06TYxo79|XYTl88HWZTD!>M#rtgeWD z-e~cfrs%a5QO=0;svBI7Sm{bxV$l+3#HaFYqx2bR;3ci;@FYxeD{Vx}x-k?|wWCyd z)O~dyRplho3-}#oC2CrNTe7qs{~uKqDT$QvTz+vC3!)(;*1xLHsxGp5ot^m=VOKMx zIJ={jW6wK)kt?YXA@rTUy=4U(uz-jKGfmLa2-xW7*aCi5+@veQq|MO zP#T3Tj~eO;4&@FHZ}r>#lf#RRdbq#vgJwe^{qKeb|1U_iAC{wqsmDLTXg^3d62^an zK>tteoopCPWHJQA+W@E$3J-$8Nizzmq9zewjZnkA8fJ@uK4Y>O=c)ntTj))VqitAh zbi-um$!2^Lk5c3$aT-abEvNUHE2o+6RxjVLw(&um+n#1@r;U=sez{+CYCvaB(lzd?UQW*u zSK%)A=oU9!SL==e25cKw$D3e5Er+V0!hYkf!oj%zT98lNjA zB~7?al1CH8C$qU?Yd{v#N!=xO5p$Ca3+)4mgupI;>#aET1k$L5Y&}$QO9Cimuunq_ z2qG|pV$QQ-Ho&fTYXZF5X5+qk5r79dDK^VF4}?!GhlB-?PMvURP{=k;7y&v)-_W2#;NcmOO6UJ zDD>Fdg;Nd71}(` zdTv2!zER_6smMf~q7406vx+_1P(uJ=fF_{kB~aHwe{;K!4yd)v?+7Y;pAGO8AhSH> z`v}N8$1d|WU3+{ZdLAOP*u)mF46m2Eb`_bWFJu4qsS3FdbWLf--D@K!?KWr&6?N?&`jqXRlCTNWRqBl~c{bQ7EX9hAhl$u4{ z0k!aqGt_!4bJ#UYnbdFr=>GK|7MrNm(9XIqL%{F9H3acX9+{_aLMklzKtsz&ee)?AW zTHx2yTjSpm(yp-y&R6(aXusYp`|-U?YiYf9yPN5c5(UIwT$-CtZL}Y6TyY+IPj$Zz z`|EjO3eayw6=0jIWJMDNhpG5z42c(%jR^1E)M5CDNZ_NU#)={ib2@smM3V5;>>(ri zFhz=GX~)R#&hOn|qUJ{Lf$@;h#fk$!_{fW<#Q~r^YM*M?i1M+}*!n0-IZ-?16g|Q8 zl}}PAjy|eGGAP>DE-3l~%Y{#1J(MNB)Pd$iPc00OHXz%I0A18=Wd!UdnoUdw*5yTA zP*`u6@#}|*r=CFUmrYCR#H9^oaTf8+Io{3PC~l-Mnoa5SP}cl(t+S~3ZBM2{$Arv; z+mWa)h10V9jb%?AL62WkXHaT*Of>HfhE_W6b8Bs*@v32eqRjA?afErmgADEGb_&?_ zJtrNPotvWAP0XV=?)-!;I!a%{^(sUB9`A$HXSAXnxb#Il&sqD|6XhN+iu+0+H>J;& zJ=bS(o|XDi2J;iwg0#jKsv;J`k7vyEOZiP!C>g`NsM`k-Co{W7uF2q$b0M~fXvyYh ztEza54T3(G7MVduu1l1Og=S*MTC+;Mls*0LheN2VF#t^y<%G2O9vKt|jTxoz$4)hu z?XR|_+brTx`!yc|f~`FHE&|I9Obf;V!voM})sETORWxR}{x)Euh?NJws?>Um=P?pMt1R>0pS#WU&>&E0LI|V!swWRB* z>88Y@*=(O}dSH-0)5?kJ}2s3+(>+(g^G zJr)!9gxb{WyjFYc^hkNz>+C4VVpXE4$}%};=Srx#EZG%uPTLNm)|mQY2XhQ}UfS)O zax6oQq3eZS!QkQg0!=33jN1Hq&8=&>3}a5(I6ZhSG`o$uhOA!6irCyY6n)Zi9;tO~ zp!&FfNgzwzcIA(OU2pN3b9WgD>)`QLlmmEqptG!{zZ{xH?A$SN>CIbS-fC_A$!fF` zgIo1XZC`FQ46pH&JgZh`whQNL-p6n%2*W=ZYxKmJgFF|4;TM<-1&wa(fk!{M6Bv@N z@h4Kx<~b0w_@mZf5VjJFu^UTbbG*FOkewdEeXq1*fLR38`v*iXtZ{=@nr;0rY0MrLWz zBsdwGs1X^f`=WsAY*X}yuhrjV`*clfoi+y0!4^sG+OmI|d*C^-Fz2x1B+SC;z>zfw z+V!&adUR+)Wuk8Qb%Sqw?f72l+lAs=Bo!&Nn7Q%X+*>U^9s^$(+CU4F{yFI}Llia; zA*fh|?ctsIj5z%ewvvVPliW#6nid4Oz%QfTozw^q3#(EaZrQyZajaEDk)80NGsTKV zaKCIr<{-Xz1+9FHuXC;XnJFu7B>QR6ixqw`bUaL#dzGM+Wm;br?hp3`D;a@W^Nym$Ys3XGPPFYM?H!Y$ls(Zx1;}LHt=i!jEKti=Wu?Ks$X9)EO3(hBso zXw@vNj1&8XNinNVLbEycU4VUT&xzPoSP|ygA8T;LkaQ68jX&-Cfr7Rwa0Mdt3J9w^ z!HwM}oz09}tHjg@@-7*X7pwWB*$vTI7JqBqbzAd5Kg78D=-j-~#eV=<+Ai`-d%WWj zDs(Qx&Jg!-!MjhwPH0r<%(S=45H&#?H$%)GxEbJW44>Q?u9W5eT-x@go3qm}vOT2w zVhMZ7Rf!e*ALPi%iVx}R@4FFYS{ZkHPG>NB>S%Ok2Ke{sX$EdM|5yx zT%-ee?o~hERI&TmrjEMEt&MtvIUKbcYZFUwPG6)aOH7RxXIP247FIvGTRE-OjVKGX z2imF0&le)KkZUTt6P#1WH&mA{}C1*}0Yl!Dod;GxaYwW;$ z2Ry6D%-Q&GgMAYryg4cOm@jwc^{Nb7)S2fq)B2d0*QBSK_uny+r<#qUd>|xGw?HQ> zY7N9N@=;|`+%NS6dV<|w?t`Zr5h6)aI_OjK*v2e{?<_EAqhfwwKdMSQEbkPNj4(~{iBggnCYfK*O>${v zxF$8eiDY)k_1#ea9NFMH)oP$#rKO_YKzgvI$nph?&yiknBV0v-%cVd=9zPMHJgqb_ zx-!RM3B(=Y8WsoII?bf{CYQ336)X!ERz%{VE52EsFt7^+M=mW#Ld~%ObmN}g5Z>2^6{cTNZ{P5a6sp~YZ zNVUkNw#Ysm6nC-6R$DEAjpRcP#L%A>!rOjxD|#pgRo;%KxynI1&9}lC>>fMUyD8@V z7$3DW&K~{P|0KqqNc(|y(`hK6n17Qw|PRTx!AS5Rc zDg~#@b`OjFsE|Y({(~Bx$m6d-^+8D*4@Ctqv*T{xTQm19e!Xp=sQSZSBHLon=V)MP zY#3azR(?q`k#A~4Fy4N2tn#XOKUJ=eBF%@QWuEU_|D@&n7C05lWAa?d;|~1j%R-o( zxmBf`M%SbmPlr%80`o(RU_mIZ03@*7XIEeh^RHMdZmPf0RJl+R$r_u9=tL@+D2+E1 z9CNA<6+|7VEXr~BQo$nu2y`@7Tcm+eLwDi{yoO{Vu}DG*@JjZZfRQ+qZ^611|%(B%)VY2lv)M2H|TTeNb*ZPdMZ zFP$gjmTX!2MC8*N&znoT{B87cMBeTV1Ij^<+$<6z zNfWt-l=}6Y2AUk*AhV6!BJsdYZ?q3)4*PyAy!#%UIj>C+cMQaUQnQvRMv6I0+StN& z@*aomgOT3W&{qkf(OwwBJPL{l5Yskz<`#j8-xuh(a$uZ(RB* zcI1)*DN84b-m}-~4{+ye=Jo1w-hXA? zAD~Qlc|l!h>$HnlGfuIG-=i}AQLKsp7OesaJ8y#=RCCH{Sdi4R+3aTmY>=(*(+%Y~+KT{Zh-rmKDAJYdQ0po5EUpOzvyq+UX%@Ct)ap ztpi2+D(^Axl_&kQH>dgY`<1@m_qy-fA$3?ILK+eI2zUdxH;z2NPa!$EDADCcXQ83= zUhZdwVa5wK4P3?JKzz9X)^}HweYB$ z^2yTzrJ^&RZf;I5DJu3s~Uw)xe|`uOsmg?<| zssS-n`dw4h+8tHYi#FM2NYOw`vm_=)`ztQ$)m}y9ql4_w z>(h^HZgwpyzCl+|{PHJ^T#6@^A@e7lA@ma^0BKF-6BN73#^5s5i-Sa-wcwljY$O}1 zA`A2aI;~=!XAeN>I{Me8IIpIe0;wAB_f@=+0lOLjUo%xSCphbGn?sA-(mrm<^@SVc zcMhq;ENa))0xmhKLkshJj!4#-nV3Ho`tL&uvXa$*KyI>4$xIPJi{N>EAMYem^%~Ds zyNP0?syj5~HeWGGU2wWUZ&OR%-Z`EZj$~=2STB-iHe96}P)g(#IecEVUCr6#5sGAN zC$RdHQS7QD9}+K#|B&6WVaJ!K)({kHDc9>ad;f5q22IjEdV~3~(Ibr~i`NP2&H8AU zW}R0m=jD?0-AnZ_yJ8g!p{yp;w?cwbJJKo1?fQ;VMe!?%H?LrN`z+^UYGu|}cc4D! zBWU3Jd;R`f&CK-erC_#o+5Arhd8b^%dFSyQo(bvl3k>8xSFg7llx$|sSNMm)9Rml= zyjhtL*(sK1J^4uGYergl)HP2gBVvBu)uC_71PAql$7EA-g;D$jD3%sBP~evW8%I?j znWWM72B`cW{bh$1rPC3#D`%2WyN(NrF*u9FdyZi=p?SyCq(~RCEZT(wevdB^L}RQ4u3q&0XOU&3z1|SKCe0Wx zK%4iT+Gn`xMHKU%IWTvZOWq5r$N=#`dsk{t9VB*JuuOg|SFBjTf1X7p0Q=<7ApRGx zN;3%7K!7C;U7rGn1G=A=aHVnO&aC^2JdVnkCKH$Zz>Jw{&lK(J*n%Behe_xcdTB`JjI!O9QwS}1;e~6)kKMLtQDl4 z#tEF-?vQZ%OtazzriWJgA^t^&%!m6aMG;aA>(cNLMeQ)m&NJqR!EkyNFAD0=Zd6$| zj7GUW63QY+$n{0oZ>Ymjt6jbAPC*>NmUwz{-T{zW1H`hzs}~1|=0~py%IibuY^*fK z3iii8E--4y=LVCn?Y~)wf5%g@|CbBQ-p0h#=|2M1e?0m>h)P*ke&LI#<}WTAHgB4L zgcsb@4;Po|0^1`XHzEeA83Pjr1c$A<{nG5DwS;DTqmm^dRcjDw9CayHpU6kV!-!#Hf-MO`%1<~sH zc7K#{WQGu4c6iHyhGJ(HE(w9O-fDUF$T;7vB42yY%ro6g7SyM!KIquJYQrQF-E*q> z`<=Jhe$pCKT58yi-}LQq8&iAN@c;^yQD$qnN9~C3wpvC{)>gI!sDoPNl!fx9OqiV8sQV=(u-OC5 zteYq3fp`e6ghSO|-Uc7y*Z>2cQ3UfGO571vf|oU{I47g1cnf1#5d-rV2;Lppnu)6V z>o#LC%QIauTP+qtc^Tvzf-b750gyP5c7Zo91!!`#Bz!GB6G!+Y#vxFOcR}w6rLr<;y)!&eL zX@~MB^L^#i<)ythFE^{48Mo!jLH3q_c6!$ufMC!xA(V4 zeju2gbqXzjAPTL-mvJxq9pqUbs(oh6N0KZ&ZLN&DDALKC#>=x+&PB~!MO#;4XV&%jJeiCVvr?EvM;5qq zF&AZbaZ?&83ry#h37PhO_xh&tc1dA&broS*zJrq&1N#+C=ep0Rh=yE7)HP&Q; ztOM37Ui~#&3sIvk=N$0h(vSHiB zr6CT4&`s6sZzK;7?bONxNN4z9ijo|U+wso6U$#wyRcRz4Xi74VW(qyXAmLrbQ^gL$M`X-unMT1GhfzpXIJ9%CEV285vg%&>P-6jhlXb24~^CY zk{e)k>t6mdYjbm z=yznsn!`}WTC-h;o*8Hr5Z>(j@tVFvDw|od9_OFArBL@yENV%$*gvhchVMCWD+&Bp zb)Ocu0%*8us?Br)awMQu#4FG`TG7p_v$AJ>mSV5;`~*eHb~x5hx?+<8-5n(Rs9Zp; zHPj6ZghR`J390oR*P(JapdL8r_kFjaT0xo=_90~HO#&nb)&in~D^;O{`UtjE5QJlc zpZaX2PW)H9#yv<3PgLdown(2lGP)Ew{M%-wDq~yc?clZi+S?8yU6S{t4kC1(zM(}4M zas1uDJ2cC?aPzGIuqCoRdaW!W&jGdD6bFE{5_Lc^U%|dp-($_XrxBf%>r7bY4wJKY zMbSMGi(dA|Jw`klAWn4dUnkarxZOm%@{OEnvasIsjo31Wc>IW5vt59^V$FFp^Cvwk zTNN0UG(w=*3*d<@h)&Rh7sW<8DJiI!(ai?72FqNuPbO0;Wp9E9)rLfp}iDw3O zZVj`R+F1>KL&gGadf7&RG~~;<9-1A=iNFoVW!WCpx7B5F-3nT{#HJSb14pprNb@5k z@<;alkC1CL()+lNKFW0dj~j+CjsfqPFv{i|S_%y0vJz;D=||f_L+r8Q>(Og{i=C61 zg=q_zqK~qzM5yFJHZ1oB9CCSsEvxkQfncY=>nQ|1cEUSm;qMc(2)X0IghHLeFP!3= zhEWI;kbGB0NeZvfO#Rd#d}ttigIG7_)~h|@(OC35DE-r?Qp2Vny#z^hQD~U5Ov4mF zdJ4n{gb2ao%P5LiNceCpv=r|F#C<}gzmvmXG2zt7*Z|U)`NTzLC?nyGL169>7c_&5 zn1iHz>Qa#Rq@=-aNl09m7q!%~`xBQU3jV+yzja8qUdc0B91k1~k(WG+eFuZ`J>DgN z3JnrUz8-fP7K{|fsQ*tKb4gFu& zhC3J>{pwdAy@c@pfFgf|gc;iY2Ne0YqyG#={>lhy+-z~_giu4^R}itH`PoK#6UxXa z%OZQMW!hRrlJ1v!$ftKc_RIQ$k=Sj2zYpMR z;7Kf-s*J;cASOIDKv|?~Xh)R%u$Mk{pE%5TH{oZ$Z~D`wrAMschfGe_ab#>T8kMQX z+Ru;&Vodzo@Ykdb+?PTUl=#nGCqhDMdQ+Nv>d?C6aoxC+j)qM`@`%_2z}C^Xpv`=S z0U`O}y-g1mgoT^%%g4+HGEK_Ia3|S|qC9(D$FRAn7$!jmCEBdRtGUD@$Wq1m5Iuu9b)dCm;gU5TUq z-FlAs8l}BDCB3%!hGHeU12VELAY9Z7mae1F<^5!xC$^sgqw8GYw>jAZFDZt{%vq!O zNZ8~XK+q5lK}1_1;(p(MyOqF?yOks+U)UK!77uaK>_3Q#=T?5uU zE{lMuLoeWfr`NvPC({gbVq20>zxYR0-KBI(t$)GD+y4uU{96hA6Gp1l ztv!^@aX-6l6B2Rc@^!Qzgh!>oNsB>fc5D!XmBi|sB%mY&Tjvj&cu6Nm6ObuR2C+LP zC(CcyO5{r6?3Md45suQ>Rl2rI_1})jd!J4DUc!4Hvzka`m4tH1rk$s}pL;*Yulzkf zkB2{Nx=4=HFZnQjch+xGYv(O~V9I5f|uN>8%jKd^*cDCSk!pfJffgZ)9lFkFUgtOF7pLEFoDZb8*z$YhDk`#@rdw2GnWTjqC2nY zfR>)z86U82=Nvuca5|&H%AtA}`N*l<;lCp{->(3Cy~ajqK#x&)str;Dr)R!zA~O=3 zW~wn2?lj7Xk{Qut&S1KvRFlJLTZ-vjZHR8IbtlEM4Ob(F-dRmMJO-!NN30B}qEw_) zutmFSjv6`_HM-02=ZhnGIgtplO8AV-@?G80x&c3`kS0@%Yg`s)^Ge$NE>J5751fW% zX+p8NgOA2!To*JIPrv70&ZS><)Sv41iG37OzSDXV^wp-&e*V`g<=C(4O zXB-&^mX;n}mbPZC8WDq?-nqr<`C-oLgQ%}`Z3;WR%TsAz&Npn*CUsY8q;BAi_>!;4 zi`-B>6Nfm4;r3f5G*U|CdZJGZqHr=_l#FC|5VB+DBVS(vwp&>k%(7k?Fzr5_K+N4?W)=Z_ef!7E7%Fc z@*^Qc7-4zC;8%3e9gqhw!}5>7!uI~6FV^dwyS9E48?Xm(Z}GPlm>aOzW+%1R>^?pP z1@c=xA%9fu(tC*R^l&;ggtqR5hhBIj3bc9U0ApXW(4oGm?rg1Y6`D3zCW!)LUp>(o zMwFfPWV#@(-ru1I+s$9p@|q>${ZyPhg2iToC_1jgQ}_MS3WSZwKc@(y%krx#1hX94ABKPH>Fr7*T#Gw-jZYcD*nN zan-yjU)@nTUfEzGrb+DHms&zAeLv5si#FK^=eD)UU*@3=N_a(bx@s6!W|}#<@eSp* zs^7KA6^x3Xh%qN34WnRn3KIwEnhp5)z6o=oDRGMlZ+0(I(%&p9!WuY}-85fXaAdjK z-1;XOEft{8=o4ju?)2zamJ9QpEKDb!7xgh4c&x{H5D&G?)-fY2#Yjk8r|=Di=^jLt zVrqhXEadotyQ8A!&1tIBcfGv=YRQJoqU%pxbQ3hSt@(a+ykain?w;&SNf?v1^RVGj z9p!FD6$ZBHkcR;s^{@)6G#XY*+XU0TpdU2@h<40n5}Jqnn9nXa=rJ$voU0X$p=nf? zXr=k@@PgPMuhgm8quND3{Mam);$(+bK~szF>crC zzzlWN(t?#+yPWHu-S8{y7OTcncO;#`DlI#urOjORlX;XA!+OSXg(u*MMrBcH~1aI6h{#DBdQu?Le zHbE8+78lQb=Bc1}fO^`6LQq~|)Ue#g1C4f^&;!o)(xjakGX76Z9(x$7c*~Pjjvz0* zhc&hjXV=l&q(4acgf;iu0`W<2RB{ZH6~~GFI3dcN&WM$y!=vY%$Dxa)Uxn*a;1+>r z6_i(Pe9JRWimS&)0GVX*FIBgVn{N@Q9rnIe5kcyZP;mmgL? z6QA(4bMd#zI;6_>o}8SOAMD7F6uf40=4{=rp_S&R`6DNprKjn~Cz&{Ib@*4qup43O zbzw}8N@r&I2K2?YXqCT3Up_H>-4UTByAu^%LhI*4bni|y{p4MY*-@M<2x55`28R<* z2=U=b^>?53Fp ncO(m!uT+`aqf-z_xEXa@Ps$V9x^$AdIReMS)t%4G|C7n41WB9 z2d35=((Q)IuruQGAr+C$o0I+UFEncv-VbX{J3{*gr#fR>BooP;vhckD7*7q z&U4MlxOHVPb8;znC?LBPgY_(XD8^ZTe+^@)y-v4}_p;!PtCgnrST%0gJVC!~|5E}S zt5^X&+KWX2n$kGa+e=DpUnPfiY?@s>NURI@k=t|WWapSL6%_744_uOe(0?{>Mm*8& z<;;CnjduvLd?cTI%G~cwNJvxRegBk8XmC~d++wizyO@!5I6G=#o#qlBp)1!Re z1NUe(O&C9Hw<~P+=!bF;D~;AU1#h4{bJF+Ee}rr9OU~*QK>z_E{O#nL=I=hoID6U| z|7&dh|H*r^RkY>5u=yiYEhQx+g($o%yv;y6t{8ZWK}3jw(K0~du&>oHy$O2UhPiWm zi2r~YQsnO2_E$s$^E#4(M;YIr_Q~|y?5jVcZ*TYSIKOE0O5^&|&|>E$2BeHp_O)az z07clIC@?6nGFWL$*GYt})4bFNeV1J7KJvjrpeQs~*S>b%I!k|=tG`waL&IbnZo*b! zhDJ1?F}q$-t}#)1bBw0474A-VECnJ*R&iyj6? zl8km;mYWkFOxcC7?=gR$hdG7iSBmjCKHKQ2G%aPNC8{IBorW(9i-b7;X!*822qQ)2 z70+l`Fd~9BK$c^;G>CH~%QFJ~onE%9pTV(BP7sHy0I{Q|3DWAYKVN?VPdoI_HgajX zUMQc45?lMDK3JveAwEl?8aD$>Ci3LZ#PLZbZ2p6; zI09v5Hcx0x9$v`$M?jG}fhhcUVRo(t&2DEPODzE}ey)@8f>=3c6JHX3K`!Mi9#Cqz z?1I84)CglJ(i!=NL?l5_`$U{5dUJ*!+yXYI2{6JYnT}gSm;<^ntpro$385NPISBob z-{Sa$Z(v$8)Q;IPVDuT(KIW%YYhIN3V~n40@bambNE1feMj`j0HBiQlK|seaMle?A zO;RQ36a0P}$rP-fC{@npTgQ9fxf1umx>RGfZA*9ahmWuYhB59?B;%7v!*ifcfBR>m z&n6Bed*;_*HuG->vwZ*Eq8I$@4fx9u|L@&naiX^UJOj$er<|8&r$A>6_dXLvA#`fe z`1d`se8?h6P_pU@kssjfjasP_u$ut}HV|G5TUsWbtNgtBOPbp>i;ugDrB- z9{!sTG*9c-N_@tNGnML!O9kkjzF$5J#Ef9+;ZxN5E#X0tkKAQ$$;B-%ulg>rG(IKBN1x|amJ3zD_d;0M*&g{HTL?MQ zLiY0lD}tEJaBv2cFqbj$aF(!yc^lE3Sg-XS#fc;^{-iv2XLzP*6q#!jv|1J#(#%#F zzL^rI7uN%c@x>}v%~A!6V(tXL;(|U7gG}hA{c^IGHSjO)3gH@376IK-D3)((E%FQV z>>9x_-NfYu$OErV+!?M;xU@8+1B{lGT5)egZ$gVqxx?a z-ak9dV)bWj>|;bfbdaBefs7zNgCtJSaA*jQoU&2-7|^6(&WjXod10O5pi6qSzb_+& zyoxT9w;m6R9uMzgHZ@2bb6*}mK;PT_C31TjsUZ!MN)w{-deYx}?9H~)?T<1y{ofzE z{eiy(KK&=dPQgKh8&V)6by$7K8i{>L?bQ9cumklzv;v6v-*g-`Kp@r zkYV-EZLq8OC=a!&_-G5Rr*)c^DtCCh%DLZJhnjQL0NeJrz>*uD)>vOVZg(VVy231H zPpy=sI-=aku7;ww%6O}`-aSztz5Gu0FjV%jd%RQxjh0)=sZ+L&$)~4QKr5eHVVTpc znZlk5O=m;F$?PbwKLJ#kYXMw_<;-zM>bgCg9{H#$`AwCsEJ3Fqk_2~WQQ0rOn=NX7 z8ta3R1*tmhAc}m)K62)Y4+gN$EFm%yT76o-c`RG9GgBW8N&us2ivmB{Hnv zImPon@5G_H{26X;*88=j9lxYpzHnk$p%}EHT+>Ys(NVl!30N(r7F)X|ZrmRC=y0Xn z*O4`y!rI5o^iGxpo!s)hY`RQVSCHn0$~fZX^>x+KpEiynVV@uFFgLULV(Cd$?Z*Z< z^fT`^{VF_7_N?S6XW2SErtapVeUmKbj&7P5N(}1nEg38*$WRwUV-T32Hjcv;5J`GX zsVg+u_((I0TKsi}97khIgOMH_yJRlhwi+pY31t`Y_iU1X+Fz}!8U1yLiuSl+xDpAn zn_c8kV@`czoEi{xna(P9L8*GiP0-}}9Hs$OJ||=5ZX)ufoa?MS40!~qnusxK#^G#M zY~XG%(c$@vP_Vo{2@5uGV+>8-cY=Y^%2(#0=o@mB%M-n4bLiBS;-6)fB(bM6l_X!K zCwVD5S$QJbzM8tgPz*0t7z3?=$7^3${$KE{clr7QvDe0^{Il0wTM7VWSpI=&);Hi@ zk~k^oz#-!`><&{pab_Ad-J^o{Sy9A@47-JN77HIY9t5EHm)oKwIAK@)PXU zbmV2PAmT@LCe*3WQp;g+zxs^T%D8u+OI@kWcFH@gSq~saGiAr={ZhIXyb|IN zbYN18=Kcj3SuSdlBtcnu)X{Cx3XW9amog-C8>p>(GW6-EGU3#su0%{UGc5LoQ9@Rk zlzJR-K}GLe$qXrd!Hv{zVo-Vg^KI(S*|sbn%J?j4*@>xZtjedMarM!(s8q>8s^oC$ z-Q+4$Mkz4i^$A8q6HN!z7!}mqya9a}+{2LtM!(0!oA1%MsXCP|nz;?=iEM$7kYJo} zfKgFce*tqF?0k(Y?y}Axt^9lUJSf|??}sV14r#{VXB?Np5VUW8>#^cx4-jh%d$rGz z4#4u?_#O#)WSOVqmL-Ck6N{>3vkJt%UE^E9#M2FKg?fF@Zbc+h&lDyJ8^*TifVRzV zw#1%%40q74JJqOS4@+TOMV~a}FLy$(hOXbTZR-9hZnYBCtWis2Unuq~%;%a>#3v2> zi92#2Y5{S$B#{A+xQe3WiDg`)dypeSSn(^Goag6!k2SRDGTJrH)Pe3fMNKwMO|;_$ z%`?{m-i5tDf7mZ?sQm-0xC8#}h#SNw_HvOt?xpoqVeU_EyS-}}eSbLcmn%?}f|=fE z;YYjYB_fLgru++zw((BG1!V8wZ+1ilW_z~#j7_%$T;UIjMt_V>hC0786hkAO(+GaR z-5fJW#t20ExgEcw$TgIg4DMeRjBJwPu@|^$g**gC22Fau@lBUf$|NH9*1lQ`=sRqM z>5HGF)U^UE;KYGzn8QZiU_9Q~3f4KiYCX~f$@s+8r)Mkz>0c2 zwNw<5I!pybF#S$~ikp?$ zDT^V^Epg0p2}hD=826%>kKDNuU1{?;LZF$$E?SoSlzG8o-QsjU@&D^y7DLCB6!?lO z{XqJ=>4N;<+{^#kjU;Ge^Ox1p`7atI`A^RNoe-;))}@FA5qNpUMo9K;mtSE)LrCbj zHSZ)v!8C__k^)paIhc>j` zSJ8)6O&o_dsXcoX+_C%W6)p`;Qh`53mQrrOVakzsneUQ{>02_RD{RU;_OcN|@R z31jY-jwEp=XBZk?%mr^SS4ve&liu+yn{)FVz#583_?ZtpifSn7SPMEZ=VJ+@T#%hi z_>{@|n%C-S8Kk|dl(NWQdJ3JV8`b}INO~QPyphZ`)>X=oA+-q2373EwfTZdrE(vmT z;izM@GY&M|U#BvDy3JX#QXLV=n6;Lpvt%3XWPS`$Vw9!MDX=Y_jKm@vCt4RH&$blm z3|>E(Li5}FMKz%t^!_u5$;EA?MwjRkv4%j}q5>5ToL9g`w1K9@YZkn+HBsr^C&B$R z#^)mB)4)GBL_4@zW5yCRj~}gx0UQH2qAB_s6tsNh+Wyzd zV#fbjf&7!-zKnm`D95ON=9*ci7_}7ND!~wuYv|Byk?Kn7q;&d+I<|miC+lDsIR4m~ zo1t1-XRz7I%oRPZ71?^xFR@j#bQl!PK7jk3Ous|F=pT5_tvzPqrkHBl@$vXRtfpT% z^*Hz3<~(w5r~7|A4#Wbn?BYY^{6dec!>32fN77eW=^((Pr<|FoC5Q|#I>De3!w}wM zq#009h>8cIqhesB;$j5F4Tolh1l12L{uNrNV5oG`L4ucx`ll}~iW+K+fv#v6#RpSg z@mf^}6_|efDI?BPbmg_f!$)|y(Μ?v4qJK9EO_y}MenJbX1v~0mHvCCch^OKxa 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 F?0@PPo>2e* literal 0 HcmV?d00001 diff --git a/src/com/api/secret/web/AuthorityChangeController.java b/src/com/api/secret/web/AuthorityChangeController.java new file mode 100644 index 0000000..cdf324e --- /dev/null +++ b/src/com/api/secret/web/AuthorityChangeController.java @@ -0,0 +1,12 @@ +package com.api.secret.web; + +import javax.ws.rs.Path; + +/** + * @author:dxfeng + * @createTime: 2025/04/09 + * @version: 1.0 + */ +@Path("/secret/authority/change") +public class AuthorityChangeController extends com.engine.secret.web.AuthorityChangeController{ +} diff --git a/src/com/api/secret/web/AutoGenerateNumberController.java b/src/com/api/secret/web/AutoGenerateNumberController.java new file mode 100644 index 0000000..c0e6862 --- /dev/null +++ b/src/com/api/secret/web/AutoGenerateNumberController.java @@ -0,0 +1,12 @@ +package com.api.secret.web; + +import javax.ws.rs.Path; + +/** + * @author:dxfeng + * @createTime: 2025/04/16 + * @version: 1.0 + */ +@Path("/secret/auto/number") +public class AutoGenerateNumberController extends com.engine.secret.web.AutoGenerateNumberController{ +} diff --git a/src/com/api/secret/web/QualificationApplicationController.java b/src/com/api/secret/web/QualificationApplicationController.java new file mode 100644 index 0000000..79ff4e7 --- /dev/null +++ b/src/com/api/secret/web/QualificationApplicationController.java @@ -0,0 +1,8 @@ +package com.api.secret.web; + +import javax.ws.rs.Path; + + +@Path("/secret/demand") +public class QualificationApplicationController extends com.engine.secret.web.QualificationApplicationController { +} diff --git a/src/com/engine/secret/entity/autonumber/AcceptanceNumber.java b/src/com/engine/secret/entity/autonumber/AcceptanceNumber.java new file mode 100644 index 0000000..c41f429 --- /dev/null +++ b/src/com/engine/secret/entity/autonumber/AcceptanceNumber.java @@ -0,0 +1,24 @@ +package com.engine.secret.entity.autonumber; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author:dxfeng + * @createTime: 2025/04/16 + * @version: 1.0 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class AcceptanceNumber { + private Integer id; + private Integer year; + private Integer month; + private Integer monthlySerial; + private Integer globalSerial; + private Integer secretType; +} diff --git a/src/com/engine/secret/entity/unpack/ApplicationResource.java b/src/com/engine/secret/entity/unpack/ApplicationResource.java new file mode 100644 index 0000000..d778014 --- /dev/null +++ b/src/com/engine/secret/entity/unpack/ApplicationResource.java @@ -0,0 +1,24 @@ +package com.engine.secret.entity.unpack; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author:dxfeng + * @createTime: 2025/03/26 + * @version: 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ApplicationResource { + private String id; + private String aid; + private String fid; + private String rid; + private String createdTime; + private String isDelete; +} diff --git a/src/com/engine/secret/entity/unpack/CheckFields.java b/src/com/engine/secret/entity/unpack/CheckFields.java new file mode 100644 index 0000000..7f39f2d --- /dev/null +++ b/src/com/engine/secret/entity/unpack/CheckFields.java @@ -0,0 +1,15 @@ +package com.engine.secret.entity.unpack; + +import lombok.Data; + +/** + * @author:dxfeng + * @createTime: 2025/04/30 + * @version: 1.0 + */ +@Data +public class CheckFields { + private String name; + private String fields; + private String formFields; +} diff --git a/src/com/engine/secret/entity/unpack/DataConfig.java b/src/com/engine/secret/entity/unpack/DataConfig.java new file mode 100644 index 0000000..a2ebc58 --- /dev/null +++ b/src/com/engine/secret/entity/unpack/DataConfig.java @@ -0,0 +1,29 @@ +package com.engine.secret.entity.unpack; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @author:dxfeng + * @createTime: 2025/03/26 + * @version: 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class DataConfig { + private String id; + private String mainTableName; + private String relatedField; + private String detailTableName; + private String rootPath; + List childDataConfig; + List detailList; + List fileList; + +} diff --git a/src/com/engine/secret/entity/unpack/DataConfigDetail.java b/src/com/engine/secret/entity/unpack/DataConfigDetail.java new file mode 100644 index 0000000..aa0ddba --- /dev/null +++ b/src/com/engine/secret/entity/unpack/DataConfigDetail.java @@ -0,0 +1,31 @@ +package com.engine.secret.entity.unpack; + +import com.engine.secret.util.ModeUtil; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.commons.lang.StringUtils; + +/** + * @author:dxfeng + * @createTime: 2025/03/26 + * @version: 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class DataConfigDetail { + private String fieldName; + private String path; + private String condition; + private String convertSql; + + public String getConvertSql() { + if (StringUtils.isBlank(convertSql)) { + return ""; + } + return ModeUtil.ToDBC(convertSql); + } +} diff --git a/src/com/engine/secret/entity/unpack/FileConfig.java b/src/com/engine/secret/entity/unpack/FileConfig.java new file mode 100644 index 0000000..2d935dc --- /dev/null +++ b/src/com/engine/secret/entity/unpack/FileConfig.java @@ -0,0 +1,23 @@ +package com.engine.secret.entity.unpack; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author:dxfeng + * @createTime: 2025/03/26 + * @version: 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class FileConfig { + private String fieldName; + private String fileId; + private String isFilled; + private String fixedValue; + private String attachments; +} diff --git a/src/com/engine/secret/entity/unpack/ResourceInfo.java b/src/com/engine/secret/entity/unpack/ResourceInfo.java new file mode 100644 index 0000000..7c45f0b --- /dev/null +++ b/src/com/engine/secret/entity/unpack/ResourceInfo.java @@ -0,0 +1,26 @@ +package com.engine.secret.entity.unpack; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author:dxfeng + * @createTime: 2025/03/26 + * @version: 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ResourceInfo { + private String id; + private String fileName; + private String filePath; + private String fileSuffix; + private String virtualPath; + private String createdTime; + private String updatedTime; + private String isDelete; +} diff --git a/src/com/engine/secret/entity/unpack/UnpackParam.java b/src/com/engine/secret/entity/unpack/UnpackParam.java new file mode 100644 index 0000000..99c167e --- /dev/null +++ b/src/com/engine/secret/entity/unpack/UnpackParam.java @@ -0,0 +1,24 @@ +package com.engine.secret.entity.unpack; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @author:dxfeng + * @createTime: 2025/04/30 + * @version: 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class UnpackParam { + private String docId; + private String requestId; + private boolean isCorrection; + private List checkFields; +} diff --git a/src/com/engine/secret/enums/ApplicationCategory.java b/src/com/engine/secret/enums/ApplicationCategory.java new file mode 100644 index 0000000..61238d9 --- /dev/null +++ b/src/com/engine/secret/enums/ApplicationCategory.java @@ -0,0 +1,32 @@ +package com.engine.secret.enums; + +/** + * 申请类别 + * + * @author:dxfeng + * @createTime: 2025/04/07 + * @version: 1.0 + */ +public enum ApplicationCategory { + // 涉密信息系统集成资质、国家秘密载体印制资质、武器装备科研生产单位保密资质、涉密军事设施建设保密资质 + CLASSIFIED_INFO_SYSTEM_INTEGRATION_QUALIFICATION("涉密信息系统集成资质", 0), + NATIONAL_SECRET_CARRIER_PRINTING_QUALIFICATION("国家秘密载体印制资质", 1), + WEAPON_EQUIPMENT_RESEARCH_SECURITY_QUALIFICATION("武器装备科研生产单位保密资质", 2), + CLASSIFIED_MILITARY_FACILITY_CONSTRUCTION_QUALIFICATION("涉密军事设施建设保密资质", 3); + + ApplicationCategory(String name, Integer value) { + this.name = name; + this.value = value; + } + + private String name; + private Integer value; + + public String getName() { + return name; + } + + public Integer getValue() { + return value; + } +} diff --git a/src/com/engine/secret/enums/CategoryValue.java b/src/com/engine/secret/enums/CategoryValue.java new file mode 100644 index 0000000..3ebb174 --- /dev/null +++ b/src/com/engine/secret/enums/CategoryValue.java @@ -0,0 +1,15 @@ +package com.engine.secret.enums; + +/** + * @author:dxfeng + * @createTime: 2025/04/07 + * @version: 1.0 + */ +public interface CategoryValue { + /** + * 获取值 + * + * @return + */ + int getSelectValue(); +} diff --git a/src/com/engine/secret/enums/IntegrateCategory.java b/src/com/engine/secret/enums/IntegrateCategory.java new file mode 100644 index 0000000..b5dcd96 --- /dev/null +++ b/src/com/engine/secret/enums/IntegrateCategory.java @@ -0,0 +1,44 @@ +package com.engine.secret.enums; + +/** + * 集成资质 + * + * @author:dxfeng + * @createTime: 2025/04/07 + * @version: 1.0 + */ +public enum IntegrateCategory implements CategoryValue { + // 总体集成、系统咨询、软件开发、安防监控、屏蔽室建设、运行维护、数据恢复、工程监理 + SYSTEM_INTEGRATION("总体集成", 0), + SYSTEM_CONSULTING("系统咨询", 1), + SOFTWARE_DEVELOPMENT("软件开发", 2), + SECURITY_SURVEILLANCE("安防监控", 3), + SHIELDED_ROOM_CONSTRUCTION("屏蔽室建设", 4), + OPERATION_MAINTENANCE("运行维护", 5), + DATA_RECOVERY("数据恢复", 6), + PROJECT_SUPERVISION("工程监理", 7); + + IntegrateCategory(String name, Integer value) { + this.name = name; + this.value = value; + } + + private String name; + private Integer value; + + public static IntegrateCategory getValue(String name) { + for (IntegrateCategory item : IntegrateCategory.values()) { + if (item.name.equalsIgnoreCase(name)) { + return item; + } + } + //throw new RuntimeException("不支持的操作类型"); + return null; + } + + + @Override + public int getSelectValue() { + return value; + } +} diff --git a/src/com/engine/secret/enums/PrintCategory.java b/src/com/engine/secret/enums/PrintCategory.java new file mode 100644 index 0000000..5e7afc8 --- /dev/null +++ b/src/com/engine/secret/enums/PrintCategory.java @@ -0,0 +1,41 @@ +package com.engine.secret.enums; + +/** + * 印制资质 + * + * @author:dxfeng + * @createTime: 2025/04/07 + * @version: 1.0 + */ +public enum PrintCategory implements CategoryValue { + // 涉密文件资料、国家统一考试试卷、涉密防伪票据证书、涉密光电磁介质、涉密档案数字化加工 + CLASSIFIED_DOCUMENTS("涉密文件资料", 0), + NATIONAL_EXAM_PAPERS("国家统一考试试卷", 1), + CLASSIFIED_VOUCHERS("涉密防伪票据证书", 2), + SECURE_ELECTRONIC_STORAGE("涉密光电磁介质", 3), + CLASSIFIED_DIGITIZATION("涉密档案数字化加工", 4); + + PrintCategory(String name, Integer value) { + this.name = name; + this.value = value; + } + + private String name; + private Integer value; + + public static PrintCategory getValue(String name) { + for (PrintCategory item : PrintCategory.values()) { + if (item.name.equalsIgnoreCase(name)) { + return item; + } + } + //throw new RuntimeException("不支持的操作类型"); + return null; + } + + + @Override + public int getSelectValue() { + return value; + } +} diff --git a/src/com/engine/secret/exception/CustomizeRunTimeException.java b/src/com/engine/secret/exception/CustomizeRunTimeException.java new file mode 100644 index 0000000..76b71b3 --- /dev/null +++ b/src/com/engine/secret/exception/CustomizeRunTimeException.java @@ -0,0 +1,22 @@ +package com.engine.secret.exception; + +/** + * @Author weaver_cl + * @Description: + * @Date 2023/2/21 + * @Version V1.0 + **/ +public class CustomizeRunTimeException extends RuntimeException{ + + public CustomizeRunTimeException(String message) { + super(message); + } + + public CustomizeRunTimeException(Throwable cause) { + super(cause); + } + + public CustomizeRunTimeException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/com/engine/secret/instance/AutoGenerateNumberInstance.java b/src/com/engine/secret/instance/AutoGenerateNumberInstance.java new file mode 100644 index 0000000..ae0b031 --- /dev/null +++ b/src/com/engine/secret/instance/AutoGenerateNumberInstance.java @@ -0,0 +1,234 @@ +package com.engine.secret.instance; + +import cn.hutool.core.convert.Convert; +import com.engine.secret.entity.autonumber.AcceptanceNumber; +import com.engine.secret.exception.CustomizeRunTimeException; +import com.engine.secret.util.ModeUtil; +import weaver.common.DateUtil; +import weaver.conn.RecordSetTrans; +import weaver.formmode.IgnoreCaseHashMap; +import weaver.general.Util; +import weaver.hrm.User; + +import java.time.LocalDate; +import java.util.Map; +import java.util.UUID; + +/** + * @author:dxfeng + * @createTime: 2025/04/16 + * @version: 1.0 + */ +public class AutoGenerateNumberInstance { + private static final String TABLE_NAME = "uf_sldh"; + private static final String RECORD_TABLE_NAME = "uf_sldh_dt1"; + + private static final AutoGenerateNumberInstance INSTANCE = new AutoGenerateNumberInstance(); + + private AutoGenerateNumberInstance() { + // 私有化构造方法 + } + + public static AutoGenerateNumberInstance getInstance() { + return INSTANCE; + } + + /** + * 集成、印制受理编号 + * + * @param param + * @return + */ + public synchronized String getAcceptanceNumber(User user, Map param) { + RecordSetTrans rs = new RecordSetTrans(); + rs.setAutoCommit(false); + try { + Integer secretType = Convert.toInt(param.get("secretType")); + String requestId = Util.null2String(param.get("requestId")); + + LocalDate now = LocalDate.now(); + int year = now.getYear(); + int currentMonth = now.getMonthValue(); + + + AcceptanceNumber yearNumber; + rs.executeQuery("select * from uf_sldh where secret_type= ? and year = ? and month = 0 FOR UPDATE", secretType, year); + if (rs.next()) { + yearNumber = getSelectNum(rs); + } else { + yearNumber = buildNewNum(year, 0, secretType); + } + yearNumber.setGlobalSerial(yearNumber.getGlobalSerial() + 1); + // 更新年度流水号 + saveNum(rs, yearNumber); + + AcceptanceNumber monthNumber; + rs.executeQuery("select * from uf_sldh where secret_type= ? and year = ? and month = ? FOR UPDATE", secretType, year, currentMonth); + if (rs.next()) { + monthNumber = getSelectNum(rs); + } else { + monthNumber = buildNewNum(year, currentMonth, secretType); + } + monthNumber.setMonthlySerial(monthNumber.getMonthlySerial() + 1); + // 更新月度、流水号 + saveNum(rs, monthNumber); + + // 生成编号 + String formattedYear = String.format("%04d", year); + String formattedMonth = String.format("%02d", monthNumber.getMonth()); + String formattedMonthlySerial = String.format("%02d", monthNumber.getMonthlySerial()); + String formattedGlobalSerial = String.format("%03d", yearNumber.getGlobalSerial()); + + String num = formattedYear + formattedMonth + formattedMonthlySerial + formattedGlobalSerial; + rs.writeLog("requestId===" + requestId + ",secretType===" + secretType + ",num===" + num); + insertGenerateRecord(rs, requestId, num, user.getUID()); + // 插入编号生成记录 + rs.commit(); + return num; + } catch (Exception e) { + rs.rollback(); + rs.writeLog(e); + throw new CustomizeRunTimeException(e.getMessage()); + } + } + + /** + * 军工受理单号 + * + * @param param + * @return + */ + public synchronized String getWarIndustryAcceptanceNumber(User user, Map param) { + RecordSetTrans rs = new RecordSetTrans(); + rs.setAutoCommit(false); + try { + Integer secretType = Convert.toInt(param.get("secretType")); + String requestId = Util.null2String(param.get("requestId")); + + LocalDate now = LocalDate.now(); + int year = now.getYear(); + + + AcceptanceNumber yearNumber; + rs.executeQuery("select * from uf_sldh where secret_type= ? and year = ? and month = 0 FOR UPDATE", secretType, year); + if (rs.next()) { + yearNumber = getSelectNum(rs); + } else { + yearNumber = buildNewNum(year, 0, secretType); + } + yearNumber.setGlobalSerial(yearNumber.getGlobalSerial() + 1); + // 更新年度流水号 + saveNum(rs, yearNumber); + + // 生成编号 + String formattedYear = String.format("%04d", year); + String formattedGlobalSerial = String.format("%03d", yearNumber.getGlobalSerial()); + + String num = "JS" + formattedYear + formattedGlobalSerial; + rs.writeLog("requestId===" + requestId + ",secretType===" + secretType + ",num===" + num); + insertGenerateRecord(rs, requestId, num, user.getUID()); + rs.commit(); + return num; + } catch (Exception e) { + rs.rollback(); + rs.writeLog(e); + throw new CustomizeRunTimeException(e.getMessage()); + } + } + + /** + * 构建查询对象 + * + * @param rs + * @return + */ + private AcceptanceNumber getSelectNum(RecordSetTrans rs) { + return AcceptanceNumber.builder() + .id(rs.getInt("id")) + .year(rs.getInt("year")) + .month(rs.getInt("month")) + .monthlySerial(rs.getInt("monthly_serial")) + .globalSerial(rs.getInt("global_serial")) + .secretType(rs.getInt("secret_type")) + .build(); + } + + /** + * 构建新对象 + * + * @param year + * @param currentMonth + * @param secretType + * @return + */ + private AcceptanceNumber buildNewNum(Integer year, Integer currentMonth, Integer secretType) { + return AcceptanceNumber.builder() + .year(year) + .month(currentMonth) + .monthlySerial(0) + .globalSerial(0) + .secretType(secretType) + .build(); + } + + /** + * 保存编号数据 + * + * @param rs + * @param number + * @throws Exception + */ + private void saveNum(RecordSetTrans rs, AcceptanceNumber number) throws Exception { + if (null == number.getId()) { + Map insertMap = buildSaveMap(number); + String uuid = UUID.randomUUID().toString(); + insertMap.put("modeuuid", uuid); + int formModeId = ModeUtil.getModeIdByTableName(TABLE_NAME); + insertMap.put("formmodeid", formModeId); + ModeUtil.buildModeInsertFields(insertMap, 1); + ModeUtil.insertData(rs, insertMap, TABLE_NAME); + ModeUtil.refreshRight(uuid, TABLE_NAME, formModeId, 1); + } else { + Map updateMap = buildSaveMap(number); + ModeUtil.buildModeUpdateFields(updateMap, 1); + ModeUtil.updateDataById(rs, updateMap, TABLE_NAME); + } + + } + + /** + * 构建数据库映射关系 + * + * @param number + * @return + */ + private IgnoreCaseHashMap buildSaveMap(AcceptanceNumber number) { + IgnoreCaseHashMap dataMap = new IgnoreCaseHashMap<>(); + if (null != number.getId()) { + dataMap.put("id", number.getId()); + } + dataMap.put("year", number.getYear()); + dataMap.put("month", number.getMonth()); + dataMap.put("monthly_serial", number.getMonthlySerial()); + dataMap.put("global_serial", number.getGlobalSerial()); + dataMap.put("secret_type", number.getSecretType()); + return dataMap; + } + + /** + * 插入编号生成记录 + * + * @param requestId + * @param num + * @param userId + */ + private void insertGenerateRecord(RecordSetTrans rs, String requestId, String num, int userId) throws Exception { + IgnoreCaseHashMap dataMap = new IgnoreCaseHashMap<>(); + dataMap.put("request_id", requestId); + dataMap.put("num", num); + dataMap.put("operate_user", userId); + dataMap.put("operate_time", DateUtil.getFullDate()); + ModeUtil.insertData(rs, dataMap, RECORD_TABLE_NAME); + + } +} diff --git a/src/com/engine/secret/service/AuthorityChangeService.java b/src/com/engine/secret/service/AuthorityChangeService.java new file mode 100644 index 0000000..4c5ebb9 --- /dev/null +++ b/src/com/engine/secret/service/AuthorityChangeService.java @@ -0,0 +1,19 @@ +package com.engine.secret.service; + +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/04/09 + * @version: 1.0 + */ +public interface AuthorityChangeService { + + /** + * 将审批事权移交至省级 + * + * @param param + * @return + */ + Map delegateToProvincialAuthority(Map param); +} diff --git a/src/com/engine/secret/service/AutoGenerateNumberService.java b/src/com/engine/secret/service/AutoGenerateNumberService.java new file mode 100644 index 0000000..21c6310 --- /dev/null +++ b/src/com/engine/secret/service/AutoGenerateNumberService.java @@ -0,0 +1,18 @@ +package com.engine.secret.service; + +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/04/16 + * @version: 1.0 + */ +public interface AutoGenerateNumberService { + /** + * 获取受理单号 + * + * @param param + * @return + */ + String getAcceptanceNumber(Map param) ; +} diff --git a/src/com/engine/secret/service/QualificationApplicationService.java b/src/com/engine/secret/service/QualificationApplicationService.java new file mode 100644 index 0000000..26284db --- /dev/null +++ b/src/com/engine/secret/service/QualificationApplicationService.java @@ -0,0 +1,27 @@ +package com.engine.secret.service; + +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2024/08/29 + * @version: 1.0 + */ +public interface QualificationApplicationService { + + /** + * 解析文件 + * + * @param param + * @return + */ + Map parsingFiles(Map param); + + /** + * 删除已经解析的数据 + * + * @param params + * @return + */ + Map deleteParsedData(Map params); +} diff --git a/src/com/engine/secret/service/UnpackZipService.java b/src/com/engine/secret/service/UnpackZipService.java new file mode 100644 index 0000000..cb6596e --- /dev/null +++ b/src/com/engine/secret/service/UnpackZipService.java @@ -0,0 +1,43 @@ +package com.engine.secret.service; + +import com.engine.secret.entity.unpack.UnpackParam; +import com.fasterxml.jackson.databind.JsonNode; +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.model.FileHeader; + +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/03/26 + * @version: 1.0 + */ +public interface UnpackZipService { + + /** + * 材料收件 + * + * @param unpackParam + * @param rootNode + * @param imageFileMap + * @return + * @throws Exception + */ + Map registerAcceptance(ZipFile zipFile, UnpackParam unpackParam, JsonNode rootNode, Map imageFileMap) throws Exception; + + /** + * 材料补正 + * + * @return + */ + Map reviewResubmittedMaterials(ZipFile zipFile, String requestId, JsonNode rootNode, Map imageFileMap); + + /** + * 删除文件解析数据 + * + * @param param + * @return + */ + Map deleteParsedData(Map param); + +} diff --git a/src/com/engine/secret/service/impl/AuthorityChangeServiceImpl.java b/src/com/engine/secret/service/impl/AuthorityChangeServiceImpl.java new file mode 100644 index 0000000..528c66c --- /dev/null +++ b/src/com/engine/secret/service/impl/AuthorityChangeServiceImpl.java @@ -0,0 +1,67 @@ +package com.engine.secret.service.impl; + +import com.engine.core.impl.Service; +import com.engine.secret.exception.CustomizeRunTimeException; +import com.engine.secret.service.AuthorityChangeService; +import com.engine.secret.util.FlowUtil; +import com.engine.secret.util.ModeUtil; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import weaver.common.DateUtil; +import weaver.conn.RecordSet; +import weaver.general.Util; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/04/09 + * @version: 1.0 + */ +public class AuthorityChangeServiceImpl extends Service implements AuthorityChangeService { + @Override + public Map delegateToProvincialAuthority(Map param) { + RecordSet rs = new RecordSet(); + String ids = Util.null2String(param.get("ids")); + if (StringUtils.isBlank(ids)) { + throw new CustomizeRunTimeException("请至少选择一条数据"); + } + String customId = Util.null2String(param.get("customId")); + if (StringUtils.isBlank(customId)) { + throw new CustomizeRunTimeException("未获取到查询列表ID"); + } + String modeTableName = ModeUtil.getTableNameByCustomId(customId); + rs.writeLog("ids==" + ids); + rs.writeLog("customId==" + customId); + rs.writeLog("modeTableName==" + modeTableName); + String options = user.getLastname() + "-自动提交流程-"; + + // 查询对应的流程,并更新 + String[] split = ids.split(","); + for (String s : split) { + rs.writeLog("id==" + s); + // 更新事权类别为省级事权 + rs.executeUpdate("update " + modeTableName + " set bmzzzgsqlb = ?,tjdqjd = ? where id =? ", 0, 1, s); + // 查询对应的requestId + rs.executeQuery("select requestId from " + modeTableName + " where id = ?", s); + if (rs.next()) { + String requestId = rs.getString("requestId"); + rs.writeLog("requestId==" + requestId); + List currentUserIds = FlowUtil.getCurrentUserIds(requestId); + if (CollectionUtils.isEmpty(currentUserIds)) { + throw new CustomizeRunTimeException("requestId[" + requestId + "],流程提交失败,未获取到当前节点处理人"); + } + + String submitResult = FlowUtil.submitWorkflowRequest(requestId, currentUserIds.get(0), options + DateUtil.getFullDate()); + if (!"success".equals(submitResult)) { + throw new CustomizeRunTimeException("requestId[" + requestId + "],流程提交失败"); + } + } + } + + + return new HashMap<>(); + } +} diff --git a/src/com/engine/secret/service/impl/AutoGenerateNumberServiceImpl.java b/src/com/engine/secret/service/impl/AutoGenerateNumberServiceImpl.java new file mode 100644 index 0000000..98c19e1 --- /dev/null +++ b/src/com/engine/secret/service/impl/AutoGenerateNumberServiceImpl.java @@ -0,0 +1,42 @@ +package com.engine.secret.service.impl; + +import cn.hutool.core.convert.Convert; +import com.engine.core.impl.Service; +import com.engine.secret.exception.CustomizeRunTimeException; +import com.engine.secret.instance.AutoGenerateNumberInstance; +import com.engine.secret.service.AutoGenerateNumberService; +import weaver.conn.RecordSet; + +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/04/16 + * @version: 1.0 + */ +public class AutoGenerateNumberServiceImpl extends Service implements AutoGenerateNumberService { + + @Override + public String getAcceptanceNumber(Map param) { + Integer secretType = Convert.toInt(param.get("secretType")); + Integer requestId = Convert.toInt(param.get("requestId")); + if (null == secretType) { + throw new CustomizeRunTimeException("未获取到[保密资质(资格)类型],请检查表单数据"); + } + // 查询当前请求是否已经生成单号,如已生成过,直接取原来单号,不重新生成 + RecordSet rs = new RecordSet(); + rs.executeQuery("select num from uf_sldh_dt1 where request_id = ? ", requestId); + if (rs.next()) { + return rs.getString("num"); + } + + AutoGenerateNumberInstance instance = AutoGenerateNumberInstance.getInstance(); + if (0 == secretType || 1 == secretType) { + // 集成、印制 + return instance.getAcceptanceNumber(user, param); + } else { + // 军工 + return instance.getWarIndustryAcceptanceNumber(user, param); + } + } +} diff --git a/src/com/engine/secret/service/impl/OfflineZipUnpackServiceImpl.java b/src/com/engine/secret/service/impl/OfflineZipUnpackServiceImpl.java new file mode 100644 index 0000000..44f985c --- /dev/null +++ b/src/com/engine/secret/service/impl/OfflineZipUnpackServiceImpl.java @@ -0,0 +1,1135 @@ +package com.engine.secret.service.impl; + +import cn.hutool.core.convert.Convert; +import com.alibaba.fastjson.JSON; +import com.engine.core.impl.Service; +import com.engine.secret.entity.unpack.*; +import com.engine.secret.exception.CustomizeRunTimeException; +import com.engine.secret.service.UnpackZipService; +import com.engine.secret.util.ConfigUtil; +import com.engine.secret.util.FieldConvertUtil; +import com.engine.secret.util.FlowUtil; +import com.engine.secret.util.ModeUtil; +import com.fasterxml.jackson.databind.JsonNode; +import com.wbi.util.Util; +import com.weaver.formmodel.data.model.Formfield; +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.model.FileHeader; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import weaver.conn.RecordSet; +import weaver.formmode.IgnoreCaseHashMap; +import weaver.general.BaseBean; +import weaver.systeminfo.SystemEnv; + +import java.io.InputStream; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * 离线数据包解析实现类 + * + * @author:dxfeng + * @createTime: 2025/03/26 + * @version: 1.0 + */ +public class OfflineZipUnpackServiceImpl extends Service implements UnpackZipService { + + /** + * 解析类型,当前解析类,固定值为0 + */ + private static final String SOURCE_TYPE = "0"; + + /** + * 文件上传目录 + */ + private int uploadCatalogue; + + private Map> applicationResourceMap; + private Map> resourceInfoMap; + private Map fileHeaderMap; + private String relatedFlowId; + private final Map returnMap = new HashMap<>(); + private ZipFile zipFile; + + private final Map> insertTableMap = new ConcurrentHashMap<>(); + + private final BaseBean baseBean = new BaseBean(); + + @Override + public Map registerAcceptance(ZipFile zipFile, UnpackParam unpackParam, JsonNode rootNode, Map imageFileMap) { + try { + initializeResources(zipFile, unpackParam.getRequestId(), imageFileMap); + insertDataAndFiles(rootNode, unpackParam); + } catch (Exception e) { + baseBean.writeLog(e); + throw new CustomizeRunTimeException(e.getMessage()); + } + returnMap.put("data", insertTableMap); + return returnMap; + } + + @Override + public Map reviewResubmittedMaterials(ZipFile zipFile, String requestId, JsonNode rootNode, Map imageFileMap) { + try { + initializeResources(zipFile, requestId, imageFileMap); + updateCorrectedMaterials(rootNode); + } catch (Exception e) { + baseBean.writeLog(e); + throw new CustomizeRunTimeException(e); + } + return returnMap; + } + + @Override + public Map deleteParsedData(Map param) { + String requestId = Util.null2String(param.get("requestId")); + String isCorrection = Util.null2String(param.get("isCorrection")); + + // 读取配置表 + RecordSet rs = new RecordSet(); + List dataConfig = getDataConfig("0"); + + if ("true".equals(isCorrection)) { + // 补正 + } else { + // 非补正 + for (DataConfig config : dataConfig) { + String mainTableName = config.getMainTableName(); + String relatedField = config.getRelatedField(); + List childDataConfig = config.getChildDataConfig(); + + String sql = "select id from " + mainTableName + " where " + relatedField + " =?"; + rs.executeQuery(sql, requestId); + if (rs.next()) { + int billId = rs.getInt("id"); + if (billId < 0) { + continue; + } + // 删除明细表数据 + for (DataConfig childConfig : childDataConfig) { + String detailTableName = childConfig.getDetailTableName(); + rs.executeUpdate("delete from " + detailTableName + " where mainid = ?", billId); + } + // 删除主表数据 + rs.executeUpdate("delete from " + mainTableName + " where id = ?", billId); + } + } + + } + return null; + } + + /** + * 初始化全局变量数据 + * + * @param zipFile + * @param requestId + * @param imageFileMap + */ + private void initializeResources(ZipFile zipFile, String requestId, Map imageFileMap) { + this.fileHeaderMap = imageFileMap; + this.relatedFlowId = requestId; + this.zipFile = zipFile; + } + + + /** + * 更新补正文件 + * + * @param rootNode + * @throws Exception + */ + private void updateCorrectedMaterials(JsonNode rootNode) throws Exception { + initializeUploadCatalogue(); + List dataConfigList = getDataConfig(SOURCE_TYPE); + baseBean.writeLog("dataConfigList==" + JSON.toJSONString(dataConfigList)); + + initializeResourceMaps(rootNode); + + if (CollectionUtils.isNotEmpty(dataConfigList)) { + processDataConfigForUpdate(dataConfigList); + } + } + + /** + * 初始化文件上传目录 + */ + private void initializeUploadCatalogue() { + String uploadCatalogueStr = ConfigUtil.getConfig("UPLOAD_CATALOGUE"); + if (StringUtils.isBlank(uploadCatalogueStr)) { + throw new CustomizeRunTimeException("未获取到解析文件目录设置,检查配置[uf_config]"); + } + uploadCatalogue = Convert.toInt(uploadCatalogueStr, -1); + baseBean.writeLog("uploadCatalogue==" + uploadCatalogue); + } + + /** + * 解析JSON文件,构建applicationResourceMap、resourceInfoMap + * + * @param rootNode + */ + private void initializeResourceMaps(JsonNode rootNode) { + List applicationResourceList = getApplicationResourceList(rootNode); + applicationResourceMap = applicationResourceList.stream() + .collect(Collectors.groupingBy(ApplicationResource::getFid)); + baseBean.writeLog("applicationResourceMap==" + JSON.toJSONString(applicationResourceMap)); + + List resourceInfoList = getResourceInfoList(rootNode); + resourceInfoMap = resourceInfoList.stream() + .collect(Collectors.groupingBy(ResourceInfo::getVirtualPath, + Collectors.toMap(ResourceInfo::getId, item -> item))); + baseBean.writeLog("resourceInfoMap==" + JSON.toJSONString(resourceInfoMap)); + } + + /** + * 更新主表补正文件数据 + * + * @param dataConfigList + * @throws Exception + */ + private void processDataConfigForUpdate(List dataConfigList) throws Exception { + RecordSet rs = new RecordSet(); + for (DataConfig dataConfig : dataConfigList) { + String mainTableName = dataConfig.getMainTableName(); + String relatedField = dataConfig.getRelatedField(); + String rootPath = dataConfig.getRootPath(); + baseBean.writeLog("rootPath==" + rootPath); + + List childDataConfigList = dataConfig.getChildDataConfig(); + List fieldDetailList = dataConfig.getDetailList(); + List fileList = dataConfig.getFileList(); + + if (CollectionUtils.isNotEmpty(fieldDetailList)) { + String sql = "select id from " + mainTableName + " where " + relatedField + " =?"; + rs.executeQuery(sql, relatedFlowId); + if (rs.next()) { + int billId = rs.getInt("id"); + if (billId < 0) { + continue; + } + + updateFileList(billId, fileList, mainTableName, false); + + if (CollectionUtils.isNotEmpty(childDataConfigList)) { + processChildDataConfigForUpdate(billId, childDataConfigList); + } + } + } + } + } + + /** + * 更新明细表补正文件数据 + * + * @param billId + * @param childDataConfigList + * @throws Exception + */ + private void processChildDataConfigForUpdate(int billId, List childDataConfigList) throws + Exception { + for (DataConfig childDataConfig : childDataConfigList) { + String detailTableName = childDataConfig.getDetailTableName(); + List childFileList = childDataConfig.getFileList(); + + if (CollectionUtils.isNotEmpty(childFileList)) { + baseBean.writeLog("开始解析文件,写入明细数据"); + updateFileList(billId, childFileList, detailTableName, true); + } + } + } + + /** + * 文件列表更新 + * + * @param mainId + * @param fileConfigList + * @param tableName + * @param isDetail + * @throws Exception + */ + private void updateFileList(int mainId, List fileConfigList, String tableName, boolean isDetail) throws Exception { + Map dataMap = new IgnoreCaseHashMap<>(); + String fileTypeField = ""; + String fileTypeValue = ""; + + for (FileConfig fileConfig : fileConfigList) { + String fieldName = fileConfig.getFieldName(); + String fileId = fileConfig.getFileId(); + String fixedValue = fileConfig.getFixedValue(); + String attachments = fileConfig.getAttachments(); + + if (StringUtils.isNotBlank(fixedValue)) { + continue; + } + + if (StringUtils.isNotBlank(attachments)) { + fileTypeField = fieldName; + fileTypeValue = attachments; + continue; + } + + if (!"2".equals(fileConfig.getIsFilled())) { + continue; + } + + List applicationResources = applicationResourceMap.get(fileId); + if (CollectionUtils.isEmpty(applicationResources)) { + baseBean.writeLog("根据fid未获取到数据,fileId==" + fileId); + continue; + } + + Map fileResourceMap = resourceInfoMap.get(fileConfig.getIsFilled()); + if (fileResourceMap == null || fileResourceMap.isEmpty()) { + baseBean.writeLog("根据文件类型未获取到数据,isFilled==" + fileConfig.getIsFilled()); + continue; + } + + List docIds = processFileResources(applicationResources, fileResourceMap); + if (!docIds.isEmpty()) { + dataMap.put(fieldName, StringUtils.join(docIds, ",")); + } + } + + if (dataMap.isEmpty() || StringUtils.isBlank(fileTypeField) || StringUtils.isBlank(fileTypeValue)) { + baseBean.writeLog("dataMap.size==" + dataMap.size()); + baseBean.writeLog("fileTypeField==" + fileTypeField); + baseBean.writeLog("fileTypeValue==" + fileTypeValue); + return; + } + + baseBean.writeLog("文件更新集合,dataMap==" + JSON.toJSONString(dataMap)); + updateData(mainId, dataMap, tableName, isDetail, fileTypeField, fileTypeValue); + } + + /** + * 上传对应的文件,返回docId集合 + * + * @param applicationResources + * @param fileResourceMap + * @return + * @throws Exception + */ + private List processFileResources(List applicationResources, + Map fileResourceMap) throws Exception { + List docIds = new ArrayList<>(); + + for (ApplicationResource resource : applicationResources) { + ResourceInfo resourceInfo = fileResourceMap.get(resource.getRid()); + if (resourceInfo == null) { + baseBean.writeLog("根据文件rid未获取到数据,rid==" + resource.getRid()); + continue; + } + + int imageFileId = generateImageFileId(zipFile, fileHeaderMap.get(resourceInfo.getFileName()), + resourceInfo.getFileName()); + int docId = ModeUtil.createDocId(uploadCatalogue, imageFileId, user); + docIds.add(docId); + } + + return docIds; + } + + + /** + * 更新补正文件数据 + * + * @param mainId + * @param dataMap + * @param tableName + * @param isDetail + * @param fileTypeField + * @param fileTypeValue + */ + private void updateData(int mainId, Map dataMap, String tableName, + boolean isDetail, String fileTypeField, String fileTypeValue) { + if (isDetail) { + //dataMap.put("mainid", mainId); + String whereSql = " where mainid = " + mainId + " and " + fileTypeField + "=" + fileTypeValue; + baseBean.writeLog("whereSql===" + whereSql); + ModeUtil.updateData(dataMap, tableName, whereSql); + } else { + dataMap.put("id", mainId); + ModeUtil.updateDataById(dataMap, tableName); + } + } + + /** + * 插入数据和文件 + * + * @param rootNode + * @throws Exception + */ + private void insertDataAndFiles(JsonNode rootNode, UnpackParam unpackParam) throws Exception { + initializeUploadCatalogue(); + List dataConfigList = getDataConfig(SOURCE_TYPE); + baseBean.writeLog("dataConfigList==" + JSON.toJSONString(dataConfigList)); + + checkDatas(dataConfigList, rootNode, unpackParam); + initializeResourceMaps(rootNode); + + if (CollectionUtils.isNotEmpty(dataConfigList)) { + processDataConfigForInsert(rootNode, dataConfigList); + } + } + + /** + * 校验数据是否一致 + * + * @param dataConfigList + * @param rootNode + * @param unpackParam + * @throws Exception + */ + private void checkDatas(List dataConfigList, JsonNode rootNode, UnpackParam unpackParam) throws Exception { + // 字段校验 + List checkFields = unpackParam.getCheckFields(); + String requestId = unpackParam.getRequestId(); + Map dataConfigMap = dataConfigList.stream().collect(Collectors.toMap(DataConfig::getMainTableName, item -> item, (k1, k2) -> k1)); + for (CheckFields checkField : checkFields) { + DataConfig dataConfig = dataConfigMap.get(checkField.getName()); + + + String fields = checkField.getFields(); + String formFields = checkField.getFormFields(); + if (StringUtils.isNotBlank(fields) && StringUtils.isNotBlank(formFields)) { + String[] fieldArray = fields.split(","); + String[] formFieldsArray = formFields.split(","); + if (fieldArray.length != formFieldsArray.length) { + throw new CustomizeRunTimeException("表单校验参数格式错误"); + } + List formFieldList = ModeUtil.getFieldList(dataConfig.getMainTableName()); + Map mainTableFieldMap = formFieldList.stream() + .filter(item -> item.getViewtype() == 0) + .collect(Collectors.toMap(Formfield::getFieldname, + item -> item, (k1, k2) -> k1)); + + String tableNameByRequestId = FlowUtil.getTableNameByRequestId(requestId); + RecordSet rs = new RecordSet(); + rs.executeQuery("select * from " + tableNameByRequestId + " where requestId = ?", requestId); + + IgnoreCaseHashMap flowDataMap = ModeUtil.getSingleRecordMap(rs); + + // 根据根结点,获取配置 + String rootPath = dataConfig.getRootPath(); + JsonNode checkNode; + if (StringUtils.isBlank(rootPath)) { + checkNode = rootNode; + } else { + checkNode = rootNode.get(rootPath); + } + if (null == checkNode) { + throw new CustomizeRunTimeException("未获取到根结点数据[" + rootPath + "]"); + } + + List detailList = dataConfig.getDetailList(); + Map configDetailMap = detailList.stream().collect(Collectors.toMap(DataConfigDetail::getFieldName, item -> item, (k1, k2) -> k1)); + for (int i = 0; i < fieldArray.length; i++) { + String field = fieldArray[i]; + String formField = formFieldsArray[i]; + boolean check = processFieldForCheck(checkNode, configDetailMap.get(field), mainTableFieldMap, Util.null2String(flowDataMap.get(formField))); + if (!check) { + Formfield formfield = mainTableFieldMap.get(field); + throw new CustomizeRunTimeException("[" + SystemEnv.getHtmlLabelName(formfield.getFieldlabel(), user.getLanguage()) + "]字段校验不通过,表单填写内容与解析包对应内容不一致"); + } + } + } + } + } + + /** + * 解析配置表 + * + * @param rootNode + * @param dataConfigList + * @throws Exception + */ + private void processDataConfigForInsert(JsonNode rootNode, List dataConfigList) throws Exception { + for (DataConfig dataConfig : dataConfigList) { + String mainTableName = dataConfig.getMainTableName(); + String relatedField = dataConfig.getRelatedField(); + String rootPath = dataConfig.getRootPath(); + baseBean.writeLog("rootPath==" + rootPath); + + List fieldDetailList = dataConfig.getDetailList(); + List childDataConfigList = dataConfig.getChildDataConfig(); + List fileList = dataConfig.getFileList(); + + List formFieldList = ModeUtil.getFieldList(mainTableName); + Map mainTableFieldMap = formFieldList.stream() + .filter(item -> item.getViewtype() == 0) + .collect(Collectors.toMap(Formfield::getFieldname, + item -> item, (k1, k2) -> k1)); + + if (CollectionUtils.isNotEmpty(fieldDetailList)) { + processRootPath(rootNode, mainTableName, relatedField, fieldDetailList, + mainTableFieldMap, childDataConfigList, formFieldList, fileList, rootPath); + } + } + } + + /** + * 根据根路径配置,判断处理方式 + * + * @param rootNode + * @param mainTableName + * @param relatedField + * @param fieldDetailList + * @param mainTableFieldMap + * @param childDataConfigList + * @param formFieldList + * @param fileList + * @param rootPath + * @throws Exception + */ + private void processRootPath(JsonNode rootNode, String mainTableName, String relatedField, + List fieldDetailList, Map mainTableFieldMap, + List childDataConfigList, List formFieldList, + List fileList, String rootPath) throws Exception { + if (StringUtils.isNotBlank(rootPath)) { + if (rootPath.contains("[*]")) { + processArrayRootPath(rootNode, mainTableName, relatedField, fieldDetailList, + mainTableFieldMap, childDataConfigList, formFieldList, + fileList, rootPath); + } else { + processSingleRootPath(rootNode, mainTableName, relatedField, fieldDetailList, + mainTableFieldMap, childDataConfigList, formFieldList, + fileList, rootPath); + } + } else { + processRootNode(rootNode, mainTableName, relatedField, fieldDetailList, + mainTableFieldMap, childDataConfigList, formFieldList, fileList); + } + } + + /** + * 处理数组数据 + * + * @param rootNode + * @param mainTableName + * @param relatedField + * @param fieldDetailList + * @param mainTableFieldMap + * @param childDataConfigList + * @param formFieldList + * @param fileList + * @param rootPath + * @throws Exception + */ + private void processArrayRootPath(JsonNode rootNode, String mainTableName, String relatedField, + List fieldDetailList, Map mainTableFieldMap, + List childDataConfigList, List formFieldList, + List fileList, String rootPath) throws Exception { + String path = rootPath.replace("[*]", ""); + JsonNode jsonNode = rootNode.at(path); + + if (jsonNode == null) { + throw new CustomizeRunTimeException("数据解析失败,未找到对应字段:[" + path + "]"); + } + if (!jsonNode.isArray()) { + throw new CustomizeRunTimeException("数据解析失败,未找到对应字段集合:[" + path + "]"); + } + Set tableIdList = getTableIdList(mainTableName); + for (JsonNode node : jsonNode) { + int billId = insertMainTable(node, mainTableName, relatedField, fieldDetailList, mainTableFieldMap); + if (billId < 0) { + continue; + } + tableIdList.add(billId); + dealDetailData(rootNode, billId, childDataConfigList, formFieldList); + dealFileList(billId, fileList, mainTableName, false); + } + } + + /** + * 处理单节点数据 + * + * @param rootNode + * @param mainTableName + * @param relatedField + * @param fieldDetailList + * @param mainTableFieldMap + * @param childDataConfigList + * @param formFieldList + * @param fileList + * @param rootPath + * @throws Exception + */ + private void processSingleRootPath(JsonNode rootNode, String mainTableName, String relatedField, + List fieldDetailList, Map mainTableFieldMap, + List childDataConfigList, List formFieldList, + List fileList, String rootPath) throws Exception { + JsonNode jsonNode = rootNode.at(rootPath); + int billId = insertMainTable(jsonNode, mainTableName, relatedField, fieldDetailList, mainTableFieldMap); + if (billId < 0) { + return; + } + getTableIdList(mainTableName).add(billId); + dealDetailData(rootNode, billId, childDataConfigList, formFieldList); + dealFileList(billId, fileList, mainTableName, false); + } + + /** + * 处理完整节点数据 + * + * @param rootNode + * @param mainTableName + * @param relatedField + * @param fieldDetailList + * @param mainTableFieldMap + * @param childDataConfigList + * @param formFieldList + * @param fileList + * @throws Exception + */ + private void processRootNode(JsonNode rootNode, String mainTableName, String relatedField, + List fieldDetailList, Map mainTableFieldMap, + List childDataConfigList, List formFieldList, + List fileList) throws Exception { + + int billId = insertMainTable(rootNode, mainTableName, relatedField, fieldDetailList, mainTableFieldMap); + if (billId < 0) { + return; + } + getTableIdList(mainTableName).add(billId); + dealDetailData(rootNode, billId, childDataConfigList, formFieldList); + dealFileList(billId, fileList, mainTableName, false); + } + + /** + * 处理明细表数据 + * + * @param rootNode + * @param mainId + * @param childDataConfigList + * @param formFieldList + * @throws Exception + */ + private void dealDetailData(JsonNode rootNode, int mainId, List childDataConfigList, + List formFieldList) throws Exception { + if (CollectionUtils.isEmpty(childDataConfigList)) { + return; + } + + for (DataConfig childDataConfig : childDataConfigList) { + String detailTableName = childDataConfig.getDetailTableName(); + Map detailTableFieldMap = formFieldList.stream() + .filter(item -> detailTableName.equals(item.getDetailtable())) + .collect(Collectors.toMap(Formfield::getFieldname, + item -> item, (k1, k2) -> k1)); + + List fieldList = childDataConfig.getDetailList(); + List fileList = childDataConfig.getFileList(); + + if (CollectionUtils.isNotEmpty(fileList)) { + baseBean.writeLog("开始解析文件,写入明细数据"); + dealFileList(mainId, fileList, detailTableName, true); + } else { + processDetailRootPath(rootNode, detailTableName, mainId, fieldList, detailTableFieldMap, + childDataConfig.getRootPath()); + } + } + } + + /** + * 根据明细表根路径配置,判断处理方式 + * + * @param rootNode + * @param detailTableName + * @param mainId + * @param fieldList + * @param detailTableFieldMap + * @param rootPath + * @throws Exception + */ + private void processDetailRootPath(JsonNode rootNode, String detailTableName, int mainId, + List fieldList, Map detailTableFieldMap, + String rootPath) throws Exception { + if (StringUtils.isNotBlank(rootPath)) { + if (rootPath.contains("[*]")) { + processDetailArrayRootPath(rootNode, detailTableName, mainId, fieldList, + detailTableFieldMap, rootPath); + } else { + processDetailSingleRootPath(rootNode, detailTableName, mainId, fieldList, + detailTableFieldMap, rootPath); + } + } else { + insertDetailTable(rootNode, detailTableName, mainId, fieldList, detailTableFieldMap); + } + } + + /** + * 处理明细表数据数据 + * + * @param rootNode + * @param detailTableName + * @param mainId + * @param fieldList + * @param detailTableFieldMap + * @param rootPath + * @throws Exception + */ + private void processDetailArrayRootPath(JsonNode rootNode, String detailTableName, int mainId, + List fieldList, Map detailTableFieldMap, + String rootPath) throws Exception { + String path = rootPath.replace("[*]", ""); + JsonNode jsonNode = rootNode.at(path); + + if (jsonNode == null) { + throw new CustomizeRunTimeException("数据解析失败,未找到对应字段:[" + path + "]"); + } + if (!jsonNode.isArray()) { + throw new CustomizeRunTimeException("数据解析失败,未找到对应字段集合:[" + path + "]"); + } + + for (JsonNode node : jsonNode) { + insertDetailTable(node, detailTableName, mainId, fieldList, detailTableFieldMap); + } + } + + /** + * 处理明细表单节点数据 + * + * @param rootNode + * @param detailTableName + * @param mainId + * @param fieldList + * @param detailTableFieldMap + * @param rootPath + * @throws Exception + */ + private void processDetailSingleRootPath(JsonNode rootNode, String detailTableName, int mainId, + List fieldList, Map detailTableFieldMap, + String rootPath) throws Exception { + JsonNode jsonNode = rootNode.at(rootPath); + insertDetailTable(jsonNode, detailTableName, mainId, fieldList, detailTableFieldMap); + } + + /** + * 插入主表数据 + * + * @param jsonNode + * @param mainTableName + * @param relatedField + * @param fieldList + * @param mainTableFieldMap + * @return + * @throws Exception + */ + private int insertMainTable(JsonNode jsonNode, String mainTableName, String relatedField, + List fieldList, Map mainTableFieldMap) throws Exception { + Map insertMap = new IgnoreCaseHashMap<>(); + + for (DataConfigDetail fieldDetail : fieldList) { + processFieldForInsert(jsonNode, insertMap, fieldDetail, mainTableFieldMap); + } + + if (insertMap.isEmpty()) { + return -1; + } + + if (StringUtils.isNotBlank(relatedField)) { + insertMap.put(relatedField, relatedFlowId); + } + + String uuid = UUID.randomUUID().toString(); + insertMap.put("modeuuid", uuid); + int formModeId = ModeUtil.getModeIdByTableName(mainTableName); + insertMap.put("formmodeid", formModeId); + + ModeUtil.buildModeInsertFields(insertMap, user.getUID()); + baseBean.writeLog("insertMainTable: " + JSON.toJSONString(insertMap)); + + ModeUtil.insertData(insertMap, mainTableName); + return ModeUtil.refreshRight(uuid, mainTableName, formModeId, user.getUID()); + } + + /** + * 构建待插入数据的字段集合 + * + * @param jsonNode + * @param insertMap + * @param fieldDetail + * @param fieldMap + * @throws Exception + */ + private boolean processFieldForInsert(JsonNode jsonNode, Map insertMap, + DataConfigDetail fieldDetail, Map fieldMap) throws Exception { + String fieldName = fieldDetail.getFieldName(); + JsonNode atNode = jsonNode.at(fieldDetail.getPath()); + + if (atNode != null) { + String value = atNode.asText(); + if (StringUtils.isNotBlank(fieldDetail.getCondition()) && !value.equals(fieldDetail.getCondition())) { + return true; + } + + Formfield formfield = fieldMap.get(fieldName.toLowerCase()); + if (formfield == null) { + return false; + } + + Object reallyValue = getFieldValue(fieldDetail, value, formfield); + insertMap.put(fieldName, reallyValue); + } + return false; + } + + /** + * 构建待校验数据的字段集合 + * + * @param jsonNode + * @param fieldDetail + * @param fieldMap + * @return + * @throws Exception + */ + private boolean processFieldForCheck(JsonNode jsonNode, DataConfigDetail fieldDetail, Map fieldMap,String flowData) throws Exception { + String fieldName = fieldDetail.getFieldName(); + JsonNode atNode = jsonNode.at(fieldDetail.getPath()); + + if (atNode != null) { + String value = atNode.asText(); + if (StringUtils.isNotBlank(fieldDetail.getCondition()) && !value.equals(fieldDetail.getCondition())) { + return false; + } + + Formfield formfield = fieldMap.get(fieldName.toLowerCase()); + if (formfield == null) { + return false; + } + + return flowData.equals(Util.null2String(getFieldValue(fieldDetail, value, formfield))); + } + return false; + } + + /** + * 字段值转换,转换为数据库中对应的实际值 + * + * @param fieldDetail + * @param value + * @param formfield + * @return + * @throws Exception + */ + private Object getFieldValue(DataConfigDetail fieldDetail, String value, Formfield formfield) throws Exception { + if (StringUtils.isNotBlank(fieldDetail.getConvertSql())) { + return FieldConvertUtil.executeConvertSql(fieldDetail.getConvertSql(), value); + } + return FieldConvertUtil.getReallyValue(formfield, value); + } + + /** + * 插入明细表数据 + * + * @param jsonNode + * @param detailTableName + * @param mainId + * @param fieldList + * @param detailTableFieldMap + * @throws Exception + */ + private void insertDetailTable(JsonNode jsonNode, String detailTableName, int mainId, + List fieldList, Map detailTableFieldMap) throws Exception { + Map insertMap = new IgnoreCaseHashMap<>(); + + for (DataConfigDetail fieldDetail : fieldList) { + boolean isReturn = processFieldForInsert(jsonNode, insertMap, fieldDetail, detailTableFieldMap); + if (isReturn) { + return; + } + } + + if (insertMap.isEmpty()) { + return; + } + + insertMap.put("mainId", mainId); + baseBean.writeLog("insertDetailTable: " + JSON.toJSONString(insertMap)); + ModeUtil.insertData(insertMap, detailTableName); + } + + /** + * 处理文件列表 + * + * @param mainId + * @param fileConfigList + * @param tableName + * @param isDetail + * @throws Exception + */ + private void dealFileList(int mainId, List fileConfigList, String tableName, boolean isDetail) throws + Exception { + Map dataMap = new IgnoreCaseHashMap<>(); + Map defaultDataMap = new IgnoreCaseHashMap<>(); + + for (FileConfig fileConfig : fileConfigList) { + processFileConfig(fileConfig, dataMap, defaultDataMap); + } + + if (dataMap.isEmpty()) { + baseBean.writeLog("dataMap集合为空"); + return; + } + + dataMap.putAll(defaultDataMap); + baseBean.writeLog("文件插入集合,dataMap==" + JSON.toJSONString(dataMap)); + + if (isDetail) { + dataMap.put("mainid", mainId); + ModeUtil.insertData(dataMap, tableName); + } else { + dataMap.put("id", mainId); + ModeUtil.updateDataById(dataMap, tableName); + } + } + + /** + * 根据文件配置,构建数据集合 + * + * @param fileConfig + * @param dataMap + * @param defaultDataMap + * @throws Exception + */ + private void processFileConfig(FileConfig fileConfig, Map dataMap, + Map defaultDataMap) throws Exception { + String fieldName = fileConfig.getFieldName(); + String isFilled = fileConfig.getIsFilled(); + + if ("2".equals(isFilled)) { + return; + } + + String fileId = fileConfig.getFileId(); + String fixedValue = fileConfig.getFixedValue(); + String attachments = fileConfig.getAttachments(); + + if (StringUtils.isNotBlank(fixedValue)) { + defaultDataMap.put(fieldName, fixedValue); + return; + } + + if (StringUtils.isNotBlank(attachments)) { + defaultDataMap.put(fieldName, attachments); + return; + } + + List applicationResources = applicationResourceMap.get(fileId); + if (CollectionUtils.isEmpty(applicationResources)) { + baseBean.writeLog("根据fid未获取到数据,fileId==" + fileId); + return; + } + + Map fileResourceMap = resourceInfoMap.get(isFilled); + if (fileResourceMap == null || fileResourceMap.isEmpty()) { + baseBean.writeLog("根据文件类型未获取到数据,isFilled==" + isFilled); + return; + } + + List docIds = processFileResources(applicationResources, fileResourceMap); + if (!docIds.isEmpty()) { + dataMap.put(fieldName, StringUtils.join(docIds, ",")); + } + } + + /** + * 获取配置主项 + * + * @param type + * @return + */ + private List getDataConfig(String type) { + List dataConfigList = new ArrayList<>(); + RecordSet rs = new RecordSet(); + rs.executeQuery("select * from " + QualificationApplicationServiceImpl.CONFIG_TABLE_NAME + " where main_table is not null and source_type = ?", type); + + while (rs.next()) { + DataConfig dataConfig = buildDataConfig(rs); + dataConfig.setDetailList(getDetailList(dataConfig.getId())); + dataConfig.setFileList(getFileList(dataConfig.getId())); + + String detailTableName = dataConfig.getDetailTableName(); + if (StringUtils.isNotBlank(detailTableName)) { + dataConfig.setChildDataConfig(getChildDataConfig(detailTableName, type)); + } + + dataConfigList.add(dataConfig); + } + return dataConfigList; + } + + /** + * 构建DataConfig对象 + * + * @param rs + * @return + * @throws RuntimeException + */ + private DataConfig buildDataConfig(RecordSet rs) throws RuntimeException { + DataConfig dataConfig = new DataConfig(); + dataConfig.setId(rs.getString("id")); + dataConfig.setMainTableName(rs.getString("main_table")); + dataConfig.setRelatedField(rs.getString("related_field")); + dataConfig.setDetailTableName(rs.getString("detail_tables")); + dataConfig.setRootPath(rs.getString("root_path")); + return dataConfig; + } + + /** + * 构建明细表配置项集合 + * + * @param detailTableName + * @param type + * @return + */ + private List getChildDataConfig(String detailTableName, String type) { + String[] detailNameArray = detailTableName.split(","); + List dataConfigList = new ArrayList<>(); + + for (String dtName : detailNameArray) { + RecordSet rs = new RecordSet(); + rs.executeQuery("select * from " + QualificationApplicationServiceImpl.CONFIG_TABLE_NAME + " where main_table is null and detail_tables = ? and source_type = ?", dtName, type); + + while (rs.next()) { + DataConfig dataConfig = new DataConfig(); + dataConfig.setId(rs.getString("id")); + dataConfig.setDetailTableName(rs.getString("detail_tables")); + dataConfig.setRootPath(rs.getString("root_path")); + dataConfig.setDetailList(getDetailList(dataConfig.getId())); + dataConfig.setFileList(getFileList(dataConfig.getId())); + dataConfigList.add(dataConfig); + } + } + return dataConfigList; + } + + /** + * 获取字段配置对照关系集合 + * + * @param mainId + * @return + */ + private List getDetailList(String mainId) { + List detailList = new ArrayList<>(); + RecordSet rs = new RecordSet(); + rs.executeQuery("select * from " + QualificationApplicationServiceImpl.CONFIG_DETAIL_TABLE_NAME + " where mainId = ?", mainId); + + while (rs.next()) { + detailList.add(DataConfigDetail.builder() + .fieldName(rs.getString("field_name")) + .path(rs.getString("config_path")) + .condition(rs.getString("conditions")) + .convertSql(rs.getString("convert_sql")) + .build()); + } + return detailList; + } + + /** + * 获取文件配置对照关系集合 + * + * @param mainId + * @return + */ + private List getFileList(String mainId) { + List fileList = new ArrayList<>(); + RecordSet rs = new RecordSet(); + rs.executeQuery("select * from " + QualificationApplicationServiceImpl.FILE_DETAIL_TABLE_NAME + " where mainId = ?", mainId); + + while (rs.next()) { + fileList.add(FileConfig.builder() + .fieldName(rs.getString("field_name")) + .fileId(rs.getString("file_id")) + .isFilled(rs.getString("file_type")) + .fixedValue(rs.getString("fixed_value")) + .attachments(rs.getString("attachments")) + .build()); + } + return fileList; + } + + /** + * 解析配置文件爱你,构建ApplicationResource集合 + * + * @param rootNode + * @return + */ + private List getApplicationResourceList(JsonNode rootNode) { + List applicationResourceList = new ArrayList<>(); + JsonNode applicationResourceListNode = rootNode.at("/applicationResourceList"); + + if (applicationResourceListNode != null && applicationResourceListNode.isArray()) { + for (JsonNode jsonNode : applicationResourceListNode) { + applicationResourceList.add(ApplicationResource.builder() + .id(jsonNode.at("/id").asText()) + .aid(jsonNode.at("/aid").asText()) + .fid(jsonNode.at("/fid").asText()) + .rid(jsonNode.at("/rid").asText()) + .createdTime(jsonNode.at("/createdTime").asText()) + .isDelete(jsonNode.at("/isDelete").asText()) + .build()); + } + } + return applicationResourceList; + } + + + /** + * 解析配置文件爱你,构建ResourceInfo集合 + * + * @param rootNode + * @return + */ + private List getResourceInfoList(JsonNode rootNode) { + List resourceInfoList = new ArrayList<>(); + JsonNode resourceInfoListNode = rootNode.at("/resourceInfoList"); + + if (resourceInfoListNode != null && resourceInfoListNode.isArray()) { + for (JsonNode jsonNode : resourceInfoListNode) { + resourceInfoList.add(ResourceInfo.builder() + .id(jsonNode.at("/id").asText()) + .fileName(jsonNode.at("/fileName").asText()) + .filePath(jsonNode.at("/filePath").asText()) + .fileSuffix(jsonNode.at("/fileSuffix").asText()) + .virtualPath(jsonNode.at("/virtualPath").asText()) + .createdTime(jsonNode.at("/createdTime").asText()) + .updatedTime(jsonNode.at("/updatedTime").asText()) + .isDelete(jsonNode.at("/isDelete").asText()) + .build()); + } + } + return resourceInfoList; + } + + + /** + * 上传文件,生成imageFileId + * + * @param zipFile + * @param header + * @param fileName + * @return + */ + private int generateImageFileId(ZipFile zipFile, FileHeader header, String fileName) { + try (InputStream is = zipFile.getInputStream(header)) { + return ModeUtil.generateImageFileId(is, fileName); + } catch (Exception e) { + throw new CustomizeRunTimeException(e); + } + } + + + /** + * 获取主表的ID集合 + * + * @param mainTableName + * @return + */ + private Set getTableIdList(String mainTableName) { + return insertTableMap.computeIfAbsent(mainTableName, k -> ConcurrentHashMap.newKeySet()); + + } +} \ No newline at end of file diff --git a/src/com/engine/secret/service/impl/QualificationApplicationServiceImpl.java b/src/com/engine/secret/service/impl/QualificationApplicationServiceImpl.java new file mode 100644 index 0000000..a865c26 --- /dev/null +++ b/src/com/engine/secret/service/impl/QualificationApplicationServiceImpl.java @@ -0,0 +1,239 @@ +package com.engine.secret.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; +import com.engine.common.util.ServiceUtil; +import com.engine.core.impl.Service; +import com.engine.secret.entity.unpack.CheckFields; +import com.engine.secret.entity.unpack.UnpackParam; +import com.engine.secret.exception.CustomizeRunTimeException; +import com.engine.secret.service.QualificationApplicationService; +import com.engine.secret.util.ConfigUtil; +import com.engine.secret.util.ModeUtil; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.wbi.util.Util; +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.model.FileHeader; +import org.apache.commons.lang.StringUtils; +import weaver.docs.docs.DocImageManager; +import weaver.file.ImageFileManager; +import weaver.general.BaseBean; +import weaver.general.GCONST; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2024/08/29 + * @version: 1.0 + */ +public class QualificationApplicationServiceImpl extends Service implements QualificationApplicationService { + + + public static final String CONFIG_TABLE_NAME = "uf_config_package"; + public static final String CONFIG_DETAIL_TABLE_NAME = "uf_config_package_dt1"; + public static final String FILE_DETAIL_TABLE_NAME = "uf_config_package_dt2"; + + BaseBean baseBean = new BaseBean(); + + Map fileHeaderMap; + + + @Override + public Map parsingFiles(Map param) { + try { + Map returnMap; + + String docId = Util.null2String(param.get("docId")); + String requestId = Util.null2String(param.get("requestId")); + String isCorrection = Util.null2String(param.get("isCorrection")); + String checkFields = Util.null2String(param.get("checkFields")); + if (StringUtils.isBlank(docId)) { + throw new CustomizeRunTimeException("文件获取失败,请确认文件是否上传"); + } + baseBean.writeLog("docId==" + docId); + + if (StringUtils.isBlank(requestId)) { + throw new CustomizeRunTimeException("流程关联失败,未获取到流程ID,请保存后重试"); + } + + baseBean.writeLog("requestId==" + requestId); + List checkFieldsList = new ArrayList<>(); + if (StringUtils.isNotBlank(checkFields)) { + checkFieldsList = JSON.parseObject(checkFields, new TypeReference>() {}); + } + + UnpackParam unpackParam = UnpackParam.builder() + .docId(docId) + .requestId(requestId) + .isCorrection(Boolean.parseBoolean(isCorrection)) + .checkFields(checkFieldsList) + .build(); + + + // docId 转为换imageFileId + DocImageManager imgManger = new DocImageManager(); + imgManger.setDocid(Integer.parseInt(docId)); + imgManger.selectDocImageInfo(); + imgManger.next(); + String imageFileId = imgManger.getImagefileid(); + baseBean.writeLog("imageFileId==" + imageFileId); + if (StringUtils.isBlank(imageFileId) || "-1".equals(imageFileId)) { + throw new CustomizeRunTimeException("文件获取失败,请确认文件是否上传,imageFileId=[" + imageFileId + "]"); + } + + + // 初始化配置 + String unzipPwd = ConfigUtil.getConfig("UNZIP_PWD"); + baseBean.writeLog("unzipPwd==" + unzipPwd); + + + // 根据文件id获取文件流 + ImageFileManager manager = new ImageFileManager(); + manager.getImageFileInfoById(Integer.parseInt(imageFileId)); + manager.getImageFileName(); + InputStream inputStream = manager.getInputStream(); + + Path fixedDir = Paths.get(GCONST.getRootPath() + "filesystem" + File.separatorChar + "downloadBatchTemp"); + Files.createDirectories(fixedDir); + Path tempZipFile = Files.createTempFile(fixedDir, "offline_temp_", ".zip"); + baseBean.writeLog("tempZipFile==" + tempZipFile.toString()); + Files.copy(inputStream, tempZipFile, StandardCopyOption.REPLACE_EXISTING); + + //解压文件,处理压缩包 + baseBean.writeLog("开始解压文件,处理压缩包"); + returnMap = unzipWithPassword(tempZipFile, Paths.get("output"), unzipPwd, unpackParam); + baseBean.writeLog("压缩包处理完成"); + return returnMap; + } catch (Exception e) { + baseBean.writeLog(e); + throw new CustomizeRunTimeException(e.getMessage(), e); + } + } + + @Override + public Map deleteParsedData(Map param) { + return ServiceUtil.getService(OfflineZipUnpackServiceImpl.class, user).deleteParsedData(param); + } + + /** + * 解压ZIP文件 + * + * @param zipFilePath + * @param outputDir + * @param password + */ + private Map unzipWithPassword(Path zipFilePath, Path outputDir, String password, UnpackParam unpackParam) { + try { + ZipFile zipFile = new ZipFile(zipFilePath.toFile()); + if (zipFile.isEncrypted()) { + zipFile.setPassword(password.toCharArray()); + } + // 遍历并解压所有文件 + zipFile.extractAll(outputDir.toString()); + baseBean.writeLog("已解压所有文件"); + + // 遍历 ZIP 内文件(可选) + List fileHeaders = zipFile.getFileHeaders(); + + //imageFileMap = new HashMap<>(); + fileHeaderMap = new HashMap<>(); + for (FileHeader header : fileHeaders) { + if (header.isDirectory()) { + continue; + } + String fullPath = header.getFileName(); + int lastSlashIndex = fullPath.lastIndexOf('/'); + String fileName = (lastSlashIndex != -1) + ? fullPath.substring(lastSlashIndex + 1) + : fullPath; + fileHeaderMap.put(fileName, header); + } + + + baseBean.writeLog("fileHeaders.size==" + fileHeaders.size()); + baseBean.writeLog("fileHeaderMap.size==" + fileHeaderMap.size()); + baseBean.writeLog("fileHeaderMap==" + JSON.toJSONString(fileHeaderMap)); + + + // 获取数据文件,用于后续数据解析 + String jsonFileName = "(database)data.json"; + if (unpackParam.isCorrection()) { + jsonFileName = "(extra)data.json"; + } + FileHeader fileHeader = fileHeaderMap.get(jsonFileName); + int dataJsonImageId = generateImageFileId(zipFile, fileHeader, jsonFileName); + + if (dataJsonImageId > 0) { + // 离线端方式 + JsonNode rootNode = parseJsonContent(dataJsonImageId); + OfflineZipUnpackServiceImpl offlineZipUnpackService = ServiceUtil.getService(OfflineZipUnpackServiceImpl.class, user); + if (unpackParam.isCorrection()) { + return offlineZipUnpackService.reviewResubmittedMaterials(zipFile, unpackParam.getRequestId(), rootNode, fileHeaderMap); + } + return offlineZipUnpackService.registerAcceptance(zipFile, unpackParam, rootNode, fileHeaderMap); + } + + // TODO 兼容其他方式 + + return new HashMap<>(); + + } catch (Exception e) { + if (e.getMessage().contains("Wrong password")) { + throw new CustomizeRunTimeException("数据包解压失败,密码错误"); + } else { + baseBean.writeLog(e); + throw new CustomizeRunTimeException(e.getMessage(), e); + } + } finally { + try { + Files.deleteIfExists(zipFilePath); + } catch (IOException e) { + baseBean.writeLog(e); + } + } + } + + + /** + * 获取JSON文件内容 + * + * @param imageFieldId + * @return + * @throws IOException + */ + private static JsonNode parseJsonContent(Integer imageFieldId) throws IOException { + ImageFileManager manager = new ImageFileManager(); + manager.getImageFileInfoById(imageFieldId); + InputStream inputStream = manager.getInputStream(); + ObjectMapper mapper = new ObjectMapper(); + return mapper.readTree(inputStream); + } + + /** + * 上传文件 返回imageFileId + * + * @param zipFile + * @param header + * @return + */ + private int generateImageFileId(ZipFile zipFile, FileHeader header, String fileName) { + try (InputStream is = zipFile.getInputStream(header)) { + return ModeUtil.generateImageFileId(is, fileName); + } catch (Exception e) { + throw new CustomizeRunTimeException(e); + } + } + +} diff --git a/src/com/engine/secret/util/ConfigUtil.java b/src/com/engine/secret/util/ConfigUtil.java new file mode 100644 index 0000000..30f830d --- /dev/null +++ b/src/com/engine/secret/util/ConfigUtil.java @@ -0,0 +1,24 @@ +package com.engine.secret.util; + +import org.apache.commons.lang.StringUtils; +import weaver.conn.RecordSet; + +/** + * @author:dxfeng + * @createTime: 2025/03/31 + * @version: 1.0 + */ +public class ConfigUtil { + public static String getConfig(String name) { + if (StringUtils.isBlank(name)) { + return ""; + } + RecordSet rs = new RecordSet(); + rs.executeQuery("select value from uf_config where name = ?",name.trim()); + if(rs.next()){ + return rs.getString("value").trim(); + } + return ""; + } + +} diff --git a/src/com/engine/secret/util/ExceptionUtil.java b/src/com/engine/secret/util/ExceptionUtil.java new file mode 100644 index 0000000..acf11da --- /dev/null +++ b/src/com/engine/secret/util/ExceptionUtil.java @@ -0,0 +1,20 @@ +package com.engine.secret.util; + +/** + * @Author weaver_cl + * @Description: + * @Date 2023/2/21 + * @Version V1.0 + **/ +public class ExceptionUtil { + public static String getRealMessage(Throwable e) { + while (e != null) { + Throwable cause = e.getCause(); + if (cause == null) { + return e.getMessage(); + } + e = cause; + } + return ""; + } +} diff --git a/src/com/engine/secret/util/FieldConvertUtil.java b/src/com/engine/secret/util/FieldConvertUtil.java new file mode 100644 index 0000000..c051ee4 --- /dev/null +++ b/src/com/engine/secret/util/FieldConvertUtil.java @@ -0,0 +1,166 @@ +package com.engine.secret.util; + +import com.weaver.formmodel.data.model.Formfield; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.validator.GenericValidator; +import weaver.conn.RecordSet; +import weaver.general.Util; +import weaver.hrm.definedfield.HrmFieldManager; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/** + * @author:dxfeng + * @createTime: 2025/04/02 + * @version: 1.0 + */ +public class FieldConvertUtil { + + /** + * 转换存入数据库的值 + * + * @param formfield + * @param value + * @return + * @throws Exception + */ + public static Object getReallyValue(Formfield formfield, String value) throws Exception { + if (StringUtils.isBlank(value)) { + return null; + } + RecordSet rs = new RecordSet(); + Object object = null; + String type = Util.null2String(formfield.getType()); + switch (formfield.getFieldhtmltype()) { + case "1": + // INPUT + if ("2".equals(type)) { + object = new BigDecimal(value).intValue(); + } else if ("3".equals(type)) { + object = new BigDecimal(value).floatValue(); + } else if ("1".equals(type)) { + object = value; + } else { + try { + object = new BigDecimal(value).toPlainString(); + } catch (NumberFormatException ignore) { + object = value; + } + } + break; + case "3": + // BROWSER + org.json.JSONObject jsonObject = new org.json.JSONObject(); + jsonObject.put("fieldhtmltype", formfield.getFieldhtmltype()); + jsonObject.put("type", type); + jsonObject.put("fieldvalue", value); + if ("161".equals(type) || "162".equals(type)) { + jsonObject.put("dmlurl", formfield.getFielddbtype()); + } else { + jsonObject.put("dmlurl", type); + } + + jsonObject.put("fieldid", 0); + object = HrmFieldManager.getReallyFieldvalue(jsonObject); + // 如果是日期,校验日期的合法性 + if ("2".equals(type)) { + boolean isDate = GenericValidator.isDate(Util.null2String(object), "yyyy-MM-dd", true); + if (!isDate) { + rs.writeLog("日期格式校验失败,object==" + Util.null2String(object)); + object = ""; + } + } + break; + case "5": + // 区分单选、复选、下拉框 + switch (type) { + case "1": + case "3": + // 下拉框、单选框 + object = ModeUtil.getSelectValue(formfield, value); + if (StringUtils.isBlank(Util.null2String(object))) { + if (isNumberOrCommaSeparatedNumbers(value)) { + object = value; + } + } + break; + case "2": + if (StringUtils.isNotBlank(value)) { + List selectValues = new ArrayList<>(); + // 兼容分隔符 + String separator = ","; + if (value.contains("、")) { + separator = "、"; + } + String[] split = value.split(separator); + for (String s : split) { + selectValues.add(ModeUtil.getSelectValue(formfield, s)); + } + object = StringUtils.join(selectValues, ","); + if (StringUtils.isBlank(Util.null2String(object))) { + if (isNumberOrCommaSeparatedNumbers(value)) { + object = value; + } + } + } + break; + default: + break; + } + + break; + case "4": + // CHECKBOX + case "6": + // FILEUPLOAD + break; + case "7": + // TEXT + case "2": + // TEXTAREA + default: + object = value; + break; + } + return object; + } + + + /** + * 执行转换SQL + * + * @param convertSql + * @param value + * @return + */ + public static String executeConvertSql(String convertSql, String value) { + RecordSet rs = new RecordSet(); + value = Util.null2String(value); + long count = convertSql.chars().filter(c -> c == '?').count(); + List paramsList = new ArrayList<>(); + for (int i = 0; i < count; i++) { + paramsList.add(value); + } + rs.executeQuery(convertSql, paramsList); + if (rs.next()) { + return rs.getString(1); + } + return ""; + } + + + /** + * 校验字符串是否为纯数字或逗号分隔的数字 + * + * @param str + * @return + */ + public static boolean isNumberOrCommaSeparatedNumbers(String str) { + // 正则表达式匹配纯数字或逗号分隔的数字 + // 允许前后有空格,数字之间用逗号分隔 + String regex = "^\\s*\\d+(\\s*,\\s*\\d+)*\\s*$"; + return str.matches(regex); + } +} diff --git a/src/com/engine/secret/util/FlowUtil.java b/src/com/engine/secret/util/FlowUtil.java new file mode 100644 index 0000000..aac67bb --- /dev/null +++ b/src/com/engine/secret/util/FlowUtil.java @@ -0,0 +1,81 @@ +package com.engine.secret.util; + +import com.alibaba.fastjson.JSON; +import weaver.conn.RecordSet; +import weaver.general.BaseBean; +import weaver.general.Util; +import weaver.workflow.webservices.WorkflowRequestInfo; +import weaver.workflow.webservices.WorkflowServiceImpl; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author:dxfeng + * @createTime: 2025/04/09 + * @version: 1.0 + */ +public class FlowUtil { + + /** + * 根据流程请求ID,获取对应流程的表名 + * + * @param requestId + * @return + */ + public static String getTableNameByRequestId(String requestId) { + RecordSet rs = new RecordSet(); + rs.executeQuery("select a.tablename from workflow_bill a join workflow_base b on a.id = b.formid where b.id = ( select workflowid from workflow_requestbase where requestid = ?)", requestId); + if (rs.next()) { + return rs.getString("tablename"); + } + return ""; + } + + + /** + * 获取流程的当前处理人 + * + * @param requestId + * @return + */ + public static List getCurrentUserIds(String requestId) { + RecordSet rs = new RecordSet(); + String sql = "select * from workflow_currentoperator where isremark = '0' and usertype = 0 and requestid=? order by id asc"; + List currentUserIds = new ArrayList(); + rs.executeQuery(sql, requestId); + while (rs.next()) { + currentUserIds.add(Util.getIntValue(Util.null2String(rs.getString("userid")))); + } + return currentUserIds; + } + + + /** + * 提交流程到下一节点 + * + * @param requestId + * @param creator + * @param opinions + * @return + */ + public static String submitWorkflowRequest(String requestId, int creator, String opinions) { + BaseBean bean = new BaseBean(); + WorkflowServiceImpl workflowService = new WorkflowServiceImpl(); + WorkflowRequestInfo wri = workflowService.getWorkflowRequest(Util.getIntValue(requestId, 0), creator, 0); + bean.writeLog("wri==" + JSON.toJSONString(wri)); + return workflowService.submitWorkflowRequest(wri, Util.getIntValue(requestId, 0), creator, "submit", opinions); + } + + /** + * 提交流程到下一节点(机器人节点) + * + * @param requestId + * @param opinions + * @return + */ + public static String submitWorkflowRequest(String requestId, String opinions) { + WorkflowServiceImpl workflowService = new WorkflowServiceImpl(); + return workflowService.submitWorkflowRequest(null, Util.getIntValue(requestId, 0), 0, "submit", opinions); + } +} diff --git a/src/com/engine/secret/util/ModeUtil.java b/src/com/engine/secret/util/ModeUtil.java new file mode 100644 index 0000000..d9491d4 --- /dev/null +++ b/src/com/engine/secret/util/ModeUtil.java @@ -0,0 +1,480 @@ +package com.engine.secret.util; + +import com.engine.secret.exception.CustomizeRunTimeException; +import com.weaver.formmodel.data.manager.FormInfoManager; +import com.weaver.formmodel.data.model.Formfield; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.util.IOUtils; +import weaver.common.DateUtil; +import weaver.conn.RecordSet; +import weaver.conn.RecordSetTrans; +import weaver.docs.docs.*; +import weaver.file.ImageFileManager; +import weaver.formmode.IgnoreCaseHashMap; +import weaver.formmode.setup.ModeRightInfo; +import weaver.general.TimeUtil; +import weaver.general.Util; +import weaver.hrm.User; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * @author:dxfeng + * @createTime: 2025/03/26 + * @version: 1.0 + */ +public class ModeUtil { + + /** + * 生成附件ID + * + * @param inputStream + * @param filename + * @return + */ + public static int generateImageFileId(InputStream inputStream, String filename) { + int imageFileId; + try { + byte[] bytes = IOUtils.toByteArray(inputStream); + ImageFileManager ifm = new ImageFileManager(); + ifm.setData(bytes); + ifm.setImagFileName(filename); + imageFileId = ifm.saveImageFile(); + } catch (IOException e) { + throw new RuntimeException(e); + } + return imageFileId; + } + + /** + * 附件imageFieldId生成docId + * + * @param secCategory + * @param imageFieldId + * @param user + * @return + * @throws Exception + */ + public static int createDocId(int secCategory, int imageFieldId, User user) throws Exception { + ImageFileManager manager = new ImageFileManager(); + manager.getImageFileInfoById(imageFieldId); + String filenameqc = manager.getImageFileName(); + String filenamebc = filenameqc.substring(0, filenameqc.lastIndexOf(".")); + RecordSet rs = new RecordSet(); + DocManager dm = new DocManager(); + DocImageManager imgManger = new DocImageManager(); + + imgManger.setDocfiletype("2"); + + int docId = dm.getNextDocId(rs); + imgManger.setDocid(docId); + imgManger.setImagefileid(imageFieldId); + imgManger.setImagefilename(filenameqc); + imgManger.setIsextfile("1"); + imgManger.AddDocImageInfo(); + + String date = TimeUtil.getCurrentDateString(); + String time = TimeUtil.getOnlyCurrentTimeString(); + dm.setId(docId); + dm.setMaincategory(0); + dm.setSubcategory(0); + dm.setSeccategory(secCategory); + dm.setLanguageid(user.getLanguage()); + + dm.setDocstatus("1"); + dm.setDocsubject(filenamebc); + dm.setDoccreaterid(user.getUID()); + dm.setDocCreaterType(user.getLogintype()); + dm.setUsertype(user.getLogintype()); + dm.setOwnerid(user.getUID()); + dm.setOwnerType(user.getLogintype()); + dm.setDoclastmoduserid(user.getUID()); + dm.setDocLastModUserType(user.getLogintype()); + dm.setDoccreatedate(date); + dm.setDoclastmoddate(date); + dm.setDoccreatetime(time); + dm.setDoclastmodtime(time); + dm.setDoclangurage(user.getLanguage()); + dm.setKeyword(filenameqc); + dm.setIsapprover("0"); + dm.setIsreply(""); + dm.setDocdepartmentid(user.getUserDepartment()); + dm.setDocreplyable("1"); + dm.setAccessorycount(1); + dm.setParentids("" + docId); + dm.setUserid(user.getUID()); + DocCoder docCoder = new DocCoder(); + dm.setDocCode(docCoder.getDocCoder("" + secCategory)); + dm.setDocEditionId(dm.getNextEditionId(rs)); + dm.setDocEdition(1); + dm.AddDocInfo(); + dm.AddShareInfo(); + DocViewer DocViewer = new DocViewer(); + DocViewer.setDocShareByDoc("" + docId); + DocComInfo dc = new DocComInfo(); + dc.addDocInfoCache("" + docId); + return docId; + } + + /** + * 获取单个记录映射 + * + * @param rs RecordSet + * @return + */ + public static IgnoreCaseHashMap getSingleRecordMap(RecordSet rs) { + IgnoreCaseHashMap dataMap = new IgnoreCaseHashMap<>(); + if (rs.next()) { + String[] columnNames = rs.getColumnName(); + for (String columnName : columnNames) { + dataMap.put(columnName, parseBlankToNull(rs.getString(columnName))); + } + } + return dataMap; + } + + public static List> getRecordMapList(RecordSet rs) { + List> list = new ArrayList<>(); + while (rs.next()) { + String[] columnNames = rs.getColumnName(); + Map dataMap = new IgnoreCaseHashMap<>(); + for (String columnName : columnNames) { + dataMap.put(columnName.toLowerCase(), parseBlankToNull(rs.getString(columnName))); + } + list.add(dataMap); + } + return list; + } + + /** + * 插入数据 + * + * @param dataMap 数据集合 + * @param tableName 表名 + */ + public static void insertData(Map dataMap, String tableName) { + List fieldList = new ArrayList<>(); + List dataList = new ArrayList<>(); + List paramList = new ArrayList<>(); + + dataMap.forEach((key, value) -> { + if (null != value) { + String valueStr = String.valueOf(value); + if (StringUtils.isNotBlank(valueStr)) { + fieldList.add(key); + dataList.add(valueStr); + paramList.add("?"); + } + } + }); + String insertSql = " insert into " + tableName + "(" + StringUtils.join(fieldList, ",") + ") values (" + StringUtils.join(paramList, ",") + ")"; + RecordSet rs = new RecordSet(); + rs.executeUpdate(insertSql, dataList); + if (StringUtils.isNotBlank(rs.getExceptionMsg())) { + throw new CustomizeRunTimeException(rs.getExceptionMsg()); + } + } + + public static void insertData(RecordSetTrans rs,Map dataMap, String tableName) throws Exception { + List fieldList = new ArrayList<>(); + List dataList = new ArrayList<>(); + List paramList = new ArrayList<>(); + + dataMap.forEach((key, value) -> { + if (null != value) { + String valueStr = String.valueOf(value); + if (StringUtils.isNotBlank(valueStr)) { + fieldList.add(key); + dataList.add(valueStr); + paramList.add("?"); + } + } + }); + String insertSql = " insert into " + tableName + "(" + StringUtils.join(fieldList, ",") + ") values (" + StringUtils.join(paramList, ",") + ")"; + rs.executeUpdate(insertSql, dataList); + } + + /** + * 根据ID更新数据 + * + * @param dataMap + * @param tableName + */ + public static void updateDataById(Map dataMap, String tableName) { + List fieldList = new ArrayList<>(); + List dataList = new ArrayList<>(); + String id = Util.null2String(dataMap.get("id")); + dataMap.remove("id"); + + dataMap.forEach((key, value) -> { + fieldList.add(key + " = ? "); + dataList.add(value); + }); + dataList.add(id); + String updateSql = "update " + tableName + " set " + StringUtils.join(fieldList, ",") + " where id = ? "; + RecordSet rs = new RecordSet(); + rs.executeUpdate(updateSql, dataList); + if (StringUtils.isNotBlank(rs.getExceptionMsg())) { + throw new CustomizeRunTimeException(rs.getExceptionMsg()); + } + } + + /** + * 根据ID更新数据 + * + * @param dataMap + * @param tableName + */ + public static void updateDataById(RecordSetTrans rs,Map dataMap, String tableName) throws Exception { + List fieldList = new ArrayList<>(); + List dataList = new ArrayList<>(); + String id = Util.null2String(dataMap.get("id")); + dataMap.remove("id"); + + dataMap.forEach((key, value) -> { + fieldList.add(key + " = ? "); + dataList.add(value); + }); + dataList.add(id); + String updateSql = "update " + tableName + " set " + StringUtils.join(fieldList, ",") + " where id = ? "; + rs.executeUpdate(updateSql, dataList); + } + + /** + * 更新数据 + * + * @param dataMap + * @param tableName + * @param whereSql + */ + public static void updateData(Map dataMap, String tableName, String whereSql) { + List fieldList = new ArrayList<>(); + List dataList = new ArrayList<>(); + dataMap.forEach((key, value) -> { + fieldList.add(key + " = ? "); + dataList.add(value); + }); + String updateSql = "update " + tableName + " set " + StringUtils.join(fieldList, ",") + whereSql; + RecordSet rs = new RecordSet(); + rs.executeUpdate(updateSql, dataList); + if (StringUtils.isNotBlank(rs.getExceptionMsg())) { + throw new CustomizeRunTimeException(rs.getExceptionMsg()); + } + } + + /** + * 删除数据 + * + * @param deleteSql + */ + public static void deleteData(String deleteSql) { + RecordSet rs = new RecordSet(); + rs.executeUpdate(deleteSql); + if (StringUtils.isNotBlank(rs.getExceptionMsg())) { + throw new CustomizeRunTimeException(rs.getExceptionMsg()); + } + } + + + /** + * 构建建模表基本数据 + * + * @param mainDataMap 参数集合 + */ + public static void buildModeInsertFields(Map mainDataMap, int userId) { + String dateTime = DateUtil.getFullDate(); + String[] dateSplit = dateTime.split(" "); + mainDataMap.put("modedatacreater", userId); + mainDataMap.put("modedatacreatedate", dateSplit[0]); + mainDataMap.put("modedatacreatetime", dateSplit[1]); + mainDataMap.put("modedatacreatertype", "0"); + } + + /** + * 构建建模表基本数据 + * + * @param mainDataMap 参数集合 + */ + public static void buildModeUpdateFields(Map mainDataMap, int userId) { + String dateTime = DateUtil.getFullDate(); + mainDataMap.put("modedatamodifier", userId); + mainDataMap.put("modedatamodifydatetime", dateTime); + } + + /** + * 建模表数据权限重构 + * + * @param uuid + * @param modeTable + * @param formModeId + */ + public static int refreshRight(String uuid, String modeTable, int formModeId, int creator) { + RecordSet rs = new RecordSet(); + rs.executeQuery("select id from " + modeTable + " where modeuuid='" + uuid + "'"); + if (rs.next()) { + //建模数据的id + int bid = Util.getIntValue(rs.getString("id")); + ModeRightInfo modeRightInfo = new ModeRightInfo(); + modeRightInfo.setNewRight(true); + //新建的时候添加共享 + modeRightInfo.editModeDataShare(creator, formModeId, bid); + return bid; + } + return -1; + } + + + /** + * 转换空字符串为null + * + * @param str 字符串 + * @return 转换后的字符串 + */ + public static Object parseBlankToNull(String str) { + return StringUtils.isBlank(str) ? null : str; + } + + /** + * 转换空字符串为null + * + * @param obj 对象 + * @return 转换后的字符串 + */ + public static String parseBlankToNull(Object obj) { + return Objects.isNull(obj) ? null : StringUtils.isBlank(obj.toString()) ? null : obj.toString(); + } + + /** + * 根据建模表名,获取建模ID + * + * @param modeTable + * @return + */ + public static int getModeIdByTableName(String modeTable) { + int formModeId = -1; + RecordSet rs = new RecordSet(); + rs.executeQuery("select id from modeinfo where formid =( select id from workflow_bill where tablename = ? ) and isdelete = 0 order by id", modeTable); + if (rs.next()) { + formModeId = rs.getInt("id"); + } + return formModeId; + } + + public static List getFieldList(String tableName) { + int formId = getFormIdByTableName(tableName); + return FormInfoManager.getInstance().getAllField(formId); + } + + public static List getFieldList(int formId) { + return FormInfoManager.getInstance().getAllField(formId); + } + + /** + * 根据表名,获取表单ID + * + * @param modeTable + * @return + */ + public static int getFormIdByTableName(String modeTable) { + int formId = -1; + RecordSet rs = new RecordSet(); + rs.executeQuery("select id from workflow_bill where tablename = ? ", modeTable); + if (rs.next()) { + formId = rs.getInt("id"); + } + return formId; + } + + /** + * 获取表单下拉框展示文本 + * + * @param formId 表单ID + * @param fieldName 字段明湖曾 + * @param value 下拉框值 + * @return + */ + public static String getSelectName(String formId, String fieldName, String value) { + String cancelReason = ""; + RecordSet rs = new RecordSet(); + rs.executeQuery("select selectname from workflow_selectitem where fieldid =( select id from workflow_billfield where billid = ? and fieldname = ? ) and selectvalue = ?", formId, fieldName, value); + if (rs.next()) { + cancelReason = rs.getString("selectname"); + } + return cancelReason; + } + + /** + * 获取表单下拉框值 + * + * @param formId 表单ID + * @param fieldName 字段明湖曾 + * @param selectName 下拉框展示内容 + * @return + */ + public static String getSelectValue(String formId, String fieldName, String selectName) { + String selectValue = ""; + RecordSet rs = new RecordSet(); + rs.executeQuery("select selectvalue from workflow_selectitem where fieldid =( select id from workflow_billfield where billid = ? and fieldname = ? ) and selectname = ?", formId, fieldName, selectName); + if (rs.next()) { + selectValue = rs.getString("selectvalue"); + } + return selectValue; + } + + public static String getSelectValue(Formfield formfield, String selectName) { + String selectValue = ""; + RecordSet rs = new RecordSet(); + String detailTable = Util.null2String(formfield.getDetailtable()); + if (StringUtils.isNotBlank(detailTable)) { + rs.executeQuery("select selectvalue from workflow_selectitem where fieldid =( select id from workflow_billfield where billid = ? and fieldname = ? and detailtable = ? ) and selectname = ?", formfield.getBillid(), formfield.getFieldname(), Util.null2String(detailTable), selectName); + } else { + rs.executeQuery("select selectvalue from workflow_selectitem where fieldid =( select id from workflow_billfield where billid = ? and fieldname = ? AND (detailtable IS NULL OR detailtable = '') ) and selectname = ?", formfield.getBillid(), formfield.getFieldname(), selectName); + } + if (rs.next()) { + selectValue = rs.getString("selectvalue"); + } + return selectValue; + } + + + /** + * 全角转半角 + * + * @param input + * @return + */ + public static String ToDBC(String input) { + if (input == null) { + input = ""; + } + char[] c = input.toCharArray(); + for (int i = 0; i < c.length; i++) { + if (c[i] == 12288) { + //全角空格为12288,半角空格为32 + c[i] = (char) 32; + continue; + } + if (c[i] > 65280 && c[i] < 65375) { + //其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248 + c[i] = (char) (c[i] - 65248); + } + } + return new String(c); + } + + public static String getTableNameByCustomId(String customId) { + RecordSet rs = new RecordSet(); + rs.executeQuery("select tablename from workflow_bill where id = (select formid from mode_customsearch where id = ?)", customId); + if (rs.next()) { + return rs.getString("tablename"); + } + return ""; + } + + +} diff --git a/src/com/engine/secret/util/ResponseResult.java b/src/com/engine/secret/util/ResponseResult.java new file mode 100644 index 0000000..3baf8d5 --- /dev/null +++ b/src/com/engine/secret/util/ResponseResult.java @@ -0,0 +1,192 @@ +package com.engine.secret.util; + + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.engine.core.exception.ECException; +import com.engine.secret.exception.CustomizeRunTimeException; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import weaver.general.BaseBean; +import weaver.hrm.User; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + +/** + * 请求执行器 + *

Copyright: Copyright (c) 2022

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ +@Slf4j +public class ResponseResult { + + private static final long serialVersionUID = 1L; + + private final User user; + + private final BaseBean baseBean = new BaseBean(); + + private final Boolean isLog = "true".equals(baseBean.getPropValue("hrmSalary", "log")); + + public ResponseResult(User user) { + this.user = user; + } + + /** + * 统一返回方法(自定义返回格式) + */ + public String customRun(Function f, T t) { + try { + if (isLog) { + log.info("run api , param {}", t); + } + return getJsonString(f.apply(t)); + } catch (com.engine.secret.exception.CustomizeRunTimeException e) { + log.error("api run fail", e); + return Error(e.getMessage()); + } catch (ECException e) { + log.error("api run fail", e); + Throwable cause = e.getCause(); + return Error(cause.getMessage()); + } catch (Exception e) { + log.error("api run fail", e); + return Error("系统异常!"); + } + } + + /** + * 统一返回方法 + */ + public String run(Function f, T t) { + try { + if (isLog) { + log.info("run api , param {}", t); + } + return Ok(f.apply(t)); + } catch (com.engine.secret.exception.CustomizeRunTimeException e) { + log.error("api run fail", e); + return Error(e.getMessage()); + } catch (ECException e) { + log.error("api run fail", e); + Throwable cause = e.getCause(); + return Error(cause.getMessage()); + } catch (Exception e) { + log.error("api run fail", e); + return Error("系统异常!"); + } + } + + /** + * 统一返回方法(有参无返回) + */ + public String run(Consumer f, T t) { + try { + if (isLog) { + log.info("run api , param {}", t); + } + f.accept(t); + return Ok(); + } catch (com.engine.secret.exception.CustomizeRunTimeException e) { + log.error("api run fail", e); + return Error(e.getMessage()); + } catch (ECException e) { + log.error("api run fail", e); + return Error(ExceptionUtil.getRealMessage(e)); + } catch (Exception e) { + log.error("api run fail", e); + return Error("系统异常!", e); + } + } + + + /** + * 统一返回方法(无参有返回) + */ + public String run(Supplier f) { + try { + if (isLog) { + log.info("run api"); + } + return Ok(f.get()); + } catch (CustomizeRunTimeException e) { + log.error("api run fail", e); + return Error(e.getMessage()); + } catch (ECException e) { + log.error("api run fail", e); + Throwable cause = e.getCause(); + return Error(cause.getMessage()); + } catch (Exception e) { + log.error("api run fail", e); + return Error("系统异常!", e); + } + } + + + private static String getJsonString(Object apidatas) { + ObjectMapper mapper = new ObjectMapper(); + try { + return mapper.writeValueAsString(apidatas); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + return ""; + } + + + /** + * 成功返回 + */ + private String Ok() { + Map apidatas = new HashMap<>(); + apidatas.put("api_status", true); + return JSONObject.toJSONString(apidatas, SerializerFeature.DisableCircularReferenceDetect); + } + + + /** + * 成功返回 + */ + private String Ok(R r) { + Map apidatas = new HashMap<>(); + apidatas.put("api_status", true); + apidatas.put("data", r); + String success = JSON.toJSONString(apidatas); + if (isLog) { + log.info("run salary api success return {}", success); + } + return success; + } + + + /** + * 失败返回 + */ + private static String Error(String message) { + Map apidatas = new HashMap<>(); + apidatas.put("api_status", false); + apidatas.put("errormsg", message); + return JSONObject.toJSONString(apidatas, SerializerFeature.DisableCircularReferenceDetect); + } + + + /** + * 系统异常失败返回 + */ + private static String Error(String message, Exception e) { + Map apidatas = new HashMap<>(); + apidatas.put("api_status", false); + apidatas.put("errormsg", message); + apidatas.put("error", e.getMessage()); + return JSONObject.toJSONString(apidatas, SerializerFeature.DisableCircularReferenceDetect); + } + +} diff --git a/src/com/engine/secret/web/AuthorityChangeController.java b/src/com/engine/secret/web/AuthorityChangeController.java new file mode 100644 index 0000000..4b68aa1 --- /dev/null +++ b/src/com/engine/secret/web/AuthorityChangeController.java @@ -0,0 +1,39 @@ +package com.engine.secret.web; + +import com.engine.common.util.ParamUtil; +import com.engine.common.util.ServiceUtil; +import com.engine.secret.service.AuthorityChangeService; +import com.engine.secret.service.impl.AuthorityChangeServiceImpl; +import com.engine.secret.util.ResponseResult; +import weaver.hrm.HrmUserVarify; +import weaver.hrm.User; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/04/09 + * @version: 1.0 + */ +public class AuthorityChangeController { + public AuthorityChangeService getService(User user) { + return ServiceUtil.getService(AuthorityChangeServiceImpl.class, user); + } + + @POST + @Path("/delegateToProvincialAuthority") + @Produces(MediaType.APPLICATION_JSON) + public String delegateToProvincialAuthority(@Context HttpServletRequest request, @Context HttpServletResponse response) { + User user = HrmUserVarify.getUser(request, response); + Map params = ParamUtil.request2Map(request); + return new ResponseResult, Map>(user).run(getService(user)::delegateToProvincialAuthority, params); + + } +} diff --git a/src/com/engine/secret/web/AutoGenerateNumberController.java b/src/com/engine/secret/web/AutoGenerateNumberController.java new file mode 100644 index 0000000..66d5c36 --- /dev/null +++ b/src/com/engine/secret/web/AutoGenerateNumberController.java @@ -0,0 +1,38 @@ +package com.engine.secret.web; + +import com.engine.common.util.ParamUtil; +import com.engine.common.util.ServiceUtil; +import com.engine.secret.service.AutoGenerateNumberService; +import com.engine.secret.service.impl.AutoGenerateNumberServiceImpl; +import com.engine.secret.util.ResponseResult; +import weaver.hrm.HrmUserVarify; +import weaver.hrm.User; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/04/16 + * @version: 1.0 + */ +public class AutoGenerateNumberController { + public AutoGenerateNumberService getService(User user) { + return ServiceUtil.getService(AutoGenerateNumberServiceImpl.class, user); + } + + @GET + @Path("/getAcceptanceNumber") + @Produces(MediaType.APPLICATION_JSON) + public String getAcceptanceNumber(@Context HttpServletRequest request, @Context HttpServletResponse response) { + User user = HrmUserVarify.getUser(request, response); + Map param = ParamUtil.request2Map(request); + return new ResponseResult, String>(user).run(getService(user)::getAcceptanceNumber, param); + } +} diff --git a/src/com/engine/secret/web/QualificationApplicationController.java b/src/com/engine/secret/web/QualificationApplicationController.java new file mode 100644 index 0000000..89d12c5 --- /dev/null +++ b/src/com/engine/secret/web/QualificationApplicationController.java @@ -0,0 +1,49 @@ +package com.engine.secret.web; + +import com.engine.common.util.ParamUtil; +import com.engine.common.util.ServiceUtil; +import com.engine.secret.service.QualificationApplicationService; +import com.engine.secret.service.impl.QualificationApplicationServiceImpl; +import com.engine.secret.util.ResponseResult; +import weaver.hrm.HrmUserVarify; +import weaver.hrm.User; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2024/08/29 + * @version: 1.0 + */ +public class QualificationApplicationController { + public QualificationApplicationService getService(User user) { + return ServiceUtil.getService(QualificationApplicationServiceImpl.class, user); + } + + @POST + @Path("/parsingFiles") + @Produces(MediaType.APPLICATION_JSON) + public String parsingFiles(@Context HttpServletRequest request, @Context HttpServletResponse response) { + User user = HrmUserVarify.getUser(request, response); + Map params = ParamUtil.request2Map(request); + return new ResponseResult, Map>(user).run(getService(user)::parsingFiles, params); + + } + + @POST + @Path("/deleteParsedData") + @Produces(MediaType.APPLICATION_JSON) + public String deleteParsedData(@Context HttpServletRequest request, @Context HttpServletResponse response) { + User user = HrmUserVarify.getUser(request, response); + Map params = ParamUtil.request2Map(request); + return new ResponseResult, Map>(user).run(getService(user)::deleteParsedData, params); + + } +} diff --git a/src/weaver/interfaces/secret/action/ApprovalReviewEndAction.java b/src/weaver/interfaces/secret/action/ApprovalReviewEndAction.java new file mode 100644 index 0000000..90be985 --- /dev/null +++ b/src/weaver/interfaces/secret/action/ApprovalReviewEndAction.java @@ -0,0 +1,75 @@ +package weaver.interfaces.secret.action; + +import com.engine.secret.util.FlowUtil; +import org.apache.commons.lang.StringUtils; +import weaver.common.DateUtil; +import weaver.conn.RecordSet; +import weaver.interfaces.workflow.action.Action; +import weaver.soa.workflow.request.MainTableInfo; +import weaver.soa.workflow.request.Property; +import weaver.soa.workflow.request.RequestInfo; + +import java.util.HashMap; +import java.util.Map; + +/** + * 审批复核 归档Action + * + * @author:dxfeng + * @createTime: 2025/04/09 + * @version: 1.0 + */ +public class ApprovalReviewEndAction implements Action { + RecordSet rs = new RecordSet(); + + @Override + public String execute(RequestInfo requestInfo) { + try { + MainTableInfo mainTableInfo = requestInfo.getMainTableInfo(); + Property[] properties = mainTableInfo.getProperty(); + Map mainDataMap = new HashMap<>(); + for (Property property : properties) { + mainDataMap.put(property.getName(), property.getValue()); + } + // 获取主流程ID + String mainRequestId = mainDataMap.get("zlcid"); + if (StringUtils.isBlank(mainRequestId)) { + requestInfo.getRequestManager().setMessagecontent("未获取到主流程请求ID"); + return FAILURE_AND_CONTINUE; + } + + // 获取审批复核结论 + String conclusion = mainDataMap.get("spfhjl"); + + // 更新主流程表单的审批复核结论 + String tableNameByRequestId = FlowUtil.getTableNameByRequestId(mainRequestId); + if (StringUtils.isBlank(tableNameByRequestId)) { + requestInfo.getRequestManager().setMessagecontent("主流程表单名称获取异常,请确认"); + return FAILURE_AND_CONTINUE; + } + String sql = "update " + tableNameByRequestId + " set spfhjl = ? where requestid = ?"; + + rs.writeLog("mainRequestId==" + mainRequestId); + rs.writeLog("conclusion==" + conclusion); + rs.writeLog("tableNameByRequestId==" + tableNameByRequestId); + rs.writeLog("sql==" + sql); + + rs.executeUpdate(sql, conclusion, mainRequestId); + + // 更新完成后,自动提交流程到下一节点 + rs.writeLog("mainRequestId==" + mainRequestId); + String options = requestInfo.getCreatorid() + "-自动提交流程-" + DateUtil.getFullDate(); + String submitResult = FlowUtil.submitWorkflowRequest(mainRequestId, options); + if (!"success".equals(submitResult)) { + requestInfo.getRequestManager().setMessagecontent("requestId[" + mainRequestId + "],流程提交失败"); + return FAILURE_AND_CONTINUE; + } + + return SUCCESS; + } catch (Exception e) { + rs.writeLog(e); + requestInfo.getRequestManager().setMessagecontent(e.getMessage()); + return FAILURE_AND_CONTINUE; + } + } +} diff --git a/src/weaver/interfaces/secret/action/MeetingConveningEndAction.java b/src/weaver/interfaces/secret/action/MeetingConveningEndAction.java new file mode 100644 index 0000000..a6ee35d --- /dev/null +++ b/src/weaver/interfaces/secret/action/MeetingConveningEndAction.java @@ -0,0 +1,119 @@ +package weaver.interfaces.secret.action; + +import com.engine.secret.util.ConfigUtil; +import com.engine.secret.util.FlowUtil; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import weaver.common.DateUtil; +import weaver.conn.RecordSet; +import weaver.interfaces.workflow.action.Action; +import weaver.soa.workflow.request.*; + +import java.util.*; + +/** + * @author:dxfeng + * @createTime: 2025/04/14 + * @version: 1.0 + */ +public class MeetingConveningEndAction implements Action { + RecordSet rs = new RecordSet(); + private static final String MAIN_FLOW_TABLE = ConfigUtil.getConfig("xqxksqlc_table"); + + @Override + public String execute(RequestInfo requestInfo) { + try { + MainTableInfo mainTableInfo = requestInfo.getMainTableInfo(); + Property[] properties = mainTableInfo.getProperty(); + Map mainDataMap = new HashMap<>(); + List> detailMapList = new ArrayList<>(); + for (Property property : properties) { + mainDataMap.put(property.getName(), property.getValue()); + } + + DetailTableInfo detailTableInfo = requestInfo.getDetailTableInfo(); + DetailTable detailTable = detailTableInfo.getDetailTable(0); + String detailTableName = detailTable.getTableDBName(); + String updateDetailSql = "update " + detailTableName + " set zlctjzt = ? where id = ?"; + Row[] rows = detailTable.getRow(); + for (Row row : rows) { + Map detailDataMap = new HashMap<>(mainDataMap); + Cell[] cells = row.getCell(); + String detailId = row.getId(); + for (Cell cell : cells) { + detailDataMap.put(cell.getName(), cell.getValue()); + } + detailDataMap.put("detailId", detailId); + detailMapList.add(detailDataMap); + } + + Set errorMsg = new HashSet<>(); + if (CollectionUtils.isNotEmpty(detailMapList)) { + for (Map detail : detailMapList) { + dealMainFlow(requestInfo, detail, updateDetailSql, errorMsg); + } + } + + // 根据错误信息,返回提示 + if (CollectionUtils.isNotEmpty(errorMsg)) { + requestInfo.getRequestManager().setMessagecontent(StringUtils.join(errorMsg, "
")); + return FAILURE_AND_CONTINUE; + } + + + return SUCCESS; + } catch (Exception e) { + rs.writeLog(e); + requestInfo.getRequestManager().setMessagecontent(e.getMessage()); + return FAILURE_AND_CONTINUE; + } + } + + /** + * 提交主流程 + * + * @param requestInfo + * @param detail + * @param updateDetailSql + * @param errorMsg + */ + private void dealMainFlow(RequestInfo requestInfo, Map detail, String updateDetailSql, Set errorMsg) { + String mainId = detail.get("xzxksqdh"); + + + String conclusion = detail.get("spfhjl"); + String detailId = detail.get("detailId"); + String submitStatus = detail.get("zlctjzt"); + if ("1".equals(submitStatus)) { + // 已经提交成功的流程,不重复处理 + return; + } + + String mainRequestId = ""; + rs.executeQuery("select requestid from " + MAIN_FLOW_TABLE + " where id = ?", mainId); + if (rs.next()) { + mainRequestId = rs.getString("requestid"); + } + if (StringUtils.isBlank(mainRequestId)) { + errorMsg.add("主流程ID[" + mainId + "],主流程requestId获取异常,请确认"); + rs.executeUpdate(updateDetailSql, "2", detailId); + return; + } + + rs.writeLog("mainRequestId==" + mainRequestId); + rs.writeLog("conclusion==" + conclusion); + + rs.executeUpdate("update " + MAIN_FLOW_TABLE + " set spfhjl = ? where requestid = ?", conclusion, mainRequestId); + + // 更新完成后,自动提交流程到下一节点 + rs.writeLog("mainRequestId==" + mainRequestId); + String options = requestInfo.getCreatorid() + "-自动提交流程-" + DateUtil.getFullDate(); + String submitResult = FlowUtil.submitWorkflowRequest(mainRequestId, options); + if (!"success".equals(submitResult)) { + errorMsg.add("requestId[" + mainRequestId + "],流程提交失败"); + rs.executeUpdate(updateDetailSql, "2", detailId); + } else { + rs.executeUpdate(updateDetailSql, "1", detailId); + } + } +}