IF;j+sk&Db`w)NveAAOOa_y4m5qdm+1)4p=UyO*Jp31+QMIl^<(dZr!?KbZHN+k67WG~0Z zDzjIFHLiGmzIi%F+T(Ej04>ZAM==C)Vl#Zg5HLH^V=m=ZK4VFy&+*aNKB}_)c)p+_ z(!zEMl7&%~*0WDQ*IZ2xDq)P~#*wU em|aO8 z-cT&SNhn@CT_bf5RW$xQ2AA~-CCutXe&B%=iFp|ff}+yphDzZ@gNe+Oj8w5nOh2#Z z;)%l6WE?v&Oa+O1k4L-aKRb_`<1ExdTV|k}@^#2=EmJgZA&ODDGh2T|(upkOv@RUR z&y;Jg6<*iXlLxI;AM3L?IH}J~BZ~-mj AI;yM%|l5mcop8P^0)1%8-NOEia(L z5TF{jZT98BDJQ#Om`HGB|IoMlne2QL77@Vt^m`PSV-M~4P^y6UeLhUb&yW~IOBh9J zgkd5C-FgmHaFsamFCl&F0i^slQb$ApqlM#-Mu!>ExDmZC!&JR=HD61JM=22c@N7Dl z3<_VAs*=h*_|;$~z0`?I8e9V9_h_YzxTQcg0zG8)tC%fOfxeI yRXa*V!Ih&)xwLT;4_@D6GX7dnQWBaDrDFwHxtvs!U4#} zGMpQKnU>JLhDKl2{^Tjl5QA_4u~g=N>LCKbqHIv7a);uN|D 1;VG;ac{9u0%nFCaLo$tT> zvI IHP=o+eUt# Xu#W?I<(pec`6A0AX&dv@W+?wR3>hR lh8M%P-7qKj{!s9tGgGEu!h;6|IHf{63yGCL`i~G6u#X?7}}f?640Zu{?!b zc=&Y_>YUDzBaKb(VK^K}v*u|%s|SKQz#|_9a*zzlt^2t;D&A#Jl3sc?61Z;uyk}n9 zM}2C87LXwVkj%xJTypkh9fm!k3=P-yN8SSRz|igp7(eNOg(Eg0S55BLtj 9K |JM)bzy1t^q4aGSxP8+%XHs87 zr6b&&!H_yZ4ek|;)c*~X|EC8MELS*s$OJtiK%yka;tLH8tqaw3{hz=8fB0r!Qy1bZ z1P%$;blcaIBh!QdmwWwxTH*gN;(t8k_z>qO+QNWw90d-z8ZtJ4rTSkQ_n%0Q2!PAN zy28=^XUKjEQ!t1irOW;o0OZ}Lx93ctE-H+H93MKZf1B^11?sKcAfEWYSMC2$x>ASn z=IwunsCLMW>%Ia(#sAu}YZ4$7N$&&19>W` r15px*hvmN#+4=m(|=P;sbA;)sKKm9@>FhFMR3j5oEeR%CyMnJe~XC8 zX`<9XOgumS>vu%o+BYKF;`D!^wAkM%z!PGo*GPN4a|UqZD XUPlO zU;Wnki?re7R{b18arm6OliE>RKm>YEtw=J$2;BZ&lU-y7Y55oooyE}5zo1`xe3RCL z3$*Iz?2GY!Xmm1O3|4s1ng~*8VPMH-4bJZiWVLFk`eZ}sM*xW3Vc{x>&`>bQSFiOZ zut+O#GcQU*@&GUtVK3|1CfYiz-B$`$JvkyBUV+$*R%Y`Z;S8DeKswzK;P;SV!tu|X zKrYp+?=%1&gBVM>*9gd|+B^PYGUQ5rYbH<1<26G(!}e&;yf_h9!z%1{GH+IZ$+=#R zitDhy7e?e@3>)cn9UKY)Kn#+&c+?k7Np`!hD)>QUPb^!tMY2OQ3Q6yFEr`JDR2=n9 zaGL#7WxT^33+V)+!wP`S6awQXp7%4CurIrQpMY9Jq4vFJUH8W7=;f-7TpU7x-`IJ;JjN^R>5 zzF?EtG6{m>eL(}JDw}To&C7l+>wBqAg<~36iBJD%=cxbC(!3~qdwRlpdpoW1r+p-t z|6-B|K9te)B`DiA60YJeo~_76u{=<(?O$yqXzEn&vkICSnD+!}7WE`|J0pZj>w_RO zk&?G=^Jr&ZxxHR zJDZ$EIM3-$6*{Rp z6}K!0`U ^ eq)bSiHXz+o12eWwEo)eywA{ov4+oDon@v^oDB1 z_-mJ;m{)gP ;8*JL2dIv+X95?mbw N<+@7&tHNo4tzH u@`5|o&e8d23; zo6|NAK|-pxi;P?wVc3+%@Yg9H8Zkvktxp#067t)rE8`skB%aEH&i?64dx7p%iPJOY zin+@|xJJ?Rz;%Q(qh~MJ*B?9`X1BJQPLgyZ1*c1$97AEjnA8`=FHB(mE&D5SFu$ z)f;sc?RR8<&V?$+<^$g4%1+lv1%~xQDY=371dNpIt(k(x(SFZzO3G&QJ>oiHhujW9 zFUs!G^+t6D^VwR4J0lSxf6p7}Ko1}mPV{!_>&4C@$CWvcso4PIGTA(IfXHE@0Q&7M z6ZS02rQzZYIpb3d`GE#s_nYdmO~e(qCK$m+r}b@7vmVfep4lIO6IXUrbaTmu(C{ar z@+tq_nD+19uj5DNyNSn(6rL{qmo_=h`Tm;#D{`@dY ($8K(+6Y|vinx^Pg@$}$frg{dV`#z7_KdcYt@_nv( zYUq%c;W9aXc<1){pY+m|G0%GiH1A3&@1LkQ`p&??OhfQP?XDKx5E }sU{Mt93N)+&vr6?kE@L?ll2tV(ge&V z(d%v605UjWo}JVoJMiyf!Yzd+Fjb3&tz7`Fc(`tT*xa(}bNxfYuNPB1sox^v%zDR4 zX1wW^Eg1*mCTIo+GX?K*X3)DpZRx+sY2<;P&pc=bg!LQQn6rcJIZCR9%q%f9` ({Ln2uFB3DI4;8CCB!&2dW_AI~j|CIT_>tAAk2GGv2+sStIRBoHt zW3)W<3>yOA0)3OR7o66uch|CG`Rm2KYk!%-z--~=bv&hj;m~`7(Y{Jsl0RWSC_@xD z5d*7a(T
*8hIj z_`7u>2)Qx>sDSnj-%;85RC^NhlrnX>a_kOY<5yX{n!g$>lr&oiQ*<*%kZqtOz0`p5 z*(_G=yx*$Gw~*SMp^K^DmeC0F$1yNO#`&;lVuAhY=#^K&YHMhwemJy2{{ zQDJDZGwj_r{f9^Y*G;-)s8kbRB1|se=>uW=NiVTyrj$y%AlG#BkGiIusL5OvQ$$~v zU7{>h`ZF3Jz_lHzwdADPVB2u+T-Tzcx(A& ;h~AW&VUmww;)P~Cky7bh0S(5MKO}6tYEd36@!cQzW96t zh0|M4L@!0Jcx(xU$oE}e`S2nYJ410d =_ zq04Sr#{NzO=cfQoLvK2m*Oez|)LSHD{I?X%p5mO-;=LB&Tla$p)8&V&@s0 VhijQm6dy@4_QZAtG`2N@hQ^YL+7dGrguuYZP{I}eDcEjiN zOD |E~FIJwkma9 z&@xL=K5%nTAgoG>?DKffl4?>ojQ4mWN-~csRscZ*NN~x`I|CLG!5Y$_h+8ejsy9h{ z+LN)naOb3}T7J=+nqbC&B+%&pHOelMmFCqEik55o5 ?0dcK}`lb2*0Ok1c! zcDr`M`hi!XDocS~zo`So+k1b7?gRuPQg>LN6(jN5bDyZO|Fg^3OKSRu2Nh@b+s(r- zn?F5E*VVN(&%vyzG#ifyGzn+l*an`?A1B`!mp5X+OG5EJfMR~xve^p_Q@>%-`&oxA zpR~VJXt%eTF|J0LhD#8X?p1_N!_Y4+&|ggXc4&$Of YkjwbbUUe$ZY(Onrz43%Q@-Je#=esL!1@@=M(q_UwP7;4+f)57>T8-WQ z!2-@m)DU5%XB-E3pvich3M%>Cvu$-0C1ZRi(VR?}jv2*~pkQrkvf|fBMBo{pa^v!G z_w_LOt dVfcG{YygLPx>;1kf)v_WAiSvF4H$|I;_%sgVNrAC~m$!YC0FDj4Tt-@? zls<7Z7~3R2{t$A%z4)|$0^4!;{ qy zkJ(_eao!1yi-Zx|0xu?qdoUQ=q_2l9KledE6~wgiqy5Y8t+Yt7;9Acz58f!KEeP@h z&7i^VIMxZR5WFTqvqdrj@6UWea}5p^2hDYh?ZFx4kD2r8V`KgGdPx07V ZgmLbK^>d<&}?Z8!3jIU$s >1{{_o1QAFg0nxXz$;(wCKx&9Ecx$#noV$3%;cF@s97WhsDehg*L(s#2 zvBNWda@FKtK{_o=9seJBEoTa49z|Av&}Wj{IxX}m0z~>$Hk9{bMSpO7Z_1JYj$<`u zoXOtjD(`1*I6#?pLJWDlc+kAmbDdJuQ#O0|W;^l?4V%c@ElsAURRS3~ zGdMF{miFRLJ?RQfdatvwWeVP*0k0EP4d3gxUm{pR{1Xuz-+b9J7=5&2A?dXmvWvTihMSCv%`sf0uI0;liPNW1VpGms1jfxOOVDD8Gb`J zli6S=EX)x6WQ~qJ=no?nq>xVQqbo4sCbZEKY_ciwylJ&&_X=3$==>~7D7xpgh=>T} zN%st8{O)BSj-%WNvs+Iz#P=n%s}E{N%4w8((DO>XOR?bV9xRpthdK51xdTw_AQ-Vv z^dleq1`Cc0eKAwAh-o}>(+;U~SHCnWceh`kg)Q7&y(VJ!sqb5{WiQ1j@zsNeu#V5* ze?aQbdc7Lo7)RBG6XY-%m_25}0c)aw{3!71-ZhN }uuX4_xez1Mlx<<4O0ta<-CATAXi zt|p`xj1KdeLj2e}`gC4;fpxmLK35rkuo`~tbhg_bt}yxtKmXA^LI9XxoK|^?BUz~- z-$A1_J^btt8a^>{`@H_ro*3z%w}17E_*1{cGg-jjsj*6!Dldopf*bR#AfIUQCUpLH z4|lkqbUepr2g3ZIapEQyiS EcHI7$!Pz!5BTbsottYsqS8Wa1HeoUo@FSRg z6BQ)}>(i2Q*1L`eS>&0w=MrbKb0m>sPmD+Cv!+}9on%&G*<82c$Hy0W?afI167{nY zk_GQUtI6vV{GA__Y1lW1tijhJY+-Z0%=s}v&gkdn&4Gi*={XH|d^D$}iuErSCbjr+ z3$dqLqQe!cAA%k2V6~D_g###&*7$J^=VxI34Li^=i3#uIA)f$=?ojC!P@G+yIZYD7 zV_J|1 !Nn^bmTpT@Cq596AFdn7+srgvwNC9yx33| zkb}ddtsJj0oZs1QFdMA-q{jY_Z<4(MLdWVQL9m|8YQ$K22bQ#y3qZ#bw!X<{OY#8( zaA#9T)2APnItC2k+1hMlg`&chh_yE;?aBpnqFCd@>il5D=q76U^k~#9nKRwIjOaXC z3Ptl=j+124v;QVr;I6ieYwZQ3D8k}M!h=`8s_+f)HK45!Gls2POeaw1yc%aRGSyc# z7_B1Q8hM5>)ugXNYJLAIueOKIF(OnN?LT8IT;;Txz{;M`zm~v~Wp>5JOLX7gP?Z{y z5mk>Lw_*!sVD}>&9#no@VmAfA|MRZZ?fB`#;XJL+_thTx4682U+W1fW$s}mM@hP2} z1q*K)u;QFvUNS!U_;GsYR z`WuqfCrU9%&axX9O!+myz_cow1Sgx<4*Su#=GK=T>>xwn;QT%i)&E3Nn)B}Xfo>-< zLA7}1bD@Oz9xrqiqFEtFe }Yw%{m)2w~ M7|Dm_QT8%X`|& zVfNPkWuNSXH3QEp&RHZfz-F|qCnKS<@*R1~`Y27@-C3g+UF0`-s)hc_#VU_#p@gT2 zFY--0c3_io>|bo;SIPkjh8+M)5= Y`l;^?h z#AHSB&V3ay9GeB%Lw2ym|wSojJr8dz|tr(=F)y3@TOf_SP?VH&`(7 zol&DXc6&=W&iR1PpSA6ACK|)(@SsrtXTA?U2W(}jg}EH(vdul|W$s!g%$R&Rpb7lf zv `J7V|&=y^@3FWU25ne%mD>%C6=l`3_2GqAU z*w52`ni1=W#}yTU&_>>^UKP9OptF_Ytc|w8DOw&?`KQ4Lz!2Qh(IS%%EL#vIoL{&a zmmU%xF0)VYPu8H?$)LH$X{NijKt~f(Yh=lEkRy@!pWddJB*rnm@A@>VPAM`nkAvvU ze2>;Q*w2kEV=6R0S(5JwI!r1o8$m(^mz@gO PwaUTcvB+yoc6XZ4l_{+G$az_<5*>snZCaW(iqY}8EUta7<{kiCyy#|8Woj|eD% z_X?5zgT0wab(R;rFI`z6=gqxK4Ix$RgYsFbt5x{g>;Ns1eGesKNR{M5wRisQr({JU zQU()Q#`w!?H>H}^mz+Bmj9F$oF%vgUvw>hnv=NYD4P%h
Dr@ zS>?JMgJ_gEqD`K~!5lrHO!L7c8KjI1&5?xDTBR(4?cuOaq-^!=&IbLr(>D;-z=ZE# zi5zPXOtNZoYI~x#`}HsRgsW)NW8?7A^W!$hyXKmeABgP0ni0!!b&iZYdfTlF{=oBe zC |EB$vr#EG>8ZL%g5a53{uOE&(E3E)6zrWX!HMO!YpuYtdp@g&b;Q5ETwZVi zd)ET0n#+N3i@ofU!nSX+tH$zvDDY}Lm8pY`W@*r>>%NzuW|A*CM0D?j*cAqi;3|S` z+&u2=xA~JJi@x>7fD$!mZaO?wgnr#SWzV6{?zNww)UHG!26aXG!$F1YJYdci4@RKE zcHPgK&Bz6~+(`;xF!dqc|GuMbxaK80tbOeQNBOAA54x9y2T8(o(x1W{K`V_`i?nUe zQ(Wb5>c2uHKe_X2w2oB!)`RxVREeZ@6Qlczg*vv@X<%L4kll5TLAUr#+lpM zJ}&pEJxTmNCr~oyn_SnuiQU10s!SznyDzr+E@k)T#Wy>gEtzS{YWOZiPB<^6siA@f zP!9HYY%-djc!EaKy9s1YvRxGN4Gn0R48O z%|+L#9#{M4lJ%Aa7-t`vs^O5Xo$?FEdDB>#`o0?F8*|zQ;Lp%Lp^%O4$AEpbhm>Ti z?o?I2djnLS#JRKWe6pKai2mc-&I1?`pJMFBrHnEsRY-8zXhhNp?^ GBsO7i$N`Wi-jh`)ubt0;ccF zt0BDE-;v)%Ol>V|?$cJDx;(YwxsynQ&(%-+BUM(evH61hsT@u_VLhZqooqc9u*J2W zpxL+DMnLG2W9^y}$*Ph Ymccb>ia_fux*|vcd9p%o3L9xS*DE_&J|BJo{pEZX$eaS%+$dUB5fm%6c zPYk~*1AYDnkvNfu>L;!cwj0gc@+z5g2>T1#6=0PqB2aGPYgxLzm%w+sh 8xojCgJ(ow(i2{+)Po)V+*) zy*Y&WvpAH36R=QoFhb(-VYQ*-<=(SMsI+i(-Z#%ytt7nNF|Zt)WMUQC!b^4NXA!w8 zCIGupBKi}4Eo_2*zccUlSqq-m#l=Xj&*AEc)KkIg`?aE@SAZAlzux{m2Et0c>BwQp z2?mjo4mxsW`jyABt`~^Dv&qePA9rwfkm>WoNx-zybu-GmG|Be8mMLbOIq_dG v|>bq6J`nEoRbVwMm64e?XL&o?dw~%#g z8Ee61)Lrg2IKc001}kTFv^v Mf%U>Xpk5j*)<*&4Jm-^>9T{Y@GqFT0z0lsS_yBVWd*Dm%{r#jV<=mD7o+)ozR zgM*uAc}@{<+1_&jcA5fB$)e ?May^r+B6b+cuHk-M2HKC;Iv(F;xl=pZRT=Gu@_|&A zt_!zTuvgjjq_@ntyc8B?z&ECnpUt2pEdUmo|D8-={3U#AeEn(f123Ive7yYa#gN3= znjJ>YSxyxeR<>zx_H$aupTktFMg{E`AG39XZ(k>Uf~g?KwJ~w<#?&II`HD~Y^qMQG zd+R)>vhkUpV8j;l&ig{~?yhzB;HrE4I3RyHD!E8xO5-}Ow4BhBhySM~rA#-F!(}J3 z;CD#P$>$#K($b8y)4Ns~5wbaKUIzEW#&<&7;dWSfKArsutO`E6)uA9Y407Fj?xqqY zdifl-qb}=Z`Dm&*fyis~u*1-qf9a8MQopj&@H)TN#BcQIEYH(#FdCz!WfeWvqqz;v zmPx+A4AIUH-lIvj|JZP8%1 _MSf{_bzl Vm<2B(>xrAuFU+v8x*PrQu$!-Kr>u&ee_YI zG_6)npFPl7xLIMw%=?)hV}lb1PC_dUmhP9_wTZ(;t(2RYnx}1D*VFDXHtLZ``6jbN zX-xpCE)Rh=x2KVhLY~j>eh^}r>F_$Q-K3oKG;hJ#*~vj^@jwz^#a|jEA3-}x9-rkR zC)Kx=V7W45RAaNtig|8J5n2N_OO-+DiI9UMewJ?zY{jtm2VSWJo=Up`@{XmDB)hpJ zTNLciu`+vzvCa5|E`}z`3 }Ht2V3D;f z=5fb9Rgs=y*A_3j`0*HDVMYPU3u^ cG>fzU=^a;o^9HH5Zx z85c(to4ri0?AS#SRi6NpSm zL32C#0lc(!_Wf=U)chhc>t_EU*I!p_1G0lOnzgC7&VZIi!73L?=JtoGK;~O) G`WZ3oq_FJNYj1m?eV07 z*Ue`Jz;L(8LXM9Mh9N7_51XN%hH1Xs9yR8#i>I>pSeWo)OV#7Og7xcts3vKn96jU; zWE6)w8S1cOSRWvap#Z=B@ERRXxuNk>6U@7F{`wR4?&JHnaz$f`^oNJ``5@+~PZBQq zvD>v$u{`%=!|Nfy4|xyW2RUJ-N}Ai^dfI}1*Al)2pFn0ss>NT7nD@V_aN||vK-LrW zxS6 syt>{DWl%+fzW_vr+ zROOq2%gX(&S`oScav@5$z!DZ{Cchgl8Ns^ 0NqmB)Y6a2*BlzI|ztOL$N;6D>4_(;; ze22^3VF6ad*U-?fAk8s{T>q4?LmdgQSlU9lZNG%YCFoEODf=-bbZMT81}_;@0b{^r zrT=AYV4 VTJjCp+G|94A+XcCW_gl`tKO-z2AxPk9FF2ffYpM-~fQrycXpHyIiN z0FcZ=Q)-#{i};WkBMuKSTyxII&eiBBT|>=wAOA9|NUz;@_Tz2)WF0K->(b0$L)VY@ zbxKqZk~Mh?Vexr9Z;>DPZ+v-4MgHwAnUhv~$fJ%3Ga&fYyvTP2vh-kIYflG k3R9X+%ENykyx@vaC+k9 lY;FJrhmFTM_< Udf z4VsEhr`;Vv-4_v%UpRc{u2&tm7WL&p&lb^^m@6LT814yAu13n1Kg5)cm=^?ewa%Ra z%LkV0Cj8}@$@vb#X>&LpsB_$c$QM75Yu!hm{v+usS(=L2;Z@)4O>+o&l4I@5bqmsK z==K$oZ_(Adgn~#D02c$j&47AMDf+?8;@PrP?oUPv#lC)hp_Xct3tL%wdN6hb%;HSoE` z{iZKC7ExE!7c12(w~|--_#}8IJ>X?QMo__hcGF=bJ1G+DsPd`xorqLk)Hx+p_;wv1 zk)-5z*}utqg5)!Q5?%KlDm?s#U>5kVcMA4Y5m_aoP9a2LLGK1n%z79=eu4{Z>`BY| zPkK%wVD}Yh>`>=_85M|gHTeKwo@FJW@4^C_z^!FHIWV@oj=cY)z#@*EobVo2xe1m4kOs|XafgOljgs4yQ0;5#y{TGlP>;IXuWK$VdXp^zddhN1=)>9Mt5x}gJm zFNYKcZX+a==_%j5Z@tw~1%|9riDCVB#v2TBQb5FDGI9c9q<0vCDf;y_Jfr% PyEGDlm2-gTJ4x;=E<4$ z?i*4;=rAQ{BNClbI6>#D=;2JSe&XhHUVJm1!@2KZDc7G2@FvZC7X+26M;by&>JY@! zc^KA!doLH>2Xctue0W!X*h%aa{mAiX24&N#DWMQMec87RxbK(K8=ZZN+H9{~6V-Ia zV^EEw8jI;W+SH*1Kg`Ye(NyZ#yBd6n-s+WBOM`PKr*CbaU$#LK%Ps#CZ5c9`IemWV zOqe2JBjR+~>4Iu~fQSiIAM;^Ji3{Q~zR<;ffdpzhe6z)9sueExeEAnub`6GxS9g(0 zr-Va>;T`jqo!=0ceho$APi^;fWT;beBUK0cp@Q-XI-ya!{gA-`IW0TB{RYyFUMmF_ ze_EVkStM^yO &3;SUWGezaeh zD#%%MzjakrKEm@7;qlt&49mw2xMRt(iVx3#!A3E#K)EI1k9b}$8dd0a-zhNu-IwfF z`RFC@sC17J>b#X17{K- KhJ|AM%$79{swc{ZS2uUBbixtGIIG@v>(qf+(xDcn^2r6%2j-6q3O?%ZtsEdSW&$ z)!j}C3W5sf7oAjYDX|{nPuN;*N-Cl9@c1H5-S-BXWJD2)+ytb)H#%rdTe&Q>+VVAW zzh1 seZpgu$$K(fk0~FWR7eZ=QR^_`{ z)7?)qQ;13T3=tJ?sU%!Vpk5RgemZ$?G4AB@%8F)`doV}>5YVjVJWbt=YWx)Rpe*!! z_IM9}IY6oP*EVL}xHHO^h~<9M?P(KPPj5_l^PPGHSIH=&zR|#MN!9>;X7hKa7nDOQ z$2z<8vA^Zps GMdyw1@)MNjhXEfE>d6T9lJKab{1; K6G;~xhwoZT mQEP4 z-KK&i#E;+Lv0Sk6_AgNjhOY@XPb>WIC+no<^b&l>ll*TzzjXiOOZM%_@IPGKMbn ZaG-~ z^l$`~Rr$8A2A!L79gLji2u7fxD`b!~?J!OWo+9sgV9YLes0q#Dp@6sC)DF|j=#MC; zm&vnKhKL}tY7yGQyr|F4tD$rtH{S7sQ|GKT!I&(~-|kX1MTK-fEGErZTv=AvXVB9Q z#=wY$ye@-{iHg?P72hD-?Jl3v==+ii+C0}t1A 7v^EmD4T7h7MpXwxAvzp_I|%vJ^rvn=W2+Bd)C!BhJ<`1>M2>?4 zOfB{OK&;)SGuewr?5ch2GggfD0cETTAcuYB6Za*YPx$Ctoa}mTk%LQo@QwfkUOhh$ z9q@0AqJhBP1kB=Q9fV>}5kz(&0&F|~0ng$j!0SLSVM!_-mqhR{!^pvVD5b+qNj3rZ z@~T=ChRfKtSZpOjQhI%7(Oe$H1M82iuVp{}+GQX(J=v@6zAi++8Y%-tY)0V$GW%p- zd1p-9e-bXK9}5&!vVqWA_~Xt+js3B$TWgPG{xy|O%R5`ph3A|b>XRK}iG7Z(EPjP& zk){V&l<%uvskC@-@ClxN>GpKRXuYy$MAmL&Q{x&4^5M1AP6e?A`~vo$h(36~PG)N* zDDHVH$1KdNiiu_a6v=v1^oIi`Q|gT7W$$pjpBwlt)*n}~Po4L)w_}&;QHa}7>SDZU zK^Os}3%DR&1RKJMu?NTzLF39RXdd1bgTN%C9nGt&?o%qQoqGA-rt(-=LHF>gOl%3s zU;SE^U5*u=i!ku|Tz4GCE-|+ny`GHS@C&wtFHoTTpON2aN+aVNYW6XKXMn@#!&-|L z^>Qf)D|&p)84F~IULEZ_i??UgTYXgLLhE#thbhOrMmL7-D~NQQ=1FlqD0kEWHz@y^z#)3z3`+tf=JBz@je@PL^8^2Yec^}*QFnA zd&8%E6=}a&3DE8?u+Re!nlG}=;mC97pu-qwDj!XGv3JH7lXl;^tBb<7OBYAsxpe&* zqTr*wt
cU;FIP3TbgK}Fcqq>qn~I~R<0Y`82}MrS4dExB6oD`-C0iqWv2r;=G5IZs z%7k}E|NboUv4&G3Kg{U89x8|BQ26V~Bn~DY@30SH3~v6Btg`>RoX=eqskexG9P=$E zOjWuyg4@;;*d5CbDn)MzZ;4AIN5>OC?`_#+dTlMacdXDg`h>LqbaSz)F5JO%dh(RV zu o2#?<0t00UrcpgAV!K(Ao?GTmW!A`5dd`+#a8x@6`)l4S<8k`cn?w!6?go{C z++qU6X4&nZMKI+!7xbLM0B~CU>qhx&nyb#o&e=o)=MXQ(98>kh+?@5 zRNk;7 zm^omL%8weds)%j)pAZGhG7rLdq^u p88)=5f zG-Lt3XP9PLU4Lb|Tb}*bj?pq)epZ!NorT`WY_Y!*KdysW+X(s|px^k#flK5m=b5@B z!Y3`5UlZM{+|UCC#FB1%XX!L63`rfg>>iNQ<(mA3K 0wWgb#@8axF3;pX#Vq)G(SMRaE_FWjqw zuYhl3$C#im(0)oi@uw`I>N>MCTm9#ELc6IMin~?gh`{ILFWN@=Yx6sw5$OMZ8bEpa zll*x8@C`%_5=z+DApoeq253S-w{~lHv`rz#yB+vbZ(ecAq{)q+^y4eI_x&YElwL}Q zo 319R3{lI#QO6+#jrKk={mL{sh`GqLT_Ty)T zi$pFKB7PB(HHVjZ9=r72SoPITFmzjm+B#zlT)VB#x|b2imNwD$@0mdJi^(8k^s2-b zjGjDNrOaK8A^ qUy$r`HZI7D#9{JGKsX^|A`kDlmS z1{$Aj9UUz$z~1r&OWz}ByUBNU=hPTX*`!H7i>p^$jP vcb>;&zzgrY)>-)^ zFnu5B@~!sXJ0s~T>#p!FMyH!`d4~(G oCM+LnV}(u>FCKdk~y*)~~LcY}n$b+~u!)HLxE1|rZ`?pBSE%}@{d z^y^u{Wau5C$6|m1&Xj>Jq3aa#0#c{)Q5RS?pnfbt5V>QXctZXP=H`t0GxWE4p9Xn0 zN)O&h+`)GzxnhvmN49^CK^?leg>_kw#^tdVY8cq)q+nRET-tRE)rr0e$WVp0omhnQ zhn`?RL6r c+;G@s9G5|S z7u4D~9MN0>cQShUn0yW62|Qo~`89qG0y=qBpXXc3fZO9Ku! 3jN>Q zo#RVj2~muXzde#oQ}6}szQcmJ8oy;rOJUms^ZJ>J|E-d S)-r1HGEAfz4PypFMcNZ9y__L? v^90ey-2;``-8ci%>CJ_D8%1s%%XA-nV20*Ck67KC0;L zZYIyad+Zo}4LkctH>dd9q$K-P9OGIY;bd~R{+!sFaI41Wf0LtSe+10O&_|9d2KguU zZF9Jd@VBN{MZw~Ms{Y_=$9NdL>)~4biCUxLw0G#m;je#b6H|K>;kc^?Ty^!zNUZRA zXE&;x*Ywh%{cDVWR&R*LnS+~6gY-I?upsMPR;y;)Y(r4jvY|0} zA9&B4dx-YjpJY>dXX iZ?c?v0UzPRT*oqMg%!?sr6Voa(duIm(vvJYe_>zyiEuI;KsI^$$`TZ`$ zu$3=Aeq_Vr$$e#_3(AT)r9~>N<%L{#{ws?EQe#$kb|X~t`|6dZ3rZdh(mtri0>b9J zF9_N8)jqaM)r0uUTi9vq5^z2&346UHxaG^t*xFzuhU=Xsw1&+|YgTyhV>X5ldm4CB z{Zd8PshOKk1#n%{`k{$Tyb6tYvAzdmDu2@2lg!*tr;WqgKG&VuQ0?{Xn?~ZAXpUY_ z5pOGiAXI$IVYy_mL~m`n*3~oWtl3^C%S{khm}btgyuMiEy%@1dwaZTU^~I+Cf=8+D z3BC0(wZ}s5J727`Udx$HzE^tu!+h>Aeou8?CNn0bZ<%(m#t=#KTjln@ny5eGo9}_5 zInFp|51OJY(-=Py=X&0T#bImzxaetxKXB8!cB#$k6+!4XZ4^P2P(P=9!s0ccl9Z-S z&FoqeO-(sl_RGmYIdA+ta@>%Wi&Q349^srlvn%z3{I)M%p~(Ge)FNNl3HH^^15P<3 z{pE9^lzHP)#}u5P_kn%W*BXNYO IH z=R#$!jg#Fzo6#I`Pz4vIiV_!Y>5Px<=%|z*b2IO}bKPs2u1GP<(&zk_pT1ddAyKU| zB_uw%U(i9yIAUX`=&?W4c8O}E>egn=7~R%KH|Kf8eO^&eh@A3?0qJ)?PoMyB&}!MU zP`FvsE^_^zKB|iJO3Yo=?I0>i|3WK|YM%;*8xVmRq}S5~zBK?y25JsJ)C%p1J|uc@ z&dennUICAB^uqzNv`L8B6}eurrpxBB=j|h5=p3}lJ?SW|0Fw5=P9QGKNX(=1T>v1N z=O6R`vIVM|IJP6l-7RS+5dc{ba4eRy*IB(RS;b7D3M^qdHM!xk4$S5@=c{5eeiPV% zb`%XGCO~XIaxoc*izJL9T00uZ#&0UJSkFk%wy5s54*leY)u&B K089k6)gJ z)=2?Zs^stfN%(FF+hYm<{n_1Suz)tzwX(2SecuzUlR>V&wMzJf0+h$_h!3lE-Ok`* zj*2P!_ilGmKLDzyJ1(5~hr=P5TknV6s6Axurz?b_VH8j{vwd(#({2w)^=*3N1(Mgc zUGz{Z4FD8qmTSHa7_pf!fYu5(N0I26^ddOy5P{C0!h;`W!PHtaDuu$F6-XLR7D(;} zoS^CekWlPs9)f9!A8UY{B|_=8uDBdm&h_mgqt3~auAv>ET@NV)yX?mGBF;f@L6$%| z^ldLZnSFi?M}PSz(49C(e1k#;wPn#@LCYyrE`?!;gF67XAY*ZBc~2USx*ZM!84cV( zc@juJU400Rtj@DBDicHpL|O6{Rpkv*z-sqVoz?HcBUHioP73AEt5_rvlz~Y2GT|d8 zVAJ8v`E;~OGyjbIoh|%Um1TyA0Z^lq@-THXGY$ue2Q-wfAO*QGJnRXEN~LgWM;Z*f zoL3hCXQS*6c&nFo`oT3LaEgI;!Xq)@6DUIerdfeE+nCSA=We!GZl%Jg OhG0`D)~&ffz7 literal 0 HcmV?d00001 diff --git a/nuget.config b/nuget.config new file mode 100644 index 0000000..6eca12a --- /dev/null +++ b/nuget.config @@ -0,0 +1,17 @@ + + + diff --git a/src/CommandQuerySegregation/CommandQuerySegregation.csproj b/src/CommandQuerySegregation/CommandQuerySegregation.csproj new file mode 100644 index 0000000..ba981a3 --- /dev/null +++ b/src/CommandQuerySegregation/CommandQuerySegregation.csproj @@ -0,0 +1,36 @@ ++ + ++ + + + ++ + ++ ++ + + diff --git a/src/CommandQuerySegregation/ICommandBus.cs b/src/CommandQuerySegregation/ICommandBus.cs new file mode 100644 index 0000000..30b7d17 --- /dev/null +++ b/src/CommandQuerySegregation/ICommandBus.cs @@ -0,0 +1,29 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and CommandQuerySegregation Contributors. +// All Rights Reserved. + +using System.Threading; +using System.Threading.Tasks; + +namespace CommandQuerySegregation; + +///+ + +CommandQuerySegregation +netstandard2.0;netstandard2.1;net462;net6.0;net8.0 +true +true +true +About + Elevate your application's command and query responsibilities. CommandQuerySegregation provides intuitive interfaces and classes for implementing Command Query Responsibility Segregation (CQRS) in .NET applications. It facilitates clear separation of command and query operations, promoting clean architecture and enhanced maintainability. ++ + + +true +true +Speed ++ + ++ System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute; + System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute; + System.Diagnostics.CodeAnalysis.MemberNotNullAttribute; + System.Diagnostics.CodeAnalysis.NotNullAttribute; + System.Diagnostics.CodeAnalysis.NotNullIfNotNullAttribute; + System.Diagnostics.CodeAnalysis.NotNullWhenAttribute; + System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute; + System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute; + System.Runtime.CompilerServices.CallerArgumentExpressionAttribute; + System.Runtime.CompilerServices.IsExternalInit; + System.Runtime.CompilerServices.SkipLocalsInitAttribute; + ++/// Defines a contract for a command bus in a Command Query Responsibility Segregation (CQRS) pattern. +/// +///+/// A command bus is responsible for dispatching commands to their appropriate handlers. +/// +public interface ICommandBus +{ + ///+ /// Executes the given command asynchronously. + /// + ///The type of the command to execute. + ///The type of the result that the command returns. + /// The command to execute. + /// A cancellation token that can be used to cancel the work. + ///A task that represents the asynchronous operation. + Task ExecuteAsync(TCommand command, CancellationToken cancellationToken) + where TCommand : class; +} diff --git a/src/CommandQuerySegregation/IQueryBus.cs b/src/CommandQuerySegregation/IQueryBus.cs new file mode 100644 index 0000000..05c447a --- /dev/null +++ b/src/CommandQuerySegregation/IQueryBus.cs @@ -0,0 +1,29 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and CommandQuerySegregation Contributors. +// All Rights Reserved. + +using System.Threading; +using System.Threading.Tasks; + +namespace CommandQuerySegregation; + +/// +/// Defines a contract for a query bus in a Command Query Responsibility Segregation (CQRS) pattern. +/// +///+/// A query bus is responsible for dispatching queries to their appropriate handlers. +/// +public interface IQueryBus +{ + ///+ /// Executes the given query asynchronously. + /// + ///The type of the query to execute. + ///The type of the result that the query returns. + /// The query to execute. + /// A cancellation token that can be used to cancel the work. + ///A task that represents the asynchronous operation. + Task ExecuteAsync(TQuery query, CancellationToken cancellationToken) + where TQuery : class; +} diff --git a/tests/.gitkeep b/tests/.gitkeep new file mode 100644 index 0000000..e69de29