From c9e4cde103426c2b89a47427a82b6c41096e0349 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SAL=C4=B0H=20=C3=96ZKARA?= Date: Wed, 8 Jul 2026 12:55:42 +0300 Subject: [PATCH] docs: update low-code MCP token setup --- ...niddict-client-credentials-application.png | Bin 0 -> 84288 bytes docs/en/low-code/designer.md | 2 +- docs/en/low-code/index.md | 2 +- docs/en/low-code/mcp.md | 281 +++++++----------- docs/en/modules/openiddict-pro.md | 38 +++ 5 files changed, 153 insertions(+), 170 deletions(-) create mode 100644 docs/en/images/openiddict-client-credentials-application.png diff --git a/docs/en/images/openiddict-client-credentials-application.png b/docs/en/images/openiddict-client-credentials-application.png new file mode 100644 index 0000000000000000000000000000000000000000..fdcf4a2e5bae4198e7004213f59b474aec37c37c GIT binary patch literal 84288 zcmeFZcU)83(l8uE;n<}Fks=z35}K5NfS^YcdNGjDLXi@Xgd!b5Z0Cp&NHAc4fS`t! z0zm>v1OyvMM=7BfK|lxuEHuILaqhY2dG345cc16|{+vB z&E7u-e!K-7urjkW0|*HL076@TfFHwva{!U;J4AMD7ZKSZA}T8K)2;)%cJ17`OLE`- zJqHd-N=qMS5}abRg{yGI--6=QRSE_SoM&C#tDt%CzOw?9{+6+AyHA$T|e!T z*tJXIxQvv{@&ESq;~7Bgr|l<2uL}!-0NccbgvEq@Gyvp&V|APGZ~XpoZ4(v|+P*{d zr!6Sr06<81+cpuAEyjg*hzf5L1qf{u-Y&L7TtwoiHk>F4`q?3ULPys-EWArf4|yZw zVTCAA(GlU(eO5`opz=B7TtsBl&ASH;SXCdD&42kodGT^<)I&nQUw;tX`u%Ox9a|t3 zF(H63Kxq3mp&fs)B(zOTTzHGvc8Q-QK{^g$J9K{x0rm)QaV;h+1~?690D%8up#NVK zPjn#dw^x|!eKc2MTpU=VsP*3jE$J%gcjwHig)&n zI=$FBgwru!wKvmhD0co~!IexZi5Y*06kQM;RlnG4tWt8*H!5mHdRz0d8M3=gsl%-3 z-YQ*ry(F;frM7#(n$wPCL_f=k*UQScfM{UU+^0jZ#ls5=ETKAi3vI9r?pDc7PL6BO zl^_x`JfWF;3U3t06~U*)7Zha{AE$e!1XZY&3hM5eey*>Iy?V%OgKi|_Un*v};PMUw zra)q}s`lH+1i272L==)R0Ig>5k@+Dx=q{g~=*Tt_eF(o}1i< z1A4c8%KbG|H0ZVgiy{dA66?#zd^}++t?yk#KfIn|M7~&p_fVTAsOUr3L#55rNZ2TM zKxE+m7Nw7@u(8@>q_5thI7JL^lC*9Aa&X}O%E;}=Zatb>UWyM*)VyW_%jomcx8q#N z`~g6I`T_WUBu?5tyQ|NFrU9{4kHKIIp-w8HFeKcmnKMvZSKN6KC=X%7wSNF=(zm}D z&pT*p3me96#tc_p=3MN2I=d>{y;MHC(2=lNoA4m+0zlNt#!QZAn!mF5$~So@O^&$- zJoLHvuw924_xyJ}qaQ^ptw(JJVNT+o##(N^EW)f@vft1HLGW6=)kpDn@<%N`tzFbcntf3#!YGfDuTJR%q!k;^uFg1>*Xk5; zKY;4g6~!Z8TLhqLD@N=u^ai@D&r>i(_Xy`gz#@hvI3QkyM4XpP^^XDhhc7}WYY%!; zpDNs6n^u6*a^fucUc%Yy1z3I1#_9PQaHz+9;+uqEv!hZ39?zL&-s__t1H-!IF#N4S zB`E*tx>b6J@T`)hqGDTVyeql6ZwBSz9Db~-+fnkBlr#pFq+Hl2e~#heR%WKgqjK4c z`9A=c(~E1^xS=@mpu@U$_7O|3-I}H0kl`{vMEx@Kyutav$btOhrMR*c>UuxW4RXT= z1A4_mk0r;K`~cK-y!lPJ_c0ZIw!Qsgod)7nEJYG*TBjqj;^@pCia_>-hvg0fC=@4Z z_)*a>Tn*S3#iERg#dgy`l z`8SG7_pw?X0R~K0=0?*70hgC!Av9a_fwtChnf(=Mw_?7mxUN^9fnbAP@!I zyaw{R38o*NzkVvmL;eK~GYq#k>$7Nd*48z2YxL}6JA)IN1ER&w^4(ekevZW+o;wy2 z6E(uA8QU~ac~=kktn%#99KE~PE$RvvTgoy9GvH!C)D=24DK~fk=1-VFlI&@;LhN)x z<=`U5bhr{C)w$Va?;_M2tzgCHB5I^cJ8u`z>1CP5^l6TOUw7MU-?K*xM!~^yyJZ)s zS;R%Nk_sSFV$tNp|1H)8FguxzHdU6DHI25EnIX80k`_FNwYcnqK6!6N$`daJE6d^L z_;mU^B#dV@WfnA)L``OkInCzQCH|&#!bO@266D<%kR{k-mOK#uJ&InoKI$Ae3h++M zkygsF@bOj9t!yr{_D8w#{kJ;oR}+62kw52+b!S=|rVL#+BI}}OQP__%0brn~c=@_dkPhfC|E@h*I{aqb!BxUD9a<|G% zdv0EQ=umA!$t9uwSp-?EPG(P8hI=x@T5;*hIB+xOHoUvK^}XX+rmHv-iPtQ*?OZF$ z2>JX7Fkd7O)|S5era;^l15vaNsQVnh#M$h8w#BJkbWCo0K)~fE&xG>wWXVxZn z^-qUGnt7b@o{NXeG=fs8vm}9;T|LvR#KCX%l9%_aOmCD8QFX%YE_tCrr&718)2V26 zGd?=^xV#J2Hxo>j>8Ci>wMTX7GhznXER8XN-uZe6zfyCye0^)yP^|WZ9Xb16S~};L zQ6MtakLl~4IlvKA->PcuoA?2Ea`AmWsR~|E!GT0uYH$R$R1T*bUnofQjOg01Dt7Lv zk2Y1!CiF8O&aymC_pYFfgGuVa7yf!Kf4a{*$vU=TCwv?r)JI?$9?dr^`1InvcE2sX zY}}U>3!i9FHU)hVr?HG&k!3;M+H!fB7%*sjv}!+Qr}#x*5|!G|mdhGPpY6E(<`p4j zEl-JkAkt-6!U0HGyMmE&KG>|(G;?0P@TE!*It;_>lIuv%$!3<+@li^!|anw z!o%^z)QG$*W!7cs?=`|rs55jmq$Vz}L>$Z}IB|7}`ueNYiMWI3#0z-3hON`s1gY@~ zKn*$9-d?HOOHGDO&Fvq^@4>kaI@-#0jmj+7fR^liHtq7&Tlh-F#U+(+ud?{D#t1Q4 zwpb9Yu5a*a!mZ@cJ&^FLZ%vx{vdYjm6k|Qt z2=LXD^JR|3b()ES&ynH!YH0co@jk!1dj1%%o>m=o>K%bUN9W=*dNxtJN8Jh4_tz29A{!-n5!U69{k2?PCXK zNlE?hkt5VhulrT|16%PJ`XaO@o06v-q?OFP;!tU1kqLzkVkv^*t0J{O+s$DemV*hZ zfm4>QUG5DX(R9TTL7K-m?6FV@2+(-g_RNrl!uHf665)weJ8Lj^@t)(g;Ohf7n9qfE z9hZ$PACfBS!0xjo`XZ%>it%=J#8xQ&S@u32q^w_kqI7NND7vQWkw028C|zjOYtcs4d?+ zvG$Z8G43+0FfK~mou0z@>5|P-7cZnYj7_m9!^4~(fH0h;Q$3w@ z1n1whC#Szf-HtGdghI_hVETAv%n_3lm~}mEBRP%0xgxZ6(44;uPqUp-;Z@yStDc3r zWF6#Pl>zB+tzifIc4OgnOcGLRmNn`&RYx*u!3tHHH1{#G!j+o~^Vo<-uVuhGP7r~4 zD642SUqfTRnY+oGp6awH-CScLBg(yugMN2a1sp3gFe`DOF!N$AOjgmq$SWPX%*^DM z7qEk?qaPezQ4-LL39((xO+{VuPq-GZn)?ic-g|+=jIw1F4vSf}NY9u^CzVAnuaVV! zt_b{Wpl0;Z?r6@4$%E)Lg9EQrsoJ}&4AWuhMM1b;7*@Xk?#>;ILO{pjjt7#~{Z&(~ z@%A!}!iURlO1<7)Iiy+X&TG$v#nH#w21I7}iWIwGs}fZ!g7oQrSH+twZ3f)mLpGW` zfVpd9ZG%s}`%6lAKCwYA)50w)-pq7T z%%V1W8U|&qN>eYAh!ZXN33e0${{VmIRkQmt4qERQ;TXXUMr=MC?@al4Qrsx(Y1DynwtEf<|Gi_6@U-IC37+0;eiJU2V^w0U`iS9b|Qavg(q9AxSLY+!5sZ* zo6NW%bY2u{=zDkAp2LCTg`Z#B>X9tvG>eI4(Sx$$9=?;+>BA<^La+DSw+9Czkb4Vr zik7ZiT*=96z5{}2u1}AKXpAu;!v5N#|Et!w+30jTwk~w{yjTm15JR*BUILX**>?a> zsmDlFh}k^*2YiFBAtsx*7O6cC{s962pxyIQ{*-#6)HFVsM2jEXbNzQrp?<5A5(nG_ zUYiaLcNmNHH#G#o!@U}EyOWfo%fHb;F7P$4pPg1Yg4yVQIP||NKwN0TC%eqSq-&x* z&5yRt6pDNe`T;1SRYnifKM0SC-cFp1x;SH=Y%b$ZywGQcBm3DeSDVz~?%7`goLUdF zcu$Kw@7UY?s?ImE!^h8D<@@lrRTBUpxybKCi#oGSR)!h=0XkITbhA$FAj8&C0$4rt zMJB2LSY;?*H1e;7B7D16O>Q1MsO4u(ztOVgOp2K!foNm@l4yU;&Rr=(xICQupS{aQ zXSlqEI#0q_9j@&;{WdA$9_D=P!{WWg3EO_{Fxhgts9_00247 zhMF7AMtUyn9Z@!S;JlZoDvARNL)w$_mj|$y0?m%9+&e82CG0?wqveT3P(WTr%z3R^ zZmjH`zrMf!arK>ggKyF5bMm%G8@ohWH#mT$9@5btTB`&4HZ$c-FDzlCDI>I7dq>hR z8gGQQJ?FGcG4na70;c4yVo`PV1Gb?MDpyT8bfoaKK+p-ONRv$qgUVu!)f<-Hf#heJe4erFV~RI{Q;=xgxSB= zNq81>QEyzX;nKAG>7RmaQF08$L0NWisE^y4v*uXOz?-}i?s1nd&R+-uR&Y-{d~r|W zc%-m_T8}?G_1`eR<()0J%v;%8LSog}mLWTF$u%wP=n$j(l~d8mB~b&Z>JfoU>WqcX z=}PDOQ=&0@dlnpuS;gcNv-AK~p;%8vGo4yHLT6NnzsHL9ux!*xxoq2 z;Y44o0he{f=8RqU>2=`gz?YXl04vvi0PY-~NuR5o{Rnw^0%J#Z>GumSOqYsEdkvit(?jyM8%h&XiQ9%kX*TgTt3OGud)m+rE%xujWNv zD{NSTRD%CrXn!Be7V)NL(X5DsY(d+5m-JX$CcT9qANSqqtKqyh>(;lO523q;MtbCy z-sWzCFtz($$&AwJ4R&_IZg0TtZiJes=hQ*Odo~ShLa#<8Yy$W4v#c0JJ^dF5II^nP zQb^>MRg-4gayiRyG1n^hIHc`rn0GutKGJ7~5ApM$r__$coY*=U`cS(iF|RLn!oy9= zW3d%6-m!bdosinCO@_^Maz-3Tg~!E=%y$Kj1|L2qe>lUtqwsa;q&Bb`9s{P(M@^_D zzfe{#&CcBGH;_gq1C>%-X2x2XF!Okl#I>sOAx&l5LTQeI?Jw1sLLW8FhJp8n4$b#s zu3iWl3M^X5-e+uWxgF72oUYQkX2Nt<9+^V9I#%pA2KGF`+@z@bKhNE%N}n4m z5B^73beX=)cij^y@+Key&(#@cLoJd?a?@q{w_~qPm;L}Gz9x?J`~YlXw7!aLJv}G; z(gN&A?<7*&>+Tn>H?7?NF!)Kq@?+Zk>50mz*k|LrHf-Zh|4}#1c&E^J?PWmor@ZZ@ zw=#@WWhEBzacnq~v#Ax>@TN_eSZTICLd7Mm(lxTGE|nLc=M(;*dS}Bv^_uGsz~1|c zuY_+U$gE!dW3c}~A-)rOQIG#S#aV7v~w|ALVCt3jVD;Sjkd3cIn0;FKt3^rrN^ty88PeG>2$zZShz{~>lYb(+{pANIs}Y_1 z4ueSGTwZ4#HxxM;cV_>-64(i=93CTgKOO@dRQbz?jpLK)eXrS_ z+&Uy;3)e}xVBPN%bEpd|lR8cxJ7jXCASS>s^GKkH7M6gl{-p~vm6rrkXC@}c*rTYdbv z>;G8A{*@s6^8&$w!*K2+655T9evcrp69}7$uNuYZOhYYt)b0yg54_M25UjMd*iN3-g}92F)MkYAo|-~pC=@z47dA7FUo#m&KgX>t&pL z8D6h?x>k?^M525a&B4QMy? zOS-uV!V*ZW)ejk7lOK|C={}`Gl3Ph;N9{3(@cY3k*kEg|0B?q|G}Xq4keT=CIn}%% zPY##U-dW#kC+c9-nw={HgX@YzkUkJT85u*rB&T8O*I$W**<1eFU7dY}q+`FWm7ls; zh2^3%{9gx-mAz1UPoiA#o+y{VAujA(FxHc`~VH@xYZBCAExp) zxj>Bszb^G~9>Np?g<%VkFz6_2`kiSHilDJ49Qh90H7?E~0hNN%FqS;qxp)n(3*Yuv zxITrM^3dYdIXjj<+jAaV01pi{8&`CVO7I;hjq*5`UDiVKL)ttsSUedO>`3btMRYy_ zp`2KnsCcfps`eL;AYOKeOw((d)>AC~8<=ztED7G6TNdxqYtzY~MUXnFWcN}Yozcf1 zTdE!KHgL)Ql>R5{|H^(Vn13#<`Kty3aH>OTeiCT1k6`&}E6*bn6HPB8n&cw&^L}~O zKp%B>;+q*5nJr_^qy$(^u|`MxR66ROG8wW*tyA0N-BX!Yc6Edll_fKBO}eDkykJ^& zaIJ{(Q`8S7E$3Sp0e)LfmYVOaL*$lPoh5`_g9$w7t73_%;+~Vg>V=xmE87yFd~O2K zc^F+WnD6v_dwLxZC5voLu5ZqQ)Zk8?WrF#SyNK1@g+v{T(bDfSE5Tg!LS0@7u&bsx zt{QWZj*hGnxS_P2ovNcLYfdwdpAD+|2ixlDRsavFiOr_`b_{_aw8-WK7=yusv?#AI zdQ)PJzadz)(EYJrFh^+Q-AZ?=If)9f@xLU%F4}Nkf&7Xt8CDFPe(5s z`)+yN-U=YfOt$ zSI6efZFwJx#{t(b$6i%bTF*nPFZiNlvm9o|OOu28SBr+*SN0#e$af)0G|EIKB8^;# z?wRpOG2p?mtj#V!+dj~juxc8-)av3Sva^;qTlRE>TusT#xpFq=A%9?GIb7G|z63e? zqfK*`eT+oG8_Wd~!-`rStdwf$PD7JA%{?54xQ=@@oUtGp40 zM~k#cg>m=JrYsGK7MW_83m00V!OIA!xQTQ3`kR-}>K2yum9den%W_46|woIcL?9ySuD7`Ch0!yXBj{DP$I zuxcW~sXUmCz^-jPWaaou36-$R6?}MULOTUS4<1NPxNYs4yd08_FJ6vV4q|qM99qH- zZw4pi_f$Y6lwah*g55)IBQlZE2sW3wDIa_lR5e5@@XW~4taTYhZVrD&aRw9eyZ6vi z;M2F))0}O^ZC>dc7`E~RED-s0Z1?iT_m;q}W{wYp{@ySiE|VNzlsOli>DY!d@Lqp% z;JGkg7P#BD5=a#g#@X=GI$nvrp1ZOd74u3nEsxwp`{tw}*!OTr^h|33hbP>7^_WGo zBKgy_?>Iepi2IsLr(r1z9ylLb!{8g0d{TtzF*YG6H3CVe=XM3rD(q^`8*4~BEKXNL z&KCx;-iNE08|cvKoBE(~zS>2)a)!8*c_i7}Wut`)793wfOiF&Rm>pXSz(yFW$xZoa zPKQ%mX%#WUVf~Z_ml4gIZrtjg*AgE7X3U5zFqr97Bv?ZQ8r9G-HQzkIokLlQgCG+s z-kmyZG#{^AUUBg9OLwV~#b z6%5#O-p?byha3jB$drt%&h!t!OY`FD^h2Pq`p*v~d(Nd!rtDSYYcZDPdJ*n<)g=A+ z@@wtsnH(x#~3FBS{_9$jcej-Vl$vtN|RS z{&UhS-Mhu;Tb9~ z7~a~eB3h$-D0#_{SxhUpqB-P!D2Jy1^e#S^yckoB6w^NzdhzfreMMVGu=ySwGa^EN zAp$NLK&AEdz~AXwj8ql${jm`hC@V~$jv0$aQvO*G8@ zkc2r(Z5;?Gp;&yg>4tpqU^O?wkZpb*^Dml3qnS0kU{!6(pBPz6b_p4{X&86RW*x7t zqfH>Xe>s$g#}neJpE!awI*X6(b!Xc{36}%=lq|Xru`T)qHFa=!YcAJ|>wVHg@&n?$ zk;|t-#LnG)vz&zC%1`Hw+mgDA^c)Luv(qSDHDqV_2Q!N2=0P;a)y4(wvy~9*%AYNW zcWZE(c3RmAWdgP0$1iu?BrtOwYGCdk=R+xQ4{Jd~8_&-TI#QiY{9w?n)9PlPM>7-3iVpScJ^5|IzFSH%Vq`fQ z=Je`4g!y(0pxHaX7>X=TEYdbXD@nXy5^Dw_c$Y%|HagpBc3wHXIiFXNu{Rhd>qP1; zk9Tl3Jcb=6xxH6oa^3rfgWI@Od$uws<{(3LzICU_pNv&P4hb^9<*qG^g_){ZZm%@^ za=83 zoWeyjVMwIYQ=OIc)vYYf1Mzr71l%#a=*?92XZ~<0tG*>ybAEN;!N1bh@ONGyc&%qe z4SDh~jZA+7FxzP`WAIB(dDj!v2J9nuCILFx998bbOZ~N}?K^&QyjyG1V8-;1Lc-Z* z^;??@ex_c_p;F(8*TkM`|54E8Oa1JpkdS)&A9VX=sp8I;Ykwm1)$D82ABERc*By5f zR&^A#HVjg(Sv*Y|&;Fx8UfF$wwZHz=x#=GOvyY*32S3VwR`{b}`p{46=e2?6D^F*~ zG`@kpD_-^eqY%)mezVzh^U(gRZ?cU~3%wdb+Y|mMY}~rzDmw0a^z#!f7#7V4u)!a_ z#fb4}rqiCQCy0qRtB3on<$eL307xU!i4{uD1u|*jt{%bk{7=8Tgnwr`w{0chsBZ6SLoJTQoY_j_m7`n&2D z{xflF5B#}YgteM%pfV?_M!<3vet_qx=b^qjL0kwm3or!IzU8k^QiX8G6>+YGzCmA* zaw|0g1Qhy}_}4gphv|QzrkwyG?G4W69g6Qt@Y>NcLT|Dp@fnt~N2pnfEVb+g4mM<{ zz9-Yi#TCC?K-g4*vG7$bG7V^BD)1I9=G zQ!IbeLFD|t!waPmr3}A1q9$Eb$)0}?CXYbg73Aa%X4jqsYhl3Asu91RT5Uu2p+Fw7 zMuFPMl9?#3jCgeO4ShD0z+fvUg*5;ST`1e6n&zNZ#&Q9(!vD4<|2C@sbaipF z+dCtA{?|#bRvp`Mb7V!{8%&p2S$HtgqxSU`0K_8DFG$+W*}+~z5d|_;c||XatEDqT zHr;0W06pUAWyg=$;X#f?h|cswpvc^VT}X_^NbdSaW5jyI)cv2(&~R(Ju{%t2vzY?1 zU=lqg{@8ZMz#TGaiz`8~5$_8!UEb121Q_0Zim=#HnZVuk#H8CCuGAY!JcPpnAsBjv zrh9AhP)bOr$jDESoSY~d`?V`Jh(cxrSZ){vHt2!b2a`MOzMr@M(`yNlewr_{kDVp6WE(!C5l^jR-em zMlF5gY$g$ms<(PlFJ2NZ#@kGEZ^+lLgOa zku@4ppCwxoAgn27>5`qgkA^Lv`7vGnEEK*%hb#Q*k+yx-K?6aO10M2v9XZFdTzV0h z>cwb;=RqWQB*sebtMN{!o(n0;>SggH0kzgWB@06_9*hryL*x;cUW%W24~ID#VeaoP zga&VTVvw;RbVQ39zTvc>}$+t&5tIC0GA5 z1Mno0CHErFW|TQ({SBz8g?N4ICv|}2f4W@%jS@+CIWukIjdv^zqM-{f!;15h=d>`i z+3dORydxVr_m16fCC!`SIhZ++jNb; zgv{L6CXctp=zYlqq;`HsRhP8?j)cChsQWZ?G4S)Dysz8{d-8>!+LxwlbFRD!xTZ1E zGvo4qcW1#Ir1_rpNe>!YINg1Q+l{cle4=a;Q@-sGXVHUC7qP_}3uYjtOI-3ZO_l1t z%K9;1x6aMW_k>w%K;$8^Xk9;f zb`_|Z5hw=eMhA@dM!KQK26UGtoGl zU(Y1*vQvDM*}Kwi=4B#r#zE~t$(!@0*PWMjr2lw$ zvxZ#vs^k94H}GFZOipn84m_HVJE%p!_M%X?>nski-2$*PjmI6iC859wt==VELG7 zi&JwUxOnKBuWo=dqXl&AukjGB^dUr3Uz<&mz%K~Pi&v*}zU@s|$IfKd7QvKWTb=Am zb1HX(Vg&Y!PxL$KhTKO?RV2UdCuAN*7&DozqHT>}ykWd_o(Vo{TBk zitVI6*tYW;rKpil{_t@BGU9Qaqp9SP%3CAhmuhcP6r9(}`L^!No9TgM*`mlGXQkk= zX=vRYYJ%6;Q(F5_hvSN&6iO3ub$-?JStOO7U)4#cG72-ZH2u=07;w&bl=IdDsqxCp zNAESxQmh+f?ib-9(KVMainK1<)R*7+p_;$pTNotyI$xiwZXZG1I@6Pzu1px#AFfhS zK-_7qfPnH^8@yHr{W=?vwGq{t9rJ7nqWR@8Bj}Avb%I&-Mj;H}ys+u4x%EX41JrFv z!*B0wnL)0Ft_L-`KylN~A?6x2j9Q<8S-5wUn3|KbE;_)1!|ryidBSO*swvw_Tio0? zasuhd>!4dG*z4sqM%<&WdWZovu$qFD$nk|Esk%})+8vg;+hxt9q$WkA!x}Vt8l^Hn zet9k*;SyO|^3u0Mey-S60qsE}%~b}h9pzvDV~+m8uMk1OVLVK1<8<8jqL+NsBIvaF zl2@a zVQ%#2c1BkuwS*uar5J`}~^gwFcu!K&3c42V%oppfU3bhh%- zRHk94W*^nu_K}PtMTNC#7^5+Tm!`}E%t|f?2h|UcKU%nOSE1%Zj+=%*_k8=-*OwJ9zfgIgW9Uhc6kevw(03^D}9tEc!m3Lfky_(TEqWD*K$(Dnt=JTsBU#vf+7 zem+~Lvc*4A?vbYe7U~=jFcQm__SE*e@x6a$!z8Jz1&8snwBbiNcYHm)To6Kt!4x2a zwi21`>#v)t;v9Wkq=?@;KCZpZu8Y!;I>5KerUp8>dK0%kz+spR)TbAZ_BjeJ`~#i& zXU*EZ37%fJuAMtdDByqksXJBfMbpLP6i!=d%GAAntVUc+{0@lH=T9GZOy z18h?QZ2!|vEBQ}L0^qmv%w}9log@gPOjJ+Wq9IMTl>qxuu^M_w_y}e#+#qPP{lVYR z{);zil)vM$4$=c&{CfJ&KHtqw$*CQ_w;Wo>dXYK@)`z~$nwtjzbcOeu2MBcyKHKx` z<<|em=u5&UPAo@Xl9#^+Xy0QZe^2yZ0!dpd9Kv-}Fb@#UeDSKR3qVcpf*ib&qF;t& z!q|(r=zT!3m>a*ib*i~37rK3tGpWMZ|HeOcE1z$Skc)jQEv_xQm zGQB8Ie(|NG0ty}Flu>v8$a-rzfq%fhfa14AjP9DyK3{PrejP#D0{C^Ft{SDzk2eBBvv2 zlP07ZR3E<7?EoSImB1@doksdxrio!*UEGgtLHTZ8jZW^=%QYaQ+o-nQIM%rt7npOHph$YI4QNnbo0J z2j6D@ax6&m7EO`po?M15&8+KNwVgHmIZf~Is0zNXL)lsd>m3PKPr}VGqZVv8vk33x z&Gzcl5RBX|_XSd%YmKwZP@xEfNAl7!qfPB8;qGruNz0kf?zXZFQxt<%>1vK~l(AO% z8qHOc*7QTp^>uk|Ud{Rei1`7ynazjV1~@4=01iuSy#NEV zPT}cJoK={mg~b(LIsWqnz=MCHAb$_MZ)X_v@%~=Pt-Sq|3HvwAz9kz^ymnnpJo~^m zzHjy1(Hmpwo2`ekaH(yLb^y56$LX=!mf=GJO>Kw`S3z-*IQXrHfRwtk`ttkXoea{uhjS6wI!pnBw>DgqLAc}18>3t7 z`+I^fU5*_1eh9IiyTie-`?a#Jn9Ed$q87Q7OAjE+JTJiEjg(HO7TLN$fN7J5#mifeA zo83|1=Q$kTi_XAB=;V8*zgzcDoe-al9kn;3;Ni>+#e6Q3SC!ewKjE2&XJM$|I2`ioR~N$s0<<3T?kQ1Kkl0)?t(9>~rj*-1OGy zhx{h*br#E~p7((a;N|5uTJM>fH9E8tY*F`m!@IRX79h_RmZ(YH3i`dq2#vKJlbq3MX*49Ck!EfEq|>KRV7k_mP9N$( z>N@V&@00)hosXOSuik8irLz;wq1W7m*zg5%v6eIl52tJfiT)z`tll+x|N%A z>`O*chw#Iqo8%?p9d>hhyv``HwU$|8867HGekd;X@KGsgKAA*FI7eyOg@$3kOGuL^ zqCi4DcWf`I{n)Ge zZB14DUZ1;qy1g)Au=`q{zAI^!<(IH9T6=X<=JBz987#V_TP9XHGFg&Ye^eQn+0q+< ze3GD1AK*z~>?o$k_sP%(X271&+O7RwKGSts+{+U}FZKp?zq_l`UpFr&C`s54MPOwJ znDIDef$!ZW>I&SkG)i89qM?UN8kytz6!*9Y&;NpgXd1#Ssfp5j5Bojh6>`fV=m_4y zsD-4=$qO$(CaKQNDn`(K6O5Iyd9rTvGvQ!mQgjh9Bo=V#7mo!@aZdSxE4`O6KH#{00j6IvU-`L-6Bhl#O0FGFY-a74( zwdOWslp*HIOWXjQ(kS{HZ|j-RnZIXf|4Eyi_+;`W1*+pG4h7vh^K8j7VJ1Sj zPI>L_rQgR0l=<1A{h;l&xJmmUMEFFTtu0asv;LNRn2Ctu`r9xPvRFkOBa&AN4s<`k z)b8k4d+R1L>2cVq6_!p+KbJncFrVkbi*5|R1RV^g^0mR`1-+jpdm=IStfIA-Nohn6 z5&CSC6&1Is>DLh=8*-a>ruWMI1C82l>e{L`9?!rUskW(_Q97i^Hz|rajZbB z9|pF~8l;@p$157@b*6ZT1;@J$UTBz4&%E)NprPbu0tuoiqanW2kv0}XrTCs{7^~W& zZ}@Q=9bmO36TTvQ3rlqpis))jZRv}?ii;UPyE z%iZpHdUT+~Byy~Ntfx1WnKt(HfwFsQyj(3Yn&?q5V{}a;+Mp!cZs)Cu-hq23(Z(NT z2EgFVpLpGnHx0Nc-&Kk_ll@q;EqLS7k#$p{!l=iJdYbnSGcyx&%|GsXB74vyf~|J( zV8PZ7(i{SJ4KOqi3=U4ci&A(RiPjFX7H^bFOtZ`9kuk-1)j27Dfd`E!o!QDjqx<@5 z?iXBF$p4r5#t!S8e)`WcW6-U9vi4k{eB`QE;QU;^uA+9H zmcMq|2~oQDvLvIxbHmXSHle$Wg@ko%f*-SqUYmN*|H=i>0mfkb7= z^$_4WT~$zN`bnR>g~U_p1PeKCx{ z(z3`FKUte(a@F?njTyfj5 z_r^(~52Ko|_=miTcP70X;K&!=&7fb9j#4kj9>XhQ8p@Kzd){C5i|Xndu6d<#g!-!F z{%Wp=ra=mvccE%IO7D>)ue#!#78E;177HqK28}WzQS_lr``YU#x|-(#j}X6Syu)UW zAopPsq^@`^JF4D%*v#~mNLUmV?W`&nD}ENn=YKsY9=b%6lIoqX$9r`zB;ngwf@tJe zmTm6&jpKTHV3}3>qLnV+$E0BS$f#iSj@|x|VJ%WlbYpN(`h3n>UD-hFz*SWwc;b_$ zs;5Bp>JcK(o1vJgZ(fQB$J9wx9AYbAH|-fh1yhm(rJV%xt(;j0-W3dL2krmq z7m?z88Rynj+f$@{u0SCCbres$Id?x4W18?#I-|H7N58B#(=f6=O*%#>T1>`wX8KMb zs_dZynPXX|Hv#7Xzu9@Awgja$a{J!pjIjXmzuxPe-QOlSo_QA*{!fhme;>R}dBuJm zkr;Q}{g0r+uHyi)BLJ1tPUGQ{Hdo8)r;ZE#d6#$By6*pB@4e%iNcX;BTx_eTOH-t& z1W-azz~B-ET_vjH$ zr6`E|%zAdu*>msS=j{Ew(tP!ZulN9B!6 zkxi?dWE0(fW?f_Nw2@O+Eqas9X0D_c;RJxzVGgy6Yi`LN7CQM&+m9Mh!Sm21cwT(_fZs zRzT!#64%BMdsRij;)!%vWo5iN3=InlJfGjH>2yL-Jr;c@QNSG#_g3J)T=%C{@#!y4 zn$RF|G#&L~P?{o6Lf0OU9AYuY?c>{9LD?Up+7i7&bNVwf{NVcOA+_$g&wo1koGm_H z>LYj1xv~|Fznm9TfgIeBvE3MpJs3<+&PrI;WPJgHS%;1Cgy5i_&?$VL>j?wvd->Vh z8^(Qovb&;+?uXAun-t0S_-!%PwsDn%jLRLPqAe^n2IM5k#Sn=69`2vPF$MHs#w|Pz?LhrEku`0 z=UFolMPD?aGcbQY`=sL1fbr68c_Hd0I&$G?yug*vU$HoQWbxF2#smx;Ro5uftj=L9 zY4ma|P?2g(N$3roBn%3UZQp6z@ba2zs#`J|*NVYdLIy#KLM<|I6F3O{mF^wc^uatkFp8U~{ym_-8P{w&C+ zMR%uFVsh0$-M8n7A79ph5x3au6pz=9vP@MM^Gfxnl1gT^RX-VC0Q*~0l$~{VTbAKQ zs+!9%ah}PmqhPzO3fWvYu@T0`Y5aD=TQ`YbvV8)Jm{j$Wz&bxJ!Jcf`^ITOf7p{B) zl)c)G3MDvo_dnWlW8CJNlMPC+HPH!;!svR80<3N@T|a&H@PDCHt6#c_g2R7A+e`Bs z#6g6j^x&eUv(Qv8)WL_rcJuA@rjpq&MrF9S18f0C_?EvYm@!_`hsd9GaXvo} zFi>7}S}3Oz&*^AF4Erd4yb*po7yQwOwlP!JHxVFHxa&Xm9ys*HijCx~K0Rt3=Dy$R zk{=+9w}2rsv+>FSS%>oy)r$>5l!;3Jys5i1YLknrRXc*sXew;tqOk_6tkT_cI+NgB zBG~reRh2EOq1NMwsP2#&c*wxxvk#}w)UQY8`v+-X^CS7jO{zxa_qI6{5P+~U z6lP|21a+(ZsY5^6k{TGo_FZ|h3jae!c&%A_UuLtEx2Wg=zPrb7osuAMN?EYD^Vt7O zh3{R`oSJJe9&G%toiwl@YY3z@w~tlkQU1cZzf4$7 z=E|1iL<(534m`%(<3_aUb|xnAGLS~vgPRI2l`3cP(7=GfbM0B8 ziD^S+q$$#*%e^7l@zKIAyOOysXxu)*hr@>jTpX)H79F{$J$$71fL2Hf?E3LBQERmN z5_BxNnCxCd*EM7nnk^g<)yq%>ysASM$))a15>pdytwZbE$aO{8JdsRRHWN!lCC&-P zO8b)~;iY4K{_@8g3Q|rc2Z_a}L(ANQCFrxo#aFYFDaw{*4?yi|0`zQHcV-%D>l3Lf z|J;>JNnKPvwjfa045DA7-v_0&V!^_uva`Jeixb@kM932u>HADTLwtHVbj>KL-tlUu zfAx5duRxBk0B1pPY+p>Y+ysF=7d5ew4a&IHfqK?3>~lNW(p2@c5LMY8xtM+Hf|*SC z`)4| zv3aLvfZTppRaR1XrO2tN;?Qladf%Y%Lf@NJ0e9wIRn`J4m4S2~v|CcM2tKfkzuxf4 z2OUES#0^K&gm_l|NUs2MKJgq;F`kS^D|hR*H!OkLn=8XSmOL-0hkq}KwJSMLD|4Xn zuoh<0Wtu3mfLZhiJvP@o=|5h@Em|9`NmR(_5L&mZGPwS}*y+AZlfB+^W@BSIInC<0c6qLG@OROQy6w=AlBHtw)~;D)*4<{kdo#%BQsbu?fj5FBWulc5|+yom!@>K&b%p zK7Rye&nR$^F`c}jAAH;*Q6cKKTP={xU3NfEm!1|xTzwH?i0jb>r`@VlrZHcb3Pa6W ztw143(Hhf^mmg@G9Z72oIyo9IP>%OLp;6u-#GIZ-4m_E9@$w|!Eiq83Q8O0#*6+@w ztMhnx50SZ)H8gN55heImPKb^mG%bP9{b+^|z1XvL?4O>U|E*yuLcXbCPfW3?3ZPIH zmd^XGSj|p`SwPu|K&QaU-0IP-0|Ko*kdxTDZFfYvmEw!m}!dM|CbAOBPn zj?^m@6+XApjBMdp;2{Q;EMXZfnF6+~)UeXco_ZcVkkRIeXZA=l6P^_3ZdNEvzA!Ad z$})yHH&IdLp5EMPNgL6*@#M!--g%l7xMrvsHPSVUgof*{GRt;&O`woZoof8-3|nfj zIlg$){q+IWOr0!;TQddmr|jF=vTk=HULN_}*^JQwW2z2b)4asv_@8E#H4@6*8mSUl zlOnG;8Y{p2OrIcjCpXu(nan9?vB|g$a#Y1*{YSB`X9Bd6zaPoFI#);aaaRUI%o2Ni z?rx2v^Ey%W3N0>uHOZDBvZ7*h?Bnm$Z86>G@Cb`kP?lY)|5e^X8XB?vxu=!4LEGZ| z^t27axsMpxRr$`MJim+wQWZB;^sNj?&gSma8f*lubZC;D-OnPJs38)>^`sS%}$?N}|@M|mWOW*QK%UOs2(lpWw zYDYz{KOzA@(%+Ga%G|U!inq`$V{#hE7st~c#`#(K$9s^PrzUcrmj^#OlbL4E=(EaV)*xqVr2wX;@ zw5ThldTYlY@=XU=8pPG1#z{zA*oyrq9lu zboqG5F5{8BwxUGhv|A}R!y{oygEb0sXJuUvNwUhPr*Dci3)HtceoG$o5-k?U3d4ei z8%iDeC12h_qxR{F3mvEPDz-csD_~-3uRE2eE&8J~wyQaD zzZ9u=j6G1Up~auqvxPDk%ES4AI)V_4u3|TbFeWLLO=C!-> z`Eg}GOHECOd0S+^tAax(SP2QW5>dG%+WD<_inS*KiFKITC3nrunt~DZrH`WLT{1Ky z-Gig`3#n*6*yB|D($ni_rjHPU#iyn%0tXa3(6*7!h|J8>1+?y|(vorH8L@WD_M)wf z+VSkZpD^VY7(=Q>X}DyJ8G)UlDC@?t2&v_RH8j>52J2?u-Ig)mWAE+!6yvzIXYTRafxsP>4QY?L#6QVf>BTuB*X`(!vC z_d(~NPQdtiZ5R^fsE@nV3DMc-q~sm5->UTEnT2vN-IEi$5{Z3`&Y_?cXY$%&LjUJTD0I(n{KU5#u-rn)#M4$3TZDy(U_N(5u*Ln}*}gPW1O_y5Uisq)C#I|D zxgxY)#V5`kZ>U@pI)H)nbKS>_{ZgD#wv6?(fjl{_ohtH#i@~WHriX@tXExBKcK;(P z{gu+MpuYPzf6e$veXi=bVNU`ARNlld(Fo=O`Xx{yzJ{so8@~psuVHFk+}A+$HB4PS z^)<46jcfP*bHe{|t#sT_HnO7To{Q99Kt*iWl#W`|Z#(v957+N#oZoo)vTCOKZrSS%2!>_1%AVA^)}R9Gs~2p&Exwp>!ay$3deu*;*G+*6YpBX1&){EexHCmStveE$l0}E+iGHBRbw4 z);{4kIL}yjy2?+y7`}eA*j&&X`w2Dwj@2`#XG9Syposa}b~Wycp&A7fu7IBC8TAMq zlGjJH^DcW&ryl>JOoW{X&*d!+@J!B?_Zl!VMH_3*e>UDi;Y0hfu;V%s3>4pArV(~W zT;UzuSFe>CQVm}C<(I56YG}xbp;Q)<61ZV^gqHNPXe6WGIdNgWB#03>0cH-NHyJ86 ze54gxnW|>$U)(7Xt{gr#b45yeof?X8GtfJzHRQBW$Fq-F5iI%wprKhFgmralN{7LW zuWWFLv84d1!9rJR#&q(T@t$#j&~3@m;3aTj#eEf}`b)uwuYA1-QT60FZ@t}wDS>qD zbZ0{uT5nPRP9~Cvy!56-O5H#uPsu?Gt!AcXQ53_6D>x926#BAv_)AEM_q-1at>6I zl{PS@lNYW$9C|S6B@&1}^2=o3Rm-RGj}O~%f`#tU9&Ep!3VrX%fWW}>R*+VgS0p4_ zt5a7_f=jIQjLsA3buBUn@~c(gE{&(MEuS^K$D8<}U$Y-eW~E<1QHr#F188}g?->rp zED|DX_BMRZ>mCQU|6WsH1cWI{XKA8-3l#O+Jj4?!5tu*=b+ph7sR6JhTS=Xo$9zxk$)>I02 zS7uO$VkfKn*5iK>-}wZJ=5pFHdPYH+wSeBSJyY;~R>W%_+|^!TYlUVD>n*RfT*G4; z7&t^bjhz4%D&LzFBUF4yEwIF6w`g2woV zVDsAbXMlFCgnK%o7JRpba&e6jri{@!Jd2Rpmp*vy+kEz=earZO-J~1wd~l;&B^ur4 zP`@|)1~|?(z-9bR$eA|{y>cv@{pG8eAiRF60G_QZ^gheXPySZvBUUXp&4s~uyWa=% zXv2Zm_STAc2|I(YXW)CLsAU+wfRLLk4tWEbgF4r$W(*FK6~KbQrRx9 z=vYB-Z(v=CEDu5mBb$xUg=A2%51}0`ix5gOBJyW6zs%=|%wcJ6VpFB5mQY<>1sUP= z)|Qpk#niGZ?lf#f_4e=|gWNwK^rjbiFWY9W$b_G7_85Qr$X3JxK+Z%~t)+%1Si&jq zevKF}mCbX}Om`U$3IUcP>LCpyf>dzcOetJT*#8Q^MJH19k}bl-2k~`Nz2yDr`rIVn zfe=-PypSDw@4KwK4{`KDd1d|0Bf)8kNPNWfapt?XLfZgE5~(H2kGwsyh5JQW0BwU0 z;X`*XC^JTLD2u47F8+H{;647G8_SygzhcGr{DvIZF11P3;7w|L|9Yj>U6q%e8dBO< zx)-1yOWt>S35<~zp9*{weMqG8vVp|27ZI&n_rN`h^E8>-bQlq?k#{GvGvsHfs37CU zzj@td^z|HyY?62h7xn`%{FCbn8Os*BlNR>qy=h=Fv}5AN2zud4kM zAGVNB;OebY_4?}QJOo<416AeD$TSf4u+|T)okM}dI|O6(<%h7m1|e$YR#QOX_@~{g zuU4MlpJWkeB!A)Z^H)RrvHC@UK?6OfTnsY;CYOqWu5Racl2na7_$9Dgs%wN1_f3%Nxl@)|zKQY4J9W7Bo zcbIbUXEFLWiMKU?MFBv0(mEF}XbBBMA!~D<SkAl!xp5K~X&C!?Qz);1~qjS5reJTf~Pvy)$GC3tU=Y ze;(NhJaEIi&*pT#Z#4aC5{R4#*fLZ#XY>q5D-ZV%m*YMhWa;c}f8?;w<&#$I;XbjU z0T&x$aiX>sKT`8B)4fD8bpuPOZzhJ$(}C3L;&LVxG< z6tNDiW}M?(=JDJ$Ewf!UDKLW5c5cd~?7Zz6*6uW&i4p(3hwq4rH7%kF1AB-`tlp`U zChOn4Yew;$5Mq&Kim05f)b1Tv zL7y9W`=dFF*>+vVWq9RfwXoi8{uFCTf&f2x*;NbGvhr3FDn^XS-R5KTD^`+_V&r&A= z9>aoDcKgfcSMBiuEh&!P?MSl#SA)r%+t=0g*vTx$tg&$7;)y$L|kZ zZVtF+x4w#g2!_d3y7R)!sOrcAtBk`)W02L}enxcH3x4*-SBZ?CH+bMNZb&TKY%2TX z$g(4x6ySd-ck@*zuMgEfeB)IjP=ut!d$FvHA{***9j$t&3+!2gCE)Z|Z+&h*y6{CU z!n(xk{nT&%*)>7WJZ$9c6o+sN4^ z)D@cQv^Vtq6q7-28jf71vATjO^C{oeF?o03oAQ~Qpsus_8i4#cZob7Q4C(n}eoz8w zAl<(Pe%D1R&`l8yaZZ8XaMW9nsnMni*AKX#QGNV0P`RQ=*)WLOH!_VjN89H@9{zOu zhTCCR1c*H!{T=Q5oVpP%!|w!Exu(dQZbI{IV-%8_61c(^&f~!=yY#sA`${TQs7dQ; zb8Ghbwl}3$-coe5EbMFG)7gspTGXZ?8(A@`SU5lL|D#Nu;g(I;x7F%u-CwPC9@osT z$-|U2YN?+Qqb^0zO=Gv0>8Be^-d}jPq2a)1uhdt|ht#QW2;txFw`88SBZQ4ZVHRO} zK|unUFpLR@8+ypdAJE1bGe0I7FK8-L z(1EpvN){{33;oSp4Puy37TPSAHkzH_;iADQu)6zEpR zSsbw_4g(WPCT*B!JQA33bLsgqVM>8);5Ri439+J z_RF3AgERIV7$!*2=`R%{ta`kb7^Jc9Af;&Rr}rq1!|vOUxZWrT8Bce6^odprOA}l5 z;`#x_ciZ`1q5vBYBl)D=DhHr{fv0M6IkC_#P-u8Wd7f&wAIeq4ZSA(c&3fy}S$Mgj zT3#+YQ#vOYf-hd1saykvp+mF`R8xxY@HEr(yeku?*_XJ0X@tA5Z8_veepIDQ9CZ1k zE(Mi#gGn!n85={-SZbg&AZ=k-fA%7neKva9OEs z)86L>q%l%LN8ogVQ{!U+YW|$-_<3lddg_{vBMw4t746L2t?~EP%f8{8KU*2P;{%*< z3=-Zrnk>&Qp4`1HaaF5+f|*kzm(R+!eOPsazZM;~GhqZj|C8f%s#|TS zZsY5~?0FKSD?Ay{KBktlrqPQTe;(<7S1bJoDq?EDc@#5xJ1v>(hA~y{%g-SMPFrC7 zQIGK^0~Nw7n(}a=&n^X{T!-h~5hx4i3Vk3$AVk|!m(*l59%CHsVP;w=G(x~LWlB>I z0;W)!LOY?PYL!}5-5f`$1d)JD1vvRfT*Kff8^MP<>l(1j7t5m)IFD-4N5V@wQ4Ui# zYih|ed=4#(8Db}MMYU;=$$M(o!ue3HaY#!{<72=67Ss%C_p0= zO@iEM|ADo|$ z*f>9@!~QINa(G%8RN7d4Jpl1g&5Z^OhhJX{P}Bm(t9Xbz?+~lkWUnAXS)^sY2jOm| z(BW-YEfSfcJr<8*&b&VzF^?S;EJ|jfx4P0k=dvG2116)>124&#ezaGaIp$Kb(Mwu5BA7`KIqRwn*pl#50^Yhq|pzkidF z97CRTAz?@T+xXEY1;!`u<<_{vt_dT(_Y>?DT3I%}m+JFz=`&oBL#<~(-L6jNfsZQd z%y*Ak#S4-X`^0@g4atJV0l7tsDf>*l^{)`>qb%+h+KwY`hza z#8~!kOFCJ5wKFHvPw)m$FO%(cZk*-Q*UbC~cT>Lh;z_@urdy4xN8?VrW#@XiWdz-P zv0MU<&`%EyHrLbd$(?3Ao6yR&-4ssD(((A5>DNbT{<~s zdo6$^jwq+ap2!XKv9K%iNc49_bi?x&xsvH^cxWBeWlvhsHM&34vStO`%Sr%v7X{0i zlD-K0<3DaohPG^?7j46s^5Dvq0irga4?G`CP(|?RUW~VUL|*Hoe>BE#rN6M+^xL8T z{Q0lR`cnJORU{u%0`)Wdh|E-mLd91qDH7Cq*A{kZFNJ}0}7>2<=?8n@{l>T0$-Js{l z6jHhR9jnlsR+aal)zgHY!4kRqOjmdZy#iEv0kL=41b}9tqUB2fVn+v3$PE{jg<8Bd zdlanUUk*lEuf z+t4$C%G{_NHz1e9A%8b{BH_hzU7u@wnvGgnVH%6Qq>+_V&08i@i#}*fITH-hr(wO*y`erfc-;qO11<}$Ao8LQ zHk}umCy9;-mK5_sHk5DMuSj}cbFQVhamSo06@TdA$TVz8EeeoGCIXt+Mm4GBhm1eE z33-ah8w48nHs$&5v!!Q|tl)e~R~Kc6A}EEX}4#hy3_Fxrqb@@Q%k0zA%vry!8Q9YZZ??zMP(0 zvRoS;upRJ$f*89BCDZQLE}rI+9+-1&c6%E_Xt^Xbw>7YG`--Ce*vhe`-|pVVe;Atn zk#he)>g0DE>~e^M=bp6ana@?nTtMKZflo2l(6bfqKdm`+gFO^E@_r|#YPNZJU7S%- z>`;1xpU2AM{WrI7Y^q$k^q_sXi(AHZoFMn0dGDX0zavP6mx-DCIqx_aU2D30mcZ-v0YLz8KBg*`FFf`bC z;Xdl|w!^BmZ|dJoT~+|XFU z-d=kuX_qy=zfU_r@8E(_D^|-`XWW^%LxK~Rz2Nyd)61B}E)`fpsDo_h`CU0(XX~AC zCTuyDWyPktJa+3hNVdR{S?n=lW30cbX~&Gtd(OFHZs^ezu=`1Fy&-rJ;T7eGu@Hp5 zM#9+F(I;;_*D%{YHsT{YgA?OQC&30ERxCJf-yaBP72e(U)SqKL2X4r9q3#o$bjj4=s-OX3?!NKp%yZIjU3?E-NWS%QzQ@BfQS>sXdIIcHSd$;+FwgYXD980?iw9ca zEP7rlUU@Xm`{9WH9{9oAROP8KIq)!x9MB!CJk``v)Q&E^Vu69~b-bqd=U6^tva^$3Shu^4*hI3k)LTo< zZ%MTuOxhBcvnZgaHfp(pnIr6DP!*{@l&vQPR=d-t2zZJTl_rSh%0;j`8E z7-9X58rBnPlyI2P#@%+Qf$dvflP>WISfzDi-fZP^YW8L{TQ{65t>NObG`1I6lVu}W zm7hW$Hy^t4TbJ-JKL0DxbHm8uE$_gu@!#WXpCIe}pTPg0zVKfR4?xaeGSkx=HcPFM z`&CN8;O}Ec1*wfUrT!+}^f$82hD`|-?OT!lFQvX4^A5F6CJ`x9QM$+?zU0DGkBfBC z7Dc^H1F(a#Bj`|Hl3Wwh4^>+11-G#q#zV6eEg!q2dj~~cG^^@7Ag%fib{J7y)2N)3 zAv+DT@HlMk2K8f(Z+6_&b@`Bn|3L7{(#|JJlC}1YRBdhUL^A|hIux?OqhQ;$$m$I8 z#O=4H02mQ5F^nCW#b!NOZ-T5=@d?x*aZ&q^eS zgsct@8()F8-OCAwraK`EU5kfZIt@Zhgdehhw8`E(?_yk&K(263_tqYE*l_CaFWtZ8 z`bc?W%Fv;%vWHRbtD_%do;1l|E?=zLWf-}X`Rar8KEtoIwL^nvueZqDtNmKL0Z044vi25X9{kvF_4sOIaAKiJqPygyc(o%Nv#=98A} zp5hHLhBPFW5}IXmPHl+SbF+~NA*Ve=BWdZ@QK~oJE}j-w?0*c-&Q|<78Fha4buxN8 zsjAHawF-x{jZI6p)fyHa-NdRMXHQ^dL?7@vG!9y9E)iRSs=Xai=(9tyLwGPupM+1(3sJjxyuYoI^hv6!yO&d!7 z%ANV`nEx+fBBZvdbKct|wyG4ceC>SCh&zQVIBq$&_T^8njK$Ts5<=rIC~+&@_tV9x zano?{{?iR+_qIX7OOF-8H;Ly77|Z%ac3%Q3dz$^~q}g|bWnblzOT{dJs1;O|9VC4F zV4~ZbccLpk%r@0ZZXmgl5RE{ZOwz$q57loT>E&4>8|8P=f_-O*bI-oyk)0*7Ar)qK zq7|mZZDZT-YCs67CXmPL9ye@lfRbtg+@Th|YJl;Tm2U(rGy=p)!+1|U_NwMVEn8Wx zYMD@rBz6Qkb~;Th5In^Hd|{v36T&@C+{FO}hv+-$5_TvgNQi}svHREkUe)~H&97cX zs@^epd7yr5b#j?%aS0#*GrMcqD%W2LAZOvZdKgf2bI;wV-c2`NJeOH+wcs_fLwTQ6 zlhPV1w@cD{{0_QdUb~q$T{EW~WMq?kNjo(fIoW31P++8%Qxsg4{6Sj_!A;tn@o;iN zr`Mw=BZZU}m2So0Qzs*_MG4$9y}m79xK6w%u8SNDdI&^y;3?)82-6L>6&Z&d@$4%kN2b~(Tbu0 zIeYs_-#))Ua;w!LJlK63$nNMs5cX#&y`QCC%+1+dqOrH+g{XLbUf-$$Xg;7@Wo(m# zi#_QU@WnL`rD1N&UO13%UJ#&_g11=6*Xrhm6${M5jJe$q`4GwUlIkmw%TFKkAbQ1J z8W`Ia7&{Az*^N3Pu3LJf-ELaex7p1-hh*jqpbKsft-(qs`k1`8N?s1C8+ z>mk8h(Q~h5&70^9O-KAFd17QzyN$0u8`egvBDh`GCt%MnihYTR>Qls)u>@LWQ-5aI zrBfk2@xkW1te0txkaLCz)hU*+oUUCXsXW>8W^@^bN`3XQ9OK-Tzq_xFSCTP6*08~* zh0gHv`}-q2A56U_d`#snKa4sNFyVT#CO>fEPF-R2Aqx_UvKq))jMm#Qz5EBsv?K1a zKTGietHmze%d4n@k_*N!ktVE*5Bi;jSBoosDc?IC;^8Vpa+c8UX+hDWE`Q&g!6Rnt zewGS5u>bRoUGMw6Qr8qQNbTtH^?MI)vnxu`lO1*FYH4V1Tmq{v9Mmg_``#OG@_ipE z5E-fwa=gvr)Tc|S9dF!RN#ozVMBR>g_u|;?V11aq&np)^xh3npAydA6F*=|VU&`5( z_wi!S=zjI1*L^StgKdr>OS6|RnA#%L?lIfcK%Ec$}{0*-J+JU}2x2SQAu+f%b8&!b#h|6Btk2k2E zI<_tCB^vUgVh#J!-ULSz;~avbC;)QePHVJWhTF&97#7F9 z`oWXvjchMF&+spdX=qqBVwui?N8PL&!nd+H_|>)m&yuX-VRdO zm=b4Os#{Vy$F1VJQd+~Qe6yy6iU?M)dperG%S$STn5k&9H_rJDgxg7|%~a^I72Bje zn0#NxhG%M6+*%5?N$2g#Ku0W$bf_XXkVT4$=-Hfhox5-V7c{+ApR=N|#v zr5sX`vu>vg={eb?yg&F+qfDZn9hos4NLEc4Wn*Sxec2-rRnxiFL@$UStf7fk2q_AF z8-~@S;#r`xenZh%iMNif28HtD(kRGGZ)^1_%1$W!zPQq@ycR>Jmozdj39ac85A(Gx*%IBWnjGKsS!`v11w$pB5`l@jkkr+P$@xgIm}%9!H5Jxh$xbu4 z7j^7k|0-335o!5sR)xu)IzY|}shIZ8D=pQc%r|*QB|ESe!D0l=)bVzlglj2Ai5gcP zduqF6e0jd#xzX353loIpHm9jPD&{NTTXlV`OqE1ooJfNji$w+{!g5Ta$??er`hRHC zh+yiDb3;Cv^m@RA6&}Y)$%)I4pR*R{&_rPa8BT-L;bAP>pTPx;>N>_>6@>*%6n2TV z?>AKuHT2Wa28liEry7j~s`aDz85EYDp|ntWtK&e6!=;pKFnyl`AG2TzJhqp&$wfuy zDSIm170TgHAF>z(W&!^Nza$fC+cThSs?J*Svn#~72FD8R6N{s!jMV)NL2sDPD2K`b z04&#%Q>+bi;d5|$sC4K0%(Y?Gw^1ovE}G4zeT&RBmG!Y8BV-Sot?i={Dja+nA`_x= z`Eo+QPAp>cuVCRy#5ceX*F?gAL-9rZC^_Mo z43O+tw^qA)t@r8}gLwBM8)40N_A1k+L|N42*#`JVRl4u8yu6$qm}(LZlknsNk|{ij zlb6m7Osk{yvPlDlbK<^@*0hy1F)7?$SS4Xi3!n6f^EJczmUN9O3m=hyHL+k{n0xYI zB7Y^~tg*8Hz8f^KfWc(C;iD$tW}TH8N*v+@i%1=0U#gYx?4PM7ZH9!jv@p|pi`@@z zU#)tl_lIX^E&SJvMA@%;!3rm(G>%FAO~>J@()UUA_4{o<1!_OH*W_9Eh`2#^WP|=C zn3chEo2}=ftZH4i+FsNknly03=)PxIQ&bB}?hq^@`|H#a0tY^uoBA6r!u#A>N?aZSX}6B0LxC}QY= zd0a8F-3Ry!Sk5=9EDRhdJ3$0;1*@e~1Er@QNWH&%;$(kO66!6VBih()icn;An{@Mg zqx!dw1Z~XLC}gsuk#lzy1ZZAqkx?S$na-OAW`v;vk`b+McFz+2Nn1C~HoUa9KY~HLm~q$15%%%-+lIe_*FR{&KZNbzJA5Q0!nY{$}={Z0Zf<-DjcS_pdekSh43OVvdgm9CpOI((in~f9PBFZo&MwP`0s0e z)%E<}5RfIXb+BmrgWJ%SwzWQ-U&a~d;nugh9z0cM@wGw9Tz8>`u(L#}mhE{8p!+xd zQt-0(6LLj=3?P8A%ZCm=o)$33wdyQu!)r`o1=!LVz~bu9w|~zRkdi?|WIKrY8Z z**O`xw9lCpdC!Ca4vrU({qu$VyD8^)jFqXd;CG*rjy@XNc63XI8W}TPGN;Fck36MMQPsqGkOja`Y%$&U_Hv{m2;q{~NV z<=n8nF*ooQ^Rd}|;eDLR<n+s^)u!@ZR34Jk~{zyD!!qOYV(Ev?zNkL@o2*kcU|2`s`ve8DyLQ_!0w5)nDjcY0|yECHM zAra74XJz@7yEXIB+Z)en&>nB|Gm*E?dpO{*<)>n)9Lm+X?#AQ2xz1(U?mnvhvv^Hs zZ&t5b3_JR+Cor3ds@y}70m-o0H37UW+ST{ti`{)<50arDtVz8r@{7k1vRs@0Om)C& zrZ?o_6ro2DPNBOgZ-2(ckto`icQy=kcbi*+`zFW*exw)w9GCv(-k*hfC0fetq3Tih zudf#I0qpCi>(@o^|Lnv(`Tt!TXqd0yBr)cv{u1*Pas%y+^UpD0=V=@#ziloYDn)1d zP1l!r*(m!Q92-u_bwgjWD{mh1FWwITS|5lyt*&z)u9A;S z3`+&#NkK>{dXce{+K@!xtLr%(l}QHs1rcP0JIZO6Q=vK7Xw$f}FNi{2>4I zc6v4mAHHaRp6TSzVV*7{* z00+sTt3O)rnzk;Q%wu&q3lI#z0-SN@=6JW)@}gw})>3RVk*IINZ>nU9;cG_og0b($ z!0t}-@u09g>Utg;DpBP`E(ax5gtT>fLC<@Y+#s&ESsMmbDE0)&wpGqXOZ*2aw!ZxR zJO3B>z7TQR@>f}_V!)bnXyEM8-9|rd|5|(cGU3tZD@`)4ztrye zdH|62`dWMKpHBN$gTBz0a0hX$>GzlM-`?>i;xO@*Y!pzH_hl(=L;t% z*pZutrwd|c$u1*4={`LqyVg*R;DOMZGd*iw!M9URsO0*ED56I5I@GUgnyzLnaGPhF z3JT(#>l3|hr9GhMq79AwHD-&+ibtJV!^#gI`@pjc-1dz1U>Uzmt%k((5&hX{LW*!Y zu{a(uQn46hSb|bs-4044i@PRD3^-@~Fq5Bfsi3B92KVO8t|w?Vo?;zZ)O_NlJ!T#eym;6PeWZXSL+P zVR)L_l`{`L_L#3zjGh={`B2>aIL`KIkkmtBx26hc%aE|4V%rIMX06+2ol29$?Y3gW z=CvWtWo(r+*{Bua{>R=^eEPMnEe<~_vdHa7r@SL_U5=;`s&8~phNggQ>@gWV3k)Hq z4y%aQS>9xSgNA?G&I%KCqm)qr6 zY-&ip-(*gq$i70cGV^)3)B*AF38Jfa^64kQnSA38{M?D!f(VE!NC$lT7Uyb1vBEzvL?p{6XKgag&5stjiD3Bsu8N+q>@RmJ z(l1`On4Iv*dou3pc2Q?S2kk=z&S3uq|94qKbA+hwZW#0X^ zYR{i|q9nVAw5FLfZgXL`KbAgpc5`gK2M%8ufH&OUZCPLI+TOWUBnY9^_@h1HM)?Ct zXHTibTg)MkkK?tH_fZ;($PHa^PAYx{z3KdiX-zJJ`}Dl)-Xh#illT}dXe*ou%>R1@Uv7e z@@J_D#m8S*$i5>x-|1wckMxA-VvqF>@@-UgRC>7X6Nw$Kg!cK|5UP;>)Mca;is%i*PQ4O{fFw0~Q z?K!P+Am*{n_<4?A-Tc*aU_0{*XLj3}Q0e)+cZCq^QHM`TU5R5WW+meStT^83^O32r z9Vxr2d7quMhsUAD)=PC2Z!T5cSFc?ZG>jGr6jt^fDEfZ}4jB2vUfN^n2%RJEZToF6 z>h5kEK?Q9k+_$99*t>n@>bXx8w9W5OOwP|dF$BwXNe1PHu`zOaRH031=R`l(bvL@H z#v$L;h+c+fXY?))`9qb~E3V%V*X|XbLY|)|n17C}Z#iAVb4L2jL+4xbkAgi< z+&H>5udq6BB-{1;Mct8{Ft=_KoAG{H`Nf@LcdXi3n~Kb0-d0_^)$M6JQ=Z!PoZsk8 zy?BsDw}k>Un`Q+<^Ji=7fS+alA}G=fwPGzjY}DP2dK!Pyi*TV<&kcD(6~(tlee%r> zcf{B(Hn5}1cd!J&%@+wGSe#e4XF!R7?N1Mh;I~y#pJ1YrV57h#mCV&{7M~u4*}G4; zv%(YoEQL#eaO}!P>0v&)5n+R{zv^@0rylva|Ha;WfHjft{iC?Lx@*A&3?fZU03{Tc z5)cp@2`v-@83G9brAmOHG?ijqlmrqC7&@qQ5&|TU1cG1#r1#Ll21vJ2RCM=_d*1Vw zv+LRS-uL}K_dd@(^E?bQzxmBf@|(%8eLscz1E>e={4sMPlCh7L#A0W6w1O0v4)k&W zO(XqkVuj_;pM4eTPbVkFP=0Y#+pFh(B2IzXiNwMCYTc+}|Mx@kBZUOc@|{hcl?5BI z7azXeXvu>bT4X^<6QTa$y;Ep50CAY%8^Vd8N7{)ua}nl0sxb$6XlAk9+O%hO8h z2nIodG^e^lEwNNF)@H!@@!NPunJ4OUEwhb1ex}HBT9oo{qNVVE$42#5Nz4O9!lz@{rN@Mrg}>;2W6q#93>1BwJf&Z^AO% zC=rO6*_P8z*1skX54$LTc&8&jqO(&^H-8~a zAa=Jhlp|2F-KV+*>T>;h+w+{*BjJr@5nQ(#CPupTe)+a4}VUvu#j!ZI0$!c^4DiBGbHgSH&EB!zb#XloY2?qcyuvIjptmL{(TZ$Eh^Ed zh(+Pe#%3f~{@HW+J#CZZ=pE0{jEKTrWA(EhdZLW&tZaQ$6vk-5f-HiT_Bt2!96FvI z;~R2%GW6CK7kTpm7b>-{LNtO22^y*@8m*{_?O0Sx%R7H7$;ry5;hL%zQD$(`ZNL-= zIUvc}%=$#(;t!I-4kXiS+xn4W|J@PiOoCZM4lCFyh3s=@)e}TRwnsKKkO~U#7Uo+! z>vmf>s#UwrPfuc7#5khi0TvYnBYdOJi zeqiK*ZB(ikVylBSRnRQMo-ltL>!6cBD;Y_H5*A1+)xeS2jBWf_jwi;o6pPkK9&jf= z_=n;G%kIAu0zwgOZBfAwZB{L|s926qi>pTkD8T0F3<>Vm99dTW#0+O@iVa-`eXVBW zL&;d&@ktAfh^AON%Dk-RRJQYOD|c0F=$M*eslTB%&(K8*5DFU13;jBFTj*2l9b?<| zUXgq(vzVZAF@Bn6y8?`}@8$M@61Wps3xWrWC>8xAu_b+_uEs@6BLh7+s7PJRF*0~X z2r>=HsSG~wS_@>;`z;wP&cedKOdo5PRQ(=}k6p83Tgfgs@g4aXoJYaf%$YVPTDO%N zzuhaKA6{o@$R0-*^sU^zTDUdZ>?F;tpIgautaXeYrJ)OB>}t*wXW8oQR#4E(5%cG8 zppU7;nqn4qFr#$S*|Ss?i*a0mZKm=GS1*KUnd+Si6o1?Nh_*vks>|It)F5${knXA0`OK7 zr7<2&(B2xA(pu6Okeadvlf&=7M*+A4RPbLCc+razh(>%Jj<%R;j$l|xDWH2#HJk0RyCpS zE8cxm-ta(O>(dcW*qe_|2$E3>zP@O@j%p-3BAj1uj6-R_LUnU7-jOTV<@(jvb<*aK}?u=na|o?s&N$hOL2#_ z57vfCOXIPbu_;Y`q>5m7`ZBPxF1>K)Rk$%_aL8>M1L+p+c`>&fnd;a$+Xa;^lA>L zr)imLq@;K{mRg34R4zl$qYGZQRQ@CLonRh_+L-#kV&mC^{lH!ErC{wIqghqh#v zdO%r5bkfi{I8l0r8(#1@7cc{yhi};3w17SDqc^!mu8QF8c~0Nmo)=jLnR*W&ILU~&+213Wpc9(tQ3U&1r%!SR-rjqgHV&*8V*+8 zA89IjVF_id%vr0M>&mY3Z91=FFbm)(p$3aZoVaCs9!&(8W;`qcOMQ9Jh1Xk zHf8O?x~s0n)YAyv?%u2ookZgY_^W$|prHR)&|bewLXboC^<&}P7bd>{ zU2?@v3%uzMPpTtkV>5sHIyB4u#R#O9>eQwX?ux%WwU1nKHYL||*}FXbP+QaSX8oP2 zFkP{hbRYS`fWig0~e> z2AByP2@GN0$;H>R@z!B1`?X10^=GH*VTsVG$NSZo@7hsll?0?k?OO!UPsr~d3C{_Z z>B6)-w4@cQPZas)YUGk?>n8afLw`Px6E-}PkJBX6;w>~B^?()u;Q%T8R`|Lr4*62R zZW-p0UWNlmeD79I^*Sqz5W*&$gA1e$7sdeYYMQLn{~RBAOCv9`ZIX#2G?oXOCy zc9QGCEdv2!07;}Y?6~$jQdhDzFkpv`CrfdnV?N$r?o~C|Xu|MRHWza7Wx2$988|c= zdut(VipGfq8QF9I38McN+>Uy0XoW#3@2ppN2GHt`;30WREfD!r-f+rMiH08N3~{&N zTb{q}P_)AE>T23iiBs%i@a=iucSOZzTmUTapwK{|u656@D+9SD*SRXrij(4Mxup=r z1`-?7kHw-!C#J&xbjPkXei(vs6}eL&bo21!L9z^5N!141 zb!-DuiVYI$8Iakc;xNIN*}|}VDWdUK-9#$F((g_{0?EKdK^oz;Qj;+5YmE;@A+M^S zJdj24wk7DHx&?N{u#ZIOk&x$E3b_{-bEiKpr*q7LefSml{#t=+%lu(l*OM*9>iu$0 zOFU%_CjCpGW%_lfD8o6}q-NP&|ah+OqH4^{=iv7oML42E%!WhbC zUAf_#Le0}OWK%Lf>7seb$nRgd2y%Z%7cM!N278AHckP6 z3Fhw|ep%J%LM}M^_fPTf|8F!lL*iialb#g_*OV3kR&<5{f3LYNM*R-SoU*}^QSH{M zV_ZrYbG*9XMheq7lO9oB+;929*)wwdLzcXT7Y>05>iANaBk>TTs&5m+aD3EwTu9+~ zK+Of%**Al%jDyAWD1+-c*$3hKi}SA@Ic``#fT)|m@|4Oqxmg>#cqSXE-;D|$aURft z?Dj&U3&|4`KA!kSL_Da>1BSj_qz?WW8up*X#{d1h{lmszt0kA!H42{Yyjioxd3#~q z$+-KXf9?Da%K%wL{L=s7UTpC1*V$e4N13OGRjVCV|jPRr)SBlWYCqy_Q(I zC1tJKS}%3~#r#dbDqJ#)DP%MieWC#DTFt)uDti2){#=YEg)1TETC&fQM$PUt*sUC` zFQ8iaIBBS&EZ7VwcBBz(!M4PaLv$Yg6m`6~IE8Q>$r_*IClWy#s3^K|>Ia0TL$S20 ztq&(#(P1B+npI(x)-6wM}vIlBdmZvTLS}Tp=V}uapNq1d`oQTr604F9jciwL_mKz5t&V8 zI~uz~-9|tQ4Rq;PP5F9zuPu&h38I`rw>Uso*E-@!QyL-|t`;irM&s93;98407JUtu z4T|}CM(+U)wM6S1+!BgPa1eUJwy6{;g1)w$sglqaVvVXoh-&H<-OG!i0XCSG$Y9k$ zzAWfAUd<7Dj06X?+|2h{t}q}?W2%TIgXsen&;xG+%CH1h;rAk<)2hLnP1oXl%DU2T z+&9Tjj`6A_JF#kTkpWMI6~T+f_QiK+ezL$&tYjhGj5pTI1b?q26UJ%^VzekNKzH7oy<|2bL2{_|Bf7SSmUow`HO;D7l=@h7zZ@>B z?O8O>5v>l_MA|u(<(gq!tN>H?e&*(5+QL1?yTgfoO_lKGM_1T{l6E9{-a<}$}on)`gJbK4K?=r?}5GH_uoYf z7-F!uf2C6?A@Q9O6gngYfZ{U^ize^Z z@6nmtS@pWf|Lbb&FYoXDy4s_=UYQ$7|9t)H>T=W8h_AW-%PA_9NVrB&{npF> ze)E5}aZt5E`q_~aj{jyx|99xp=F1!JZ?n^(S~+SfnSQUT;@G@iHsV~zM+n`?DBLu* zuWbOTHa4JXPP?qUgX^cFBQke-4%m^1d#8iVZV%nY&)0osMVto$&L{7(B5a1E9A(rz zwAYNJ9G5i*OmZu?o9t*T{|skuFDNSx(8IMC6_EHi=QZ+R1}O5Bg0-Ff#pB?wyRJ98 zC zzJh`%&r&QYoWsERdh7?0yWd{^-;UsZ^OODMNZ;rn@xiHtZuba~>-YPJ-_~ZnpfLGD ziso5_+vKy@6o=gX`uDc)p1wKI8jA)FypgWaEQthIHM)RvM02rLcRvAFs5r#I28Xj*m$x|X#l)cO!5 z4RIM0QZ&b{4wyg>MGT;|9}h`vMbNUAc!EUph7%mugpd&E0q?H2es67#*O_A)ENAgm zqgmQk3g=(i&$};c)Erd%b+f{{uK`=?-$YrNbyUT~r>M=~k=G0WVJKM3S@=w)6*|{FEOGn6-?nFGCs9jZUr!`!`9aA=UMY=3080xsV9wlG!gC8|BxHeHF|@?oLSqazDx@?`&hih4`5ezQ{j0U=`x;=>l+^%)aSWwtAtXJa zskA*3`jkwFein$V>aNWFiBn&`)xk-SmKp`v7Min6@T}%^>fHFqnpTald||-P6nz$6 zG~>6-aJ0K=tWwB)ofPg1>(&(vjMgj+g|1%-`&YR2zpcJ93#zY#y8_;c=R6!*U95*d zp~FX$zkUaWFJnB-wFG~|fTpU3eNR@u<4}NbAtp4ty?Sx02dFde?d+Nj;dilEM>!GI z91j>dwniy=X65px`X%iEcT4!40?rdZKOKB33D&SD!BQ>Sl?*!MdCPM-SGt=MTb`(< z$MFY5pB!E~*J)gSkqRou>IXl6)BBufu{FUn!mT>aVPceyoYj#XF`kKL-RQr(+h}Gf z#P8xhSwy_J$Ma0TPO6Vm?`^y0Q|5eUPE08>tt>pMBiMM%s|HhZ=+e+d)z}wu?dxZ` z5u0$D(xn>6`EZaL?$cUm78Ph6=9Qr-Mj`<_LBrvD5+CgsZYX>2Sl&_I*Nk@GsQ4*W zC23d6cK_^ZhA8zVX()=>Z*Eqou2iOtAkbo z&ZgdOdreVMwZ1U*GS&B&B%4aH%}j+br{PyU4|eZ-tTQiby0bw?PG@G8Ks==BeW1t6 zy=xCH$9!fgG$C|XN^fu=*~^n$95!PHY}CqGye(I+N>+&R(?20#DUx!WbFR$C3?=6S z^vDn^aiox_Dd61>lZax~K$x_mK(abupF5W)Sy;jeM2{2|PPd2pm7?wigjP$rQnQnn z+CvoJ-t2sDZBVCH_nEF|*D)*C7Gcvz59inV0a*YMCiO81A;yqnYmvhKqw@5tBI_u7 z>ofVqtfGR)Z#U{@i5=@M$UW&bgYw;$aYj;|!TDlbV9igxKWo}U*u8;7Cyg7u9&HWY zUX>v)c|4pWER#m7+@g%ubWu*QfS2WGknXPhw5fS1OnmF+X><5z+>T;a{o5b?;2EY~ z36!^*2uTu291P`qdS}Mc2Zewrn+$QcA{@Tn>KHE;`yEQn!0pHhBTNM9i>fQQU2yg( zbJ0Q|Lx>z-U_}?Ldt0(a#;g62J38-RjMJ@}U7_|l(f*@ZJM(H)EF4*rVu4~yqDD|? zU{4!%UbvpzA5J6wNoWI z`JoAvvP2|k_B#+cx;#o5o?N4U*sYlx=5`?Nc_nZ#TcyQM$Ca2U*j!jY1Eb?$yV6*6 zB)Qcai{&SIcj`!I`<^cOu&C#dlDE z9IYVN$LcRAspPmsX-wxytvkPo&+BXH~dZFjPf%Cb*oc;m6l>?Q$n$~ z!-@NO+%|&h{G=_F%4wN{ho|{8=pH@;XZmKc-3ytFc;fah5d%y2j$ln{C}qCIgkWVsE`iW3a4c8c;Mi!7IgL z+a_@aYmWTr%K=CGx%Yh7TWGE`#d%RuDoIb2G6`a!=rXN40VTes%&SnlaV`ALysK}_a>-)saaje`_B1y)%D`gKL%>QKE+L2 zs*m0{-0F3({{X1&VBdY31=pPto6qQu5AfUu5T9uKlG7Q!#gDtwW@Jlc^HxEI+rl{< ztJdoUHW1&ivdv>{8_x2qUk0|aaz4`C9(@`e-9(lND|#&DK}999p&BD$zHi2bLEjJgzX8^FZ{*5q zP@B6lv%W7W$+iwxvtV%vS(v&05pJA#NLbm@=J*pseGjd&*iqG{@0}$l9N9#lg9Tlz zAG&nEa$Br?r*(Fr^kWaUWilzi+|uT`237<#?1_C&GG9cPD80$xKv#jDXp8`y8 zVd-Hok}_MmnuY>{5B0&}PXkv7!B0;HTo&u>nhWVONb9St;MJuYDK}+`8iFlqF-@!# zLg09xpna;Rt*J3r4Cx;RLBZ~4{y35QEib~aCGcmEiMio3P6A{+?!ghqgCO z$&uvZ(C6h%oJdG;fluj(qR*vwze(ukZu8lVc3wHml5GNI^wXGu%w}IG=-J2%GH$+l zLe*rixTVC4q5=3aTnC^o5T*1PuOTmj(&x@!-KX@9e7uyZwDVbN=u20lQ{5x*X_^u+aycQ z6IH@6eJ~XlPqalguDWCv>|8oES9o_zzD>~kO(NxE{MWl}JnGr@o5bX=p1&tux%oS? z((d=`$VRSc1Pg_ycV$f9wfK=MX?aIttG&ng^o2`R(+4h6Z@bK7jLk)k{3f9_4vq&d zSpDLl>Nu;gWdtU6ov>1l$H57@ypKWT5!d)58*&~`c+Ttzacv|GrGu2_@jj9f0M1l` z_TKaB3ii?j;&JCcdnjNUD8xbKCF4oSzSo`D$|Ee|&IqDGc0dFoM)$|P*5^b<5LVI0 ziD=ND7+wvqG98|jOT5p0c;>@2OI^YKJjs;oTitQ773`k{wN;%-mm~SjLJL97ikLl= zCbrmvjCOl^@%=rCcUid~JlV-*x!zgsCBZ!KS9A_S(qcwW2hVTX8s;I^g8Mt!k_ygw z;Z~U`t(O8zBQ9@OW}ClBFZM}{u<1x^hIOk%K&y|4y$J3;U#6_ykaqbyak{Ga1?Og# zfGQd+G7cfzvDUTJd}eo%`mbd>AKeBG%KlA3G3Mxc_v?jn4JySclG#@i6V)fK#F?7B zilRQzP^?j|C;9j@WXN;LF!Kl7H#=7*%8kJ^&aes*+BcVs_IA#9a>Cs&0;Y%Hf)9e9n1&^b$Un2TWXJjqj{|OC-KptVjucxV&q{% zSh@gYORnVH*>z0JsaG%Z&ZV$lqg6`?N+5kMxEuhF=CBa+pqlb(r_Sn0gFVEpls0KQc4N} z08$bQ*Y3u6ES+cd8PMKo%!p~s#77@)%U9DFMVts|&Sa!h|4^hB6C(Kmyxw0ff1E~5 z8u`UROYhkwt3*Si(qC0=%0d9yX-+T*kG#0~N|mzmO)J^r*+k1Eqd7hC$8IU9rnM;) z4?lgMm3_?`Dzb`kfcCHqT>DxkX`fzA&1v;7){at(Qcxl-`lH_CdCNNy0Ue1$ zlc9;VozaN{9jwx}3{ByX7r!L(sAT*>KoR2=V2AA&c!x}cjK0b*VNC)6KPh5G5&a7W zEsy9n5-{E)-nLAEdONIYOjA*DWNAG?>CL7jM^MuM4M{@5x!rm8B&=oZO2Ir>m1~d9 zg{@>!OW<^t%Ts+akgbI*N;Kj`8oWjl;0wf>FNNpVy%IlLLWD`CpU*6fPBa(b_=$w@ z@SI%t$0czUJ}>qAcJ%6UcoyNHi%4^tqp^2u;F`f1lcSRIef}8EU~ID4w{Z5;FG4{M z%IqELP(G!NR5}5mYzs4POfRdNerKjH|D-Of@*O+-6;uGS(#wDYf@aT?66f75ejeq) zinA9yb3?@MYFj3~-?3Pn6`~FI*)2@o=|M$Sv#eK0USwvO6B}p&W2n55z|NC99hDC( z!Z%ol2AX7a4>ELIV8hiiApj<#d7hBXmJ^E7j{TuU`MJ}6$Lp9Lq2Aq#+_*3_XbCgH z@{tJJb;E&MIXzf%>z%Q)s8t-oXkyQi(-wZtBy(zYoUk(GfV z*HUkkOUxX*?r?Na`XCb_ZR`ZEZK)omQYQgIHK17Y`d;H_`IxTWMnH~!V5ZMK6%UJ*DIk`Sh`Mz3)W(ojI z)%+Q&1X%}CJU8F$L~ThCA9?PuYx*uq;yaaZ|789uxcTifzkTFe_I2wUx_7U^FMT-< zdP<0`BQ35S{$7t%n6a(F|FnWhzZEP7771ys#i)34E{@>W+Rc5eOY|fj-z^U4ONrcqQky_eRJ&+kFjk!?pYHZDdh`wO^j##~UaY z6)RnseECG71&k#1&c{N7@pKkMJP6P|hs@*)8qaFN(+l_&m|A@bgjXHXt3zwIy(pOm zqKm_c8B*Hd5SeqDkk=3zO!~y4OvK41<5O|?6}I}gfFf5U^nKGE#~T4~7kgiwhnVla zaatf{p{9egh*48LB-htWu};X3bh34IuqHycskX^c|bFWq`}-XYe-^2a~+-rNJMpR$ti7o8=!q-=M(rO?dSbdQK@cwRnB%o zn~H`KE#GN~YRIv%!eMH%siKBlBm0O)WmT;tDf6NYq@uA}Ph_=>YiAm=N=FE!dEu$r z%ZJr}d4X?(NvEe+6=!|tXjbICk$pSEqi%F^vVDa5u#s!9WKn7_i)+ohqHWZ zeGgILk!X>i0ngfU+O=Q1U`K?>2OZ;XmZg{+nZwGdJ@Kh){S-FUPKoB{C3OO%P7QjT zTy!ohtoOE3sWqDyErp-U4bKT^a!>B*C7?Y$z{6T48SqRw z^mC)wI)z9r^Y4}ip^5acx?d$e9=>JFV`bRAHGff+f2hiBw-Rv&b~({PQ8!<=Im{oB znr2bLMGHeUq}0&I^4DDQ9Xtld!WAgJ-3B(w$?5zzn(_Fk;YM>YGR+BKutUSKG*hLy z<(KYHmI4P~PSVTd8(@!pNV)-smC#V;?O9R{?yD;j!PEdg{2;2=>Z~j9p{>g{9&;+u zfXWSF99pDc>-?O9*m zVm*j)fTyPENu3*NqTVj{sUB0hb78OmapO7Q9F2%ZpGvO_MCk!6(UXzz`k_a2AZa8B z3zK^Crp>^*X^s>Ylvfz&I>Qd0pmc=b7brr1#bn!>t?a(vztrrD^Dzdyta|+O#m7qM znnS>tZ>?M(4_Z24B=h=f7)g?Yh(-Y3-kQ==*^G9tg_dH5YhQ36mN$>A0)s zc1pPs>1BvdG2Xx!(GjPs!Ek1c3}NsSghed&gvm1riHF;;A=tj7jco~6@Cmp_D|~W_ zO(_<6P6+3ucnsM*TX)sEYM1e&8J9B4exifccnM12MGC~$wU4yqWihc_EHV+1$W`u3 zHZ)&Cp+Si>u)c>w@BAL6S|_&tGJd*Zlp+1~%vQcUN}Z=bHyDfd1|oYuHJp zOXq*@Agz1E+M{?i2O>g<&-PD!_(SR1`lyT=RN`Rg#Add+R^o^&yB7O#{Hg~->^L1VT^T1;A4(4+z0l|N*V$Bl5^5w{ zLV_D9pAYf8QNe7SUd3`orxYym(NJfRhcfQ>lHf4mq{waH&~+!>3e;Ka{W=sKc|r4a-v+<4 z76T7fwLE2v4bXxgOVg57P$Z}@g1nXrn#+M8t&>0I50baJxXxOiFQ2_}xK!llZoi|) zvgL+KM<>`#ZphGu@xn4G<#W9+LMnc+Qh74nYhKWBipnaurkq@R`i0okbpSBpM4g^- z*ipOK$LM#;$**ga=(_I{jIoNJ@puj-^>-~5Ny}4wLWf4Who+n6*dq^H*cajc=j#%4 zE_M}5UoEhlm64-UBQ9{$!q}jE{1U;?Mav!J)aw>pP3Dl z;ku(_OO2VtyTdD7>0CD4ZF(#oTi3vYyPujml^VVI6z#E}&gMoZL$s>5jla7}#qoxs zBIo|j;1beGU`H~}9U%_C4fbd0ERm~jjnpFz9h>9Z6!M>VUS$dJ&9eCOyOGWKCs>UN zZk$Pans@*SdJaO9htvGkUC_UH9*iH{P_?vUiQiTd`BW3FH1(BsnCBDKl+ebC3$+N7 ze(E9-Rc3Y8dMiYPvZua)&9@DjZ9GT;Jt74}X_krw4CkNC0%6&$VP=ICkMl(3 z@2{My{B(34<3;z|DV1d9lXulc3Qs3t&C3|CQI{OFij!AGIqvfk+v(FZB&4c?;wjf2 zZF4>wmdlAEM~89+1>qBIG@4?3@KA_`l$H=tR{3g6L-DJ}m8bMOmD!KqG>4Mu1@b8# zx|n=hM@Cr7$MhBUI8Dq#5QQemt^S3BM|W#IP=C8^Z~d8J*C6S}QwggE{5EQVwUtVE zZ95$|(K2xniNX%15R17|rcwW`4n7P`aWX;aCl+q%kvBT&BPT}X^{AgUdU4y(32=dt z8bW~@hvxA7^bC7ntI5*t;dyf0wt6nA@S+kL(67KAzPq%5&-X@lzY=jBR6|O}SsGH9 zLh;ev(hYM(CzH@DeMbdO@pa9Oh8E5(L-6IG0jp@&4xCX-rk+-cPy3T%45jsZ^Pj(b z->AVoKlBS))lp=|<|FWpd8Ec_S6ULZgDr!RVRaNtxaWHgy2_1j$6Xg2n;&y%CydGG z7|9HUVn2hSq&@8VnZ0)#v+m-L5hz`T7ISK>+pD+u6nhi=m|3EQQL7>~PHUK&P1Q=Bx;c7rF_?>>!Xe9KydmpJ{S#{H#KcW(tLLUxRl#5DsAx1@e`V#&1qlmfH+@(3+;6 zLN!J?U|*WV$ykL3nOv5PD;J?qNH5x42_+c^*6*uMLlHvJnDj{7t-c+7Ee+QXvD!Z3 zbU77TW3`chWY>D-g2Rl`*3YihdhWbc?$ynk&#U0T-l*&sTYqN8x#a^)BM|V8N+p5> zf4orBp6p6zbeI=z%qhcFgbDY3mv+N}XIKFn%W4nF{HVAJ=aa{IEDj^`K;UP)XY1LH zX7-L6UQ9YJH+ZZpB*gGqNpYHKT;83t|1Xrmk1`kx`OEF``??SQNZzUIq4*(jd;ao;`R5rn>W{y^aPtN< zXH4Qd^5W|$ZSe1VMeUWfj;~ve7=V1o`fVLi z?aSiwsNIr{Fm`D}ksq72o8TyKT%gaCYnqA*^v4XeBzus@g^n009Ud)brhej0ez)ej z?rQF-9r`_RmkP%RgLxir{nKNM>iSINHE>!Nkf3I;%Tj1PzvKl+B(<8WrFW%+U>ydYHCV1M?Li4a*7*>#nl z8kdH_U?7kkF};U&sVkV=b`yur*)%C#?-Sg82a}qm#d!7`Nr7E2Qhv?R!H0d1x$-s^ z+pgEq!<(%%5b;T*fR&sDlwBVI4u`A1I96zEYN{IOsNo%Gs;b9!SGiT8vwQuyR{3fQ z$7iuZPp$tg`g+^;jW^I|@ROyM@Vwt7Jg?=omJ}qLJnpZIZ|m#V3Fc(BHQfupJLMU1 z7PXPy|Kea&y09DDi*jf?o{smXB(^oOGn=L8$d*@dld$e{LnpS?%U@S7sEoV%0wHIT zIXjDpaknR+^|zZhLlH`eNKYoazaq)IJAB@;H^chP`LnkkO|X*k{R!(cZ@tshWHwO; z$8-&y23T+x)&$Ttmf`SxaXr4*)lvHK(<_cAdoT?ciif)S4Czj2yJwhg6N~0Q$P&_I zdKMgAFW&BZ&g*#+Zye(pCtLIwKI=F5xk4qhG>yGQ51uRj=;=h9OH=F<4Q|g{Zv$GH zJ2YDy>prc{jXI{n@(Sj6`0Tb8liUa(=WR2XV zcl{oImY^L>1=Lv8(&ayW$^Rtr|5Oe0$6Nh}ucVEDGTz74`Zr_AKj!?ml>eknyp?!* zl+|8T)72tDznN8XX>X6h*d=Jm)us(g*H_(}LcgxqdwA=Ic5CI`My}aAL#EBFiScc|T1YJ>t;&4|D?w`OAl?_cW(RgWLu<$0)EK7 z$F&iwYUb(8^S1ColI|Y{!#GaO_piZw^1F>EyII2r3k$r1Uv6(G7L%t(Cs+fG%?8jR z&|MBa65%!yk&enuT{LyP?!gRQ!r;0}-Ut#?x51A|m0^k7VY^EkfcwzbHjk$SM8xP>(K;sBzIi{@&J^eg{Ngi@C zuin{>Me^W2!yqf))<Dw@} z3;?ZVqH$(8(_;1dInS_LbJFbeH7z|U4+ef^3<3y;LPf-jREhq|0rRxH&IdWgSLp@R z1SxA#Dm*QVr?Z!tY|etirxFvaqX5gu@F`~Nh_8| zXj18s07T25C_8<9T%ue3jncl{^khEs7G#jFJkWzu#U}XLoW*{vorGg&(eS{RxU6iCo*;`ip6?DMP;1@xaiR;?=A>->j$p@xULe)bio46;$2L@wtzRh@WcyRTcfK zp8lV;MKauk3E-xS#FKtTQ`sP;dMo&LuG=H=t>r&q_P&+nuhKVdsLFBOG;942<~@7X zg>K|rd-fq*M~N7&WoAn}@o6} zl%%!C{cyK{;n1F*y|DqdGtRXSg<82g*p09DU-JEtT@>zDm`BBx?KFyIe=JIkA5<!{kmvf>=Yf* zlUFP6Mz2u&&=VypSw-1Ym!&}jb&uhz56dcS&g{GR7Rw1n-Cz#^dUqIHPJ7mDIW+odg=?ZGh^d+BXP-7_;9q%?wt-;8<|{-a8MTI>gfI%jd4 zt-oPdTAG27>S}QEyuLBv>VQ`8F<{@CqLLcXTc10w%+K@jDd5I21EzdXFZtW`6nd%q z^}~fyk0-=+)Pi()vd4~|UQL^1AB5|aWqhz2&ImJ78dukHnY^b@#}<+2x>Ks?;pi(I zrUd>eV%X(Qgn^Y*(R?CIk>keC%+QV#dSqt~Bt zB0(+2p&bV;^_d?|*?vaZ%_QMe)fROkwNKL&PDK7N_!O3(q>%|~1VDfm8bNItvF z&YbYG+wQKUQ9OG)f+{@0Guo4Aq+sGaBWuWQx6ldJA@(DO$m(ZS9zN^$BX6_j@t0++ zGy$~vwBL+(I>3}maN@_4s{8#J00ttx)~OtQ|;X!s@>dY4eOt&gC2?U6at4et*+Sjt^wxTdK;Fy zlABr`G3I4UjT^okc~Y#OWcTwtgx;(KcyT>`I@QbD?3c|wY>WR*BA+hGRRMvEJ#H+m z6(#4&m8-WE8~1Zvlr~^19yDdPSY@%jZq`qP&eE_HNM|tgJ~Rv`dS-ayyj*h1$tp7R z6I@hG(6nxBTX96I=+CZsTY38f4Az)zXK(F zDTf@35(_JalqP4GlBNfTtBN5KLl2(~__^)6@uK`W|MtCIfPPyct@(Oii9IOMhGfE= zv|G#ad9Becu%1z<_0Y^NRi8RFG!$`qA2JO_ID%!h+7v%R1ebX~SiMp--H~dRhfP&- zwVqYZoROQwryEsRPBoTR1{=vGBhgbW69l;Gt=G?uiC15U-}amkTYprw5N)bUcYaZ1 z{t3Ocl%$JYsDTXF7FV2B{(xwcu|1st68mR zJW>MJ0SZd=Tzuxbn0v}4(_5ki6m)_-Y8RMKG*d)+ofyGFTRKjR^9s1BV?HF zuX53bTZ_R2*Wwq7D@f}WFaK%P{>M&=0GwGm8vLi3|EG!H9sTAN{?nZCH}m|(fq$F2 zx%Ha_F7CNKs8(F~>7M)Mi`S2CWMA_HT*sqy}8Dhwnb=Huv z059lSOJ#AWU3Dl)Kv$nhbFF&(mJ~)185+U)Z+W({0s;(hSQ$?dj2AFYPnjfOpQq*% zO?LoG8i%y<@*CmBgVWxYi?vWS#79Q=KJabDoX=5TlGs>#EVui~-Na|)xVwU!UAc@B zRw5ggkJA`UY>Iuw8E2n^2I=>o-U!pCd)$KTSZXgz`Y}VYpd{RgfNcn+nU}rsCgs@z z{s4wGiG~J_gK?Ll8SQm(;up(^52^t>LbRnn9dw-}2mnSYY6+0iq^1d2ZYz#1aYx?{ znB_^j?4OyeKXOh}s*?hE{3zesF|#`x)PgK3D)vIFE@qgje!8>XtiIA;;fdo8cKyip z9w++^J1XBe_8mSw+=wm-$$~b5@twg~8qa%NIMnZR4U5VH99r#KMhyz3zC6zw9P>7= zXHC_$+SEJeIn@eLK;Q~dJH?=7&tRlDYRK4hM+#(d$xv ziUyQrFfJ|>E4OyLeHhDG*RCh>q*ruAbg#y6jT9Kis_?gWyJpTcM^oEl`yIt%r)QN_ zk%cWKxK4Tdtl2&^qSOUnb6|w4nKF8Lw{}t2R&&EgD;AP_l1^3jg<-S}U2X^u**L++ zWm(n((8UmpLn}YT#Uyo#;#qv%&uRN*wH>M9Ml$a@fkU+9ti{3r_-O1C*l@8zz+pSOQ7`H3qUFGx3fvE(ehY7q0XWB6f8c6bX^lJ&i(%HPVor{JiH{Qh@%d_hZ8YkyG zVx9TmeA5B;_D5Lg*5CqxE&k|)%TA97g8T@yz!(1EgEGZ$M}$j^M`{CBFVxVkqI0b! z2Pp1%f+!6%NoO1j%yN4Aw1TsAW>e>z_Mhs1lL&uy{vvc%?bvnW0!ZSInXk}Wo<{{n zGh=DdPx(SDIs#oa|6KkEz50_0I{xB3{l>bBJoOpX$UIiasVL2RWDgaqWK?jD(ON(X zzi;e;yxsPku)c#AuRi$bS8>uVSnL&2vet{<>F6_F(H%bGae(}Ir1+6fip`sOqS8+D zf;+|eApq|11(hr9STw$$GB7fnJra3xd&V>TCew{7O{8amc1jRr?_@sNy zg}R~Z+X9mGh^0Jt^#Ss3+H;6|#k_{JkNhpUi+j6ICa2@7mw#x1Cvz7)(Ze5%cnDr=(CFC_iu8Hmw3a9*0q5cenv_)S^Da5^!x&k+;s)_|iUw z_PY~pd6S-=XK_$lezTpFIBPcbzzpW2q%R3BjLDwO3p(&z`K8~J4E~sXoZ66UY+oRi zCw=M|ue`Pfi{g!+B4Fd$`Q%ie>QZa}ZT5@5217uy;p`u1ZKM8=Rqr^oZTsKxH1>@E zf=ISs*Q13RURRzuFFqCpW>furZ?%WyIHTiIs6_Y@# zi#%@{m5zeJB}=G=$Z1RR2YuapT>gHn9mehxh4w+1xfyG(QG3V?y1cm_-|U9=XvUV( z-!??xNns^#1cjc{6il-ZKgcB(IKaD3D2_NzcDkA43NO=(U}e5OHu@UH=r*s-J9QB( z#LLLho5XBSQuEHd4R&rC>axlhhLW0wtFVsR$(jKL2m*tZ_vi|r50RI2S1TmAyE-+s zll*Zb2Fx6%$g+zEPeW|l)}-n(_!$ezF8Jp?QDcd86-4d(a@BIjc2|}9)FUa&ObOtr zT&4!n0tY>CXpDZ7(81tJO0m2Dg9Mm@NA<=82V6jdca(5Aw{ECDQ@dG_IS5%>yL|(k zQg=!!s6N>vKt2Vx)DHt9gOzHIh_!v@1{8+J0t-9fW}v1xmBVbHbb*FtH}r@*n?!l) za0&Mn5JkL%>tJ3gS9l83YpmLZ|PuJ$t1K_9KC!MMkZ4XVrKm*qf4{aJ+*4X#uw4$`7{N?Ln$C!zMEmV zp;4o}$dbxo4kY@$nn!w_+T zPm*~Va=Kg`s&;wV!FFMpB7deNA7pL%a4N1mNypO316$#p9MJy^`)+D*@dsD_GjKN5 z&rJ_fccCi{E*K5xfrUgRAKP{r|5ET@FjYC;!+RlFertiz!8go z6l_DeZ|%s^hv`#ne>1Jk(^;8&hRd(~<6t9P?L%%70qCn9Y1heU4ltuEqu7X^>_qv> zIR5zpJt-4+&n7}=gyTHUZ3uc5V?QnL2T`&uH^hLJEaT#RdZ;CgJ)bzP?u>&FYj z&3Ut};z23bFw5y4=!wZBqbzxlgULa{tNuz*lI7)SPXR?0*D2@$;IYa1NE+y>lf8~w zdrxL0K3ED*&Ram}&b-OXFAEa423*THxRHVq8cEpvRP!#$q$D7NGsKE<`3V_}4+vE0 zM1YABGt8Opz)RlWw&_SZB8m=%a$6u}_Q1byGc=Zp#kUZ6Kb~Gz2J+5$r{GGNGu9L5 zxQ^^?b!a$#*|5MZJ`q(_e14Eca-4n@=dX^K?j0Dc2uVg`A$Ywa3qjVMQ@pnXstzUa zRS|aH?O5wa%Zthw>)$c#be@bBZN1>mbX@D^7}cZWxoeL0_#uS~v1jUb<2OIVr%#R$ z;+Y-|$=(zk-b|^FI8D37^_oi|G~u0Hp+~`QmfAHf+DPWn}V(BgKD&u2N?2DR|`(@m1#F( z2(@@v&pzOeAJ%)Ac0u$Oe>G;xGoRLwW}5Uw)^jZJ2bx?rjS;OP>Bc0bkrynYF)~%j zOILB5V}ybe;mwgY2x;@!R3VDroy#aA6(gGhgh7yhd=E?^FFiGsO}x9{9P^aBby_z; zh&r+I{ZU3jdv9--%;KjR9sMt-@wVmviin9onM2{_#2y$s%<28833coB*~o!S(>P*Xr`J$!u*0d_+3!z$q3upke z@Wv)&6@Ng))<^N+$mO~&jV_^8~y>`|0&zMgt*MF7x-dL20bc~kJa&=x0s7s;% z2m|t1KXfH-jOqU>JO9{Q{42C3sHoc11Oxk>$Wi1n=;K%aOZ0{C$w7S*ySw?C_67w^ zK|30eqvAyJIn_Q=0@%?Mq&s{$BPVQDcX&Q?L3fwDS4orBTj!QG>UZnG0$YGFlTYHN zB@r{zY$$BP;ihpHKh>ctiHcm3Fjjkg_q}N5WNF{@F_7Ucn{%3!yFi~PV;VKcWFMJs zRGv4&PA*nTvL1KWP^}Q{*-Z4}?(1f!xT-+!t--VOF1QYSeyQuhd45k`)xij6_PmyS zzOcO*6^^ZwkK^%)EF)JGeK=xrR6AX~h|O0%_r$pBWveUPreTD6!Jt<{PVZKQ-v(h~ zOm%m{nb$**hh4Bv({A9yO6RfiMvrolia;{9AGM&hdiZ46z;TW(z?s}Fz&+L??Ng|~ zJkp?A+ba0W+@VudeINTwrL%YZ{Z~1+U0{Aju=i)`{#^AF1ikH*ep&J(TBOyNXpsP+ zcMF0;Y;Ny(0_Vk`{qt;o@0a@HUTngMAl2v&SUD2DOQg+U1g+h|hQuy)ie~V+40`Q8 zW(|c~HGoUqJ$Aty+tHALYC|96+5U-O{x?7#cF>AjJ$Xl!Y>%YeQSu*zB^~QZ!2uAF zE~JWL0$MSCqR&lsE>1acXvOK9VSg^u6s^hJxZ+a;k*<@t?%5gx1KXmk7$mr#jRejL z)xar*+qi~RN_hKex|=cN_*8XI_a`2vFUdINW6J`|x%x;|2`WxDL7mDd)W;kT2A0gm zsCT6HOk3{WRW-MWM>&9;9BRiCnMpl%qZO$bA9!zmxqdqhYb%~AR`a0h5H)OeF_LDu z$Ed@UTpcupu$7!HLlEhm4HfW!!--k^{#;dhp0OJfc6nWj!;QeSXp8-&i$^N*pZZ>! z64x($KG(2@o0Kn})FuqkRZJdW-ZUyMfwNgYZ8=qQt79o%<6dqlR~A(&=NL{>A$8!K z&UL|at%WFmNH<))kn?K%X@*}hxP{;T0jB@_c_X64m?0Bu(Z^}+>hH%l)a}=u?PPXu z(u4J?-o*j$MxJ_srN%6|g4t7mXBkNp+f=^E8Zvj4m%t;4a@kH+#~kk?gYG7-u#&XHU1w45wbC!*`E&6O-Ttv?#ToxNg(T!?cQSegKJ7>G zUg%IOSxjhuX@X@eJjL^ZU~2m z)%e4oY~<{FbC9zTMLE&*DhrHU+*j-Vju^{(TXbBQt zz|*cvKmIhu|5U4DrJyen0*szf%H_?kLMxks(hxcMl$*km8P>cl{PC42tS260M;TsXI!~=?s+jYXs_qF7oJ37BHS(4 zjSG7LP6rpj6e<$pcjOH|+LY?;AdyqDnQ2y_Kq~TF=j6z3r^H4Zd6)sw zBoz#8j4HsaQ0;f;6%_Hl#7Tj!%ZSO?%gF;YpH!}@5hun?{vgcEB^R4hMTSAhR z)6k_i%VV;r)#%I|N)9RgRTQCEK5b00cb#~;=;0@4wT7s?r0!wYXBYQfQ%ampEQTs1 zWS=ZJbb1&SmsgvG?TZ6-GWgJi&Fhx!D@uYe2S%chH$MZDyz=2jOc)$yP00^QG7J7e z5|P1MLyURI8z8k|p{~?m)F!1oa?O$uN7nKkYa(>OVAj4)f?hqX0qw6f#0YfTp&0X% zM$*UpxsZ!KBXA?>=?b4Id-cPjne8@(k@L)yUHFeuh3ML(%dN2bQOgdd#6U>vP8%B< z!on7)#z{`+ktWcHx&{VxkAOw`B@os52`Hsm?OBckd0M9>lk6Pp3A8`|Jb*kJAueNa)MZmp@AVn*COp;H`yogu3ASl-=y5c zSkfNMch_1a7opR>XMNWxR~1?p9mR!n?q|nRYpg8etm=IkBI9jp4UOa;s?oIV5ug4{ zF^JKTNEh>%Y~`IbN!L_@MsFc%8RS|>vt37Iszd>OF|m=MKL36%xz6pz2MUFpMM@&j z{nk3$3K%HHf!=IKm~C^#3B$j46R44AhT z)!lK6CG`^e{ouS*r-{E`lTWZB3zFc|UvaWR@3HKskqN)mPg>>v_{!d7-wSUepWa9j zM%@=M+utK)1re#E`E*IJiDE3qT{Z@cGxQ8{TL`b33%qAX9wrAYT6{KtT_f@>UDmFC zhz)t69O=Q}bCroTj&S)sU6VPc-|Ll(Z=-fMYflUYX~y&xU65rQ}?fM=opd z>lUx4Qq``gONt5Wih?AiQ%PX0g8i+Xa3@0BGTbcl8v^0lXeQleWV&pcWHe@8Pwl(V#CqzrQX`;|71!ay(2?QKj)Ej0C>1HG0pRcQ zZdl&-I{qLP)B8GOxrI#t&@RVz;M6v-q414V_J_ozo}0ZAD?14T;4e@8f6!AbAv&B9x&Cu2!#`ZN9pV!k zQ2y|ur2-pa==#qg75#m``)5vU=`YcY|Gw62Elpn%434O0RR{?lx!rXT9s>t=iK{T&u^w z^D*E%-Nn2jX895PCLzuQ`0a&II7jmDnU`IgGX61ze7W{H7TfE z5Dd<7^L{x*bZsS-HwA|$SX#&BG65+O(7qAIM|Om%RME4!18 z*9~5PFE%`ew`*qW?%Ao7elP8{q)VQGFN9aEIUU|G(io7v&b{9<%+tDtDAZT{NPf;S z=(gubd)Fzk5E}+(thV&q4ny;qq3G`DbGk$T2bTtMVcJ-WkFc7%R3|yIL3G6}gGszH z3_%*i0(lv(XUg(P7!I5a_1q{9TNV^tuGs>}MU=e@o6s8;oMY+h;)$9ve72cWNa(GQ zLp8&MesDrIQ}6{yy0sYt2X>XYFBKK9B|o-OcN~Iz`oUXM7uOtHkRE{;yx4x4uC1W$ z5P_NQD@3|8rlTvZ{a^S=e(P^0IiY64H#hJ$|4dK33uRPNoEei56Zd(}Iex9$4KFO8c2w`}M2 zZJYAwkuSMHC)0ij1!mjEKMF*6haxYE=YI)7x&3c`Vb6t)9api^w??=F3>NANfYcW( z%Ml8VAwcpUZ-kn+(mgZysm8TS1&&?Pt*}61iZk9b6hey4CcY@ieAPO6K8GAdjHH{^ ze+aR%AZS;zZ@&-&W;HJEX_$ld$j?oO?W+MR*LJk%PZkY5iR29mZ$8)^sZieGNPSfh zEP-VtT%8^ad)Pfb*UX)n`fV4R!N@~zML5XRWdD%O0`q?QdSJ-d5@403cOJ+)j(3i7 zwfopH{waS=N5P4Uk|I)sA=#P`V5`1F33u;xAHURfnMl9$0#%&_dvorWdp+%yJsQp; zS;?hJjG<4HM+0o2COpUZLN>DifQ#=X9oR=-gPAi&e{S4Q1UXSIQ)#c@&`Rj5jMB&2 z#AHh_c@%H8uaq{g+b1Xw>VSsyt!B=wsHU520fe50-}H8n&$?o{vm{aF+>!hmxvWl= ze8z`J;03=59-v|mX2xQS%w2%4AxSqJ7KgII?a;FiZt^GWM&)3#uSG+xitE7jg>bkB zyf9;AK-qy@d*lf1d`5S^igKNcSOwM1ETNCE=``^2mf1}-B#5-VuS7Tv< z9|?n}*f&#%M@ChvZvB6X09@pwsm|AJwpBD+tLN6d)Q=V*oyT{lcf7mu)KD#On)C1$ zAVR!8guiv5_-MwaNSI{r?sB$sShFTadV0=9@3ZFSsqvhcjT_%@0p^BR#a@fdOxHy( zSR02vs|s7W^f{u{LUf&jz5Wf>ebjlN)z=eqUp)MbOY`N6Yaj=s3Ut=DrE1Qn0|8R6 zR?mESHahX|yBdBYVz0!pP#80G#48a=y!6E|E>i*$m%-;;M?EFw*>%x-;>^NI%s}VW4~(z zQ{J#I-{-=N5wlDB?dVkq9zd?ZWOOyXPogV)dE5Yv+ zP~Coa+VP@4F2+9*oBYsf^2u=4y}RBfOap6cri@e!78gbCc+%cLj%Fx&zYDz47WGuy zv?C|at(B;hUH|5l;hTJS8^(t|dLQ;6t|p)G(O3Z*Szl)`Vi@4gh*Ka(2j`4(Fb^={ zB(F{fTz0Mj(mfB9OP5lRR$5!`dc?QO2@^7m&eh6*swV}HZJ`Vz(DO*|g zk^?M2TA-QwnRo7NLO(0)N!jy+Sj@+&>T7ff8HB{!u0DUKbX+cW`|kM9kZ}52QTW>$ zy89*Xb@(dh`v=mvK}J*y$f@2$-cBu{MPvPyzQh<~Hy<~H;XePTNBnjSzqH!8wpjdJ zn<43@Xnb-34)^W%?SsTm^i;o4vq(ukjzKJ!1~eW^60BX$rj)~A0`=+m-lXA@uM%#paiE%Jlh6X&?-itOR3?9!BvwnZE^R^E2Vf1F zR~?u1#R86jUYhVq`JQf1(a@q12f)XChFk0o^1|V5`jbIdfbq38c$6W6I0XddMJ1#A z0$qylk-dodt}1S}%7W^S4Y(&Y25;}zbnoVr(NIrxPgGQ!wRcWCQm#8f52-r|_G0lm zxS>+bIAils9opnV3;cT8duk;v_#9Ul_YGcCQ6~kOEiJ4!#}ECc4=5Tq8`9ZHFLGVt z **Preview:** The low-code MCP surface is part of the preview Low-Code System. Tool names, mutation metadata, and validation advice may change before general availability. +> **Preview:** The low-code MCP surface is part of the preview Low-Code System. Endpoint behavior, authorization requirements, and mutation metadata may change before general availability. -The low-code designer exposes a Model Context Protocol (MCP) surface for automation. It is intended for agents and scripted tooling that need to inspect or mutate the same **runtime database-backed** model that the Designer edits in the **Runtime JSON** layer. +The Low-Code Designer exposes a **remote Model Context Protocol (MCP) server** from the running ABP HTTP API host. It is not a local `stdio` tool package. MCP clients connect to your application over HTTP, authenticate with an OpenIddict access token, and work against the same **runtime database-backed** model that the Designer edits in the **Runtime JSON** layer. -## Scope +Use [Model Descriptor Files](model-json.md) when you need source-controlled `_Dynamic/model/**/*.json` files. Use MCP when an agent or automation needs authenticated, structured runtime access that the Designer can immediately show. -The MCP surface is **runtime-only**: +## Remote Endpoint -* It always works against the database-backed runtime model. -* It does not choose between layers at call time. -* It is not the right surface for source-controlled `_Dynamic/model/**/*.json` files. - -Use [Model Descriptor Files](model-json.md) when you need source-controlled descriptors. Use MCP when an agent or automation needs safe, structured changes to the runtime model that the Designer can immediately show. +The low-code MCP endpoint is hosted by the backend application that includes the Low-Code Designer HTTP API module: -## Tool Reference - -All tools below work against the **runtime database-backed** model only. - -### Core Workflow Tools - -| Tool | Use it for | -|------|------------| -| `lowcode_designer_get_capabilities` | Read the server's runtime-only scope, write rules, recommended workflow, and example mutation targets | -| `lowcode_designer_get_mutation_metadata` | Fetch the current `concurrencyStamp` and the valid semantic target tree before planning a write | -| `lowcode_designer_validate_mutations` | Dry-run a mutation batch and get structured validation feedback without writing | -| `lowcode_designer_apply_mutations` | Apply a validated mutation batch to the runtime model; this is the **only write tool** | -| `lowcode_designer_get_health_snapshot` | Re-check the full runtime model after changes to catch broken references or invalid layouts | - -### Entity and Enum Tools - -| Tool | Use it for | -|------|------------| -| `lowcode_designer_get_entities` | List runtime entities; optionally include configured reference entities | -| `lowcode_designer_get_entity` | Read one entity with properties, validators, interceptors, and child metadata | -| `lowcode_designer_get_entity_delete_impact` | Review references that would break or change if an entity is removed | -| `lowcode_designer_get_enum_types` | List available enum types | -| `lowcode_designer_get_enum` | Read one enum and its values | -| `lowcode_designer_get_enum_delete_impact` | Review what depends on an enum before removing it | - -### Page, Form, and Permission Tools - -| Tool | Use it for | -|------|------------| -| `lowcode_designer_get_page_groups` | List page groups used for runtime navigation folders | -| `lowcode_designer_get_pages` | List pages across page types, including dashboard pages | -| `lowcode_designer_get_page` | Read one page descriptor, including columns, filters, dashboard config, and form links | -| `lowcode_designer_get_page_permission_config` | Read the page's permission bindings before changing access rules | -| `lowcode_designer_get_forms` | List forms | -| `lowcode_designer_get_form` | Read one form with fields, flat layout placements, validations, and rules | -| `lowcode_designer_get_form_delete_impact` | Review what depends on a form before removing it | -| `lowcode_designer_get_permissions` | List runtime low-code permission definitions | -| `lowcode_designer_get_permission_delete_impact` | Review where a permission is referenced before removing it | - -### Script and Action Tools - -| Tool | Use it for | -|------|------------| -| `lowcode_designer_get_endpoints` | List scripted custom endpoints | -| `lowcode_designer_get_endpoint` | Read one endpoint with route, method, JavaScript, and analyzed references | -| `lowcode_designer_get_script_autocomplete_metadata` | Discover the script globals, helpers, entities, and metadata available for a script type | -| `lowcode_designer_test_script` | Dry-run endpoint, interceptor, event handler, background job, or background worker JavaScript | -| `lowcode_designer_get_script_event_handlers` | List script event handlers | -| `lowcode_designer_get_script_event_handler` | Read one event handler | -| `lowcode_designer_get_script_background_jobs` | List script background jobs | -| `lowcode_designer_get_script_background_job` | Read one background job | -| `lowcode_designer_get_script_background_worker_scheduler_capabilities` | Read whether the runtime supports dynamic worker registration and cron scheduling | -| `lowcode_designer_get_script_background_workers` | List script background workers | -| `lowcode_designer_get_script_background_worker` | Read one background worker with schedule and JavaScript | - -## Common Sequences - -### Change an Entity or Form - -1. Read the current item with `lowcode_designer_get_entity` or `lowcode_designer_get_form`. -2. Fetch `lowcode_designer_get_mutation_metadata`. -3. Build a small mutation batch against the returned target tree. -4. Run `lowcode_designer_validate_mutations`. -5. Apply with `lowcode_designer_apply_mutations`. -6. Re-read the item and run `lowcode_designer_get_health_snapshot`. - -### Change a Dashboard or Page Group - -1. Read the page with `lowcode_designer_get_page` or list groups with `lowcode_designer_get_page_groups`. -2. Fetch mutation metadata and validate the exact batch. -3. Apply the change. -4. Re-open the page via `lowcode_designer_get_page` and confirm health. - -### Remove a Shared Item Safely - -1. Call the matching delete-impact tool first, such as `lowcode_designer_get_entity_delete_impact`, `lowcode_designer_get_enum_delete_impact`, `lowcode_designer_get_form_delete_impact`, or `lowcode_designer_get_permission_delete_impact`. -2. Fix or remove dependent references. -3. Validate the removal batch. -4. Apply and then re-check health. - -### Review or Debug a Script - -1. Read the action or endpoint with its `get_*` tool. -2. Fetch `lowcode_designer_get_script_autocomplete_metadata` for the relevant script type. -3. Run `lowcode_designer_test_script`. -4. Persist the change through mutations only after the dry run looks correct. - -## Mental Model - -MCP is not a raw JSON document editor. It is a semantic mutation layer over low-code concepts such as: - -* Entities and properties -* Pages, page groups, and dashboards -* Forms and form layout -* Permissions -* Custom endpoints and script actions - -The MCP surface includes read/query capabilities, mutation metadata, dry-run validation, a single mutation apply path, and a health snapshot. The normal workflow is: - -1. Read the current runtime model state for the item you want to change. -2. Fetch the latest mutation metadata and keep its `concurrencyStamp`. -3. Build a small ordered mutation batch that touches only the changed paths. -4. Dry-run the batch with validation. -5. Apply the batch. -6. Re-read the changed item and review [Health](health.md). +```text +https://localhost:/mcp/low-code-designer +``` -## Concurrency and Validation +Connection details: -Every runtime write depends on the latest `concurrencyStamp`. If another write changes the runtime model first, your apply attempt becomes stale and must be rebuilt from the refreshed model state. +* **Transport:** Streamable HTTP / HTTP MCP transport +* **Authentication:** `Authorization: Bearer ` +* **Server name:** `abp-low-code-runtime-designer` +* **Scope:** Runtime database-backed low-code model only -Validation happens before apply and returns structured feedback instead of requiring a client to guess from generic failures. The validation layer checks: +Use the backend host URL, not the React runtime URL and not the Admin Console SPA URL. In tiered solutions, connect to the HTTP API host where the low-code designer API module is loaded. -* Stale concurrency stamps -* Target path syntax -* Missing required input such as `data` or move destinations -* Primitive-only `Set` data -* Final descriptor shape after the batch is simulated -* Entity property type and foreign key rules -* Form layout consistency -* Dashboard layout consistency -* Runtime override rules for descriptors inherited from lower layers +## Required Permissions -Treat validation as part of the normal write flow, not as an optional extra. +The endpoint requires the Low-Code Designer permission group: -## Mutation Model +| Permission | Required for | +|------------|--------------| +| `AbpLowCodeDesigner.Default` | Connecting and reading runtime model metadata | +| `AbpLowCodeDesigner.Edit` | Validating and applying runtime model changes | +| `AbpLowCodeDesigner.ScriptTest` | Running script dry-runs through MCP | -Runtime writes are intentionally narrow: +Grant these permissions to the **OpenIddict application/client** that will request the token, not only to a user or role. In Admin Console, use the permission action on the OpenIddict application row and grant the required Low-Code Designer permissions for the client. -* `Add` creates a keyed descriptor or collection member. -* `Set` changes a scalar value or a supported primitive list. -* `Remove` deletes the semantic target. -* `Move` relocates an existing node without resending the whole object. +See the [Permission Management Module](../modules/permission-management.md#permission-management-dialog) for the standard permission dialog behavior. -Important behavior: +## Create an Access Token -* `Set` data must stay primitive: string, number, boolean, `null`, or a supported primitive string list. -* Do not replace whole descriptor trees when only one field changed. -* Keep batches small and semantic. Send changed paths, not full model payloads. -* If a mapped entity or property is removed with drop behavior, the runtime model can also remove the physical table or column in the runtime layer. +For unattended MCP automation, create a dedicated OpenIddict application instead of reusing an interactive user token. -## Runtime Override and Schema Rules +1. Open **Admin Console**. +2. Go to **OpenIddict** > **Applications**. +3. Create a new application, for example `LowCodeMcpClient`. +4. Set **Client type** to `Confidential client`. +5. Set a strong **Client secret** and store it securely. +6. Open the **Authorization** tab and enable **Allow client credentials flow**. +7. Open the **Scopes** tab and allow the API scope used by the backend that hosts the low-code APIs, for example ``. +8. Save the application. +9. From the application row, open **Permissions** and grant the Low-Code Designer permissions required by your MCP scenario. -Runtime MCP writes can extend descriptors that originate from lower layers, but they do not have unlimited control over inherited schema. +The OpenIddict application and scope management screens are described in [Creating a Client Credentials Application](../modules/openiddict-pro.md#creating-a-client-credentials-application). -For entity properties inherited from a lower layer, runtime edits are intentionally restricted. Typical runtime-safe changes are display labels and runtime-owned validators. Inherited storage details such as type, database mapping, default value, required or unique behavior, foreign key settings, and file or image storage options remain immutable in runtime. +The Admin Console application screen should show the confidential client with **Allow client credentials flow** enabled: -This separation matches the low-code layer model: +![openiddict-client-credentials-application](../images/openiddict-client-credentials-application.png) -* Runtime database-backed changes use **direct** schema mutation. -* Source-controlled JSON layer changes use the normal **migration** workflow. +Request an access token from the OpenIddict authority with the saved client id, client secret, and selected API scope. In non-tiered solutions this is usually the same backend host; in tiered solutions it is usually the Auth Server URL: -If you are working in `_Dynamic/model`, MCP is the wrong tool. Use the source-controlled descriptor flow and migrations instead. +```bash +curl -X POST "https://localhost:/connect/token" \ + -H "Content-Type: application/x-www-form-urlencoded" \ + -d "grant_type=client_credentials" \ + -d "client_id=LowCodeMcpClient" \ + -d "client_secret=" \ + -d "scope=" +``` -## Layout and Type Conventions +Use the returned `access_token` as the bearer token in the MCP client configuration. -Several conventions matter when MCP clients generate mutations: +```text +Authorization: Bearer +``` -* Use canonical lowercase entity property types: `string`, `int`, `long`, `decimal`, `datetime`, `boolean`, `guid`, `enum`, `date`, `time`, `file`, `image`, `money`. -* Use canonical lowercase form field types: `text`, `textarea`, `number`, `checkbox`, `date`, `datetime`, `select`, `lookup`, `guid`, `computed`, `time`, `file`, `image`, `money`. -* Form layout is flat and id-keyed under `layout.tabs[].groups[].fields[]`. Each placement carries `row`, `colSpan`, and optional `colStart`. -* Dashboard layout is flat and name-keyed under `dashboard.visualizations[]`. Each visualization carries `row`, `order`, and `width`. -* Page and page-group icons are CSS class strings, not URLs or image file paths. -* For foreign access, `foreignKey.access` values are `none`, `view`, or `edit`. +## Connect From An MCP Client -These rules matter because validation and runtime rendering assume them. For example, a form can define fields correctly but still render an empty group if no valid placements point to those field IDs. +For ABP AI Management or another MCP client that supports remote HTTP servers, create a server entry with: -## Designer and MCP Together +| Setting | Value | +|---------|-------| +| Name | `ABP Low-Code Designer` | +| Transport | HTTP / Streamable HTTP | +| Endpoint URL | `https://localhost:/mcp/low-code-designer` | +| Authentication | Bearer token | +| Token | The OpenIddict access token created for `LowCodeMcpClient` | -Use the Designer when you want: +For clients that use JSON configuration, the same connection usually looks like this: -* Interactive editing -* Visual context for entities, pages, forms, and permissions -* Manual review before publishing +```json +{ + "mcpServers": { + "abp-low-code-designer": { + "type": "streamable-http", + "url": "https://localhost:/mcp/low-code-designer", + "headers": { + "Authorization": "Bearer " + } + } + } +} +``` + +Client configuration names differ by product. If your client uses `http`, `streamableHttp`, or a separate `authorization` field, keep the same endpoint URL and bearer token. -Use MCP when you want: +## Runtime-Only Scope -* Agent-driven or scripted changes -* Repeatable runtime mutation workflows -* Structured validation before write -* Safe, incremental edits instead of raw JSON replacement +The MCP surface is **runtime-only**: + +* It always reads and writes the database-backed runtime model. +* It does not choose between source-controlled and runtime layers at call time. +* It does not edit source-controlled `_Dynamic/model/**/*.json` descriptor files. +* It does not replace the normal migration workflow for source-controlled model changes. + +Runtime MCP writes can extend descriptors that originate from lower layers, but inherited storage details remain restricted. For example, runtime edits can typically change display labels and runtime-owned validators, but cannot change inherited property type, database mapping, required or unique behavior, foreign key settings, or file and image storage options. + +## Safe Automation Workflow + +After the MCP client connects, let it discover the available capabilities from the server. The normal write workflow should still be conservative: + +1. Read the current runtime item before planning a change. +2. Fetch the current mutation metadata and concurrency stamp. +3. Build a small mutation batch that touches only the changed semantic paths. +4. Validate the batch before writing. +5. Apply the validated batch. +6. Re-read the changed item and review [Health](health.md). + +Treat validation and health review as part of the normal MCP workflow. They are especially important for forms, dashboard layouts, relation changes, and delete operations that can leave broken references. + +## Troubleshooting + +| Problem | Check | +|---------|-------| +| `401 Unauthorized` | The MCP client is not sending `Authorization: Bearer `, the token expired, or the token was issued by an authority that the backend host does not trust. | +| `403 Forbidden` | The OpenIddict client does not have the required `AbpLowCodeDesigner.*` permissions. | +| Client cannot connect | Verify that the backend host is running and that the URL points to `/mcp/low-code-designer` on the HTTP API host. | +| Writes fail | Grant `AbpLowCodeDesigner.Edit`, refresh the token, and rebuild the change from the latest runtime metadata. | +| Script dry-run fails with authorization | Grant `AbpLowCodeDesigner.ScriptTest` and generate a new token. | + +## Designer and MCP Together -The two surfaces are complementary. A common workflow is to inspect or prototype in the Designer, automate a repeatable mutation flow through MCP, then reopen the Designer and [Health](health.md) to confirm the result. +Use the Designer when you want interactive editing and visual review. Use MCP when a remote agent or automation needs authenticated, repeatable runtime changes. After MCP-driven changes, reopen the relevant Designer section or review [Health](health.md) before treating the runtime model as ready. ## See Also * [Low-Code Designer](designer.md) * [Health](health.md) -* [Dashboards](dashboards.md) -* [Page Groups](page-groups.md) * [Model Descriptor Files](model-json.md) +* [OpenIddict Module (Pro)](../modules/openiddict-pro.md#creating-a-client-credentials-application) +* [Permission Management Module](../modules/permission-management.md#permission-management-dialog) diff --git a/docs/en/modules/openiddict-pro.md b/docs/en/modules/openiddict-pro.md index 94d8deb631..9d6cae0484 100644 --- a/docs/en/modules/openiddict-pro.md +++ b/docs/en/modules/openiddict-pro.md @@ -50,6 +50,44 @@ You can create new application or edit existing applications in this page: ![openiddict-edit-application-modal](../images/openiddict-edit-application-modal.png) +##### Creating a Client Credentials Application + +Use a client credentials application when a machine-to-machine client, automation, or MCP client needs to call protected backend APIs without an interactive user login. + +1. Open **Administration** > **OpenIddict** > **Applications**. +2. Click **New Application**. +3. Enter a unique **Client Id**, for example `InternalAutomationClient`. +4. Set **Client Type** to `Confidential client`. +5. Enter a strong **Client Secret** and store it securely. The secret is required when the client requests a token. +6. Open the **Authorization** tab and enable **Allow client credentials flow**. +7. Open the **Scopes** tab and select the API scopes the client can request. +8. Save the application. + +The application screen should show the `client_credentials` grant enabled. Use the **Scopes** tab to select the API scope that the client can request. + +![openiddict-client-credentials-application](../images/openiddict-client-credentials-application.png) + +If the client will call APIs protected by ABP permissions, grant permissions to the application after saving it. Open the application row's **Actions** menu, select **Permissions**, and grant the required permissions for the **Client (OpenIddict Applications)** provider. + +Request an access token from the OpenIddict token endpoint with the `client_credentials` grant: + +```bash +curl -X POST "https://localhost:/connect/token" \ + -H "Content-Type: application/x-www-form-urlencoded" \ + -d "grant_type=client_credentials" \ + -d "client_id=InternalAutomationClient" \ + -d "client_secret=" \ + -d "scope=" +``` + +Use the returned `access_token` as a bearer token when calling protected APIs: + +```text +Authorization: Bearer +``` + +In non-tiered applications, the OpenIddict authority is typically the backend host. In tiered applications, use the Auth Server URL for `/connect/token`. + #### API Scope Management OpenIddict module allows to manage API scope. To allow applications to request access tokens for APIs, you need to define API scopes.