From ba076d580fdd18b91f88631c799debc9e58b1c83 Mon Sep 17 00:00:00 2001 From: GauthierWebDev Date: Tue, 22 Apr 2025 16:32:25 +0200 Subject: [PATCH] feat: Update MLD conversion steps and add Many to Many relation --- app/pages/docs/merise/mld/+Page.mdx | 39 +++++++++++++++++++++++++--- app/public/images/merise/mld-3.webp | Bin 0 -> 17732 bytes 2 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 app/public/images/merise/mld-3.webp diff --git a/app/pages/docs/merise/mld/+Page.mdx b/app/pages/docs/merise/mld/+Page.mdx index 46e3a23..59d2ac8 100644 --- a/app/pages/docs/merise/mld/+Page.mdx +++ b/app/pages/docs/merise/mld/+Page.mdx @@ -69,7 +69,7 @@ Pour pouvoir le transformer en MLD, il y a plusieurs éléments à prendre en co Commençons par les **entités** et leurs **attributs**, on verra les cardinalités après 😉 -### Convertir les entités et attributs +## Convertir les entités et attributs Pour cette étape, ça va être très simple ! On vient reprendre notre MCD correspondant à la gestion d'un groupe de musique : @@ -94,7 +94,7 @@ Voici donc les tables et colonnes que l'on obtient : Pour l'instant, on a juste remplacé les **entités** par des **tables** et les **attributs** par des **colonnes**. Il nous reste plus qu'à ajouter les **clés primaires** et les **clés étrangères** ! -### Convertir les relations +## Convertir les relations Pour convertir les relations, il faut d'abord se poser la question de la cardinalité maximale de chaque relation. @@ -105,7 +105,7 @@ Il y a deux possibilités : Un troisième cas existe, dans le cas où la relation est réflexive _(une entité se relie à elle-même)_. -#### One to Many +### ➡️ One to Many Dans le cas d'une relation **One to Many**, on va ajouter une **clé étrangère** dans la table qui est du côté de la relation **One** _(1)_. @@ -129,4 +129,35 @@ On va donc ajouter une **clé étrangère** dans les tables **concert** et **reh Et là : tu remarqueras que les **clés étrangères** sont en italique et sont préfixées par un `#` ! On constate également que des flèches sont apparues entre les tables. -Ces flèches nous permettent de visualiser le sens de la relation entre les tables, en partant de la table contenant la **clé étrangère** vers la table contenant la **clé primaire**. \ No newline at end of file +Ces flèches nous permettent de visualiser le sens de la relation entre les tables, en partant de la table contenant la **clé étrangère** vers la table contenant la **clé primaire**. + +### 🔀 Many to Many + +Pour cette deuxième possibilité, il est impossible de stocker une clé étrangère dans l'une des deux tables. +Il faut alors créer une **table de jointure** qui va faire le lien entre les deux tables. + +Cette table se caractérise par : + +- **Son nom** : + - Généralement composé des deux tables qu'elle relie, séparées par un `_` _(ex: `table_1_table_2`)_ + - Peut aussi être un nom plus explicite, comme `table_1_action_table_2` +- **Ses colonnes** : + - Deux colonnes qui vont faire référence aux **clés primaires** des deux tables qu'elle relie + - Les potentielles autres colonnes qui sont spécifiques à la relation + +![Exemple de MLD avec relation Many to Many](/images/merise/mld-3.webp) + +Ici, nous avons une relation **Many to Many** entre les tables **musician** et **event**. +Une table de jointure a donc été créée, qui s'appelle `musician_participates_event`. + +Cette table contient deux colonnes qui font référence aux **clés primaires** des tables **musician** et **event**. + + + Il n'est pas nécessaire d'ajouter une clé primaire dans la table de jointure. + + Pour rendre unique chaque enregistrement, on viendra _(plus tard !)_ créer une **clé unique** sur les deux colonnes qui fait référence aux **clés primaires** des tables qu'elle relie. + + C'est ce qu'on appelle une **clé composite**. + + +### 🔄 Relations réflexives \ No newline at end of file diff --git a/app/public/images/merise/mld-3.webp b/app/public/images/merise/mld-3.webp new file mode 100644 index 0000000000000000000000000000000000000000..c1c7dd7f8c4ffe178e914c4b71347e6a28df2504 GIT binary patch literal 17732 zcmYJZ18gr&*fd((wr$(CZJgS6f3`$K)Jv)z#y`~KtMp`sa^LE7U|U^hz-Au{>rcaWaE+F zZNB?{I6v!BFVf%oh74N>Z+f$P-G1`lPmjVyyHkIfuBY}*$NIQ_-oFoDNk7AX2%~pv z1nUWj0rY_NSDgw|o@l)|mu)9xKu)6O?aM1tm z=l2H~K=Bj&m)B`tR_s+E3Rn=hx}_Z&mz~qOswk;gz6a z{)_4|HlJ0q-2aEB`~w%ujhm{=?rGd`76(ZdNQ$5WNlh8sg;{oC=Wg6_-l4AfnBDe% zWo334d}QPt3W3`7(cm?LM=gN^fpdKD6fy`VoY}HSs+w_Ld)!IemKm39x}sA{k$Kjm z)OhJSYhs0jKS67y&`LRR8W_z#P8lAA^qg%sVY6#ACWwqnwKaQ`(J>u@$>_sCtj|dk)|@;cu_?Mz zXkl!Ln}f6A2>3RXeqZn#7<%yUU-yOhy6P64_KIl2(ohD#v$E7p3~v+U6^u+|KT2oC zEarNMM9HiPP*2YBgx1i?1Xx2e>qM5Z{PogF~Tv*w^MY2QFY};2BQ00X zk!;tv{lx#ziTY<%IkPA+6eCfgeU=yCV%b@cdrHV}Ag@EOgSYLQf|vhO1>45?^*c>y zng4V?_UQPymdYP@ReQ~sh4{?>Wf+8cn*V)q8KrEAk=M=+Mw6r0|8(|0m6|dDzkiy8 zB>;ay&wMK@3}Q4qoU{7=-*w|CUK`)CjM4=y@kQ}QDzy~4U9Tl!7CckB8XV?F%2C7&wxwo?AM{xmFF5;PMBO=ug#Q?~VOmnFde0Zau)olF3D5L67W8Rf~q zS7;a$w#Lw*K~5ye_%*g9FzG$ypv}lv<>fb!WD9qi$T?uV$P)&$MBunTipQ1uxnG&- zgX!!IPv}@9%pii0I@yM`TQd(y#X!BzL(uM?Wx}*xq9+7g3g|jt&&?>Y5#Vxs4;zma z^reA5Hjx*P#)?3vj4HcZfP+KXb1BCoNSqqG?hlU-FuEXaPvm0zkG60P@pK!Hxsq+O zprlJm-UwkBlnybWugF!YU~6UtED7UZH2@>)Xd15U7EN>D3ikcREBH^O1o_yVX4=zH z^}QB@pl)n!FL^uoYE!9EoONT&(4geCt6#M|R@q7-^?+$dP|zfNSY;3}QbOyKhZg7D z5MhM&8rb2sTb#Q8R3w8qdbvHHfWw7@YGV4DM(D|jbM2wCEbo4Vu)Lz0~LHoKKjS;nH zujuprW?zQU*hw%$kVF51SjJWb_&S!puW8bh{w7MYIgnPdnFscMPG>lp!T7kkERE}J zDaXtkmaR9IzIL(l-HG4yAk|l@dyMmF)0YDTyuT$wuh$XbzYH$Z*PrVBaUFETb-zST zY$u#yBfYw#5BoMPBML+f57}WUTOeL#ffE*~FdK{ZXJrpagTKR6OwGCGz6F(03aS}{ z1*&d*Rs*^RS0W{NsJp%bIp76rZ1ra>*uvo1!m`(C>YJ6}lL_d$xeYJ>h0*QT&| z&o2r1d%&n#_{Hf%a^sFfv`kV4ML(hztiCs)?att~%gN^jDrmJM;I6 z@W%m6w8d%yxYl-ov1EXTWTu#)KwRSZ(G_MC`c!lB=)AZh=>C@(3@K)iU;k3yKxXd#i+6ztmvl3XQonhQ0mVs5$p+$2E3-Aff> zbz%BF#jjcs#EBSIdgpfl+_AtX`5@}p$GsEGy(tpqHZXYfM%fmrY}(&`oXG)#1Gk7! zvd)onI4h9XL&pM2K^Vb;y+2sGnDBuR8&VKq-2q9Aaf|~h=51)@nXN@oZIg7w`!ZE$ z-?$IK>;1@C?9^d;?&Q<@67eiaK9v?2wLdje(7{w%h-%pYlZ|P6x*^nDVbBKmfll#$ z%2Ej=@1}j@U2@HulscsRFHa$_34D{46k4|=1w*Mun31-aA@ZG?`ltXPVE4!4DY$=GOs4pt@({Y#*tE=b{Q3#ajn09P;Xj==(%vZGC`K5bV3mQj4Bi>{~*&#u6}Fh}JYgq28&M2y{1LnjNFQ`Q9NbgAhJ`3QvY0!eEQleOVjhDLJ)wm+Pu3J_Gk?+yXCN4=nBK$yc<9Y^4b2wnzOgdsjgc zl?&usgM!H^=pt$x0#yK={ozxuQlXaqgl!5zK)A4 z->uj+Da9>`E1yD9Unp(Zn4pi(A7eBpZsdzpZZ;ms`4?NR0} zDIYt>wwYx^?m3Z=BLwDPUGwhGBnVmnL}mHmLco`tp)dNT-aI>mR8AHcl$ucjH?W?J zU1Q1)vRCtlnQSWrU2UiwCXZMxKQd9=w%SMZZ0V^D`*BxM#y3^BhHYeAj$@)-e-gzv zUJQ~w^#@T@+$%!v)zV2itrJLF78#W_QapK6W!DjvTjNXACp3c}PC_g~ID>I^%-G!U z)>6zlo#pi0x{8l3*AX+ae@)ol0gQ6qp;$S)7lzIP*M!MBiMo1aSRlnCM0jw>^oL#T z9YP_rG#*3Q*;(JFCj?8hks%&5bn#FrJ^_@`i*t}CG3C2PYsaW}oBDK4EQIb_kNf+{ zpl@B~!y>flvK=Sts9t1?O3b3RuzoYiG1;o81?&^uoUXWtw@3wW2CL2RBxBn6HS@+1 zZG^w)m5=2-CL#UGkI10NFl1mT*uML!jjVzGv@dbZ!0D&HhJM&h%tSqT+ouW zu#cYDdix$5{0p`kr{$VW@BAw^qjdSErM+#;@-vI8+7fo#0j65<^>h76#sajjS3ZOoPb7=-c}BE? zg{x)(&S`?jeSzqm1~l?8y)a&>*vo}OLv`!{qQP+y_BESS$b~dgyWGVM2*`5HAS*RD zO_U_Q5jKs=KJAV5^Dor2^6I$0c%hh0r6RI|1b3Ih4d=OtyqLjrEA^?imbJ~C&L4m# zQi)sP4TGPuBfzOY%%8Hgi%a4T1BX=GCAj1CG^at`!^(V<19HP1KMGAkGOBGga=}dY z2;&^apyYi(A=$H#LsAqznfnZdt08F~!%NR_N~C0MwtJP&V)iEu9R&GNnLbsH6G}VQ^?P(LOxMRJJurYzCIL+eOK8<8ZRtjUu%BfDxaNO z=PLBG6@AsTB%u9ja<&J}_dI5)+SR3kS}L#biMWOaVPg?JAB5B$>hPfsq&pJGxTpX{#akcrN| zNW?KLKu!!zUD>hU1-lTCX*qen>s*b6|610)F^DL%Ae;P)3P@1$7g@Pv!_a=Iy-O|( zJf_|-WBGA^8j4s9&ii}^J6$@3j-O@M4C-0@v1#jA@CM^{dWF7yfK5CuHCWcO9%+G zjQr#z2HdnEIj;m?&Ndf1HM74@boIcdjLwpJ+?NOEc#g5|#z-i^kr!e3F85swux2Nq z!o2ZdEEU!e-d4)MA60hgxFZ%t!J0`8=A}gW!MGt+!0p<6C;I(sRAAAzjEw%z`xf!< zp-!*ZcBHeKIe8}(Khr_CB=iVGEIxY}Kl0G1AXwr(xj4DWR%X#36k{(`V8zKnah=$dp z%hcSFz(55UqWBEZzH11~_=-N zq_G%T0{KE?*MB;J!}*u*&6ImjaaJFP1(S)@t$y&5Z)A0Sto#aiN!;M#^CNjogZMy$B2GJNb0t zFek|}h{Xh}EykNLH;CwAVS9DwNJnSm$Ly@mG6+7>dV%5_vn5)x#^85&dRLA_8Ftu~1^w2(zc@4NM8*VQu|w(2@^YY2uEpK`3(*4D?#W!*ZqG zyfQ(kA>H;{-}FsX3ke>#?DUZ0o-+FlpXIu<-1YO$0h64WIVCA3z=Vhk0X{#i^V-K+ z=M%c;1zSy_sBr_M+@bP9pvG;cWVPMy9)3(uG=8p;a%nb2+7PP}?H@>vj=E6cZhd>Z zP1Dyg!EV*0iJWlL!mXRT9EW}9!QVHNzjo$l<|OF*<&T89yf=zvJkA=d8_sN1fJaY3 zSfX|*LXAVX*p-hINAz1MNoih6tZS~Osw=I`2t<3>UtyVN{nu1cC1-o0-$W@`FHQe+ ze3Hy^anbchf+0&ImYG8kPXO6WxOUTlm%Oj{+mNRja^I-J zB}sDNI_#_cXm8cdNRKYy46<;l8HNF!r@fN<$ttDW}3Vm#mABbZ*7!x@?n28La<)=m=$ z)_K)qfE&}o$*|MvHFhRqGH^LkLtHw-3_lc4d?j4_564%U!VM!?V16& zw_eH)omgXv1ny;^t(NBSEUPv8VPwN*IQWmGmM2Ei`P}>s@hnHmz zR4Lc(TXl?dwLyq!`wJ77*Pj4&P*+h_#M(g||C7)He8kFWILtR_JNj1=w(xQp!`$?y z&@JEdn&BFoY~9V+ZnUMiEH&7OUiGexMT2^Tc11@y?FdfAM6FFcaRq1_GO+Yq zHpXdI_5ALe1J(1PBk5Fc;DYce00ZZ3T!rn~*87v{Um#`Z{8XleL&QCIbKCDt6~qa8 zxwaQlTjODS`{1s^YTa%V^0Fifi7l=Igkzpq45+s01wbmPaA*m=C)N28`@v<^S0b?L z-#{rJ88wVt?^&Kc==n_<^m5*WxTH5yg(+a1!vj}=W-o=va0{iIMG{Iv(>5qL{peZ7 zB=ULlFm~@;l}E^9C8Jmy9km}aTjY&jN@^Bg^`TSF=^bv!eEi-V?mbu9s8qM~@H*PY z;F9nqO=rpgdm_m7Gljsvhao=5>)U?7hNZBBSYLFqrfWHF=8}nztjrUNQz?J$ z8MwbK`;NW3;vVM1Ep04|^YBVYHV~2EFUN_X^iUan?5{1TFAL%<(!2=}_?PPE#8<&Y zJW^8*UAuFao>h22#t+v)T4>UYap7;JL2*QfxCsx@MIrBEi9=ORZMxuqwAdJ=G4ak; zaHh@7{FHPl$Nslo@RUeO{L}WGzqZLAf1P}1m@1OOq=cpn(H*={SSWb}uq_zH#L=3R z&!I=VO&Um(Cv>H*rwwe%f5Nyh!A@0BVeNX;@tCVZBlE}0zaJ2@3;Tn1*X|)eHW$bK z7RhmFt5&V-0xu!ACcO@^FFq$HdZbMbb%A9Kv|WhZ!$ zWHOL*^)X%5cP`IDR3+lDoUBOtw@f76{2pH~S$I~}x4nE7W6l-l~pd5B04JXcJeV)DwLpG0(_qw5L1?ed8{l^o5;=?<8`N))YI&F4!HyRWTCfJH8hd|yuJNf@8!()NtL7iVA`oW`T_>^|Cr%fG{{?Xx!o zUv$MA^OlM>&W>UDC@ZZA57Z~G9xc$6{RzL>x)YCAW)GQ40?eO znntEzdVDMpn)GDv0KYny9c~PpxO`#Re%-IFQLoxvc6+K=4awDxujnY=)5|ZZ8K`2> zNY=e2K*1q-j`GQb7N5aZ9WW`O)FA(pTO2SH0K{($oYdc8h8w7Eg;P=)jT8d5?=p8K z-cpM_nQQGT3({J`k$)0k0`cKF-`fzBRPW!uSaE$}1w*ux{QY~3f{w<9@|DwXf7KA@ zQXg|!&Ojd#p%Y(m=v@`e*&(F`C30-y>D<>0CDY^ zgF3*D{US!vM+<1&JGG!VMJmq}&xZHT9*yHM2bp!@oPOcJ-SIEM--Zg4?FV5!ftiU3 zJRy7q{vv3uwr(>2{=ig~q6QCXI)xWHdGGgooDU8JOdBK@yV5DncDl|aI<^Ma)&L9X zTfdIQmzzbC$A77Rwey3yHEmk6Bn0`ZpySR@V4bS>H{Wf(5L?D^5H+K>wM7aY=rpQ? ze=v}T>_pJS>``|}rIeK`8@cJvK#TWuWj84>c~@VvPukxORXb=2tzKfK!EUY^a289& zG?gIB$2t%<-QO&P9E^AZ_r(th=2>&rbz3qj>z|}{<_c4+MHk@oyjg$_uUCc4%IL(q z{o_^s;mA}%dN4lVpn$-}`5O@0Cm54dMcM#1t+`f(eH8HrYc3C62u~SVCL8rMWrDLS zrz~5i0Mj&u85L2yI(rq8cHIh#uiB~weTNNFuMZF!oUl@y{xYUk_=Z87&WX^7ZamH0 zdSR%`4{d16y?W1!$J*glMc;LP5r_?VgY1->?b4|Uc5i%@g1^wrB@z2-Hdh-SSVCVS7zz{#9t?H;3_=vX@qw`au-t>bT^Koj*l|0rGLb$6j6o7>T!CbGROhCcekJWxd z%KqDoHX{W6s;KWw@8zJ;%NeUIF9jM{zz5bdon#G~2{Q@(Zizk}+i(6BdUCuUYj`{bu9cAYlkm8yvhgt=-M#E?^R zYwDkE`JT!gOSJ+w5Fw~=$owk@%YTYX2VDwvhnd{VcjK$V7gr6Hkw0A1MJ8$1P}R=F zZ0K+ezCC~X>ka$`fz6ma=*usTcb^4UlOoW^IEe<0`fbZ<>CGR$3ow9x=UX89v_t`n z#4$)|c(w2&bB+`sEyd^`b@{Mj!<))(MXN7WJWW35$pMm}N%_qquDvXvfC=A1w94C% z?X8M+(}7zxDLeQa8GZIZzn}wvAT|B-wupUSi};j&1HQQL>`yA=v=&60G%Q>)KyPME z!$A37dC2q@>!{tv;1|7mp_CqPf_ic@ZJ0zeUr2LpdzGiZ2o&2x45*!KV&Q1t#B97Q2cYAuD+Zh3qAxYr$)$QcK7{$G`_g>`TWFh3fcJ(gM8R7H zeQ2i}D~_aw5`29P-45*q*=GpT6Tt{PIlf0ycbbh?iSWC@9e@WwD8h{5(y5#;{e?Z>eAOG zck`!&gz%Ps7RL9#qVM7x+spHW(HP}(jH6;iac`_hTLBBBuWPAqEtrt#)jz(VdV-OEeCL2m!kS8< zhvI@oUo9g9F>T-?Ha5J=EGYE%zBafeB7X{+4v^W-a*#C5BRf@OD-R(}7f+kVx(ie3 z4%Fed@h?v+me@-^Vg)Emf-(&?K8x@ps1G1H6+YdRnkK zb+4SHjY|j7Mc-JNS>bB(8IITnEs#h+J}7=qTvd#65Kc5kWt_DG+NI*qv#hU;%$(fA zbw@@gA!46p9VxXq?UUccu+xTL6`*A+PO&#hI?Rf=6D0*=ZH8O*M={L|rc_Te zQg4jN{nt5{J-F031_l!MN~@ z$$VrYdwNqg!5pBhnEl46)#w-pnPERlC-FK2o0>IP;7JWS2p8TMw=so{n|nRZnz_zF zB$lqB{T*p**kTlHSBLDA0{Yb{7w*HT`FjF{4az^X9;=a)y zePfR7_GHHZpxaT7E6Mj~a$^=pp^pwJ_1n4`7#3}4#8SE}_MWiBmkt_sx30l=e>I;v zCUh^hsn0dbDy>TQu?{VJDY7bO(o0w3Gq64N}*>HFzj53bN}Wm3Ed@}CBEk- zdX8yuPMOfnMNy^~`Qm@)6%)A#OB%J+|Jj88t}b(5HHRz2m)X9B13+okKfv9usxBVW z=q-4HeMcorF^9?8BfCOQNd~GkiQPk)ltk40i$nw(j~kx=A%O{#21`c*a^8H>n35WF z)d5JQ!w$!WTO|`}leH?67iJpOo6Us_QyasakurY)MM)hnqIUo+E3+XFlP{O_q)p6K z@zIp_e%6_O+93ZWMThJ!S_hr+gu~Yhh^9MubJLQ>=!)l(gqQ9Ty6n5Am-qc<@5oP9 zdeodH8T7vGBX=KNJ6a^497J^B2#5J$G9yzwdSVfE6U9uHZ#RtY1=cW1va}Sqz$Pz$-To)`lh# zyA)`CPH_jTK!WBOX9gslHUtvBt6KDcs+~S-yqglx>?^%O%u9N0V=M6Mtj^T9M`%+E zfGlnK(Ov?&@mxbpsE5q)Azaj+b7;-YX%f=MQt=FxVPTVvSh-uKsqF-jd>KXcu0Y6+ zth)XhQTDRn{8X`S{s-+8vIf88rmX8xUkEv#A_u6|*WZ)dOb1cImnBGv&)j)_7LNl^ zQGY?d7?~nTbQv--IzmltjTQ^!IeDoY7k%g)r{fiq99L@#9~WDyDP$e{Htm?b6x*0o zEm{boF+tDaZJGKA0u_oyt=^Uj5~TV!VUe~S6S=gf%D6o|{1Ts%#d)>*sxut`e_92^ zxB1DHwN>34UU!-CU%QpE?wsQ41`+sj6Mrlqpg<%l!*EEc&*NVW9qYCxDIh`+ZJrdJ zbOJg7AVX+)y4{tSZD>M%bG}NTwlxLU!&)8wF$=HD?Z2KkHF(uzbaj`}{~7o-S=cbyWFEUlors(E#Kmx1f4By4OeC5&CDVd=1ZfNP-Mb=4m`}J3`hu z1N^nsttdx*xEnw9-@^mgQOCjcd?=4`5Kj4qIShQgyt#jrs5?6)a=eN#_sA!H_q3}A zyX{VvqZAHc0TP6ceIi#xeSzyOrPOE#342~fXuAPIf)76Yqy_v0yTJG7n&GxY#y=Ks zV4yYG!tOeS2gUd&xCJt3cV>FTp?g*v%ShpVLMxAX*$OwfDqn1umZU1iZ`ms7CZA5w zS8klCu8{{GN-8c%)(Ps}L>YPtY|`Voz{(oK0QqL9ttv^~>xqTyA+>U`CK4#vsLrkJ zwZHKUw~Ir-HtfxAV1JtQ!l!TUet%w~I_Zb#9%!pDVsu|Y>s6%H@1?|R%HRvwdA)ly zpK~mRMJ33Op7CGNHGpU=z#Gg=I%j}NBUHBXi~xNfTael70&jdA&7RX4?Krd#J>1> zA2c(M&ySnWnr<| zLLx2CoByH17M3*sXZK%p_(*pAL2;XyNkh5;CIck;#KZ?3+ZIer*7a1|&X|Dwk0b8a z_Y(G$qTelCPw-u1>u1wcrXLHcsvqEK`6BS^~@G6=vN7Q%q}S1!hWeIG8H%RJagJzI^g-|vdh}MG~?^3>Ngu%CcnYW3@{Ea%F7lEjqB&E6m#KpCs#zAN5AAo#a8kw)>K1O zj<%VfNlK+`U_VP%Fe4SQnkFCJVl6(4tn`x^6VL2%V8%Dkb^_N3Z;B~7S|iYY%X04i z=^$^Mx?<3uCFR-X=j&CIA{*e5Q_cL5Ct^VJC^8 zWlR4#>gAD90Tn8#Pq9cvtTu`e$hj(ojwaM2Zh8KJR{_8*G-%*)X)xZ$GxDKx+=iKW zbyfw5OnrxKB-wBSoN`q-3srd5h(WH-!;rR`W^n7 z{%K1^ZR;ABoswKSRcIs8)zAcJUL42L1*Srm%n%Uu=@P zbzJKXtwIG^#U-iVBe6gInL@FZV;#@ulEZHI)@wn!IU6W&rgNrW9%D-rS2To#TwbOj z5Frso_G@N|3oz(&i@Zf$uVD(ZP26(gKmnWjYKBgjdr^c5s`%CXASBhk0jK!)gsjRB z2fdsWb!&sEDb%$np*=#~&yc z9j)}x)(R!{5vJ%VHg#Pu5{c$vhY3(9vio~-#hL0+Fd!9dY>oJR%hZ4HPCG=Lz&}1sX8!oTH0x%=914|7ee?P2t zpBnG1+|=l-TlzS5&c5Qimp4_q1IQSP6#{heFi7Hr9C!G)`@?h5qy$=B)1P%MlFQOL6>nD}HfYX4>+wYbCZGJtX2+nvWCYJz*9?tn)wW=u5;=Nz- zLe39FY-IT~+Z`jn(3Y>rHECR{_iQUIt6CyG7Sy@CqyHT7AI zMYmLJ{U;d{aVmwQOeR(KYFWXE(eypT{7cn<>pzK!XJkqTX7Bt?YoTt9nR%}20VD1G z$msm*24dE=m!M<U>6C+whT1~Dm*6p@NzlQKd*Gzn}x?~WN-QdX&MBT_a2JxC@iPSKAh^UIu$;L!Q zcl6xnWg??{z*^2QCnF74ujLJmK`Cq9k%*IedLLA<`KyjcW*sm74s?$$2K1`LIzH^B zRpbo8`S!1=z9#0c^iTjh=!^MW`OTnK4-hiJ$odKKbhOUe9g&Ng=Ae<=?0LErEhj~a ziq~_eYQ^ZWp7p&6^)y>-Z4n2KBLBG)**vIzuO!(4@EEXk#sC_{>aE7*2%4{_)}h!e z2`X3obTqVx5Jx%N14#0epL1`UFM~T?2tFiu>B2u2Dae0SkA-Wd`5oXvW-|ulTA>EiFL=3ryi%>wRs9;P%S((omX@{(Wmy}UlTV@)Y^%0KElRoPDdVl0$0@5TK(;wI zy9bHuRw>Y0Yfj^q!r*w z`tAnx0>T7bo);@A?pQdk9bXmd1`GQ`Ho#Qfb)A;^rC#V$LEMbgNAi%Rsis%aG66_r z26@D=zUZHkvZaCKix~`E3ZM5~{LXGqlaMeH0s4~hD z9-KL&&JSclV+S4!?Grt0o`oAaDL_DmemkwW6-&9o{+$*(K7tP0$bMYapJ0Bw7}Hz z=ozGkP=$%KD5>H+5_-6))aRaM7aUCp!nwVF>hN_0jeI|S&@qUU@7qnFvHOv<`P46_ z+Ga*V-U{u4%{pdl`_cbBBqXwn;0TyF#)ZfJ2~7k*g}SJ5(^=q#I!Ai`LCb8IwGj26 z>j>9Y=*_TNC!X4r!iysJpcO0$mV1lxDzSg6UTUlVH@iY>uS%^nYwqKH2$jjptf1N; z)urqC_;%7w_mcCOd;Xe9S-Q+l6$tKxrM2WF$A@)RQ-^>#WSK}zp~d&F?Z0%8^t6IY zIGEW&o!FZb?FI+B9{x`xVHdvEP|d4g4T+&M>US@fb$x8nct<*TaJoh1lO`A)pC0c~ zrv?`bME^QXxT3R>{)DZ!-mrKVLFn{xa_5-bs2Lmnnv5LM)<~Pai@QBL*(Sp-XlD;a z!9!Pf!ARzFmiMazNL!4!4QwBL*LQxN$$TJ~eFbbH^Ke&^LHT5r`n-m_NJ?jSFaw73 zOk{;= ze!(BHzgExucI)V4W*u^(05U=d?%}An!sVDg*NFPgQcTrTYO{DS;XrcKsL~UQGClqe zAJ={)R-bz}hi058bj62^rhd>)JuhO-E1$;)blJMTbd!Ac+Sf#@Ul;}+DyJ}3rrDKP zN>6GTb5yC@@JRM7wQ({7y3;M@zRsG*vT2@zcM88va+6*+S4--UrIRWPh(Ez#0{fY`;sHUIWK zb1v@Wvm#8;hH4^9=HO9lGc%~XAu^5nw9@pibFY#+6W`ykgw>k-o9)QiF7T8d*UoCy z(bww+1D$4Y^_xhyN1Xq_f-01-cqq zEoeBPE=;IDBQZYQKn!8x)V!O`OZXvoj?Cdj9}onmB8(0kdop(_GJ_v)lp5l(*_eMi zvIVAOr^)DE8u4Q)$ll?>0RhQPoL*!})=t@}rPbDLt10?3UEgoExH5k)?CqSUky8GK ztk0?|loFQ1{-PzExjKCn0T-O{OfSNWN7Xv`IUb<{;Tv$$6ud8y`uTjY@o6DeFih%XlnfHJ zeg_zp!sU&N_?$q%XV9=Dw22|LH9=~?;mRZGX^3A*Yf6VL!2jjkyBwk&hZJ}6jOJ)L zRhVDWCI$nSu-sXLv6MA+^4&;`{u0B$K}!)Px)$fK?i+fs+qt5hYDLhk5Y9JF=IZre zLjO~U`k{-|d7uVz5Yj*~wPYSy$1PCddy3ASSE54p70d4JXda>IYsQ+0fY^ekzX;&5 z6SEU@iO^(7NsA^~#(>_W#6fv}PgRkr%1A+Q|EpPGN(1Eqt1CqNUb7WUyj)qjNr9;! z^9j$O6E-9$0|>3X2iE;4`6F3NUdNxgBq?YZ9J6QJV4?8v_Kg&b!>plrf5fb=?9>vY zWeTn8EaldZtY-6Jq;V9bN4k(brZff1^(4=UuaJ?X940rqU)n#nZ+`1%8M~t7RePB> zjW3l_Ppp##V0ezozaL``F1XCcvSmWHym7g)Dw3?|f#c3o3GG^ zm;M707rkwv3;E1Xu7MH2(R%MkbUsQf?OWFH28A35==T{Xa_=LJ3_S#@Em)kxf!#&` zt}Sr7Xfxe&!|)KbvB*u=!g7Ejo$X=KF%EQ7`u*jF+_O=6yT@_#R?s5wWb3{? zp^?#eKj~>|3ScC}8#eg~h&m#o zQGnz>e{!1>ldVO`T0JiGeRcP@&Nq z_<;x%rPf(mY%1$8pPD!{hmep{6<6ipU>!EXPE~bokK+bx@yt3thuKu}RI6_^5f7gP)1=wTPGrv<%7Fv~z{Th#;ky9JLCVAVF1E_AiDFm{4kDCVjN z=N1iG5&OX`t$LX(_gFFNqy81k5l%apnd(%TGC9`&(= zJZA`ktRdEC|5_pclug(WSF?8Vyx$9L z?4A~S*P^RGHX#U#Q)`IfP(JthIsKE7YPAzo{eVHx;yTuNQ9Z(ST!N!8qZEvd#a3uh1s%CmwjwV1I+mVYLO6sI zRE@4UAs2sHJNrT86n=NKgob5i_Vb zf`=IU{{+?qDf%gvUo@h)FH)nO+A_ULATya z`N>Qhken-f+t+WmCTpXI;s`8A9t~*UT3_n-9t32MQxzG_9Sw>YSD3O8g&5-NO(qXD-|oyom$ ze0PIBSBZ}O_KPdi9s#o8+{(%(6w9LEwMokm?!E!AcmH-bV=|mqG5clN>i!W1@fFOv z1_DZXhDM#^D7dd-1sKtKm6y3leXl^bckQnpYfjCp%0sq7SywKwbCBfO^-iK}?u($E zmdpYmEzqkg-wPZC|j-t&qrId$f0OMI~-(5Jb!(3jc; zyPx(Lt=g0q|3;`7k_`aLaU76$)#;Qg&*ag{jbH!(BmVm^wR@Z2VjX)r5gY3>t~-6s zL2n2DL55Y|p$R$Nw_7!68LT3z6vG|QI-vEJn4iJDeTrFn)No&_!z+idbYaikq~qJ7 zyMZGLIy6E;D#DfgcXUe+7vd6p@W^_OXhK``IYIiWii58xEzyX1cn4=9rTj60sL~84 zAD!JDg;Mn57GjnMbEpdv0~C~L(% z=@J!GHigSmrqc`jdugXHp+6?>Y7?~iB6PT20h1M(wLg$h(He-J@ic50(tkfC$ajd4 ze`zeSrWR^5u2wJ9;nwyIY~4q$X)HN6n5!Fa;wen< z2W*jjq+d~=U^(o>!(-j=TtjXV3T$uNH!+tyiQMDOXA3>g*Mot)*JpmB+u z^S1~DLz|X_HA7ro3S)uF1?^$A3>c6KDKq!+cEX>YehuA0^54;?37CBz7enc!{;rRp zM3MnPk=QrPuVJCuyql^bKllD|jEbBkXz-hTHOV^4#kZRiGZ#l9QGJuWnkQ6A(v~rT1Jow9Xy^^Qsq^dVuM+*Ip3*l;Vg=-dT>xjy?;3Gl@;q6GN1#VOnUopWY+dV^A!H+d{!bk-200000 Db%k9b literal 0 HcmV?d00001