From 0641107f4b361568947255489aba0a609c2c5a2f Mon Sep 17 00:00:00 2001 From: Win Date: Sat, 3 May 2025 23:22:40 +0700 Subject: [PATCH] Uploaded most of my stuff --- ...curity incident - Thanawin Pattanaphol.odt | Bin 0 -> 60612 bytes ...curity incident - Thanawin Pattanaphol.pdf | Bin 0 -> 70508 bytes spring-2025/sen-107/00020/a.out | Bin 0 -> 13224 bytes spring-2025/sen-107/00020/lab.c | 243 ++++++++++ .../sen-107/00020/matrilinealDescendant.c | 226 +++++++++ spring-2025/sen-107/00030/a.out | Bin 0 -> 13680 bytes spring-2025/sen-107/00030/lab.c | 177 +++++++ spring-2025/sen-107/00030/orgchart.c | 337 +++++++++++++ spring-2025/sen-107/00050/a.out | Bin 0 -> 17688 bytes spring-2025/sen-107/00050/cmkl_book.c | 446 ++++++++++++++++++ 10 files changed, 1429 insertions(+) create mode 100644 spring-2025/sec-203/SEC-203: Concept to real-world security incident - Thanawin Pattanaphol.odt create mode 100644 spring-2025/sec-203/SEC-203: Concept to real-world security incident - Thanawin Pattanaphol.pdf create mode 100755 spring-2025/sen-107/00020/a.out create mode 100644 spring-2025/sen-107/00020/lab.c create mode 100644 spring-2025/sen-107/00020/matrilinealDescendant.c create mode 100755 spring-2025/sen-107/00030/a.out create mode 100644 spring-2025/sen-107/00030/lab.c create mode 100644 spring-2025/sen-107/00030/orgchart.c create mode 100755 spring-2025/sen-107/00050/a.out create mode 100644 spring-2025/sen-107/00050/cmkl_book.c diff --git a/spring-2025/sec-203/SEC-203: Concept to real-world security incident - Thanawin Pattanaphol.odt b/spring-2025/sec-203/SEC-203: Concept to real-world security incident - Thanawin Pattanaphol.odt new file mode 100644 index 0000000000000000000000000000000000000000..ae57b66ba7c5256725a7aca55e5af924fc594331 GIT binary patch literal 60612 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 literal 0 HcmV?d00001 diff --git a/spring-2025/sec-203/SEC-203: Concept to real-world security incident - Thanawin Pattanaphol.pdf b/spring-2025/sec-203/SEC-203: Concept to real-world security incident - Thanawin Pattanaphol.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a5159d6a694114907796652959d17f77d6ce6c2b GIT binary patch literal 70508 zcma&NQ>-vd(5<;`+qP}nwr$(C?fq`swr$(C?fL$blgT7!CYifR^<5?PWUbZRqzWQp zw2XA@P^3e}L)}BILwQh41PlcBMpjTfJoGZAcIGY?1kC?+l<37QZCp&9=*4UdT}(wx zjqOcL`S_rmU7Sn}ZJ|7JYP7eaNIDRG@9N6Uh1ZIODyC6TKvPvy*GHlCS_j}q;d{87 zrfAG;;EiMcc9kfEpmw;bW|(AL)%A)MbmVd%D#DAnzRxa(POjSK`1^jJZ|eQreLvR> zIbg;B(}s$d7iKRRw(g&<%F6n_Z|_eoZvRQ$<;dad{eI2KGAu0e!B4CuVTku|N8!%So(SbVZ^WEn7s+(>ha<6*<9xD-#_-_nLTlHUMKNe9t@c&Ew zs|2qaecIFeeRuKq{OnC}Vi5PvSaDb`Nzmgmb-=^=ysVQkTp#Exh{g8es|vNFojjaT z)Vk_Th_Jp3nGoVQgf0-Dk!A|;Y4eDhRu7@4`Lha8l`O}o@t++h15C>&_@S| zWRkIRsWlLQM~*RA^f*uE_woLDe0aGMKTF!v{d3@kIdi^oH#{-pnI)SBZP_YF{6=@- zZKj>Q{f3~gy_LRi)YkCzFmrwzsXBm$+4TrUbaQ$W^8viO7f8;=&|R^f{=nUJ9o5Tm z{|uyobej-U2h%T$ra{}Bg`YUAyDf!7H0)OF=KW?y?%6+8ZgN-n_H_JHcg1~0ss4ll zGha{|m~E3VUGNNkPKFj=E_#?fy+#lr8nHa%pKI@CXBC2rn8LaM)nej5<#)|u)9KgD z@xvkVpv7P+8GsN|wt})u8Y4l~mx!C-?OlL9K=4z!>&kzq%E&_J(u^m>j`1^1LqAxx zQw*S#0cP37z#XobCILLOIXL{ck#Emd65kmW%_y*xG$y7*exNFye}6vHBP}L82NzAG zTCbf%uH_UzLc0rQ8YKzIsHiB!sO$i%Ev~zzabU~6J)YcMjQ2E13`U+e$8&)}%mQ=C zOPqa?8D!5DPeP0FilqWAYy5tZUxlhjxKDANE$cpGR?VBWXv0tcG*T5dBZy}Z7?bNg7)nQp={YdTfiw%R^mI<` zAQ_l`9ZO+$id=mwig>>ZDZ^*)zS7PkGV{c6XV>67yS%EtWe3aRg025{wc0$2O0|%=1 z5{li`)pByx@O(NZ{?VI|(_{lZ+^^I;pO|a_Ia+b1$yjBH{j!?pfi_4L)U|M~9~Tqs zAd+x={7KIQDy>KgQKkr384s~FKwJe%8_S*n<(3UlpBPyL_ez3q>%vw3BB9630ZN8w z@q>fc7)x^qSuhNAO}-L9EDD!e)|Wc7M9`o+R)DZ8kH`hmBTuK_MhW+=7+9Raf|AgM zXx586JF?slMygam_cU2$WW&ZOF4+)ai2%wvPr-hl6?*|cB(b)Hb|HBkbN6|kDm}$A zV+dCc=S$=gB;!P$aEQ>U-FmFUe$25NQ&wXl%rdV&PDYw2p^MoY4pnZ{mLpX3FNO^X z^IYwSKuecqL)qx<;Py)4PSh$RaFb?GnyIdfhJ%CswD}ltEs>;B(k9Kp8W_y;>LQ`- zhZU8{TTJUyY*BbdUt^#`tA8H}MR>q7i=&4TMnYdqUW>|v2wbEaz;Ee?%%aACTXhxr z1&vbzt8xOSA;@vpG*sBcN2dL^$!Jgg{Ih+q9;-+=2Rd6+q>P7tD7OGfP>`k|POh7t zNz6nF(5NUy#==91T(_>rpuS_NzREp0U4QQ$Y3mJ%m33V~l6EB};wV*ep0W`+IyyK* ztz$F)x?iVHBM?tt(6#5i13QWYyH0H^47_q^8u2i)eCpP=|DqH*v}=a}{WpG&rFAzBwuN zYX;C@0KGg$4mI1VpLMh)*aX(Rld0@JoWc^tKPJs~xo|uYwA;q1Ge^AIaHfz0Xi4j< zWT7F+2GJy$1kmp^(EIg<-E(wg6=x#Snb;6C9jD_4l+;O5LJo0AQBp8p8rA&3F?p6z z6jf1~pas`P_lTt-Gg&yNYEIfjQ&=-)@OIY%D9lvGWM3ne6jFHUD9fo4fw<Vq# zm`dLX^K9wDBjT|UVmJM1Xzy1nXbtj&+ZyM_XCW zB*zRGMk79&gs{%oL=9-}+RJ}kXK0)!ox#Ty{5P38HX|m!*n`5#wg3?DCwd~WSSpE3 z7NQ@PD7=WSBti&Zr5#ys-wm4N;M#-p70J}sQrX0EmAR1Fpty47JLbC7&8>EB^|rRhB^zN9z}E}=BP6s8-($` z(3~K5-URVS*L>AKll?g0OO1zirukW*CJs@amMLHow@&l6{D5NIKl^`W@~X4e%2?9KcZFkSJVUqk10f z(cK0UmNv^URT}JVYoh<8O=qzzcaQFW4ZsEHBaa-3U8W8KU{f&+R+o5@dao`ZsU}A%d=|A&qDUh4$PGn2DlS8><9Au&d(!2-_7HtxU`}I#&7Z3~Y3s zIK%#wb}GISRNmMzmX^y1mywY_C%dhLDC?NKp9!Y|meJ_9aSOn8?JfX>nx&%Il%9bN z*f)nn(~Kub(h{(#wXA7hKdpFScTf+8!#2v8M~bM96k0f&vW9p-{BUoeObXa{>RSh6 zWTqyy-~*S^fHU*^ID`XcrK&T)oP#A7s2PQc=qQTP^tPmd-qBkNa^QGtUq_f=(}!5@ z1gVA0ityT5-URTzL?S5$3N)P$K!H?OP$971sS?c7SSq~40vdxRxq9p>6?joNW$78p**3geUK261hi;7=>0qu$)y* z)MU-EDeMgpBN4Q1w#SO;FlY7ih%#DGDW_tFrcJO z^IAci+9L&QDte0Mtxs|wRfb4vs_a>Ua>&Bg4up;6kxG=Fj*UTeS7ui6xkx-Mx`ute zUP93%1^5QDPEQJ0Dh8NDL$oS0pNa~~%~`AYZV;!unik-@c%>J& zht!o9D~>+`cQ{Cj&i>eT9?FIYuGe59Bk85C2llBfezHPBUR>m4PqUk+~H z@3ls*4#hmE9;ekq%J{@_V@lfk2D4Zb1|&GfxCopuUTo@8SmgV;SLC&Jr~Q%yC0l~! z6X`&sN=@X;16r%m(L(+oazyBcDqC1~coTPawUNFzvWtSgNk@-$y*VxDwOgm@%0J#63XuQ}_PwTNA z{P#ujEk0+iY;NAOYd-F}2Lt~LDpPr7+eIJ$H#~ZtPdk*Uoyq?;I{#Jw`pOvb@ZMXXh60c6E(gRd+f`Uy3@{ibe%2 z;S)#Y_UP`F?c-U>HVL%G>Q#p9XeBSN?FjzrD}2W5?cO*!rq0iQC$xdR?J9fARw=DA z3!3T2_Ac2fm0)w3J9P=Zd?gl(UJ$TyW#=q142c}8h0?IF#*J&KgRYq#7gk=Hc|nzP z@V7)s zbg9QfMY~QK(g0|wCpk?r{$uAoViV#U z7u0hId+WF)i0`dI1hk^g0;Wb%kZ=)m^EnpJ>hX$QPlu+xy+jgvQ=4@3PkgbDBn z4AgTAGvknNhro)LUU*Uhc{J+XBe*5*5~PNy2pBUJeFnF=q2CCwNb)5EMm<10BW;{n z*v*VH{}$vZ(t7Dl<>x`bWpE~GVN+a-kCbD6ahbjxTZ>d9CQ#+0%J#ej`F_yVeW?J> zQxsSEw^DH9I&9dkX^4o7gK4{gW>7BA3UDC!AVzq;`ky>P14yesvwm6 z+>l<(&BaNxvwz(*F)L5D<(b#{l&lLQk0d!Yw~^t|#1JUf#cz0AEo4vSMSWiDoFp3QXRu&GH)8JjT;@r$?XOGv%s})t zufO;h@sCKUGX-1Q*(d0J>$y)0wUx7Rt7o1KR|!s+bMmb_&l8yO0Zd3Z6y_)TG$T8Z zf(mW)@p4n!nwqq*%!%zt4}~UjJ{u zI`x)+#^z?`=DSaPXBzOZFz$q?Sb{7_T&>M-RZuoeA@kM{hQ4F3gue}Wte1p-XoMTm z*kA0nAJ^&be@KKM>WE1&c9%OH58V7d1?Yq|panB=x3#ac+0uXN(et%PmUy9|)H#b)n?z=zXUkIJQe&c<%(qFDW{6}6S5Ig-tynQXc z(rc=FOTQ?$pdp7tKfb}jx#R4y^U260eg64Xe{}<~{()cYO|}9UbdSn{DpI$US&0&+ z)j9<#6|7ovW$ee8vS!gMX70z_y4_nxFQ7pM4uT|D(d0>?q9ddgi;a&iBi)l9(3K%p z&wqFP6T16p#ONI0zVMC2EI-%|XZ=0dnryy`jhLRyYjSxdunO%|I=} zw=d_kHvOT^47fRZ96tcXd||&LqUGuqn9amNX@zRfn$M&GquA#-pU`TDD8EF0P__66 ze~AEMLh|7Ybon*(K+kx>@?lQ8p4MGRWNp5XI_9)FB3U~5NaK3M+Id^D0~ zm8DOmu}gh<|HMGcA+&IPFUHFJ!EFr_p;L>f=e?H0TZ?edrx+^f3)AQS4&x~~Q+#qgH5;X! z{66ghYyoIPTI)gT{=v_0y^-_*d-=(@C@%!HnA-~c5qLY;Dtgv6e zy<&d(exyrPh%##fvSh{~?_LUB%dy4wnE`IP3i{%U(if`MBY-);c)fuC{Uv0HuMEDR zUbHAi`xXTg*>!)ApD_e@k#LtTU*4v zE>d=8>B+J$wJp8P@0IwE!!XD*_9f7yHcS6YYB6s$^JCHF_k||X5rVpbDx{ziG!5X# z2Fzv?{`x$?5@65AUhs24-=Eq!NAQCB`~mVp{ek&`@&zCcsK?&i2DaY=(r~Blg{}p^ zUwYSmH~psih5b#?Ndd1#P?b_uWL+k*LUyIrc~dYiXD@fR1m6+7D-hrJ3gHv%8zBfY zEF~3npiSH+^pyGZ)s$!zX$|zfIXqSwP|^#;T)WUx~8VAO+B2kr%`Wp$_-x;n5L z!**cT@xF)Xh1`p=AIKZgN2vQMun&Jgeh1N+J3QO}#Pq}N3;qlE69Gh0W-(~WgHnQ| zg5|9#KvSl!pg!0Xc^O!dhgH}z48bdkQzWlow*bB=Gj`$biS-Nk<@zD|QT`+jGb)q` zsxVn)%Ff8nT+75~v}eMX)=A=$Y&%Arh*s)q7U>l8s(JRiK)mQ$jAp8+R%{h?3%)LE zv|NSXzT}?2J4$cp4taLvp_nkPE!qX^te^i$>hXXTkddk>^}gsj$CqY1d}4|B4}4qV zeLlUYn~yHf!z9*|?Fkp2KD%#H!Pga*6z%;) z9v$DN@kA%QJSz{{jFnfWUt(Wkm-h!&mB1UYm&Pmb3-LImF%_@}R=q0`m@L3o;$6lq zkEBfWiSYusm6xam_Mp$V8v}io&lI1(v!H)5_rcqP);R+Az&t9dEm(Y~+;3N2k0g6w zTaNDw0P%tPgOVqR!7sxfnxaIFS;Z(BH6{4;6X<%7w*<8!vmFMUjKHpVTE_bHyujoN zWps$dFVf8zmF&;W)CaQ#g=!Cn0+O!+wtGa@386XX+kZo6nnRAG^;C8O-`_|-r|3i? zRfK-=RRL^%;BL>Fw=IX@1?TYKmQs2v!Y&neAiw_s+s{ME>R&4aQ3GmY5#D+Y=w?vF z+Yha|U+n|@`@?hi@%rYs06z_Elq*6IcDgmW3}9{n{ObX(m0JdKhcD_X86)Kvq;9|@ z44dNt()g8jfgR7;8~m~@N7`(|^NoxYs`A{Q-rA20XO>O?ShGF<$`I-*n1K$M#m*${ z_q@yPMe|w*X0qZOA68eKd-g2{8@-*p$S%7Rs9Dm_>cz4Zsw%|?|LyYi!bvUcNiwsl zAsI{oi1$V919?2}yT|QsOV8H_;D0oR{sh+14@aX-$PxO=%mcow&gymkG#`h!zXu3m z3qauwZ_WP$Y^N=dFFKrtx;%d->cl5m-a3!E7%SD)2<$BL4t(N^hnphl_ZCY~cG5ry zsRVtZK2t58nvzl`9T5$k5aB_KMF|le2-rJ&Y4=QL-ZN~|q%~9iCs=pXjMXAlknH*Vn;4NW4 zkNdrFe(~cj=U^eMEwXZPW7F4Z8DnQpb~i7&-_v4zs(VJ0Zdc&sE4#GY(c$LhpIZ`6 z-uCr&cQOX2yTHP}Ci{JAR&E^gNN=^(2chRf9#HRx3V&Bos z?MhN|qva=at9yR4>u-w<6Jz^_(dks?y={gpCzmJM%H{WWNml1wJ$Y+uSLcc|Bm7mj z?Kw?#zdGe?v`~~o2fbQ^WlLA6G#BeKa~jFmz!ABk&k3zAqjjtcbPSLDG-IrSJ;BMFY^)>fBxdGhhHw7_gvU>;MLf#L#_&~k zA`{km8^vhziN2w`@%^c~`$@gZ{^0txssCs?4p)*k!4d(2vri-uE~OjR6Bk zP^RgzjyBUwe#}C*e(d>J7=8cokb| zGO;0X2sEV;h83suiTWfvk7c?HbtEw)E4SwpCJv1ei8D4aElENr$P;3LBj((VsS`|t zcr!dvIf1$rG96MOtqkIDN9-Of);?SP7#Jczq#N*c*))3DZNR z65uRaJ*#uK8_lkm`N+<-8Pq+|yXe(-%KLGgD00ILeaa6Qy=DJ^wpYAusJ@?shJg)8~wmR1;X_G z#Ms*q%JMHLDZLBP9PS{1Y%GAg?mnZWuIbJrfjr4Dr!_3I3tENZlBc2LI&G@e7^E$`$%ILugpy=iN`(z*Qg9GVzFuu@BWByX`@|%Lb5Oy8)K4nwo}& zo;giM99TyQy{81Uj|9*uPPKGmstkC}9NCzU&;Gol(o?u+H&2lyWEQAMp)_B+X>!mq z6>}k)8TGNt6TNE6Ova)?-(hVvRNL924lQr?Pk&4shfklOzox(CO)r^3Gt*HA+5N)@ zO!Py`>lZzJox`4gUXU~)0Y*#=vUAQKa#a!E?&;-A%s1TU%ok~Q?Ys!&@B^SK4iz;u z!q8KcErztIV2wUZXxoZ95RsYYseDL|H%570YleHLg{o?jfof!tMF=l-I$u3zvVlhy zS)@iXQD9!JD=TA0~eY^yw58 zMP>FYrlp=sSsA%)%2Y0!xOl)bsY^o4RB)g>#yd(s8*F@&YHk0OUc|F%bqyY4m(w@y z6Vn$2b>u{u)&1 zz4!AgE8U0w!~fQI=uPbz_Z0VzyZ5b7%2&0Sw3D@!+Y10cA8wv_6mcuUcesJxji7eb zh_)pEgsMUq@u&7omHsMU*3&DTau2Ij96y0S-y`C$`|XLZgs%`zG+k63tqn~dy_e1_ z`_%C+@zDLk9jB5(`&?u%KW9A@*&tYMf1Kk}%m-)-L^p86@+WM^(s_fy{Kz&X)XMar^mA>;zU%M2 zbO+hxU;g#lA)9TVn~JnGxkH5k>}Itidi2Km0D&F!E4X+N3%(3k#lEwFJ&NJ4MGq;^ zHl|p&q0@elM3Qp<(rDREdkJSQzy~W|EFo89CE1+duSseI`dPbV?rzTLFfd&Cy=MZeP} zTC({pv=%MOQmLgJ?44pV)GV|YYqvP8X}_jRp>U%A3-CG%@Y<56=%^Wpn>m~L1-*pD zOcga45DgG9B>)Z-MPvK8%V@mpExR>qTF!OB zKhQ~-f;uQ)o)PQla-tdm$jxkwOoae#=z8kwW)R-a`X!%ic8udH;8_D&B?@R4Po8kh zDTo8L9H^=+%Xvl`Gtnv(=>FNmS|FVO7rykVkt0OElrjLpcg9~9|FHCX+XL~o*?n76 zVDLhd{q0toyhAc@GHn+ktI{P4xIQd^;Q=uslE&^R2)&K!dVmH6Hg!50{B6zF;^8x0 z^JQ#f$zZR8AQ_XyvC4$<9yWD_z}V+R{NH*qESj1rX#Hf(P9BT54_7lBTy!6V98l}CVg(q`?h9tRs)XOQ8=!(%N z)Vfs_E03_t04;O%bDseRRgZO4Wa~$dj3e&ld&=gj=qR4on3!UX%uG?~v6FBUqb4yn z?8)ItWW<(Lf_bZLSZ^5cSbJb1`QnnKUH=_oekBd1g?llT|nCw`&t7 zbq%Enyfv%`d`oysfXKF;3F+*Eha}vSN|LVtUu@FO)%`-~>x{27)TVjM7?{oR)7A5e zf_cjjSz@rUEIDCo^JlCY!dgV&23A%%teU528*B{o3@x%IcC-jGL4*B>VQdPlkk2gn z(&P|RSIj_p(Fi>u`KnqfTa#0W5bar|=EV@o%dKWa7$f*t0A@}|6Z@u8_FAOFi&hRa z1%C=!X|Tm4_2zfi8{ONvMBZiNyAvbag2eLJoYtF@SBqA9CP4X}v!vfN_$s-nJIyN1ffi zeFN_`Zw=R9@@gy}lcCs%tUroom_Io44hSWT#6Dt-@dSoh+LO8?H%p9dq7U5`E8U;x zsteYxYhvIVxt+NS+UrA&Z|m{Lm&e_uho?!qNMae`$TYZ6SFk?omOV4Z1SWT)f^U=g z$SX>p5)o#HI+S#_X_FM1+jWXsv{{8h=|(DoEtFy?;wa6BzWUQ0{|B|PqghfwXe8bw(Kw-sZubST-BXycgRnLN`YtgcjAn|kY zJdDk~?`ZjReJtV?v8TG-WgC|6#>h+!$$JVoEf=mQcs9;zEVLRPj^o>E>dyl=3c2C5ss@S9)4oYaw#F?7%R4*}ud=YyZtw@7G!SV?Gh?hp6nTw_|h)wwvAQLFd;VLOs zXcS>Zu*f3u@GJ14Ybx=ryN!MnQ=Kmq(VI}Juk8s|o-Kz1oMrRq=;`fiExqtI&WRX$ zAI}Tl+TX67?Z`VO%m_v+tIZUmo?iT910K17p!!(ymrft%m9gVxogy?%5SYt3@wP1Q zW2BhltC8-Vf*eoXi784#)Y=S%dV=gSu+naot{1Nt_06$bVYoHskp$uadVHj(b5~a3bsThM>f?XDhH`I36i;XW>Q^Rxpfwh;%MraicL}vn z?L=u)R#N=|?f|c%$IxexRo`iufmJS$QX3(_q!w&)~lo%6={`RxEl2Mvn-C*@_boKa0c=t6!JiSU#9c|IE2y6hfgFxF{<|NYUkR0a<4_rs! z;Jud^#Dm;`2>?~I0Xb4LQ5XSn2?Wq+t58a)GWFQNwnquyhISFWld$dnPa>EGGdgE{ zsGX8Wm-g;<6X0ylD{gNJx^~I(N&}g!cDsGz5Ccw4gc@=9A(09Y(dp?V5kzz{AkkY& zZ})E#Y|O=w#F5C6n+O?^2o{7?^kZleYYx@MZBr-HCK~c7mTFXMRJG@MR_`kaxp6u2 z2|e%}?ugt|3f`}%K2m>JzsE-D`JwwG;2!6tb;?=O2Cr=Qr%VOTF~)?ulW5mt*~T%`quHY$D}kw|$D| zs4P-^e=FvW9g(5VtdBu09*2R9>2V1)5F2gYTkzW;XDg;!ZlQ&CWoO-*aLzO=b z+z*C~BSi$*QsBoDH9BwUf;J%u6#5URdB^6znBzSkHrN!r`l%a*n3DXYM6!Y)Rl=Hw zmAqoEfChO7Ovc4vYq=FoK|fLqDN;pN&JGzh!8xRRd_F1|TCLS$QD^5F=8$H1o&%mO zJmhFGqZ~meD}0|KeU@?1tQ+<$1%##OAt)^&Rq1dXSaosg+kW@^z6*oD>Fp|X!BZ}G z@k)1|^Dm12W~;ui8bsgsdrRZLvunAkP>sx^$w3r3w_!7Ec5QfdS*_+s=Noa@Z4wuBAWYJNH&!^x7rHR zAyZf(E*zu8={}DeE=^OF!}v-RsmzqbaWr}=nV^>y8@4Tu+_~IiM}7@$6c{n7`Lxg@ zM19Xjn78!UR7F#gndSQ0%{HHos)B|ZUOrScn|HA9 zDt6$j7Q9%0+n57@BGZ3pFh=4z2;V7|134AwC}*Iir_#u3O%sirPoe3u#;8Z5a=z7F z9yhR~vhFMNJEv?Fs3lL#sbQXWO+gLdYo%=TWfaCEg)#?^%}R%HwKTFdQJTQyTg(`0!zDI>--t3i=&3BI|e8bY@ZJ}R7(-Iym zJZPng8PLjx3nIWQkZq|ZeqsEz`NoPMcc@?fFzeackZl`XngwB&W`jzDap!bg*Q^ z(TQ5|l^>TTFPT=SsTg=sI|=Qqjr0S{B3Y_4c3QVBUb4`Yl~=Z`f)#x9alQ|9Z-#FN z9LQ(L9H*zqIpSlU&#Dk(&#FptX6c(AT{~zoq1OX0s-e8J12MWrE85qq0b};?Dddya zCyel8o(?qdM;e7vb$R)EsA%_*Jpbf}cesWl@LvB*_Ji}awyM=CR0iGD4=N#uhyunW zeOT>)6&b?hkDA_j)B-r(yYg#J)E{zrX3z=e2;omM^Lu@T%6r#(Jo`wIJ`hyY`%9c@ znKMW}iKH3JCSXqVW^U67nj;XQ56KwaKlk2R{zFAu=rk69fmW6y^!I&hRw*(h&MOJp zyn$Xq<`ka0c`^Nh+Dt@p60pH6aE}e95GAH^{I^A4*)DQG$x&h%+I_;agLU8O;lKF32fBxcV z`u<+AZ^>0%@o$FagG?33w0_C9Jwvu@^utP~H&u{WZ@}vpX->@rl@I)`cRld!dHYZw z#}gGD4J>ACj$$~Wq_y6HaQRFa!V`%?Hk|U@IVdn2g43o!eQJvJREO3C(~a#k-%HbD z@@8_*cD#B%SGUl@giS&VW>^NGX5RtZso6%v0pxSYVf`m4OQ61jO!-rDjtEuqe6tF9 zA{8JluaoFMo!SKFY9L~XRO1g2T8NQqp^KFZ1Pl{B%&EzZ>RES%NeNp>;Z(ztK(_NJ z4>)J{2DKi;GH>VT(1_76XxcM12im*lh%BiglmYequ)Fgn94#bGrW6ddy*{o167gA|E?U+1%{{xdj^%A zv`bQS=oXsPR>|UzH-Mb-cEQ1WqU5jdlc5!>+b}H5_cMP!`_0f0A z*3EnHcj)`(-0Y80xRf8cE7a-Ci4!dZ1A&@Skg=;h<$$BmI1}{>oG*cC>{~XHK%;ml z5Mo7qoY>^?CAu_Te>;SEq4H#A`F! zx@j)t!ck^NdM~G&wAxac(U;!dgFgm3We|V8If~P%SN!;m9jz}BGn};+o^Ot^QltkB-LnCYme0~(Kyq=(!wvLL!w$%TYg8Q3^(vj z@a*F4;w|Gppc{j?1$T_olmW}c3QwB3Y?ntmTxu;e5ZTD7P;^GHK0X&mp~wsxGz7!I zrKOahN~Bb66vs`Otn*1!m2w`h;4_f8s--KIt&*wy+gcVPb0Pin+~d<9@$QZ4R`BD? zqK*Bb!h=U*=LdEubCM)X{HkP5r9YmODElT+V926XJx4~U7z${eQad=#+o-0Hg#`Nx z^HoV3Q&t0U>C{;gBd|FtaS~L^h}Y50jX2Ppxt>s|>h0s+GV3XC!JoNCwHs0mN~5G9 zR~fG~uRN)Rk>V_0NLQ6rD5=Dlx-EH7;ei_QfK_YXQC?_M#86d+7~kMuBZX`q2T9mb zEhBBRyXToQQEh2CH%1dLK;&55v>X>&MIk0Q0-_6=b5c5Nlfe%%>e6ChN;F~AVUrk(w5zRL)dQ4 zT0$xi5y^<16td}voD^U&tr$aTT0lJxT@p%(=XyA6N#=5J*UW))F(BMrvx0xG`ZGa& zvyPfAaofucWUwLLSW0C#1mt6^h&9K#=`mt1lvXp~NS_uB9k^Cg(xOu{7Yzl$XEW%C z;C5}u?7_wH_$$A}6}i>-^;+}U$%`;C`llQ5GBsxx`4jr46HsS1K2Gy(;xy=}iG2p+ z;zM@yN-8@2BFO`!p?yQG-SV`1NOCP>G+_sA^Xg(pnE0PIfUo5JeK$~_0%19((}-r5 zc6JPzPlF*^Jizd#WUgt7eS3LgH?|)arPVKJ1Sijuk5BG0de^nZj<0+|C~A)BOhn*$ zxvltY`Rq$)Kw_)VQWF%)CFZCHP90s%EsHRrPsN zQ}R{9Tubi7FXfAjyPXVw`-p+*h&nQ~6JiNJ&M> zAIOe}f8Q7K$YOoy{v!UB=OKQd{VYe|f5|JdN`%D-pw>1gPS11PM7k8n%olrV7TJi1 zIWzg_g<+d&s5RxAxjCj)Bk5$sM1<*@nCW#Ofgyz54x%vROxUU>11DfFl#B?*l8k@D zWELXU^o&$^!qp8csOf3RNuE>(l@!~--xU;7nr4Z2`UC@Cz-py$2J-HDCN%@6Hj(nk zrBb}W%?7gK-BT5(!U<{I>-EFlM>J?CCU+7SWC_Da!T_HUH*m_rpL5)EhyLS}K)fn=$d;)ckt2b}a9q=rhA2Pgm*;0S&2)10#xq4lYx zrJjmZ$o(ggPp3VdNxCh1%+}H;V@P<*iK*P&cHJJ#eM_FS>)gZo{suZ#Reu3eA>NUV z!QE>z&gQA7wd72zulF=G0`H=0t97+|ztd>Bu4LC%QC9WZR@>~0#*k|w&{Kz3?hO+25QwN|&&1rs*w8S?mNSJj?%=20yfgxVNBH3s!3ytA;ll+5#r0 zT$~+!M4CzC-?rLFUN>)t}y7rxn{{2YL?hkTtjB6?AIBsHmPT>X|pv6 zcM|>#P10N8&GXjyXgyUPt3J8Y+5-yZobVg*F=5AYKp0W z?3nZQPtmAF1qrHXmRM~{Nfx6y+OGANlRLB#q(cKtAudEvgMrE#aT|<)*N9iAyl{46 zEW9_3F_bvT?ax73k^J1HhN%hX8O8@P${1uCAczztqrW5mvpa$hd@(&JRyqLTc#^iXTLhzqJ47T72u%0lH5fXkrYZPVU2}|I<;$VwcHD<} zs~aB7drcj`%e(r7X}n)Efc?2{+jtmhX8ex_VeelgHa_mI+hb~8oZaU0$x-IhiH;%6 z@jmL(+4-1Z^E5?-s?fvBKpP4FTQ{mnXJ&5F&NbZ!+=}aEZW!)2?)3~9!ysHpg=aO1 zg(EmE(&mMEg3Ke%tpFMg4>C!iA3Oy>BwrD*g7xypOiCtMxZC96xJ}uXv~5%k?|1{I&n((ckQK_k-5uu`Knbzw=Ik zxL>2OEy}#L^(mzf|0i9{AQj=d3~RPN(}I(8_Df7^nlXtn25pr%`E!uego;Hh-BCm$ z7^W@(h3=*rZApt3-meuLk239{Snu|*keVq|v6MMG!?Xl`qfxW#5*tHhil48Zp{Vc0 zpe#6(yeKa?7Oa)$zwW|zhXsSH(jpOcEw&%JADVp#@XsOVqZ=CeQB@+wB!QY%S%aGV z^eqJe2nC^hS_cXTwtf&763wNk&v`r-09+v?lb7VcoRVl7RTde&P0V_nuWr8h_#~x_ z(G->UU_Bp!Iv{fKFFN-!tcKI*UY;|ztBGLG)}+!&|uO%e^usT zfEW)v@FYM?fz;^dLdc}XT2!YNw6vhb1uATmLH95%mq;dE32X_X?{Gxft^(UoTteff20)JKL~7a_ zk1)AOj_kDP0NIf}fQ??ASLaUQVhAvO^2Fh(7pdW`hciBW;jYYsc;g6t)5SZfFHMP> z#^tQlg09K!Q|B3v!_%B^Rnvt#W)&end{mZ&h8pizxr%=43>W!arxGn@$ETOTw)prYc5CRWuUh3W~8-6E5)Uy~T)4NQ=oPV}i?B56`gn7QkLIao?fb zsNTeNM99QF*+?YrItJZKrL<_%Oj4UJ2AAC`r1O&f6j_7aNzJUZi^5n}?4+_gaf1P0 zVD8Kv{ghwd^7Pf+w?`Jd_su)%|M>j864$qF)_j@YZ)-ZC z6N)5~XB18)qtR-8G?Pcu46URXEmmpFYFbNam_`YfB-JV@*9yd*#FRpNiduj)h@ln; zQ5we<loUYMfLH>V7q?wk6C}=9OmJtcojBh{BZBWd2fi%5BAkZ4DR5)cl7n17wn( zgNqzu8mJV#8Rd-V6j@HVclS#cK+_Kp_m^BirpnMj1bCu2Po|kZBgmclDmn?CxbaR6 z5v@S(e5SN^V)~aSOlc;RN1|_@$V)T*dJ-Kyp-(dwBZ`X{Xqp1h+ik^Bir^MFG?|pQE)myYIf@xTj;fR?$aB2TALQe$@g8}9{5}7Bp}+b67E+M{4Q zwLh3-<#{YCw-_x}qfg<_Qz-mipD$^#=2?I2uMz9DQt@w}?f5ZB^^=&I{z1x?tOkn%7yw;C7KlYP}HKnS=e+qLb02H`MPzj1e zYXA#@kpKnk{ex%ZyMqb#Ic$g5*#!lULU<%}K17A!(c|!F=#Wg@ncEn~BVkNd@p;h8 z$HJ$>XTq{@TWogk;3V1SVYN+8odYht&2qsuY2`?g4H6*Ra?Uo%T_7$ue_d(g#O)qr zqv6c#P&Pi9l>>Vva~4xr5|PYAW>O-Ne`^Kz(n<^2Cy?DH5CPT(ba^~LtZ8yY;~0bn zGVPO3jOp1Rj|At(&1rvjewf@HHD01UGHIJz5fxWtvQxG*i#WM^?4_}nET5|JNXo5y z>E#kj&{T<^S>nuN&wMK{n8xmP;mi-izsvl^pZP_8c_n?1pK&@|(W(E%U)x)0){v!7 zGw01SPW=ggT*@1qU`DBXF1}AKoqCq0mKLiKHT^N!A1t{GnaG!Ggq>Ufe^q)ydR+Dg z7b6LfU3h$8nBLCZM(<@FrJrJDi)FZiotccam{o|en-J&5?q*76_sf;eLYHJzLbXXo zBu6B)w};D@t5y-s`2nzEpKrYXs{txyd{0r7r)q< zN`7t zS>uTbJao*xdVO}Su>tg=4_m;?Ei+a%0L{$Uu~{=VYs%s*;*ky(&k@Z2Pfx~+nwBf% zYIRf}p1-WDruSCrsxCpPR4JpT@cf4Ih1cFD*&L2{&hx4@+WFCB-O!rOuLS}XS1)jA zG~B#M;gW$hJzpczpBbpcR7O8dA&i9Ui$n$qMWN_8@zNmAt^d%}%p4 zYxBR&VeYKYKS329bD#Y(0nfP>!fZrz0z3jnLpBPDFqzrYXR|9*HkD%@Rx0dD>%5sg zec6cB80YBb(e-y=8iO2176n>>Dv(L4Xhag(HO&!c+krhPJd24Xq~g z61_^a>J#V=VgAGRhvQEqCKBIGyqA#f(hQsTYi>0&7ONwOFr#&|1uDyl0>P)u8v2D* zj*7+@*2Y}1kr*8lk?T+p2fuyU48Sq1HCZ?pt;htxhb@Hu&XIWl_|s+g6wG4Nww8Z3 zA0YWB>4RNW3Z+_MGMNf08_E`L-itfdH7FD+waKglBrC1$y*2YvLAqr=pb*PeMv_Yg z*7bbdR}kx(=hdiLc0nY$Xc*9poHC!ESw#OAeFV)zOHniRJK-k1sqwzR1En;IaaU2> z3%0MKP=Pcqz48v8sVZA}RbSa~p#Q1^%mK;G=36WWQu`O&Tz8=Uwv}Hnf5Gy=$_eJA z5jW-r^sk~CxRg%ZpWu;YiWTH#m%k0QnbLp!ga)TjH z&W`x8UKE}n6i6s2^~$P){v-YuM0$Qi&@@Fx+*p6meZ>6&If0oiDuz(fO^WD8m*Hh( zesLLD-drZ4JZ4X@Dd__>xMqSb6jat_ii8z6T1Tvu^&8ZW!I+oR4X6^b6jGV>3VcO0 zs%`itokU6G1V4=$=%irblDIE`i}0dC-h{QLe$(qF+C+Bl86K#@RfS2qk)|4H zjA)L`8bFV%`6VPg0Z-CB>#uqaUx(aSaa3HIju7@PF62xOoZ}+ffI1@sliN5D`U6Cq zXHQ#Ay+h7kRdM2k+yDm;O@gawdWIZfrCOT77;GWOHlKOj|F)mp&+OXD;irhFGxK-5 z>ep4&`BIL2vjs~6{-VO-!jeK-S{+y!i2DlyYyGPo*fG!PK=r8x9xcRGJen`5a-hao zg9BX|SjDG7==*+rA$^khlt{84?*f}F7ovpW_+ zdP%+B+?MU^-YfB%J&Z({6h(W3baUH_5e+Ss(Avn3@|O&K9xO_uhaprG{WJTvUo_VUc0H7IGVw z=^x><#f=f;6_c<1`kf?S*HBC?D_QNc<}W|ced~`K9Ki-6vT9u0rhf6-Z@%>4P0fFy z^t)I1{VCtT)X|l%4J;cv{wC$$!$*l^*MSB(33eY(RS0tZDn*m!DzGWUJryYrfmXXQ zm1oVfdF393TgU5t7T(I+D&%QJg`TYDRoIrXOXanSI!m2(sjY{7n0-M0Mcae+gPteQ z+@_Y@ZDzA7 z!PLqZ^sNfaDSV29iW7>TDkO^Cayv1YI6;~?#GYh-2#U;Zxpmk^miBoh&+hw?=h!L< z$BR-Vcvh7{^3!rkK7n62!FlkACkqWIMZyzWLy4OhTUOwn+XgPQ5VW&RS>6FFt0iY` zwG3D$vqzytV~U*C+MBbXi0MQkpJp(Lh7tLcMs6m7oPLO4!nckqc$2z{otS?2SqSAm zCHaQL*>OX5PmRKmW_d%}4i0ChAaK?m`jlO4WD}cc0fBaok2r#1h! z+`&I!d>}yA(zU83)?4XYRgwo8oQUmlk4i^n2ib%2N4Q6HV=*}=_801Ca4d`aY1AP zbAmb)#(J%eyIZTpK63E*SX*0(7*X!m=qnUM!Q^n4jA}4BuH35W*PPaz(MUDc z=ySA`mgVL}vnPxjCM&rM;s{nk@J`FQ?CJJOaqekKmu^YS?1%RU^GpH1G2l0a94MIQ zbKu;`FmfCWft$PVOBjYXRZPw_X4kC5BQ4@d2&vInY{ZW`{0ml1{VE(%C^1A6(?qa&WE&ljrQK&@X=x$m39wXt$%%Du&4DBSeM!X+>+tMCZb zM43UGs}guhGLqj}x<>-ELZLC5Mihq|aT^}RhwvFJ#S^&XI2vJyddht`)k4ndB*+&g z#7Rd$BKImvGW9WKz7I6!>5j}Id_ZylDNz``d*WdmmRfOyfHhr~Qb)$YxD_Iek7b2kJ zOtzrx0cA4Dky|mDInPLBv%2iEpfg zB9)bqg38K~?;g6UsnBh+>)PFxxarcDRt|{S1(C`Oe{tjc=N5XsMQYhP|GLjncitDt z9w(s?hmd3p>{|zN;im;VtI=xJoWd!0HM*rnt%0-YY<9cDk}oBC?zlfCs=LXi5;2U# z#c({FP38mHWScXaY!;Kpjbb3&#~Di0S|wDT)-Ka7;+8sBx|_A@xHWlA&TF-sxNhfm zZiLyZ*{|Kp?bYvd-tKxx`w;hl?ja}HzWoi`N$2;q-{ZcU|2^k_Y2W1D*S^cW>-D6v}rx9deDrE;l*Mb`wj<>@0{-yYV`wmLne?ad>oGo~~bq zi3Ok`nu3mU=24W>m46taemo+6!{xZ3VmU2sG?~ceZpQ@vyCB!XGt^;?pqrqQ$5uMA zbAtLn(D3A|1n0rRe~c#w62Mxu+Q9U(klC)8t($~HUuYqlHpw!Fxbve$+@&em{izH( z>+j`uzf>u!gg?<(yR?aLpar`x+Y^Y3XZG?F4y>f;C#L>I zZf-0UYQD-~eY3O2xks``x+nim=Ck>-6qRzXq1W*1+?yTSB|9B^sr|P7j<3*<%MW?a zdbP-l#qUoWO=dPvP0=)2($w+pJf3EFz*h$?voI1!J$Q`g-G=AzN611O1eIEi{~J;N z?RFyukzE3Iy!iNt?2wF-P2j%>3c-s7Z=09$0y%$lf};+(v71yP$a#S~#8I5p^Bn#H zeoy4E=UN)bAdm@0vcNf+-6=r!3XshLATHB0d$`Gvpxiq7w%l=X+ zZZRx#%b4t8@i|s;P6sD)4%0hVWV)NN{GnUd-Ezg?&RuD|@;!X%GyfhC>FK!5Y4_K!35NVd`9Nh5kZT z3C?Y`m|40LnOoH1m+SK#P6s8``PBix+`9q0IQs_V)AHQl?+&b!bo|73P%BmHv<9_J zm9KSbT+&ta8fKNGnOm(}ZID{E`T0)QDvIH>m;x#@a8{SiX^n@S!JtP$$(;)Fakrqi zG?=JPIZJC%0x1m~=i^;@Jf?V;mIEV*%EQ3xc*MH|tpPJZN~_>Fi=qr6Gx?mra*OIU zrBWdUnPatD6w0J(L`9uf;WMhUDym;~nw*U`n-5yB#pX)mwA&X)zC;4Wx%gQ8bo@+Q z(iq1h@zFRHZ!1qv;OmaL$(MY{LfZf_uYe9$a06u90kOAQwpCtYmEtmimF!O^lK_Ba zpc;uw0GgRSbDAu@rY*TIfr$Jv>+dCbFUe$NHEv)VA?5+`%vKASTe%(V-1NIb9+>B@ zkUovUwKJV~E*L8c~P4`qIDjW=ZCi@ZjqR>Rwj1v<=0 z?z-6jvs%4Mm6uQPJQbh!R_5o|yAv9P&xef$b1~kOIn!Kj!9Jf(X?9;hFFd%|uJe-b zshtPSSqdD*gzgja1WTLckmam}K^DP6ZAZ5uN>gpXJ-8al@gd|vv>0b0?gbM08`9z) zWP%ig|0HOzR!hk#ERnM+iUzjwS17(z&}%eWL6=Hu_h?78hqR2=YJQIL;d40^mzd6z z=eX?lZE;>__Lwg@R!8O_vtKMAFj_#(syOHIGPj}f>I~IZZc@nnHvdBAJ74;E??5?O z2%+)|cTvB*r+|052qi;XC0_(dRfoPKZ0lcqXz`iFXBRVu#g90I(ng3`9_@Li~Q@r467Fz$$lcW_o54AiHPtvR#|*e@OY{Bls}2U7W;DQnkrs zgg2`du4pnj^?Y(wz&f>G%qpBZm0TULWOJyx!eqo{p?;2U=_d2re!rQk?!5SgP1&15 zei!~?rsL8by?IWt+{!=mEQ|z?ZWHVr;s|rWf@dAIiP}N!=O5so;7{@@Fmv%;Lb0Z^ zbPaX2lajmawA*7Uv+L%26y)okUf#uv-&~;4?;Sdha(F44MNi{iYJz%6P@2phu+txL zx3}cB+=5zlL0n`c^E2mK$jX5D6)*xwav*LNIwEWWIbZ_hK&NKzbq{^~PVrj5(GhGY zrZ)Dj<2hB)%^eSarW@~&Wk&tw{1Cl)4^J`Cdh zLj8U{)*k?FDy&Q$ps+rl!a*u#C^uYZxSx8Pnxg6=qWh`j)t8_Y^OL787bB~AztGTL_5XO8M zlkJjJ*pMfdbGwrseAarklMs^Yt@<#oLTUXB(jW;N*gXoS1ocJQvu-;Dj}eS&Mj-l^pQVoAhalGlH{{vpVE} z4@EvMCI){yo|mSCOCQdgnTti@R(slwX9qevdFK7(W@ym{w&Q+!KH1oe-y~a}eHU-C z2UaFCA+q0j-u!v_^CZhJ%4p5Zj^>Z|F|`-JF}uI{NL|z*C-`0rO51hf*K4mATHHb? zWp%gfI!m*2lopp=@Ag>5IZD8B9SpRNqM)NzkG!89Vb8MkH2L~jBiqK(t?X&`3`?`^ ze7}3deb!AU#qXBTWV<;fZZ3zhBO|$OAoqFQs@yzeB;x-k9AJiLP}hBe$btMt;`e8% zxc3r8U%W?*6J2ykrcbgHY(paopeZ3-hnr+yz_e6@*FkI}-i~j>qv&4tJKEnNIinTO zLQJn^>HC-o>Wq+JO(Bj(&Zk+HP;x&S0d4+DmQ~XcPo>L{Fi@8?PKjZuxR7D1O7S5f zM1^dXWOCOF-nAF+#}=%>w`ShY z>^jkR=UrQmKR>v4S^68=u}4+Br0ZB$MRhy2e+wt^-I*o z2!&~gl*&_yW%6dGN&c8z8jwcVs4}Dq8A7(Oy&x1UES08hCCSCoT3NkviG8)SN!G+R zE1FbIwx;Cj!X9a-tXJ7>>$Yz$-p*{7ZkKIWT&KKVb-nF6`)WYRxx3FCi$J@ zN9;$+i}@e%%eoU?$?n2^a;Dtg>+ExFjWJ!aF1A}v*UOi?mW1jPOtXDm;)*2QC~IWb zD``fC6tq(5FeM5cVOOCnt(40h4i-cLNNF(sStP}FWU%Gg1*0L92-`z?mCmjYIs^7# zy0F}yo|x`GW>+fsiRnHeFUiVyl~U=kLwUQ+;c&_o3c^K=b_XOl68S9aAtywVi9%5B zNRA^}2)Bg>eJ~UP?G#Z;g@R>e@_CO)4;KR1$AwfOQ5h@5KnTQ=CCS2(!qGx{WnpV! zTVcO=bGGn&AzSz^`+ND7O8aq}@;Qn}HvD%%NzQzoQPHZ$D&|d4*B+bs$id_}D|gPq zOw^X&BGsBQsq&s{7r~A+SCTC)expQUwKIkGnk6zn*#GC%l&~8 z?=2snqB|~rk=ghea{zc-(&PQil#JRta8*&jpw_ceND3G4nQ~F@-;gwiSdE|XxvQst zN6!O3=RtAw?r}M*O;Qw@>@H8HN)pMcVtOZ< zoWNV24G4TR8Kt79C^Z;qNnCc!{qTBm$fw>Bw}EWiMmB;ZK);##u#)V6$bBe4JoTGS z>*gBaHnW3O+5Jk3Iv>exvV5#EEAlbx0B`myVno5*hP|cP&pu?&FI<{-%uN-O?>o%h zO7corR@hMK+q+?1XJy=7Q1{}aKWtx8ebwixjk&#`SoqB0&u`ngV9&i*CjGq*U*W1{ z+rEBX)8?fQc7Ju>h3bU3PrF)_E7QM`TnF%0Av-!M6yB$QT=sCfEj=k{FzO9nYnZC?V0jIn1UAPk0ymoZy z-p4b~XP!BBJ1)T0`0A%_C%k@jW*K#ZTAT=#>w1guf$#wB@7#La;gjrQVPh+Nl`c4*ERYuF8c8LM^?CP%XVk_ z{L43f4)6adF2&PZ3u-^e-23tyNA^GVAlWYqZCER|AuagAOaZ$@Lc_~-&|9btw2Di2T21#c@{l>d9 zJARh=UIuUV*S(K7zx=bY{f|Bf7;;zUDIlGrNC}o*hhTU6zopw$`ik}?52aGu4Mt9` zI$=?fea(3j^a{b{6f8IK5~oz5Q6N5;lzXVQ_#W$`L5y2 z_5!@^vJKDlKiT<$ZMn_Q*L?D*41H9{?tK>i{`Y@8G=tHq>38Y1V1XCmhN}`terT9x~rb{Z3E_CHPRu zX)tEd1YYp0V0ghm8LY*Zox{o=!AySk{=SZc+iKHYXZ9Ctyw7WMMebd} zuROTq#-_uiUjF{rQ}`+Wvw`Ph(>|k=zXjjvyCwLb?=b!<^{DSi?1k8y$v?)XV`@Dz zVH>3n*^;)xig-nGqpv5SC}1gv0~^Wz!|)(~$d17H(73%OGTGr3sHorP^H4Ys3=iMa z6i>+t!iQy?tWnk`qesPQb!30qQ8Ix)Cuoa8`S}h?tI=SLSiQJ<)0ADkaj#4v_YpU> z(tXHHxsP+DSSal;JyS}Tmara^@sU*fNo+;4Ct$gj0Z~mM|4k!7$KJDx0r~Xn>QwY#(t&{r+;-5Zy~+RZk4>o(N>FzpY6{-Gd*$Y0p7mwTPZRM=bzOOrt9W zIg)(ewW$;s@B|$c)D#UPO4H>3wkUxzT|yoakZp87eTY6wOX*YiYt;9d3EX$|ZNi^( z9}%e%wM2k2SdBzAqZVY0jre`ZU4LIId6LMVWgwfiAe(*YV_~7(Ne(zA=!END?E}uQ zXuqOAp?y}bWStlwu$#W#c%A99^nTM9>3eNY)2C>;iqBtDy88G5^+B-mCg_9^CMS`gf4GQy`iKs@bX7V^XA=TA zAg|;tSZi@vD9cj+91%|rYmm=sUf4z$JFuS%?^I3B93CQHO(I`~Hrk~snco&r226gb zT^>U!BY3P;62l6!I`)aLLT6Xe4cYJQgY4AjKElm-d9oWz@5`R*DJv~we&lj3c;`!d zf3bV}MWx=KQJ5k(2vR;HqzY{y>4=o@Y~n*e`zl#J{A;dB-3B z`*Rn+k5`{sVlvp10C7D){Oe=}0e?-Hk7SZ3tWVpXmzmXV+?2wO!*fJMFHC>Aix^B$M*2Oa`nW z52!{Wl@h}VbOJKZ>(T;;L6l4?|JaPpzfYP3)2QjZi7~yKGz!K> z;^*s6aA}q`knhdBdBTuZgtA|=pL703G;wBjxCG~XByGl!38o}pU*b=NGeLib33Aq@ z3#fu?%Hy~h3yF$4i3-dWwY#wEMAxa4+L=B6l@)Gl*yb_#nnT5WzYIvk0U|I`D*p8AQfBpQtXrXS9?zw2=1v+}1| zR{C@m(Etz#ij^{2wmtrIG~$XS;DKJ-)4W}mUSiCIS|Ns?#sx#c5-{>K8vT`PGH-C9@^=QilMAXt!ymsd&VSo{tCNgT z8#ERdg}Nlv)VtpJP$tyj@P;zg>w{)Kv0!)RX}_5hI_PaTIz#@<&o?(3wc@`mqki`-n#lvygvM;^G3g1Z9h+X~?_a6H66#|)woC^rV>!tlHr-tjTSYvA1lVh9e( z&WAiDggR);N^q;F^mGTLageqFTocIycOKHb&<3b$`gc&S819$IK8x&7&($OjX{*7- z;hlFu`Bjp&$O~~A!ex-Jhi3uP(LD5He2}VPIJgc<{v>@>c9^Y{n-yxsapg}`U)D5h zG90Cs>u)ej8^b1K`nFkbe#%l}X|w*y=C@@WZ{_cIs+|uxzwRn`N8Eq+uJGA>i+z6& zuz?qY*M;5>w-k5^?vFeeWuvdfZ%C9RUQ9B{y5!S^4;8&yOckFhc{O!cZiE)1^&oST z)r*Pr0~4vX;Is7gwSI_J_H+3T>1Nxwu;T zjQr7DT!XIW*3aVJ9_~agj*(WE%Ef`$b+x%TjncaMT%3V2x8&jyq|$vp7ndTP?qDu1 zL%q7OT%1J)y(1TwqZ)l87gtbE=?8LgB}yCfXa93~v2krKuBO);_vPXm6u0~qT7nq@ zb(K{o#wBD#todSGDyGN8xJ*n>i*Z(rFBRi*GDg)PVT?QvSbck`I zSWllAH;L(c#JE*__6{*_7t3VZmM@lhLX5k__;E4r6U%=~j2DRU*Tr~DjQ@(n*=+mY z7vtG?{guR3VtRxY<6>VTVjr~xe^A7ZR->J$A9bOPs2z1c$fGB~tw!BqyaDy0t>A`o zrFc{WcLNY7emkW1h$VPP>4oRx5UUl_+yB3;DKXnJ9<73$UNk&gW>Ea^yIXVbD@19y zk|>so6^W_U@I)_!SHd%!pbbOfQ&&QLgWv|xcJMpl9X)7^n8u?O5bhAm^g&uX)K5xp zg7@~q-M~NepyL1VH2;a`E6`f;&4aT&B`qxnpBMj^aS!xo0CEPwZG^Xk{}1*5v)V2_ zm3`*Y6O91L2FU-{^?qF(H8Lihkheu_`({WZt@?jHo;;)yX!O8ahs2f>`15d2$_(Xd zT>~xTp`GM;9tFhrHGsbo-n~&ASJFcATo=?jD7L*jS6lp3+LXniK6o!_Q$Lj5`A=4`90Y0gBNK9!L>*^HiBoww)YzG-3LYt&acdpDJP{0Op zthPZc3x{42b{pWXL&Uo-v0Ynp;l?=_u|sS_FVs!y+9J}&P_EVv5i)~tZ4{}DpEIT% zB4pa<@QiHRW+0LswM`;>Gdl6l238)Vf5t{A*kY<{;D~*3mJC zA~uMn|23XuDc~Q+Z!UzhFxr}H>DJja!bOHfuE*y%Q5U*Sq`Ix*Xl)nk?8(t#7Dm~$ ze(~8EsAjQfyU2aF&(Z{e^+4|31G6Kvc^2nBNncqw{ChN(?cG8VbFz5dH{1R!US{F2 zHOJ2{hjph?V)w8J;cQLAV&AjxY!vGvH4Z^~`y9T~D01tqB22RM+;bT=XL;mK zv1PsD6N6$;dvjRVEskS*?!5y!en)yYD31K_W%NT@ODJxpjRYHb5i7IfLHgYx^19yH z5$?_L(GB2w#n$c2^>|q1wb`0>h&kP2ZGCWMd1gm$Y_`BNSy-=wa-HHEcIIF-m!E79 zpWU2mYZgKT0-M0?63Y-wnae8(u4iSyP%fwMG9KC~;@9wHqc~G@yU5e~=G4|H!mnQ( zlbx59>=Yq1Ai{QLT;rmgAA<4~pg$x42IPv1Tw^Xq#&cXJA(r0)wI{$I5;*~B7r7fm ztzz9-s>|}nfmsWOkIuC;4S?m4`mKL_QVvz+fD~= z{~JW^-IJ4C+4uZ2$jstW$;hls+4&D+ksYVYb;2wsY!_S9FG98_$3^~~G3Rr*IK#&`&3P~39i1Yiv+_7A z{RigQ3DMco19R~9l3wz!A=N8#jh;{N^h@>4$jdg$@>gydQDTDmdt?*o7I-QJxR}|-~dwcmSdp30s4f0oZ4R#G|@9JFLv!!d0U(vOL zzp`&j`_?PFHVyZ-56rxv;uG0?F27=J*T5ioX;Hkqhz~XNbPV(j_H7&rf1>={VqzBL zh#8Hm8diUz?Bo3Ef%eX>E$suF`M!<+vY-4w*QTDqp{{|hPQGU=KLkbBtl}Hnhxh=$ zx`AK0abuis-`dG{^$vFJ=!RnP*_r@CeVYc_`@46}P3q!n2ikY^Y~4hj?Sa9F@vDZ~ zxAu1Jgf+SM87`K3dAH>3;>Zy4;_HVkd(-N|q0>ge0j#rJLPBJ~kK?C2Zl?HuH{^g#m# zhdVmD1_w6|_liy9I|jN$7!E>hq#@9?O+8!Nd-=|6?+5uE04#nB3dq4u=A5JfdQE9U$()}qODNrRuUWN8{X6nLj{{ zw)7^p3~g=S(v{dU*g8ap4)Ae+P-L8B{+kc(=;|eyC_b`cKf`+tX3=33XyhZ35LYGMJ#}!1Bd}Ke+tQpz3PE31GEVG?d%&S zPj>We7g<3TWl23SPFq9@Yv+3bSX-fZ`=)`eE&{MP-wcm+x5HrdZ5V0?2*c=I))>Oc zb^zh>T|FWOW>FpnX(NE;Qo8`!Lw%dNvPeoscJ?_KgrR{RKoO`Knwg`{IS8C<6i~@5 zC}tmqcsswny?0n-DeZ%UT|;x9j`M4PB7stN&h!HMl;ebegzfxbe^*BjpvXV=oChcp z9N#29+uqsPL+BXDe?XK8QIb3$!dB!ZpJ-HX&z7DXri%l;- z-D2Uv?!I9l)`70=Js?mB4*X;HNjVtFE}+vKEs}DxeS~Jg3x~mD=y>9 zN>k}nTCMmeRQE55k=!M6%@gSmjO9Mj%p_(3F%oxTHK-off(r7UsJP7J%}oAvW+(3G z2kE2qH|Q6@our?mpZ?Fn%6}GC{8$ zv#|1?g_Zv-to&zTSGFcqm*XW{le$Mc<%*Lp=?0!UYL$kDKgb&acN8F3d$r z%d?SV1+k*Hs}=OG(I3H4^sni+0nfyzj)mey=d0C_fa%X5Eyl=&4$;3tW8f$x(7!n5 z3ltrEfqo70zem3cEhUe=I>)XdXWAs!ss;kXTY5W zcOD#r`sl~d9&iW19RbH6E%+{Q32-Y(3jGxQ6twd&*~$)n0$d-s1K=36ntl?}Hxr+J zoW2%$;MqILza@h34*K(A_*DpP5Pliboe+Kr?n!tscmEKCB>%x&`U7xpg7E%acps$O zA-osvN%)1_{dRg-d~PTg9-;@woi4803Hdy@Bsdyk_dx6(0Np)gfWgP~&2+E$rlSxR zLAWIw0=RaMyS?HV?LKC<799eR?gr5B2FUFO$n8c9WZf`R=7wyU7<~hjxdF=D0A+3f zs3hq@c;6s7$^bqGjt55r+y?>fgW{)K2ci5Rlqc!8fIkZE5V@mw035^6s(tje;~^Iy z*`{M@p{VKN3g^NS8#x|1siB0{Lig<4X!OU&&$CRdTvu4A_RYzU<`S8M1F zbUio<<$>=5R|2jU97A`E`x36_=oM%Siv*2p54DHh!|ahT$y%&`fi6OgECQ6&(=k*D z1;Vb@N?g_^@0X9rY4VwXq+F0U$|ZgD9{K=HlTQm&(JSdzT0)N5$tsG;vAV_5isDh_ zA?29zwDOEnGA2DOJtI9UJuj7H&%8HE+ob){5$UM(kW@}SI83!E`;{X~np5)1q*72e zDkUx%K2&`xy@4EM0G|Wb4{j7312Ardbe_HjTq}%5D}dq}NJro!xZ}W`f%sVnC2*&O za#|>-g;Xu1Y9SSYPjVW;wSnu;1br^9%Re5MMI zhOtmtRb3=_z|-sXt=?9DYpC@w)93B;_l5cnGb_C-{VPK&4>MKXDt}d|>M)b=Cj5y| z;xOa#y8Nz?>o9X*`H|%>EPs7D)4IHG`JUx;895m_9!VC7p~p|c9n(~$qPSUMX!BBqale^yLinJa%tOedvW;AWm9 zOmMx(?$!etu18hiTEX>$lc3k>b?9wyP&@c8aQ)zpfMe+OaIK@)QD1}WY3gY@DyR#M zE@U!+_|WTEu9~A%fD3B;xai+6`ujw`O7wk#W|{iKW$JG(Q{T2s9fSxK0>P%n_lUk* zP*$s-saCJ7R)?$AP@5UKk(x4!zLfa*ebHYb`cWazt^UZZ{!n78wq1sU*FneX7u;Ke7B#*&Oeu0=K)OaO?bk=I~Udk$NZ98 zO1^JpR==9`D1^g4Lv0JF1dMRME2_vKT-|vBI3Y5wM+Z<8Vzq_9dbWn>g)hB{0zxHc z!i5PQb6hp?uOT~&TpufWo`ulRb=`MeAM?t*zj?Y5LwLkX`;hXm{G~?h z_}en)QMbv(6M4;+ z5c0b|eDh~)TAc8~%Zw~ojq}pk4D7k^&P%~#@)=+Y!ifJbA7PFO>0a0|L|A-#99Y6o zK0}ytOPmCEYu6#BE3ywMcKC}4VEjJ8qw@?@cs;(|5h$db8T4Bueo5@Rt6Pwr*MWMC z`8nG=18#%O7&(qLKkWHMcXhmK12Z9taHUS0+ zfOrF9LsJ92#jV9aLpm_+V2q$aKx@jSDqOQ3E)`J1(5J>=b~}6&M7IBCkef^%luRl_ zKFAyWr13yQ8m0?pZ8a{kq<&wCwae-!SYh1hRK=hsOq$i@QYD}!Jji9V;D)i+p1I=) zZ1V#vT2Ktkr#R7iP0#fe2i@zh&TC4#3fC82TL+#EDS70-Aiga}ROS;$(=W!$cEB?Z z|LPo7D>2TOXRdh1sAW8wdS0STZT%dgFdHFmZ}!)mTTXhOFqfoY%h@sz{_Tkw;65j7 zi@%_)?epW5TGVw;wj*X$%Y#yOsNFWpDuxt!0eL`$5>}?(d{{i16j_K0OP>h~oa26e zf#}||A>UY1lO4|_l?tHJ$w8&gG_95x^4KtiaViTHqG0ED<9#pXz>R7{6nt5lP; zo(-DTZT>QXOjVfH<<~eeWZcVG|9Ke`z~_DCkb}JYiAdNHYb)fsgss3H_fN0^Zgd!1 z;^$X*F#IPo+@ASG_xXAG+09~;*IC=2rr3@8&NVi!hM=SP?;k%buFT!?9mJ)%Vb|IR z{ZB3`2+!^oZ=~1wg(%xYESi1n;tS*278IrVLu*#AzZY~)t{JWQp3ew!-luiiZJoE< zKKRN3d}IKe`-bt00dn63NBomJDs%r`XR14@*M|4nO#SzRJy^?LC2Nbb&;x z=YJ2wsA>X&WC(88Q>T{m%uym40mWVl2ZlVQP|^)%3-z`?Am?QpI1;KR0J=i#Qw{-0 z!ntF+B)Uh2kz~VaOX~cu+&nxy66;q^5N`#hG3i_o5@$x5!oQEB?-k8c%v0RW#q=E- zpBw^r)@w^;w~fkuJAa&3uB&_H-N~&=d5_70d0$fL6El1tPm^*|7C=L=Z%2- z$Eyc3L?2QqxC`+^`OiDndR`CfvE`L8@?ZMxxI_#-si9K_!KVG#iQNc&2Dh1di;8kz zu-=E*6{m$4d!1%7d@U_(T@r#?I<2oD8qlF*-m7ltzu4O!Ab-DNz}-*{DYS&L2UZV7 zIdFQWeQ*4#Np}&Y!dad}sj0S!@PHE2CJ*dmI8uSW`QXNJk1)tc35ZnpLj<SJZ%Gma;dsawXyTs(hJ>iGB0bXXNDK zAz@@^;UZyUVdEiTWntkqWR`U^wYM=Bb+obvkg&ipi@KTv9NkEGcv<0?|Bd&r!N|tS z1;;FI>LdfOv9fmiXZY1tcLO+Rk??%k{2M^Z#vZ^%@*j3sHMlRT*Z(Gr=HUL{i6{UZ zt=z0hI9XVkztr6TU(>KRbpuEM%)eOx{!e;X!(_$yRTh-+%V$g>N94+WBI=bC6g2pl z{sLmUHDVMraq<)jxSc=UwOd{rTBo3Qo^0%10%pU_5gVq*X>V%+zlZA5U4`9TTVfwu z5f3q#-V=1K+PVy9WxLnx*a2Quf<#W=v?)*? zpdCm*NZ4ZO59@Dg;A(`s6~YZXYv07t-u%(@8OOVNlygn!sq7zb56{;(NA-!A{=u2e z_-;2*5YPlU*WF<9;&a!0hrK>9Yy1oOJ!f&&*oj#_AgH^fTb=tQttFx)^GN0hur2P zy>Ys`A0g~R>2-R`4(VNfeT@234V%INObfF8%?eV{C-11mzwN5cW4Xm2Cg2mj)LAUW z-yb|s7&P?%1`VG7T{{1R0cLe~Gq-<$&~R}F{6{Kg>I(R`0{{P@VB_NICT?x&@^6JJ znEtq`yc!N*88W!^X2DX`#-WTfB&C4=NAgU?7#H>WB;%3pUuCq|HuEA-+%Id zpX1;ApZ>qG{@c(0TmH}Z|N8#v{VRFDeEswD-?IO<|7XL+^|O+zhL~o zw-^$Rf43ktIA)D+nvORA5c);q{2$5xiEiHi{fhnv-T##SF981^HfVNkHXe@u6YdwC z(4GbZ3oHVzmk-{}+!veehO@R`{9l%1vniSefH4yw07a`g6yUxxjFCm8fX089Y66o( zkxFTAK@f~4LrPjN8vo}>ea#SR5Rv9=Z$W@i0eCfqGUwLU;rY5oQSW2~eWV5);DqTL+u zyDVx?9t0EOL|#&JyMCtz4jhNwQ4}wIod_rv255qR*di8(ZKgU9o_uRl7Ue@P=zV>8 z4G+(gOw>~ujiYEeY1Xtt zsFe1_{S0^l??6EaBUioq+!H>)My)ka%tLs<+84Ke;J(TZJyK?;w-VNHl-$XPu~M$% zBGHoY-tVSqgOZ%in|3(Hoe%ZzuPetoDvXs0+87SOF$mW(MQTkzJ5!;815d(F0I!zl z9+GkcIVj?GCTv5Kp3!qdhAZG4j;feWoA&Rpe?WAje8K%I6)%1vT^G4)&1od`%BL5B zXPFl&B$7UTam-{dCXjsWpr$LqJX@5?yXY>dxWI~ZFPZ=9MSk|x;Rg0Aiw zpuli%{6>!YE*oUkZo;{&Lh9>1^M1_YjoI#usvoOBgXqUuFg6X!g+ACqumR%g17{qK zTvxgRZNf!aj(8zPeMRXR4NGUN)y3bAu50RVgL6W32lB$@jrESJSJ`*A;=rELXeVOC zNfTsSP-ZvnevB{Ddim#w*M3m615EFO%OCMG`~vU^!YB+>DtMgPa;Ew_sLhfxt~nZf zLT`m!fHSTV%B7WmtBU-B7iWrU4B~!i`kh6arG2^YyfRv0fWNV%af%F64)m|)F>Csg z^7PcS{GVDrgZO|EgB~TC+N@5D!7MRDmKeL~kYgBcWcqq6{5nGT7L>F<<4gnUPu##f zSa$pst%tyy+s2|sV-eAW6smbpPG%|XBDhv*^9Emhz0Uo_q9x4Yx8`Fu9i$P0aCuTDEkI`^TfKK zK14$~*hphfrhHKei7S23*o8HSP>41EDk#S)EJimp#SsXewDb(Jh!1hd6#cO#pV5sM zIFB=)ViE2*h;WJyII+#S*PjgAgjCCQ(2f+LwB5=p#3!Vu_1NyOZkiDeH9hbjRtbjlwSU!;~+MT+PILwm_lzy_W(kpu$f~|d|nCc z;~$vS8B5C_ewoiVfY;@%24nLYF&S0yn6yAFA5cH^&iuEG-hwyu7ok1LZy`b*VGgEU z1M4F#&aCY^&egk+(|koNleKKM?6!v>CU3Yc^|(0^g2&yM_|yC%pXQ^2B6EC)oNqk0 zf|isrH)F@3hcs>I7t(|+5K>EVNCg3f%sb>&fyg227h*#*`p5klGjwWm@)>d|St~Vq z5CnX|OB4QiBbo2)RWDoHb~E(n!lDn{+nhXML}K0GHJ@N*thMQ?Pt!5^&tS)n39G_| zusR{a8WJXuoe^<$Hos(@!8~&_{ryX&c*l)mx2!4xbC@bxm(Uy#_@0oaH6`LRr$G}S zrpeqSKXKo2A_Aj@)!*?p!X66CbfBXfklETZbRVGMKsQ2_>M9GC#zchy+Z?}sA-eYo zgsupW3xF^h0OeF^9S5>h5R)0CgH{|^ZX!gmqZ+X%H-Fk|P)#de*`A9`1wOcdV}4V& zwNe5-M6W|K79G2ewKgjyRP5>69aJ>{nRSzEHEdOWPQQUYXigT^Iw+DiS=dB0cw^*4 zY!44y3&i?X*d0{G9JY`IepUu2RZs9xM^u{Vho@=Idg5`~?6$iiQg@0EY^j)jqHtMCX&F(GMDxtl$~YL>1j90Yh{I*OsodHU zmo7x`JGZTh5KXihVBp8iK+LF|eDrJ>_v2;u7K8G;_(56qm&(Md-5o*!%5m?|V6|!ek>uK=-akB{Lv-k}GdWg<% zXD~Gr81ntsQT7aMJdNihlk6eEJ_DL5a^^Uj2@4Yh-{BaI#0>1O(`>I%Gq%DjIFv}% z0>!{YdxXAhIoWB|=!ah^V0dqwX62lVNCYQDb6VV&J6MUnY5@wk2fe+yk0>%CPxJa# zN56)7D`*~x$Vd{Cyi`MOcs&^samFU8$O>zqa(i*;t=nia8vTB>a<5OpqJTcDfKUG} zaaM&JCPqMm+Tx)t)RF;S7&WWP!Iv*^$MtIzIs ziKK%=vuY@#@JETVW<{n7s9^zgbn_QUwumy66Fp)ZI7=M{aQN;$+W|T@E)RxkF;Z3) zBYgz=$vpg>PgQrieeCC^rhlSw8g1W81%2GCQWk=sRvXKh80If*Hs{!Q+uJ!AoOT4I z|L8?sp42+z?j7%+e?71bo(gTjBpvt0{Mdd((FYSUN&7i7OO5kZB_}vyD}k>@mkUT# zs`kVpkC!U(O*QR~s!YJ*sze;l+1_N%V>0f`VXDnzl1>3}B^FD_!~O-qs0zcPmX8ei z{Zw2vN=PKwEZVbiJA*cOyC}t!A+_~(a%vUTLX)bBvl6{Rpm`-lCKKHtl@b#TEirrd ze78Tf3ctZ|*q=i%<6UD_>rgriM|d#FGwfI-Yka_$RsGGnYm0c9;>jy$=#8RFq6*$# z%xH4Vli1yYa-2layOH-R6SI~*_qVCGwYU6_gb&_Ex+58;t|nn93>}5dA6u01)X@d2;uYYCMO}PcE1?Jud>J2zITvUWcdHW!X^aWUr3C zw?HS`qM|QVtgNvvzlDY{X23P0(9PL2DCRJ^ZfnNsIlx2l2r0r?LGa$*p!M^u8JV$K#_;kM3OHKLeh^Q%_L~7$=>Tde-p$?caoJ}x zQjk4Hl=;)~sI5cstb%FzJ!RrCZy!Ok7p<4JP73oAf|;MV7FC%SlZcTV;}G)!`!Bt3 z|NW15$|Yih09PC7FBYOPmv1KD8tA`GZ}e;yw69#lyhbWfF53~BnTqewRLzIB9Ap@gz@*FN!Cfr`^+K;5Nkr(Bc^??$p6ZY9aayA zJ1@1rO#tl6sN>JBlD}|K(sA8*&d}vqGI6qEb&QpB(5lsBPeD1?Bvv6-@2=6xSn#uz zGF0&-xmF04rKCf*L(f9@i!zMrjPgOx>|e-k+-jW~;p;Rb{bIW!|7HQi6zx&3+eZP= z!?>fvc+9;j-cx5m1!gFMhtQ(j%Gv3jVnFAqA7E8h0_$2~iJsCx7Q4b)YsXqjl48jANMAbKT5;fJ9`6lyL`oNdQopJU$oOgWM4YsQ!~STH65 z3bHmbow9_j=bQtu`Fei?j}^8i+QGH9FWXkOXr>}kaC$z-hk4t5#46>j6y)mV;$l%^ zVnJ{^^o;APH+^z$r7n%O5OFiBQ>zzM$I9=a#`-FxfyixLmoJIRWiEv}O^tNs&9{0> z?p=0lxf%qB$7=OV{t>qA&h3|cYwDKnQ6pxt3F$={V%Tt+5->t6?lOgpx z-dPD6rF`PI!6cqkJ5}d1-8-~W|!ph&->JyQi|F=K*lA=GfF^?vyEaneP?ZDS`)l#s# zI&BV?T9SQDv-sUJV-g6Sk$2FNQ&HD#6V(LV9HCx@KEEMrMwRtPn)W|ypGi2+1h!WOZol5bEvsN3IzP%$n>^OsA?%s-n6pljnimihNKs&UE!Fo-0UVctcIVJWH zsazJ?`k7V4mk zx~gJKEhzb_DqtN3cR{I19gMChbGZ1aCu_MRHH}ge95j6Nh?wouRddVbn6{zYlGn_x z_M?MWl^0-We97ro867`{^R76Lhw)>q2W}Zv7O|1@1){Vik}i4^jPGDdBlU{7h%~j_ zc1of2nfi4_IoDXp_g8{o^3%!L3Qo_6LE$L(JuLu1A#BRbX{Lp{8Aep14qjB00SsIW zsZIw4WAIi(-W8h-XT%cKq}xqn7|<Xyo%Hl=;36?KxOlCv0ZVM$`#6`!Wc4PWGoT-NvvSs1l0`1>?l>q z-WisnS$sFBYEg5Qass9HBvr33Duk(t3Y>8>NK4I?s49peI32NSn$mERzC+uA3^|x! zssMT<{N3u|3kaGZ(88E7h?SeIl>9TOIztDu<5H}6%o2H;b^|3!X?FveYBgP+w#uMW zbL5n;aL3i@mlR6g9tp{v>zxbX$;wwI^&N4Ju#}^6@w1?bM^+h%t)a^nz z%N;zYWlh@#6crW;8o_UjAV^Axju_J1eqEexZ`?jzSNmSrKm)$py^M_7YDWD`n3q=%^mA+M<@Ben??_F|T z3L|D08u|H+T?q%50G6Ew0}0xls?+!guI-(v6Uz=a*7)of&zlm#OhJMxjs0OL3!IB6 z6^>=FEWA~-P74b<5?cmUugr4+Dc{r=4qoBH#vd zHu25=FB<4hZP_8pfL82z3Z2+>Ii`2| zj}?Ud5u$rV29qj0B?it9 z_b>W=%~C`Q0h|Iq1IVhh@sgz!Q~T-^x<~WT?(1mv;62^A`$BF(zS#4Eo*&K3r00X1 zU79%|aZl!r(H%Eko8uq7O-qQNlKqU%bNclM>W& zf9PaEHBj%pUG?O`6etko%6>qzUS-blq!?vwX8)DHlp~g@oYfj(L@5Y{2b466brLzFezIHb(G z!aNv?VlXOdPWJm)XbkoB2=#_o327gCl|)o)w-g7+t}w{W76kq)SiHRGFXVFKHpH+M zFDv=g^5`Q5{zEKR>yZUb-I#N*IL_+l-SE?oK%rv}9`hS7;0dkdn&l(LoZ3g8AY>SE&(<$tUS> z1Qrt?u^hps`m4^q&zpgcB`hDqlD*U=$!3At!{whVap&}}--6GJ!Rmm0l&>8)vsNI` z6N?zNqyLtTVGcAzf&J6Cx_26c9_|`?kg93n@H54z4$?STyxL#nMO-XKl+a8Wxz?43R|xg7|E)*CTf=e z0h_d^J`cm7GfnRhbw*kqLQIUaY^X6pT{@u=-p*OCsXL7>frhzcen-AK>hb&uhOI^! zopCm9^P1b3B+0Fd*y1f%0f$~!!1MCW&x7a#rnDssu3O8&?2G$I`Dg(%vW%{!Ti{W8 z1g4;mAn+*Ggod9RR#H|k*_Xjo;NH;cOOzC?X zj+bXt~5FQ3s=(G(s~fnmW;fMZ|mZO1$F!(Z+gc2X5K?sAJ-gm`ATqLxEp zvWuTsAE+kO&*88rZ_{WnIdV@zbrSN@z-}7}^Nrl?JOROE#SZi_@9)6;Sz3oeOowoY zGd19+?55Z+PgMV|k5kU9?@;)Tj@GzxgY=ef0HI339c6n3Jp)a4-0R|%+#3Ltx}*x0 z&Ut-5{c;4ep>d~wUupOtzGGHv19f$jM6$CneAmfMrU~ExSks5EDM6;d^GV=4$Hcn3 ztvzwPN~f6^Dd+USvOZv=h_NV1C>D*TgAFU?4Dr+Q(@n;>RC9+Sv1C?L5>d8FgHBTw z^OgQE?VP!zN?fzJ%6!>)cgYX9U=LQr*pt;llE!1=KUme%h2Rs)t;|*%nX1Cj3*AR* z7|I>ihl^^IZsE_!*Lw|<2ZFDJGH#hPIrq~7({_tuQ@}af{-tiu-U)k0H584G5P8t> zcb_SCh-S(cp>87~{Db-TL8e6}`L%&lvUZ){FoA_;FgG`(fla2^dl@L9WGE1xFg)^^ zjpnZuLUftW`#L{lDPK)jA~7W`;?SqTVhd35#Q8ZUM^enJV+W_PN}_OoxwG{FJyo7o zu04VK876_3!IDH-V3i4!y6BWKvm8nXb2{@cn4Uh-g}3|KW#+R zYFue`;))3tNm*HydRzo3b(5kX?c(7&L^`njN<{dev_Uu9KBk6GH&1INN9HYvpE8SNdgQk^9=nbPT`sAT}ggilVMvadU96*u_yWg z*93-*Rpwu5K-in_Fn*Gwy3fyrKO(0t6aZ zE%HqySJoE?h#$5w$yZ}pCpUd`A}Lr&JpVoY4uL;PvC#OZu>I9bomkMg98t$F`>Z)u z+vYV17DM|`G=k%SWQWo3>w~KTo18}z4wipH=aMHybex9Ilts}rmGbP#%C_8u>4)xs zW`Vgkyv2K+V9N#N;06}3>Ww}(O-tjfHMXiI8#{yYjBPpE1O^r9xn5NcFB$H%0a>mU z4zkBwZ}Cohu0<9#c7N2C5$u?NA7qX`%3*anlSB8h}J89QhPt8ERvL0TA-|xO% z>g{1$H5)bf2(^H)TXUFd+qLj<9a5gL^-PYR*z z3>ji=^ZV?b$_EJxeUcdoB<9Rx8^TDt_YqNB=xn_0(Vy6J94cHQeuU2n(7&I0f@n6@ za9tc#c#aq+2?==4XFsN*-)1i#2nA=nPR5MAJAS)4cWNEDTzeJVy>rP}o$i8kcMl_q;ag1kdK>u~`vT|gioyA^j9FK}AY5?!Pe0bL3XlRB_;HxfP>dXl^E*}#$* znyhjhgxjE6>nB^n<|DTw#}q>*{&-dE$Q>0G^pANP43ThLvk9U;21gR|EE?miQu4d7 zy^}y|jxt`kOLS03>_6r#$b-b`{pS)_Yx%Hf{djT|O2{D2WrAf{O6|(3w&(zQeL;W< z#P)qFEV}bj%61Jp$+fKii-Ck^vNaiNU4Kg_Pznj{-Ou1# zO~0$RZq!H{4IJNbuhWYCd{WRaxst)BDfTT!bOYJ9wB&&t*QFB45jKMabv?e@5QIZ) z?TF4*>-k*-34W`;eLpLspLx(@E23*NkWeqoGk%&YgXXEXT%e?wfjbX$nYwDA9Mq## zb1*$}d2>H=9U7f?E-$6{gnXNQ1kaSKh2G1P ze&ekm1+K=wON&8DvP`%+oE7B<>bgG>*oWkwqjn(qa`=Y+eEF64HMCXA$C8g2Xw^u5 zU_$UmX{Ka+6m9p!Q!zVMm{@`2zVmE@)v$I%QHFtgghBcS^r4%#V8-bn)1~m*WPuA5A5h~5i~{Nzb-MMr%Tkvam<3s~EIgEL5NFSk7GjC)(HacyRh$7bl!DPnE+%NSrioK8#2DpaM~kGr2* z5A|zijynV?OOZ!Xs?B_^^L;-&m8={%O*gun>WX#x@D5$(0${roRCY%xJe{?`*j$A~ zh-ZyV;MK6r5^#P%AB$4^qhwrfC4jqRBaml~;}y@BBg)+1QR`L@XDA>Z3f+RTk7d-a z>~Zwf za`Twtvb$&PCa~eOb*_z542cE&y&RM{GIg7?ybcRBR3fvp`F8@)zN?YL?cNu@z8Vp5 zo18u4sgFk{u41a&ae8-`=WF4eTfwoW%4A{c>>#4Yc2-16jTM*wkU|H@fBhmRue($X zi;uv?!0MYY1*03d>NKUY|9zu1NJq3}-r1o%i<3!pZMsZ;pNsOV{x!-Im6tq|{kiz- z$YiEOaQ6EWx}ds}BLAtx!ZrzX77H;77;x0lbr~mx?r`kN(vwXmWyLzSkKrBkd|nTH zxcXtJe!wJp55x}6Bx@2=1XoVmwxG2SaywNG=om&P8#lfDmL**aRE?Zl1_dcSAU z^%`)YiPsK1P>=?#wCF%k!$gP?V~FhJ%(X~48?NY-CUiA^WAI#t!_CHztg=+h8 zGhD9aZzL_X%wy4?&s10gmn!F}nBc9Vgc9(hx+yZhHop|_C5e{*B0dk@W_0+nc9V7s z8z(a7VO!!?7lIz)N{EM;jykR9b9mk?BA~!J;^kBQ2F<*Nh(hM!6h$hQIb+Jrbxx6Q z9u2L;;4~JSNK?JV&i}y;H_XOEd2!GW~|Y24+(3M5&} z0`83itqDjonqWsbjR;Wb(@Od%mJc>Dmoe8;ig12k-rT)1!#@srP}VdB2>E8ce}Bvg z;urUjCTbAI^JZ{a{+Nht8Vovl#{IQ~Q!?gMaDn26kv6RDG|Q{7&g+qh0FOcJbg-cK znURU{oBwg+k4-O|;TZy|2y%wvd!&R@YbB~T}D0kwhQ#@Sel0>3wVAa+`@ zWqdmzY>am!RM%+#uK&5w@#SN9e=>IW9h{nx)@hIAV=pvbnOcTV zSaEk_&lgqk1zhcSMo~RZGyj|c*jDLQn#mmzd3v)yhKO!Q9=ww--MLen0gan5asFW5 znNLR^Uce4ao@DU|@gipWfC%rCEG}irA!9$Mq;5r^v6Z7(TiKOm@t>@`^)jIvp#n=$ zqCB*Fnz8fUp3*U-2nsKFRbsZB(t73mdh6z|tpUWs3-_jBu-2uGJF`0!$5l+6kI0^W{%vGpy1IRr^FOmLx^c^q~m(AxuZ(C z%1W1*#d3G4ZtgKslO|G4z9OR^)5m6B=Y7JTvxlprrzxCpDeM|6Y&U8)xJS2jiIENV z)J67AmYyl9IwjbXA1Qu_p2_i}83Tpl1I_@rAbNU~F}qoAtc|L!_Q+}ybq8Hdw-yBB z0)Lw4rW@*{E%`12U)pDv8R8$SWbW18B@QKak~31;WrtdB9y1|NEJ9VR7!_Y>y!bIa zC@)8}^P|I~xvX3V^3S-2K;O0tt*)Zrat2paSUb`UYfK5Wpc~WgZn7)Sa|T-SRf-nM z(RnkXvaQLeD?6^PdyB%V3Y}z4{dNw*jA=TWug=1hu|JBhy5W>DPha7kcg)(U%1@?& z))+v`ddnuuvO}ne&ddl7;psQIq6ItOOn*eXW?P+R)EJcIWi7Q*FZ<9N&YP>1D(b<_*wyw$0?jKZQ zv<@ZT(;jfE#R4M}J78SMdZIAf>2c}{TZ4ak_6HFPv9*tfkB{mSKTxW`YWF5%{HZ}# ze5BpdWb=|!UCFoCqD#)DEIDeWcK&FZkEJZD122O{+j86;rWKnbxwhV-zGUi&%aRf0 zb+#DcXPPThc9~sM2)TR5zM3od8WTj8iuu_=z)5*UvLFdr62sQZ7pIwC^r6F25uY-k z04fiH3*i6~(Hpb;17w#C2wDX%s#2jtK(Y!upX4h-nsXJ@w-gFBvckk`AVX2uFo4eZ z1G#tDk?nFIo7XGBz@BasD4EF zR4ubgT~n!PlB1imz_BdWd26T7#o|!6=ga`5u7BlP4>jAZoi;X8cblV$&BFzIb9CKO zo3>VM8)h1#zP7;+{D&YWxj(5Gsx?vsU=dSt0z;PcM2%*RXg^Vg=y?--Q;4`oE5uB= z)zmP-@G+z{BH0l*HRW>bDFOI*{rvOto1_cYBOIJ)k!dn!tO$;~=|qrS=PLx4^xM2TGWbc*JPF@rTV--A+B>Dr7;%Cz+Id=^(F_;ORr;Ki znx==Q$)=jv(bz@AAcs*U!}hMRwuRP(1)}5qW>@~|G=64RL`bPH`CT8^OPP+U7xb5q zlZou^qDQyOlPzw)1oW?+;*?|+$iKB(sS9xK`5K=Pz&!K;yhvARls>Y&* z)|qm&Qu^3r^5nl4WfvNFA8Kco)}s{HA3u1`wUV{^2l29gWrksTqPs>7%IhELGixl_ z>eY$cr9ex-sw3PVh5FT3l{zsOy$Z!xc~9X=oq;&-oYBv_BzN=xTU+MeHgcBx;9a^g zA7=9dLC)KRnQ(QAzZ$$h1GKrxsLfK#2w7=7@MI6=9)P|XCZxEFo})+Gkvk_tGzsGD zOaV{J;$tSJ{4M@)w>ySUK11D{*|jI+C|i$feDb;Jhcw1#+6StS3zlEPhqTSQdZh7W z3=FqH5j=(Z)BSAVXQq5dJ=*y&qtf^rd&u+P9q+ifM;XLb7+Y29t)=7O+InRJ#|+Jx zGq1L2gJ~-_k!m2af!oS2Xju>UXg!@H(Byvpfh)p6X`nPvnGaLTE(!{=1!QkGNiP=P zKI}4l!dB(H|HBt-tClSM7*g35Z3zbfPteJw@z^;Q%KSSgN7%3?VbO?`7X4edpPSuDFr<#rG5#mEn#5ybOK+l*^BzCxkt6& zNh9@w>qf_;y!g=tU~H{Q|M1t{N4zu+sj1UycH5-6x7%sA2%pXFyVnSg@B^FqFDJc* zpFJnlc}q7A@fi@B7)!>|lPwU-EbMqF_4{~8H*$0+k|cFGJa(urKqU@6dT+uEp&}HB$i%k#0?h=W17M{N|tKZ@!X}=Pm1YX_wZC4nC%;(AtmcRQV}s< zYrS6{JieD!)_GLU62!CU zg-j)U{b{3;jQe-glf#@%{5tN%0TG?-5)oP!`)_-z=gjNpD22 zDdjm>E>g8onRG$IhNC*E=I;(#2#tL(aY`mywWx)wWX50#BO!=u1(-jFnu%Emn62F^ ziLWu{boN@NqV5UZs$=gJcSHv&5!k--*uS?b*Hf&A{-uMw)S`p0WBUIHinp>z>I^JQR5VnQVmI^;F89 z6CFCU6OrrmldrA&$O=CoX&dx&3Lo+A7I3ZtevXJ3<&{cXYIs8(Ju=%u_FGIza3My^ zTmSGQbsZUBSXjzwf0#Y@gzQ>RJ&1W?mmk^abF;8Z#CbIojg_jF0*?J;wPW>q9ggJ2ufM(t zXF+mJ9Y@&jLlgq~`Uwqscv+8pm+J?u+dM5BI~yr@$-g7|c+)MmsG8AE8p#r0qGt*~ z5-ruAoeurA>>C_kbtTsP$kU4Peo-fIXs>rKb=2Kyv}%zoD)NgYx zRB7{0w9hU}xW#bhednG0 zNTSG79r@L*n5Q4*Z;gbE4ai@(V>@Y;NNeKS{aD7sDjQOYa6B<}Qb{5Zgb(JX7xBUP zjo>`^uwTJj1aP;X2lxIsSGTs`sL*gGt3==Ls*CMeA=dYMpnhICIWn~1ufP5QN8urY z_XY2c`3fz4Dq}eZ9p|PB?!=GEgN6^Of;KD8Nxk@Wa?|QDdSpab*8cO&md#7kw`V8) z4vzQ!rWdP(l&tD!l*3;qO=dYIX0mU>@3y7+6Di@wX*YO3n#4zVD%4!Pnssr_`RFry1wi4>!W;C3Np zk_HHxcn|gmR;`kC$hK|7qH|);N_moZZXo_x+xYEd89D_U!CDnW0FhHE-jhFKF>iBh zShFFeks50)jQ?NPj6YZ5yS>EgO5|=MDyB90>XcMd9%7b*P90$*Yc}Fqqe@W%K3EyAY+}6>Qzb@DY2f+=mk%L+6(?1785b@S);x~4oO7z#a*BNVM zlZ{}K9Gw;Sv6dwMtGJudHyAl3rr44dA(6=YVCxOmUw_$X!e^cW)5N2{(y4|uK0GC8 zbhuUk8tu_(D}Oo~y1(APS~+gY)jEf4BKdAz?V8A50J}EOXQyMS!THS!fHQl7@jtF{)9Ld-Dq52d3O@U^g@{W`r zwPnk@=NoKTHCA{JUhT?IACg+Zl4@-clYy65#I0LljWKtLx_x-yj28r*tWch?A6evU zh`J~hGYu3sv_8Dnc`;BbMruFODxwu$pWK`#?2zn^nSFkO%Be>4OuhvfECz-}^-!>VJ8JC2 z+MFr`YM$B!%X(HiGf}G{-GvN{A{Rabq~^Xom2$Ef2<(_$d$iC_lzsrHsCJ35J7(~HTbpSH2#(|>&xhTcF2~1V+=7i( zBMVtPS+!R?v1!@r3#|fpm;@VW_h~g*83Ml_nT`CW(M z8N*=ejkUj%60#NYOL~-`Vw)k<2p27$CgT->(sD=@83{)*L%gWkNypde6>*zE@Uzs>hQpu4;E2lCQCQPj)U0@|0NBec2^c+*a{=wb9q-HI z&eLGr!yVqtceB>YvLIt+W-@ldF$kwI<>vsy(gNk6dtFinkY|# zAoDVGM3a4dLuNAMBU6EW&49{@EJAHXR<8QbuN3`a=gxw&X_y+ARjE=-?l6bZL$t!I{4KGS`g*vRn8 z@?ct3Mjm?b0uu}!?+JZA#l1*-4WYX)4nxeNqmBE$uDrX8r)Nyz+*TZ`lZFjiWlK>h zUmG(?0dn&1W3}Bho<^?^?zP4*tr;260lcmww1=+mM}!|Y&$^TSyAhTj>xSZQ`wJr7 zm(%!tJbX}VXfgabYdOHUW7mj<+(}FFxJ&+JxmdRS@3(ReR|K4@>mq9mr1tkgM{ zuoqUy>Jjp`peOC;F=9@|s(DPVf0OkfsOS*e4G7_HMF&gygL00Xm1_S`pDd+9_+8fK z`Ii$zOzY*HS)mI<%2=Fs7e;gClE53F%`;@&bQec_|KW6elXvL}xg~JhQA)#|K5l4~ zqm%gae02DIww@nc?=?Wsbt5W=+hk&c`Wo?@!sB1m$MNyvB7NdN-^G+(D6J0%nt#Mx z`nor^z6r)kiw8*WeQaSajbryNxPi&6!CGhQ$ zexHTL^{k&%pOUQRQqR9{^Xzm)*~m7&+{6;!KKXm{-H$GvZa4OEd%5Xl^TBT0apa|8 zjjsyvcKj-}H7C7eKRt@$yg<{|SGZnz+oKn`Er)ALQ$z(xHH|*YldMVNEOoJX?$P>J z@j?YO#5aD(Tvf81Xth|u$(Y)LbvKwzcLifa?ta}Dex*m|T`DqnH`&Uwwm^VozrScT zT~m&^M78=;jy6h70fTwXmAVnvwV%a#@76e)2vsv1>@})I9ElWXLFOuY)Vc%6bhYNl zT;*N0D#%>*?I$P?3g}vM6Op-UPoLdE<`M)-Ed;B5_Pnb}nhCqCe6PLbXy4|0c}Pd) zvH?#k;k`=PPKZ5TYqK}VI_0!z?&gET>*Mep zVcpL;pD9+{8VP6Ksu$h8oza0I;D!<}-SngvZ@9-n9UGqU4;PQ)?Vot+g$GquSl&kr zHGf_UzPBAG@{FIBY+gImJa`P>kv}638pEeISKoZ)T*|y6p!yyddfE>Y<{oO)nqP~k z7yH5)HX6%nR0<|i64Ju2NYt?|Vy+(NFcWbUicf9XTFsbn^6JT|^-kTVn2&k*tKj+4 zyrXx92fdRPV0?bx%SDXHbNAS8UHq!9=dKdR@wD3Antsxv(?!S~LzWo@5pNzpKy+-$ ztT?Dj7hh|`V*@LTuJT8wbY&u$JGCsd@F{N;wpFjRd}AD1qxg}FmyTC+INOK>pgtK@mpJ1HxaV~-x(=I2^@MHBx7d9TwVN3 zy8b1bTvzE089mug4N)Zxa?A6AyjI=m4Y|&3A0XOaIz=E@ei9uGok%)TPuKRm{%c=N zkG3F)kzI^v$BOiae3b9FiSW{!A=S=Yc!3(tY_ofhUB-Wm>0R;k?#W5Iw*s$s$|l5J zS1RWESfe>JI3cD;Ugey@2M$DXg&kyr?Q{-*YxFpzkP%^RU>TTv?2|F;Ytx?cV;@f* zjcxi6XcW=YQr`8)fWA^S#{|RHw_y=7GeihcP zqYvD8GKz%q-YM46MJntVp)C-lpQ7L7+k56vF1LZddxI&v`MYdzNEE5I>T6G3t}ZfK zNqc)xU06cN!O&>eyvLc{SFgl&vTrbcGF(zC_dYXWeK6L{zC6TjbMnXa9`%JKN}6r_ z=cUDq^E}!%n~-j}tq)bPiDEw^!D~lvNj_^DtFil>u)Gre2h6v!I1IKkWpAz@eOjovI-;xak-qAiHg4@KZqw4KZ7*3H zDmL9`7YS$+MJwk#Q|kRVNEDRVoqf8bp~On9*q|=}zNL|ITxy2fU~js9zFgzW3AuC= z_3SYYoBoC%iL{HCPP#bAIu)5&M6gF?T=zHijJ^=h>6Dd3`0_OgRxFV4Mc_<#{WI^x zFFlj-JwvH^k|YnEoGwk57dQofEs0GspC0&3IY#Orn|GDLwLa5l7Bn@|Czm(bt#CS0 zEX6z_&h$xp#ltIMC9lNuy9bIgOd8|Px!G(lzRQ+OirMCFo)9DMQWs1+*h zFcsSn&xOOO3$f4~*FL<#=B3k~=Fx|)S2doU%NzPs-w^cxC6IQ_Xg_I{cyD^%=q-)L zL?pjFQH`*OIaOo}gg(qLQi=XZ4ZPxWh`f%IIX4blXNJekmZb*7aYWrewC2o4qW{@So-)zUwRI{}`?F%-}N(|5d$O zovk^$Pn^(AH%^sfsIi{RxeY{@ePeLzupXo$>CwMeE{wS7PFG!uvGSb6+;fOzrS> z{qmOWcqPi{)|oolkk(aK<7u}mi|%S0OiGPGUkYoyvGZ9x`&6dkQ+Vw?UMHUt=BaYt zCKT57^NIyrkHEJ2I~?E5 zq|qce7+PKM`Qa7CuUTTk-eQRzYtQR5jGv$horu*AEzg*A>NeWYHD7saYQk|r!( zy{SVbq2BaPHoY9<$Jl2xcD^rWrs|}OPfXH}zWZD~dTxq8S=@=g>Ri?2rPXN_`K1(| z%c1WpZcSI*I`Mj-!Xm9QOWZh{#7myw%-|&LkSfi$3+-ZN*y@vJ;csGM!5$pEFYQ8> zhE$fXPV-Q#^R9b(_d3R+$3|Z~mkAHW@XLm}PJ*%k68#@YsSbV(8V^<)T(wuZ*TL3% z307LHSd%+Q=Ii5o|6zUIq;OZ*)#CM$BvN&mR@;-wm?j_9y$UUjFAMXC&KK*OCn()w z%pQ)t0_z5N`s~+U^9{o*ZXev2mPXurh~dMBuq(;QWy(5~^7;l;Q{g$LdY5i98nIC) zUdP_Sb>^p@3N|s9^z{t9P=4>RLM6VctXllWcK&mS@LL0E6))H0RXm?NzdBoRjaYEw zoF|W_+1`SRi@x-CmBZT`+nxwAKOQbB@^!Y~Yu`IKXdib^vtDb*`As|5zq@)Zzm(s$ z>3Ja`8x#s5AT)YH1w7o`OWhe>R98ix5KOy4$oAEtX!u@&^5HUMF_uB!kWBu8!{OXR{s8tfq2y$_4e=} zx-aS_Zp$r0qjkb%eIl-vdfpV4r8i#wena0z6Xns-D;ZcFtT$6J?yRW>Su1kQ#N0$*NXi$_!D5xZOWrRJ@R?*cN zbjA&pnF*mZyRw(Lh%vLo&^SE5W=dyvR-zc&{sJpp9Ig44M56R=5nuh8!K_A3MuPOA zr&o|;U^%Z-|3I&RKv=ZKr0+74#%Je~1)2G*!W?%SOPx5?{ro+BS0P+%G~35^LJGPnxfz&OKld?s9)5r3e0&?W*!xt$>aGK^xi$L?#y1$X zH#DdS#~GOvc}zuK<9cfN!8q4^V{RUYQGWI%b60Yn-j%*HZEcfnm=94h=b|qqPtdA# zNQlwilsU^oKeA<;iOfavDWu+!L$B;#(dV>2D^0#Yqh+Hddo#<)E$j;YcEwx^MM^8O zr9p}Q#8$NOl}p@KMwTC(ne=$BdOou{wCnkDCgYx-^XwvrH7>UM6#HLSi1WwC zve(r$uh`7Y>Jf5C@d;vwx4Q(JmA77j_B$;}OWqD{ysyq;RLruy1VRiTCj_ z%onnJ%}TfRa>nG=rs1`=aNIwa=qIbF6jMCr#_AsDe^&f(`*THM{MVZoruCKBcPA>_ zd8+mnrjI=Asu5dB#Hp4CsXcin*|PPqm7V}jP2l}|zMwlYErmDuu$)3GHl)hmTCvOH zrp)nXpnPwHw|CACUm4OFL>vs zBD8t@ri8AOn@1YGy-oYQFTzl81%>4Bf{X%H@MmpeTg6cCr|(?&QhFpV!{Fmkk4#3y zoA^Zaqj|crNeXJME3evaY3XD~@X*q9r#5>V6xgo#s=>C&w zx_QzO#t|X_x`h>2p{BFXEF!{Wc&?{&5-|7Ffv->*QX}*hWpky*^jI z{~T~lqPy~Rh;2xZ$tQ*Y4cjcvK2;~DASs3eLMQKbCYsO|TeY9oA1V$e4y@!m62UAt z@Tq|vUE!9)%z0A#rmDx~j#05>nl#T2Jf~)mlExELj>IzBLHQM=hjlR2UEz~c&cQ`0 zl)g`)twu1T1APj5E998h5m?hjy?C1LRYZ8)s$Mo3G;AZ^duTf%4aMagIJ26)qxDfd z{E~Rquo!%^YZVOdGY>@K{IZ=E`mf`|Qg_`Bh#ib^(!9hwK8F4lH{! zsL~fP?%T&|r3>pkXjS!)t1o=Ig0aVvsDZD3-MXqZIeXa~jh3ykG3itL+l5C*E)GBJ z3l`)5g7D>4|CefEpWo04flFH+z!4%+gT&XgU2QRRDDuSjRaq5n@AgxgKoFd+b4ZG_TqBP%+qff zPL`h?6#1eibKH-Eydh_3HlI_~KE=EO-1U5$cf6w+(f8oUyKddSr$*tCL_`ie ztI1S;fWAQzetMbJ3w;kR`unCHkGy1ASM0;BKCac9bhuHC)?1?$<5uNxccLI+J9$L! zEP3Bn2HnxnI^}B@(+(Xz5OvsgOPBjSTiq6OS~>boA(>3&kF=89j=WwUJ6c(!L*LMH zoZ(Wvo-BU0T0-&BP+x={vj8pP^0IoSz&P5Tm5(Hg?jW+P(M+sN%-hrltEv_KkSnz3Gf_?Ic&$c{b8|LTJ2p79TpxDPWXk4<&Pa>jBJ z35IknY!(sS{9b$Am|bJv!0sGwF1jZM$_r!#Z#M$R@X3z$6*gN0^d~pB5bif08x%Gv zd|8@()@C3;&TvR7Z0oRTZp*{5!t$0Ixxse39XHhkr<=UWf0bu?Fgf3okDCU6>N%%HNf<^=Z2HFxe0@!pP>X5K0(A z*yBRKh}>?77p0GR@<~349A1!mUX7klgfkowqc{|rmS?%*C7J&7EtMfn8D_kIRy7A5 z*Ywt!4-w8AtSxkOGuQbQW5mOA$%Yh{68;>)>I;(ApM1N5$RF}`XV)}xzy{>Bam~0* z&G_CLFV`9`e9ct}n|=I3JBh)5);3>-Z?A1YsJJoQWu@(;tn7?g*~z-H(=WJCA0ffM zjDH5_n4*4=m4%XpZ#YKUn2MczayN_TEK7w|`_W=*fc-kKQPx z^NdK{KGr#UJa8(bN!FjnutUTqW@Fq@ngAy`KDvkvypQWbdtMLs(W|m*H5lJ3@;)@c zH~28DXKQCNPUX|v;ksjNFEA;sDsAN)#72(+MagxnQO#e@dRbjhDXv$rNDa=WT(6){ z&+Ft;2+#Jt{zf?G8tsPLuoqW3h)?25j(XZ2vur=Mr7;vq8V<`oRC3+%dP;0YG}?f8 z`^rbv{mvN4p&^5Vu_Z#$cHPTO?|6AIr*C3^`{14|2ix&zJDR8i_r2a32fEyGS!EKc z@apy&9y*eUT*{ObY`8PogpKyDtb^dkxFm$g>Gq3UhV@D&cZ(RfaVg?Muc~~Sw9J~) zcq%?16j=KG^&}7Dj*iT5Zozn+nK9d}8ZlA&-fTjlSvT0bwvwTCe7O4Shrmfw+Q9Ub z0L&NR8Ev~mGkC1kA^GWvzJ1fJEg}ku-U+GMtV65tR)plduR*)os&LkNPGi;v!S z&~r@s;MyHFOijH#?Ny~VuO8yoHmtEsm?BKK3&}(nCcCL`6|=wfvCef|hG#kFo_HFb zTh_6)G}%dJZVC1Dn+}ZLj+q$IuDE}beAKfVCGze!ZLF& zz2gYBmCnsG8B)<7P<@k|5YSg**iByV`|y>Nkz$}pK<9dtjZpbZbdROki_LR zW33u;Gc`{OXS@&7?2EdZBxG2GGswu-skOM;k;tm%%26Cr$Wz?J zyHR8nlXajo!btH*bFye%LS&@`S3okSuJyt5*F`o*VL9&Dvr2B}aAu!@PrGlMs>}}E za>8-&#op&@E;+4k_PF^(&ZBco;&aP@k&;wPc`_$G!7;b&O5Ty%;{1f?)%+O3jo0g5 zcf?1f>RpfHgfld+SLJhPrpR5@@5|=36q3kcDQ!aU$}PL>){$F5J~epp(*s@mKJCW6 zqP-4}Zf@aZjeUd3$Y0*rysXzD>T3AdmG@^dy$q}GhO8@2_-YM{+QM^VwUJH{yya@s z{ZZrk%p$3timJ~EG_N&cEZmSDwW81!~0?eD|M1M6JgJ{tu4#nyZ+PmunloX zq-sh+Pp0ENojh5-@&#AEe!XUV#X43Ntzr)y+UmomrmN|zm$5uixViF_oC?}lVuSid zyJ>a?hP5o4F5m=m^Yh(3n`2Y^Q($AB=?CaHu^U7jUKuQpf7aCDX%J$W@4`KuKK*%g z@M+QRrbdO;j~Vv&>INMTSf9dS)w`-CC$f`ki&#s}WasFXWuLEf<|lhaC2I@lrf6Q? z^pQTihgGzS{_#O|P+(Q%Qz^N}vG=;5^cf!QSkcD~%M2Leb+Ty!4CM1p1{$%CxO3PA z3g$S68pXLpynDOW?ZeFSmo)EUe^SR2RK7&Os3mR@(rD!O%CH#8AGIUDm-qZpfAU9( zTjigYxD{8XINJPGom_j&4neS~e?C)H>$WC{rR8vFtU?aP9+BKI798%qn~SK%cFYtPz! z;rkM_<tb6?C|yFx)^g|b?4+j`&wqJEpe(uQJJfuektodw==Wt zemdC{_SQeCIjsvmBrnSrc{kp$tuW-YgXvJz4dp$;TB4Dig-36C%sexw-qfx0rFER` zxL}g7w<(>`ZIkFT$R`KYbH{3=4_t`FxCT3(60O9)6r_}$K+3+{Eu_HC_rUmeQr!#G z6O&c%R(y;bF#%h!+%xU5W;2^H+`7ammPbVak=@|42Kd~wx%E|tr`A|=f?a^QU{R%H zO<(@~h$)syow3LDCYJ+t@s2g0z8N{?Dra065T3GsV&;@_Un)C%I>BVR@_em1c}+g= zm!T{_Ro~C@#j7z}N0~izD6dOXU-T42rcf9=Z$1PjVSLzR3N zcEx<}I$L-ahJgly3G`ejgxy3pGq|3rI(!e&%gua#IqAhVLl199gzMp5pfc5f7SMbK zL|2Nt3xVhgR!D8wNwgv1q59X59l}Z?VK`}|IeZV^+7-SVQg0V`g4-+zSExR)3aBLv zz`4R8jW(E9>=wCLH2!>YB{G@f=4!@>qE^%eMSr2GU?{3pfuSKh4Pa8jM1FFya zbBsZq?jIOaX*dsM!0uVoD<=o1O7l*l8{P)*hW{?ndw1@bE6fW+OXDyrl4pd;x!Bms7^tex^#Px@3)#E5Im^J|o}Qi( zo+t^5iyd52T3Q;8K*EtoanM8D)tl^w_Yx<&ZiGP0!uYmbkSJsr1QTyfad+D;Bs2%u zc^+W0s{|Dh2?E6l4!(d(N}#C708rqg43Ik;cLLExeh10gg{W(5OCk_K6=(@0^baPo zR|;#1MT^4Vu=(GsP@J6H$s{*#ISAwr7y!RHsH*BlL>E_ppS+|5Zm!plHfSAi2=RFf z`Q60{bL$27#D2e75KJ(K{(NBwO#_89lG(kI{4T`CH@X_x%e> z&QceM8W2tRciDtU{Qt+#zYF=l#>am-@-IjJAqxB}TK^DX{}}AQ9Qk9?{X+x)<;Xuo z*gppQFGv2EbpO!6e>w6G5%!P4{>za+Cfz?Y@L!JnLxlZfu>b#XxHh32s5HW>)3!U1*s4+uuiXRLF{B*%lXWk$l2G?`M z6NpYArU_Seq!1jScq&{6L_-%uRu@MK|HrdQf^aH0kqm}`fe18A3MLI6%fKWhVIUm4 z0F8Oa1yTc+|7$c*3#S7}EDVq?oNtG%$hV6k^FQz-mD-XP-LEqcdRJY-}Bp zJSe!n5GEk#FM-Yq1K|83_UV{`M*|C_Sn~J97_e{=xIdEyBpO7kVMyp?KNvXNb0Ipv zR_^ai_}S8^OIboGhz5T`e(Dn$7$mnpA^+d-bdLN#;VM#k;d+4_{tCVMY5=76e?oo~ zIHpk&hJp@YgrU$d6b6P`q?^>4enGQungFzE5k^41ek!g|$6o;aOC6Yf%mgXyQYQQj zOh~Pk$p1HiCAqr6cYt5J+?}k6E+n!YI6;;`a>6^#8LYW^XQd1X0d=8^bP(8&UoC1r z>;4jtU+sF}iQ59z0NV1a`F4=V4$zu`UVUQ<^)VnY-``d}I~(+*5<1A%1@8tP_E2{K zLtwF897$y2H+v0j%G7Ukm9-7vy4L%@J@^9~@w*BYWAVz5~O}@M1Ibh zpA+k^91mV!~iDgzZP5UPlz#VjusPxI@@0xr2n26z^Kmo1Pjy!*xTPC2Gx)F?<7O&C&ZZL z&k|z%zAN^_ko{a@f37azoMP(0MFtdXJHJH?>Q4OM5d%0=OD)>0kzYcMU%OWSy=X{7 z`|VPr@oULYr4Zbq`y$A~W2jb-N{~6F(J`CzR^|ZDn#EbK64aiFJ>Hq7iU%>mt4#|JCdW;kbFdK*~N&*9TkCDdy=IWueEs8Ud z?1^`Dq%z+T+y}VADXy;Ki^Kp0M@qxdOIe7U$3kib+b1a<28n_Bl0C^z5k_ZXh z@3D{ovIboxT!=P6{uYWb!Gj1_F;WwUL|GgK@|c${06TvH&=&H?3z)?iL{o48aj*a+ z8gS!xG|sM&KstG?;ePZS19^!sjrAoKX=$WpNbHV-W!1tCkd9>0SuHPep- zh&@Ybke=oZ-%rAegSaMS5`KX^dLHta#qzEKvKt*Kc3=kuR&*{W6xvVih#=pL2sd;k z>bko@cV)oD>H>+KHD_kC9xZ&Yi7AZi?&vuC3jxgQY`p5*&ivg?*nub8i4e)+hPy=> z;XCmz4q9Ye3NVq-TcQmNB$W~Ymhf-+mN052=KO3@?7Z8Vx%50abv1Q$1OkIYAaFXQsz;G-Iyg)nXf^DCoV~ z?E58G&<806rUx$+^a5}&03LKj0W^>R9s~yo+Mw%yIzJl11;S5t_JsquU;!@QmWh*= zhf@gwb{8o9PefG)N zz+!kn4WJbBg}7jl2;iqKYQrv>7mGnlEukMqN_xrKFgWxQT(FYZCA`EUpy1cSd4cz_ zv>#GxNgEEeREBUE>=Jl5Dd-ku;T%#+5Ro8A%}QDKR|oP*Im$t zLZh*Z`+>G4@K9*1)MB{;Tw9`VC=3?2xF2X*A_t%ia=;hhf&u>QVxD7gs3kgs!QqzZ zDrj56ON^8xV(}bUfXmW0DZ~=Kf!%R2E?6nte0_6s!IK<`F3_Wr-6S6(Fl%t=ZV*o895ce0;H5QN*b-KE~TudhQLWlDkIcYFc@VOoD^CGq&@#_ z7w9Ge+zG4L6A2Ek?oKc`_`@Y6Qb|%(T~Zm1MW`#OV$=|-IE0e2BuZUXO+^X1>vV;l UNm0!&u-{T>#!Z{lbk!OEAAee5v;Y7A literal 0 HcmV?d00001 diff --git a/spring-2025/sen-107/00020/a.out b/spring-2025/sen-107/00020/a.out new file mode 100755 index 0000000000000000000000000000000000000000..7cd880011c0e58dfca860ba8ec47aaf1b18b2ba2 GIT binary patch literal 13224 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 literal 0 HcmV?d00001 diff --git a/spring-2025/sen-107/00020/lab.c b/spring-2025/sen-107/00020/lab.c new file mode 100644 index 0000000..e1a234b --- /dev/null +++ b/spring-2025/sen-107/00020/lab.c @@ -0,0 +1,243 @@ +/* matrilineal +* +* Build a simple, non-sorted tree of mother-daughter relationships +* +* Created by Nunthatinn Veerapaiboon, 30 Jan 2025 +*/ +#include +#include +#include +/* Adds person with a given name at the root. +*/ +#define MAX_CHILDREN 10 +#define MAX_NAME_LENGTH 25 + +typedef struct NODE_T +{ + char name[MAX_NAME_LENGTH]; + int numChildren; + struct NODE_T * parent; + struct NODE_T *children[MAX_CHILDREN]; + +} NODE_T; + +NODE_T* root = NULL; + +NODE_T* createNode(char* name) { + NODE_T* newNode = (NODE_T*)malloc(sizeof(NODE_T)); + if (newNode == NULL) { + printf("Memory allocation failed.\n"); + exit(1); + } + strncpy(newNode->name, name, MAX_NAME_LENGTH - 1); + newNode->name[MAX_NAME_LENGTH - 1] = '\0'; + newNode->numChildren = 0; + newNode->parent = NULL; + for (int i = 0; i < MAX_CHILDREN; i++) { + newNode->children[i] = NULL; + } + printf("Added\n"); + return newNode; +} + +// create Root +NODE_T* addRoot(char* name) +{ + if (root != NULL) + { + printf("Root already exists.\n"); + return root; + } + root = createNode(name); + return root; +} + +// Helper function to find a node by name (DFS) +NODE_T* findNode(NODE_T* currentNode, char* name) +{ + if (currentNode == NULL) + { + return NULL; + } + // Found at current node + if (strcmp(currentNode->name, name) == 0) + { + return currentNode; + } + + for (int i = 0; i < currentNode->numChildren; i++) + { + // recursively find in Children node + NODE_T* found = findNode(currentNode->children[i], name); + // Return node if it was found + if (found != NULL) + { + return found; + } + } + return NULL; +} + +/* Adds person with a given name and mother's name to the tree. +*/ +NODE_T* addNonRoot(char* name, char* motherName) +{ + if (root == NULL) + { + printf("Error: Root does not exist. Please add a root first.\n"); + return NULL; + } + + // Find mother node + NODE_T* motherNode = findNode(root, motherName); + if (motherNode == NULL) + { + printf("Not Found\n"); + return NULL; + } + if (motherNode->numChildren == MAX_CHILDREN) + { + printf("Unsuccessful\n"); + return NULL; + } + + // Create new node + NODE_T* newNode = createNode(name); + newNode->parent = motherNode; + motherNode->children[motherNode->numChildren] = newNode; + motherNode->numChildren++; + + return newNode; +} + +/* Prints the person's mother. +*/ +void queryMother(char* name) +{ + if (root == NULL) + { + printf("The tree is empty.\n"); + return; + } + + NODE_T* node = findNode(root, name); + if (node == NULL) + { + printf("Not Found\n"); + } + else if (node->parent == NULL) + { + printf("Not Found\n"); + } + else + { + printf("%s", node->parent->name); + } +} + +/* Prints the person's daughters. +*/ +void queryDaughters(char* name) +{ + if (root == NULL) + { + printf("The tree is empty.\n"); + return; + } + + NODE_T* node = findNode(root, name); + if (node == NULL) + { + printf("Not Found\n"); + } + else if (node->numChildren == 0) + { + printf("Not Found\n"); + } + else + { + for (int i = 0; i < node->numChildren; i++) + { + printf("%s ", node->children[i]->name); + } + printf("\n"); + } +} + +/* Prints the person's sisters. +*/ +void querySisters(char* name) +{ + if (root == NULL) + { + printf("The tree is empty.\n"); + return; + } + + NODE_T* node = findNode(root, name); + if (node == NULL) + { + printf("Not Found\n"); + } + else if (node->parent == NULL) + { + printf("Not Found\n"); + } + else + { + NODE_T* motherNode = node->parent; + if (motherNode->numChildren <= 1) + { + printf("Not Found\n"); + } + else + { + for (int i = 0; i < motherNode->numChildren; i++) + { + // Don't print self name + if (strcmp(motherNode->children[i]->name, name) != 0) + { + printf("%s ", motherNode->children[i]->name); + } + printf("\n"); + } + } + } +} + +int main() + { + char input[64]; // Input operation name + char name[MAX_NAME_LENGTH]; // The name of the woman + char motherName[MAX_NAME_LENGTH]; // The number of woman's mother + int numOperations; // The number of operations. + + scanf("%d", &numOperations); + scanf("\n%s", name); + NODE_T* root = addRoot(name); + + for (int i = 1 ; i < numOperations ; i ++) + { + scanf("\n%s ", input); + if (strcmp(input, "Add") == 0) + { + scanf("%s %s", name, motherName); + addNonRoot(name, motherName); + } + else if (strcmp(input, "Mother") == 0) + { + scanf("%s", name); + queryMother(name); + } + else if (strcmp(input, "Daughters") == 0) + { + scanf("%s", name); + queryDaughters(name); + } + else + { + scanf("%s", name); + querySisters(name); + } + } +} diff --git a/spring-2025/sen-107/00020/matrilinealDescendant.c b/spring-2025/sen-107/00020/matrilinealDescendant.c new file mode 100644 index 0000000..acba8b2 --- /dev/null +++ b/spring-2025/sen-107/00020/matrilinealDescendant.c @@ -0,0 +1,226 @@ +/* matrilineal.c +* +* A non-sorted tree of mother-daughter relationships +* +* Created by Pasin Manurangsi, 2025-01-08 +* Modified by Thanawin Pattanaphol, 2025-05-02 +* +*/ + +#include +#include +#include + +/* Adds person with a given name at the root +*/ +#define MAX_CHILDREN 10 +#define MAX_NAME_LENGTH 25 +#define MAX_PATH_LENGTH 100 + +typedef struct NODE_T +{ + char name[MAX_NAME_LENGTH]; + int numChildren; + struct NODE_T* parent; + struct NODE_T* children[MAX_CHILDREN]; +} NODE_T; + +NODE_T* root = NULL; + +NODE_T* createNode(char* name) +{ + NODE_T* newNode = (NODE_T*)malloc(sizeof(NODE_T)); + + if (newNode == NULL) + { + printf("Memory allocation failed.\n"); + exit(1); + } + + strncpy(newNode->name, name, MAX_NAME_LENGTH - 1); + newNode->name[MAX_NAME_LENGTH - 1] = '\0'; + newNode->numChildren = 0; + newNode->parent = NULL; + + for (int i = 0; i < MAX_CHILDREN; i++) + { + newNode->children[i] = NULL; + } + + printf("Added\n"); + return newNode; +} + +// Create the root +NODE_T* addRoot(char* name) +{ + if (root != NULL) + { + printf("Root already exists.\n"); + return root; + } + + root = createNode(name); + return root; +} + +// Function that helps finding a node by name +NODE_T* findNode(NODE_T* currentNode, char* name) +{ + if (currentNode == NULL) return NULL; + if (strcmp(currentNode->name, name) == 0) return currentNode; + + for (int i = 0; i < currentNode->numChildren; i++) + { + NODE_T* found = findNode(currentNode->children[i], name); + if (found != NULL) return found; + } + + return NULL; +} + +/* Adds person with a given name and mother's name to the tree. +*/ +NODE_T* addNonRoot(char* name, char* motherName) +{ + if (root == NULL) + { + printf("Error: Root does not exist. Please add a root first.\n"); + return NULL; + } + + NODE_T* motherNode = findNode(root, motherName); + if (motherNode == NULL) + { + printf("Unsuccessful\n"); + return NULL; + } + + if (motherNode->numChildren == MAX_CHILDREN) + { + printf("Unsuccessful\n"); + return NULL; + } + + NODE_T* newNode = createNode(name); + newNode->parent = motherNode; + motherNode->children[motherNode->numChildren++] = newNode; + return newNode; +} + +/* DFS function +*/ +void dfsPrintDescendants(NODE_T* node) +{ + for (int i = 0; i < node->numChildren; i++) + { + printf("%s ", node->children[i]->name); + dfsPrintDescendants(node->children[i]); + } +} + +/* Prints the descendants of a given node. +*/ +void printDescendants(char* name) +{ + NODE_T* node = findNode(root, name); + if (node == NULL || node->numChildren == 0) + { + printf("Not Found\n"); + return; + } + dfsPrintDescendants(node); + printf("\n"); +} + +/* DFS function to find the maximum chain +*/ +void dfsFindMaxChain( + NODE_T* node, + NODE_T* path[], + int depth, + NODE_T* maxPath[], + int* maxDepth +) +{ + path[depth] = node; + + if (node->numChildren == 0) + { + if (depth + 1 > *maxDepth) + { + *maxDepth = depth + 1; + for (int i = 0; i <= depth; i++) + { + maxPath[i] = path[i]; + } + } + } + else + { + for (int i = 0; i < node->numChildren; i++) + { + dfsFindMaxChain( + node->children[i], + path, + depth + 1, + maxPath, + maxDepth + ); + } + } +} + +// Function to print the longest chain +void printLongestChain() +{ + if (root == NULL) + { + printf("Tree is empty\n"); + return; + } + NODE_T* path[MAX_PATH_LENGTH]; + NODE_T* maxPath[MAX_PATH_LENGTH]; + int maxDepth = 0; + + dfsFindMaxChain(root, path, 0, maxPath, &maxDepth); + + for (int i = 0; i < maxDepth; i++) + { + printf("%s ", maxPath[i]->name); + } + printf("\n"); +} + + +int main() +{ + char input[64]; + char name[MAX_NAME_LENGTH]; + char motherName[MAX_NAME_LENGTH]; + int numOperations; + + scanf("%d", &numOperations); + scanf("%s", name); + addRoot(name); + + for (int i = 1; i < numOperations; i++) + { + scanf("%s", input); + if (strcmp(input, "Add") == 0) + { + scanf("%s %s", name, motherName); + addNonRoot(name, motherName); + } + else if (strcmp(input, "Descendant") == 0) + { + scanf("%s", name); + printDescendants(name); + } + else if (strcmp(input, "Max") == 0) + { + printLongestChain(); + } + } + return 0; +} diff --git a/spring-2025/sen-107/00030/a.out b/spring-2025/sen-107/00030/a.out new file mode 100755 index 0000000000000000000000000000000000000000..420fd0a3b0a602097f06f3efa6aefb62d91263bd GIT binary patch literal 13680 zcmeHOeQ;dWb-%lojKCifHg*K0VF8QEEn2T-;Ru<8mF2ac7=H-aGKNCetKBDQlhy8K z_pKv2F_;RaENgWff`dc8l%zvF6K3jkAmcE_GIg+EhPGmw0Vi!Hp2W1Pkx2v*Ai!n& zJNMr6^mfrQolM(5I==Sqx#xF2?z!jQci+4BtsV$$-RyR`1Q)mXtRT);;g^v579!ao zS&cP|CBiQ};ySSqNCiHADIuzAOwYQNfN7Q1TL4OSqDBKXepS)*lNx5q5fZJ`GDZBF zQ?zcWVwtjkvirF9j_SaeI_;>Bvwx)g&NldEg=tLp@0g}+M=aS@eM+i}Dz9Hwm`>;p zG3C5ajP$9c1WD>IqN^k)1XI$bLXFG4Wo_IAE* zMgEZXI<(!lRw&2cTH%)!riTs!0$|E-mVGN(L+=U5a=%-bu z?Jx_sJOWXn?hwAKuk)iud>_dt&lOPW{(^XFc5*`U`-!KhCQnH|MLdNud0g_JBc9SS zIV$;X;^~r@JS_Qph^JId9+Z41@s|;wl>8mU)9_F3mHbBHFDJf3@-4()LA+n`jl?e^ z-Upugy!MUu>??n6WPfc8ouBU56%PQ6mFiWpg+kv)(%vYB&6w(IQJ zUiipA^1^EJ;i&K7`b(#EoF0yI%nw<@ z%LXnE9k?h4>!6%Ba(2=&pT+2^0V2?KDFCfV3=8qYASCkIGnJTOaRGai^xWSR&Je?*4Er>Y-1 z4n7x{9_espyQYoYilZbrYGfaK;UGErsua&i@eJ_XLlQ^7ClC%kM<{GPn-6^;gQgiW zVaOS+lBgziTuHBxQp~`qP0EA61K#peH_kH!5&gl6Y14lU}i&Ly82L< zMwhNN>t1MKAi8ETK@HSrVbMWJTdEkOJ=@VS)n|*cfpb%f!JX5tL3JHQ|DhOZv}bA^ z(v|vS%9@@8a-2`T<{abizfW_8hG#s#9(DUV@X*zl&77B!S3mS1(m5Wuh;K2qd~6af z)EsGq%~0T?D;K!9A#nc7uftc~7%?c5pmJ?MLe7l6VOt2*BBh4%H$COa12Qa8IdD94CT4a7c9rplb(C zV39oz*Z6duFh&BWiZ8Fbq~pqb9oYwFC%;DBp_u?pJuhcwX;GOOIxr&!^@O0#Uq~FZXr4d9wdDofNp$j#0 z!|2tn(DR~UM6bv5|EOF__n9Iexys>HYG~*Yz{pkJuh}Pv9j^?7rGn~SUFBKy;Ds7m zgGPpDB@q00q^%^722r0G)?AShdn__cYxN}yH-JtS8&(bQkVT#S**rq;R>Pg;! zhtSqgVAhozrgYyLnEmo!OXdGn2G+!)-Rqmy#3Bu` zXgo8}FwnfdVSSS~o$xlwe$qyy8XvkyX;UF9Ldabc;kUk(<1IQ#KT>E9wd^CP5KU!p zYG*$EsxtWYGB|C!=kpUOgKsN?KMvf3Pidj!koo*CDT8;F!LKfZ-&Y3T4E#!QwK(YW zqlWVZ`Hio%l?o>ZMKWWhMbb>A5-HJ>GEHF)L@f~vM$?IKkEmJnppA=+76J)*EvbB9i)u6eH7 zWLF!#x1fpM{zP0i5k#17?5N%HUxoa3X-;7@y%vbiL$5~n>%>>Tj%imRG8%hY@(aX4 z&1bHOV(;n}Ijw(ojbGMiuF6TO@pBFw26o{*(gvF5vt4w4Y2!?Dl1r5X$Ns`DH4ePO zMsbegz@6t-9tSS3D{WKnz^QF6J_l}(IfTs)oHp%T{0@8(gP?{3U+lm;95~HkE_)of zK3bC^8aHRz9E!%wh{sBJ`%rLgQn?;CnBaa`*{6mJYo(g z<+^lTS~N6pTLGHcEuL+em=#UNOiwD2ux$5fG?s}+yjKWJ^LWAvh9VJ9T^j$d5MHlW z$g1RaC6a;^q`s(&2_kLDR*02LbjZ~pHRrl^!G?#?CS40ZeWOr#8T7H=77Bk&JSg3&_y4X?pncyB(}luS zn5aiVn?Rf2EEINuj{d$-us}aMQz$$JdN=6Ppf7>`4D?r^Goa&mthfq8>cO)^6KDi< z7wC6EEl^s=skruc3fDl5>)OSaRUL*M#YQ)PJmR~F6gFK}LzoYr3dG2Beie!EnZ8gc zOn{1|HJg{#-ch~ii&Y23?bmGhlXa_ZAeel`@VOth#|UU$TJsfm+meOuAD~4gKLmIo z`n|76{smk96!3c?A1#u9)0V#s{NEs#r)=zhLD)?S)cys0R=rgye5c6%8@Byo^!xje zU+a|bmSSmtGvwcfJn59XKX2P_h5QZ3S32c)&e_Kx{|)4Mr`-J;+x`&bKg77+T_oRS z%b$Y$Jmi#bJAV(%`F|PmDvbLEr+nX>`~u`RLjFro+kU}Wm(n03b=FK{Oyf)Eqwa&^ zR0Zl}Ld7LqMZCL&C*2yUr|ijw)>BNiOXX4qE@j|S1}ziHSV)k-Q={bkobck6 zisxryL(BQu_DM2A;b+=f#R~m8QFH2ELQGyi_w#+lqdUsaGyIJG32j-s+%Id4Pb^bB z$8Bgm-a~NvI7pHGIjr?@rXzXID;~=vAJ=m2=KqZFd*{*y_v!Kdil$%J^hr&Btmzp| zU)A*AHGN0Zg?b*X)bu7zsl6?2Z7rU9JSD95ti8qS^RD$Y`WkQXt!up1Q{RbAgAuZ{ zpux9VwC-+cO0I2eZWf)pTT+>LoF2$~!{Jg}v2k|`J>_>tL?!;G72+?@dLVL0mU6(F(y+{{Zaw{5cNSWBCs~CNr5={Cj!KA+u4Ed+I zOV3*LaJHp&m1|vSt^NCs-Flqn(=oM->3ll8K6L7NFrN;u86LfM%%_voZLQSn(tJAX zhv^@x!?E7=F)?$jbvkBB-+Tor#p%SGg;E*C=E4b4>F+3(mC>i;Wj8!=9@yV?8Xt9B zPb6#9IIrJ?Q8Dmw;e6;}pPyJ7a#?oCI#xZs9&1>92^DIW?+1+krPN<;ukVaMiOPKa z{ZSeGS?Q-n_-g&A6_@$^ya*K+R`b&J>J@2PE%M&27aY`sqo`Ho3jK67fVI6 z#%Z5Ph0ZeO>u;~bD+I4Q$CSF*54;A~(P&AYA0T~qh1jdFM}BVkK<9^lH+Pfv^SJi^ zGo4R)<^b6bfYUkdVeP+4>mSqY9xQ41Y3+x8WJ5*n%|U-6aS0WDy<7%AR|bEx3|@gv z`IYWk(N_{r4e(`H3Br25$+HMVaFfPQ>UDgdj%vNezoh4XUgH7sk31YL$-@rP$7JFA z3wN$d>vMiMZz7zs)_M~-aK^noXoY$S=r((!aez3~MlEfbsi4쇂GY!p1BG?;C zbcbTWh?PjCgQ3iT2q$nziLA*n=B(FqBG#27_kYN)6(eJ=AXoBbomGL6|tW zAl=%FR1>M*a34DfuKC)_wz}-I&&{M*0-hWnuI*jZ%d?-i4@Lgji{Ll zrNVuKh8e?41N{=g)+cZDLZKL-cLO^U2tTqFIW6Z=#?=~&iJ(bmosw;*W8Gc!RzhY` zMB`~QWl3~99SqCh=3MKbieFyXvEZcxh7hjR+Xel0!WL8P`aMPwR`NyyF4Bo$Unm}l zA*%KraE24$U?y!w^lOqL>o87;Ei<5xvt`hj1rZU9#Del^4N{5+PjA6w)D$>?W@SM~ z)d;yeoz@Y{S1#&ZO;IEIwM!93uW^b1^-iV;3I=y=Yt!?H-u>)I^@ifn{Rk!zZ=-34 zNk`$&B|L4?=-Uy>WA{!OCQV(WlwJoFwIRIe!G0^$4Qizn?c@!noL|w!LAw!NsWT0!w82qLZ za)NoyK7H}^MWD%?@Y-P|Qwe0-8q`qh#`XqUC}fc8GF3rx9qokrqhSPrfuk?4Y)`d@ zVH94h7X4TRgja7wWLv=PBzQxXm5O#}EG#(xBZZz1Xm5(;T9(=ceoYm>N)h{;?|%$< zQNgWBEYtw6ueV`crNYl2ic{yjTqin$kJEmyZhx<~pKvOpF83V{+EilC_e-A+G|wAr z?T76(D_TnI`MIW6zntQ83f3>}zhB#P{zMHSD7qm&r%>SB^E2}XDtIN5V0(|Y_h@_0 zKi`*_vVA8ibauh^e7<35`-7BR6iNeC*`CiC?g2)rW_vy_dGShsDD-^pEZUt7b)!aS z6Kv1t5%Fb8#iKR3UDjhthZuC$!91UL9M<-JZC@I{hQ|jO3 z+I9@rp+fVI%V>vRR?lCr5c&n5v&@%|l1oIY*WakDM)ih_rV}kGoOfP7XkKvcl!f|! dv0hR6mlh5|NjTW6%x~|zSs868F(_fhe*pv&ql5qe literal 0 HcmV?d00001 diff --git a/spring-2025/sen-107/00030/lab.c b/spring-2025/sen-107/00030/lab.c new file mode 100644 index 0000000..978b7c3 --- /dev/null +++ b/spring-2025/sen-107/00030/lab.c @@ -0,0 +1,177 @@ +/* AICE Tree +* +* Build a sorted binary tree for competency information +* +* Template for Fundamental Data Structures Lab 3 +* Created by Nunthatinn Veerapaiboon, 2025-02-15 +*/ +#include +#include +#include + +#define MAX_COMPETENCY_CODE 8 +#define MAX_COMPETENCY_TITLE 64 + +// Define the structs here +// Node Binary tree structure +typedef struct NODE_BT { + char competency_code[8]; + char competency_title[64]; + int credit; + int year; + int semester; + struct NODE_BT *leftChildren; + struct NODE_BT *rightChildren; +} NODE_BT; + +// Declare a global variable for the root of the binary tree +NODE_BT* root = NULL; + +/* Creates the node containing compentency's information +**** You may change the type of the function to make it matches the function +output **** +*/ +NODE_BT * create_node(char competency_code[MAX_COMPETENCY_CODE], char competency_title[MAX_COMPETENCY_TITLE], int credit, int year, int semester) +{ + NODE_BT* newNode = (NODE_BT*)malloc(sizeof(NODE_BT)); + if (newNode == NULL) { + printf("Memory allocation failed.\n"); + exit(1); + } + strncpy(newNode->competency_code, competency_code, MAX_COMPETENCY_CODE - 1); + newNode->competency_code[MAX_COMPETENCY_CODE - 1] = '\0'; + strncpy(newNode->competency_title, competency_title, MAX_COMPETENCY_TITLE - 1); + newNode->competency_title[MAX_COMPETENCY_TITLE - 1] = '\0'; + newNode->credit = credit; + newNode->year = year; + newNode->semester = semester; + newNode->leftChildren = NULL; + newNode->rightChildren = NULL; + return newNode; +} + +/* Inserts the node into the sorted binary tree +**** You may add the function's parameter **** +*/ +void insert(NODE_BT* newNode, NODE_BT* currentNode) +{ + if (root == NULL) { + root = newNode; + return; + } + + // compare year + if (currentNode->year < newNode->year) { + if (currentNode->rightChildren == NULL) + currentNode->rightChildren = newNode; + else + insert(newNode, currentNode->rightChildren); + return; + } + + if (currentNode->year > newNode->year) { + if (currentNode->leftChildren == NULL) + currentNode->leftChildren = newNode; + else + insert(newNode, currentNode->leftChildren); + return; + } + + // If years are equal, compare semester + if (currentNode->semester < newNode->semester) { + if (currentNode->rightChildren == NULL) + currentNode->rightChildren = newNode; + else + insert(newNode, currentNode->rightChildren); + return; + } + + if (currentNode->semester > newNode->semester) { + if (currentNode->leftChildren == NULL) + currentNode->leftChildren = newNode; + else + insert(newNode, currentNode->leftChildren); + return; + } + + // If both year and semester are equal, compare competency codes + for (int i = 0; i < MAX_COMPETENCY_CODE; i++) { + if (currentNode->competency_code[i] < newNode->competency_code[i]) { + if (currentNode->rightChildren == NULL) + currentNode->rightChildren = newNode; + else + insert(newNode, currentNode->rightChildren); + return; + } + + if (currentNode->competency_code[i] > newNode->competency_code[i]) { + if (currentNode->leftChildren == NULL) + currentNode->leftChildren = newNode; + else + insert(newNode, currentNode->leftChildren); + return; + } + } +} + + + +/* Prints competencies in-order +*/ +void print_subtree(NODE_BT* currentNode) +{ + if(currentNode->leftChildren != NULL) + { + print_subtree(currentNode->leftChildren); + } + printf("%d %d %s %s\n", currentNode->year, currentNode->semester, currentNode->competency_code, currentNode->competency_title); + if(currentNode->rightChildren != NULL) + { + print_subtree(currentNode->rightChildren); + } +} + +void print_competencies() +{ + print_subtree(root); +} + +/* Free the contents +*/ +void freeBT(NODE_BT* node) { + if (node == NULL) return; // Base case: empty node + + freeBT(node->leftChildren); // Free left subtree + freeBT(node->rightChildren); // Free right subtree + + free(node); // Free the current node +} + +// Wrapper function to free the entire tree +void free_all() { + freeBT(root); // Free all nodes starting from the root + root = NULL; // Set root to NULL to prevent dangling reference +} + + +int main() +{ + char competency_code[8]; + char competency_title[64]; + int credit; + int year; + int semester; // Spring = 0, Fall = 1 + int num_operations; // The number of operations. + + scanf("%d", &num_operations); + + for (int i = 0; i < num_operations; i++) + { + scanf("%7s %63s %d %d %d", competency_code, competency_title, &credit, + &year, &semester); + NODE_BT * new_node = create_node(competency_code, competency_title, credit, year, semester); // You may change the datatype + insert(new_node, root); // You may add the function's argument + } + print_competencies(); + free_all(); +} \ No newline at end of file diff --git a/spring-2025/sen-107/00030/orgchart.c b/spring-2025/sen-107/00030/orgchart.c new file mode 100644 index 0000000..3cd8d99 --- /dev/null +++ b/spring-2025/sen-107/00030/orgchart.c @@ -0,0 +1,337 @@ +/* orgChart + * + * Build a corporate hierarchy structure and sorted binary tree + * + * Created by Chavakorn Arunkunarax and Phasit Thanitkul, 2025-01-12 + * Modified by Thanawin Pattanaphol, 2025-05-02 + */ +#include +#include +#include +#include + +// Structure for an employee in the organization chart (general tree node) +typedef struct EmployeeNode +{ + char name[32]; + char employeeId[8]; + char jobTitle[32]; + struct EmployeeNode *supervisor; + struct EmployeeNode *firstChild; + struct EmployeeNode *nextSibling; +} EmployeeNode; + +// Structure for a node in the sorted binary tree (index) +typedef struct IndexNode +{ + char key[40]; // Concatenation of Name and EmployeeId + EmployeeNode *employeePtr; + struct IndexNode *left; + struct IndexNode *right; +} IndexNode; + +EmployeeNode *root = NULL; // Root of the organization chart +IndexNode *indexRoot = NULL; // Root of the sorted binary tree + +// Function to create a new employee node +EmployeeNode *createEmployeeNode(char *name, char *employeeId, char *jobTitle) +{ + EmployeeNode *newNode = (EmployeeNode *)malloc(sizeof(EmployeeNode)); + + if (newNode == NULL) + { + perror("Failed to allocate memory for employee node"); + exit(EXIT_FAILURE); + } + + strcpy(newNode->name, name); + strcpy(newNode->employeeId, employeeId); + strcpy(newNode->jobTitle, jobTitle); + newNode->supervisor = NULL; + newNode->firstChild = NULL; + newNode->nextSibling = NULL; + return newNode; +} + +// Function to create a new index node +IndexNode *createIndexNode(char *key, EmployeeNode *employeePtr) +{ + IndexNode *newNode = (IndexNode *)malloc(sizeof(IndexNode)); + + if (newNode == NULL) + { + perror("Failed to allocate memory for index node"); + exit(EXIT_FAILURE); + } + + strcpy(newNode->key, key); + newNode->employeePtr = employeePtr; + newNode->left = NULL; + newNode->right = NULL; + return newNode; +} + +// Function to insert into the sorted binary tree +IndexNode *insertIndexNode(IndexNode *root, char *key, EmployeeNode *employeePtr) +{ + if (root == NULL) + { + return createIndexNode(key, employeePtr); + } + + int cmp = strcmp(key, root->key); + if (cmp < 0) + { + root->left = insertIndexNode(root->left, key, employeePtr); + } + else if (cmp > 0) + { + root->right = insertIndexNode(root->right, key, employeePtr); + } + return root; +} + +/* Adds employee to the corporate hierarchy structure and sorted binary tree +*/ +void addEmployee(char *name, char *employeeId, char *jobTitle, char *supervisorName, char *supervisorId) +{ + EmployeeNode *newEmployee = createEmployeeNode(name, employeeId, jobTitle); + char indexKey[40]; + sprintf(indexKey, "%s%s", name, employeeId); + indexRoot = insertIndexNode(indexRoot, indexKey, newEmployee); + + if (strcmp(supervisorName, "--") == 0) + { + if (root == NULL) + { + root = newEmployee; + } + else + { + fprintf(stderr, "Error: Multiple root employees found.\n"); + // Handle this error as needed, maybe free the newEmployee + } + return; + } + + EmployeeNode *supervisorNode = NULL; + // Search for the supervisor in the existing organization chart + // A simple linear search here. For larger organizations, a hash map would be more efficient. + // However, for this exercise, we'll keep it straightforward. + EmployeeNode *queue[100]; // Assuming a reasonable maximum number of employees for the queue + int head = 0, tail = 0; + + if (root != NULL) + { + queue[tail++] = root; + } + + while (head < tail) + { + EmployeeNode *current = queue[head++]; + + if (strcmp(current->name, supervisorName) == 0 && strcmp(current->employeeId, supervisorId) == 0) + { + supervisorNode = current; + break; + } + + EmployeeNode *child = current->firstChild; + while (child != NULL) + { + queue[tail++] = child; + child = child->nextSibling; + } + } + + if (supervisorNode != NULL) + { + newEmployee->supervisor = supervisorNode; + if (supervisorNode->firstChild == NULL) + { + supervisorNode->firstChild = newEmployee; + } + else + { + EmployeeNode *sibling = supervisorNode->firstChild; + while (sibling->nextSibling != NULL) + { + sibling = sibling->nextSibling; + } + sibling->nextSibling = newEmployee; + } + } + else + { + fprintf(stderr, "cannot_add %s %s\n", name, employeeId); + // Free the allocated memory for the employee node since it couldn't be added + free(newEmployee); + } +} + +/* Prints the corporate hierarchy structure, pre-order +*/ +void printCorporateHierarchyHelper(EmployeeNode *node, int level) +{ + if (node == NULL) + { + return; + } + + for (int i = 0; i < level; i++) + { + printf("..."); + } + + printf("%s %s %s\n", node->name, node->employeeId, node->jobTitle); + EmployeeNode *child = node->firstChild; + while (child != NULL) + { + printCorporateHierarchyHelper(child, level + 1); + child = child->nextSibling; + } +} + +void printCorporateHierarchy() +{ + printCorporateHierarchyHelper(root, 0); +} + +// Helper function for in-order traversal of the index tree to print sorted list +void printSortedListHelper(IndexNode *root) +{ + if (root == NULL) + { + return; + } + + printSortedListHelper(root->left); + printf("%s %s %s\n", root->employeePtr->name, root->employeePtr->employeeId, root->employeePtr->jobTitle); + printSortedListHelper(root->right); +} + +/* Prints the sorted list of employees +*/ +void printSortedList() +{ + printSortedListHelper(indexRoot); +} + +/* Searches for an employee in the corporate hierarchy structure using the index tree +*/ +void searchEmployee(char *name, char *employeeId) +{ + char searchKey[40]; + sprintf(searchKey, "%s%s", name, employeeId); + + IndexNode *current = indexRoot; + while (current != NULL) + { + int cmp = strcmp(searchKey, current->key); + if (cmp < 0) + { + current = current->left; + } + else if (cmp > 0) + { + current = current->right; + } + else + { + EmployeeNode *employee = current->employeePtr; + printf("%s %s %s\n", employee->jobTitle, employee->supervisor ? employee->supervisor->name : "Top", employee->employeeId); + return; + } + } + printf("not_found\n"); +} + +// Helper function to free the organization chart tree +void freeOrganizationChart(EmployeeNode *node) +{ + if (node == NULL) + { + return; + } + + EmployeeNode *child = node->firstChild; + + while (child != NULL) + { + EmployeeNode *next = child->nextSibling; + freeOrganizationChart(child); + child = next; + } + free(node); +} + +// Helper function to free the index tree +void freeIndexTree(IndexNode *node) +{ + if (node == NULL) + { + return; + } + + freeIndexTree(node->left); + freeIndexTree(node->right); + free(node); +} + +/* Free the contents of the datastructures used */ +void freeAll() +{ + freeOrganizationChart(root); + freeIndexTree(indexRoot); + root = NULL; + indexRoot = NULL; +} + +int main() +{ + char input[128]; + char name[32]; + char employeeId[8]; + char jobTitle[32]; + char supervisorName[32]; + char supervisorId[8]; + int numEmployees; + int numQuestions; + + if (scanf("%d", &numEmployees) != 1) + { + fprintf(stderr, "Error reading number of employees.\n"); + return 1; + } + + if (scanf("%d", &numQuestions) != 1) + { + fprintf(stderr, "Error reading number of queries.\n"); + return 1; + } + + for (int i = 0; i < numEmployees; i++) { + if (scanf("%s %s %s %s %s", name, employeeId, jobTitle, supervisorName, supervisorId) != 5) + { + fprintf(stderr, "Error reading employee data.\n"); + return 1; + } + addEmployee(name, employeeId, jobTitle, supervisorName, supervisorId); + } + + printCorporateHierarchy(); + + for (int i = 0; i < numQuestions; i++) + { + if (scanf("%s %s", name, employeeId) != 2) + { + fprintf(stderr, "Error reading query.\n"); + return 1; + } + searchEmployee(name, employeeId); + } + + printSortedList(); + freeAll(); + return 0; +} \ No newline at end of file diff --git a/spring-2025/sen-107/00050/a.out b/spring-2025/sen-107/00050/a.out new file mode 100755 index 0000000000000000000000000000000000000000..1470dbffd15d8702369068da76a6be07ad036f33 GIT binary patch literal 17688 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 literal 0 HcmV?d00001 diff --git a/spring-2025/sen-107/00050/cmkl_book.c b/spring-2025/sen-107/00050/cmkl_book.c new file mode 100644 index 0000000..5e399c6 --- /dev/null +++ b/spring-2025/sen-107/00050/cmkl_book.c @@ -0,0 +1,446 @@ +/* cmkl_book + * + * Build a social network with basic functionalities + * + * Template for Fundamental Data Structures Lab 2 + * Modified by Thanawin Pattanaphol, 2025-05-02 + */ +#include +#include +#include +#include + +#define MAX_ACCOUNTS 1000 // Arbitrary limit for simplicity +#define MAX_FRIENDS 100 // Arbitrary limit for simplicity + +// Structure for an account +typedef struct Account +{ + char emailAddress[55]; + char firstName[25]; + char lastName[25]; + bool isActive; + int numFriends; + struct Account *friends[MAX_FRIENDS]; +} Account; + +// Hash table structure +#define HASH_TABLE_SIZE 101 // A prime number for better distribution + +typedef struct HashNode +{ + char emailAddress[55]; + Account *account; + struct HashNode *next; +} HashNode; + +HashNode *accountHashTable[HASH_TABLE_SIZE]; +int numAccounts = 0; +Account accounts[MAX_ACCOUNTS]; + +// Hash function +unsigned long hash(const char *str) +{ + unsigned long hash = 5381; + int c; + while ((c = *str++)) + hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ + return hash % HASH_TABLE_SIZE; +} + +// Find an account by email in the hash table +Account *findAccount(const char *emailAddress) +{ + unsigned long index = hash(emailAddress); + HashNode *current = accountHashTable[index]; + while (current != NULL) + { + if (strcmp(current->emailAddress, emailAddress) == 0 && current->account->isActive) + { + return current->account; + } + current = current->next; + } + return NULL; +} + +// Insert an account into the hash table +void insertAccount(Account *account) +{ + unsigned long index = hash(account->emailAddress); + HashNode *newNode = (HashNode *)malloc(sizeof(HashNode)); + + if (newNode == NULL) + { + perror("Failed to allocate memory for hash node"); + exit(EXIT_FAILURE); + } + + strcpy(newNode->emailAddress, account->emailAddress); + newNode->account = account; + newNode->next = accountHashTable[index]; + accountHashTable[index] = newNode; +} + +// Delete an account from the hash table (mark as inactive) +Account *deleteAccountFromTable(const char *emailAddress) +{ + unsigned long index = hash(emailAddress); + HashNode *current = accountHashTable[index]; + HashNode *prev = NULL; + while (current != NULL) + { + if (strcmp(current->emailAddress, emailAddress) == 0 && current->account->isActive) + { + current->account->isActive = false; + return current->account; + } + prev = current; + current = current->next; + } + return NULL; +} + +// Add a new account +void newAccount(char *emailAddress, char *firstName, char *lastName) +{ + if (numAccounts >= MAX_ACCOUNTS) + { + fprintf(stderr, "Error: Maximum number of accounts reached.\n"); + return; + } + + if (findAccount(emailAddress) != NULL) { + printf("Error: Duplicate\n"); + return; + } + + Account *newAccountPtr = &accounts[numAccounts++]; + + strcpy(newAccountPtr->emailAddress, emailAddress); + strcpy(newAccountPtr->firstName, firstName); + strcpy(newAccountPtr->lastName, lastName); + + newAccountPtr->isActive = true; + newAccountPtr->numFriends = 0; + + insertAccount(newAccountPtr); + printf("Success\n"); +} + +// Delete an account +void deleteAccount(char *emailAddress) +{ + Account *accountToDelete = deleteAccountFromTable(emailAddress); + if (accountToDelete == NULL) + { + printf("Error: Not Found\n"); + return; + } + + // Remove this account from the friend lists of others + for (int i = 0; i < numAccounts; i++) + { + if (accounts[i].isActive) + { + Account *friendAccount = &accounts[i]; + for (int j = 0; j < friendAccount->numFriends; j++) + { + if (friendAccount->friends[j] == accountToDelete) + { + // Shift remaining friends to the left + for (int k = j; k < friendAccount->numFriends - 1; k++) + { + friendAccount->friends[k] = friendAccount->friends[k + 1]; + } + + friendAccount->numFriends--; + break; // Only one instance of the deleted friend + } + } + } + } + + printf("Success %s %s\n", accountToDelete->firstName, accountToDelete->lastName); +} + +// Make two accounts friends +void addFriend(char *firstEmailAddress, char *secondEmailAddress) +{ + Account *account1 = findAccount(firstEmailAddress); + Account *account2 = findAccount(secondEmailAddress); + + if (account1 == NULL || account2 == NULL) + { + printf("Error: Account Not Found\n"); + return; + } + if (strcmp(firstEmailAddress, secondEmailAddress) == 0) + { + printf("Error: Can’t add friend to self\n"); + return; + } + + bool areFriends = false; + for (int i = 0; i < account1->numFriends; i++) + { + if (account1->friends[i] == account2) + { + areFriends = true; + break; + } + } + + if (areFriends) + { + printf("Error: Accounts are already friends\n"); + return; + } + + if (account1->numFriends < MAX_FRIENDS && account2->numFriends < MAX_FRIENDS) + { + account1->friends[account1->numFriends++] = account2; + account2->friends[account2->numFriends++] = account1; + printf("Success\n"); + } + else + { + fprintf(stderr, "Error: Maximum number of friends reached for one of the accounts.\n"); + } +} + +// Unfriend two accounts +void unfriend(char *firstEmailAddress, char *secondEmailAddress) +{ + Account *account1 = findAccount(firstEmailAddress); + Account *account2 = findAccount(secondEmailAddress); + + if (account1 == NULL || account2 == NULL) + { + printf("Error: Account Not Found\n"); + return; + } + if (strcmp(firstEmailAddress, secondEmailAddress) == 0) + { + printf("Error: Can’t unfriend self\n"); + return; + } + + int index1 = -1, index2 = -1; + for (int i = 0; i < account1->numFriends; i++) + { + if (account1->friends[i] == account2) + { + index1 = i; + break; + } + } + for (int i = 0; i < account2->numFriends; i++) + { + if (account2->friends[i] == account1) + { + index2 = i; + break; + } + } + + if (index1 == -1 || index2 == -1) + { + printf("Error: Can’t unfriend accounts that are not friends\n"); + return; + } + + // Remove from account1's friend list + for (int i = index1; i < account1->numFriends - 1; i++) + { + account1->friends[i] = account1->friends[i + 1]; + } + account1->numFriends--; + + // Remove from account2's friend list + for (int i = index2; i < account2->numFriends - 1; i++) + { + account2->friends[i] = account2->friends[i + 1]; + } + account2->numFriends--; + + printf("Success\n"); +} + +// List all friends of an account +void listFriends(char *emailAddress) +{ + Account *account = findAccount(emailAddress); + if (account == NULL) + { + printf("Error: Account Not Found\n"); + return; + } + + if (account->numFriends == 0) + { + printf("No Friend\n"); + return; + } + + for (int i = 0; i < account->numFriends; i++) + { + printf("%s %s", account->friends[i]->firstName, account->friends[i]->lastName); + + if (i < account->numFriends - 1) + { + printf(", "); + } + } + + printf("\n"); +} + +// List friend suggestions for an account +void listSuggestions(char *emailAddress) +{ + Account *account = findAccount(emailAddress); + if (account == NULL) + { + printf("Error: Account Not Found\n"); + return; + } + + if (account->numFriends == 0) + { + printf("No Friend Suggestion\n"); + return; + } + + Account *suggestions[MAX_ACCOUNTS]; + int numSuggestions = 0; + bool isSuggested; + + for (int i = 0; i < account->numFriends; i++) + { + Account *friend = account->friends[i]; + + for (int j = 0; j < friend->numFriends; j++) + { + Account *potentialFriend = friend->friends[j]; + + // Don't suggest self or existing friends + if (potentialFriend == account) continue; + bool isAlreadyFriend = false; + for (int k = 0; k < account->numFriends; k++) + { + if (account->friends[k] == potentialFriend) + { + isAlreadyFriend = true; + break; + } + } + + if (isAlreadyFriend) continue; + + // Check if already suggested + isSuggested = false; + for (int k = 0; k < numSuggestions; k++) + { + if (suggestions[k] == potentialFriend) + { + isSuggested = true; + break; + } + } + + if (!isSuggested && potentialFriend->isActive) + { + suggestions[numSuggestions++] = potentialFriend; + } + } + } + + if (numSuggestions == 0) + { + printf("No Friend Suggestion\n"); + return; + } + + for (int i = 0; i < numSuggestions; i++) + { + printf("%s %s", suggestions[i]->firstName, suggestions[i]->lastName); + if (i < numSuggestions - 1) + { + printf(", "); + } + } + printf("\n"); +} + +// Free the contents of the datastructures used +void freeAll() +{ + // Accounts array is statically allocated, no need to free individually + // Free hash table nodes + for (int i = 0; i < HASH_TABLE_SIZE; i++) + { + HashNode *current = accountHashTable[i]; + while (current != NULL) + { + HashNode *temp = current; + current = current->next; + free(temp); + } + accountHashTable[i] = NULL; + } + numAccounts = 0; +} + +int main() { + char input[64]; // Input operation name + char emailAddress[55]; // Email address of a person + char secondEmailAddress[55]; // Email address of another person + char firstName[25]; // First name of the person + char lastName[25]; // First name of the person + int numOperations; // The number of operations. + + // Initialize hash table + for (int i = 0; i < HASH_TABLE_SIZE; i++) + { + accountHashTable[i] = NULL; + } + + scanf("%d", &numOperations); + for (int i = 0; i < numOperations; i++) + { + scanf("\n%s", input); + if (strcmp(input, "New") == 0) + { + scanf(" %s %s %s", emailAddress, firstName, lastName); + newAccount(emailAddress, firstName, lastName); + } + else if (strcmp(input, "Delete") == 0) + { + scanf(" %s", emailAddress); + deleteAccount(emailAddress); + } + else if (strcmp(input, "Add") == 0) + { + scanf(" %s %s", emailAddress, secondEmailAddress); + addFriend(emailAddress, secondEmailAddress); + } + else if (strcmp(input, "Unfriend") == 0) + { + scanf(" %s %s", emailAddress, secondEmailAddress); + unfriend(emailAddress, secondEmailAddress); + } + else if (strcmp(input, "Friend") == 0) + { + scanf(" %s", emailAddress); + listFriends(emailAddress); + } + else if (strcmp(input, "Suggestion") == 0) + { + scanf(" %s", emailAddress); + listSuggestions(emailAddress); + } + } + freeAll(); + return 0; +} \ No newline at end of file