From 0cc9d531e90f72d983708b6964f2d933268cdcb9 Mon Sep 17 00:00:00 2001 From: Gabriele Zigurella Date: Mon, 5 Jun 2023 12:34:09 +0200 Subject: [PATCH] minor bugfix, refactoring and add callback methods --- .../quarkus-bridge-portlet/.classpath | 2 +- .../portlets/quarkus-bridge-portlet/.project | 7 + .../portlets/quarkus-bridge-portlet/build.xml | 3 +- .../docroot/WEB-INF/lib/portos-bo-shared.jar | Bin 0 -> 70853 bytes .../bridge/persistence/PraticaValidator.java | 44 +++- .../liferay/documents/util/AllegatiUtil.java | 8 +- .../bridge/api/QuarkusBridgeConstants.java | 1 + .../api/QuarkusBridgeMessageFactoryUtil.java | 226 +++++++++++++++++- .../scheduler/QuarkusBridgeScheduler.java | 179 +++++++++++--- 9 files changed, 422 insertions(+), 48 deletions(-) create mode 100644 liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/docroot/WEB-INF/lib/portos-bo-shared.jar diff --git a/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/.classpath b/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/.classpath index 2897838c..fcd69dcf 100644 --- a/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/.classpath +++ b/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/.classpath @@ -19,6 +19,6 @@ - + diff --git a/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/.project b/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/.project index 9e71782f..d619e7cd 100644 --- a/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/.project +++ b/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/.project @@ -33,4 +33,11 @@ org.eclipse.jdt.core.javanature org.eclipse.wst.jsdt.core.jsNature + + + src + 2 + C:/liferay-sviluppo/6_2/Sicilia - Paesaggistica/eclipse/portos-bo-shared/src + + diff --git a/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/build.xml b/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/build.xml index 187d5a84..92031ce2 100644 --- a/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/build.xml +++ b/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/build.xml @@ -2,5 +2,6 @@ - + + \ No newline at end of file diff --git a/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/docroot/WEB-INF/lib/portos-bo-shared.jar b/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/docroot/WEB-INF/lib/portos-bo-shared.jar new file mode 100644 index 0000000000000000000000000000000000000000..41b2a644f0538dba884830f2d48bd742118ae2e1 GIT binary patch literal 70853 zcmbTe1yo#Hwk}MN5InfMTX1)Gx8UyX?oc=ccSzyx?ohZBG`I$Lm%yXDPrtvq1RE<66Tzl@dr+stHRf;kYkg#B2pTNLm4F=S~{^bJ$1_>r7rYb})B`?nKItm7+ z_y_4HFqwB!5fdE&t#@+s_ks34{x7MVki3+*n2PEbIq_?`@iAE$`Y$sGGW0Z)<5Ts@ zjB_lTdrspbD2{ZJvXhc(V38ll>2ISwTC<{*QDu}>T(W6|jwWv5whr%)*;tyHIvINY1vTb>L+xPi|$zX>hu?PXZR0h`M2+q^*^7?*xt$XFT`W}&u27sGqw9GOZi_+`S->A3n_{JQp$h3 zY!v?!_J3mvbpMk%9GvW3?2YYhZ2roQng7F?{@vpIkDl&N#`@{+?vM77YO?bK7+CSU z@B8DO{mr}m({a7q#vcp&_mvSbbh0$Iu#`1)vv;x=es>#RjBN~^os;7g>}Lf(4{Qv| zLZ_7AV9qAvoDjGe}p-89M{hG|3eHhWk zTIdOigw`PHQcRWpRhBmDJ|dQ~0N%MgN3#gN{q=ip2FU~_x{3m(v5Go?L+?;{u^K8X zpVA!sY$?n91Kw)*Cg}xn4LUF?hi@%ITgh`?9N|oG`f-x&ibWp=rLDJBB>j0zyzZ%D?ul-TgAPVQr6qTLb zdrAMNWZ9{!gv;Y9){XjkRapDP#hM#niMc-$-h1x1I>5UU{*nSDL<{=u1^}93*)j9x z@!OelTKw%NUL!N_*LAN4=zm7Lf9L}*g1XN6yFN(0>jTF>bo9U1hrjERkhAlWK(py>Tdds&*y!Kpg4zdlRRIC=iPMnarNL3Lj;93_ zmr2}-i8eUyyeJ$*j=c~Uis3tuFa>(_@xHPC`wu<~wf?_fFHr>v+tre=yl7l0_X9Ia zO!9oTylOK;`i5&W3u&D6DI$0i#eLLk)d|CGZp%s->2ktZlnOeKr97zQvCZz1)DQVZ zTIc!AO7QxPHAS%NU3Gflhwwx!%~OqY49^k|yfo3suY#1Za9rsO;@xu0s6q7$j0}V@ z_$}w1sE5VDmOpaD@fIt@b9V*>Vi?&oc8U;qf3@gBCJ~rRS$*L=Tk1iLMgJ%tNEFF8 zQfp=zXB=#pa?l#TjKp=O^^&wh;2PkNHRi^GpT?Pw$O@1ibN|_&_)F3w-oyb=%aCVm zn56p_n#`&SBjWFIxQ>KnmCwo2_)B%N$rcvhs{ow-$GGB;>#aG{)8C8jN>)jT zA7@Q+=WwbU2nS&3kxX$0cWB(OR%LQBfv@V;mWU)mK*(d49n+<_neWX)P15U_c`5MR z8@)X86Q%y3`8fO`$0|(u*;X}9nMtRu3hv|3`a>JdeOg1U$KqlI{;We)Q}J%Uz`?-6 zq5gL|#QcX2sq!eIDxvYkLDuyX)xeVE<@w0=nWOeCULcbQXu1r3k{=Y-Pspy3ts6VB zQ^eEO9_m|I?;8}yHgmCYJ*lX)t)!#FJ72koqn0$=Xgxn^yC%B5*eAR$>nl!(WKsN9%w3%|O;BUJh4;Bt{4er=0SRGd;o z$4;51V*E9P&HCuzrl2)CSoe^EFUT@EjZI0QjIo z+SnqQ09utbTQ=va<}M-?tOICO740NM;hW z+*pU^cZ%u#Dqi2HC=M0aCUMd`EKzGKxU9_VQ39M(cu8h$glEx*_RKgyomgw z3EFT&_%nRm=xb)TkiPZRbw81UQ^)ymr(caCjMxsJ&o~LtHLGnhsBNy$UTDx>WTQWv z>GFF-Bgv3=30>@}(%)04usQiN?QbLQkQH^E6lH*Esgoz+6Oz_`{a@X$r-xW@*Sq^A|6jUamOo5KS=;{I{l2aO3gH56 zKd_%g*UD&+{V4SoJYu!X5G3k21=?6_kH}Rns2s^Qu|U2>VhT!LKs+dgC!(>=^?__2 z@t&{UtM1}*^}8V~fM@xAH9#F+pT)S!I+5h?mdpV+qUe)>Ru#(*PPmEt(n1R5wbeo*}0kM z4Q^n7(9ax>QGL0;Ozs=_E${Rt{6*MSsil`Jn8zIo_x$)zq_4GHR7O5u(jgzlGnR3_ zedOa%OaTrstnRUkOpiDv4)2#;unP2gD(?<4t||G_>)3_gL@Mx(VGy3XcvpzL8Q9Dg z;N%{XP0)St{((@J6Q>4v2ufxQVQ5S-<3M*Yt(BZo5@W)mf5I&AU5;>q=C$(?uSAAg z=Li{kkKOxlW&(z%20g*LAu_jbbnXJ~&)!rbNgt~f5)7>T9cuq&hW6h_m8z18h)W)OIL-0)Qi5*47j+``)(v4?^iN8?O#_8U;p& z?A>PTh)aL`GBRIJzxVD2`LH}b=We_~)`aYU`GAv*$FdSEl3>*1ROE?|iuW&T$W`K4 zE>{r5)5-AskiDfeJD^jb{c!WC#pgRgX?$DRB1!sHpn5HojT7nKAwvDo6mEHa`j zUSsN}k(=eVfZh_Ic2n63RO9-b=ndS3RAd10q7KEe4+&+&rx`#+)?v}?qlxl1Pil)) zMu8SZ`$|Lw9xC!LjCSygB@qRC&@v+LG;G)n510G`XGW}x1QySML?#NHTE*NaV;4%cf5Vm^maVZyJZV0k ziSNU>R;>~vFwvgxdL~2lGf-`PP8hFiXFTJ~3+_09DI_aqd3?ZNo97bAlhqTI=@C?q zHB+YM!rwuT#7*X&P4|@u@HcBB`c7%3+6cyvUULDM;BWmb3K>P*M$Z9tW6N3h`@1lJ zG4S|9MMvl_qt9bscWH9N7$?-&--XRg`$W*)P(!p$YhFiXG@D)#9)3BpoDtqWX~Gsx z?}IP6T^M`(lXc#hHpKh8{Fw^9p5O-+mixqg`}3!h#~;@RKZwT-*aJ?RhaIWIqcihS z`gp6Z2Tj^i?AS*$(pAP>W4e*V#VRo$$cawqK5h+>;HPy?(OqTuh&0c^im**gTA}C9 zOy88L7h+@_o}|aRKvn1kEHplUyug?K;G^(+)s0E`;lmBy12w^iS(fU`R(I+ESkvjV zq_gG;M1*|1Ijlnj&PP5g=0wWHsb(!6mGLVK(Q8%1>ohyCato&58+(_L2AMN&-rC^L z1bOm$hoQA0dsWjkL{FoSHwZaIBs#-IbU{&al!h>khg~aO3P@aO8QQv{j|gaQo}hN2@eH z9p*ZI&OZ<%1cDJ0iuMU15fJen^ooQqcwg{@Y}{_rhDh)}@b%>r_#{uWA-#UPNQ3s5 zO(VeVOGL~eiLylM5=#4WM9VAT(Pb+j$mJ81+29nV?kA4)V1JDkzwJzywRuOKV%g*s z#CC~Pf%$ujA<0PLL8fpCHzmnPpR)`N!cg-O;S#k#KA!k$5~fZ8|2Lj5J%&_}V_8=90)G2k(s&QnU9iO0?u(0Ga8WO_K33Tp|)PLRjs zPP<6!gjpuBeE=t`a6ZQ%eX2JvdAf6CT+w9p*0ei)BkOAP6>C)QX_Ruq?&JjsqifZn zweU2gZi9Z@wHG*6ACGN+VX|&g-rXBLn3pxI{PKSM=oS)A7rcv~q?BN@wJ3wb#q$&U z8AJQaZ%-BRQ@&T84obP~8T7f$+5@osB36^h0vgmHl~MzlxiHfGXDk73xt(Hm2mi53 zrX9pL@IU)PXrhgklK1fVx9pPf-=h;ZH%n*xe}yG6%5r}Ls=l)!g9u-!f8`54QiY4) z5aaekQL7=-5Pd`83`x0OUZ+s8vES7V+Zcc%Lwo`ALo+%d3Pd9|EzC~$RcOC9GxvLa zdWGmw;XN=2W;DRu%Po#K&2-MoTM~6ElFk-S-l6lV{aV9DiNf#mLnyPxy9&c4H-Buz)9W^Cs)>PVK_DfW#iQ%`8}1O2_}vO{g_VGa&kZw(*{M) zp-5z&3=V&4g4sUJsWh8K_p=wjn}eoau14%dg@9FvNm-is`HpjT%NC7O4XkGi2{#2n z6>?vrYnEd=?Fzy;HyIpttXLZ_z&}BKIzA$Q zu#XZ>9ZIiL*FKT)*DAprNwJGMmt@6g5O;&#*hC1j+w>nOj0-0ERJG8H31oNBwFzii z!Zort#PtpuDS+8#sD^V^@tIiQxN~T~ba!YLI*;gNXeU6mGTG$#^IMlos7m#HPl!t2 ztBL>7TmJ({WT&jy7LQtl#QWlA!y z5m6D*Yr$6TWws{jsbOVp6+iP#af%XUSP^Z0iH9&VMh`lbHvT3@;zGGhM`gLIHp%kI?dpbINe@}%ynnCQ@jOa`@PS<=xZ z*caE(3fj&vWW_DARfN8zH{%B#{iNfJA|ypK%}0v3uA+_P)P}dF%pM?#EVv~&ZD9~^ zxrg;ai?Gwi9;KNWq1#tVlsujQ^M;QSldO$awv-d!dqlsRu4DxFRs1}c*f5vO2|i;c zjoY$1*>0Q8|M@h8q{EOTzQN+Qb$_Tgflm<|q`EVr0GpAOFPB&xzp9AHbf;iGVLJ$4 zoLQD1I-zo;Yx^>lUUyTS-EOH;=6LC068aIhy*$6)}>n$*A8rt=?((s(G>>zEws zY#FBPXz8QXQ+-UrWb*?>S@Itb(EF`KL3Qm8!1|9x@%XGoA^1&2xqE=3Y`cyJd|!K_ zF#I5uZEhvdWEY^fk`$Qfe zd);OB73swUa}9P80?)l<4LwiOCvbSA@g7ovve|kJ zAS3qR*kr}cX*|F0eimQCtIy4`Jy^#_U5t1JVfNF-d ztT?4hCn&tltikZ0mq08S4t15MK=>xn)$*thpa}HBWL?v=N%|8elTnIq^=X46bUA%6 zND3^nr)qpzBuX0x@<7@~<}RF4MU4Kh#nViNMEOCmu%zfET{T7+@XngNQTrBKz0=G( zWAlUjA;Rua6L*0(r&o?+eU6D?`y-)Fv!JL_9Z9pa5(d6;)M}->3ue&32(Rr8>QT8U z{i&A+AG#WRWyIVTG1S?Xtgx+zN1`E9^3iMefjw%c^o=_fY~rD`_RpApAah2CUtG%y z+66c$d1O_HEIX!XSyFV=gEP0lW(72$TDo8+$c7p36z{>KN*)EjPkBu;uOz~Q=pGSH zkK&WNb!B2?Q^5v-s_jVT!#3hJ0SYS(30(j&;=wUcie5dC0%S@fB9m^3YZp8L##L(kW@)%wHuDRRM|g z^YeX(q&T|ezlUsVuHt5!O-T#e$A;+3$=I8#eoyz`Xr?xq2VsZ6w>G>oo0MyfmEcj_ zV(rlBV$4bsh%>Bl&rMBBgjPiC#l1{jT=}G!`}eWjUu9im;&D#sJ8h!BWdFxwKyLPZ>w`BfBqQ3>dV&t_wQnaS!8 zr>n};L+=x_@&FL;62spB2AHVDF?>?|65K^=JDwBGWhg{SH>a;s3)>&H4vUP0@Bh6GH>M$%9)OF)q`Tlzh*l z_~14Y>VOUpM?5nT^DQPs<{&%WhI@RH&RLU)geXYp0z48^wIkpja}2Z5r)E?`&-Zp- zL*KWam*o_aezdH&ayi|8a@>FNFlV-S|0!4C74kcT{$f4=s0Q`(YD;-R!%q{NS=*)l zHR*rLX@wE& zJ?@nA6lwL(B_A1C*|rf^rG#hvpFUZzpT z)YQ;Uct|WJvsCztt;Bvw{cHJnafN7OjNg%`#ucyd6hyZ_#9{zqlj12~_Y9!84oIQP zvDAwlzi0K(c(&ni))f%s1vVE}6hxX^((>VXsH(G`;?L|NI95n;oyKYd)wYyw8Vgo` z4%Oxus^JtCQ>bC}gVrT~Aj3Y9iJ0S*o_`F~cKj_!(c3J_q5!p+&D`RW^^JxeHYche z>D~=+r~Qp4@@)K@pF|Sx;WO64#t}~hl@2olHl(YrcGV?J7lt&(kcLO<4gn z_6n+ppNhFqa-3IYerPaj7{lV>if9Ppc*cB{I*3kd|c~D+uD`phLh+SE^0rR z0}G)lYhU=jgZA|G7E#0(SnX|Il{)CjWlKNNDw%XX)e0=AdJ*6_Z7BVrZif)Em$!GC zAeJdDva2hy9BKhqble@|+MATO*utFqni z3C9kC^D$=PW^%iX4s?*_bjWBmml_w&d$q-aEnX0t;~HU!&lYMVSIf8jE&~8z{mck) z;d?j)m=ic!1JVfCwOS(W2XoWp3zkbn?3PP(IX`ODY-XoPz1Vo^uW&y0e*LH z)Ilvv@7R*_JCI5iArVHFoH08fJ0MYz`~yQEQJ@vL1WKCJ=2!3`RL=CCQb>8q3uSO~ zRL;~MT9^)sFBTpmIzKL&JTySw+rgi@3NbZ;kq$lZPhIdt@ZF4w2Wvlh*PwaNMEhER z{A_w4oj3z{$;6e&q5@H5RSmYNC>$fJCJkWgUHFkgWzq)G@%r~`E)hl_J|OxP6<6U5q&xAXuZDpW&kAlSuOP|;1tH=ud=}X!t ziH%9RFQzY0e|DuZMr!nLAHl%f5y8N|{0CU~j|#B5rL(pMwqIfRpi;%UHfa3*IyRx-|j0nz_CDaSq`7zk5cR()5Y|K z80e0%=bH_lU}dcI#-1Wm>>ggq%e{KDwiY7P1J_dL)#lAhTE+Bjw(3%9A=@a71JflL zGolMcW>klBqhUPy)LJcRtM@S|A>E+Hb$XSZ)uq`YGvM&SjkLZuml4K@*{?VVZ8@rb z=fRE~`thnt!-_AX06^(2;O$5aOT5wb=0ukkeE|=%(Idf%BTqOKq|1=)@7wyy?RKWa zc|%4|DLi+M;Q)zsu&!nJ7R{TTdp{LsH1i$K7wu|_(P5r3;VDvcPeR-EAOg>QnvfxU9lJUt+H)H+FPC=+%S~U!i}y z|8m$Z59m-MHSJ1ae89EFO*_rZnS^42@V;RbAp*XhjRER`;XpJJ>=jvJnD!fNTKo_g zhQ1ocCl9|CQ>(=Bk%?$Nj;2MwjIbT|mWe}r^oSCTmuP3BVjG+ zA|1unB4K$G$TMsBM;)cq@U|WU{6t3%j2fyHlTzY_6_0{~ep4s~&?fy{GCF-KI@VA5 zh6uGwHe$J5v@`=8ofJ)ev;*wbkEimxhFn4gZu9dgK_u!hFwSF|b@<`$<@`{HHRc`9 zd83Khf`K1~TqX@RObTriikPhH){6~=W;sQv(mZ^!3@lu~rInuj8=H!&puvj_r)%wg z9Xuc4$2J`%)T7G#M9Zn83rt03EYNY}3E;G)#qgS6yVyYTc0L?tWcvt~0Z52}gYiGuASlj#tf zFe~h=rt-koH`T49&1<5`G|B<)Hww=X{dA}7Up^U=3T(4d-YG9M>$%q1BnLf^8|DFyhZ23EJeW zLYy-GK`{0uY0UC50Ehvr705s$+~aS#dLV(jEX5_owMlYX1>})BF9V(vceV?4l>_d+ zos|N;Yc;x7CGS^m^j_CC1O=uA1-?qSPY>~*Q0{|qIq!~`TR=eX+ihRq#M&5q<2lCx za4_~|+anBdFpjQ0;K;wOvR{AlfA&zCZpZ|9IRM1XA7Opbi)~@1dquSEd~~1|+0W&8 zwb*9tSa@vF3+V!e7<(IoKN1$Javjw-#edKSxA+Yet7Bhtxty|sm_E;AjmTlurI-KM z-)>1@Ki8q2f9TIKkrtJ@Pg9SSclK zjt7Cs$|*a9(>2T5r~i5mA*8xjyN`!7r=@d4qpuQKp>MrgvCm$dSIWCvtIzd()wmKJ zGj;S%m$VMCCDxg5V15(l`-Z;M^Y6->q)J|O;Xu)9IXtQ@6qqwcncs51(A`?Bfjo-rwGMsD`n9o={6Rn zDXV8qu`Pa4eQsZG=$gcjooCC;(#m%IYuY$7xARTZBM;XPWDJqQM ztYVZswWIX9MnHpchNldpbfsR=GMp(3`@&ngrA?@4L*O)Y) z1uMLy?gpI1D^F`^{afS_J{vD+jpzEu&Yz8)KW~|eGN02@1R{s!&m^KbyR!+d*O8Ca z%85s~%6s?vKI`DD$e=DE_xrvIH3b>Weyq_iiG)@xV(QVvNem~BA#D*}Rx6M+J0RKU z!@E*6_;&Z{+9Mh&ge-TKa+8v78)_uAB{tU)qFVA5kof>7^N_hK@O7};1p+$-TOws* zI$0(`wM75pY1+X(0tHRMz{Ph=C3JO#<&xWqFw2TrQoWIiMgI5gSjj8iL9Y0J;KO^iZx>7Hn7W)h_*Nqlu_wYtRE0&8Ji#u zAz4(|7X^lqU6)c(1Sby*y6?O0b#tC4CpO+*?kEFf9*6-z*~qcX;+gmR}Di)R$M9mhVn)s?J$wkBp1=xCff{cw%hZWmVu&!Ry^Cp4HndTeT1S ze&M%o!Qm+_%2s}>F8^7fK55?ArZjBEQl$A=^3c~EWY2T95ZN=XHFoPWc1x@7yr}*e zlatZtT!+#|YAhKp`86_#Yz(UbcHI4i)=Emn`h{UucMk0Ylatd($e_D}*4_-Q05a)I zZSdq1K#!rUFr(~bduKy!rQVw-sNBSuYglFm2y_yYJ8$b0=lI!|N7@|ORJAuJ z_*fsvj*s#+G9?E5mH`94UQr|1iltCimp(HzLA~77xO;?!Jrcq!F!2rFkWVBSgN#oB zzoprFGhM8m`v~ewDwPP5_vxNUD&3wtCDt zbx#u^-ScBv)nfi5GiTIHCcYke+sWq}Q(lJ-# zuu6Q>uL|#*(X+a+_T2-H9D;n)qn6SLRG+D@ioBH606t<(S zMV>a@4$Ew_s6rLdF$_~UcpU=xJs7I!kZ91tdSb}7~9tZumRVgS1>&{df% z*?clskba^Y0<5v5uzE~#+n7n||i83i>uwZ7Y@h1uHt?Ap@q zsswzD6X`+5O?LC3spbz`8TL#c{6f(0kSp-jdypX_%%lI&P!8N&Jel7HCG95Y>1Wft z#Zpf5unc`8Yu;+e%(5-V2?8Z&SF7RU6ckU;^Q!CVo!0CX?+OS!%pgnPRKfu*F^yzE z(pYgACZc$R1?8M{O4=vDM{!$ZH554+ip|94e<1!{3u5;j{^N|op6Bh{k-rIrf^5bwGDh*-IfJmt&j5c) zprf#~Hbmh*hL&_f!WUpbfNG~y+>aEJ!Vqh7V>ew}w|u_Omna=@|7_58Y{E=-f}s8R z`g_7_kY#7X-|rQ?CQL(Y7t77X2tm9G{n+C>zU8ej?VU-%lX`~52DfUL6W?v%je31J zIA}Hbg^p#XG`iE7%Oq`iF;E^6>uO#r6*!IfTo%nMjlSB4He?IXc@8qp0NzNk185u? z^gn`Rq3YA}ok6UI9=eS~lfKw33u5QeTvFBva}>x!x{(e(gO0gCBa&fYB%VGJ7s0o^ z-Eiahz{G)DP|o&Oc8)qOb?ivd?CBV;1(+^@Ee}a-WL3-lTB!<|SVH}J2A78j81XRc zB(U0e#HX#2tp~%3@Fi}=^B+PAVySiesK{;ylHIhVws(s)-#oa@ESBDs-Y`U3QH$d9 zV;e7-yg_Z&k-~eY798KCaN-|h_-4v}<2D|X#UrjRka2zIWRVCQ32WM?x$N^pX27y~ z^U*l!)BIdgayrJT&ct4_=$ZE3r^_K^9Y3d$2f$nK4_Fk_RPEZC9BTW#tw-@|K$s$> zUz%c}Uz~ylK_g&04J&-r6$%?wKj-C{Sw34LS+^IsXSp| zNQKpc-oX82ps)UNx&NAJE&q`m;o9scC(?hdGyx53xNYA%DsK`Xn{-WpmUzF(| zu{0*ZT47cZZ!i~RN^9IBD0=ykiUt!1zMf7-nQxupa$4smvpex4CQ(V5`-j_8Yczu- z>m|ekF#0VAIClYHw|w@_c{|O@(eLhl?r-sOXSOQm*QwCBD!)X&MqFVKV0m@U(1zFCLNGIXJN2L9f$J(r7y|u(VBV zKKYoeBPWy5K%IL113WWK_0p4@_7JLj1<88-u{GSH6?B^P7Rd7-2|9jT zySnY{uEJA9C|pH&nN~o=5?@@OYeIK;stWlGTLeWUA=^&Z>rN z{Z+yIUc?Y#lAFY-Q=aGtXy)8YXe{a_sqkwLm78V2Zhu^9yXVebLv+wAp{TCX?d)=4 zbaQr9#%migfTRpk4=)OfmUWpb`;`QPDHcyD#{v@8kr8GVJ*R-V^a#+< zH{Hbb!YF7JJU8t~rlGQBNE|=-ILPtk;*5r#av)2V8WG}xfUuyOA=lI=X%9R3+alqg zlffXv*|uvKFfi@+V{!i;*ooR3yV|}VTeAEIwln-2wEKq&H>P^}pbnuAZETBJYhrn} z8hr`@BOdJkG=?QBYl*3ul02M1Izqwx*_@u?E{G0WGbkh}g>=ipQcBW7N>cLu+pB=O z0dLDf%d6nfxB1X_qBD_|~SCVIO+o)gR zmY4hz-_7$09Z^y@3Mnq||Ou_*dV zJS$uE)iAF_n`G9es6^YSs3h^wtBSE)0{@69mv;O}Da>ni7~Sl)M5KvL$1ufqjXB+_ z)hIpPs8v>`#i%tM9KC!WwmxzmXf)Q+S79WtY6GRhIYIMFbU@uHRC6G!WXZbqAJ^G5 z($vNyPh;A;fP$q4Ot*tsJ^evINqI&aiaa8w;9wLKo|*{ewSk*c+ee7Y zmY<(iS`COQym%{w?|XVdXQw{T>?fNl8qh&lpP1t~9FSbLPK0F|!c3P(k`D%tVW~1# zL@Jrr#tLPIlK3Q!ZrgqI{J&4c=sGu&taPrH1060NVy;nPy>&mm%B@0FdK-U0YAl4( z?Ujk@^o4WR)LVLYHmhG!kM_$~r*v`P&V{E}P{y<1(g}7EX<;?Wf3HU+_ zDzky#Ws#hz@7&aZPx()APQZEx{FUH9#r907=sey@zM4j7*m>lAta%UUMI-xt^dBE} zE7#@Sy4DBw5JHR3RD<>APNk}JQv@7}M%eYJHZNO1hU2e#5fm-}GOe`g^OsjdR*RxS zt+{V-nTNqsvlmL8D9QQcGbt8LW;)t;4 zDubf%9X;BIWO=17Y-T?aTVe4en3ugIj?v~bk=hlg17+voc*tqo$h}KI{cABW~|=S<%L? z#VM><*Fv=DGhzktM;z}@dgOg;-z~Ry1ND>;+C`-_u!K-IlX^%?g|>~4Y5EJH)zVM{ z+c&1m5LmtQAc_hRn^r3%aflZjVIm#H#eO)_LNF#jEWG$Li2aGeSB4~tqvENf%zxKa z>l>Tq!3wAmeYB3-w%_ZvKz1Y9LR|KE#<;N)ggsvr-788rV{Xx??iJrP<#y_McNoV0 zg!~)pxflWQ$k9YOvwEFNHC76zN=(fcVs^fiEmy@=1|hVqHUj8GP?J_fA6G1k9QAp@3$1erYc!j!DLL}XfkgaNQh8W^ZRl4LF5PQG! z;B}Q(rKRJ5liWa^-tKys3`Knt^68>P-(fheHi}Ze?UVyt)yLeX&|+p5O7zQ>$noYX zQM#f+?^j^eF8?*xUo>2(rg$fqB6R)Ckn4tbuidS%tSlUV^xT^?_TWbim~#a^T^la`?1L z>_GY87D&3;2wn}bLF~Zs6}1I=m9_@)47G)@LupfP^F!dyrcfY9a2TX~VDqOAbf4y) zm7Z!$51xk@@N=+p6c3IE{=oZydzcQw7qh_kS{2QO&;k!d)NO=;j#YS4M96A{G}6(*1BU z+`*-8U(5raT{>M(xm1Q}=ZBlxSr@VRsTs;7Co`I~QWG<77M8U1fpI*uUrhA@>7nDR z{n5eLlq?A2tjx3hvMemkjI)!n;py^bB#h})0toHM@u-tc=;mIqlQ!s+M>bl)h+X*j zxInEV;rmLl=F0r!27+v7Xzs#HyFwnvBQ}p4LF55R20s^O3kZ2_LU|2=HK^rSbhjt1ULd87G+=coO1OlQHY1Zvy+N7yD_1>uJFANf)^iTQ@Igqu?~{g1t=WKK4sv z_-jx^#OOiw4MzzJzyH3>ivubtcFK&vK`v>|8_v0>X~+Jz&ByaBw(|O7 ziOHOt%XMw2^S2JGb8pD=w_hImc}8d1O$uG23}TT<)IiDFIvO-;r8&g{)t?xVUz1LO z;T0#J#7+uF?Y>6UL946Zfl{cU4Jt>4mYnuJSIBX}^C)qFYXk8@vkUNo8)+#GXp?tp zBAu9BPhP?5@XJvL7UMRxRbUhcQ9)`M+VqafOl!t4aTG-u~iOBHfa z^JU3dcKRw)6xz}ip3)WK(-p4K74p#){^l)&;4KX1EfnD`1o0M<@)qXv78>&wqVg8* z7>ndaWd=C3YhHAtaIDC-5l(@ir`5tPbi6(T1;|3IM_}$v*jG!|Uj1QHPkUOt7QfSf zEu?Evr*+JpERaCHG5+*~737D9)KBT4geS2gKmy6I582I+>r=Uw0ON-b*Odvi0Sa2w zy!cJ`AjkXgu*6sdJcZ$?hkBz`ib%g9>+_KQT1RI-vV4+&8WpC2$71?xT7X{Ga3Z}g zJzJQ1M7A~^DtnY;%F;0BsvJS1K1U1UCsUAE)Snn7ccCSn6#CC7o~R$|`bExv=5E5}O`&o9WWZlelGSCV_~D`cmH* z6Qs%^{YP?r>T9YXioJEAUXJ9*W>Ou1>ekz| z3HGvVJ`FDjrTWonqApyr%mKXmfU9qPvS_L-FFapGY@30-OHKqcL3CvMuBmzUdqY`X z7;s;IY9OO#bTuLmw=?0u)aaX*oc+k|Z=8>el9saIU7L?7K4>B>WkzYhYckCoUijIa zSOBt)akyu)+?FPX$K)k*_QaMPRWV0M26{M0|4GmnLJ->&n+F8OESr5XEZSy zu8lJYWD)I%v^P1B&YmUPKJ$vrn&+Zu8vX1b1K)|cV5FG2LwvvA07;*yo&#(=!2T8G zn!k+aJKRJeBM*r*f)`^D%UVw^F*Tz1#o{aEKnY^C7C>rUrns2yS!0*MdX?Stj^uai zP2Pa?1k+>Pw@+Ge)$=Vk{fy!KyQl>WZ37MEE@o%dPvU@spk07eB(Q~w%l9%?H_FkaPqX!X~Sg6+)qU!#t`<%G64Rq(GMib zdex-2tk_3bUeL*S$p&XJeF@SV&-sMLuJ3IsNhyrtrFbQ(pO9%*f)IxThZrRd&OT>B zaaSYb!LaO$^xDd@ZdT0<GkC$dc%&?5_|}U z4N>h+kF*o-kE4=%m`cwOy9x(aI0jd4nyAmcA`Con^uK7Cu_4NN{FsbSlp-}w;p94= z%Xovk=2|v$NfDg>@mkO%6gJ+llqpl9`@^5j1@3wBa^}7CMECxODF41UMas^^)I;3T z)W+lwgGpL(S{3~a(2g*s<+t6&BN7YM86YSqFwE zbZTh}>K4(VFv~iUfZtuv4h%zy@cI%l8%5w3&No+hw`v1!7s-H^9uV}u_zm?mB@PP$m=}Dn0%se z#qdn#sne`4`Dw!HWhtiA60TL#9d7z(?WLKIFfyc>IlaBJI(vSkN$*YP{VA>Ne9-5{ zv>Dng?ym&`#85_FNey}%EmJg52B9YMn?dc&@l{&w6O z$J3`txs$Cw?ok=c;=ZB@H*2?%t)n%1keEQNEg+5IKN`L%{%lr6S%iw?6yLCH=e@}% z!V%B5LnKRg)ErHpbF!^rgj}U#7;2sAutJByMXuGJ{o7g4P z7#=)hpVipmDMg5-Hbkwk8mT)HjG_GA38yV49gHA!SC(U>Vlh~~(1L5qsZ*j%-M=4V zlKzc2Pg`3(PxH`F>6-ceUlp525ielMEjXrC`!l#A{2Wo=KjUN*af2f0A;(E2L)4L6 z%I_iF7{lr_n-%{LYwr|fTi2$E?zC;&wr$(CZSS;g+qP}nww*gOce1mp{)&$OyEt{a zqwiL%n-z1#7|)pF(K`}AR_dKTv*4WUOS=?!$jOz;2bEA^ff#0(jh8kY~+IrcZi`0T8r5QdV}E& z&}DE(a)%OF8<5NLiuskp_6l+r3EB(XV{j*PR|(n+>N~h6bC=R@7qH9v%KC~ExC^q& z@al6H3hD>^HMA$!{{sC5?Y+B4*QbYhSuJ< zx+eze2lq9C_3VFwv)8?5dAy!)w!7aSSI6Og zVW~688>%Ny;P^mpOPdm5*th1kt;dxb?wv@A-dN#2#D^t&%grxz_(KYP#^F6K9;b3+ z-P{v}oYP=PHBZaiw!orOa*gw=lNVYVK`xS-qDy9zq0;7??mcM4gpKBJMkj-dSRO)N zK#wrQI@W*3=g(iYd_bg|`5UZ^s7%cph_xH8S?45Pzrcy)bxD-4NTjE&n(#0==)9Mb z+Q#YKrnMCx${@KpcNrY~M6NL`d!mLby_e9=xprcK0}sgnVqx7WT|Ppq%JQeswZ8>p zFB#OkiRFOmsUnxYt7^|5Fe-R3MzoJ9AadT3ve!7>CUYcBusy#$25mSio(W+Kh>3=C z7bssI zDKFBYnP1ZVO%ou9bW!Hj)K>S)me*|h<`4V)`O6-L0tg|5p#18fG5}{RkNj~<_wi~E z<7K!*M|Ghd?-7s=Qf-`s6Qj(?+-FA5adY3cf2M{9&0}~jUBi?4o4AuRQ>Ij@vV7{` zV<6Fss@&Q%C!eJHlVy!aH^VUO)VTk+;tDF{exr8roaZjwd=73wUQDkq*QAaW!6(YeT-~@I%s;sVOrV{4GP=t>t>itlkJz~Hn()zSS3@ouTv5+1%Zn4Svss;D z4b=xnD40LEy}xAif*-h$+D{e}(>VfPv=sdST+4zuQl{l@^%ZAjan}4RtmS3n9=KcP zvp#r5Hfw1GzRpFDz7VVo?<4BDyAIT*$vI5LfgenE9&^+ppaR$~!R?hM{S5OXh{~>OjtrKk=9F zAr$*4I=a9_=*uESl{if>zWvK=VatB~L$KF&w^ycCE8M!IUvJ<%?Q~LFHmH&A`IQPb zb_E-{i(r7?5uFGhLq{_JF{01;EGqMa?s>aV?qwwSCe4Dc|JZ&hW$1J0KQR3tdD{O! zFzsmKXd+~1>*Q=;>-?{qPjZ}q)F3~6@Gi4O0mFu7<=%WIWCvJmgnWb{!J6TMwn-xG zbqce;abfRd;$A=AUM!+pVS)Q2WZ z=Dp&ydd=}D8E35sgLt)w(+Woeqz2X@R{JL;tpc#0h8CxN%j8(t- zQZ7cV%qmR-7@+GzGix4}l$sh@BF(jx95i2U3|1i4G7=P08QB;VH;TBILzIC|Y^^ zmKOCE0{p`^j73nH+imN}2dx3G(P-M|czf9G^0nqiXY*J*rGEXn2lH<;)|!Y3zI`0V zW@bAcr|G92JL%U4e!U-{d+y9&cYpqIbi<`&St+>w_m*6mvy`u7IH@tHC{RU+3=`Y|F5%_rq zPaFmhkp50lyOsRWNMvG;-IUnouH_1Gr*nDR<{%oixBswkfMH}VZr9@ItE1y&W&J|8 z8E}E7;#s?N8CQnbbnu|;*O`FF?M^?^Sgoth3NQ^3lHe*#A5oE1n`=NW%iM6eQQum6 zbu4m~eXgBSo@?k24;P#{PEQVp&JT)jab~-PzuS)n!lR6g)S{JhGP_&L3%C{@KfJRD zb%KN~gvqCOEzs$w1+501!*)A~CSEPEPLzs9)D6wk5CP-FKrYaPW_l8_8mNkA6^fxZ zS?C9KHfjwpL*H11R=%gsc~s4$HEw5C$Wpkv>_XWrZ_=L`+6jR3Ti-Z;!MCob739*@fSie`~Ghq)JgnS$O zST3Y|a|ojBJ76o%(M(}VQo*qBOv*P?nV@`L_zeJEfj%IG>u(sB&(#saN*F}n6NLaW zXk|eJsDeETvEe)pq1-e*pOF+@!5+MboZdvE#zq}s9j$s>{i2BO&{d!x)zT*WXYnB? zDwBR@4o}BSs(G>-0ExX+KVhhbq3S?IdcMA-RFSA;96mgSgu@_{)S#q*WKD3%0);8h zNG^TR2}zO9@q)zQaaCD+h@|2gQSLqo8w-inS7#W@Ju%;j1usUOqIN>_jJb?3HDRHr zu|ox3Vm)n6V+zquAoN7$48vnab(u`Sp55PC=NS8m%W-+eWg-odKo20(HpDV68ifJ+ zvaA`A!v3h(VzrOpPqAlZm(*Dm`8Jsso3B3OP|h#DCWRtHN27t|#MRjgjrN8B?O~R4 z1UWWn37?G3l5AFPl|z)1q$|9d`EFQbkDc8r_S@OBc8;G<{N!P75>yP6GddEJ$Jg{b zqoI(z>N(0YArY~64C@xUY>(a#73{MI-7MlrB+MJXH`@yLlnU|y8zN?f*H;xlAPST8 zra0GGX5ir;PKH|h6OpmqH@1-)A-Had|56Bz?WlhG*XbD-1rQ6ve_xb|=#f5E&Si?q ziO%-zgo1xb!{7}(Y0+_M&GGkEpz+U&dWM``txHR^jFIDI)S*;6?y$zst-|(ZHNS$} zpy3fBLOBb6K&>HE#x9}F58nj}`{SMSCEEYiDR!&00^ngFDL}sGZfA7H`;3=I0K@Pd z<)=o6Kt(A0vM1IC_HhUgBJ+8L)gts4cLy+wV80v$VIb+h`&`IFBx53-zu8 zb36BdQ{d*O^DRErb7lhft(l05Yzt^5#*3UQKTfRHAhsBW|Kf+tO0yG;KUf@cgFZ|P z6p-F6T<%^$u6Bf3MIeU82_g_m$IEM9GE*3#z2~89Tu+*wjMo__(6m!hMx5w9Q=-q$ z^9o;qe*1*PzSSXEg3NwlZxiMPPm2B}wWiC};uEe~9aRjA_BZ1>9qrj*keT$%0e2sC zy_Emi!dGmgbONie(mhbvnq;(FZHR0D8%M6ASfQ;rOzW7Dk2P7Db!R%qt&ye!-jQgU8E1Jjs}WuJSiOY-7kz ztGW9qMw zyFmZAK8jh3@fae^>t=rLL6%qW59h{6Jeqy?AsTw7kQb%QO1R1mJ0u_0rlhHp{0V>349g2*uZo2s1 z1}s#QKj}3TARj=Z%`EjRh z=}-soTMTs6v@Ox>04hqVY7jQN)TNGUoVWdnB|2s|BqDZddU$kOR1^HS!pHiiTv9%L z3zho>1ngl4piy8?O*`qVzISL}k!mSCUCGEC#(RJQ?-DTo&v|A2I*MBfAP4_MF3>y- zWnhM=4EE|m1m8sFj%vi7zIZod*}P4Q)MNjvEy$O;|>a=@&vL+(=-!kh}Qwjb=u>s$C`=bb4zN>&4WsOo|XVQ zRCXH$Nms)d9^K`sTP~Oj1noW&AT*GwZ}ZuqRQ(m{fXqMKYBVZ5fRSREXU6W@6Kv*G zqlQ-GoqZqlXjPMw9e|9WHS`pAgieFW2@ViM(KYln`yKwZn1Is?jPd<207k>K%Etph zsPa~S*#a>7342)WBVk%)US+mMa9HEAC(l7QHh39!LMmWIw0lQg$%9^RoTQ4hB<)vB z*4$XIlsL^PfLJ5tRA?ni_m0AEUb$Fq(cSANIXtKN?9vP2WXQP}wyC-=Wd$0%-U~LP zY60voQ2zXyPi8np)?l*P`Gh3nXXjvel%5tc%Rn=AAuy;FTaTU!RWvGMA`+l|`Z6)o6 z;nmO%=8d+?dsMR(1b^%t>hUOj; zcrFYh2COSw(=^RJJa;B;SQL^-@DZa91L1GQ*AgDzF_pOL7xQ(HxmW`?&yf~Q|6GU{ zhTA&)wXmToS)lMcI`e?v=8qm)f zZHWCO+0(=LWp7Iy#}qjZ!AId1j!?iQM-TFDTsrvJ)u6=Iu*m@T*vl=Cw-EQ>R%=4} zuFqtr3}YzF6qY)&m&6Hg50vA(Qe4tJ4KX5}UXTxH$;{-dAkf<`?^6runL*JcaiBRN{-b#HcIrq1II6AugLJx( zQ)YdUdQ=BB?mvN%372}NK6FuKXu&{pV*0E1R0We#)OoqX6?no+D0J$33~F80n4H%GXP*B!^=&7H{=Fgy#$O))O59`r4num&(rNYN*lVd%7O6efCsw zBHNfq_#*l(M7mrNzXD(TFQHs<(QMY`rKeS)mFUt+N~jWk4FW4tAH~b**JK{^s~!uD zF9D;I;3KC`PB5d=eM(tdfhhgn1P;*ztwu#iJ3skpZDXMSAolmwtbM$*>#q%Rm7R}e zxV3=xC7Hd?6NH#@d(1k^C_ZYu7d-`sRt4&v;R!ADuFu?}Cu!7YmL%#U^k>fTRECnl z)P+xbJ)}<>>?+!j+)<>z_d;hsGKuYQEl=VeE|F%0#?a%X)YL`QZ>}y`rnLl_^ek&# zvH}*(v{4Omq9rrx{SaRe|ir=8mNrw*Y;1PIs3sez93bj^43 z!ta^WRcGVQ%74(2JBDdJe=Q0NB?W+K$ZrB&S_twj9yHGL7ach?DSI?`(jN3fHE=9` zEQvezU)cb%xKc!KG!N4L#<52TU4C83JH`jefLkIy@jIcTKfreQe6n{)#`mIMS`a&; zI}&%aJ@IXd>^(ym_5HufqwVf4tb`gujr@!n(4HNpv?2Cjx`xU8-C&mAcmG|PIW473 zH2WddzJ8P$_5UJY|FeAkziZY1Rh0hI>-_KC<^O7V{?DRtng3`tm;P6)xwxIPu!+63 zoyUKF@n6@`Y85FZEHU^mP@1YZH2Q%Efi(1kv@?Jzm^I>l2W#9G2jXH#aN-#P4Anq& zujb0B81lALxuZ0tneqsTtqb$9{!0Vi3;XZlVN(M7yzt07}+AmK4eNYl4 z9O%lLhGgW;mQ!1(@t12&d=>Z&Eq@)DiGjy0c?dmmuC0B=Bpb500a{C${BjTEG7^Qy zfX|e^pnm#O;AN!SqnuA^aXoiel^}xJHs4|0y?k=fEOQJd;_Qy30kuf~+MyiE`wD!6 zeTv=VmeFxb841Q5GjWyJ(RvDxYEt7d`PZH~(h6~RMAb)^qms**%gzg0pxLaLpX`kZ z8+w$;0x`T$Y_RPU;}GL|v@N}M(_A>M3<*tI7}FDqwqDZ3G7Z7%-xM?x3j4O!{^H8N zC3Eszv?M0o+x)wQ3rSfwj&+pS`!@-tSm^`r%H10G;I@Vyvj{B5puXmYX$E_}z<3r1 z=mzxX(<(QqNNo`eNQKaUS-mx0!B@%GBIKhx7@~3&rmid$uvaN+^W!>m*mn{fyalrr zViw~0Q9Y12C>J)LQAz0~(1zt)ZWK@yN4tHy|0uIt^1c%TV6n+;>8o?J+BVQfV>p%( zOPnes^m0DAbtkD|w4Dh%3x1dK>@>Q8?8MB7yxe>bhx-aD>uR zZ>uyjue-^`5JVs4sj!{=E1TzQjzOnCK14X^jHS~e4~JEjdjH$tEN!vXZR?OJqc(e; z1GDc62{Sq*BZ6~%<%5Af)t3sI$0~wrHlk}q8za0qj~3^?Z+WWO?e;eX46spCs^L@X zf&iYT5`u^nrRTyHfxs!qK@XAc?&ahs1XZe^?9hJaTb{-RiP~~}-xasE^$v8c=(OA!o>^$2GaYGFk+Y>8)mzRoS}+sGFlZ8mk2xSqDx}# zKHNh@f+hum&pJVkXnYIXv=51-bX4xrWxWxMYkwh$NE@C^&SO&1(Fr;QllBk((Vmnm zGVg%=!y437?_APpnT1U?a|!`v zT|uoNd`e5r^xzgn2?|7VRA>9lofdy)wj+OTZ&_#d;qI)MX`2q2bga!jv0s%3S($_F z=enF(vTSTE?Jt9?CC=YYiA@qndA*+_M5kG|?=u{`hu=QC?X%ckM-IQtA}t^zfK$K@ zbKI40{{#hedn#`pgrm>5Av`)`kc_6DGzGI^ z0MOtv4@5TG%ZbNQ)3`)lg; zp^quZLlrkoE*A;(?ZZ6>|Hz^hP}-a$HqoQ0T4lq|N-g!i0)v1#x0bi&w)fRGb{h3< zg&x-nCC{k6eQhi~2%R7I=JZ=)3SLI|$k1SiP{7p9F4=%9BHR)JCNWNm2d+_t>!NMt zY&BwNA}%yFn+iOFnl*6fnc@`~1l3VbX^OV~j6_}XwPsa7>oDqvg?Q#uF`P}SnT(!Z=yuK{i(5Ut~@(-Ps~;0 zXf=~$5bRp4U{7I7BqjQ^2yBFn1$>s;6v_66xHAfAYiagf@5)(`e*u$yJi9dDf|wz? zMF?m_L!&FFd)A0q$B<^#900liAz!GMLCp(F$ey4MTc3yRORXDUyS!_0OD~fQx6tTId)iU zFtg{0v{KKv-jR!v9(LyK-(LzVkhiIf)CdHu*BS;x$7a7z{bHXFpG2-Q^o)Uwj-ahF z6*MFE30WbcD(2#gpim7|zH&rS8&jWn&D_WUWUO$lLVS;zL%AT zyNwKeraajv3WDI@kr>43VobTBK;I{+92?a1%fL$l0BS^#LO+a|i@>2nLSK~NH`>NR z>~w>=4Mz+e*Y%p{SlXZA+y<=-f)}0Y15EA7rv*X;o-HE!&N%>&q9&v1%38I10t^qY ztuf}TYi@e|XDBk;0ay?`)HE-|mkf7}n$f5^Qda!MNw!0xl2n-t{=@L@tmrYpKcai8 zC|nL$n{xCgaInIHZ-hii=-`uzR8n#~xEj*Hyd?*RufPIWY{nxXhXUnOPk;v?wB0yv z+S?lt_OAn|Rj zeT4f@8LN$o=qFrHhjh{iDyO$8Z~D>Fy_zam%0fNU1QRVUSCHqXjFsx?4tYUdPKaG& z!XmaC%ErG40@VZF?^!_fOztrigfH?8W3ACqt4qaj-(XO7hjeS&Z;v!mNXG~9uXSkIwQ4N<=;ni}E~%#@aiZdGbNcpy$+XDPoTM zphVGqkmk*B1e~X8n&d>PzW}ZilyS%cr#S&}*zm1V4eHUtDp8W`!A4(*Yh+R>ei9v* zBA0jMvG1Y|CB=E``HM>q6BgFV?@!XeDbj=xFz_QM+FZ)0m4=Vj%0zWjh!Dx*GYz{T zg0mcXQe;yTgF@!{ouKpSgFnv;NXDB*HFVa;r6Fhe0`@br7ps@^)qt?pNv7dZLh337 z1*f6`W)VhUs8N1-&03x%msN1y@8UVw-4IpJ}cX zggs={{$_n^l8faOPM1g7pP;aq77eiE6fQPaIqizj5(+_e3!@xQj~l#yVFHI$AW{a) z0OoUvOsCRnWt4)$4#Ha?K)o zF@(&eME#-@MfiU3N_GP4Yezyl4rMz1D!@3IWmwJ$KcH7WN`WJ7=;(cn6^l{b1whQFYfvUtItKT7F93(bJQd8mW;`~G; zHJuV*=IxWc(064pjbgST%`DjgnDlNae9I}qW9Bu9`9j`~@=Q9DDbgv~D1va;G+;Jm zJt;>hBbh3;tJWP(uHxj+A2U*ilu1WCQYXipN`i1Gw|vVL>&dQn{Z`yQ5igpDQ-Cbe zzhHA6Qd_boNOvC9wwD6bD0irxk%{Uz&C7g2=~=|}3zgzKm=9OBUoJlM;VvsK5>M_p zfoHdbCf!udzxIK`Zby@AswK3Ohg@_^jXP}d$FIc`CAVZ-9e=TTE_=4x@Y$y8Y3g)9 z;WX0NF6$WjKxgZqCf+N219&UO>7O^WMSeWe2uZTJiDT(o9NE zY_|~i>{Z*VIeS#%=JL%j?lxn&+*DYua@!SmPU)l%rNSOiiKrjbx~WMX_U35Xx`kV+ z{b}p|9@Y@3Yqz;M@Y;9QDi)Y6=3tEZ_(sYhr)czm zEM%sZu*z}Td|?b|Cq9OsPaKkR2ce6Qb!cou5wmY$C(aqlb8jD0RW>?^bVp%jcHj*L z&yb4Nj3J&GPE3m( z#Lhi-4?2`$hpRpC{y;$6qr?85xkn!*U=AZ>jzH8Vuc+hC8W_FO)+VMkp1*h42}gC{ z&=d(WiZa4Ri^Sr%*?TjkMs3ZP*#gLQhrc$AJ0u`{r=Ug)-A9`>3UC`1)Jz9Hb-9fO~~x@^qu8v8HPh^d(xGJg?NchxbZmrt-o5iDq{E zw87dH-YPG!D>Ja^4wn2BmCdztd_~X9YxWI8#nXWKoliUbG^waWm8sz|lRrX1wNr>f zvAs)1S3LeMzu1b4)#DP@I+4H*VWLze1nrRynBP~RpF_xgPf;K)P)b+@N!jq_0!i_F z@I+u(=~<Bf4Viy-s%8cm31nYu``R)7}pP)O3V7KoH z%76fLE`pv@zs|~b%2JUkG;>K3@XA~^F(K&%17^H=P*rt;kJ9aW$Y$_FmT}sL%ch3a z+P2BRQ#$dPuRaaXKT_+Zm@Xb)QQK~+hwhcjTk5ttkN26vgL?{2aU2xJd7|FFc$S;e8 zq$uqcl;KbBztaqQWK!zOKQu$$Pxwyi{{_t;Z)f-4Sv(aTr%hpG9;;HRT(K0vTAOMy99-#>O$2N#susPzP{MKY&UYa>^Y1OGhgJv?PQ}# zJbGX7dui8~n{B6Ao|l`8+FrkJpgtLHS)zXVMj@J~zf9BhxemMBE3iC#Pk=VFiyJ$< zZrEJl?UOz!0`Pb$yk9AXV3|A>uAvn2AAM9;f^Y3+{XPdT_*iP`olpV*- zV6U07!oG25ey`gsK(szo#eW>1jM~hXa<0yrPi$Q(=c{}+w`{DJtQ0_7NsrK5!N<-c zj@N2%YM6+jhH*m5DMe%sxd$cj<{z{x58t<7nl0_#`k-OSl~EhVsL}!l;wr?epwUs0 zvxFq4P*IHI5D7PF?VLBfw(K&zU?I3ly;9Dv(t2oC7ScozJq!_W*8m1fd`YMAAD%p< z)V)Kh2Z#@()dw2pu8uVbWp|K=voWam1DR{+k3c7C_k^^IBXC{Ij&Fz7MPBl_Eh%C$ zfZrklV&(PI@=?KMHeqn@jX+(Xjql%?C7t`$baU z`-Kb?HJ9$-UhN$U?buw8n(5jcSOk^)37FW7j=ygEtWh0((qF>YqgsP6DD~cXjtQbH z^7Y{d>ahGP$nYG5&Rz6-aN@g0&?p%|U+wVuE-lP}sKgFLv6Gv;7!Q9{8l zt?&BV-9SQ!&?d^FFxk%xnXPyp{q;oHv?6ie#XEAhRb(DjOt+N90Z{F%SbD*X-e2lq zzeq*1roX&@tyKePC`8z1!`QW_Nh5fETD4IIAt5Ph=V;; z?)Vi|n+y}FnOhO5-V-{MR5~?E23bF(@fYIdb{Ct45PP|BI=WwSTv1134{Rgj4oSi- zBP#i04{k*iwW^!K^|^yw09r9v9KjgU61p!2qHDPt6bRg1o!bYN$A@dG7Of%jI5TuT z_F=-Mg9mVTrarVV4@fy&VA9C%xllzd~R(^@c1g{YX;KJd8-g?MztBO6D<(pIMJ)+73?}2E(Arx)Kffi zCW?|SuCPN@QWDV1g`%MVIvIs0t+TMtS#5Yl?-WtMhiNzvweQv;Ip%0pnX84~6=Fj< zFAa3$&m27vwWut7L2zN{@ z+9@((Splcc$&)qDJ|g^bfr$>4gs>A97g7@Vb<1O$DViH&T7^;;1GmwV?zlC4&e~Ba zDXl(Qd1v`z->yXQ$uN1AcmsiIJw?=Pp-xuUA=Cjsq-p3yYtqlNOSUl)d_YI&7ZV3hYfCL?@M{ zL#o@AcL($k=xJSzdr5Zl-Xnb*CWokPNz`NH$c>H4B29l78(wTPt;*SQuKdHIs%hR) z$Mp*OUs6Jn`ok(-RWZyvjKXspl4?majBnkh9FsfiWNzAWp`)h>ek_Fg(wLA%H6khR7{=iyfC*Nxm# z?^E6jh{KyZO~p1)$to}Gq8~@JMAgpb?q>Zs11>osi{Rc4~(htCYL^( zJF#%^vjtLcL?$~!Hi9loxQhl5pYXf|`-4qYzw-_axCfr3<-_;KsI}zl*fO+Ae~;cV zz~B{+7*@o@9y*x%MAY+sA~LV@!R{eFguF=Xn3}4{w;fAlE#6u9|6xjv&@KpuvWv21 z@P(9{ygN*Y7dLUuAYw}D<|=Z?oxj)croBbwfN1@hng*lFF0M-WR2B5fapFuM(o%cs z(uJ=juRl?W^gz;}x5N+u1-Rirv{=l4#3h!_QgSGwQTwTc<&lb!c5~mp_`#!~{s61M zw5|X5jdE>S*IN=}^4U0V zB=aYIuyg&H8)kl_jMz_W)a{NDW)k|@G)WYLcOKFIV({gx1J$Jowfzs6;scyn7%R!g zsN$=faf^tQL=rXM;=R*HKtO2JQ67bimQDdc3iGL&@^*qy0SR0fCE= zkNvyJgVi*?gp`HwrqT z)x$&-c>|jGZD^q!U0_#pEHH-?(D|rb?;9(qB16K+&M-uzhB}}1iyjt4_5O-pW8c84 zu2@vZN93{1VOEV9ews9ie&kaV##iVkpOS2O)^X2mI3eJG1%5%b(L`P+2*I(K)l(_r zRKZ>twRJ=1pXB8Xe>s^)z2=Hdi(vDjw><*JfKrJfz&$-KPW37f2YfLQPden1UNmv; zA|1ZulpY&E8vwI%Uli$FL_H8k?vEl)9anauPO@vt&Y*ZFt{5@d3X`eUBkl|pv>=Mr zfsW4oiY$Z6hj1ep!fn8oD-@C7l9>vF#D=Ck${}8*uzWsrfOb+ArHNe#S$s05@!HgJ zN2=Bc2(@S1k^Z8ujd_Wy4al(T*Sb@^xfm*v!i0CIMP^v8!|(=A2n!@@AW> z$AVa%cHSW6bs-9Su;>jv9P}>7Bas7ar9`tOc*OC9NDXBzb17*qI31 z8EM;`pip`YL$PNBXMR)1J|O!xF>2c|N?w_89*QSA3cK z{f~IwK#J5_=g;ko>*sc+@_&9i`>)x~|E2;fIU6`SyVwgD{fAccFOf)9$_eR50Uq&$ zP5~xuFwqEyh$}U&OGOt%gc9dRw^kqj9R>axhgl2iF=(mA(&@PG^(7p`aXd9#mOvSU z{ebr%<_P|DGZ70?u2>_kk|8GdvRa#d^Le?;rwh;)1{1>&!m_x?O_FPw@>iL%zR(5x zn4_lU+}x&=f@ad0$3p7IFDy7-LfTq9JQ!rV(Xe7;C)rHPN;4j} zj3cBDlP~SJOE%I?vuM&*8@pD@h*8pEeCq5V^sQkHHI3*hRp~X+q-C;uu=L<0re$fbAS|r1cqr< zAOpdnhFwtp{|dQ>&nLN|qRdaNKX)g_Oh3r6iom z_5HSiyFEXyrUQ32pe`OkNE7YH%DES4Lw;^C4>YN02dxihs;XNBft*XMJ`#cc(3%-GN-&-fw-iVr)~;m(=Yax6uhmGa;b>*ljFM#TH;3u zk)5v%p?~$_VO@E&KS;(Q!&k*m6M}~-cXvLrKX2rc@X!u|horQx_e0VA$9rTVjREK- zG)w7Yur(NDjB+wope4!WNhTMW(uQra1fx&hmy*5T)dVNsp5H6AhJe8c#Fw5 zMGm@ffS)6?`v+Pa2Mu>R{y3^AesWlH|L17&Uz5rI4K36h4eWms4FAFjB^^7&pOh95 zGGvXsaXuTf<;n$Rq^N9dNr z75)+J%kazSrX6D_pq=U&=b)IEzd!u8eE6QZ13BoJdHhDsf3pvIXbZ)K2^c94yFdGz_ zY6yNNGRW4JT(I+B38Iht3WG4n-5TfKKs(nSw9$NgYL+WQz6L2= zmh}B)Cn)ShCLvLvAay(wR=yYk zQH@#wt`zkO$e2&h^Bq?uIOmU#Be^J1GD$C(Kr!{1sFF+nL(xb}N0ElNXE0^GKr0V5 zqE_XbqgZUxK&fSgfNwip=P%}PkD4!X*p$R=HHo>rWD+VFlo25{dVr2g6})5`Y)u}_ ztpHU%4QZhm?GPPjOF>;H3k|J$T{M>|_PCuciH3xoeX=e{|4*KSi8d9>Hox4CB1)Fvb0lU&D- z#$jE0J*B$H*!mn)r?G}v2Og7~y*kt5@yd`Zu?4K?lc?(+7I7Y4oSSe6>Kox;%W6~t zTg(syH^J-XXQj}6B1gUTs$)_}F}s|y z7MCJsh9xD+CL_&gv$amQ&^z)0;DX#TT7_YmsglQy+507GTgjASq?ad0WN#ib`QI$rti!55~98XY#LmahK&zI_AaZvG$3; z7VT~M7G*W6`S!|O_3X!UOSIyXjgEEVNC!2dy%>psxoI<5zp{#(He+_x#mth67VCj6 zSR6am-3~q#No7i2Wl&vM1Z5k-|Y&bM_^*O$IZe9|b zd|G_n`WR*ehOE>(SX%I~W2iq2;O=SxK@g-mN%Y|qq%;!ZMwG!Q08Ba$o2 z!N?EU80R^hh{jb4=M{s{AXP_rYJ*P7ltF&P2$OA7Z8hLye^@IGF+e@$#FM!A=p!irl#~lvHa&Odu7K=NODk6hq6;LC7kAV~w#hiBN26Qq2s+`PoOZcwUO>EG z@IJr3Z=>o;e8~weqx(vNI97JTOHOS6Y%QOA8{DUWzq{uQ7?wM_`V^Z_Exjx$W6uGs0Ei@olJ<^r1V`-96a(9-kf!3e4iVb^@;On?1B2a zM+93!)8sGA%(#`!)Z}e*J-(i;k-`_qq}~xCpTQp(@$#{DcdSdkJ9V{lubeUd`U7N} zr~;V-Y!kj%5^a8e+1h!F^~jh@azJgvC%{znZ}3!g5C&R?6ZX`ZJ<#P@b-SM*oF6Bz z9?q{Shp)_%YN{tVO|VJo*sAPGl|r^jFG4v`C%KU-8b@*ifIQVX{CL+L`Q3|thX(Xz z*rx~m8rgLTL0jKL);?q@8UG@-gjP!$tcprQ@E!K|7HEiAjS^en0oofFp!Kf)R-4oc zH125n43*sRn&oDY(3qz(FRVx}=qICt1keBvx*i5xu1^JNOaQG&nyV$muMVei&>4>( zX%Ht#Jl1UaEvQQLMY4hWOL2f7j?n+chzwluSm4>S9~l(&5@3^T zcLSdOR+SIDfnFwr=vwsInkVYjgZNzU-QHw&=M%I&%?@t7#Oa5V5=YD{Ay zXh&(@X##u=JYzn@B4khxR0zdLP>Nsy*|F100(>XlF@P73r+-YiB*Z1jMf^E}3x06w z{|cj|Eo`m+>$ojen*1qtMdq2YGEe%M^<9z=vZ078!SC)5A1TNRKr9a|4k19zQ=Zu& zJ-QsFRQ>_{0gfoHEKdFUix<-28oC;JpkQKPb#?V+%jrb@@$w}$_t#C~KEd!EKZY$~ z`zTN|8Ii+4th2H6l+W~`55l<4jTFLzY>^NS77oR{%DxvIM#zIdJ1RH)epv4V+|iu- z7=yBoip5Ui5_TEf030#P=nZ?ELY4FD$zLSU=YagRc>`-T8SNHZ2kD;ERisDK|ZucEMVKy3_)kYA9A+vWBcx1fF|KLnkbCs4g z-{cg0Ed#8OtH$N47qy8KNg+?Fmrk4jhfuXawoNV2r)m@+AFtNM&)IKW>$LoVX{Iw9 zbgF5)0!1Z-8Rr)T)`Do0*{0aMe#(}b?7W~fxUdzpS#TkxNEJ71i@C-SyjT=mF@tRP z&uk1@Dh;-VH+|$2tRhNzO&Q$!`iFnsUq4*wKMcYcKL%mG|C{4b*~8vM#MZ^;U&~Ed z>qo6a=fTn==CVwnBw&^RP=Z{O)%qg{RW2iLk7I8oMj$)wz9-Vcc8;nsG1h=_%64be zSG))djg#|U$m!jQU_pBl%x%thz0PymDOtPwaSz#tV{MhDua1z90_wf$I7|zdmEU{| zmcQGm*|Y3*0NiEN+;*r@-1qXKdj>YJj&bwYuzG75#w5+-0vdD7xsyY}5aM2__?43{ z|GC=%5@KB3Vq$koU)0)ijniqYR>>-4SlFPWWtIky1KRku;=}_T)GF51cIwPAXzcOm zaBXSS{nn;!M*d}AqyA*LiIM}ZhGDp_9hjB$0lOMM#~_yJzsGl(W|me7d0RTg|MV6^ z1q+)6wC}|Y6CwqQS|=`nLX`f#-dL|TBWM<{O(f!(3PT*Xlz;yETUkWSwD3?UWEf`u zL3$l3(4b^tTzP5S06*b19zX`s1t(YD;suEBX|w0@jk5vyMB-s(zP#uJ<}4v&!9j;r z5LibnbeP_2qL>Xn!hVt;QsS@cXdj3)gS3**t7-4%L4VAmW4m?!uIpBa(4UfSz{RkA zCyiP<^pnx#^E%)cm?8#>-3U--##vMTXSr=uEii7`EmAMcOw-S=KIF zR;6ucrES}`ZQH1{ZQHhO+qRvRwlg~q?mhQEV|0(x-A`-p^|sfZ>x-BXGiHPkf<~<$ z52#KaO)=n@arOiS(f3c#dG~9Nw1af@Hbaq-;EpzR^Ayly%Zyrc9bQ}u9)AUr+fOkf z=XH+jMwbd+YVr-sGRg8q?q1qm#GT!{?SoXi-7*x*7oBY%!3 zAwB}ODRU4haEic`2R3Rfe4%}eH8cXh2>mc@9QhL~B^D0OMm>fxH$^!XTi_XYDP<7k zNIiFn`WyA+9ejy#GKI~e>ki z^8NM@wI#Xx^B2WS;IjkL)}NG+d3G^!RMSlSt%kWVQcpx3;nmbKl;D&K;S7(8z4DQG zp`=ll+iruyWrCXm0F%TVI~P0zLsd)(>I`BX3;}69EFF;p_kgjIBaxO(52W#Ka}*`Lw&O~ z`tQ|X|D1vO--!JGXG$wPX~O2~;~mmRu7ysKbVgFhKxooZDx^~h1107PWl$(^a^bz+)hY}k?BpRnM!b{II4

Vh+6djyQbGex?%hn6V7b5s|(yK6y*1Z`&N(RD#RO5v>P7CAWzfnjd7>?L{N z4-gpfMOG6=EGp1XLDOmub7HadnFBXmw8EXx4EeeT0tiS%h@+L5TaI*TZTdhTV&_5+9jh#%sGvZNU(LAf>xT3Y-& zZ2tN~YB?-6Tvx&+{XvIU*J5GG9vyj$aHY<@8j}*eIu=KRH)UpP46dXl>}epMX&M zhYD^X#U!>_qQn9P`qi=JWL2;^`k<8|LpcMgPiQ8{R`0*J?0xaOSW2MV2|9 zPri#N+Qu#^wXY{{v@a*#pg2-^IH=>#rfc!h5-H#ZPb60m=gxw)_9+~9DZx#4Y_*ZC zS90i{Sppx;BL|(ZB3bj^f=4SP>4qUnIL1Oz^y_$4!XXc6!$YL$dI17w1rx3_!^lS- zppY$m3sw^w%RNXcsQ!sNG;IR@*=HTu79C7em@NI4-H>&QkLf--1$2IBCIBWWJ!pum zDzb!BKo!V8ruq|z$O1Cmd`so8yq?tbkpC8ttzD>?Fra?7l4F8slJ8 z3K;GEuBn_`T?=!_H}NhXe>h|3*D#KirMSQ; zemZXk%Am089vW`{WZL3SmW7YeX|kCZ#Kg6AE$_a4=;j7j(Y!Ps-76f_qW2|@Rx$F z*{E_1fKr(FBDw7Tz); ze{iNN$D8-ple^9F^2;|3fteZ6kK7HV-w?E)0AxyveID698#zgVWsHs%A{6n!6&i_F zbR_4P14A~9H73mnf%OB$&$wRpM`UAEbAcjqE@QkJ6%FO}MDXX0V|A+bL?09nw$X7! zTagHwY=SW$;GakBRW$ah_MSRBK9)g$-(6Wk6c!X`Kx$7ObR(AE4Pac2wZpK__RPXS zzK)`e<93@?ESbO)D4RWJC|GwRbP&xw$oDyedZ~gqEI&Qv6}B-B8LYxaz(a1hy6bOX zQ>N?Zd+Ih3gmRB8Unwt``~*RB@_1fpn5Dv5jv?s^WxVJ%mNjRLFN%p)2|Ns_a{^(j zJJ*b;aM^9*Y|!i|STWZ$A`+94$PyrhyWU&JKBA(};O7Kran+{bLqS`J`61-%tZZ`8Py z)94*!em0A4o~$fH|5LmnDYTRyX??1WTOwU!ZN#1)Rc($b%w~V814_r%OWFu6ro%(<$fAf+mQ$yo?WT zpOw&+K3L7E{(nnoP7m>5xW5sH_&wCi{vRVw%)!zAx8rw>?tf-A3fnewe=}p%Q#2;O23B-HUm$24$+DJ&Syszh31TZ&0;1|{F78S zkWvbx9I*z)UqjfHC`*12MO89gvRSlkySPO_yAFce z*jH^TA~Pbgo5739fbp$kZ2n1>zx}c>|8^qATRKfTNjXX_E;TG< z>BD6Di&V-2;lZ8f63y%zV*NI(C#c8F-7Zb`!@r+_-3gBCN{s-SyH`Zn>R@^M>V8Up zx_&-m@$u}4lr>RW7jWvdK4yPD^jNWBZ^Rw zGdhD^#-AlkVqn%4W=D-ampdiMjUc?brUSBANRG}8^9A_klRJwE^(ZVwYe{H|+pszg z1kWFI!mpgY0SK0u1(zuEdj?bWkr-V1qdx7BGrIevbo3y!E~oO?4(HsjMgs9q!xM%l z8L#=QzQ?>gYi~KsCmBr=N2Hu79 z)l6!$7`$u*88M?>;##BTxHCh#jahvV&Z<)a(-=$b1L{8291di}sr-;t$L$e8Gk`ot z7n}OIb@NF51-s>x;+=l<^lvzD{=dP&%+lx|NXV3vk^rQG^Q^_OI9sYVxB6gpDTe?-5|Zrz1I|6kopWC+ zvNE(H#036I^uzzVx8;CXo2=QH5X!fZ{AsIW)XUS`1Auiv*#|wyz^Ij}Zk%8-QJC|_ z-KrwWRpPFNCgS|sJ^y>=gLLj)+Szcxf;{f$98`Gop4_!4l-qmTZ;JIKy!FB(qhP&O zZgb`eIsYv(fvw+|o_4m5k~0iUvX2>fN}Fc%1vH|Z(MWx8^&@nY3yZwkTpQmyUHD2- zcBxGiIR&)COEEgDH*#av(k~l$`@}Ob4GGI?MQ7s3W8O$ObVKl8(LLphVig*NF<>w( zzt6=(dTJqWu3)%C1$a`L9Eswb%(lt&(^<)0B^d5!RlOlRreuS&g7vekGw2-_H=QRs zT~vMbmrxZ_iqT+xs`lU;1rbro#OTO*U=th{#i_`Nj~s7d<~l!Z$^MF*di&FH%o;cc zmq^;8FeIa^nr>deXpT4TeTN^p z|EGUe_P^hJLPaxMn}2=%$KPG4xGA$Hi}a-xj$}>}C582;YZc_=e50`5X_V^ zCWea=wZl}(OiV-ay_(r`#xiyF?z6<`m|1Y4rFgdJ$z$X0hT}MEecQWB=Z8yhGdVF@ zQ$-IL=PZ+DIR&Se<-Hb-t!MrP#^=wcfvnl5jh>5^rV9)%XPK3usX~0M=GRM6MR>gw z?gNpHn$~)ogbcoDJmo6SHLBDjW`RcfAxqaF)BX+0Wfrs|@kU{$&5aU9abkgsyOg^D z2&{Gc3f)Y;QNwhoSgG4kJ$XO@{$Z#~gp|G+Luv)|haM=-@zv?%`bpN+t$DgoQ>Zee zBgc{u@k`$*v^}IUeYQO2lg2=mV=E0>LJI5Pb*W1=d6+~DBtkHLTiut0hmdtZz6oh! zj;%T-&Rzy&8Fb^S1c!6byyAVfIVihJxwxox9^(-$Dz|n|Qg*&BkMJ_e_2QtM=60y} zByFQ%%^<&sDAW=9j_x$8`J=AvZmN$5@S?kAN#~v410oXGV){rPO6u}Bk`~*$y*>Gx zG%OvE22{qGJts!P@Y*5T&*WRQNS`FYn=5BxVHS+B5Fhvn`r^_Qyo!mA#(Ys^7lI+? zDfk?j1zK^3^{;>xi5>YFdap>MvMo5^fvcn0gk&V5X_X`3#*+#Y-UQL$1*VH3V@kq0 zV2!u=983}2!ls1SOwApRL4&ad2~f0-a{}6faX{j@ID4}*AArbso5#|$+iUXnsFi+# z3Q8!`H!g=~k*4Pe{29hahqS^`jP@!LbsKEj9{_L7+5Ag!8bjiuItEOX(X$r1l_{@~ zf5q~{Wz1&K_X&0L?JLFq|B2;)f;Um)Z#Jtw(@7E%?IC_Uz(22&!Yjg5N|1rdO&g_n z5nXB3*38iB&Y3wB5WnJK(?lgb{^rITaV*(Pl_{+g5PX@+uqXuY@ zb%1ij_H-mh=~uLh>WP<~IUgzD?m0-*ii3c%ler$QzxM@c=80)=;t=sm; zIeXTbN@m|BH-#9a@K}{2i)SytSC0pJj-0mIBGFR@v`QT^B#4B22es|=TCHx0cIh<& zEb}-@#L+r@v*E}GxjO73zshZ#1W0JxKuJW>O^&)z9R0n7w!jUucLt!=_7Luc$^?h( zE;eE&=!gRzxLLT0r^=Fmaj%6H#~ltD+eAZL;h15|w9%4Z*Znyt=PJ83NiOWvx-H63 zZHMb+z4L>=7K(LyJ9d5?FwyecPEf`cfl>FyzGxPgvJf0e@1WZPInWw903`J~Trf}) zFYW5anamYjW#os;w)N5Ky`?h;*?<&g5N_yWUcVRTrj@jw0ur-1N9**uZoIpA!vhN8 zY}rf-7`?qE8gYJsX{nu|taZ5>8Sc86G-P3iO+Oi0FJ)e8VG8#wp<)COHr{f|_^h#K zw6t-TglmLrfkNeqEyk3t{;W7>($XEms)m+(!~l{_o)b)LWtXCHxhHFWcV z62WzbZ^Sed165=4E0PJK2FxoMr5LE^y z!v@wMuIVDs1-_?x{9)k{F|Dp9%1{)e{5`ol58oUaa&~l7dCK$_!p*@oBQJNyTvNA+ z%Z7Cj4}XAcnZ|3+E(-2B#>ESw7=-5J@3FC!{q_9AgLHru=r^1F>cds{S8C?!%|A?#ELhEZKzvc_ zX2K;i&T2VP)f@}GrR(u0AJoc@ljVq~?v3yaGN&L@iAnazZFm!V#$DTi2iZem=!I37GN(=aR%&{`&*dnOD}q)RN?j7?Khmi90jz#5k6vSd6J*@4}MdGfM)p(ZMOseLOAtOFM6Ru*p5c$rR; z&7NKU(E58BZs_fzh39c^(eiRY103ZFXOcChf(Tfe@>8)h({XEV?xdSF|*BAiPeB;j^%)` z!E;95622ts@b4(U#g{WCJa=ZB zq_YQuGSw=oJ(PI1E&Lk2z}!Td#0zm&tpT6k0P75QrSgn_9#!)k`w#1sO4Y3U%a*?% zGLZ@R`GhzKU{+Wu?sC4EumONGg!C-991`nb81mA04|K(Ab95cLT=x0`7wtp82N(d> zq=9N{H*DzV6``V0+@U-%D5t)1Igwf#%p17nB=zq4a~Y#~m%HItj8E$dHF_691{2D5 z3UYUiHv~T{rV<4uy6s_QLwAizDZ)J!|jtSuHsz7>PC(v?IO5|kO zPd56^000(cJaIz4P^7Dqmn+mWyeHpzK_;&o<3PeG_h`?UVhwq{83UL`2h-Yc+D8WL ze9~pUWL#Y>Vjaf)CZS0%0ou79w}vedi{0x5dRYsgoup+=^D#<}EwOF?w5&5;i4)y6 zx3o&hlji<5>r9=8L)*v=*LENMn#}i&p{@%_To6BMn8?^3%06{~!0C)N`@>-IuD|w? z0pJP6eAT8Opti_D+Q zmosdB2|}v#U=^UhhbxtCuHCx~c)@wDF!L2A)R(Tp#r*e54}g@jt^>+VfRdb?&VZ8c z@&=c5!N<;adYpl#+Bo$RE0zuE3no*btLflpTcn9_Zsm^a{@f@bV8+ zFRRlU6R~)Kg9KCW^4p6vR8MjmZCgK=mTGZ(__J89vM&?~ipcdUg1((hKU6@HcFsB7 zQU7sq-rnB*YBr4fULu(qF}HW7Qhzivq<(5}Ap$Q*i^XQB6eD^dy8qDXyX86Jnv| z6J()h6K0`$M-c;3#(aCs^`v&ek99`#*jI9T=>WqiNG{o8zOboCrgUU8#`3yZV!jHJ z5E**%y0HMw7r!>m2Olycm(I!%yJVH7;YC&a(r%rUPHx`|(3YWD5Jps_KUBp5Ml*Ae zmoku(<6l23BOUsI+?+PrsvRi`2K5W~UnW17m$9(gygC=uQj5#)Y2KJ9#9QelC5wH;;3KK_4Vv;o+GHeQ=V$Ze&<6%IC z%vYciLFuFPrwD-D)ztDX4wD+dBXjmj)NxVfMj8)Gl@}4y35{xfbD}=f z|FCENS6Kd&3Z;O%U=Duoi5&>-q?^(sb7p0R>w%FXT)jywNNDU(Msch*tnsy8zE#(b zX)J57hvYKNW$C<%pL?^;HA@EwY??t_o8#9Im$-WCx=MQFp&-lpE$QIV$a8V>bTpan zYGb@L@#iwwrqe&?kFwK6F4YqFJ&C)q=$mnY_lGE|e#U1?Wqg8|_eLpC|gbA!M#H zvLO6fW6=bm(GtORTy(7jK_YhOIMVzoM`mQD;ajyq(O{xD^h(j-kG&8<6Fa*BnxT=Y z-97GZG{E!2J+E%GeGeqmtA}t~z} z<30EQRYy?ktmzVH9gkP^=g^$Wk>`(zo@qMj$G249?0;TR?Q6HEq248J|8a5n`(>eZ z<;n!aOZp!-GY<5-v(Yb)jjkE`KQ>b4=g0^$mF(3O>4p{@#h2~LLZKL;`gbq7+=#Lz zj2cVHjKn2~ltPPIQQo%?=I0U%`W|X_D64!#Gw92RnFwMr7WXigl9z%ihiNHgDu^(U zHA5;_xO2%?Pxz#*B9?Mx2(q!1;?kxn9q6{*+S2wt(cIJr`>YtX2TRh+i;&gG|X|m6K+Z(JHN7bM1T0g|QIT>C?;|7fylOcB!1w!}OS$ zYnpozjg5F%bWz8PG^+7I06*6NMXnz6iH`e+%Iv7pdC{u%9E;*aO*uhUg|8z^xb=Q1 zCeksLV_p+v3+nnOQzwf!eO4E#qHWN%%w$RpDiM?tDiRbG?UkY>_12?RS{d@^o3arV zpY$vWbsk-3h1)VV8ejbB7&SdZz%q~=H>U%_2|s#KrO9ieGf=t6Q*weY>6vpfgW3~1 znP1NFle5%ZP;}Iabd3i-qX~>Hs#7ah^MLrp4V>qd#<98J9hjq2s+bvA^cf`NiQVc^ zmHTNvP+DreykWj+Wtx3fS#VGQKY7-w2;i@>Z!iP|5aDAnngY*NLTFG%J$ttEk*8@r zcId%8Rq~{&d|wc^1Y2ZZ;{cdH>6fW2)h~O}0bh(9+P1}&|4O^2 zjA{MbS2-93KUb|@xdu|TG`H^;v#(M=S>4-n{_gKLYvI}W%O+)Jibl5KL#(Il9Y)4B zZybV)uNlwY(qt_t{pA}ejr^;0G%ed(c;};ItF6PCI;|)(aHdjsa8h5Yay@5?n-&ZK z45o&HZ?zv5TYzA52?@)?K~h!)k`yrxAjiE8}gSBdjh?FE1A1zD+0VD*Y7#uPoR7T>|Q5{2SO0;+=081 zQ0LtkS@}{`X4E+*tQ$FL{TwNc?B3qg4MgmLvV8|6Nh1RZ$sOKjPMCl?1{-wX;*-R8 z-W3!qmYhiUJ|tt{`dC@S{FD@bb@e=&oGw}m*2O%vrfOy_N*#l(wCo}Ata=L3!Vxw$ zo85*Zr1f63VV_GOqfYfTE{h9c=3VH@%|voaqzMso<}kdiWlQD@%6Ur>ZIybjW?PSA zB!a+15DvtXCyVP^?Ix{xTXGbe79Rs)c3IL@xLXTz8JbHEiu|dFMZRrAB(`4El+0LZ zw;1d{c{cNaEe=@M6IH~*+ZTBxv+*1!Z(UF6Lq`00IQmty#acB76-o!zV)q6aSW;>W zPMhsj?RUa#daX*udkH(ds|hE??{$l^V*3$|;rd5g9 z{!A>7CvD6Jzv|!7F*IZ~rHs=s8v zn`+SN6B@)k@J8v>L>ME`Gi*t?x;tz5bKs|tL=bCR&M@&ECF0)t;F!jGwL=@R@;zNn zN*;H6h2O5h)~eZ+-#&>h2nYxOCm#V#qcuJrmEGr=YL_IEnu{Q^m_m1nyBQ|^x1j7s z$?cJ$c<`SBMEGNEL%f5@I;@>pq=@d=xb|AfYnfP)f$Ve$0JuIn>jsuy((hT)9dWG4 zI7w@9i_Alb1^|)>n{G@6cKObwn_9!Oq?g4lDV$7t6=+dNvaLiOk>ILtu_}L$O!b@z zM$$l88;hW7i7ekPqqJKRopHh+O`IZh`wnONsio1DGn>e)h*{mk*++7iEXSDck))Vi zgUpq3Jec=lG`qrDL@%80z5rjrsJB`wJp8{n6+`_v~-N^*VhUQk;!M>*Uod&!@ae-x} zv<2Frxz@hU=@Hn0_kHq(1$#HWHUR4S!AWk5Q~|*W!%a#XeI*1i-20u+?L_pb*-Gzl zKI{9^{FDLrAbYm=#eww7=pk;wy@qm03KMaGv4r#heirwY_^ybK>x%3^Jl_DQ^fLKs z*=p?oUn73+YIr91tp?dQ1>zapFZQd3ANpdXWhUveIcy)N$i`dXL43FL%?9+!>RI;J z!M%p;r9pWn+DQg~x4)(U_CkJU0_aA0ck|u;;g#RR;p@wM%>C$N&-DFhR1eL)7}+(2r@g294vUKukXLXq(lcOIIiPo6J;OCBrwsTz z^mJ7Z&$TAvGisIvAnblC%rIcs178z>kaJ9>AUs%|6H+g3ysRZyoiq}re+A@V5w1qK zzC%oA0d$=L-2yHL*5d8tmW++bo-3X_=`3xW zRaV>0sx+dgIV!=8rr!Z=C^ToFlrtIgw2|sw@;vm)5)0oIoVj)HF}CHIyWEz@a(#UV zEx!GG+$tD;pe+5T#%5K&<*|PAMOMwG#oVH-u1UQ^$E!o93GCTncSr6epAE`M_h0kX zy#<}A+wba&_;<(gKN<=6N51;6u_dMNir+u7R;}q?={{aKkR9)uIfy(TmusR8|C@u+ z1aXY?r2v#@!(QNIMy>kIxMy>0j~_T=toF4x^r<$VY!e=TYcjU<7DmJDDs${stcA$i zBqUz#O{$uh*V5;CB`SA@44ujcEGZT_4VkOec)A4aN?#U|8Z{!Xninrc!AaI1Gmc&s z2iV=BPG>GIK1R`kNhxutwFXjRBJTw7cAOE}y`t?TB*MMAz9&$HbBf=Q_OQW1_MOmX z2$^M2^}E26{EB2tgLiY7UukrkDa4oj)N=c97fMF88_;oY>7#3-%wFW{xoq4pfmP== zfYrdZBhvi!Itu&ON0|sxpAPfg+QWeS4;#0Cf0X~-yH}Ez{MWP0RJKwi9~(Pgy}6KK<4t*JEHy=BV3Y?-@> zh%<1Z*g!VQ$D>+LIm$9ijk?(A)M}9cfQAq1jD8_!vD7X{b0{3{OMuc!u1q7Urgtow zgM^AblU5s;4YkISbEG>bQ)QxCFG&h;4^Fo1jUi-qqjz${nY@ zR}QcYEiOi(you1JmnRgQRMosIC~1Njnho~HfT4{D&Ug%HH&5+rxl}ysXgUIITuCSm zIT6jv29s3;fDTe9O?AW@P)xKpw!s*?-=PIz{H2HXo>CQ+k5*8JOQJ9>ChKHhrBo%$ zO(K7hWr-JBQH_$aYEO#TZx;jzy^O7fLV&zmiWU;vHeP6Si=8oG23?F6A=6N907eFq z$!knR)U*%-bS+uNwGHcsQS-|m-^^~^Ew}7@A-Idg1$t7HndPbWj&8iYGP33|r z+KKa!!Kh0UsAaU3M%KBJKO#)&591n@|WvGd6A1nx+pbiWL^|Ui-c9; z@>!m;F&emn)wi_DljO`ftevvS>1d!O?~Z$QJl+dNc1hHJ4-K>CT( z3e4GRKG4|ODRm#mhVCG(>II8rc#;IFJuGf1y#sr~k1CUsW%r2R&laEu1MzG z$|?M85l0C@!=Ax>Zoe{J-o3)!gNIjXCt53Q=^A+2X?V={Ll|YO1BOsPz|owsRTW@w ztPW4E)MJrL&vpM*ZaSnvzcA6oT1-iMIea(Hzk(8 z>qh@|z;>!=XkacQYl$F4P!gw%qyS|Mgl4kxYYz2F{lVP}^0C{4_?51@;H2Rk1A@kB z8p5c{(ODptet%RXHD|HcWHvX{xooD++k3j)?3Mk7^SUtX<#{D>%AT+1$cMHNj6peh z?(n!}an<;=8l3+1vNQbyW>*0C=g&z;MiLWAvm`d7gZuHdj!cL14rVip7j!NY!v^5t zh6Z>B7L$ylc)u9l@rtezi=?c~C27ei3^Ng2$E~_z;75}AN6kR0%{gkc)(SndjU1wj z(*RxPX2y}VfvsW$PZ8W^=m4_?nM;)kSqz8mB$mHy{X=j= zn2{^N7~o8XCLlQzDi|v1$=rwuwtxGEt}MOA2W3(H;pr_FRGZkBo|=$mIDy6ob_Qo` z*I)jqxuiXF|DJ28<~=?Vvv)JO574eDHydbu+cN>Jp2X{3A^Cfxi886k%mgvh z1o=KLk=+&sGs;>W{+D33Uog3NSBhjJ)jhl~@v!t7YUD;tmWfcqkhvk3A2uic*?v9% z>;Q8W2?e;AW07G`blC~$IR3~EkW=y*vU`-A7zDP09T1KI^Ic2%Gsy5AAj@&&&*8bZGv_z<7T3H%_xlcCaixXUxdRLCKpmW+v z`@?zip#yP+sg!zDXlE(mvhozcG{S^~#KN|A6jqdSUo&6@fX;Lr8H4~QkM{x9LDiI> z^($#p=#)^ctX)|lzs~5L%2RjNDM|_ZT5xj)+~@7{81-P908m_Hw3HPm_SMqps0%9t zq0rHzGRuX;JZA{gIv_wH2?vVZS7?ubVHVg~&6yPI8#J@|<im+? zBr>HHJ%Du%@#=A59~LSx?anBKFIWlNs>hi>gpnnf*w+c9ds&ReU+n0Gfw%X_bP%AA zPP$q1b@(*Us&6b)%lTb~i`Lmw`6YnTTwv(g(mb($n|FuF7UV6_T)S^SragG2q&e*F$dG?LtVz1z z#vJjKdR#hor%J^k&Tt#0+6%}bI`N_~94vZcc{t>&q5UIl-ozc^u$6u96O8kn=ahcM zPDDm0Cx``}VE>U{dP?_Y?p#N~y^#LWpcwRpC4e`$gXWIR?^{!3vh=bvYV%?vqF8}@ z%dNh(FY!api@8mra^+CGAXHgLYQI_2Dul+sxlw#UNiH1I7W6XV@et}ZVY`rV;HtlT z#laZeIl5{O+iRO+2~nrd6POdNM{t_lZOV~~?@W8BANW@h=~jJ!?=u8;xAbPtS#^Kp ziFBX22;}zTbup^*O`CIbIG*;szuvFk`J55(zX-x;ufk;Z$nvc9(tiyPo6(%=QHu+c zt>P8u2ft9kI%Jpdy6+{K$}IA?M{7UD2fo#&JD;J!T#vozqOWn|SY-z@@8m~X@?w$+ ztVhjbugP5|R0Dm86z8 zaj4A`>duwy9CI(Ed9P`WJz4n26ubDP*Gi;6z0Kqm=}^AgKmd2N>JM*NmhiL3#KVH} z!o6R}H(Su!LJEHb^mcwj!>s5!_89W;m0d=m@x z?i#(+$Z`wqx%IR zgGbnXv_oF@!3tO8a%^9EN)PnWBXRwkjbsS!R4A?M*5NH$lG>vxY`D*OSWc(+Ui33! zD!Y%jiBGK8kbC(ak# zmWguDM4-sKGtjTO&TVnA{mCP!`7ND&f`0_v`jR5<+n75yh6CB~1S<{1PQZ}J)liGQ z2eAa8iEN664YC5aLO~iYq^W*OUfl9dfk<;;Z?;$1@Vy0a5^lM65H%?g)uk)DN)d9d z{=n0T+JVP3&Yu{icP2e$?C7?!ta`&5Wbn5%z!@Ub`~k(d9L=0CWYAZ^_fI=r%@K=Iv%X85 zg4}oENb<5S(mJ8<=5PobMnvwZ5tI}zz5eGjuJ z{vZvrUJ9od`h*GO9?<7whQ*uz3N;H#fmC926bu4i(cVAlH^iah@J~Pd$HCkYmxt0xPPu)xTexzXS6tCbM|1_XaBwJ`0fTJ z7v#%u=TEj;q!52UhF<*&^$~o_!Ir!T)mdS&+R;Z_@cBgkoOQV1g!cLgj+N@N@Iq27L%Sg=-EyCXIn6Eq|z-w;KGWw7@f;r!F zSDx{{3neFWNwqDwTd!(rcPH2LHA+c_r9#R}W>qvc;t zwq|U1e#Duis!YT8nAj$&Hb%}IHbwJwA{aNDWmarS-NQ3X9L@u9lP$xXK}10p>(n#% z;t1iY(t5y6A|DFn z(t{<g;=t`g5A;AE0$fc6d3!d-S(Vmqpa`Y!r;SvoKQyLE{Qf! z`}(|b13h2SEUm?s> zj0BTl%B%^cVnGK? zyAMgOIq(xVLfLe_EdRDHcKW)z%Jv3K=`9OX0EjBb!YYFvc3@E?ZO#;i`;&8;09dRR zpIgRGb>Sv07F72c5*OIQ+k~*d0Z?$vsgzsYL9hid%C_wM(7{W|(Mk=c164*Ih$dYe z%PYU5+552AuiRPDXJfRg0N@#zgWvfZz3s?b1$~*RnasA_w$I)KxI(HhxxhFs&~i6) zBW^kmSH`S(VM}GvnQC#NK6de@p!>AqbmoD@gk-&pw0N}FvDAHPOh<=rtcG*hPI6Uc~$qq}*07+$)W7U+jo7^^EV*;~m^EH2dXbx>S zz^Br`NiK(Hy^-E`l(EP*bD~a;O{ZK6Ic_QbiQHsAh&K=Ixy`tLcZO4$zQHbh&VDA3 zQ9x2?*~ZLhAJP13Nn#L*d+->A8xiedZuF5+s1CiDacU28%A47wOMr>et#0+4nOb>; zT2=S?!bjD$U$V0GhmEd*O_{w0@4<;O%MY~==2^RPcnrHm0?qg22ZZKlx^XnHqvDKx^N)krGg-Z0L+Tyzfzk2pxuc!NynWb-a0>I9&d zCN0@V4H@~%u48uUTTEsH1i~u|oY}9CsMtE&d`CpwCzxKo6g0M0psO5Mudq)KcUZ6K zZ?Ee&F#Y$wc(Z!XCp|Iev>qP1HT25wEQH>Y1vJn`d#QrNWKOnkPazQgzcW&JIsFId zBe@S;7ROJ9VMlgMx-`0Ve{|o*(rZ>U$?2mwz^6{zf!-PF!SU=$cnE11-EdvXhtWk3 z02H#;QyIj{`>|nB%83i7Udh$jX1mhERl9^(?OH&h3f*7CWpa?MzF-?3yT@c+2|0D4 zuD)m+9!HBk(t@{3mQ}%Rf}Nrh(W!`yGR1KTV-rWkXuW5Tc)6rlejmSI+a3QF@PeZr z1cbf=UfBPYph?!o-qF&?@qdVI<27vNX_0)Qm#fCxoLE+LHCcv?Fl#E#s3ma;DI^%e z8B5n1L^}knldXl#o>e&UZhByMz715=OD0TlT-}2I?Cyac%60e zj7=-DmJMz-GG8nmMN;K^bK%FwsHDG$XeG8q1#x) zf_DhPWU4mY*^0c$Zj_YU<3F&S4d?0zMHJCtS2<*5LrBiFPU}eN4-h>|E?x7P!0T(W zJjGjgo2FHzA(@X;(^7H?r<&{?4!r;?819XthbvrOG~Uqn3s@UL6%$)^E(2=|nGS}4 z>P{F4-%A3wv2hbOW~tAC29j)Lx|g~H2t^X!MY((a9zU4Hlg6yOX7B?fTClI1Wd5eG zhnXtv%M-lDxxTRmr?DeW6rW0b+bLc+7`o^DI`2>qx(M&vPmmE9!d`ig?V#hkksgjf zgSQ>?Onh55&>XW&*yZmiv-dUvOQbF0MR-Geix`@XZzI+b`L4N#`YaqrzTXne@W>mUJANo(aw+I4Ot%n);<#7ecy*a|E6gYWblKJ`A*6$zR~#~4Ql^A*eDqN zO`>b|uW*wXJ1xD=3pdm)#jign3s6Y)^YwqVb{0@oEnfpic}jPOh;&IKA>G|2DcxMU zBt#nN6cCW^4k_u722m+#Dd`XqP`-olc-)7G@BbZ_i&)J5&7Rq3>h9Uw56|j8TuN4| zc#L&^bUt>Q38F@-lh!vQ^Iu+TU z7*V*5>KSuI+tgYP*xvn0AM)s77c3M)-l)-tlL^)XuC1j*kyK(%6n53}(mO4$B55|$ z=wZDVIaDjFA#rD`rLYe?&GH&5a*E*J2qc>BB&O6=aNW;#8qLW~3#zz2Im6YWo2~FB z@hg5#9i2!(DWsuZ9K3$v?PECQ9-k!o@|NRCMvE*0qaoLPjxl9ZOq*JV=#jrBLbPlU zZy)3evZSKo&$@VOqtK!6vsjlkO0-Y)E6e2V;ppzLsj#dk-IFQ{VS5LgwJwiC{ zggy<){VI88Nb=)nFjxNwb;p>{AH$E}rPtdEC+S-)Oay=!h9`HVO&q@U_s`u|hJus= z8XvM7WH`+&S2l`l|A(%mp2gk}M6C~nk@KJVK~Lt#oBQfpmEk#(D}FAkGmeJxc!+fz zZmJ3r zsaIbH2Nk2?mco*d2QKS?klIHM@4efSVRe`p zcRJ~f@qOkfQbZF1Svc%`b)w4eD2d1}c-%JZOvQHYXM)Gsa9~BQ!4uL760+%MOc&er z^4%7ECaM-lDo)iuAQJ&S#*YT-a2@1tLZ=EbP7&R8K{uT1U(*=frSKFSnkVU=_<*saa$rPg$|0*| zyU3`J+1PTJG$#*Jw@~u>c0+jUErDf@PbuvL&Pni8h0p>xy77iJSc5G~8KYTTVoOjZ zC_A@4T~iLpaynr0om^mBd=8I2=Llcbv4OYwPzG-^tRJVik?H#T{n9Jcu5TW))LS-^ zO)=h2h$Y$#c(nISa^;S%aU$Q~pGLZ~OXvrN>Mi$xCG-Li;fVi# zH2CkE%#5ft(2z2Ed#L&tn+bF;tQuCU_wR;JKc0`0U|<4n zx{!R$3wGnhdsW_ln1m-L|TP4(B~Ii6$GL0kkX<_uYCs&b;a z{t7mizOv1NJ&xW$=3(EQmsVW}L1EX$;lC3|Bfhsz#SBUp)AAN$fSyB9$;lnC zD;ty*_3;{F($vhTc^wbEUcC@f|6+|1GKA_zELq9uN6=YR>+I(ntT))WP z@N`E0{36JE3xB)TP36;}Zo^H&A{ejSxyrbLTKL&V=qPuo-JWTL!8#;|A7+6z$G@A)Ocg1REfyU!kWyQa1%v7}K)MEtcdwgXFU*e|93PVvhJh_!%P>0Kb z!oo9>bWzna~)1{ zbxAFv(=^lp6**gf`Zz9{6C|u=~z5VP`6{ zy|Op#j-e<-;Y`P}XM+jl)4tFLFIna6Gj&Qf4+ z7S%=C#TXi6DqfKahb@eDLgdt*1vQe3(`+}~-g2BCBISnUR-d(fwnO?AlNK0bwSH8c?h7s+aAw}VsVm#1lv<_L3 zRF_rIAbPBD9e2N=vrUK-?{y5-tu=Sbdrh&%hVxu;P$p&aPopV6T0^YKLiJN|5mqL< z;tlFre7&(u?J?9sc@XO2fzNo4F0LmMPAUJv_Hb5xKFS99=v6ncGs3zev<F#f|-= zi$g$Yc{||3G?0Z@Pv>99gc-_Wws=D5U&k=FTG_mrksE1XkQ*IPDYf)E)bU3{qF=(v z9Qb{^KlXSM&{`8Q^(MLBCc5-rPVp(A z4E$;ImU+?F`cYUPD_=?FDBBBTHezq#wF$NYy^bCuyMBG*X9B30RM5{gq$E$Ts^!E6MB2OSmiMGGQD2yO(Iv7sX zpd{R3m?B-^5aQ|z>u)xvxJ^8m(F3VrrxADvg#6p83MHls6E>l4WNV40!4+2@W%gr9 zCfSo_XtZmG<`53FR3T-+XvEb)S30ILF_*)%#WBm$oXA*t;ylcNen`Z!zI9i)o2-}j zp}}IZjj9fX{!YUx=lmI48x&cAgk-s=2`-E|4W^>qxE})tU1} zW($S%l7qsSvc}EESoj^8FsK$;F*B3Ea8cB_Y0kCCFIGIlP;1q8H=ZRx>D$Nfw7Uz^ zw?lm%Kyq4`#9lmdM(W#+<-}ena@pkI*=R~QdIYtxiGtL=Pl~jC6bOap+U14Az0$-| zKi!1du-=4F|DlOvYI7Qs?m=;zBWG31hKua{#)HjU$0J^cM@&ejb?bay&pAit!Xc*= z9=Q$JO}5Y{l83dROY7hoF?iWl1)}um;@egU9}_LewO@58@jq1MN9$gi=GZHFRAdFI zJroEk4g{6>`l)s}Rs|#%duq!y6TfQ)RRvGwWHUJ9Znu$sU9{_M+9eXZ|6mw>BIzR> z$HveMx1s9Btr@Use(%;R+f`um5(tbK0+*lW&mAoof6Vjpa=;cF`700w91h3edOL+d zl$@~oeZEG>Y`urD{$lrXUcPNgOK>U33R5h3+}h7C`p{__YBLQv)-o`xd0h8%eSdP_ zV(q&xUw3w}9{P>Yq&03T;tZ2)4!M`NZ4~|ldn47ekVHk+$wT2qhEGQ zk>o*Hs6gCmfDQ#t6&4f`zQ16`B3g+)nK%>Yj`W)%M6b1uGLo<&CESVw?S|fRPG2GI zU}7CZ7z{zAwFy~j&*US01@~;Y4px?JlKK^;lwdn!2^adW&&>m zU2QQbjM1-%dA$~v#}9W9j-K_Z?2EUnd^T;*tBc>lEi!NoE;6X=Tfxy@Tp>S#<5J}H zGRFfxUl(^0@tRNb@oYMf@nG=- z>ga>=p*X!AUGUpIJT#PV6@c}kH^L=D^?ct6pJz-zOiB5(BbpNSi=nGx0uS#z^CzOE zsibIsi}83VES)~0uhm>sbC&r=R}?)OQzVg6s~gs*YmRLgjaBU1)N8Q}DSE>!$tO zq*j?>aNA0~X27EBkRubz(DQD?W_!*lJ6AgIYp^xsJz`8+42fG+3>-SqZr3z(3$b3A zuoO}GXBZ9Jy7xM?Lt)Uwg;T^w*I)?8K0;(EAbd*ilpn_2>>nW>_8~4s9Eas@YRjLv|3LOk8ZWRn5Pl?h>Y|XP1C$lmN(-y_NR(>Ky#N6T?s0h8MEs`mk z)*^H}2LbB!$49BHj8f^0PX}KyWlWHW>opqmB1SWJtq^mT-79}+gqi2VsfmjN6IBUa zNm%m?5i|r}!liy+jVOBDXPzi9+o>o<; z>4x&7oV_Er_P^faE)k%9|8fKU2m&hjklCRyO0PZG#%|_jMonan;GJmJ^o-i7D0Df) zZ24EByMEzV*Y}=pLF%lc9zCR29%8rYu@zL5d%tPy5}v_Y%bNee=f2bW+%~;i=&L5z zTOG?|F|*mX&3Ybe4!|cUAwE#)BXE>#&?-ZJ$L46?edMRdT^5Z?Ezcf2U!j4>s8U?c zN3MX6HfaT28AV;Gcc_kGx3|ae`5KI453Eknqw&5uKJDR~O>AVTBT$$n#uCV>aIkwK z);!|3supv2kUhO%QdA%7DpG8-ykc5;gE%xU(Ll6`TZ^BNu z9fk3@q6X{r?Jj5bKw>AKd8?dWKMxsh@8Jbk2;9BRxXtuN*Km2J`O*5kw{Fi3Wu)R1 zDpypAR@LR|f*tqAC~HGNVc%G*r1BM=zH5 zA<*ovn=_Hf+{yzg4xjqBy7F5;-DByc&whUiJvqXIg(2w$BilyvejU=4gcbDwkI|V4B1oVFv5kmdA4u{Op7|WzLB@lP7k6 zWf}TuRnB{G@vQ1hBiJ%`8+7ly-J-_qtp2Drid!l~N5{Rmq(vRo`f1EMUoBPFC24*J zHbjv8IJFu-uNe8UKfmA&XfzR$x+hKn-m$2T5>Twp+i>(N#>x89)E`|hj3bOaoda`L)*d4ovm?=?S1o}!xJn;j>qi{3|s z$!mpyArJ5)sY_Ii+)QjWfk8sUL+wL0B7I6sD_SM$`rO+QZHjp2!7@D$Z7b4WBP0YC zE%WSbtx2IxL}h+GTlc9R2ABkGa3dU&Pz_l*sc;2AWzB3Ax}!#tw;n_F&!!-5;;sZB zBsHZOZ3&V)z|`Hz6nBbP;j-Nv8yUm=%KmZ==c^?zmIoA@2TtE0q-x9R!ILkBhWQK~ z6FsjCWBRX?w@O%OQ*W>px%TVKv=2F1D%;5M3O^zqY`@MKisiJ{{Mf0^dEamy(@aA8 zS?Lyy)`!Mqr;k~8!ePYpVYJAp1t*OIR!sx*Gq0dKmqCgQPE>(l+b1#N6FnDRH5$db zC^;09nH04@@Z39W(lWsCa}aYf-a&EFH0p)NEGN3v~L&k#3sWmq8kNO-<4Fnguz| z86Vl=#(F@UJ>}SGu?=$qmOpO5(ca}xIZlF0iCNki82yN|aB_(I_o1F#w>UA7XouBA zDrikmeQqDS%?B>hN6OBKpSRVMH}7#a~9u<`spAXO0@Vr2b5{;l(l>VYNC|i`LMQgMEbg+WfJQc;D;oNH!Ild)r@tf zV0`K_c5a_GEc+{z-hTtAnvCs8fL%fe)|Ge|lci<)Rhg>PRGkPt~31R_jYp^Oq^YH^LDKF~zB(XZd~ zwjs{uY(5@_He}jqw7PO-1!6KwtC87sb*ma@i$@-(pyXrm6QiScdCS<6h_t-?VbxM% zg~_XvV8^x8PZ#O@fIck;J}u(C^s@H6e*NJf5oIPbB#Yf~Y}EMHe$E|j%U4=ofO3uq zIx;;DGJ!d7v^}WqUd>>zR|V->oG?!$=rxw0)DeU`#oQ3BFQcnaLiy(}$=%Mh6Yj^K zx8NE%_E7y9R;^N?`%S6ufYg&d%dy*X%^ZjiDIK8=m4!qXPFKp$85J%-=gq|>SFNb} zk&w~9q<1i_XT=z|;|Lt&tWbNTlbMR4ZJJ>!Wnnz8w)`xWz(lyZl|DtAO~t1pv5&UJ zYS7+Qha=T;OjCkC;#Or%XV}_2Y$+|pqVtHjA93JF#* zoflR37~vhzcod{_q%GKbN2>CON`U`%EK(=cjPSGfIAklPLMv~^vvHxIGSq@Y;*s*r z>|Bg9l1Sdcq}x+Xt-+>!8T&X{Y4HiNH*HvtjXCk~5r?F*a|eUaa2YnE+d}i3@Ks=w zZ#?>LMmJRFKBc-5Hcd^3^3_mm*kNr|GCDn!QD&Q$^sR6+Fkm2^!w zN_FSONsYrQFH}m_TDovf%SJIgq){S~u9BHw8ZPp~y)j>J?fh^^LPaEkOI!y{9fs2Y zyPC6+xsp#kMy-%oa(&+o#$}3x^jWWeJu3G5-0_cUZ@H1w5)ZWlsQIXT%NN*URLZ5M zp1aZvyu7}|8r6#Li%c$#+(wAfjUtVLB;w@lMAJOi8i|rbloYT@v!&q;LY)ZQw2(Ij zwZh$+%E~3-F-Ja0Vubn19ml`S6K$Edc*Iif9iP6Sp$>n6xeS^qh2IPa=>(&S{f z-TAxR4(?wMzCt!~H(xh}m&phS!o-pzqw`)!PBqI2rb5{n7G;zb7m zw&h`!7a5Fm1bz9K^>XYMXYeEfUE9lDj++`iYG2T>Y-9Xr)nX252~-KHREt+@R7+hK zbbUr9^o-jXu|VW10x2?|>Cxc%@`X9?E~<@vNlw>mFTL+XFttnN0zb(swJTZ|^S1b7 zk^XRH8$DN;NnfvEWG342;)er|k395h3nm->JqbnIa+$DW^(cn<5!c7y{aEkb_VS2W zGNVu zLq`e+<1y`kXsKziz(Hojt@0g!MX&>&VV4S!`E3&hZWTX=y_J(;uRWRR`bv8hg4|{Z z;Z-VwcXVh4nsF>X@s;YcSs8c+QLkgl69bN;W06SW_o4QIz#l`-CWP)O5@Sb6J9Swb z&V9@7M@I)Y8mUa#^|9}~Qwzj4Lcw`ZGCK<+JzRIUoC1S|R#A=+4+>jqz@c`In<2Z-#w^Qd3*DzTtH zzMByLdH_L*Hvp-CaaX1DHq4Xhy7sU<%9_k!yDO0z_p&Ibuw8<4l_C!!Rao?=pbrVBNl!pKiQo8SF3h@lm1umY$1>u9 zpxiFM^c@M?v?oM;36>qt=PX5;`n0eMH6|mus8FaZ`ae!Mg{FYqQ<}n}y@<)7U=3GH zp$sZD8aXNhN3O4R@sh@IA^A=a#Sk(E85eHgJ4{tP9Vk_I{YZNI88)uNl8toh)dOB@ zqdBzLw>24>1z2j+^qx_D1S+RqfZ4Y6)cVeRLy_;<_97 z6ndz9kNW_^kHN){t7#7Eeu?Tr-zauOM8%y*M)B)admDi6C9>xvR1LOOT>fh87fJ zDf~|8w$Qe$@F$JGLUWC7yvKHMvG!;d^gR-b6ZJtugonF5^Eq{b3u~gXsxJSap0MPr z(O9Lh$fpkYHgSA}{2+4?UxE2%9g5JK$t<`NfyNrFd9;Q&G4eLuXo+fN@^@|J^i`!N z_LchcJ~!vVV3GR13kWIaGI+VVZjW6Wy{|kU-ehydfQCNm1BZOC4v%bmEMIm6?OYQ4 z-B(NA9lCG1jd33jA6JOs(oKc)fTvh}0$|zwht4{Kb*xMXM@GPZ^pn5-@uYiF1K<5!REkepOjt-kkyc9hR06O?kf}KX2M$bsJSXty!1pG0 zz~Smo{p z3K72+@|*spI3uU)LOI_O%$lG0vsfC~Tv$80Gg6U(_v9BU0<}9U^%Azkd`7tDp9|Lm z5*1un{S$xT@6U-<6#Y5jd*bekOz14)DlmxsVGDh0whOhm^;3y&CZcp9;u6hHc1B#( zWyJmVRi-&3bL28I{}I~%qV{DxBbf+T2>-f$e<=SC$-i&hv#nus8Tnv?5%jm|g!(f@ z-wR*}%L0t-)FvPx(mgA`%LE&%f7JC`%L?e&nCKasNa{F%Y(S^^#7>*#JAxBISz`l0 zhyjQb=fs~+x@S8u9|6sBKH^(-`D|?gTmF8=b;fZG98%aH?yvxi9{xbB&q82 zKR!kThd4V4dDR1&kp4>(A>iYtKZP)T-{62lM545@s{u>Q1L}RYM^u5C_zxlHBcKSU z#?WpMagdv4h|-^XLjx23P?p1#<~G5lmkp|XQiuQ{(wEzk|0<9p`fS~=0n`4ar8A%3?h?96w~v7jCmn%w zeY9uVU6%Or($AOuy#C2c2cTVi0QqcZWG7JlR`xeP;P0+C#s*6NI7$ZZ+ZC)X*HWN; zt^pBL?wp|*0Sf)5ef~u`Uz5$<*n_Wtb&3MoFq~mn0DGm28G;7p21XaFkfKw}VF4Jv z2B602I^o3lYk=47(&Epr`y-v9njOIFNgY_Xp6vxY;K$zx2kF^c7+Bhw{P2M~>4)a30yA+*>%8de1X~Jtm)9H{FY&BVDoFEgu)-s>j8|i0?^>> zyk(^EJIN{_8#6<5kmKKOf9F?zF^eklBxUhez&cfbnh)?b-P2e58{!wC@6TQ0e_Mr1 zf%FZ`C4X!wL_v0f23F=E=byhgzZS_tgVyLk7jXdd&DmP$>HR;{Ld?}MgEy8sMzRO0q^kna35ZNYYE`hCPmy>E;e2vg$ax79!8zbb?@l?d;xEDZ*KYRjFnZ@(H+WLDQ{2qc|AhNH z#TvL`;7PttNwrD;g>;(Z>)e!I;CS%7Os9Cil>ZHXe#3%ih&kn1WL$!053EA}l`jTd zC-6)mr;N_5%Q7y^8v+gl&n<8YgwFp1;Mq(A;1KXg@u!gF!as(b-#OsHJx>ub)t5$` zj_JRiJi$X>o`T|QE(`km4L%bH6TH>HgTI}Ut~OqpbdsU|*UEs$pgBcMc3c+mb4T&- zh&12|fyX&Hr7d;-ciQ>(03J2sly$xL@~ks4B*4`Hzr}uv7#+AY0{l)pI0XDc@+ri2 z=(3Q1T~7vwfM19`g{Z!{G~~kTvEW4T8;Pexv626cc)mG+U!*$aU43_H-g&<5KV1dE z6$HPFaSEiL{@;MVIL-t2*FOci&Hhio^BWZ0+42-ew|rULc`katYEN({z*8R7%KySU zUpsJbtW( PROCEDURE = new HashSet(){ + { + add(PROCEDURA_P0); + add(PROCEDURA_P1); add(PROCEDURA_Q1); + add(PROCEDURA_P2); add(PROCEDURA_Q2); + add(PROCEDURA_P3); add(PROCEDURA_Q3); + add(PROCEDURA_P4); add(PROCEDURA_Q4); + add(PROCEDURA_P5); add(PROCEDURA_Q5); + add(PROCEDURA_P6); add(PROCEDURA_Q6); + add(PROCEDURA_P7); add(PROCEDURA_Q7); + add(PROCEDURA_P8); add(PROCEDURA_Q8); + add(PROCEDURA_P9); add(PROCEDURA_Q9); + add(PROCEDURA_P10);add(PROCEDURA_Q10); + } + }; + public static Comune fetchComune(long companyId, String codiceIstat) throws SystemException { Comune comune = ComuneLocalServiceUtil.fetchByC_CI(companyId, codiceIstat); if (comune == null) { @@ -84,7 +124,7 @@ public class PraticaValidator { _log.debug("IntPratica with Id "+intPraticaId+" status "+ statoPratica ); int dettPraticaCountByIntPratica = DettPraticaLocalServiceUtil.findByIntPraticaId(intPraticaId).size(); _log.debug("IntPratica with Id "+intPraticaId+" has associated "+ dettPraticaCountByIntPratica +" dettPraticas" ); - return statoPratica == WorkflowConstants.STATUS_ANY || dettPraticaCountByIntPratica == 1; + return statoPratica == -1 || dettPraticaCountByIntPratica == 1; } catch (PortalException | SystemException e) { _log.error(e, e); } diff --git a/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/docroot/WEB-INF/src/portos/nextmind/liferay/documents/util/AllegatiUtil.java b/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/docroot/WEB-INF/src/portos/nextmind/liferay/documents/util/AllegatiUtil.java index 6f555f23..02f549c1 100644 --- a/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/docroot/WEB-INF/src/portos/nextmind/liferay/documents/util/AllegatiUtil.java +++ b/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/docroot/WEB-INF/src/portos/nextmind/liferay/documents/util/AllegatiUtil.java @@ -28,7 +28,6 @@ import it.tref.liferay.portos.bo.service.ConfigurazioneLocalServiceUtil; import it.tref.liferay.portos.bo.service.DettPraticaLocalServiceUtil; import it.tref.liferay.portos.bo.service.IntPraticaLocalServiceUtil; import it.tref.liferay.portos.bo.service.TerritorioLocalServiceUtil; -import it.tref.liferay.portos.bo.shared.util.ConfigurazioneConstants; import it.tref.liferay.portos.bo.util.PraticaUtil; import java.io.ByteArrayOutputStream; @@ -41,6 +40,9 @@ import java.util.Date; import java.util.List; public class AllegatiUtil { + + static final String ATTACHMENT_FOLDER_ID = "conf.geniocivile.attachment.folder.id"; + static Log _log = LogFactoryUtil.getLog(AllegatiUtil.class); public static JSONArray recuperaDocumentiAllegatiPratica(long intPraticaId){ @@ -51,7 +53,7 @@ public class AllegatiUtil { Territorio territorio = TerritorioLocalServiceUtil.getTerritorio(intPratica.getTerritorioId()); long companyId = territorio.getCompanyId(); long defaultFolderId = ConfigurazioneLocalServiceUtil - .findByC_ChiaveLong(companyId, ConfigurazioneConstants.ATTACHMENT_FOLDER_ID); + .findByC_ChiaveLong(companyId, ATTACHMENT_FOLDER_ID); Folder defaultFolder = DLAppLocalServiceUtil.getFolder(defaultFolderId); String folderName = PraticaUtil.getFolderName(dettPratica.getDettPraticaId()); Folder folder = DLAppLocalServiceUtil.getFolder(defaultFolder.getRepositoryId(), @@ -140,7 +142,7 @@ public class AllegatiUtil { serviceContext.setScopeGroupId(groupId); serviceContext.setUserId(admin.getUserId()); long defaultFolderId = ConfigurazioneLocalServiceUtil - .findByC_ChiaveLong(companyId, ConfigurazioneConstants.ATTACHMENT_FOLDER_ID); + .findByC_ChiaveLong(companyId, ATTACHMENT_FOLDER_ID); Folder defaultFolder = DLAppLocalServiceUtil.getFolder(defaultFolderId); String folderName = PraticaUtil.getFolderName(dettPratica.getDettPraticaId()); Folder folder = null; diff --git a/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/docroot/WEB-INF/src/portos/nextmind/quarkus/bridge/api/QuarkusBridgeConstants.java b/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/docroot/WEB-INF/src/portos/nextmind/quarkus/bridge/api/QuarkusBridgeConstants.java index 425658ec..c0898cfd 100644 --- a/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/docroot/WEB-INF/src/portos/nextmind/quarkus/bridge/api/QuarkusBridgeConstants.java +++ b/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/docroot/WEB-INF/src/portos/nextmind/quarkus/bridge/api/QuarkusBridgeConstants.java @@ -4,6 +4,7 @@ public class QuarkusBridgeConstants { public final static String HEADER_REQUEST = "HeaderPratica"; public final static String BODY_REQUEST = "SportelloPratica"; + public final static String SCHEDULED_ACTION = "scheduledAction"; public final static String codiceIstat = "cadastralCode"; public final static String codiceFiscale = "digitalHolderTaxCode"; public final static String email = "address"; diff --git a/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/docroot/WEB-INF/src/portos/nextmind/quarkus/bridge/api/QuarkusBridgeMessageFactoryUtil.java b/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/docroot/WEB-INF/src/portos/nextmind/quarkus/bridge/api/QuarkusBridgeMessageFactoryUtil.java index 081b6b90..fe6e7dcd 100644 --- a/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/docroot/WEB-INF/src/portos/nextmind/quarkus/bridge/api/QuarkusBridgeMessageFactoryUtil.java +++ b/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/docroot/WEB-INF/src/portos/nextmind/quarkus/bridge/api/QuarkusBridgeMessageFactoryUtil.java @@ -8,10 +8,12 @@ import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.messaging.Message; import com.liferay.portal.kernel.util.StringPool; +import com.liferay.portal.kernel.util.Validator; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; @@ -46,6 +48,58 @@ public class QuarkusBridgeMessageFactoryUtil { READ, WRITE, DELETE } + public static void createCallback(String context, Long id, JSONObject content){ + HttpURLConnection HttpConnection = null; + try{ + URL url = new URL("http://localhost:50000/portos/mw/new/" + .concat(context).concat(StringPool.FORWARD_SLASH) + .concat(String.valueOf(id))); + + HttpConnection = (HttpURLConnection) url.openConnection(); + + // Set MediaType Accepted in Accept Header + HttpConnection.addRequestProperty("Content-Type", "application/json"); + + // Set request method + HttpConnection.setRequestMethod("POST"); + + // Set connection timeout + HttpConnection.setConnectTimeout(5000); + + // Enable output stream to send the payload + HttpConnection.setDoOutput(true); + + // Send the payload over the output stream + String payload = content.toString(); + + OutputStream outputStream = HttpConnection.getOutputStream(); + outputStream.write(payload.getBytes("UTF-8")); + outputStream.close(); + + // Get the response code + int responseCode = HttpConnection.getResponseCode(); + switch(responseCode){ + case 200: + _log.debug("### Quarkus Bridge [Read :: 200 OK]"); + break; + case 500: + _log.debug("### Quarkus Bridge [Read :: 500 Quarkus Server Error]"); + break; + } + }catch(RuntimeException e){ + _log.error(e,e); + } catch (MalformedURLException e) { + _log.error(e,e); + } catch (IOException e) { + _log.error(e,e); + } finally { + // Close the connection + if(Validator.isNotNull(HttpConnection)){ + HttpConnection.disconnect(); + } + } + } + public static JSONObject readNewData(String context){ JSONObject responseBody = JSONFactoryUtil.createJSONObject(); HttpURLConnection HttpConnection = null; @@ -109,9 +163,67 @@ public class QuarkusBridgeMessageFactoryUtil { return responseBody; } - public static boolean callBackUpdateIntPraticaOnMiddleware(String context, String praticaId){ - //TODO: send request to update the praticaId - return true; + public static JSONObject readData(String context, String praticaId){ + JSONObject responseBody = JSONFactoryUtil.createJSONObject(); + HttpURLConnection HttpConnection = null; + try{ + URL url = new URL("http://localhost:50000/portos/mw/read/".concat(context).concat(praticaId)); + + HttpConnection = (HttpURLConnection) url.openConnection(); + + // Set MediaType Accepted in Accept Header + HttpConnection.addRequestProperty("Accept", "application/json"); + + // Set request method + HttpConnection.setRequestMethod("GET"); + + // Set connection timeout + HttpConnection.setConnectTimeout(5000); + + // Enable input/output streams + HttpConnection.setDoInput(true); + HttpConnection.setDoOutput(true); + + // Get the response code + StringBuilder response = new StringBuilder(); + int responseCode = HttpConnection.getResponseCode(); + switch(responseCode){ + case 200: + _log.debug("### Quarkus Bridge [Read :: 200 OK]"); + // Read the response + BufferedReader reader = new BufferedReader(new InputStreamReader(HttpConnection.getInputStream())); + String line; + while ((line = reader.readLine()) != null) { + response.append(line); + } + reader.close(); + //TODO Process the response + if(response.charAt(0) == '{'){ + JSONObject resultSet = JSONFactoryUtil.createJSONObject(response.toString()); + responseBody = responseBody.put("result", resultSet); + } + if(response.charAt(0) == '['){ + JSONArray resultSet = JSONFactoryUtil.createJSONArray(response.toString()); + responseBody = responseBody.put("result", resultSet); + } + break; + case 500: + _log.debug("### Quarkus Bridge [Read :: 500 Quarkus Server Error]"); + break; + } + }catch(RuntimeException e){ + _log.error(e,e); + } catch (MalformedURLException e) { + _log.error(e,e); + } catch (IOException e) { + _log.error(e,e); + } catch (JSONException e) { + _log.error(e,e); + } finally { + // Close the connection + HttpConnection.disconnect(); + } + return responseBody; } public static JSONObject writeUpdateData(String context, String praticaId){ @@ -173,8 +285,114 @@ public class QuarkusBridgeMessageFactoryUtil { _log.error(e,e); } finally { // Close the connection - HttpConnection.disconnect(); + if(Validator.isNotNull(HttpConnection)){ + HttpConnection.disconnect(); + } } return responseBody; } + + public static void updateCallback(String context, Long id, JSONObject content){ + HttpURLConnection HttpConnection = null; + try{ + URL url = new URL("http://localhost:50000/portos/mw/update/" + .concat(context).concat(StringPool.FORWARD_SLASH) + .concat(String.valueOf(id))); + + HttpConnection = (HttpURLConnection) url.openConnection(); + + // Set MediaType Accepted in Accept Header + HttpConnection.addRequestProperty("Content-Type", "application/json"); + + // Set request method + HttpConnection.setRequestMethod("POST"); + + // Set connection timeout + HttpConnection.setConnectTimeout(5000); + + // Enable output stream to send the payload + HttpConnection.setDoOutput(true); + + // Send the payload over the output stream + String payload = content.toString(); + + OutputStream outputStream = HttpConnection.getOutputStream(); + outputStream.write(payload.getBytes("UTF-8")); + outputStream.close(); + + // Get the response code + int responseCode = HttpConnection.getResponseCode(); + switch(responseCode){ + case 200: + _log.debug("### Quarkus Bridge [Read :: 200 OK]"); + break; + case 500: + _log.debug("### Quarkus Bridge [Read :: 500 Quarkus Server Error]"); + break; + } + }catch(RuntimeException e){ + _log.error(e,e); + } catch (MalformedURLException e) { + _log.error(e,e); + } catch (IOException e) { + _log.error(e,e); + } finally { + // Close the connection + if(Validator.isNotNull(HttpConnection)){ + HttpConnection.disconnect(); + } + } + } + + public static void readCallback(String context, Long id, JSONObject content){ + HttpURLConnection HttpConnection = null; + try{ + URL url = new URL("http://localhost:50000/portos/mw/read/" + .concat(context).concat(StringPool.FORWARD_SLASH) + .concat(String.valueOf(id))); + + HttpConnection = (HttpURLConnection) url.openConnection(); + + // Set MediaType Accepted in Accept Header + HttpConnection.addRequestProperty("Content-Type", "application/json"); + + // Set request method + HttpConnection.setRequestMethod("POST"); + + // Set connection timeout + HttpConnection.setConnectTimeout(5000); + + // Enable output stream to send the payload + HttpConnection.setDoOutput(true); + + // Send the payload over the output stream + String payload = content.toString(); + + OutputStream outputStream = HttpConnection.getOutputStream(); + outputStream.write(payload.getBytes("UTF-8")); + outputStream.close(); + + // Get the response code + int responseCode = HttpConnection.getResponseCode(); + switch(responseCode){ + case 200: + _log.debug("### Quarkus Bridge [Read :: 200 OK]"); + break; + case 500: + _log.debug("### Quarkus Bridge [Read :: 500 Quarkus Server Error]"); + break; + } + }catch(RuntimeException e){ + _log.error(e,e); + } catch (MalformedURLException e) { + _log.error(e,e); + } catch (IOException e) { + _log.error(e,e); + } finally { + // Close the connection + if(Validator.isNotNull(HttpConnection)){ + HttpConnection.disconnect(); + } + } + } } diff --git a/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/docroot/WEB-INF/src/portos/nextmind/quarkus/bridge/scheduler/QuarkusBridgeScheduler.java b/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/docroot/WEB-INF/src/portos/nextmind/quarkus/bridge/scheduler/QuarkusBridgeScheduler.java index 4e1b102b..69f73c30 100644 --- a/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/docroot/WEB-INF/src/portos/nextmind/quarkus/bridge/scheduler/QuarkusBridgeScheduler.java +++ b/liferay-plugins-sdk-6.2/portlets/quarkus-bridge-portlet/docroot/WEB-INF/src/portos/nextmind/quarkus/bridge/scheduler/QuarkusBridgeScheduler.java @@ -18,7 +18,6 @@ import com.liferay.portal.model.Company; import com.liferay.portal.model.User; import com.liferay.portal.service.CompanyLocalServiceUtil; import com.liferay.portal.service.ServiceContext; -import com.liferay.portal.service.ServiceContextThreadLocal; import com.liferay.portlet.expando.model.ExpandoBridge; import com.liferay.portlet.expando.model.ExpandoColumnConstants; @@ -28,12 +27,12 @@ import it.tref.liferay.portos.bo.model.IntPratica; import it.tref.liferay.portos.bo.model.Territorio; import it.tref.liferay.portos.bo.service.DettPraticaLocalServiceUtil; import it.tref.liferay.portos.bo.service.IntPraticaLocalServiceUtil; -import it.tref.liferay.portos.bo.shared.protocollo.model.Protocollo.TipoProtocollo; -import it.tref.liferay.portos.bo.shared.util.Constants; import java.util.ArrayList; import java.util.List; +import javax.xml.bind.DatatypeConverter; + import portos.nextmind.liferay.bridge.persistence.PraticaValidator; import portos.nextmind.liferay.documents.util.AllegatiUtil; import portos.nextmind.liferay.entities.util.DescrizioneUtil; @@ -62,26 +61,91 @@ public class QuarkusBridgeScheduler implements MessageListener { return; } for(Company company : companies){ - JSONObject createPayload = prepareCreateBatch(company.getCompanyId()); - JSONObject updatePayload = prepareUpdateBatch(company.getCompanyId()); - //TODO: persist pratiche + JSONArray createPayload = prepareCreateBatch(company.getCompanyId()); + for(int i = 0; i < createPayload.length() ; i++){ + signalWritten(createPayload.getJSONObject(i)); + } + JSONArray updatePayload = prepareUpdateBatch(company.getCompanyId()); + for(int i = 0; i < updatePayload.length() ; i++){ + JSONArray jsonResultByIntPraticaId = updatePayload.getJSONArray(i); + signalUpdated(jsonResultByIntPraticaId); + } + JSONArray readPayload = prepareReadBatch(company.getCompanyId()); + for(int i = 0; i < updatePayload.length() ; i++){ + JSONArray jsonResultByIntPraticaId = readPayload.getJSONArray(i); + signalRead(jsonResultByIntPraticaId); + } } _log.info("### Quarkus Bridge Scheduler batch ready."); } - private JSONObject prepareCreateBatch(long companyId){ + private void signalWritten(JSONObject content){ + // ogni oggetto viene segnalato all'endpoint univoco per l'operazione INSTANCE_WRITE + String context = content.getString("context"); + Long scheduledActionId = content.getLong("scheduled_action_id"); + QuarkusBridgeMessageFactoryUtil.createCallback(context, scheduledActionId, content); + } + + private void signalUpdated(JSONArray content){ + for(int i = 0; i < content.length() ; i++){ + // Get each operation result 1 by 1 and signal the result to quarkus middleware + JSONObject instance = content.getJSONObject(i); + String context = instance.getString("context"); + Long scheduledActionId = instance.getLong("scheduled_action_id"); + String operation = instance.getString("operation"); + Boolean operationResult = instance.getBoolean("esito"); + String intPraticaId = instance.getString("instanceId"); + + StringBuilder sb = new StringBuilder("### Sending signal for the ") + .append(operationResult ? "success" : "failure") + .append(" of the ").append(operation) + .append(" on Instance with id ").append(intPraticaId); + + _log.debug(sb.toString()); + QuarkusBridgeMessageFactoryUtil.updateCallback(context, scheduledActionId, instance); + } + } + + private void signalRead(JSONArray content){ + //TODO: callback to quarkus middleware + for(int i = 0; i < content.length() ; i++){ + // Get each operation result 1 by 1 and signal the result to quarkus middleware + JSONObject instance = content.getJSONObject(i); + String context = instance.getString("context"); + Long scheduledActionId = instance.getLong("scheduled_action_id"); + String operation = instance.getString("operation"); + Boolean operationResult = instance.getBoolean("esito"); + String intPraticaId = instance.getString("instanceId"); + + StringBuilder sb = new StringBuilder("### Sending signal for the ") + .append(operationResult ? "success" : "failure") + .append(" of the ").append(operation) + .append(" on Instance with id ").append(intPraticaId); + + _log.debug(sb.toString()); + QuarkusBridgeMessageFactoryUtil.readCallback(context, scheduledActionId, instance); + } + } + + private JSONArray prepareCreateBatch(long companyId){ + JSONArray createBatchResult = JSONFactoryUtil.createJSONArray(); //TODO: Aggiornare quando Enrico chiede da dove recuperare i dati per la creazione // (Nome, Cognome, Email, digitalHolderTaxCode, CadastralCode) - final String clientContext = "PAESAGGISTICA"; + final String clientContext = "SUAP"; JSONObject object = QuarkusBridgeMessageFactoryUtil.readNewData(clientContext); _log.debug(object.toString()); JSONArray pratiche = object.getJSONArray("result"); for(int i = 0; i < pratiche.length() ; i++){ + JSONObject item = JSONFactoryUtil.createJSONObject(); + //TODO: remove debug --> + if(true) continue; + ////TODO: remove debug <-- + item = item.put("context", clientContext); JSONObject pratica = pratiche.getJSONObject(i); JSONObject Header = pratica.getJSONObject(QuarkusBridgeConstants.HEADER_REQUEST); - //TODO: check requestAction da Header? - //TODO: check operation da Header? JSONObject Sportello = pratica.getJSONObject(QuarkusBridgeConstants.BODY_REQUEST); + JSONObject Action = pratica.getJSONObject(QuarkusBridgeConstants.SCHEDULED_ACTION); + item = item.put("scheduled_action_id", Action.getLong("id")); String codiceIstat = Sportello.getString(QuarkusBridgeConstants.codiceIstat); try { // Cerca comune di appartenenza @@ -117,7 +181,7 @@ public class QuarkusBridgeScheduler implements MessageListener { // Aggiungi DettPratica ed IntPratica long territorioId = territorio.getTerritorioId(); //TODO: verifica che la pratica non esista gią - if(!Constants.PRATICA_ZONE.containsKey(tipoProcedura)){ + if(!PraticaValidator.PROCEDURE.contains(tipoProcedura)){ _log.error("#[!]# " + tipoProcedura + " is not a Valid TipoPratica"); continue; } @@ -137,7 +201,6 @@ public class QuarkusBridgeScheduler implements MessageListener { customFieldsExpando.addAttribute("HeaderSportelloId", ExpandoColumnConstants.LONG); customFieldsExpando.addAttribute("SportelloId", ExpandoColumnConstants.LONG); - String instanceId = Header.getString(QuarkusBridgeConstants.instanceId); String correlationId = Header.getString(QuarkusBridgeConstants.correlationId); String clientId = Header.getString(QuarkusBridgeConstants.clientId); @@ -145,7 +208,6 @@ public class QuarkusBridgeScheduler implements MessageListener { Long sportelloId = Sportello.getLong(QuarkusBridgeConstants.recordId); customFieldsExpando.setAttribute(QuarkusBridgeConstants.correlationId, correlationId); - customFieldsExpando.setAttribute(QuarkusBridgeConstants.instanceId, instanceId); customFieldsExpando.setAttribute(QuarkusBridgeConstants.clientId, clientId); customFieldsExpando.setAttribute("HeaderSportelloId", headerSportelloId); @@ -154,20 +216,23 @@ public class QuarkusBridgeScheduler implements MessageListener { intPratica.setExpandoBridgeAttributes(customFieldsExpando); // Persist changes to custom fields - IntPraticaLocalServiceUtil.updateIntPratica(intPratica); - + IntPratica finalizedPratica = IntPraticaLocalServiceUtil.updateIntPratica(intPratica); + item = item.put("intPraticaId", finalizedPratica.getIntPraticaId()); } catch (SystemException e) { _log.error(e ,e); } catch (PortalException e) { _log.error(e, e); } + item = item.put("header", Header); + item = item.put("body", Sportello); + createBatchResult.put(item); } - return object; + return createBatchResult; } - private JSONObject prepareReadBatch(long companyId){ - final String clientContext = "PAESAGGISTICA"; - JSONObject readBatchResult = JSONFactoryUtil.createJSONObject(); + private JSONArray prepareReadBatch(long companyId){ + final String clientContext = "SUAP"; + JSONArray readBatchResult = JSONFactoryUtil.createJSONArray(); DynamicQuery query = IntPraticaLocalServiceUtil.dynamicQuery(); query.add(RestrictionsFactoryUtil.eq("companyId", companyId)); //TODO: scoprire in quali stati possono essere le pratiche ed ottimizzare la query @@ -179,33 +244,44 @@ public class QuarkusBridgeScheduler implements MessageListener { for(IntPratica intPratica : praticheDaAggiornare){ long intPraticaId = intPratica.getIntPraticaId(); String praticaId = String.valueOf(intPraticaId); - JSONObject object = QuarkusBridgeMessageFactoryUtil.writeUpdateData(clientContext, praticaId); + JSONObject object = QuarkusBridgeMessageFactoryUtil.readData(clientContext, praticaId); JSONArray readPartialResult = JSONFactoryUtil.createJSONArray(); _log.debug(object.toString()); JSONArray aggiornamentiPratiche = object.getJSONArray("result"); for(int i = 0; i < aggiornamentiPratiche.length(); i++){ JSONObject pratica = aggiornamentiPratiche.getJSONObject(i); + //TODO: remove debug --> + if(true) continue; + ////TODO: remove debug <-- JSONObject Header = pratica.getJSONObject(QuarkusBridgeConstants.HEADER_REQUEST); JSONObject Sportello = pratica.getJSONObject(QuarkusBridgeConstants.BODY_REQUEST); + JSONObject Action = pratica.getJSONObject(QuarkusBridgeConstants.SCHEDULED_ACTION); String payloadContentType = Sportello.getString(QuarkusBridgeConstants.tipoContenuto); - JSONObject payload = Sportello.getJSONObject(QuarkusBridgeConstants.contenuto); + //TODO: gestire pił tipi di payload? (Sia JSONObject che JSONArray??) + String base64Payload = Sportello.getString(QuarkusBridgeConstants.contenuto); + byte[] decodedBytes = DatatypeConverter.parseBase64Binary(base64Payload); + JSONObject payload = JSONFactoryUtil.createJSONObject(new String(decodedBytes)); + JSONObject instance = serializeInstance(intPratica, clientContext); + instance.put("scheduled_action_id", Action.getLong("id")); switch(payloadContentType){ case "INSTANCE_READ": - JSONObject instance = serializeInstance(intPratica, clientContext); + instance.put("operation", "INSTANCE_READ"); instance.put("esito", true); readPartialResult.put(instance); break; case "DATA_READ": _log.debug("Reading current Data from database for Pratica with Id "+ intPraticaId); - JSONObject currentData = readData(payload, intPraticaId); + JSONObject currentData = readDataPratica(payload, intPraticaId); if(currentData.length() == 0){ currentData.put("esito", false); _log.error("Unable to read Data from database for Pratica with Id "+ intPraticaId); } else { currentData.put("esito", true); } - readPartialResult.put(currentData); + instance.put("operation", "DATA_READ"); + instance.put("DATA_READ", currentData); + readPartialResult.put(instance); break; case "COMPLIANCE_READ": //TODO: validare i dati @@ -215,7 +291,7 @@ public class QuarkusBridgeScheduler implements MessageListener { break; } } - readBatchResult.put("results_".concat(praticaId), readPartialResult); + readBatchResult.put(readPartialResult); } } catch (Exception e) { _log.error(e,e); @@ -227,6 +303,7 @@ public class QuarkusBridgeScheduler implements MessageListener { JSONObject INSTANCE = JSONFactoryUtil.createJSONObject(); INSTANCE.put("context", context); String url = "" ; + //TODO: retrieve url for json answer INSTANCE.put("url", url); String instanceId = String.valueOf(pratica.getIntPraticaId()); @@ -239,11 +316,13 @@ public class QuarkusBridgeScheduler implements MessageListener { String proceedingType = pratica.getTipoProcedura(); INSTANCE.put("proceedingType", proceedingType); + INSTANCE.put("content", JSONFactoryUtil.looseSerialize(pratica)); return INSTANCE; } - private JSONObject prepareUpdateBatch(long companyId){ - final String clientContext = "PAESAGGISTICA"; + private JSONArray prepareUpdateBatch(long companyId){ + final String clientContext = "SUAP"; + JSONArray updateResult = JSONFactoryUtil.createJSONArray(); DynamicQuery query = IntPraticaLocalServiceUtil.dynamicQuery(); query.add(RestrictionsFactoryUtil.eq("companyId", companyId)); //TODO: scoprire in quali stati possono essere le pratiche ed ottimizzare la query @@ -251,32 +330,58 @@ public class QuarkusBridgeScheduler implements MessageListener { List praticheDaAggiornare = IntPraticaLocalServiceUtil.dynamicQuery(query); //TODO: splittare le pratiche da aggiornare - //TODO: ciclare per effettuare gli update delle singole pratiche for(IntPratica intPratica : praticheDaAggiornare){ long intPraticaId = intPratica.getIntPraticaId(); String praticaId = String.valueOf(intPraticaId); JSONObject object = QuarkusBridgeMessageFactoryUtil.writeUpdateData(clientContext, praticaId); _log.debug(object.toString()); + if(object.length() == 0) continue; + JSONArray updatePartialResult = JSONFactoryUtil.createJSONArray(); // Batch delle operazioni completate su una IntPratica JSONArray aggiornamentiPratiche = object.getJSONArray("result"); + for(int i = 0; i < aggiornamentiPratiche.length(); i++){ JSONObject pratica = aggiornamentiPratiche.getJSONObject(i); + //TODO: remove debug --> + if(true) continue; + ////TODO: remove debug <-- JSONObject Header = pratica.getJSONObject(QuarkusBridgeConstants.HEADER_REQUEST); JSONObject Sportello = pratica.getJSONObject(QuarkusBridgeConstants.BODY_REQUEST); + JSONObject Action = pratica.getJSONObject(QuarkusBridgeConstants.SCHEDULED_ACTION); String payloadContentType = Sportello.getString(QuarkusBridgeConstants.tipoContenuto); - JSONObject payload = Sportello.getJSONObject(QuarkusBridgeConstants.contenuto); + //TODO: gestire pił tipi di payload? (Sia JSONObject che JSONArray??) + String base64Payload = Sportello.getString(QuarkusBridgeConstants.contenuto); + byte[] decodedBytes = DatatypeConverter.parseBase64Binary(base64Payload); + JSONObject payload = JSONFactoryUtil.createJSONObject(new String(decodedBytes)); + JSONObject instance = serializeInstance(intPratica, clientContext); + instance.put("scheduled_action_id", Action.getLong("id")); switch(payloadContentType){ case "INSTANCE_DELETE": // Elimina la pratica _log.debug("Checking if we can delete Instance of Pratica with Id " + intPraticaId); if (PraticaValidator.canDeletePratica(intPratica.getIntPraticaId())){ _log.debug("Deleting Instance of Pratica with Id " + intPraticaId); IntPraticaLocalServiceUtil.deleteIntPratica(intPratica, false); - } else _log.debug("Cannot delete Instance of Pratica with Id "+ intPraticaId); + instance.put("esito", true); + } else { + _log.debug("Cannot delete Instance of Pratica with Id "+ intPraticaId); + instance.put("esito", false); + } + instance.put("operation", "INSTANCE_DELETE"); + updatePartialResult.put(instance); break; case "DATA_WRITE": // Aggiorna i dati dei campi del DettPratica associato ad IntPratica _log.debug("Writing new data to database for Pratica with Id "+ intPraticaId); - writeData(payload, intPraticaId); - _log.debug("Data written to database for Pratica with Id "+ intPraticaId); + JSONObject currentData = writeData(payload, intPraticaId); + if(currentData.length() == 0){ + instance.put("esito", false); + _log.error("Unable to write Data data database for Pratica with Id "+ intPraticaId); + } else { + instance.put("esito", true); + _log.debug("Data written to database for Pratica with Id "+ intPraticaId); + } + instance.put("operation", "DATA_WRITE"); + instance.put("DATA_WRITE", currentData); + updatePartialResult.put(instance); break; case "DATA_DELETE": // Elimina i dati dei campi del DettPratica associato ad IntPratica //TODO: eliminazione dati dentro entitą @@ -290,11 +395,10 @@ public class QuarkusBridgeScheduler implements MessageListener { } catch (SystemException | PortalException e) { _log.error(e,e); } - //TODO: return something? - return null; + return updateResult; } - protected JSONObject readData(JSONObject payload, long intPraticaId){ + protected JSONObject readDataPratica(JSONObject payload, long intPraticaId){ JSONObject result = JSONFactoryUtil.createJSONObject(); String dataType = payload.getJSONObject("data").getString("dataType"); switch(dataType){ @@ -337,7 +441,7 @@ public class QuarkusBridgeScheduler implements MessageListener { return result; } - protected void writeData(JSONObject payload, long intPraticaId){ + protected JSONObject writeData(JSONObject payload, long intPraticaId){ String dataType = payload.getJSONObject("data").getString("dataType"); switch(dataType){ case QuarkusBridgeConstants.DataTypes.MAIN_DETAILS: @@ -369,6 +473,7 @@ public class QuarkusBridgeScheduler implements MessageListener { case QuarkusBridgeConstants.DataTypes.WORK_DESCRIPTION: //TODO: aspettare che vengano definite le buildingMetrics break; - } + } + return readDataPratica(payload, intPraticaId); } }