From a2636f5edcaee221a85f2c816231b360e03ebcee Mon Sep 17 00:00:00 2001 From: Ellie Ding <156828162+yuwenellie@users.noreply.github.com> Date: Sat, 19 Oct 2024 16:23:24 -0500 Subject: [PATCH 01/10] Add files for SonarCube (#33) --- .github/workflows/build.yml | 26 ++++++++++++++++++++++++++ sonar-project.properties | 4 ++++ 2 files changed, 30 insertions(+) create mode 100644 .github/workflows/build.yml create mode 100644 sonar-project.properties diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..4625a01 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,26 @@ +name: Build + +on: + push: + branches: + - main + + +jobs: + build: + name: Build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis + - uses: sonarsource/sonarqube-scan-action@master + env: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} + # If you wish to fail your job when the Quality Gate is red, uncomment the + # following lines. This would typically be used to fail a deployment. + # - uses: sonarsource/sonarqube-quality-gate-action@master + # timeout-minutes: 5 + # env: + # SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 0000000..3464199 --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,4 @@ +sonar.projectKey=cs2340 +sonar.sources=. +sonar.language=java +sonar.java.binaries=. From e6e4a9cb6756ecf9cc3ab0a2582edf5b0765e22a Mon Sep 17 00:00:00 2001 From: Tianrui Qi Date: Sun, 20 Oct 2024 03:00:20 -0400 Subject: [PATCH 02/10] SOLID & GRASP: Class Diagram (#37) --- SOLID_GRASP/dcd.pdf | Bin 0 -> 86721 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 SOLID_GRASP/dcd.pdf diff --git a/SOLID_GRASP/dcd.pdf b/SOLID_GRASP/dcd.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d13d01036b6b32987e2b5f3cd9d6d0733a769e0a GIT binary patch literal 86721 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%0D&n(0_NeCX5v(Sy35uHQ zsZJ#;42ZJ7G%^WjUA(cJ9P~)1Eim}L(#WHl`I=(G1>;O2;=*IlIQ<5HR5T?i-Aj9n z3Rxx$*%>J)2n#rI ztl3<}`)}`7a^7?kjp$La5I4!qlQ$tCmu$Saw!w%i97rUk!hEBYB_P6?HSVciH@K`< zG==|apu#)LL2y03B<}Qvs{^uo54hIKpg0f$jPnWXs!C#fkm@MR(na)!**Z6fCZ~ec zgg5wQM62nsC+VV4(fd_#^0P_8OnyEumo}oH(VKQt|C;nrY<1{8iip4+WX?7rC%um7 zJj>q=VSY;4(sa=TEaVIIa=Qo+)Y^y*tHN`iE);2W9IHu`;HlcOB*{=%H zw(q&V=(fKLLf?@fEn9ZOxk-_la(65Arv=ld^7oY&i#xre2E?phAuC@e6bGXO0x^gf z+I2LXFM@`Q56thG7oewNN~>0=oIX(*DUo@~rScSj=G<0LbR&{u=FJ_LIJBra?e>%L zz&5^ph%}Tt!J3?U(@g&rbni%iUj^W0t`Oc{AwVAx3H-g8iDJ;L3K%PV#N~DG#^ZnN z3m}bc%$zd%CS@q6E}Qt%y;6oGRjh7c&HoqBX3|F?J^F7> zyhO+OH#_!IF*mMBWz=|8!aBlQ4{q%p#20jW7}l(?M7zG1AtV^8ZwSkFy0@KKqHo`> zZ2#CFiVh&0O#^}s{8x*_GRTveVuitmp;ZD?H%#}=x*-fn@ELSxk1PILDT&ZB4y2dT zoP==+0wdqm4gT_>j7<-kSLjiiU1_Qdss?cA4?1G|kZKN>l7?HRl~RugIWlCc6Iu(c zA~#7hVQCLo1yl=qzQaAF0opxPpHONyTFS>VBDT5u7b(vSC9O(g)lAMA)s?E5CuwO3kbdIMslC5O?F2 zx47h1u@%@Ke6DElGg*L{{yu4q{)ESCHk{8MBf%BOcU>#T#{wuEuW=TRwzz4&;53c2 zaiah^Ur|U-FT0O6YXw8C+y%|dLi>kQROnY3cLPT;3;qhFl48DO~DwZk&dWWnN{AA)lrS8c@<` zP>|MRkwz`N5wbXb4o;>WChAd3=H}3s3YD4tWI1#~{O!v;Bhdi8dG<>%IOq0K(%?I| za|9y7Up3wyLd!5FdW4|nhM1PX_9#=-yE)V}YP`b=Q5hqw!IjUC()JaaJj6e`{lJ6} zWS_8CUi910^zcn?i8wHgAD!BB$>{SM-D%h{JD-0~jgIloY+3PsP+x(W!Agksn1)=? zl(d06%5K&Q#hncNr7ToXx%Qvc-xv5J@I1xcFc26J;X@u;ToF_z1M{xyaKtvN=wE5Y z$ZQCsKnC$j-X;y6mNq-dvN2JFlwI21rUFU_sT3$P)59*iP&87&$e}fA{6Mk{{Ge49 zb-rk^B7zmj8QEmwq&Do$46&2Covt!cdw;)tnLvXW{m93_M&?`>6%__nx>hAYJGW3v< z!8C~@l=n$4f8h!for;j3h4Kklru9x)Exk&J?G;Ekqg>Ielp2ag!HKZhec1upx;VGw zR-E6M`Bh+40M84JX<|6L;m4#HDqsoGMQ8BF;_JaWctnFiLZ}ZI;!q;LHS<3nF*Y}7 z#-{=i!K4S%`5s=r(~PeYRrjD;lS^Q^GDHE|ZCHLne5Z8Kf5yy|G}^HFjeHN!cb2Fj z3}(!oEas`WqqK`37@P)u6uIAN>0CnX4uZnuEGHCd`=4Vs%B&a<_`}_pDZic`(37x? z6k%%&F5F(fB_8ICY!1LXVGj-doF(Vlhcjym--}06LJKqg)(X>SaAH^nD!c1vnC)@m^C2z7uCS>#;Ny7~#yItFc&k7Go*W$wrg<(9 z9+H>ju~B{hdCXxNStb@&K_mI$U1{hS3T#$@yh@HJWI2qoq&rvKi>PDw;leqxCZXbO zY1Ybqe{fF}<}<`Z@tg~lwJ!2f+Va7fx$|yTKO=EVDqG?<4y%TwkvV1}89wS)lp7a( zALfuiGfM1uXc9(W=nj5>4$*i!6c3dGH2|*!me5q6HF9uTxIh%QG49_nGDnAKhqKj; z`tyx?GOJBK^n#QM(#7BUSCHZJWyGJKs&(29Q}us1{(2&Gn2bLHJeP7vLew;fq{uLT zC2w0nYVq?$z|wpatU#`zT>1&rK9$*m&bQ__G5)(nhdWMRM8=!uV&cV6qc{QjfeBG& zvOiY>Q(XYrXmXSLbVb(AU$rG(U;I1c*f{d4pml^Y4lK`tIQW44aT_exXWrZ8ypJAJ zO=tN(bQnNYb4ajRoCG7neW`zO^jsx%89+nCxx}k_E_r%uqi}Ak=SblRY95gkFo@=z zJK;A-W7y=$_krc#iF`ctXP|Ym4M$^t#=GblCA`dw;qPS{{)rY)9Sn(PWsYzwJFovi zU!*Qt8~-1{k@An(hXxkh9-2{XboWkR5fq>-SaOGRI7~8bO{f>X0q(F{?D|i+xIgfI zHbH~&^N{}nq`{m~z*}n}qpD_U^XaMRul7ocuIhnQ27|Tn7x#?>6bv#`sAeauT`ddfo1{8&bYVv}e@!-Ch)YE(_%*niLPf(TIDbM z7c9l;qPQK$;v`iF=)j$CY1w^4I*^6aEROOzOjZT^iWMnF1SDBae< zlKFK#;#C>9pj`*i=8!LVYvRQc6I>{2YSL?W_cDi=_IuepoMP9+_QqcU3IR4pCHR^< z1*{K?3Q3-5pLgsZ{am{kK<2Np;UJ+3WZsJKA}kZ2FvyfV!<;V;_PAl}3QeEzpWwxA z<-CI>7BU(;+>Sy5)Oqy18q3=&ZZQPF(jTtYbz#7BPM?N%Nlm0sOHX82IRY^)XJvf! zS8WWc9l`LBOC@l3`e!1rcJ7;>5+D^paSjnJQW5ySb0X}Y@dr-k4+I>Pn(H}$+u|SH zfRKQJkc8U7ZJ&x@A|rk?VU8kqjCL9uO(pGZBrHIUEckcXf7!-{_T{C2p21uz>|MHP zv=0emh(e~Q5W0Jn0Q#>r^!e@M)|*5$mQi(*mwRb)zuwdfER2#;;R+dxS#QyNDkvJF z7B&MNPFL5SWEN6;mB*q3IMH0l4su<@_7@o+Lhebh6uY1aODt00stFwLw72p%G}E0>gN9*g+) zWk!=J;dDUZs9kDUJBsQA^G4uyZ_CPQx^oZ^Q$&yeMqJm2q2$QI8pGb;wrr8psU-WP zcbfBhvSD3nM4548e4iwz1J5B!FzAJk?*#goM|XP7=~!P)|CnX16!2oYK4<0yNy}H{ z$mHqIVqZAkt}0A+Od*06$sJY1AQSVIJN1twi|1v0``QR}ym(30_1VaisoZ*Vv4>NF zY5-3LD#t}T2}=<)9jp+XG%nrZ5F}o$sDE0Uhre%HV|whv?ZMf`fTVoo@SVeWP+%ss zFLoi*!@iAF+EGFxFf9tHo|hLY&irF$vuL)q`;>tfeI8ULXS&V=y_q4_CK+HP1aiFo z+6#D^5pVIugn`SdqY+-CEtydp=}1st>8Z%0xz39rxBT87qYv4z7La+j_QWZkI0!O! z6Qx#1pyhcgA%h7{G`(Di8QE_7`LsXj0aJZL0JK+p;^FsWNx2$>9AC^ zhsVVC;bsEF*YTJ@VYZ~1BIBgF>g*nqh6}hjm|5>ty6grweUc|U8mRUv&M~Eb9K;%9 zghh02;yADhTWIcBChNYz?69a6hP9xUFgdL=DUglYjye?0V#InK8~wj5#EEO4kkvU) zcM{~;dlb8lB*|jW`7fRhgK`k#6FKl(5-@gFW_`7sqp&fiKn)YdFJY(6h^*NsHIw42 zY(AWm_lpanG)PNsT2i&($+*pw07@E9K~#+l81AostRIsR%{Z>MIhha?Wqg841Bem_GLTgG(lh4Z>>|2<0HV{$|Gsubt#_j}~!jikL+ytkqr(Z!lxK8UB` z44I%_nBTtFWuhU#gxp%wOnY#8;Kp{nVUuN!vbM244CLrwk;;yw=A>~1bpO5!)`r5! ztoHpX6QzPFFi%J`)8er1e>+jArjtv(}n@tHG zY(y_I1}lKGsTu~~V@|#fz+%qS&?X&_tkDDt2QFNhvMDvc!7>CsR?=m>r*LFK!Yboh zh_WlW%t+~WZ+%+;(|1*RBCU_<-M)atwjjAkR13zbx)H5w-|1E2aZ5xs%z$~eKraX% zCr6Tp*H?EuJ`Y*$lSg!Ol}NWm;h?sk1f#~H5BeHoYqCZnjTdjF2FY`8&aAF?D67Gv zHctLwOmQ`kk=_nzZ%(^*qQfog&hjwLnTILazzzf#wI@ZMH7*}vUBNiOhaDwQ?J&l@ zw*wJ3_J8Uoy^Hz7Neke>|1r~E!DogZybY_3iBSVl&@xDws0iaNoxf7$c|z_4f*gm? zS@SXsW_ENk3AsE5|E_6yjf1H`2Q3DN(lL_7A(Dwfx$|g754&X?RH_uEM-LnKsw3L~ zE20I5a&An#F1@g)9G3sA965?elcz^Zu%O75D~CwO9Z}Q2V;O@%cbBu5{p=WX5cn5; zj(=_AA%kk1AzSQsP%0qNC9@U|x`d(7>#SJ&Fcb%;fdgAnnJO4^ojP}Z+?pTFX z^xYs>czJhuz=)#F7kF7pnFZk4wJIi8jawUaM%fNC@ceP}U)Xf&wiiS6tLsH_3PosS zhC9>f~~X7FgL#R)~xRU=A${X~Icj|y=q1@o|+_&l64(PIPjpZAyW zptEWO*-3Ch5q02O|D=x%V^<2vCt}Etw+`6-;f?`k>xoL7UQj1@Y6{jLi}_mtZFT<# zOj7(ObX@B^8uyK81nGN{*b}qUHIx zC3XripNy~<8)X_041FCot|Lx^`GP{K%fby&`8m;hh;W5hM-#MsKKdm3$me*UeBHZh z`je`Vtu91;m~sEq5?{D!owX(5EXFM}x_5X3DN%;K4DknfTS9D`dTqBYhzslYU#-)k zGt@?iOAraP%%rE>q(tmDTA{6fs3XEF#$?jMMZ!dxq^zjc%z^WLAf5|XB+f0q+kRo$ zby-`weDMWY;iai#(|2jfjfwqaZ>~gRaL3IF3JL~~qYZhY1#rnth5Zmuu2^G{+YNq2 zlMYS1J6j?ZhZd%hmds%Uo~wV@xtEL|f~~I5pUt~vLj0gP2$`WWn`!kzC49?tJqwhs zk4v7zs_UQ(yem{CCQH2nB8esIisv@CGX1)AMrSwjqKx&)B?3|`dRwOiCeezKA%1Nr zbvC$2FOdaf0#~N8U79STr@)F40|%zEj1iK!dr9T^DBP=#JhDW(mP_}))JKxa9Esol zjm%g-NU^0*zY`q(se%<2V)|52kq%2b&sFft*k-;jy6hjoWAi43@zobgeZtsPl{EON3p&XcLM_Z~h_WfA6=oP$crHEXe1rZbnp4g`IR% zS#ILoZfMK4f!hYFv(+`|lME+BIve!>|c&_x0L8cKLnoGm~3F+~;&3 zseDZNwtYcMKh;!%ZU$~78+j;*dy2jmcYIYkr*7LNkXrjxx_fv(h(qqDzCgcs8FjvF zP*jGHmq~+#I~%Q-XeIIs40$F6K-WX6?wag-7nGOnI0sBz$uP*TKq2cF0LHpYE9#S} zy+Jh6*T=2Jjwt*p6HSA)p!@RsJ6tLOikJqAn#=En446$uYOI)y1v@4s3R&b8e^Z$g zvaPKJSW$;6i)PHX%%dv_hD?v(E-t`S?1@+N>GP7p+8T;*J7&xM)e7dFL^LbKgX8yZ zo|hbj8y~p^-uhUMx&r%yXqR%$qO~#!8-PyKO7hdXhAy#Hs5(6F_a%=?2z2Q1*0hEO zG@v3b_ndzqKr|MPwp#$qqj{o06w{1#PF}o&IsvPG!gF72Ck9rTI?9FbdzO9j$oe6A z(Ua?JE=w4%NXS=Fd~^&cqcJH2uE9(z>aT)v@OH3&A6;bjLYX8dyTv&InL{tLSR}e% z>!!UMORnULrXe}th-%2UtgtQJz#7mN%6EsqpUGzXs{^)2*=Y{h06aP2`0`hf*t%c= z+Z1KjRc@D>tTuhaU=lt&yr)rr0^wn=@)9ED`MJ1z5{hB#zh__yK!`(ZM>ce}&@pYI zwj=oE&Doss#>htTU?VKCE}#nY6j4$rG35IO%8P*mMbxgqkv5+cjK6%N$YG@7WQ?sK z%0$}3n8talAxFPGIRMlC@jUT&c2?5b{jDB2;|zJUsEAlbP?&8mKu!Dkirw+ z!M>l*jyz{T*^!6W<5x#RPH0qG${E9mmx7o@=Hgbf!k=nLvSwf!@|8oB0v=Npqwt#9 zV_e?jz*+fZcM+HJ7>x}j-6fFAp7qxYk+l`+mS}%{dTf1^q=nRYg~%9E@YH2sflj`mfqh(lioE>k z=)iEh%g}@<9HCgCEx0ja8~JdiKc{4Bv6$zL_HYJ-3$qik8Y1%TJ_fhE-eyE+Ya6*M zAiP&}J=gmN?HaaZ4?oW|5}&4$D*V?hu8w(txdvdir#mjhr%0&{;#3~9S1rYEhZ0ws z1uD+qcg&BKfOc|+G#7!8U4%}swYW-B0JO-^{+W0^ZQzI0WHTS_19%n53a%>MiWAAg zw>@cCD6}5Cb46xlDja`a&%>)7R8we6$aTGwj38v4HpI`xiAho(3q5l zgXf}q%Q*sI_DOOLQ5OZ?4Qj)NF;Uz~b;ZX%g(eZhy`tqbBs75l7F#wMSLF#fK~orm zUQ^2E*iJ0ipkb8__|skO)yRc?ASm?Xdo-fgm5~8I9#YErEX`fvpu8dIE6*#irEr2x z@I@r9Yd)T#`v-;92+SdkQ5>wf6*0isNF@^iE@I_H!W?=eXra&Np6DaP*U&)lUj~ON z#AFesMlMR2u)MS)Bp!xxma0+#aNgjYLRrG<>+e-&q?(cH{BnHdlK@|dPvu?$t!#KJ zVOU7}LK=vS(|fc0;Se_$l|?+8EGJI3aQax+#wzT0NYEk(=){I^NjBcvlv)Axd2(*ox1 z<4WQv%WuGuJX#U$JVRqZDRh{~GH= zKzzU_OWU?Nse39HhXwRGp>*ql5yE>0nFhc_`pCh=pOmDU{xP)StC^`k&yNHxRbAXj zaWO_B-Y2(=TD=$krQ;>p$^^IE&?#rYR#_C|imYs*SRl`LUw=e3d|IL_3hkDP-VWY? zs}yMB9w)v|DRmSd95VY>t_T5MZm{U6aKcVBT2M@?bBmB1#*ek^`%WvFI)LU(pWHul z>8wUBJ8%F1;3ZA{)`55+N3wSgpKfW*LK6fFDr>Cdq#{~KObDq{S!XY}LK6467LU*X zzQdFtskaM2aQx(v2}1T%Q*-R@`^!4qBDt4`?2eBKQjQOpS%_n11Yr*FZz{&s7V<)F z4qU)&9t7rjQ=GnHs~8koWdqo)`d1q4m6z-cJHBBg*$j+q@k9;2)6Tm}=@SjeHakVU zh1m8?ck+z^^MrpC2(JI&&hrr4VRF_f0*g@Le%8?}K?)^RE?xvHz}Xb>uh*Eq_4hUl zSy-TKnr4x1?u8@NX|^%24(}LhVajnyf)s1-)%d8T05#BXqNlj`QSgb$~ znKgqy%Q4Q(Nka^6-BVT1$N_zfnFR~`n3^)80y#0JjEQ3rHe{neN^9m0!Qw%GbBPBH zvrN{)W9oa6I5vgY7}biL@5@liC{Id=OMzIb%ngC zJWd#lV=>Xe7pSO2tRrA6DlGHTI;i=`4f&Hi+ik|_hCJ@byX-)9M)QA{OajzZ!jZ0W zb>tTjI>L%D?2dspkxpR{qoZ%UHKdC9$js{~?e9}vM}*3VLtbxSYsExeIs~wm zN9#dnWlO1(r`^)LAf36e##^AtStQgX^+j`}89K+v9H=K<{blhKTKUtMP8X(jaVD`E zpfJNXT_s`RwzidF~?ecg0if z%ge+XlE@w%SM1bgXYp5AM#q`v0z2_pF#Jr~FGB=nBCm@3DJd0IOs`7-I~7Vwc*e`K>+lyN7~sT2>!U%y#dx)yRB}sjw5rRBxbI z@lxbC5B@D*S^t`qvo^MVRD1b=7aPm)fp+%_5mz9&&SN2!{_Q z!%@bchYf5pbGD|`Z`lSrIQB=H_Qg?kxQWmeb2vLD9OV#~f=5HAUuzYYltON)jtuCG zd1S>*qk$b_WwIg!pg<$J; z$;c0GX>4ZOq(mAy>CauKxxJ3N{Jt<>jeVI*2>r}#E8+(ntMKI12Y)<}W_Z^o@u>A0 zwkX4&|Hn}zyMO-ndTY!FT#PXPv2TgA=>rinkNUPLdhJBkQpistft|&fwQtYf!rwf9 z{xL!ETwjIcc@!1OGh1J6Kk4AohCumDHoO*EAN!l> zr#Rn1m7?olgmnJ5Cb);%Ir~yCCej?>a&T}XP32dd*%3M87Q6rUX8Ri8c7K-d{Z-QD z`}s2W1=B)e`v`AhYy5xooBw+M$v)xPIN1L$1?c}4d$N$Qvv9F8|NjM{tn56jod1s? z^t|1}TTNn7=)Jnt>gq4wi8J+v%$8y)U!3AFbg(c55-F^>D=Zwkg8wjCJ(L+>L&(`03x@Ymc7cF zY`JJFR-PZ!^=@F~((&43rxSS|GWh-hPL;OvO!!+vfj^EvWoKEn5oJ9ZWO%ZJ#vkhq zsQnE*wg46@|0ZH4UH6&d)7dHnz#E~z#m(+xQ;46Pxi=a~HXyVC@@H{5EXf@JlfKh@ zqL@i9$$@}`9}riWS`C_({2F^=5ytB)WwLB@F6JM)rxAV!+#lHBG{*9>xDk_JLEQI` zVi8(Jky(RDBaP{`wE7(Q2oQfD!47~~eS?K8WA1|+VcrHLDiCZ$;PazEVd5J$L&x#Y zQpX9C`U^>t(%r!jfzuSemE~CJ;l6-LoRUSPapa^}pPAy&3bzd2pZ6PYrAi z)welr-gI0ECBNC~7YdU5Ih(tRm_1)!Z^So1Z*aP+&tx2L9&hg2g=*`yHdg(q`g8sS zFt2z>M{V9`B@H}rMRN{k7L$TiK@`E0EPyU#!G1{d|CSc20g8ycA=eJ@s*4^8okJFt z5xT&Q>VwP*vPcWytQst~(A?|z+HU9uT?^Pe+YxyHSgHlH8C|bCdH3>Bb{rqE9MLd{ zdrs9>aW$g_%H2%AsQE28T%BH}Y8~~5iOOfVDLJSfbUm@3q@$lb{5Bh&54s)uk*(v2 zdkJS7o-J;5))Ncblq~!CZv>J)juMWUoD!A;ti<&*mIH1KVerj4So@Kqu=r{t_#-Fw zHTI6kK;f19VYLy(k%YKIy-D(%zl0g8B?FcND#b~{QjxgDNoc@>j>)%YOJehqV&_}r z6U8xv@2>YS74-*;zh(8t6o1q1<`!3N=JuBi#CgPI>_gT^{9y#QT8o&-f)H&!Wa+FA z_d}n@S2Z&U?}u%Qp&aGB$N@1dpp=RsboySyDiNuQAB61! zIE91=JjF<+pV|Jd<3pBz_Rx>hMtSIms(f{i@{rDI!L90`c~cCauy3$WK>k>u2$%Lp z8C_35gi&QU!uU@R)-MkM5ZzBh7H4^3f|NT}?CoC63yP|4L&gg@P-KX<;fO1X2K|nW z#-rVt6Ig0kOdTlj1vL0QvBS}nAn~9|x>4;&d(n^s`}(oO>jZt1i{6AG#fUUDCx+w0 zhZU`%**WF=Z7 z-Q1DhB#eddo-hqEMK#~BLq5+04m2Zp4Kq7(BFWxGjSTu4=R>9zV7L{)wACWOy<^*< zRyvPA7ds%X&rT>cHDy<*o^~t z9k1gZ93c|15IeCGodn5j@+0yiawWNe{G2>M9wa-+OXMYTgnUdsC;uehQczHt`e=~m z(|j7DtLY{5Hu_U~fF7VP(NE|%f=9>~qQWqtMramR2&;rm!p*|X!cO5`F-JTg8d8N+ zA#IViN)Jd6OHWG2WUKOH73zy8e{rhl)Z2aN+uXOMucvQ^@h;rRMh^T4pa#>?hBhq4 zrPzY|@hDy;R^lZ&q=<|r=aA{-e6p0RBA1dMldH*H;Vt2a@TG84 zI4KySSqzBzVnmFJXN%{HYsGuS55*6qdD08g`?6WSNWMl+$p27=E2EWZ%5DOP5(sygc6*Og~DW73(yD1W_ktLK?|fy6R=u7? z$rSPsHenX2AYTgx1UdyfP$j&Ft8gLx3wm)0HsdE`p|}V)qLN&W5AiE{k1$wTE*Hse z@*G_vcF_#715|vF`97q82vR1lCN08U@@MpQti=J*jJJhH#3$$h`Ws=gcubl>7ULpZ zforhJ*no9XllTf*1c5XnEFQ*fxLl|ZgSZXru^RJGie2zx4-yz7OvY+>5x_ZQDVdEs zaTo5w9q56GOR)r*n1ki`6L!e6Xab8QJ88#^k65}8?8J8o0 z2k<^_!UJSu-;b~od3YUflXIl;^nf(pD4|{Sbvl!7IkSHO5++{!4S&OL0F0I%N0;~- zW}?=(-uN@z7=(P>iTRj>qqqp4;(bgI_Mx(G3hg$=3oEfsdI!^uUmF2p#$sa`rs4_Q zuSjT9qUaUl;xUL}5m>v0RV;BMTD`|%JS z4j03H%pt^Wfa zCX-1rnK%!V$pl#yO$ro~%2XypvvVGn6b}pIVHv=Kl?a;+b{k-0+ZhfUSj;+*huLDb zSY(S?6iuRLwpbvWB{SGvk&B9 zvs>*p#cr2mtDI@K*`Zn$y9E}jm8qrAlgX9Jkrb;%V*|l)T4A6;16(e!x?})wcrxHb zrb`>h!{M+y9E!ss%XT@-;c&oYR~@i1ja&qAC*m6AZcsvd`P%${d$Cf|Y zbs4#E+Hv}QJ93c=1cN9D0tEp4gA2f7fq^{y{%pVB?)O{G+15dRzaP$QyFVM=>};l% z!%GJ9!NJ4;m&>igS_Bp=7|27{b9G(Q zb(<~ER<7$hGIBLN7k;0gsbyVt1s}g*Mw*qCQ;4jLWQ0E%C}g!SDM48Y_>N7us*LT2 zvF4wC!r}aII3pZ(IPx9U;cysP`5ECL^k9&wWkc-#F=R;5kRje7LtGhA*V#jc41vGMGh{G|3J3Y& z$Gpk)TyZNIX&_KA9D$r^{SOCmS42&!lg?VFS?+8 zeoNDw#@Vx`P8k!c9eq~KsFBqps)h}%tSB!l9a2&pEgC$iFcK~ZqTkP=ez6(D+t89%+q>kfy-kmgKa(b| zw{kN5Ov+fB9>3sUC}T;=SU)Av^cvKZ6zlaNJ-&ZjNKcTt)0;wi{DyI%WS$H!m1xU0T(TuCwMwwUWeb?xSoVsx7=b)h;-NipJ{ z(8_M&8BI7sJ@q5IDO6iYaeX`|G_F3L9U8}K5EsJrZ42YmrZ?4(^96&=CB<=4w;(h> zj?mb+Bg#oo$JxZ?y12sG=u22@aGl;=yszu}gogR8QR~9c!nS!$aiOi5@o+}tp3u0s z=dz>T)6tURxT~&d)4*Jx&{gkUqO)jM*CsuF@ARgDxj_b-o4qB)CB<YL zFoWu6xKp|*FO;_t)bpe&P-`brO09JpI|7{lYUi;leRP-k4ED~MNCDMy12|* zFq+4Ql@wo`prO!8O;1oJK1^$hleXrOrQVX_V32k2b%_|}mlOx%ozt6=aUJu0J&2V? zo8z>V#d<+N%0PTTHubWk^Vo2mX%Szcx0Sp{Wsa|$^3?yp@!*m zoAmmw)|6};W}OjB=8x#lOJVVhx+cL#QyBFLJU8yDo7YdwB2Ct~7>KvgoP@FGI$wPJ_04gu zbuk%PQXFDAU0n;iA%tf&#bds1!jY=F>zdx?33BWUxPd8}YtfrW`DmF4UDmI$dQeQV=Nj+7uk$VU*ieUR_QcHZ@owRNS zPfn1|?olz{ZeG%i6lEty5ti23pO&CtWCIFnZca9I^X$_tm_4^?`)Je>ABWA&&12ca zEN$Jarh#LK8z!dbbD~XF+SM>KE=E|Ud4$hAAX{fI#z`oCe(2I5YhAoCv@RH@b)mSf z&ua<>gWWjW-`v%ucj;ZBgoXu;O-abINU^`!7i^Aq&QH_&{LP^OQLDeXi|f^PKeHkI z+2*SxN|pf2Y-?oMEVRbW_ zg8IT{MipX%hAIBPB_ace*hIn$@6tx4V2(?ha}BJT#WD` z8;mdY#g{cl`$^hZo4a%^G?ESQk^JSe*|#+=h0l(6E@+F>a9j>gTo8&&;Ysn%1$xu` zqy*VS-Niho1#Kn8T*@g<@#WDoiVW#-GOH;Vr(xEdc;_^|wOMa%)#GG(Q!wb$CS7tTo7qqp9m~o9WeNRfC)lvMec9_`| zhp($E)Dh&wY4+P?gHl6wI^K;y(=jlR+_Iq6l`v5 zkJB)hr5Mo@6!RHa(8c`5mey!o3Ol=8U3zs_(;l>F?8?G|#@1*ksB8Loop*JcFBD`# zn8;$yqe_aCgr+bfj7wqu7l~gK?QT)Rr&IXfifEEp<)v~bB0eomqVPW{9A6cUQ_qMv zX0XPS8FTr(AcrS1;Ys0%t$I8*qbcZPZ|iY7D>ZE--=D}{^`$#3`5N_b`_CtUU`cUz zm~5Ul&=SszyBcPk>x+}-lI~d>$5@17_M!R6ML>uOMW{hQDC&`O0|{Z!_J}v|(i6g9 z92N$H3WIy1xq;n6p^)1%DiBKuq3terg=0*Kpo5^4LtW6ZLeTN3pkuGVE=HU$74q!GrS!4{j1X*eZA+b2^r?;yc>)f(LsA503GinBeKTwKA3v zJU!R(VEfW#6+GIOjLvJ}(d~1Zli}p)$#C4nB-zL$S^3ap@{qB~u&_88y22HmEHv9H z_KnFBvhb3S1&WnI76^SB4nh#Xy@DHY!3`?Nsg#)D+FlT;*t%B`K?EugEJVQACy*YS zvto>y8uT-`5TKvZ-eeB#-EMbQY#lR+9>JsZ2=>w=5a;}$($ZWEj^5_ z--UbWVH}``@fke~nI5Kx={xit`Zj$V4*C{K>079!Z{d9U7Pfwe@1<|yGx`=3`WAf) z8vQGC@;GF8E&VGf{VV+|H2Nk8eUrWk2YmyCzCqtG_R&{+s;Vn?b0k`tLIU9w;_;;r zS5`%WzS8r};J|JnBKVm`Juc*9G%AJso^W{}A$WUgmIM;?z3qB5aPOEhdJu7XkX^%} z2cgk}(CI-;qX*GS4`L-f2pO&P5LVJd=%j~mGd+ZR=^@1FA*N;DrD)%!==6E$^hN03 z<&@Dwh|xosMh`)yFZJlrK!P6ViHr@5$)bOv&%%QM-B16>!x!l@JbZ!vfrro0KOheQ z`aFH6Coh087Wxc8pM^%BfkvN2Dg6T^`upt#u7EMdN%w*vK=-1Q?nN!#i>Y)k&Zm2E z6Wt4$?xp!X3j?k(7Wz1zSAhWS!N)xO6@IQFwloln)J?32=?p|ho>dXkN1j!&Ro@z+ zvB;J?D`GkWksEKVi0KSOuD-q^rZW(^Y(qs%XCSid;)# zc}eH>!;H(itY51*B6aRj~vO_DrngK|K$)k70w32DhIzy23HWL4&BJL9C}i z2-r)5IPhJ};ISADZrAgZ#MyZ)%->#An~V<`S+QcwB>EKA)2DC~eG2c;ry!z~K805L z6b{g*AizPNLhW~X=hLUKk3NOZzN0tjQ;_iv%?H6v96D$|N@+f7X+F-U`B+c$@fppB z%&YSm4T54ts)~>Dim^(UrYb&_1|ia?=u`ZZIY@)CT+OdVwF$yae&Wa@Q}c{GTE+Hx z0hd#CCWvjKBa=?Rha z1pe$#(1&*g4*IVRJXe}fNl)O3NP>`_z#g5G?)HxeY#ejwJ7P|2=9t^d40O_FLDduLam%>Q^Gnna8I zje)^_&NP&l5Xp|fu-UV#5@d0#SlOa9DN~iVnd z#j+cOI5*zlW8t8UH#9fHn{{!mx7Ib9r)g}5$2B)c|I?>^Y&1%?k7`~pk8NYMhU(i}L-nok>n>jG zWgfZSy`VX@zZGenzhE&7+uGyJq4sg{1)*_z_o#V4kUfuOj|z?J#=QDjP2KZi?c;hz z#YWYK+Qv0+KYQBHsxx?9+s|w0v>zyJ8Y^rl<8^k`4`f%d?6VoKD#ojd@j5$pHs=Md z>eHIKRg7(}o0kl?Q;XSE*VO6@HjmBHR*vR6JSynD(zizhc>tDZbKDvl8@GkV@~o0E zC1Y5Y2%cqUdzGmy@0Fv1zCGlDRF)PR8+V4rBD!X6$69#nmyApPb#!!etXbQ!W-SwV z5=J}z-4l&Q>*KMuaUE-bhIrA;hIsAtxlP@QQXh}CvL?kxrqe8z`h>ABnK)!-LwqDl z6oh_4mR7^kOr{j!_xpcsDy(Cppp!nnoy79U8gw)Z@w|pvH12AcmD&{AgROk7=x9cC zO$UjRj&vERYDc3;#=+X0{;pY@!cwwWlM0h>MiK2ui=_Wy!ix4wYz;4#i!(Z}X^dSM zE|g*n0z#QkiV_5b5}_0o2nZEIY0MP~2(&6-QmX`sO_&Lml&p3fR z_>FH6;7~`d@eP6q7~dcty73J{(2cKAfS~a;!pJwiMg;lBS13ft_zHtiV0?wah!|g? zh{GrfjW1D*LB^LT;cy6wj4x4&sPQGrP-1+Ea+DbVL|fb*M4^fpIv?_y_7S+V}^?qt-Zvvk^0nVFJb&$1o9NjboU^VFT)nV>k!njANLL z@y2JE!r@e$ZG47lm|%Q{>6mDIiWwZv#3bWW%tC|Fi`kfL^rDf&IhbPfq6t%tPtc5M z#wVDIX+|&3#dPBn%)?CM6SQEK@d?i3@O;cR{*G2O8h=L{<`{p+e9STah6QLg{)UB^ zYy1uEIM?_aF2FqFV=UruF|KCA7Lq4jgN65hs)4re9Z2k8XvKHw#G;7rmgW2 zR$`&?Ay%Q?_z#u04BWyTR)iys;9q6?QB@8UXKVI0BrxWafBH{eR+UEGNE#=E!)8;o~xGd389 zaSMKI9LBA<$~cVw!qvt*xQ)ZxvC()3Td>J^2S34P<1p^PX5$^)iEE8_a2L9aw{bVF zGv3BealP?2e#YTFxY2kUTXB=|HtxmE#@o0LHydx^=eWgq3%|gv##{I${>yj^_v1F> zulN;iH{QgrvBh{358x-pn|P4Jhj54SCLYF}#+!HqcN=eF8;8HaPmMS6D1K(Vi8$^t z-b6RJMJ~!zz+P}cpW?O3*#@?#o=T4rSTUeaKG^v?8dK*zhDoCkK+O3 zFL(kE8n5BEc*uASzvFN(9yVUXK0IQ)hTmhG@fx1QZ;aRQ6dpAW;c3K;L-+%_jX&cV z4xdGj@n`%I+l_;G4m*s4cpf{AgLnbEjDvU)j~NHC9|_|i{)FAeK^)-lCG0T{;$=Kx z9Ke#cz#Qa1g&UUcsNS*LVeou+MlIuW|SnJZZd)*YT9`GTy+`#>;q;pM&loS`Z9Hqdgm*YRjOUC4co)wb2XF*07zgkkhez?EaRBdQzi|K`;7`T@e2ABf zKj9+|KgP?(pYS)lV(iD?@v5;OpK#cVgT{V*ibKYW_zbTZFX9-7|G;027x6h>H(taS zc*A%R$2t5b{%X8{FY%V~0=~lA#tZlwZyV3!8@yvYj}tg-JdbbjuJJrha(D{w8PA~) zM~&xT;CEHVAGFqn|_4b^dkdo`n%t=>4&*ZKg@0V;s1d){q_Hk zZ2H0fwdwzB)BnfW^#AF8`u|*;{_p(s|F!A=Ytw(&rvLH(2R5BuQ~~=>2mZe$V|P$; zR8|u7&R7N{@u&c^A|55kR%PiZ6`r8wFp)dS5O|~7mo=wqrfA1&CZDQ7ZOy3~?PSfV zn)0%sGw2Klok0Q-Cv{=p$(V$1p^N+2f55wq55;EbRrnAf7soe7n_`;=<&MauCef5j z=QtkAc+CH7#n?un&c9-n**fWGok3EaJ zJ@#zs_S$l&+h_I*nLcx_kmlMzx7o~Q6MSB;#{;uFGt;S!wkxtM(9!VTX7k);3)^GP>Z$gvc4}W6G~ebk z-R27;VeH%KtY+ue33}gl{lUddJT1}QquSB_@OVv)R+EINWoS(jYNu*W)i|q5YfjZ{ zl7>XD(4O8j#LEK5zdYq-q@`t*Z)a9chF_owp)_V$CI~RO0uGBJv$%PgqL{oe*-Ql9 z+REBWS9NK$va+JWnMTUWn>`t!VU-!dVZn?_fqg68AtC4v3ZaakkP*xXE}HY;vy=Kh zBc*e;%ps%Z{AA9y7aB-b--~m$H1<6+XDu1o(D#RI^3d(%!rRHVzM1TMd*AK1_cfA- z`Wk61xsaWBT;4aGwo0!;!xY}j=0XR7=2BEmOOVR#*lJf3q%!7Iw%X5wpb5Gl2#+{_ zc0HHdsV{rAFMCm2Q(ME@?As29!WvXtR^Ch^)H$?jcvYpW$cpUN2zlrBKTV$d#D;Z+ zXN969+Bf|P@-?x4`o^hmUuy2!^7wE20)6_KHA?E8br2n-QIlCCaG6-0%v%MLAeB3? zRXER{FplleG&T%f=MV8n-XnqaaX0>FB zil7p+ELi|e&m@_9+5Z>aFDJbfW{H_4*5cBf{T15&3TI{MerIKA zrPEdIOoB=#imEJ6q_9#}hF5uHCCj5k3T35mcvU1eWb1?sa*L3;XycIemz}lZ(vedq zjktJC#RhTPjUxu{9Jk>1p~W{A*@tbOJ$3U9lV;yEBpU>)(JPJ=cfo>YE};OHo9H*H zuv}7P({i(D{zf9pYw1)mEm8GR+<;`Jda9Ge;=?uDqPD=V#k((YOH}$RRCAU7n!Uy`6v%VTb5_BoO z2m;RHHOXE{R|<48nM^4Of#ygnL69x3yn)r>Xp8m%N+`HGy&$+(yzdUKg)P0P?JY0!Z71wH zqPLcpS2?WGy=VXa{mcT-Ha--c(mrU&C4H>CZkoKBn3E?;nRzyw$CNNW;yTZeST<97 zlM_~!f-I|*&W4qxp)?we?k|l-_oKF#^X!(tU()d%4u{N2`e296#*t5B*%ph;iqu#N zG^>?Cmeyb7=`v$eM0pe4Y}xF1&Mui0iAF=pp%#n5FDd+Mwt6A4 zn6uH-VTuJqL(5DACe1`mW6Z|!enOM+QIhbnM$^p!r`2jrkl2n!r`=*nBC5@nAhGR@ z&JH#&#H_*4Q1&A?6lqeZDN-a!cQxYXyl1at{TGc!TcW+uC`VgXaWo|g(y|IIaatFT zO>5dA>)Dz=VI1qBy5)D@d5~G(d6zEZFdW8Vj9?ELF@oLW@^#xX6GG{ZWj33blMqUK zmWdL)wb9xrQ!~vqys{!I%jMRn9Lg_@WN2BH6~mocB$ThnvoC!0-iv$Ij9vQbeFxXw zvirfyFMsgCD=(kaLSH2!IqQ-0xAz%u^!4>Uwe60_$j|zI^4T%6m@NHt$u*$te`d)w zVuX7XN&Byh5@f|hE6A6|9+u)|NfJ|-oGCND{({|C9-=JmnW_JO+u$c1xXfEDm_l; zLWV%+_RyHThfD({(_(HsOdi%nnxl#}gjHj$!fb=~WlK%(6zxl7m*!0F?d|RL=4i<( zr7fRD1R+$CWg$j+y(&ugJF83gSM%BtHzDqo!V4$+1WGqNKSNR-u)K%{efq!?j!l#+FnAJzq-Mn;aROGHZ5@q?Br+Ltwxds!uaxQ+s3S)zo9 zG3j6HNXRhuCyqKfOdux>;RU*(uWdW2B{kdoE&!-;3XqzmJ?#HAX&0;Mm|PI!>;6$= zHcs~ArUB{F09;JtI~r9rrS`IzLKM|%{axyn6UlM4qfwPDmfxk`J)Taa)^s8{ohX}A z!$-+Vk0WaevB)VFW^)RW(um2Pu0}dVNv1s3NbC-c&ZY_D^BpPVYi_J)!Z;plX6DIc zWl-XXwju$WDf zC|YfHRaO+MNfK4rst_Pyd>wOed#WqeOhvI$L11ZamL}+;HB%I=raVbf^JGCz(3LS0 zRO`nvN+{h!EFi=Zb6It?E5eLv;sNm;QMg$oVuFyEWtw%L@{U!w*-ES|t~rzg3SF;s zDpdI|$D!Af!!7%G%c|ootGvBhZ%($>+Y4`PO-^s^(HgC{M(btHXxbZPAs>~_>gr9} z(@)!!BclRKC-Kv}r z%461LstO{iP_2Y=AGVhJu4U!TAyP>~0`pM?<}L`d@@3le*2AanzVCJNk2}Zb`zxhA zC&rT}`o__@WXtYLZnzEt`%NhEV`&eZ$VCx(n`!fIreLwbY`zi2@u9}h1)&bp)h2mK z&RS`usl#%Wbd^Oe%rXhy!lJyaT+fAsx{Am(i}nKE2?MMZ-L!=IZ+2@T}s zIiY&TXhvWEyWRn_jo0`RR{pNJ(HoJi%-56?#s{%5n`UJfn_y*`DT1uBn#x@DcP z@~rR~<%S288}2VxYYa!Mepas4%u2H|Wwx@itU1NGc{DW$^3u~*p4rOgqL{rgPv`bf zXYV3me93(Qj__$eVVu~(wKj>!3^^7v^SQhwI%-~O8e=nA&8cWKS~G>mC$p*Sc&fXT z(^}1`8uoQnm$F4rHJkUH)lOG6;dYF)pe5?-F}aEoLgmh7E*C*wLa5xa3@XV@2$em{ zxQ0Y)qt5EmD6?#p&R|7WmOE2c7_`$63071MA3khoBoYcbgB4YyX%gQ;BM-dLalxXE zH_hq%{q=qSMb6qVVp7BSAK%mWCb{UmNZs6#vu?k>Z=1BId3XDHzp5;JqH|GqYq>DP znRUVBi7N(wd#_?0apCwG>&ijduZKxYEloJTAl-{=ZyY3)9Xn0 zSD?`o(M==}k7DE$Lju?2X!g+3wWaKWdjvdVrhL6oz-IbJGT%vQ6_EXeMx%&d$oLG}rrAaU6} zLE=^YL6T*51`&;tXtb!PsAvOe@pVJ{;Z9BUrzgvk<#K0II}L?{6~mL=Sr`cg?;+nj zJon1xH62qfyJi2zzHU-|%l+l`lYg>o%C^22r9JN4bLRIQc>33UeGj%(Y#Ux)|M9Or z_^K$6&BH$jMD`m|7WDG|a?4VlswxTuk#(8blxKmeFxM?pa}8By36pfQZlmTLn`ol_ zvq`E0O#Q>g^#5Skm`wj>{8&ewn_PsYyI^v92(?T;e)M}|hB@7m%EyN!5t!1V6u&n< zlHzm+Q{SJ91t;$jq9^|>TrKU{)>r#TpKTkH%`X8dpUH-dPufbGu`iaD;T|dqc_#C{ z=9kRWEKzDvRY^TVsnr2Wt)`WFXQQesikvV$<-(8?#^*5$H*Fd>ZS4M}o0~Vn&09;S zjo7FqEo4ht$d;s#A8WKEWz71T^GsdON{L#x5#2V;)@oa66Gt_B zqb;k_ntxjNTaqa?8jtdYeRWGI9{?ok>lVxjp)zJ;+b~2`p-Pm?y!Q00Rmm2O&Pr#< z8Fc>gNqXYRCr`=Jo>RY~b5D$?+fPjf;d4}xvjd%Hn#`^~?Ni}221tG0cyj}e*a&LK(z9Q{8@dekKI{?`s?SUpt zV=dUO7Fm*3i56LGyO~ZT7n!@6Y9u>GwcDKB)%tV?LnO8?9Kx!9 zYNBR~%-UzsSeq;fi4n+vgIo(~nSP<5h*_r_t0DZCb zpbj;Y`c&~^>owLtS_PAJqIIG}7%YZu#r7uQT=8PtrS?rW)j}n;+BV!il{N_Dl$bi% zHr8&wgWf4@QMRZL2)|Zj7j@X}WfIMlB&u3%wlYc0lqA(U!!d)z2&JlOGFvP*o87Ll zerk1fx~OXpeE>F6-XrO1f|T#Hn#^gJJ>{3jOpRteW?gR~mOZo)c4Fy~bebTR9tXh~ zv+-rWEdjSBRyO#dJ638$OVGy0bg5P9lmsb3AK30>V>eqn-g3O9#(Rn>F!yGUx76ee zh#qZW`dgFSaZP=4v|jGzZn}ayxtp$dy1Wei&TP|fVKu&mY8(PJ4sj>8A#R=75Fd2f z(Pj4W>u$T5W%4VWHsj!~V70wCSZzxf2X|Ff+bgO#y0fI(UR+Y0x(m5_RSQP`HnC)QK%c&#f_OefH(rA+`&+sY|bcUQHM4We!0&;FyR`xJ*K9L^pYkah?N!s)6 z=eJClcDHcy#CY+AZ-Jz;zm%i#mAMYj;$GR@LzS!wCCNEUVAJe!(%^`!l`Ww?j_U+i9L3J||P z1*FWMnW;{{(Qk>?aD8c6b^Kp#zN@;Lu%(a4l_hC6c0(`@KW23fRduU#DA*0xXn7fP zZtCVW?NDRmtA&KIZ`b&0HCB;CE2@?J>}r}Y-rkj6t>jlEQI;CwXv`9-R_vM8iamqH zkMGK;R_wV+G`Cu@yBYd*w>zapQ8HlECl$#ms33|8RU9}GC4J*c!lohO{OPj--Sh0p zK55Ul8^rY|#*3Zbb|(E;@szX&Hh9SpJ`d%!J1@+n4O&Cyx!SpzqQ#o$u-oDBGA9YD z>x}8&HK5;J>7BIgjjo9LxbbCbm1J*J`AS69QfBpd%*A>{&Czp+oI=E@?icj$^Xz_L1tqGy>v1N8Ufl9ms zJ*)mXK3L(&qwY)^3_6{`ihdWB4!(8rvRj)!?R&0oGx^aI_q3c-es$lq(jL33eb+^g z_nkWRh(NAiKkq8HjqS|d2T0qbJ@6u*uID`vbXn}gHQYZpaDjSJKs50UQSXcU!l7C!bfiL8!uZSf+($!yX2(x#4>}T#kL({hG`rQRI~|!$r^D&6 znp{2_%*is#E~jR*N?wyG%afCx=lPwnZ@}tjU()~cco59zdgb*x9CkJD4CTrjpj>&U zeapOv{ikwzuUbxP0(UC2xqB(|)pCnou(F`DKq$!frq#=vRxfYAdU^j-^^*UsH3^M+ z;D>zolnwI!nEB$BO(Lva2nsy=+#m^n4Ly)G^=$?fYaFq?9EsQ;FbZn ze*o@F<2xD!Z%QF(8X-v}HmGrdut4k()`()baF|f-uM;LJ=j7H0#ubb&oGCOb^K$15 zx;DceV!MY-c?!}afP9 z%F!(eMqIu~jwv#jM1a9LF0rCKf_6~YO4j+V^-*6q%T|(C7$#vUOX}Znkn&1Qd3jj^ zKZl4qUDYk@ATJrT@J;8^-sHy@D+w3aZ5Ao$&&~6xiYy9LCgFm7yUij?dA^dI7#l-3 z<&d1-ER+y7k8>A5BRZKzTFFXsGm%Mx#ADWyJUt_0>}zc(3MRxgub5kdYN7;s!#s)Xv>1s*tbg^@|Xl-v)JJk|B%D{0ZDJMHat>!yi z&1|cF)#))#21fXZ_dP~@q{Nq1BJo97i6twK&puf~dR_0T=BJYxRe7|sBDFPAP#B2} z8#jp|!AeaWILKfmo4-&`Z@ zacp}qeqZ$n@_JL}W!HTBvuFFhxRbo5Ex%#T*p6}ai$b2ZXw@&;SNwkAk{37Fue))> zxl=1EFB~*#=f!IebgcQ9tpv*eaSuB?ARg{>%4w6Uq!C$3@7^mG%NSc~bN`zG4*xg( z8~u_sxr|gKtF52(+ob*Hq$xaRZS)Uc8o$v|o7xmOy`{Ya zs>~0QdzJ~@zE&`YKFCgz*(q{HU#{5I=aX#Pww?Hb&Hs~(k3_#X8iPub5kKdwPo0^ zvL70>EBo<5PiG$(^oskfLF%|HlE;RDlQqueI(?=wjE%6V3=4Py-e_^r&}y-|c%nF= zxKVA6UZ5_CUTocDea`xg?VG5xYN(xvT4}*hPem}(d;Z`RgXv&@slC>IlYOh*uuEI* zkJ>-83--s;hdYlo+O4TO6n{(KsyH6Y)HHdv-O9vkm)Rk)J(AkXw0pU(>}<5#{emY! zAKLCMPFiDoqqo>>9y{B6d#2y7pua7sFEm&91n5*o?XBzT#(k2f&@J`W-p8(qDAyb zS>(}(RLwjyWQLEKHI3biU_u5}*7AiO{SiByOKa-zV`xQQPN-Jxl zwS1$W-y>mHGMFvnmad9_h7B!bwoWM=O}XjIa=SCLJfVmnD|YJ6WGCBI!-okq3wJMl z^og@OCJejqjYXuge)IZuxpD9Em#*FX&@|2D$$!G{ng8^Pc@-BeS^V=z?p3qLKfH0u zhAEkLTTVgPyu9SB=2hNR*EPi2CJnjt*tZ+c8bRI~t7kTIUtYBsL86yIVbC!oEEjk*5qi( zIxlCby3DrNu{>*e&c49w);BzFWFN`+#Pdn^d%1@LMj%_4N*$${Wm2spCY|G$CS4%C zk^4{agl5&;c2TDA`DKNe-F~};9YLLTrMv@X&Hm%4Sbn3o;3W&uEHO)~rPCrN&mb&( z%v!vu9k(yjtBPZMELhT4J1hy~FdqaKKEX0ovaBIano>e%QVDl8IxFEyAJ>XJGnUZ^ zF}XtLHnvhoYq*fq`B-+N5TmFtb5R62{3`E*oBiYd7H= z%f!XBn{e$WZ2yc6D^8lls!Y7BzJwp9k?g#)s|LF5Tya;|OlGTpo^~`Etl8ZOp>*dmyG4|J{NjbIQ1GqO>huH#r&}u6m)+kv z+hipHe_ckMXJ*DsPisc2=WcqpaF^|u+Anjgsx8~Rlr9mLN^7kvZJoAXS$CRtnRi;P zS=MW;?@_^?f4*adW4%LgkOX}w7AXU(R4Z2EX55RzI0h5gZylemqu)Us{JKtB%^m$} z?r3xr*i}B?N=ztT&Pv*RvQ` zvI$(Za=2+nrWzcglDN8{Gv56cSKs6{^@-0g9Owpzv9l2{`HbSX0ACDfbP1 zy5Idss^Ng+iq)x~aN7;Se!#Cc8eM&yowBax{o$%Ebyk;ZEl0JMqulExEvuSSu8J>a zCVYHtTK)00 z+x{AOG<*Hr%@6(Z>ZLc5jh@F2kX&MZgwPF--sih;*;B6`dh*Ah7;k(eypuegry1N* zUT&tMEo>WV8)uV-We)Stp|i|0GH3c1(S=gGX+dVIe_!CB^yiGXvfs~mKl3xs-?QK6 z7BMRjh~_Xe+K|I+sxpKY*oI_{q{D0twB9y8bE1EaxzV=B_P+dK)(LXlt`WCj|37_w z3wRV&n)W%T?x(7{F5O+#w@d+bDe8TWK0>kG5jOYAs zx2I&RGkq^JeJ?XzFWXZx8wI~pCWsO7ypu~W3U3LAgo?lt@0%wuLM>gwv@j5A-K9-E zk``w|f_h}UwlF^sCrPtH8=bLyFmU$JK1d(S_l&qufTG1+WkOf~-|Piw!&U zQtJ@H2f`^y z3goz#l$~|3&U(%-i1(DN_G&(u5EqDkp4J-$r?I8r`-|^pUYK(7B|@Q9T_{Ce$PH>K z>O7QkB`!2M)t2)VA{)ui)%)}LWBmabc66+q&yUd1Rqh$<@9{K&o-BkEk!zDq4WKD% zGuQ^W>7FqR_LJ?pSluE%rmoh3K3zv)M#pT}3vW0{!yER(n_0Z*!t%7d(LSx*9|&yO9(3r7CqT^NF2AI7_HyY!y1189MAQt8f3KZhmz z@j+Mz8K}VK@%P8S(9_TCy8=FN`)OA^Njl{4-`sFB_j_Q&3tf~wB0()aEj~T&#Mi`s zto%g%xhf{qW_4$LIL^k&MXXEI6>3D4QM43>QIwB_S%wFAdjv)*VfSL~ErlJ{_Ai|6 z2L#(wg~%m4%K`@74=H&vaNkw?5PnMq*qS`y}AzGcf6nC~xxwaI4zw!);jK4EY*!()x2 zm>9Yjw7tz`&Kf$}I|^L{39$v5r=soA24na3?cu~N>(5!5JgM!x)8BfF`O!W7R~F9r zj`;{aW7#G5d`&cv;MDO2%qQ#&Pzzen6ndSO$ubvdm9vp^@%>lyMH^|PidtY0`~rEqEe zrBjx*Zf-r$bh!SrhW~0ZY>ST$piA}b!Y($p_?3?OQkeCE0a>N z6>ZP9;)TGUFjkWI6YUClx^%|fKb3v z-qH?f6^*UadbN2PqxoS)^D@=cl19UdmLP7YWyrVEQsf(HG&5;5GimXB>$-Z9obq!g zB1^xA!s)^ML=zN^ILCTG@8}4LG9%>JY6V+- zG~9fhbF64Fv*@>N+veG}ZQHhO+t%5(ZQHhO+k4-0-^)wBo7}vAW;IRQmDO44H0{j% zq>aSZt|hk{c4%Zf&juJVs|hVhH_TY?VKI+RXgdqH^V+oNaKv@fc!*oGTW(6Y3<=wO zPx0flzhAm%ci)a8`EK5($>I4t7E4Nh?nhwdXk}@}T4?nanjdY~obCuAZavH&S1W%$ zRzmd{Y3<;9-$rhA-*F?zwE*?QGbw@eTu`}GP234A(J_F|=Vo{(UH>$u`%p>YM{e8) z(qcs-8n8n&p^yt3S4mfxCHt#U`q~^arzBS$HMyZtA>pLvi9}&e<_k8PdSVmK5F=s? z=OwaiY)L>qa7N^V>sVOfPWFIK2m zg%I^1i+GDgy#1h#cNEp_>}aqHvT92KGiHn`V$Bsg_c&W)O{?pnqvVD5I%5m@o4*M* z;bvoJ^YEcn)qg(rP?YicIX9@i2a2{*(g-fb7!mT47z=eJ23M4k5)wpTqs7yo8t}G< zeRUIuE{3L`2UT(ufV*Z5>B<=j-EWr7>&v_C7mlp-XN9fu@tECpP@nE@4qjt_e*HWk z^I>*E@N~EwzQ1lWzu@ri!9A=7xBCdY#r+x9L#(+7@pdn($QfziX1WQe&;ti(gv^3o ztFnVnjlX(5@9F;xC7_mkmKg=wURLKP<3)>)hu3w6%ooJ5fP6-g`NS;f~oLipmSkgF01`~f1-Lrk+Oq1|rg zlniV_eNNm_9)y#Cu3Vi#+v9MJ_;p`@yn;piWg0)%;nh=J9Kf2wt2?lybYg~&sOy+5 z8hjUweT*|m%RtC%M`uvu+}fIXj8HUgaHl&jtT<5sC#`~{`;Yv_yJ=3`85sq_{I$ZqSYMX`{i)(&=>4~s^rYQ8FX>f$GVCZ+sCL){e;$NXx<=Sg zcI7K;@6l-wu_NuubUiX?>$Ow4GHgz5PuaDO*aJ)uCqn?0O@@R~R`!eu?PajeSQ0!4 zP0Tlm{upjTiYPQ<*d-ZcZ&A-CVHO}bb&Rpxp%|f{B~qSIt}1>>5~c~DQ96n=M&Q7U z{nY!u+*tfGc5{Mz=nx9pj^w?ozr~?Aio+ zAoYzHGQapej=hgQs$ACb0epcSXA2J<%l`-#nR>>^@aELkLx}k5v!)UU5n#@OA``Qg-#?foRTO=M|}$?xPzHA<-plzk0#AA zh^R<7b{9Yy$7e7K%R3Rrk+MjL7QYc$M9IycYl~ki5p)quy6CL0ayKGzL{mgkXK>;BIm2dD{R#QqE%E-X;DSP<2$t2)cbTx9xz;|Bg=m_AeG&}>_!3*^;c6H`VWV>n| z-Tl~hk9C53%H@aYG}HzM-JFEQdc=nq4pB)Ok}L?>g%=pPMStDtxsqV42+-nB`iyRX_EHFuN7me9vGS?iFa zp4HFonu$@P=F&eWVx~{Z%9@g7Ax?xJF=<-Y zey47+0MvQicTKuZ5@4R+S7`H&&H%tpu_)6z@ZIS1T?SrhGp1BZIjueSxWCf2V^DeS>|FXQw4 zyq#%p&>U+Zz6yUL{~Tm~rE{Z+v1ZsN7*4c^Fu<}@@=kVE2Rgz=a=^Wv9k5x))kto> z7N+Q&_6L)4n8X;Sp)`_on1paZ3>xyuYKsV<@RV?>5@=T(L_d+b)J z2jk;rbKmDsv>Y4w20+pTTn0oc!o(`F>Om~BKm??zb$Z(v<&Wh=+z@QL!FN1#HFAZp z#bEC#vxg+x2m>=Ob+qS?+``Y2ii&Oa?<4N+CfT_x1j8Mn|9}lef;=UPOb9N)dd7yq zC;Y^h5(d9y4*(49!of8xxz(VBMjBj&V_0;nJ=q>5je6y2G^>K-Y4|9(0nfqkLb%?k zGx&+?;d=q^_4*Fa2BdjI6ww&K84R0O`iTEAJK-A?OE)seA$=AQRfT3dyCd}Ry9!b# z9VrO)Qwvz@cKMocvl&$T)x|*7|#)So_n)-71&|s9i2Q|m)ax@T$xHW@Ea&uim z&i&EjhL^OvyAb)iY8V>{t==C~cNWu|0+Pkr(^jmc{X^nD-kAhd3*!OCOfl`iyQ=6y z7LO1AuDCi*$IX7d@X>{P&G9&6^(T6o=WVKr<+Np+*_F2A`=Zix=XYf75g=fZI&7WH z6--_LM>V|nDq>`e9*1lLJrW`TqA5__;Uk!GuZ=N_Pl@K<=ivBDQi0}d+q88VF{^l% z;Z(iRP^!In!NYT%M(cFA=Ab4q^-?WEO=Hq%b+By6=>l|0(3Y@=Ut_vzPjzn@szs?v zzsQ(_5z;FP1S3xz)oW2IVT5FOJ#lFpB(O~3uS_0yoLKfpGAE09y9|t@Lizr5DhyZt zh_yinKtLX}MF3)jBa$E-p5y?DM~rmdH;HtpH+dzi6=9tFUkxZ0AX4Eu9ZnM{iYREs zrE&_>TTpteuJKU#FQPqWQ)m(@qCMm!&1SomVTrRzi;7(yfiHuWL$%cJKAx5jtEOdx~Y3L5l%}sx53t$2B>nHLX@AtU5 zjkojdun{r8Zm-MhPH@}J4(t$vMW4&jU*?ySQa^C3{Ev}KyRPqt%UVE?me^Y3%XQ2? zkmfrbtdJGT56BP751j04nOo_?jwh7j{1Vy?RVT~o%%_&7H5)hb*_K(^mk4wUsq5l# zm4lQC$#1I9i6i@u*My+@porboSYc61K5?}LRp6}E$9cFGExsTgExiIi3O`Mznn}^{ zdPU)qey#F&7{Pl9I8=Cc<*p0)a>XtOzEDorJH{@|MvDtoiwnbaY52*ZcKfN$-{Rd| z6|orYaWJw<;X)y?OZ_(7W;uj#U-5@@VRBu@MgZ?lph0xqGr;{2UI}-HEBAd+)GUET zRNbZNo5+5NiKvP@B0uM&tW0RCjz5t}r04|3!8A~_p~hoO-j?AU`I*BMd7|FKvj(cn zg0BB|DVWlI1}(hvKEJ4LS9&hn`7u&GY|HMB-=TUx*4xdUBWjNHTh03YJSky#_`er7 zP938?hB@w!#jCqM-_5T8AgzG@x&~$dz)(wOvN>p>oY2^7Kwem0yk3}{vB#uB$-)w_ z*ojaWh!anaz%(p&$oc6KVFnl`vAb->blsjmj&w-?Z?pq z;;>qISdC0>LD6T}pO=#8qn8@m#Xe`Rel!-Zc1)~BcL>*eTOHHahi3p5*EKinR3NJ? zSun`OMbUM@rUOXlQR!lV}FV?|?a2m$xZvMy5?jr4(OKIixf})h4P@Rxb5# z=_iSjw8toMVyEr#dU)7+Ja&Y-#AIRn`TG@Y?SAQB0x#zF@u}h2c@}sOygJTUzDzzx z+cCe17TPg)@<+X58UCO0QoILIV@sQ`^#oPAOp%jl6%5X2b*gg6j(L-8-PV7cReA=b)j$GI$A&`7nxcv$+VkLjO6^}6r z!QYN1Qy16@2@%kh6lujjPsI3lUt^HSdd5mh#~mQj%p=+MRdb@gT`>!B46mueN$lHZ z6ggykm~u(EkxDRRvJu7)SJLA#F=s#oZw^j*B+M=G)oY5w-?Vih-pn3ZXnvx>SVuOR z5HM0Z<;NVq1@Ot5NKc(hY|SXC&9JTcJ1x^TWibd3F$5qG;G>z z$C)Jsv4Uo+Y){uMB4TwE^DCWNolb`(u(<2^T@QC%8RX60zh7Cp>V{X!H9GAUDJC*f zJ0Ax@#VNI0Pb>I)l;zZ`HSFKXq3SKyRkTiKyK~xUd`^eQ^^d7JtIP2fkcT5L8Cj`x z>p$6gfDl;JxrJyq2Ks}Qlwb)tOOKODq5I_4g!+$w*lMBRSdJjyIIdXOjv>{6M{((1(4Xf2R52nz#n2Bm*!uF%~B zj{Fj7LD+tk4xOkZUPM!Qf-Kp#Y6fX}Bsc{6^lE`zq^u3_H9-yQoK{Un`?Mek}EiDBGjzL(^LXh<*W$aU?Wh>npGbY37e&JPv@aZEP016zQ!x z83_c>uyw!)?}>--<8#Mue|{B*SPK_gse}vJwP&VX%kmiu>wF9|5o_MZvCDih35H zmdsW2YMUAuvY7oLH*_|dYMW#vOVmt`S*Pb+n+uzW@v3ha@>xM?trrw3j*``^*{y}V zYy;cEMKZ^S5$LK(Pct0eNH z!lvO_SgZq0%w?zb#WPS4^pBy*ZRf3`Pj^VxmEf3&SYyFb2n{^hdcF>fo}NGCS!;Le z_xq5;{}|s*Ri3zLN8R9Kx4jOnL(lx~;Fi5D0|E#H{yDaW(|0bfOhP4RM*!NIecE4@ zt4Py&y6#8%cQQ^3p$vNvyn=R~fL77AgK%GST z3dhdICP(Y<{J0cYA`LjL2!}2J&Wk)XLaHw4b6|MR=#HsLS(D7_f4TpB2Idgt%(Da4 zTCkbH6~Z;tStQmcwD5Xg+h_C!TBo)aq6bQU2)w8Bg??xDg~}eO#js}&quz#jWRIQ$ zjzi-RYk|rxrV5Q$O5lJHuZJ67GB_WOZ@~YE%Yp9vloptTBmAT=@97NwEC~y6 z@>|D|SJ-u#auKYCM7m=~w&+gBgzel|24<2Yf)wYD3S2eMD48XSRkEWySaMUGAwM}p ziFh~_hn{B6XY5D8i}R7dItBYUIB=O+#G%U2A6#6PIme~n+6B5p9-) z>G7{y`&E$><}6bng+%-*X{-r`#^O`_zm#K2E|@@&<&1@A>8tUf&uV?tNDJM#-k3!_ z1%fPPQ%14qQ}JQ2b9b=D4N0HOBR?4Rt%#`-T3rukN2dW}TB+mU84XJ26d6 z0VDi1u`Y;_e=oa)j#w-E$@g_mw)JPM7oc|tX*h*G&U#7%c>l<3QSr90690EL^t~wn zan8eI7&n>?8*0cRk^%R;ijoqoW6a3f-P_qywn&R!Ad+5AFDW~bJ3IZV01&gFO($D9 zwva+ zb@YjzC`Gv%Gd4u9lmByb=M#*`QnL+;`!Jggf zAl$-GW*&x=`Y@d4@DJuflE(uWL2>C^(^3>=GL~TXtfj%IGm(&aKJja2Yy=&n9&-W* zh}?EzKTLYc&=IBQ%-<$Pos7~yk13IX$%O6~eax_yLS=4$GIpFbXmZ0Zjf}DTgrjYf zkrv}(hn^E0f6a+X;uN8W#2HTMK^er!lbY*NIDe#^TtjDa8<|+^IVPNLP+X7ykZ2{G zY`ffBA(VIZmR5!{=?u@wAKx|37wpHBy(U-!J*D~l!V7PBJF5M?5(tZ9 z=s~hN)CSM%t%EjerI5P!GRm)jH#`)H<<)W_=#nK`asC9CY>-B9nbv^# z5IeL2h#<%~S<;yy9sM15k2q(>CB3LV>u?Mux)TU4wbPChjLve&7b08k@CrsK}%HzWs!0z zzHH_g8uVLPQzvP*S7#|Dx100S)Tq8!03hl|t1X)&uct!dquzQ%pQ?_4F0N&!3q_`z zbqUVMWgvfTt=bSA%#MPBh-wQnf<`N_iwkSJxWrTqba%I0VMXbru*?#o3h2 z_VXboxrr3nip~S)^)K1?3n>kU6A>43orMdU=)$Mr(}H939UXhy(Sb?X`FmogAKR}< z4Ye9BgA3@}Z#pl}Q{oPvce#C3x9L(pK(~!Ipr+KE+|liwsB&-CJj@VEp&JG^We#qF zurbT`Dawibz-{XwN`#7Y>u$t}iv15~&LUnLvJR#767klIdpHX#tT zmY+A>j(m&RArGwg5f8?$$7E*|Y#@1j#pWg@zb}ozc?3a02uN=sA#f3#4o+qwmSEV_hC1G;ro8UyU^MW{#SAX+kcQ7L@lhHO&kg6MXe2-O@vL1?2JvI=>IRy zfq;pb`G0^KbP^|RgZ?0hy#7GZCy5w8P6!E#Q-VZ@;8RV5BVbS{GNd}7effmY%M{Vo zIgdDvx}_spB%oHbYI~>G(~Up0sKw-4bY*3}#dPR0%$~~VZKiB#z^9lJ(Ka~d(7=XR zilL4Ejgq_g7|+bGo0)bmq(#0hAzZACwX3mcH!0|{`W6DFoFtV(+L50W{?I&cwIrbX zYpupyWNml4%|e@tsn+2MoVS#48$g$bF1A0f;7^5EaaCL>bh1^=i&v8)lNa38 z2T$cO=jlE*d#4T&c~=s)w=Z`ZNEldYGA6_hp9f74?u`zkz!dn%V<|coEo%;tf#@xI z=fPg1lOK2dN^kX$ZsWrin(WefbkZ)}p!THB#&aRk?A@y?(kS}Bs)+qRRP_Jg8Vqb~ zY^?u(xCRFs6Z`*A*|itsKek54ZSTe3oyF}^u54%WfG0?q%=8&iqy~L)tV95$0XWxq zb083ihF}tcJ)l@<426L+8cr&z@U{gBel7<kv`BQ&(;cHpq+NP zo$lA~o$v1Qq@UH7?AnT+j|)8)SvP(F3Xu4KdgMi>)9dbABL83jWf@9J_-HMLSBUs$ zMEy>uk*^ERaXKDYd365~Oew5o#A8Za{~H#5CM(tLt9QO>DK4P&M!@U5_2qxjBK-jI z5IYlB9+Rfm5?}7%b9Q`rU)*LVU&VY~2i|Dm)4)$zr%TGSUl&Q&od69;{4;+!Se8=} z7j^*{VflYK9M$eUw(!SbvCnr3QsHOaRreZb;*0hU0QAFU!A zsjvOL`3Q=aXsykS@85{|q1=6Rd}Ow>7aw(jh)w}FbO1=s1Pp);V368ufY?KUX#BxY zpcWWF^QN0{7>&gNxZvslwNHDIA@ZoNFoO&a3rl%_ECL8V(keqFfYcDp;C@0IY~W?63*vw=bc#vTbIDkYeh=d5m4j0tmwBHSyQ&>PEi zYV*mer72nDIkw{T28tdGQ9+K)m%5gnD90C26IJ=fUVL_e8`Kv2X$QLjmDhmnpEL&m zF;$3E2?RtrM)I+k{$M-RBRrcM!>}u925Hhjq&3XW_Rd_-YZ%=5-HNQ-M~Qyf)t;U| zF7R9AJymcEB$Y@kdKYEm_Bd;9Bl(`wdPe&ONU0eu^ai&9z=N6By6(L4Flygb{jw2CSK4@J%+M`VL+rzCwT(Dhy*@zIU4xw=_ zJZdK4U1XJ5J|O}IMwm`ndH`pM|6ApfDsnio3Ryj7WXGXMU|4?Y@>+@3)Cdl1er|IR zjNyc|tY4bYB2>Zq9};9yAr4C$6xB!s8v4(quz7H#hkE#WH*r=#NZBCc z{HMLvMFyfV0W?*YnPa;+;`d%*)gVq8Mua5|0;lQTgzmb6dN_xnsHh=>DU?^p=&+3f z^$6o_?u%J!U09?++3=I@W~kZO7DMPW%@uArm8M3tXTRk|21keF6dAonG-x_yRcXQf z)L-pDi2=^$gC5X<9`vYBt6*W+6Qhp07wG^?yExg&ih?cycTw7lnW+Q%!@cJ%DN6=; zSn)+?0#R>PLe-Z6(7IZH7nV3L%k|c-8Z*MrXkRdWty^-OoMG200c=(SWX(JTOs0C6 z)&tcpe_->0Aa${p0>H_7MEC>D2b}89R+k+{hx=Ss9O#KBadlQyq!g$Z1WnCCA1r zcL0tp@eh^~18iC$mP;Gd>LFN_DD+J~PaFE>JwlEk#PwO9)>@dH1I#Wm^f(E65)fn5 z6tUEJk}_ZmM+4!Z#;^M+1XJeh}3nSN1 zM}7b{qLFRxppH94oB?zoL;*1V0kL-wes};zxFF7u#79z;IF$rBhcOPO zTuI`3Q34HdFL7&LBbmvYPL68#eBB@rKCaEJ&9$Sg^2H{r|Vmovx2<~N>G zZAjynZk{zhX>^43$n2KlFVLSUd=wfd;Uo%Okb4v-EKpcvHpy#J(I(X-;r(-J=q&nf zpt1Uw2cD#KjBNsbTAs%OqSKSXsNZa#K#X8uP2d%-s^$@$Qw z(RuY;^~|@_OA@|Y?3Z1$9+!5_@g+y3bRV!wBxjV|IO!-aF2Ui+;6cnVLAy=y1A4uZ za*(#kA54NHCbfrHY79wOA};=rJ+`z=dY7E{-N2DAhjezH&RALT*nSnSAlfufgE zstGyktkuxZbqpTZ8Iu1bNzi|0#CuB&cTI%tfQ)89&mnh(KWjd=`EDTrLzr&gNeKRs zz&0!f#egm~Kg)WKc>#RP@!Se4fU+p-h8W!n>z`lqp67z-sCcJ1x$B~t1Q{iUkMT1?SDlZ8+xa<$OOpy>&^ICiTL zx4jf5btbq)%_G*+uj&}Xt(6(nd8SB}gnjn>4-9ITS|wpxEHQ z)i2pe?I74G;j3sle>CQ^Hj@)KCS(kMnJ1Po=_;AzWt!x5gdsh`@&@#r4v&mS%)1o? zKTdWQ0UwbbxOtCIkcR;5YQX*%BW7}(A=n<+nk0XjggHeurKltxEvbG@N!v(TMj&cl z`HGUYxP;*BX{i~(j1Up>f(Ca>FrTfoBpJ+zhqSmKLk{v*P+pRzItLSnjaOb1DJ@<; zArpyYn2CEa=ne*2(?<|wxF931g}n@Ux~$ooy-meNVtu}etVrK8h2F5l%=Ed5U%sMd z&t}bAptO|aOnc}2gET7>sRrhF3*y?xU0yr28-D})Z>JCy1GI&s9r`uT0M0R3;WW} z>=RL|f>j2}9Vt-6At&-8k(U;ZSw?*Y?NH5VrdmSALc!X=sztr3I|AZyJtC9Ig@|;> zqr!Rs(+O#Zc$QSaPendEAB=%;4{~9M8;-@pJTn13txpJ4LWUB01_z&_8Wt+df95(yPv^EpUh(Zr(5*;eAk4w6lQBM|p^_F;4osKoQR^V}&k8M#yM94dITH%JH( z9|envMEHsO1qzF>ljJhN2xwqYhoODPzpo_>n7ybb>GS+Q;aGuWCtmK9)r_>rY(o~ke<#{wyDIk_Qg@H>v`_1bh)7E31S7P$bl3FIUdUUTZWp$%~Z4) z2OlgI&dFV-90Ow%!a%sswu53Q_NGJhaon`}6lkgjvEQDX<|eRVH&| z$(Xy;w$034MQPDKjP!AjfyEi*DtktGa9 zR>mS9W95LbaNs76LJx@%x-H5R(v#PH6zvLqy0|ehOlIAM4k`0+UJb!+w3D z&RMax36Dt-s`ea!)V~Y{To!dW3CQd-NZlB<{40P7D9N0K@%yFNn*|@Cc1-MVHrN}6hm6&m=U`QN z*!JnR2s&GPY*;uMFZCPsoSyFHbQ}JrU4r@vea-e&K z0nngO9t$EJV}y?3I3(cXfR253Vo(8D6qLda$bL}wof2FO2ufBhUOM6FU+wER%*|`r zCrB5CH-5XZy}Tb(>E=2p(VOIVvYNDyA5M zMP)1=O`tzDO9%8 zN3FcacxN?krR^e4l=~-iP_MNAAb;)PZKv&@5vr2gNz-7BgstzyI*+D0k7PQJE*&TN z9VbyP(;OWq0v#tXI!+xm>!nt*ODwO;98a#@1+8bqPomwrwab&96=6GwhM(WOKP3zK zD(*!o91}#<^0CZcL`g_I!xSLI#f+M)4j7csH|YTl=azRz!gAplqjIp8+=JqCx}gmc zgWCPvdK%)RWFSsHCIZ`SlR&h=Te^r-kD%ul2>nI;;X`)?SqE?TdAPwtTh3ZIaqBXz zD#`?&5($-Ky5^Jkx(~PfD)b+|kaW8o`PN$vu5A)|GN*V2kM9#?bXH3<}w3=HzmTqf$~EuwV;=eWVNfPQa#7B8A6C#y&5FBz%p0V289)Xjjk7Y!2H(PP; zgy^?heyQ40VWmw)!-pKzl|p0A!7iZC!Qq=anhS}0XhgvSw8C4#Pzn3J;YBZzMcIfF z$g~ni=$LNmBUL%643DYay_8EZkMELJ?X}U+O=k>M1@4;cv8oqP!(CZMQ23FTeOU_v z>E5UUg=Xq=N0^}nL}_xA1m_#!c`HmbWsfk(3+Uu+HBp!G0<6&I5VLi8?X6TU<`?q1 zq(aIXZxSu76E54skPf)UPIf5=m}pHNq5D<7tgLjpUG5Cp#m%HR8O_sVD|C=#QK;CY3V}xduZolBI$|yXTW+BXTR5{&|8zlY{1FVGW6P zNz&FcG772fKYe6jX3nwc9{~&KYAo>L{Yf6}1+$v@~qof;0kWCQ5Cj0^nq=MMeo%L~ueB!APC;WzD!wJ&e}w?GRT7NK1I zUr(YbN83OB5J@8-u&XwV&lj-`l;~xfWF5Y?;r@__8xZEq+{pdpYQSwcFVIWZ2s(Uh z>4<=hGcdHPHmr~1%YY8^vCvDnuwNBis_Od7TEh(i%UC(uPc9;QdA8^X9=;hs)F|CR zxU1C^TT;*dSf?HQ+YbCo?wUI|Nmc+zA4A%CH@pKhruqSRD=n7nHQ0~x32~sW5Oyq z{QO_ohljSbhv#AZx%_=)I)N|++GK8_g|`I%lNLeZF!2plNKsrlYvS;EE0(StL84)s z(8(OP_v9qdZBV1+L(t=GPztIuI(c8ZGdhg)1bwMGQnEE92;;9RNiN?PD|@Jlt{}b= zY0xG<3(mcQpKUaQnU&x*Jin^pR2v0ppN7J( z65jPpiYO4n2BBJV6cJDnP*B!Rrrg}k@addf{8c#W&0R}{=Gg|^xjNkVb+}%!L>8=y z<@4uEh{j>V1}fGp(gj3RlQ`E7ZG}o&&mb&A78|Ti8Q27p-(U(sm5TYH%|aa4m>s<0 zRr3QIv@jVV8?>N#47&z)X)KjQ5t1`l zutEWRqNrAjw?$^ygsAUGu(l18@JPlsZ8vimG^y}w^Ukp}+JiD-#7}4%$rjS>rk$o? z5?bc!Ki5nWB~NPw>R6qN=6|qiS<|K6FqCB)Lsc!pMUj!M7)07pk`|9~e%jpmm7tP= zkc=8nOV#KeX!!)S&wGw@9hGBgHEWdVJOi|7$+layAy=;<%-Y1G7shiTXC(8+)bddL zFP|v4MBKMj@|^okXZ4CD9(5|a+Nh>UiF`6AOF6jqAKz6eQ_=OlO8vXKxD(UV82$v& zR8-9pX(Y_g{MAkr;ZER4(8RqL-vQLjW==82>u#(y7}J!Ld+Pcb&UdYT1T~zBO*RaC>@F;tFdyea^J3EDv|EYwZ#%IQ@BSQ1LKeb84 zk1e812qI1s-7!p~m8@b>tfx?LNLWI%Y90w<2QXAZnnHs%G(=9M$X_8jGZHfH?A23t z>}V0^lGQ4%UaVQNY;N}1DoT(qP)~r1+;67S^DM5-ON>^KRZVsC8?O#40McWFx_UqV z_djQ<3>a>?4>;JocLW9oU=|^zXpj&xadJ)=y0g*(_X!rWg zl!?R)+FIRcxJ`R1ep%bw?o_$(RI=cvHPN(PtsjT11mBRK#T~M##CA=AN0wh%afs0k z0l*AE|JVPesc- zyemeVhRvJD-rTw(od%1$Rn1sUIZKh5^$0`ioQ7SFnCj-p^fXa{McqDp z%`euvCqL=~e`?02LL-K;_!{*nU#8=}l2>0H*m;prw_JH2RcC%HuQLy zY(d~UTJuporsQI@My30j3FYmrsi<@MZRT0 ze3&z;ZAuKCJl*wMU*O*ZbQC(8q`&femSD7^Fr17%F@jaMUI(*L?A6j~9T}@hN32&4vtghg7T2X5c2>EnP{-6p zbEuEM8Zy0(`hhAZLJ=lB6h}=M7v`X29bWl2lI*pshKtzQU)yzK`1#$>L!648%kxUj zZ&?;>)nQGuZL^f>knipg1E;rvm$MsgBbc5j7d5&I6zHj&DZk}W8KvH`#K#;ZYOfEE zS&Y$qsku;EA*46U$EQWf!@!-K!C6`lix*%JKldM}$=T5(EmLLN>vK8sgk?2WTk_@? zY`E!Nr^O`Wp%03%15Hig$Vx@zY}BpsrY4*&hU@1I&Uoby zA>g09XRanJQxx5V2AcbM+F@2^yV>;OZnf`=1sOu0JEvI8g}&3Xjc@d{;LqAryA9j&#r%HoH{o1ok%&FC2SiNE^n+{+F=+N0E6bw zn1#i#|5E=Qx|VjUaqihquC+&Ek6;o;ZpGrR2t@E0+zqR+LKYv8ifkPd*C!ddA}KX= z#%he&q1N`+dwz%Vo`{_gIhy>p0_ag}_Z*K>QKK(MeLID%Nu}@*aeA5>g+z50*LkEl zGD^D|S{==_PZV^O`8nu=QH>W!-sH%ZvTk5zr(|R$Wo>qbatt1uN}yr6ZihYeO)W9xcbbAD&Bm2CY7!c&rV~u7z)BDqxEyMa@*4vWjwh{td z*Pid0NhRK}@zQ+jd`NN)Qu9f!=8sehth^#gPG0=5>E;*Tu_83 z3%hW}N#k@GgUJxhSvGZ$tc#Zmlxh)RqXZnrSm6$_He!NT4E4_&~S)24F?Ke(q3Ic(?+E8m5U;T^ZQK- z(v2dB(sdZ(07F$6!Utz7VSdPj((e-@CWR@ZX|;6pOp`~ZC(R-M#8_1`fBQkvl0pb0 z2T)^ahklEj=jnfzaN=R+M)uhKxZvNz;R_8!Ymb_WKYHPu>cCg=9GRw5GU=q^DVrC# zrlIT2@b;XZQEF6<>EO>{#MO3`v*I{8Hn{e>g3mW@ePzownv2AFHNNq5YWMY{S&fGG zedLYRIq>2lIIP!kCmt7tX+!NXq$44Xe0>uxYs)U*{J(`?iMHhm5KM8owg!LM@}L0c zUNOYTaw++Z@+L$<#nz@il$lBjM{SfYZkNj9qs=6H+lEm?py@k2laBOiP%G`W+3s{3tX`U|2M3l5JHmGiz~DjVbqMF#;F-_KM@H)XG(- zz1m}c@8i5!;l>4;tX6|Ld`rMlZ`1pzxztN{gZs7i^5-q>siIPBs;$c7`^{^Ie~qhX z@<>qKVau;spkv)W%r{$LC9`lk>xq7HcZ^R$lU^qAQ5+6eA~iuPe8#XiF+#IC=dOMS zVa`g%wmOy!@n24_zhPA?0AFaN*kCilP|C)4hv`6?A)HtJh+`15oxzlm0TlK(mgJ!9 z(~=Vm^`2B%AmG;j_QEQZu zvP{syap5k_XH8MTZUz!m??*pNkgu|1m|Rpmw~=ZOr4u{wHM)%YPQ9&O9iAn@v!%NW zyH>2kXqDgNg;kAJQdN~zel1(5?{$Q0W@5Ru#4!ZIg3+k1N|CgJ*oUdoE5t1b=N2kh z*SJOC3CuOqh<}8G&9y7r=bva|f)Ymh`&{2-zLgpbVND#n*G1enQ$GGk`CWQ70 z_YMS3oaGZ1#Snh~3p!yi`bSuw&~cpsg)j~`2p_$%5QEAd18NNs#R!5c5(%ZDkOGw* zN8}1Zv~M<6pCq(_xD7;T-5`44k1K`=g=rWAR`J!J35LJ8BNzcj41u^K?9s+y40vgE zb_@c0!qJ90>A{REA>$a+9e+TNuMp^lF5!gg0QqldirUkjdt~0`Z&srck|HF8twj| zt6X7gQ`+NIth0TkU0-4UT>8AQ{C@L(V!5P`_Y4p%)z!+!Xtyr7~Lruu}C zwk7(6RD#eAbH9+L8t{H1P1gJSL{x(628CQnX-9FsfYuBWy@0Cb<+vDoS)+D2R1jwf7IJ-jH?IiHN!U|zR}0u zCk)84C;x$Ki$!?{t39a zy4QPdJd;}^EvX22Df{nmO8gPq`)iOFI?Iy+^%TV7dTx3 zY%lOyLuxN@uKJknARYI}?x58>W-shcL_@nnm!`(n`_Mj~GkrTF`WyqheHre_odGSN z-4UlNnXaJgeFV1V0)M04jPl#Fv!>@oc|+7S^txyGnRz)t?wWeh&+Yqm z54r9yT^oPdW4bc*x@+%~?HYO6gT6Ag+mq^=(H&KD59*Gs1@#T$xpKkj(`~^9zen4Q z5d!MGW8I9gyNBD18FWwkFT&mes*xbt7M%eG7=pXIySuvwcXt~c24`@0cPF^J4({$S z_~34X!^?f|{lD)0>#qBgtW$j|)m@#cPNk}|_t_W2C;?J8gc~uYProjPe?Gx@BaD2@ z{T+7Bkv%A7ht)GOVn^lon+j|O1zXUBjDJ?I-T|f&zB@*g*bt-0!-5C);p} zSE$)r6x`i%j$Uay_l$if`hg3benTfP;62c@{gfPEMEXu(pg=^(*?z)~FJJ$&6Yz=MDa}V8j64RTpkoHN%{Vv&e!Ud<;E93Yw^|^QN@ATsT z6$GxcN6zsDTw5p9e|A1#oL=HSXB=Og`c6i^f&3r+Ll*pBdEO1PKbRChKVufQF|$8f zcJ5ohfqE&p-x>N&9KI|1pK-ao81$WZe*;}%WcNINhA$XmWq)+++^>L(F>=4V^_|py z{&acygvhEL&G_#?W}Gbl31s#^;Q(2AnEwl?Og}-vc7Pc^^y&jcuqDjosB)7SO1487 z@zqG%U)Y8&!`LZ$pYZl7tfVD~z|O<$B;`$Z@uIw$((z{3a!F(-sD6Eb)vz1FFJMk9 zwO9`i!#=n*(`!V0Gq=O-J9D#py0*46qo6Un+%?@c{)0~d7zSt%#O3}s%VqON#&ON` z`)?>t$FYh?TkP~QL+{6B;O}p#7di->>2;UWZjWg<&AdA_&Y}xt+5>xD-+Eff>QrQD z=nOa&7S!OYJ|25O6%+YA-b9U!=?vz674fXaqNE2r^MWMnXy(!q0j|;!h~hl|y2>pd z4dUi*schWIO9EZbUZJpkDEoq;WoVw97br@es;xc;*xVin?S2y!0Ov?dck3m&I<+un zm;lX*;s0%8v;L>X{(lgCtn6Hz%>Of@j|E(W?Z34CMb~!^HHl@Rx5|#zmHXVS#y^*? z^WRT`gNqwQh`Hj$nIVihVkFUsVHx9vktIUfNOuBbJ7dKOG+nKD%Lsn6oYL1o+P5Kb z7w#o~#c(3??NxIVPIuZGdH&3M^z6CvK6LL;WH`#Mcv&h}mHP<;^(*8HDYKiT^4Q)u zND6`+G2hL7^Y7tWMeLIB;kRE8rJhI4Zm@;dUxYWmbR6bvAE@SfpOgPK`^sJo;GO1m z(5-p+D%=QAisP&Np$$_t`*rZQ4bRyh0G3a~ZGu$54QV`%F85~_0JEpzgX;I(*W)I@ z#>Sz)(;d$vWHFxbbAQOij~4X~y+9WiFCxX%pyH26Ae z`{ix7s|CQ@1gZc+O7ni%-fOvAw_O&8{&Exd%jj6Ep-OISME6U%#Q}lb248UbK`%@s z!mkJ2FAz=nvq98wP|SAI`LzYOTp|c?fJkOMFx11c03zhe2X(vr5feYuY_yzw9~8jv z?PeqeGuNfx1$t)g%l2`m>NLBif8~RfXJ0pwx+QbRYh>I4xX@_+xAhX@S%L*(Sch2x zC6USwF?G23CUOjeAqbm=3ad!T;&YT6VDoe~e;*7HrAf)@!yvm#1&)*n>scK{xX2P` zC_Mfb>Ji8~Br@Z$a1BKUWMUK2OlGtnRwM1lzn!bha6K+vn~Vvk`%UPFLLv)&?q_QK z`*x32KYDLZd2S?{#N}G%W^m`3}aw;)BH4UK@7XemRxl#YWW?d2rVR;$7~x;ZBY$nb2Ss zARHAU?}IhmOav)SDJ_Z!Y$=_#lA@vVh@enyvFWZ^2^PJ0OkVRqdz1ViEf#3 zqL`87>Y*m;pa8QWC?n(ksh-$^$@$ntN?(aAOi0#uU(;ZaIORdf^mW zv5ZfSjHx^HTUbPg#@~4zNgR9|7`N*Q(TmUpq2fwtm40u`4GWBmUY4xarJtpTxrBNG zhf(SOmH`KyCy%r!UWe+m249^odw4*5Y zwu|-~A%5ufhaG4|KjRA!b;QPukx%|Trr&dp;^{GM^Wi(P8u3h@n9H3J+jfkKy?ycc zV714Hnsu^6_rHXpyAs92+|{EWkoJ75%5a`)t6wse)Ku3<4v~|S#K4N7r-wa=8=XKn zG=ph)6Qp4y6PP-4>dZ#;u9&i6$%+m|2Saw0E5!p)(HCKGb$sWHY}MeQDHZ9>PK2|V zaP9aQi#Seg?0bl0ofB0Bhh^w{Y}BwYpH3lrj_KUK8fH&s zEaP8G)K&w;edfLr=1uP7dHm7B3V(VJ`6g)C?QNXHB&*~5Fc*4pA;Qp=jq6%l%36s>wb@T^?Rk98+zyG9yH}% zM4dwHLjqQEHrEfMyjCPw-bMW<&r)8KyRVmDm#6FypNcrF1Eh8JUoiQW6?*Gd$X@xW zQqeK(>a~)7+p}bZkwNd@B>Xcq=O13vu5x-|G5c<-Y^0)QAM#yVTURY)?dd53pl{)jcr~+T^ck89DxQwmQ&IFpvdZ^1HPpU&- z;iO`0hE8%5L5!4Gft8;i8_HC0S>}TgJ}?afGn)u>5P%rPq&RWrtIW})gefN7iJ*?Nd>6+K6aDHq7jkSF zr^oq>om1&D6FvdO^k+evfc6$Q*(~=D#l~7c{WIp47&f3Z#ROek3c^TXIa+22J1>5b zH3U=4I%T$BbOuExf-(yg?O|EF@=P4uLS_=q;0khclcIbmO854sgZUorg_Ee$0ddma zU(5Pk4N0jmMfo@$5?|3X__N^Q3}qH+Jj-eARz-hNZL$0Ux6O{wU$w^iXB{nV^8#Eu zjZn)Eb1)}CXS}DnafnuWYb}Bd>y8TKHrD!J>N}=g0d_Bia7}KD1f}Lo`obT}uRdTJ zQ>?NmRa0!7-58}N(Dw4~E9*=NeVTbga2&;~G%kp1q%8Fg^e`sO#f0Gr4V;NWyXL=` z;}7(7%A9N@r-QqVG*g<4iW))fSRs2TAdTNnUW$T0VWv zr;F#B2a^U$Z6khq8;MjOo|Hi8AAv6wCe5oBPSL%~FEjG(0U&(b9z&v(&oPBif5=rt zSad&m_!A-orztYmKx{@^$Z9+Sm4z`XN<>(&BSO0>kKr@CsT0|ydMmpZL%79Y#4Z}udL3S8-?T$-pTZMlyVi5=)fwYJOqnEu zO^RhQ+2{zz9`w>i$A}YT3tBTPP&-)O%$NXyrZYtVmNfA7ni@qW{5}e8cZ8=6wG}1q z+A=#R>xPd!JfH;@O$`W{9t=iuV`zm*U6a-)P%dp$1dU6KgOtcHJbffSqLUNG?)~QS zqgA(ttd9ro1_un^_pJAVDi%;V#vM{DcYh~|1Kr~-)hH^?pqbP!mHm()1F=Ku(*xJi zqb6?P4Ss7rW!7kDn37r;eftn+4UdD8AzV`saK+H4=!#7!lK@QjIopY&v)B!|^M`DD zAc0p)^-1i`tQm6l#D=PnIl!NAKjCykxWq{X;i(`-MFcw>g>rvSczolFh&Nx#?-P`>w#vtkB3i* zsUm}!=q;TL=I*NyOcknH!*qvi0g2E`VYy&u!p-+QZt!m~z(3*Y6%U!53VWlF5!>X1 za$Obt00T>`CJigc3Bz zj{e%heT)~HS`p;Prp=bPVsuA;gl>snf%r}oJED5zgz^n%9loW+QzQd&`UOPQ!U3JZ zK=CMSbg9Uq!SX$PW#yDISv9J1i!wr$A1VTsyk#{SGnzlk9&H&H^a^}EnfBPioO4qV4(G}ghM{qtwVnSuGN7YU)ULg%>O`bGX{?~P0k&(=H zH0Cd-GgW)qTkc!LLx7DHCc>N!Z&1seyVo~;vDy;d6OE3T9^s!0ttVgJH5|WxB_WSS zrTp#^ybwGj3Yw*;Lajlz2R{i>+~H~gd2p{GUzO=P2IZaF+rR=TK1zRRdn$M(+;UI( zm%1xJ>hBer>QZV_i)t6@pvtI4%Ss}ZPyM3hWZO)3TMh@So;mk;*F<2~;Lo@3(O&U^ z@-MK>QI%s~e!-LWN8=%rYJ$fb$sUoIcw#_AL<%748_Yv^xx5NPl=3h4gbQji|9%?| zj8%$7gTc{P*V-q1f+#K-x|?t$xF~fd6(P4BV!lD3yw5HFu4R!LY*@#OciTDONA-i%bqFNlmigs~- zFoipu=sLqD3mbg|avT&PvA4M=1=awU_OVOdCGoT1{%*K$+7$%4Mh51@M$D2SQItub z9U2KT_Tm1?7fz_)lO9Q!`BbmRIkqAkcb$!J+6AsQpJ z7!uX6If^jN8bi26b2{*$hP9v6ws7z?RL3hKpcRo?EQuW0ZUdxd#UX50-paYB-U7oS zRjLP2raZXX8*Gl;)hhI2Y!xHsGBp}nYD*9ri;JrIK?a%S)q$artCi-Ug8?o zjfCp8Ez+wkw5q`YrU8{pk?4)F9K&|wj=cWeek05ZA!H9w@0eP4n5%X=)e?ZLsZjK& zTo$cK!PeK6Gof{KzU)}Ejvqk`OQDNu-CLznHa4`;E$A(8It+esM=NJP3C_YcPPlu1 zLuYM5cj|*0PmEeOGW?c*so5%ez0|Jcamouw-?hauIsV>t{(UfiM&Q+^$C!=}J#5r^ z@aofBb(WSpX`C55dEc}T&~x+sO zQF;yhFYCRW8^IkMA@5K5=GREE0N=ZfBvm>!)8c7e1o#MwgS?GfO3L$ws1kgF5QKuj zjG74)CjOGfl)_?WAx};7{O}SLW=#?axQk^P6`2mlkH${0nUEO@Mc zD{fsr!7(2)Kd^R0xsnqI=ZWJUEV4C=Ycv5LW_ya?u#!f?k)G)@xCBFhuZ8m-bJ!XumPpcJ5T zfTu=UuHLAJ_-VO3l52DpZtI*Jy2#` zh#7;5?o${IH^tuw7dM58g#bhinI14U{>8#1lJ%E1e|8L|`4^B$ChIQ?dCeYiD7IuK zmas68ap^6E;)vY=plL_#0Fd1`z&2Oq6QCiUJTn){Gk%mFwU9i+5*KziSLhS#o?YM* z`;A-m8Q${7kwhou{d|GdTxfcjA8h)3%!OX@71rYJW^2wzOz4&VHO_=21J^7S#zDt} zqz9_>Lu=zyTA?nlLJ$|Ux;86u6STt^>UbFLfJ`qEkR0cT!>A_Mf56`bL6;KeNWrM`5nJgPar?8Xk77Km z4Yx8GsUEX31*sl!b39BdPA&z>2?42g=m7j4q9(PslR%ByKNH9rm4AECgj?Yp>`{sRnJwQmTmd${IE_5;o1gnwesk_Fm=!hV_rHNgDb1w)MdqVQ6X z9J!FV_PEAjj{6kGVcK9?sfl(B{#3jnJldx6khbfkbz;Bg0?V6~xU+bCr)2M|)+2N2tCv?9N}>6+`gUeao3Es^$ss z-`QPQE$j;M8%%D!hWAQoy{2!Wb=c*xQ+MBw^AKH&5!#h8=lY0lYrym0-Mu?j-5La} zmUe-uar&NUOuIA(2wjr{n%6J~2yYlbItL@FmlUo#zzns+jyiv3SM17l_ARf$2vN$) zHS|YuS16Zf8=k+0!GP{l)GhATFksx)1BQvVc2~cvtSj>II`NivYh+@)^65)0b>}q~ z;botqIo3auv<3jtp1L{KN9;;+&Qo~U>vcy18qq$2IhA0aJ=h%V`gN7OVdU-pH~`O( zuBdBw09}<`flN2Kw{XzcJ-2Wl0Z7T3j$iy$4f;gRl@0ndSBtu$YwI;Vakh8F4k+;Z zrN-r+Qp3XPfu7&DcTEo{eByw~Y1fc~>IQ>xtF>L>dDj`Yq_I0L2NLjmfCCBg>yTRr zbf5CBYs0*cD8YB+$CI!&pwK;&;5**sLhmzH-Ur9yiJ{B?Nu2UNFu>mbP2Qt`LZiMf zUoRJs9P|8sz1~Cq0TJy8zJGZV-9?{ z|NZi+{>m0IbuKXx|5fIx`x?7~J}rhV@(U8PU$F4wG~+ih}{PsEJb zV=q;}v^}R#sn%Q#CN)N*o*bwz@2Avbvg?;LM$5(I6hWAXKNaYwr0%DL?HB9su7{S1 z1w4*4l^p7HItsy>?fRXgUxtzXLHa7V>t}~~ITEmouY7`adA5Y3_3-Fa&b}*%oF4LO zgmNj?>PW;1cr*q%5~*pC{t1ie_f-mhB{nK@WCCXg!ac%04$>!06$aFbvp0TMy7LZxAm(QPobi0VY^hPH`g=~=9XMkRMGlNf*AD5=tJz{PenD9e z8G;o?)%YHj@LeXIivCbcKr#L|&gP*Xs&7hrG7!aBI#6SFP?mh#UF2}baI;d*_@a~7!YP@bLXXDED2&_{ zkeM#WDnxOtOn&SMwD@-#O@U{F&@X=v%O*ndJxZi5A*`W}yHt**yczC6ls7v**d-XA zoA^6|C?yC9?lJ#s;`PRsQO9Dh{u4r4M*>aCet%oBb<7z@rtFKYTR%6lc*xl-limp3 z_AFi%y~q!xQL*}X7`VJT+@XFO`};E``YN%cIz+i(H!X&$0ZC(m#b0%pL;X5R=-=t) zNUDBA8-L@3qifgZF|hzhjiXFV)19F42l8o zLBZzfwDgc6^sWybe<sjq5{MXK@JVO7Tdpe?@Nqd#+l!36KUUFHJw#vSFksAvlNA(`!en! z?TU$l<}dDf(8UU`=DBUZ`G)-~fJXJr8fGCvy(n@@7A@Q``8X=!j(L2^vqZa_PM;g& zmCK6?i3}xEnRXmZ;l!`!k+X3DlUZ?!#R?tfEaMR(1jSwxzC{QsyzYjIzglDEhKUn_ z%&{RO>gzr57RRfwnyUSIWT1Sj;~HAJxJz8OhjtY zK}ZkKjTCq8I?$q5ApLsyF^x*lW4whkEb2wyMs&aARg5|_1)d3?j|$PIFxTiM92kO| zOoSZi5($VRLiXY55j70C`f6AmVgQ4|IsZWHDxg2pGXPvEOs@%%UonBy$3vqlYz}Gy zR2iagHUR|qmt{L=`%Lro>+tCWMoqyqSNRf6#I+OX4miAH8@v3?Rbi%(a0FKh&e^EC z0E1|Rd(_;85Cm5q&RGoPSrN^Gpc+Y-3rU!?<9xa~5hhWXZfpX*!l0ENd~lLdBTAN!8j+YS(suFtl`C?(+*|pK&KxI&J))xh^Uc7yO2anvnr&U6K4`d>&8~lD~xb2 zh+vdLON&3D9d+d}TSv%{8+D~H^FlH6VliVRLE0r>IEZf-XVDKa>A)Ro!W+^9e>`!P zZrGuF6LgmdlXY-D{*Ye3lxCll=73b^?mntu2dbbKiqE~tQ(Lfu6_k%FkB?qIYjBM@ zto{UY2PUI2j_At&aRF&{*EiaTfV5S<;H52+s(*;a&1rJy1pPKw$Qs^Zb?Xxp|B>|* zwzAuG2-8^eA}{p!ItSEp4N0B5Q-Z#j(FHDq?FzD1XWQt1WFZ7J+qRwQCu2t{y2blrGq% zPCLd4thR)0$t79!Y7?J9wi6Jmdw}m-9-#1Q+hvqON_(1#xfLSB^`fy}Mg@nqi{5eN z==tl4v2}QlYPWlD!vFh3qAhwMrEJIbTVOV0Slj}mv<_+#?PRl}PH1@(yyZMAeS!I^ z^u%vY8Q=n|m51Gt(g~psbV%x$cA++#dZTiq_Fa=?vv#AV*wktHY0T-=DQKx;>a^SD zv{Io+@=|IdRPXMAUr(U;^$UY()M)%6E@5SXv3!ZKl8)qrReGrT*{>^M!Lx<~E0@^( zq*qzxi=qV?1>zeuIvV5Hld`FbH^2;fw-6@=PrVKeT$1Vo^}*r^AEyo(#gvW`lk!T( zye4^GZJVT0IR+l54jRfF#tWk<@nH4^1)#J7k8O#JO7`Eu;w0z2t_XzrkVN_eS+Hmo zyrCN9g9iGg5o|uWws!z}>aEM(ar3YaKs_=T6~jU`sT{#8J#6kfCOQy66XA0Bp}V4N_MnW#Vq*dc{Ekb z+=r)C_E{8RE=oAsdlQecx)FcGI_?~|i%%2lBK8XPLJ>y6a9Qa|(;-8!9#(`#XyN@S zci-e8x3bo9iuE}an=Wik7iTq6um?Cn4cPGXi|HKZoYq-VdIX4^Iby#&I}s60g>TJs z7xBDEOOosKlgdgKvv|?GiYO3qsG9of6LGMhT3@2^m9_ivPGIq!k|qov3r<55aV)Jo zkfbF@yX3j^`$QuMUU&>+Qt`<25Oc5z3Xvro3U;H2Ok*wL@#INkZ>P5UKDg=n2u>$K zc1?M1P4_wR`xfK$y>u}25g)-lNwe*fPJJbEScR>TPCPwpL6^-A!6tE%K;2D|i1M=- z!?B>@8&(-ULmi#rS4kYn{h2(HtBDm6{K1s>?}lWa&*r(}Xw@NE2lC;fI^bpb_~j0( zqiEB`w}+uJ73tH1W|jBnmZ;>$deH>rh1;BZ0Pl9H^31#FjZ2k>TE0CXw=!?7>wu@d zn~_tNP@TxCGU|R=jcX-WX=UBijYIP@u)(IZDq~4q^%XGGT-6r3q&{(4VeYmx%F$Kx zA~AWHmDy^=BFMUXPkvECj*1Wo&>NmZ}c8;f7_Gqxd(5J)iM7zi5nH7^Bi2)KUw8Dm4bg*#9 z?l5O{TI6i24;3?)Aaw^7aP(vD{(^IESI7pjqdFua82vH)7dQ$VC^HW7y#pHJ-@Ml(&$+Vu-5w;!W3ulYK~D zZpUzMk!&}*rqotYNCg7bfkX*3U-CSDXDO2k{7#+MnuCPs5S@sHn8VOn#t;eTh+6sy zq!$R%{4+pWphVsj?b!8!Vdso~Z~B`NZ@DA7@`{(2cFb^HF`Nl93IfZx%bds;znuTpz>B{ zQiFBBsQ1|5sW|3k7on+p1)SdV6#i%whWcug5{X(dXQP_0ZtZ)TgIgG}@Zg+kXUE!t z8-i%sn(z`mG)!pPtIR%+PIOa%{f>+bI`c*-O6?R=r4Q55N}|-&0qfS=z>HE4OgmsEFj= zvN|DWDADMhIdJ7Yw`rCnfc3DlmI3R!a;M|L|B>G!D?OAQ?C9<_Ml2_|*k)nkKIHpEyO*`}eHH3SW2$5YvgTFr@EzC)3bnyC$6oCXN4P!#$TQ>a%mi)}PK+i^^$Q_dZ{=51X0UVa=3B zv{GFm#OtbUENkPR7XBd>qELqy>7h%JGZzoEWTG{}Cjb`(aTR9W6 z`$4zqDgm?jeWQG118G1==(m=}x2W4`TCD^p^X3fB!6GjU^A<80d&SLVl#Ib0$B;Trxla%pdPHQ=J2|+jK60+dvX>ZgdQ=v(Cu&$> zF()uz@r<1Tu+TEt6EqqE?&GOXsB~_Tl>cdHi<4p=p8bJA$8s7guc@n4PQts7O?LLC zR|Yh*Cqgd&{o(~@h}ZHwj5DQ6tSL#^IG1I@!|%DHWOeez2AWSSOh@!J(bd{2Z%Tb> ze!iXkBqX8a{6b*@8!McyGxS8NezBset${052P2%0Y0!?oS&nm~B3e*4CAW8q-l5ly zRSm~?n6^8syIt(*Il@l4(NJ+bcJ5_vxS^^+xX3TjNmN5@=j;1`wpWvQD9FSnc0pSw zksa+HEg&r|?L|BdeAC{{dJ(a6g2s6Q6;d!;-e)Vuwx-wkoMyMjzo|yscgNU-icw+j zVo{E<-Bm?dgd*Zn&o3qrgqBC;o`f{-(Du@Ay(?qgl3;3K`1Bfkgz58MSnpz>t)b2h zvg-2$RvSKi@B}lz(ta5fT;jB z9+D}j(zNv{#-1#xFIH#fm_uAw;8IHPY6^-&j2j2f3)E_&)qsMFDgs)*WhEUw-S*pc zKoiBJrl;x;*4_aJ3UAb;AzL)nLCfCH50F!Sdht1yROCLg@b{BsESs)%SM|^ZZ|C*F zdl{Z9?SEQs2f5HQ<$d3B8v`}JIo!Vuzy4}vx?tKmT7b7{p4(OP&Tc)*UIB z@2B@}*}Qvl&4-zppwBw4V>Fp6MmDhKtYN^d`_C*m4Xk`xx`u!=$r+_^c)bcA2rnne zz8?n9LRR!ES(Gzlz(P7d{UB|jn!}H0N@YK7bE{5Bv6B#s1G=c^*Yl~XEdt0omE6sH z;G5Gr#l*klNoA1>Sp8fUQXEd)GBe`H0Bo})HoI#@gd|5g*cv*@;N;lryc1GyJ+q24 z`4!Z(o!ex_3I&t(cGuhA1=9hkG^wcr1!guxx-HP61xgBTQ#-STQ}ns7)k^d5rV=>C zY^?F}_awR}{;UjS{A}KSoIk!x=!h1?FKJMu(~psy*cq2*=o%P|XJ;Dy?0B2xTsjrT zY@La`jcjmajxV9Kdv{#TDWSkPz&J23*8kq!;v&_hEIlFPlWQ^ui{`&_+X=GR_T0}? zwAPvDPRdsP@N}1O*`#?WNks<>JN*2EuKj98>Nk}FD%SL9LO`gmJkr}p&)t{H(-5M( z$*dmC(G{?8m#HJ|B!Fs6em9BXMkMs12HJ8;*`XYX-jQyQ9#LEZ1X|~H5&T=;*4|Ui zTVL58EZ1jLgj{@T6|3c|U9;`@*4B1nu`zMji+*5C!?o6lHurZ)x}|tlACYVXO$%X*6p(3Q&$&W<-ZD&}}z7BEr97&Hrx6fiKOWmVv*d5vZB!B0ey6Cua>xiAa zl;_of#gpXg&rJ&99TzX%Usn~auezEAo<`cAq5aRl*L=;|gnc*TTwnP1&B zX#RlKX}d}W-LPn)y9ZilaLJW_OZMP&$GL%Dk37|A(f1wFzFYa@rW5=Zm4O9iMq$yp zct1fEbNjQC>S_%(QpdbEoh~+r;N)+QpjPtLL1=QthTBhUhkE{EFQs1n)=lh3n`U>` zgxq5LS>Tk<=u_~^_bbEu89ev1ZBC!s=V>c>E)d_}rsz5`PVE7Uk%ibC#J;|2lEzTg zq{?9w(8@S;EWxb#?JUdM`ubtB%p~@ye(Q7Uvw~E`o>Zr= z)bA|17`CpHL()x}Afl0^<_}!IKjG)52E`$o4vAA49F!X65$XNe74L&Gt_GjUo|8m=6uMf*IVZF zQ>=09J71`*{GMUpIwBCaef@PVQE87U0>r2-l#t!&{1E(oqV0mJG@{xEgN9V~Z#y09 zvYAp=-zv)~t?486oD>8*F?y1U4(+HJL=JJbMeHgWPovZ%qD160i@(D=cqkv%I>k@Y z)S0!aa^XB&!oX*T@3>#V2`3pck{{#3c2Q7FE1I=(PC?07%-9^qmoBHS+w^JV!vU!(POR+} zjrvweTVt5eY0UZgv7>6w1YhN8Z8FSYOpJ0}QY)wO?3$vUUU`C1TtZ>ZjBOjPxnE3L zn2ODx{Ao<&&Fj%!Yf*I0DlwHWKMh&a;z6H_3hev5ErxkdFIQ5G4gzN#l~^r?Tk*Ol zqxXDL-=^E{=0ohINfNUl zO`zqBPrWhgdT{s)Q@Bu;U17Iwr*EZ>BC2|!p<7`D8k`iKLT2af-nyLSTZ_XE(#biW zKy+9}k&tpV;KD<-)NuC*>Kswv`vbFi|0}D_7>Sp_XZ@vNKmgHsRs^3=Qvvm9x`f0% zFuh+fv0z|;=JIn@#3a9B{B%#QD)q{1Rtc}0`026%#}mctk$3Vt5&LbK4W3X`?QxLeNt$id z3$FG`anWW+S&d<<+)rUpqHA@>QU{^F8VGd}w@kbbo;1i8AR!E(P^w(SRR(g1kUHz$ zTZT!*xwjb#JrzA)HqL}>8Q6x!4|?HcFvj99e=b-6pHzlhG^9+WJCx^Gtd^^8qE9? z9WckO7IbJ+n|I+VMIJ@t&TdFFY;3H_!3OF%d`jcMqnG~WliH)`-zx%ZTe zRquS1c1?OQ+$3*y@b^|bCkq%Ms;?&ItX(evnFKsS*L;-J4uYA`dd&F_n}2yw_GUbV zZX){3+BPlMd4GLI1sZFSX$7mf)z}AkHGWvX-*u$jU!6X%1#1N0a@gw!y{KJ0+bp4V z2<-jx5P#FC&MeF*)X(n`?~?3N?UHi~dqJEc(CH>$UnF5E9@jjwy=|5lmaJDU(X8a) z1%qofPuv1^C;4#)cw&dB_(Kbx}qfR3nFj9 zPZ7f%sUD-`tW-{H?W{L8dm9t#8?pG5M^uc2{6Ri-oHx{?P8z&LNVFw}gnf2uOT~qo z6=fBM&2nzSC5dX)6-yO_>dE@2!oPCiL;{PJVdI{dmbvZxOJp`wf4tUzh2mn4BaRJ1 z!!vKCTuR}U>Qtf|mOxz&WpG>Py|ctj$prdW4x6drsi?r-Cqw1zED(u*?d#3@cuCIh zL#HA$ku2Ix$6}5Tnj{2XLrmU%RFX*t`nXd46*682bD1rPB~kM%fR&kx7_vUHYG;NH z?WPstY(zh5?K((P;|F*2b*bpP_DDG&L3FP}e1lHR{Xx115wByQ^(&QLmvH}rSM|k1 zWlvXjlZ+hR4IHO!SqIha((WbXm2R1B)$UsFh3oQD)d#<#1Ca~4d-DgEbs;>piDug+ zO{;Hoy6*QhjL-@Ci>sCFTgy$c?3os~`@sx$N5<~W$$wS}^hsQ!=mBHMP>*H~nc`ls&pqKCScyK6g`5SlgnFH6*8Q5xw|N zv^Re+#>IXL-7C%LBMA(?bP77vcvNyDVixZsdYYM^4yxGz0P4dPi;g-u%wya%&5Rde z?3;EE=ce8p1DQngO;9#W+k-Z%1{&_A#afe;X@+MPqvRROD3nP&R`u6YcCs)XYdNBl z3JrNVNiY=*;9Cs7Qk_|PvT-jCEtHH(Ox%7zD?aaw;4iV~W?*}oKF3v6<p}E7k@#CMai^KGa^*MsO&4&Fs z+xyU`(~kH4F8u@SKD}w@&0(_c4e^|RXS9J2r=iJ7 zF{)DtA2-^WRp)<$9yReMYxQLyP1f8-ba7B7Q2XEm`cod&X^JXJFDxRrt?c;0a;{6QDB#d@20dam zK5hOl#a5`A!jzHRlo4QKkHELpwX~kDE^W1Dkq9_X?o3wHdACrRY-CSXapzJGrQ#}p;#v}>duoT7rg4ni^2td1--gJ#sLh?W zzu73pY3B+^S^B8G^eFm`UCtWrtLGF7219aTd^1cC&y7rjiD9B|gz*$fM)2EzC>(@& z`S|#B6I(ym#sLkCLmH;ja`j73`{QXq>`HidF^s5T_;beVI|dqc?2mlP!0BDx?#SB) zM|)}`$+L%5vbbhasTJ`sGN_bK%=KjJ(GZR zZUj3K@AWh>4V*$=N}9o6m(}W+eT(fL`w_P@sTe#a9>|Q?`)^cS25$Sd%5}AImmsb( zKLC>^+UnTy^i^^n&JLl@ccGxxIbNq|>H|1WiwDn`# zXxm)KO0&E3=+)nCd=yBNz=PFloe_4C4%dyLLth|N>T8W=0C4+R( zkCYY$n6f}`u3lH2_p+?9>F(N3#(GSs74QNG#{^mN4@IY9bFO)}1jX?pp&Lha3+KG# z8Axpa2&2I=^u2q)e&uYj{9pdS*F$0jMKFO9bx0=rbAV9KNPDG_B&R{#~xd9tgrVbRe{pc{8*~k z>#Af=S!w2lT0}MNb31^qK*L)8&4>4G*GkTGkrmuaUf^Czx9a0OAP#qSj4~og0Y6X# z6V%V=x2&pVnv1<`R2Vpa#?aQ_pDR2#;x@M1CU%gPe=MpA&7}tmYuGdP2D2q7?Rle0 zSLMXB?Jh1UER=c-r%eeAkU_&J+@Fy()tXHc5}4<5vj zAT+NJeHb)BunpG$_L6O%SxbzA<4wa)6=yJ#MjhK^xyQ9lI12x#(T`s(F3Ohxogim}!sdnuqLIUMGhv*1FcK zIK9pBPFgP-l(QstBkc#ETV#~}jdy_e8Qw9WL5)PYbpJd?sE!nzT3EWy`gGBgY18uK$(`tg-z$}PoDm!*HY@_?#UzKXYQ<_zt3j^l z?+wJ{wsJsEgLh-e_?%sIk*3z zy%F*#I7FW%VFnq{geod4lc04kRl@V79>%5|dx9HaZ@89Jtb)~YPk1MQ#MWgWS3O7g z6qaQkMhN{QdBD7fJHl~T885Xszv*5R!-3}^^`=9>{cO+4W{SD70ct0Y`*f%igAmb1 za6k0sCur81t$(2Wk~8`zmaV^|=)Oo@1w;ts{)4T<_RIGGDZ33?c7s&#LUtHs_c9OWYszeh$j&$+N==2Y5!gZLVoI{x3bJLmsjyQ_IRniDetO>9(M zf50&*5_9}-Vy?4`D=|Aa*Z(Vt!otG+|LK^EoF7U1ZB8TGSD@L>Y`Pl+=`Z9ddhIqp zi|cbb-P(Q9oYnWbu&)%eV;fJA|I@x;MYf-?A1+b#S$5rbkybMI%+u;zR% z6F;8~>Z(?q9w^gZbF8-1e5jW27{~Psw!$0!q?{@wL~I&#(+v5g)gNx=UNy*fS60}h zahP9L`lOYMQY0NPs+NqaEa#P*m=B%tskJ-jt(24n0*24L=^hv>>88{OBpA=4)Cj&E zxqYjM6%BuZRF@)Ig6Z;Xt*upcLzmF@FFmCmujo-+QdX0A*H#_LT_Gytm0eaV*)o67 z)LT+MeCV#o^c_1(byk<65pUkFh*epB->HagptkWW=N)gT+6G(M<;M!%@s4-C8o1i@ zGC5^8HSJA_rSq3f!R_zrQbXGBj1F5%^OzN}vZFRsY6K}&bQl$}6=l7sU|ZEmtwx}( z4v=7XJ3lK0sE_0>VMwcw2v&anhpm;knc}Lo_j|g&zcGGXG9)7W&?B%%GVJ~I`CLJY zGyFVw_kTZMnz}d&dj*Zmbk=SOer$)u5nVa_U9o!%tM&WbU3eYo^;>&C4D(9wwfJnP z6rvvNJ^#=M7kaaMd|~o`e!6}Q6Y_iAJ(0Y&YTe82wJ>A&v#c6}7K$wajE z{#@U4t%>w_B_!zc?EJc&N96C*R$lVXq58S$>;Gx^m?tzl<;Lds`h4>aydo65>S^cO z+GNpS9fnixg&V#Vdw*>4yExM{`0V^(tUY~vs6@Z75TfHTeRF%?)PJQN|3~=X>r!3( z8uzgMvM#FcVpWTw{(4nopuSSiKo-|*`3Xqe4;ulil7e)W!~CbU8CjPWUp_tm#YMl1 zz4vw$IS_60F^zqKLEx`>A5TI^SGi5dw;g?5_GLRi#3m|!2&>lH{3^CRW#zWzTXPL; z&AGh98g_fA1V`zL4ldx!ZYE$n$t+b=T*2RXk*%x}d3WvYP}C=~3F21LHN<;w|1mMU z646ns*YZ$#JJs>`M+9A=e=RMP0;MfpthB|7yF)3(ij_if zcXtng0>!OBA!sO2tZ0zn?(Q1gQY3hSguqSTbI$$Fx#Jz*9pk(ApP7}t=aTH~XU=D@ zJ=dC`X`_|d&BVyJGORUw6^YgL0)tgsldPv18o=j`hMBExXXlYq4~Ec+mMJqeQhECq zVaootn68uKa~ZP?G-k*rWxZ+@=c6NT{R|0{}d@9v~0K-f~47} z35>>}6o#0J{CuHbm&{Jz=(7^)rdZI|F56mg>SO57RcbD9k!=aHjFH7OfBjpBAkrs&X0gc^UO$nG2gC0vS+K5 z?C}TRq3$?Re9+R|qy1@D4#ZXMJE~YG8yJ9^Rft~QX<nYj$tIn895&J%+!CBDTz=h)<8w!u_zc+Vsdu&1Z-89(I z&f{~HjdBo=kx9&%7H90zpq3Y758q;|pxb2Yor;)b>_`D`#uzJk>_8>EpYhZZ#j(&b z05}$8rUL}7REJzGyt)u+71~VLNuLD9&g#`VkL0FCB0pKa z((@N9{OKGvhWkg$sL+uNq<1#Wc7$e3Z}^vcmfUUCL`f!*yD2-bAQ{1#Dhsnk-At>u zGGUfJYC_$JhtbL^fmcz@-;%W0ZFG6Fj%=3B@=sHwqab&jp#T}dxRq0+YFdUC%R#GP9G;pm#f zNSP#gwPiP<#O%H-Cx9zfMDYmE%K%;QdVfxR>r&!^-C{YiU}`l_z_`lv z4wsjyY1~ll_TXE1M>=ST!;r*2%!jAbn*!dW<7*;YX*Ng$zl9hDlZm18FWw}?8bnh! zHA;vK-jkv!gBF~cPQ=Nu0s^Iu85hS+ya*d5?*CYwLKmlxI5CV4(OkRo`-4~J+{8+y zYO`>3MNX@5aJ_5#hL-WKOpk<1(_Z6Fh3u-N1?_g6^Puk+NZkQ4(o)Q>JEsDHNBL<+ z9|m!-=QVbGSn#4G81jUXix=Oz2Sw$ZJvz6;zZ%z>=bDdsNj_00}K zI`RytPSL1mcw0_Dv32#*JQG@3P;ICuDag5nwC$JM2>FFvS;uk$DyWI7Ud%EM&#aEI zf%?iXkbchOat&MqA3U3Dru*uHa}vhN*G(NEWQKZp(tEWE6R+z5>f3iyPs=&`MhHE1 z{xy6uDK$G^Cy=NPakj_64N6;tt{6T;X$kC%xJ6O`*8?=J?Q)x{N0L0WfVXKAk_jDY zX_1YwloQWhyM;-ZTV+732?4#8e+5{dhVljViwo&26lLg!LL-yU-Mo$)Jtr~zoyuJH zJ++r$8hSOYTS#v!j})xD%31l0=t`R^;$fp_;k-&j7aaYcFC}-~f2)_7)`xVUaOEBI#OTJ^<>0-9d}!53U;D)yG;cSjhpg zvD>d8OlBfsI-CM21Pi>S)jkVe$)4nPfI8JzMD)dTnw3t$o+Kf4l}=`rfrqnoB)FEn zG#!ojvnre|P8&nTMp62oeXU9W=_xx11#~-%usKU~47enoSjWg$-+vKvK*PD|&|*-W zWgO-DgHGOld7DNY`RcUZZaCT&@$PWO5ZA3@?CbV-fT7@po-T4>(|xqr{_xM8!4u6R zr7o@DhaJJcq>^+#UH1Vr50Tinfk(*k+IW+n*|R<|iy><;4L1kaPj>~yfR~*yID)dH zPeo)jtoo^5S=U>R8Vm*2n_=wDMku*(g%37LDQ)S66M{%Ic0{bDTQYkhua{avJhK_m zoY{py;VX|y8l0h^?RK}6<_+Z z+Hdz<6LrZd&cMoL%JQK_`(Oa9!z;stsd9O^p}duNyL+d!FA?*$-NQtbn>JN7c(>hy z!a~$(2EPDjiX$ga-=cBcXj0@#bYkE1e1X6$I%uR2>YH6#FM%XZ0xz(r4JkGfkNJI- z?Z`DzuVm5jP$5qy90PonHO7tpc;_=_rCx>jeHVOQI#IV&nWjNG^8-n0q+&DY5Lau7 z|KwqKy4(HmV404bwej{#{!{$et9+3k)oUw!E-X0V1*6D(x7=1g*Im1knQhE z8NHtU`6||;Ta%P-wkGWeo|j-eTs+RQJa=K2vIZmU9feQsak~@J12k!kv<$jx_cxK` zrcZU2JX4G(#C~bDH~*bPb0XA&^VBl8c1qj}5W#QyP|zptW`a*Owz9DpEs3ueXD6I)aL6 zC>K{N<(_;$0R9nKyhl=CM6C6IEtsq$>aSB7CgvK5+N-tHB274Lk22}e)G`3X|AbnW zXEH1VxV)}^w$$GqyC&zd>Aut3$nLUf+pyM~CfX?Av;^3>4qhtqEIT2VpLI1hZz9QN z?QkXl4BkKc&)>HyzLN*RJIhKT*vTly-cFLc^hZ5uYB2c~^hx54LLcpxRC~yp^zlod zr{a(3nuUpf2ZrEvgedL*A@_AzuTGZ{FIpH8x0g!|&?s>K38cS_54vj)T$55-S(7?m zwYiPHl09B!s(*YV&y?V{o|=o>-@}Wv)BKP*hh`eTAdPBnX^I15~W}Z^~vkTTOdfjFCiV8h zW&*XBuZ7sJyliRC*FerPRR05d;N)0>rNEesWg$(%Vz1MULzvqSbsMWD1YC9Cnzx0< zek?X*f}&=02Rru_OwFLijrbB%P-8UaE-ElcFR14)W>FN;!-%Ov!s1 zn-o8ciZKEYsc)Zb*76!zIHYTT8%hLoJXw|sBe6YN&&{+sKXWLp7ohz(U3Ra{MoM~# zw=xhu&DBsDAiL;}a*yNJe^IJAe#UTJJsS8ui+%VeB2N`_yTSAE!_lx;T$M9uPpxQq zEB=`~W3RzIfcV?F0GIPZh3K9}-ZEEKn^sR{7J&XAM?U&z6;ub`Xv8vTFBtj)emgIv zJTvcyyzXnwqG{qff~srjZnIzHpYGdtt0bTp+D6;`iqHIufn?{S9dBV) zk}&75C+$8a;@sfk46Iz42a@KT;BGnwXSMqf47(rFAF%?g;g#Bb6i=Whkbl{P+7-6- zGOLwz1G6E)US&=r5{LR$QPBEj1ge{Il+&Kc-4ozgliiXpLF8S!n)I`8`%v@NvZ%#9 z^>EVve;5VAzea&ubD*>B&eb;TaShQ;ce`4#yZ8@py^V#}RUsk%X>kCOY@trwP1w5N z)<6Lt^{EA+FE96s7p2+&u6@p0b3W4DK2tuMtHU>oC?zaVFjZO#Zvs=mu*(7#(Mzd2 z9#*fX_1Wn+#087^;g*J5$3ZWK6D)?LNUGkeK5c$vWblmwG)Qm_PNM8cFkC>bh@1*^ zz!^RCiJwThIt-1A6uxQW4*QZ|{vmGS2bEh)KaW$I*xV`O(nPPlnVPusJ*x+NoB?rH zG^kD^@swfx`RKk%3TL9$(_y}Y9vm6NnKQ!qXuJSDvpCT0Nv~0Jg5(2V-mQUQ)JrwN ztj+JtIGbf7KF^q%gg4cxJA8qFc3+Ym-}N*&pKyEb$^2;Syfrt7ZhIF&)&DET|45(0tKV%8n69XLQ?+YtzO9OoKWKd? zHFJa7Q;Tvita{nY5q)JTU8mLt!ksH_d~lUku+j|ASK4cD4^*DOgBcaX)y`5K&<0Qe z!fAQvQBSf{qFcHOMNdo3H4bQvypFhI0bK`uT49FZUIC*VN|1)HzNGfoDKeIk9!VgWp#}+X{q4-W6oSMq6;ihB zu62;`t~p5;=IQq8{Oyd5o8&7s{<@oz1`j$h`nLOK-#s4?!q}gk-VhTs8vI{IoOsy# z$qpMO7;*p1Q0mO`Jn@#tI2bKzR0U+He`0`Fj`J^H3}0((5#apmi=SUN$d>aVmh=pm z{jv^FF$h}J@(T*M=P$H5YHbn8oLoIi_u-iFa`Fe&<#T`hR)1ap;xktL6}(5i56n3Q z=JErZT{%f%?C$FZEP~NZjqvE2ik6;+Pt_YV5-GwIk7@E7`eNFk{p!Nhj|pqL#fcGo zsqLRS-{y^vy-$q&67aiv?3&%H3bw4P4zV9@$Piidw;ph3f-%$y#-4rG&lvUTFXP#o zZT|){dv6;%GMoCn`ek)60aZP>WjP4k(E5hLPAVG-{Txix5oRKT-FWw@!{yR^r5P;1 zN(TF!Kpjk^vA}Hw+o>{L*auaPnkq`D(T%zJ{5QXFvuZrN08QhX#QH#-vwU9Temag3 z|HQ1!sr!dG|7E>bdm7aA%yF;>{&JD6)~`mKoj_gei_O1ATaC|n_nKzE`9D1*9xD23 zhH;_7!l#w|z#DS_s=dJ5%zSuRQEeTbbBBcdJaeynsq>Wm5%~jx;D_b`UaaK5d@FaY zzjXwgbmX6Y4La#{j=sQnUk57yaCuqP+K&7|{PkgbuxV#Lm|udZk>65nOSd!2MKjkt z5))Rn3zCE4wB;OdV#N)iut85XAZ+y$UDsL;grR&r2V=+(1}fb=9O3nstN4_*=Huf3 zxKEo7V7l0=87HN45k@(4>}*K4Z*#>oB8CQU`ya$gfWcMYVX{sX4a=aOANH5{#;x%5 zdS2*gnQ!P%T!QVQ+vh z6?1xFCMy(Z6ZglAX1=w%ZqZ#yZoi?Z6gDGe{_7=7}yp|Hs48 z+%+HP>kDJiurC!+3~}3CsF!hBlzmu^sTO74@Fi?VZv9wDC%gUn!%v!0weP@9!hI61 zSfaVA3(h8>ia+Is7~km9TiALGp3Cx*Z)^N~?!$Uj^e|I)JHU#KXh&?p9)AVrDCnXc zuqJW5BI4t`k5L2+PNAqd{<{WIe=vEyY;+T~ZPp&O};mvL03 zR)>WYv*N=vr`!no|I|%u#K+c%wG^|R`CIrG32z!VnqqYj3TYGVbvY&)-K-hx_06oV zF9B%jqZjov`$X7AC(Lz`er1-A;&>M?6NP`rT!NI`Nx^ClWjJ`oWbC6!C_n005{_<@ zhB?2I3a=K(=IUec7R*}zE@s}J6?6sd@t34>2)%L(TcWCWPJ>gC8&MFsW@8xS?`e!1!-jafM*v%`wU4zz>p3{F?^>_oc3S!{@(+_tMkQ~TyD6Hu3b{zHh;G0`sLh~H zYgUrbj!hoigFl;h+UdjwZT!I{v=9I)0l>fN(q*)8>Uv&5trqPmKkx-^Ah1s*s1!)| zcFdl+n0S#6++)p#TCPS04h^IR>eXckic;EoiX}mg1KybSkIy^1&I-E8qst?Gd%2@) z_OgfA5>6W%WX5oIDK)E+KYSa6aU4}Bo_l@}-53fwknwBRg?l%fQ<&L4Ym*XGl|+*r zXdk9b^fVwR&8afNb0Es~QlcqzVt0wXZtb-T#aVHK;|wK-*Kigtx`^%14(IvTBz8hV zH&kZhH8cT|rS>Kux$c~6gO6D<=P3j7z4>yPKLd^D{GA$_gsk(-#%xxM;^!tvjNX?5hv@OeDYq>i``hE)NAB&5nnoIR= zT^f_abZxZVD;<=Y1c-*bzGRnh?ehgWqU4NfEKQ>0vk7bO zQUm*x+N(k-kwPg(W@k7OuT{Q`;GpZGB4tXb&&nd8)m*rWp4py0jWO?S4qrKb~Bf{QHWqQSgf#AMcGih%02lm$Q&joiXio4*M>i>p5` zm0Xw+EQ<$4DK+HRp=e~|=tTnP;^e{L`f+^6O>Rey{%`tYx|w>LtWh{ZkG8KWg-Vwzo~tgOVI zDU}K_3sNb$kXzAhg(gt!n4;v3d^#ut@+8e>nq8!;9&hu%zoipdkNy*!+2uph_d;Yn zLHt3S{tB*B!sZWJj&RScOPj54@a=D`eXuR64_g7Sum)7wnG03Pb~N)AkQttu-;rtI z9$bap{`Jid(~F6vBTft=a27D*NSmPxo(oKrG_d3h%xk6gJ*`&_Y67hvjt0`g8uHI} z6uIaq&*mkKztpXasd(Kwp#4Q;oC1h2rVcKnpU%lPhEi|;pgmhMWBs0(&MuBB=@3W! zAs!ud9qMsl-ZTm2}&oru{#V)Wh0u- z)KFo@<6aWmWa$?W8nL=VDv?$lYu_Ew@70$_`KD!We>{{m0Yo{!jZlH37_b#zWr#!b(8w)SApj;bI;`0g>c)|*H}O*#x`vOW=rRpvm&FJXf-2^ zg}Q9KBVviO_Kk}QDA=qn2}u*$e8V?9bhLmxDw8$}u<7eaI`IkicLpUTJDe`0sE75h-csV=y~7< zSIM#0xLd?-@<&5x-}1Q^FKz`b0J&4;wQusAIEV$941G~P-#Jxm!#&R3KS62f|A?5> z$}?3~xsNz}&<);{z=7pDun>UB@HKxSYM%V|#1$$BZN+lyGjQMN>FZn83 z!mCWFTDxdCe^bz&hKmm5;&QXsHs!R~_m`3Z2LXoD;%|snXSes_Qj8}{tB*uR`<7_; zchPZW{^X{gy6A^1tkG zovL+&m%;jM^azhQ7*B=% zaP;8m7vNc@RTRko~B@b%HMlb}tAqx5@;PNn;i03qmk%zq(6^NsK2D1XYs=({il z8|?A}2En+0Iqwq(xRf|WL#EQvYmu-Y?hfT&m`6|m?DId+t%i22sa)tz5R~D%AT9xN zwR$v4xSlYdU0ou6+MHRfX@F7DMR>nXC2bGQ^6 z)aXSqZf%MPUz7$+{L2k)EcxqNQK*VJ%e}s z+Wel5StKM&6pXFnP64LK*joBj8uwRSymMje;yV`&)>@sJ=e6FudM`8Aarn1ouz-9S zN?gD?8ZvEm@FSh?*IDDaghrZO?HM0$moS_fLd)Q-nj-?>COoBH2sPV}@KKs7;zM0%%6{l+JZ0V#z;~E8LT42N@xJ z_W@Ua(=y;z^b;kHO2U$%2s8}`lTJY_2 z8Q&wmg9jTsmY&k1Ya@TCq!R>c##?lT?roOY;TSqjHF_)dvV~zC_n!~FQ+|^-BY;)T z2y@&vN7KP#3ygE;!d&tbY7=OD2!6*mI>2bhH~n*=lB4S4SAs-n2hO{d$%i5#_!%Of zRH=`go-|mbiOQ|LcUc#3Gqq7QjgJQ< z&>AuRSWlugUtauD8ly?2dPPKSok5Yvi24YD*J?+B)$tdVJ2Llgteu(9`rY%`Lx6@S zB2hXPK{~%ICNP8(s}9!B3_DxP&tkU&dUXaLG<^jcPC&X_%dLyh_!m;%E&Q-}pdp2W zkdV%!hOC+;Re@4_?utHff(i_Y^M0QmeU~2n?Dc3iXt^j`*RRa^7`-M+EX|wI$vUwb zB6RR@3qsNt~|PDz>F5VYSem;>d%Wp;zi990!^4^M{EW#EiR#)&u^R@F%8?ihVqZE2N| ztszc6JH}|&G7l}OF{Yh07te!BrB%a`ZZXMcODIcUAoH#SN;_-7D*T|#WE6?2hE8p3 z2o6fkYm;SXL`Xf~jQ>veM}!1R?ruJdEQ+{gR#w=pLkJhv=XE}Fnw{$S9o#6r7^+5; z_;H?YMC^_Y5|%@4mzyk<+s4n1FS8z@Ud`#0UwOY81uMad;&mKjWrw1`=GooyIY{#^ z)t9aRV%d=px%=S7w`#>lGc?*F5|*3!Inf_M83y!Mr8`1F9)^sDN^Q@6xi#&fd&{|M z;$<}*zON=M#v$}E6Gs9vitdK%DnE%{*OxSC!ONbsV5V<@?dq~ecNwX?pU22WN*lt# zdGs~0Nk_B52|wu*a}YhmLuIJ3IJ=k8&v?cCy-;sOc-0IBe_*Oqe@G@)Q5!5lXE%&k zT~=`T4|hG1yA`igBEcIpl)3Nndhj{kwRlz723sAq)S*p=lJlV-YB@eft*;k!42hX$W`02 zlB>E)W?yNc1^aE&GxIskS8zuL$)A_+#$=}CX^QU(5Mm%FS8`)w>Jt3~RLm>~9V=IX zemW14s+|QGneEvc;$RUZF1S(7bK8kEfZ3pkrdI#~d4!Uf@U=$0c~v=~J*)HRXETE-!NNL}-K`c3t%I=5; z+{CZ%yQAv?{sSrXYnkPJAl1ShkoYXy#WvvaLC8HZo=T0kVy@U(7E@-^40}vAt zkhSUmv;vq9>AfPcu2kb4mox3>UO$MeKBR46((1e-IlHvAZ~R{Ldh%J)6ASvymFx5! z|HAQ0#x32DYf>t1|+6iK8Ap7a54dqae7BFs`1^ zm1?6Z$=B7=b>S^sZQS?sil7rCXHuM?)AZbH&ge0fZcBn*ONc<+(>{W#d)w!b_Xf~4 zAFH^=-Z;3Vztl!mz|yeSD^7i9BL`m2q%J>P_k&?q-MR|1v70eDcdru(lF=3(Ft9Hx zlTC^1J#QD)Q;G}IXz)GAgY2SacNRISrf_pbFD49l&mIzpb6ZrMbPu<0p`-;fduzG| zazX8RX16?EZH{xEy=pT@*ZJ=5v(yz~oGJ9l&xI^1%p?uRCFJe!>?;sH38|3c5`IY% zLO4fRW_ZLcr^owS)6+}JR#JGoQKgjrrl>ri5$<)!z6$vu_G;6rcQVQ|{p`(=PMfO8 z7tV4&fia6R%pSN+_`}|#bJOF@#Pj5{XzjMko)YI)U(d6y)w|QmrYi&{o6czY=5T#z zQ!RT{!hfOI`ETIf@&&P4(_K-US+b+|JpH4AFZX{$TGm}|Q8_jJF3O>wma zHU|3H9Nsdnp3uTDWk6{BFGI?*Kj`&Dwsm=FB zfBAvdozM_!VNSPoDC+H9<8RHZI!{;PY;fzrZ|Jw9Y{|Rx!`-@z>QMbB`4Zuau?c4=cNcy6eIZN(NF#CpveIfg| zT0ee=BQ2#cC&gEV*Oje^5ez82;7F(<rbo5Pk}n=5=!=A zV~(%Z*S+K8JvZCRYRkWrX(deywG}gW))5D4%OdG#WjYoK0)amR;e{%;(NY2amynd9 z!=2;H!$NxcAKzP>DgZY#U4_|qunVb@=&~8+D`{elBQBWgob>#Mr6xfi>WP`0(lI67p-)bRNfvSP9eLDixK*jXZSH(N$pz@*J#!Rdb z9o=2J;@BUC$OTfa394O3y=$}rK_29{VWEa z@chMTu&<;#r!FOo4AH=fO-;uV9=jo;S|n*IVyfT=cT_HfiERA!0jE^F@`7oIrLj_A zA57me=C&qJ@e&0s51I)TeVbIGnbN>UZ7H3|Hnf~9+iOUiq^>e5{`xu9iD}bCF=A)b z%Uw|2*gc+L?UmxwhV}by*pe;p2+?LXfttFxMf#a$+T%jy9*Z>c!`bK$Y3YMs{GvYo zur(!>Wm-0W*Ud7KQkUjY?Dh>y2Ka5hi);dXC8%rP*K|! zv1Q^T@%6eK_~yKB@vOyFHMzfAS=L>1XHuO`Etu0AS^@>Ew9?*_(Q)bJr`ehofsTD9 zfFGVWvUEj1j;C0T-z`u;<)%@qpv+7A-W452ra&G6?G!0BVmdh{_9P#2OqRJ*QE%eQ zCa}{nTTVaQ7OfSbbxw)JCy|@hs<&6dp{u6b^(yjgm&jemy4$4z9NpO$U3Yjv#fb#} zHV9ql|2znt@4p413keGRkF^1{scQD5(ocJi(5!n!g^1s`8ed)-JtuyZVA34PO!Ug; z)$@mKEzVWclR-{(R_z9M1xdb`9U)AC-{;WhGs?Z11g?&nY>K_Qc?O?;L_PYFxAAd? z=jHTs0U6WDlwy3UfS}jTET0sk^dc8NQA12BSzWa>UvsA71P%%?PkvbX%xGz5sVR+= zOOGT9ssGlpMgx7WZ2LOsX>sBsg5sPPqqI=diRX$PFP#+j+|1ukK7glv;Im`k@zRk) zzQ=9p5qfjF0gK@!d{$~bkSwk~n%Pe!{@@GCT=y0gnbpe#{T|=^(wF!57owh)T39oN zgEwD!zs+=UXI*b6|43Mqy4w@Ie2dAZpQ~wWL|^SsEtfdYt$L%`7Ta1{L}Ct5ps(S0 zNT<3$8Tu4>sQGn0tWC1eTBt6&V(PT()tEPz@nJzQ+&GZy^B2)#-UK_I;*~F13cGFj z;H908G3n!zsAxVy!+@N;lW4x-cHEf`hgLHv^CwRSDL7^1tm49ly$6watcYL!uPp6< z>QVkC&Pl0x_Vzwcjj`&yRN^~Py8J^RXGI#?O{dPWYG*Id(D`%(+}82*(`@NNR}vA`n9Qc*S$fv5x*5ty&KAeS6|W6OW5Pwv=A0RpqUlIJ|d0c`;FPLXRmFEG^2%ZXr+5_ z{n@5n$KUk))Z-Fxy1HbEQ1ql$riRP=kWKsKy*Shf6_TOFQxX1Ged=U|r*?Bi{+aX% zUp{Td+SQwrEj*rKmKH-Ay1rRA?Dk(OdUGkeZkTtf7;yTch|WpVw|=Y#eymlL^mF^= zG^d%Qlji5(Pfc>$NjE>feCmpQOI&yM8T#JvHi;WW|7)*h_Scsg%Go>+9z-!LZdEbx zUfDAs-oJ&J@c%i?`1u6?@3kI6{38DYW?3K=XHp()+B-Cx|F@~`fGn=!z5MO3pVVa= z7*szoys>%qR^bMasVn(8p%ScXYi*S@V2@rvwo*NLA0+%Wbz$_Q0Ydac;!-b(bafV= zExQ*dX>F|bM~6)smM?~LvDQ5req;F+Gb^5 zPotkkt3#xhY~q@=FKoHHdAv9)qmaiFtikH`fBIH&}6jA zb+N;H7zNXxwlMsF&0>uMjIb-A4|Kfl**bkj03P!Dg19iz+2!Mzox z5!n};^mSa_(QS1yR4|5reJWpnhOT?Va!#L?9mqv1qB|qWTWHN3!oQMm_=$D@f>+{m zEO`}mVIYnd-g#Ly1%4AKuLub3qD+KFX`PJnwPIb4CoJd5Mc??cjpwA-L^QNcCTrf* zBX?%yiRYx6D~aBJoR0YW(>SwyRBvQ96Xv`3K6^$XwF;9022Dxy>SlIb0%L}o{%Qaw zP=W;{)I&x!EwMd{Qpt`s7(u}$`n&@IqkAno)p;{4N5D^aD8gcr-qHU3*Y zDH$c*`1=yCx4=K6Q5U6k_JQ(igMREU{ZtM`Q+^W_>5K|a)-w3beu2J`*k9D24?7RD z!_FaTe!129tTAN4+!J>GO}$SsIscEa?Qhmy#Pq!{dejdhQWznE{b3I(|77wqx7)G0 z;5wwR=8cj%7X9;iQrO_0h(661E2ZQwy6g{`Sc>f)snpGH@ez>LXfjH(k{ebDevoAm@fGvO7=x zy#1T?$-C4`ugwyT$N_;s&p#pxDe~C#hoh=B`#01}Jz`=LPm?ug@j-Ln*ft+rTimDl zH6h32)??TCQ->aV_iJh8PrnXNPIdAWG|p;VK=FC5WVQJctvht z_+(%ya-v(!(sVr_OsmtTIvQH8w2_K(YfHq&PaQ(m}^}aPC$RZc^X#yQz`#p zAf5S3*zd~*F5x5HLxD`diTkPpc{*t`ok6$_yAQvs5plT;zi2$u=zhs8!v^=_UM?bI z;`G;=`csbhhw;p#c`xU;ttpZs>VtknW?PWyDVo+CW_(N@vFWKZ)L;C$I`tiL z8euG;|JX@+OVO$|TTic+C&7oxeN|I$rJ3j1suzd+M4YAa4ezWQwy)mq3yq=u@!p|% zM8@FIoQL<&vI|=Pn!YRRP46*`{#8h-@!ku%<2!7G#rN)i2R|Y1|G(h(Ka;s;fkvFj zcnCu;&Pa_q?KZN7BQ-szs@@e9-S>(h(|m-l_wDg>=lJF5MbgAL_{xaI#y}*z$$jJ7 zbLsmZ3G?S=|FN&N$9=m}*1myx_^rE~j8~ss;8RV2^3Rd$XO6;)$v?HK*km-0gj(Lv z^?!{hhMm4s&5dXgCqsetFluMI^4Pd`>zsun!g}bT@WWGUK%v6`3GAO*-w2M<5jk$084sb(7b7xE6Vozs43WfK?WtuM zY?Z6egiN4yZxm;33hatq1d9Z71b&B8>deU8H*jE4#4X=YOmjOkAgp?mZTMT@w~DE0 zM*+A3!bLv#s8bLenB$nYEE!{umyCE{lTp*2NLf?60 zdMSr5wY{Tj`)6n>>Vp3l#Z;sYQPj3ksd6_eXNFtvMQ-xu1oVVJfz%Pv?Z819Ejs}< zB4jpe8mIgGIA@z-(Vt&0bDk4#;uX@2_ZdMhFms_>&6i#eKQEax}v4^hpDFBP}6pQUeSY|<@=|1JVoHr+*wQ(+CPXl2(xZrjvXhp$Vx(ZNa zOGe~8Ye&bU>+{`rdv!O)*di7=shrlwXY(CVO|yKxE{9z$c^ea98?Nh`gyq&Z3JwRV z`D=c?En>ddg5f?DoO^M7MSa(&X0x-HR2D{|3KovfvjM;dd|v-L z4hX6TWroQ2>ZYZ7@9Y^rM6l{pNDpg~=&I@TsJ|pnXmBenH6&%ooymWYP(}0+Z}1_q zTQ0p+Nk3$U$&sj(Q2~#8EVu@6$V@h(mF0QBxJx#cG{e?(FUixAI>?hO=@ZYa7<{49 z=#d_U^b;+^@C?rvey_g6cNM;7<^g&3BENtv4r;y`ZTX6ReEV8YJ5*WA@CO&Qg8H_v zXy>Q*HJlSk4JKcolUY1@7WE9f9fz`WAh0QPcV`_PPfX0!x)dOxEX3W?+9n32DX`Bn z!tUAPo@&(5w3AXo;MjQkV0Yfv^W^mTBVsuG_?CP3s=5gsU)LcSvE2Zr?;Y&9DNM)2 zoNpM*M%`&Q-`t!DpNHxoB4)6dh%%KY6dFdlD#+Lj$ST!PbD&Aq)N7`r6y+UAIfTp_ zDK5=m8Gnv-mt0d$OZAd_j^=M!-HX z=@R4WF;T$5q??O$l=roSsPdDW1;nV+)%;V-BS$M`x$@0RxL3Hrrusk*hV`Mkr6jR} zz5Ve#zeC7>3ij4-7B*Hj-Gu(tX|mZ*!B_{Sh(Sx(qLCj$V3g)ky^ruX+8twD`_wY% z`02y>zd`G5T!(I}KfoZgW$d$&a@6Kak&s&Xi6k9t>13(^Z={cbD5s25Z?Wo*ef(pe zS6+PXQg5nOUD?+KDDZK5zN>z) ziqkb#iPdX@@lCD0-W%qo9mcmCmg>^YoVG+>j!I9ex+^&wbj2T_8+$mkY8M4KIRu*0 zSAJi<ydZFkJ7S~#M-K03&d~_4W2eTOek$4J;)gj;RsH9G|oi ztI?N6chKz`(}QoDZ#L9sZy`5`^<6b7_Q1;>EK zH>Piq6vLIsWqfr4AOK#%Ct>IlfPHQm6JXq+C9mPBJkHhpJ7s41*Rf{XQ95F*De@3M z_JVyw8GTh^M`0R0B4=7XeS$cmB_AEogiW4~Fu9VOs>A*;CzE#fhJ*}t=Wb4NSB}c{ zPEJdr*Hv#4LQnaYMk}OIStbM9m^jU%|Je1JAAk8TL&>zRoES5N zPU%vr4FyCrVj$W7?S*pQO1_3nNw|!@lXCRF44d|3IW}D!)ljMdt2xqwDhU#URr~Fo z%p+plJGnkSD+J@zFx)3SX=rNR`M@4)=S{dNR zZxl%jf-o^_yo|$Ef@>rJZ2r~eY*$V)HQT087)ltis5=;MP8Ho}IShTr+|$cjpnb}^ zB2)t((h;Lsyxhr|VYBs4IrU^W_cQ2C2OAiAU`veI=bZ1yr!3h^!(osDXSoM0iQcRH)k-T^Xr#(Eg+oUW(g@6Ps;fby zK$j<>`kkoUj`C%jRkg6zEBs}*KRQ=#BNY`bU&EaQ&hvTB#h(C2L#L0FFs;)^`#bMf z@S0b(&DshA95IULJ_xmf&;Z0mEo$#ACN$=}4sWuqaq_})Qs~)a&pxO5?Y7wpVr1limS1yrnnIS;pN}yW*5pas zmhVC^CPc}d5`U>6+5<%%gQm!82{qxw7K2CZvRW2C-qwSXdF;ya7xW(qTG^tk>|156 zouQ}tSdH%-keU%_&@$Qv#>V8_Y>8;giih~EQuhI@jQk{jw z&=yCIz-d@>{}u3hZuLYBxYUL=cyzuy| z!Qf2PxK$?YjbhS4>>sFTO_fy(NkgX>GG6NM9jJV#@I*27M~ebTwq&zf@P8}(r-*z9 zYR-Z3WBaq&BJ!Q+r{0r&?fk59iwK#UAQZ~!E7M}LrGo9_6W0r0rJ@41G#R_lC~GXt8dAKR;1g>G`T4UEMniH?UVX87A>mk1smAMpKLwPfBiI1AyiO0O4EiU zU%}JSZNVVJKyZ!;G*UZY>5f>iG%y5sQEA(dly(y}Sb-+eqFs7^lB_S}^RRSQ4^bLm zPlni!apu*d4tS&Nla#`Ra#Q}C%gviTjp1&H8E0~dWYG-jXOzRXxVO0V*)YT4H&zSV zPa3wL+^C25QzLlEBTQcH>Ad_F$)X!X$z%n$bBoL+i!d|8j|XwAQF=ML>0))Yur0i7 ze8)nfK7Jpf{6UuB0Uty&VD7v^#DYIQT4) zA7MAG5mhPoaIssU5dp9QVO1^iz@NVfMxByII8Ijwt;wnXygv~e48Ok~>nHeh)h3ws zJ`J)_=3AbT_aj%V0;PO4cGP3IxirYPvZ;AS`4R5eqwnM;s3Sb4OGtC#{E}bIs*m9Y z(;^*SE~;02{wB8fCCUeT{*g~jgJ8q?TiO1* z{9mnH4KUPO8&@H1A1k-L5wT=jYQ+*(vFJlA+9)5Jh_y>e5-Ke#l4A2w=_V^SNo0lP z?v=0I>i>0f0wW{Weo#sWukzm#RqBDqRYyS%JK{BchP~hxVsG)0kH1quA>wnE@q>cfYrv+ zib z9Y-D=1#(l4uarnUKq9U7O=yye-3^4GN_ORD0Js*F~*=i)06V-(jvcqrL`olFC;KNru zno|?K)#CenqR*KxYHv zQ_&ygt&9%f)l?!YRG7*&J(fXTmGBbV2g-bKOcf|A8W;lSf{CHgbz~7BqL?(wmKs;? zHU@ZufqSBTg4a4=K3_G}XRDPSa!zL9yn=jl`+#joHhmtc4%htJsSzi{srj%PUj~+3X)~m<|5l!y*(&*Xp$7wJYFmQP++b z;2UxZiqiYfd&VYbTP)u~o+Wm9!^ovnP29M4OF@H|n|)9-X8+x2n|p13vD^5$P3(#M z^^?3vkXe*;MtW*``YX}rm#|eUPXu|cG*?h0&N)G!zbur&q{ znf>f1e8ccSes$7_gR!V2+%3Vq3{mX<+h&KVrF%V@MAzkTm0xk?CbUdqa)GV9gFYf9 zz%2@nbk2mR`LBB%di zLgSsGFRfb3(a%)1V0i5~BfUPmTI#8*+cc$z4?HL9=}^slyXxmNDdlIdqc=%TT)kZJ zUX1PVSu8!hr}tP>Al!SRKa0^&=rf_#RSQgAsZm)n971|Ha{W6{x#(&E`|j=W;0 z_}aR6rp1ySC|H>YZgx`n}ZGm2uQfoUacaRdVbJh#~um z4=P8v#GJ=_wrB9v_iCqXH?r!N&u_PO7!0L78fxFfBvV*NzJ+;?uDoW+kin#A86F$n zittR@R~H}bC&qhr8!63xocnNNSn=_TxWp7}-X_PpB!#=iX0C(}SVhc-XA zr*-dwt=He?p1Ae7dFZM?ExYE)uX)dc)jpW@Ey=)KE;RqJ7}MN5upagK#@6~ zI~M{qFqBlPBS_aKz~>xPa@YjO|KktW)sg7)PkkEen}Bp(pl*Pl0aPFAE{Q@Qh5`yb zNf&?ujRpmW1QET?fEZJMQNG_T?Snu@=5q{Iay1~BE}c%>59@2ZBy{1 zv^2Kb${%5-$Zr+lscPUW0T~0w?-5N*Kj4hab#4ZP97-BFZ#|L{JUgu#v} znbC)*D?M7sRkclx&P;qpdoamESHSXUvnAmQ1x{5@I%cl-w7HSo zCIs$PIii^;blaf?SDN4``N`Xv7*?Ch!tq{#8#!n7f`<#;6Ow<`sR-m;y~9=Jr;s~N z#Te(t9XJ@B@LT@RAUmAv@?0Twyi-2KiSbhi&XDfYo= Date: Sun, 20 Oct 2024 03:02:31 -0400 Subject: [PATCH 03/10] SOLID & GRASP: Source Code (#38) --- SOLID_GRASP/src/BaseTask.java | 5 ++ SOLID_GRASP/src/HighPriorityTask.java | 20 +++++++ SOLID_GRASP/src/ManageProject.java | 6 ++ SOLID_GRASP/src/ManageTask.java | 6 ++ SOLID_GRASP/src/ManageTeamMember.java | 6 ++ SOLID_GRASP/src/NormalTeamMember.java | 15 +++++ SOLID_GRASP/src/Project.java | 78 ++++++++++++++++++++++++++ SOLID_GRASP/src/RecurringTask.java | 33 +++++++++++ SOLID_GRASP/src/SpecialTeamMember.java | 13 +++++ SOLID_GRASP/src/SpecializedTask.java | 25 +++++++++ SOLID_GRASP/src/Task.java | 21 +++++++ SOLID_GRASP/src/TeamMember.java | 63 +++++++++++++++++++++ 12 files changed, 291 insertions(+) create mode 100644 SOLID_GRASP/src/BaseTask.java create mode 100644 SOLID_GRASP/src/HighPriorityTask.java create mode 100644 SOLID_GRASP/src/ManageProject.java create mode 100644 SOLID_GRASP/src/ManageTask.java create mode 100644 SOLID_GRASP/src/ManageTeamMember.java create mode 100644 SOLID_GRASP/src/NormalTeamMember.java create mode 100644 SOLID_GRASP/src/Project.java create mode 100644 SOLID_GRASP/src/RecurringTask.java create mode 100644 SOLID_GRASP/src/SpecialTeamMember.java create mode 100644 SOLID_GRASP/src/SpecializedTask.java create mode 100644 SOLID_GRASP/src/Task.java create mode 100644 SOLID_GRASP/src/TeamMember.java diff --git a/SOLID_GRASP/src/BaseTask.java b/SOLID_GRASP/src/BaseTask.java new file mode 100644 index 0000000..25d2e70 --- /dev/null +++ b/SOLID_GRASP/src/BaseTask.java @@ -0,0 +1,5 @@ +package solid_grasp; + +interface BaseTask { + void execute(); +} \ No newline at end of file diff --git a/SOLID_GRASP/src/HighPriorityTask.java b/SOLID_GRASP/src/HighPriorityTask.java new file mode 100644 index 0000000..35d4fda --- /dev/null +++ b/SOLID_GRASP/src/HighPriorityTask.java @@ -0,0 +1,20 @@ +package solid_grasp; + +import java.util.Date; + +public class HighPriorityTask extends Task{ + private boolean ifHighP; + public HighPriorityTask(String title, String description, Date dueDate, String status, int priority, boolean ifHighP) { + super(title, description, dueDate, status, priority); + this.ifHighP = ifHighP; + } + @Override + public void execute() { + //execute the execute function if ifHighP boolean is true else Don’t execute. + + } + + public boolean getifHighP() { + return ifHighP; + } +} diff --git a/SOLID_GRASP/src/ManageProject.java b/SOLID_GRASP/src/ManageProject.java new file mode 100644 index 0000000..4a39c4f --- /dev/null +++ b/SOLID_GRASP/src/ManageProject.java @@ -0,0 +1,6 @@ +package solid_grasp; + +interface ManageProject { + void joinProject(Project project); + void leaveProject(Project project); +} diff --git a/SOLID_GRASP/src/ManageTask.java b/SOLID_GRASP/src/ManageTask.java new file mode 100644 index 0000000..bec849a --- /dev/null +++ b/SOLID_GRASP/src/ManageTask.java @@ -0,0 +1,6 @@ +package solid_grasp; + +interface ManageTask { + void addTask(Task task); + void removeTask(Task task); +} \ No newline at end of file diff --git a/SOLID_GRASP/src/ManageTeamMember.java b/SOLID_GRASP/src/ManageTeamMember.java new file mode 100644 index 0000000..c21ac2b --- /dev/null +++ b/SOLID_GRASP/src/ManageTeamMember.java @@ -0,0 +1,6 @@ +package solid_grasp; + +interface ManageTeamMember { + void addTeamMember(TeamMember teamMember); + void removeTeamMember(TeamMember teamMember); +} \ No newline at end of file diff --git a/SOLID_GRASP/src/NormalTeamMember.java b/SOLID_GRASP/src/NormalTeamMember.java new file mode 100644 index 0000000..c7f8153 --- /dev/null +++ b/SOLID_GRASP/src/NormalTeamMember.java @@ -0,0 +1,15 @@ +package solid_grasp; + +public class NormalTeamMember extends TeamMember implements ManageProject { + private String basicResponsibility; + public NormalTeamMember(String name, String emailAddress, String role, String basicResponsibility) { + super(name, emailAddress, role); + this.basicResponsibility = basicResponsibility; + } + + + public String getBasicResponsibility() { + //return the basic responsibility of the team member + return "basic responsibility: " + basicResponsibility; + } +} diff --git a/SOLID_GRASP/src/Project.java b/SOLID_GRASP/src/Project.java new file mode 100644 index 0000000..ee967f3 --- /dev/null +++ b/SOLID_GRASP/src/Project.java @@ -0,0 +1,78 @@ +package solid_grasp; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +public class Project implements ManageTask, ManageTeamMember { + + + private BaseTask baseTasks; + private String name; + private String description; + private Date startDate; + private Date endDate; + private List tasks; + private List teamMembers; + public Project(String name, String description, Date startDate, Date endDate) { + this.name = name; + this.description = description; + this.startDate = startDate; + this.endDate = endDate; + this.tasks = new ArrayList<>(); + this.teamMembers = new ArrayList<>(); + } + + + public Project(BaseTask baseTasks) { + this.baseTasks = baseTasks; + } + public void executeAllTasks() { + //execute all the tasks in the task list + } + + + + + public void setTask(List newTask) { + //replacing the task list with the new task list + } + + + public void addTask(Task task) { + //add the given task onto the task list + } + + + public void removeTask(Task task) { + // remove the given task from the task list + } + public void addTeamMember(TeamMember teamMember) { + // add the given team member onto the team member list + } + public void removeTeamMember(TeamMember teamMember) { + // remove the given team member from the team member list + } + public List getTasks() { return tasks; } + public List getTeamMembers() { return teamMembers; } + + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + + public BaseTask getBaseTasks() { + return baseTasks; + } + + public Date getStartDate() { + return startDate; + } + + public Date getEndDate() { + return endDate; + } +} diff --git a/SOLID_GRASP/src/RecurringTask.java b/SOLID_GRASP/src/RecurringTask.java new file mode 100644 index 0000000..c3c9ea0 --- /dev/null +++ b/SOLID_GRASP/src/RecurringTask.java @@ -0,0 +1,33 @@ +package solid_grasp; + +import java.util.Date; + +public class RecurringTask extends Task { + private int recurringTime; + private boolean ifRecurring; + + + public RecurringTask(String title, String description, Date dueDate, String status, int priority, int recurringTime, boolean ifRecurring) { + + + super(title, description, dueDate, status, priority); + this.recurringTime = recurringTime; + this.ifRecurring = ifRecurring; + } + + + @Override + public void execute() { +// while recurringTime does not equal to 0, if ifRecurring variable is + //True, then keep looping until recurringTime goes back to 0. + } + + public int getRecurringTime() { + return recurringTime; + } + + public boolean isIfRecurring() { + return ifRecurring; + } + +} diff --git a/SOLID_GRASP/src/SpecialTeamMember.java b/SOLID_GRASP/src/SpecialTeamMember.java new file mode 100644 index 0000000..d2fa9d8 --- /dev/null +++ b/SOLID_GRASP/src/SpecialTeamMember.java @@ -0,0 +1,13 @@ +package solid_grasp; + +public class SpecialTeamMember extends TeamMember implements ManageProject { + private String specialResponsibility; + public SpecialTeamMember(String name, String emailAddress, String role, String specialResponsibility) { + super(name, emailAddress, role); + this.specialResponsibility = specialResponsibility; + } + public String getSpecialResponsibility() { + //return the special responsibility of the special team member + return "special responsibility is: " + specialResponsibility; + } +} diff --git a/SOLID_GRASP/src/SpecializedTask.java b/SOLID_GRASP/src/SpecializedTask.java new file mode 100644 index 0000000..5903165 --- /dev/null +++ b/SOLID_GRASP/src/SpecializedTask.java @@ -0,0 +1,25 @@ +package solid_grasp; + +import java.util.Date; + +public class SpecializedTask extends Task { + private String specializationType; + + + public SpecializedTask(String title, String description, Date dueDate, String status, int priority, String specializationType) { + + + super(title, description, dueDate, status, priority); + this.specializationType = specializationType; + } + + + @Override + public void execute() { +// Add logic for specialized task + } + + public String getSpecializationType() { + return "specialization type:" + specializationType; + } +} diff --git a/SOLID_GRASP/src/Task.java b/SOLID_GRASP/src/Task.java new file mode 100644 index 0000000..dc9e290 --- /dev/null +++ b/SOLID_GRASP/src/Task.java @@ -0,0 +1,21 @@ +package solid_grasp; + +import java.util.Date; + +public abstract class Task implements BaseTask { + protected String title; + protected String description; + protected Date dueDate; + protected String status; + protected int priority; + + + protected Task (String title, String description, Date dueDate, String status, int priority) { + this.title = title; + this.description = description; + this.dueDate = dueDate; + this.status = status; + this.priority = priority; + } +// Getters and setters // ... +} diff --git a/SOLID_GRASP/src/TeamMember.java b/SOLID_GRASP/src/TeamMember.java new file mode 100644 index 0000000..5258b6a --- /dev/null +++ b/SOLID_GRASP/src/TeamMember.java @@ -0,0 +1,63 @@ +package solid_grasp; + +import java.util.ArrayList; +import java.util.List; + +public abstract class TeamMember implements ManageProject, ManageTask { + private String name; + private String emailAddress; + private String role; + private List taskList; + + + protected TeamMember(String name, String emailAddress, String role) { + this.name = name; + this.emailAddress = emailAddress; + this.role = role; + this.taskList = new ArrayList<>(); + } + + + @Override + public void joinProject(Project project) { + // add the team member onto the project + } + + + @Override + public void leaveProject(Project project) { + // remove the team member from the project + } + + + public String getName() { + //return the name of the team member + return "name: " + name; + } + + + String getEmail() { + //return the email of the team member + return "email address: " + emailAddress; + } + + + public String getRole() { + //return the role of the team member + return "role is:" + role; + } + + + public void addTask(Task task) { + //add task to task list + } + + + public void removeTask(Task task) { + // remove given task from the task list + } + + public List getTaskList() { + return taskList; + } +} From b60a7c25b2678cee73cbce32a14b724900abb7ad Mon Sep 17 00:00:00 2001 From: Zishuo Wang <94806384+FancyGohst@users.noreply.github.com> Date: Sun, 20 Oct 2024 16:39:27 -0400 Subject: [PATCH 04/10] SOLID & GRASP: Adjust package in source code (#39) --- SOLID_GRASP/src/BaseTask.java | 2 +- SOLID_GRASP/src/HighPriorityTask.java | 2 +- SOLID_GRASP/src/ManageProject.java | 2 +- SOLID_GRASP/src/ManageTask.java | 2 +- SOLID_GRASP/src/ManageTeamMember.java | 2 +- SOLID_GRASP/src/NormalTeamMember.java | 2 +- SOLID_GRASP/src/Project.java | 2 +- SOLID_GRASP/src/RecurringTask.java | 2 +- SOLID_GRASP/src/SpecialTeamMember.java | 2 +- SOLID_GRASP/src/SpecializedTask.java | 2 +- SOLID_GRASP/src/Task.java | 2 +- SOLID_GRASP/src/TeamMember.java | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/SOLID_GRASP/src/BaseTask.java b/SOLID_GRASP/src/BaseTask.java index 25d2e70..b53bd68 100644 --- a/SOLID_GRASP/src/BaseTask.java +++ b/SOLID_GRASP/src/BaseTask.java @@ -1,4 +1,4 @@ -package solid_grasp; +package src; interface BaseTask { void execute(); diff --git a/SOLID_GRASP/src/HighPriorityTask.java b/SOLID_GRASP/src/HighPriorityTask.java index 35d4fda..5c547ad 100644 --- a/SOLID_GRASP/src/HighPriorityTask.java +++ b/SOLID_GRASP/src/HighPriorityTask.java @@ -1,4 +1,4 @@ -package solid_grasp; +package src; import java.util.Date; diff --git a/SOLID_GRASP/src/ManageProject.java b/SOLID_GRASP/src/ManageProject.java index 4a39c4f..5797536 100644 --- a/SOLID_GRASP/src/ManageProject.java +++ b/SOLID_GRASP/src/ManageProject.java @@ -1,4 +1,4 @@ -package solid_grasp; +package src; interface ManageProject { void joinProject(Project project); diff --git a/SOLID_GRASP/src/ManageTask.java b/SOLID_GRASP/src/ManageTask.java index bec849a..5642b74 100644 --- a/SOLID_GRASP/src/ManageTask.java +++ b/SOLID_GRASP/src/ManageTask.java @@ -1,4 +1,4 @@ -package solid_grasp; +package src; interface ManageTask { void addTask(Task task); diff --git a/SOLID_GRASP/src/ManageTeamMember.java b/SOLID_GRASP/src/ManageTeamMember.java index c21ac2b..c65251a 100644 --- a/SOLID_GRASP/src/ManageTeamMember.java +++ b/SOLID_GRASP/src/ManageTeamMember.java @@ -1,4 +1,4 @@ -package solid_grasp; +package src; interface ManageTeamMember { void addTeamMember(TeamMember teamMember); diff --git a/SOLID_GRASP/src/NormalTeamMember.java b/SOLID_GRASP/src/NormalTeamMember.java index c7f8153..03c44ab 100644 --- a/SOLID_GRASP/src/NormalTeamMember.java +++ b/SOLID_GRASP/src/NormalTeamMember.java @@ -1,4 +1,4 @@ -package solid_grasp; +package src; public class NormalTeamMember extends TeamMember implements ManageProject { private String basicResponsibility; diff --git a/SOLID_GRASP/src/Project.java b/SOLID_GRASP/src/Project.java index ee967f3..c0b78c6 100644 --- a/SOLID_GRASP/src/Project.java +++ b/SOLID_GRASP/src/Project.java @@ -1,4 +1,4 @@ -package solid_grasp; +package src; import java.util.ArrayList; import java.util.Date; diff --git a/SOLID_GRASP/src/RecurringTask.java b/SOLID_GRASP/src/RecurringTask.java index c3c9ea0..7955b47 100644 --- a/SOLID_GRASP/src/RecurringTask.java +++ b/SOLID_GRASP/src/RecurringTask.java @@ -1,4 +1,4 @@ -package solid_grasp; +package src; import java.util.Date; diff --git a/SOLID_GRASP/src/SpecialTeamMember.java b/SOLID_GRASP/src/SpecialTeamMember.java index d2fa9d8..92daabf 100644 --- a/SOLID_GRASP/src/SpecialTeamMember.java +++ b/SOLID_GRASP/src/SpecialTeamMember.java @@ -1,4 +1,4 @@ -package solid_grasp; +package src; public class SpecialTeamMember extends TeamMember implements ManageProject { private String specialResponsibility; diff --git a/SOLID_GRASP/src/SpecializedTask.java b/SOLID_GRASP/src/SpecializedTask.java index 5903165..736c2bb 100644 --- a/SOLID_GRASP/src/SpecializedTask.java +++ b/SOLID_GRASP/src/SpecializedTask.java @@ -1,4 +1,4 @@ -package solid_grasp; +package src; import java.util.Date; diff --git a/SOLID_GRASP/src/Task.java b/SOLID_GRASP/src/Task.java index dc9e290..2cfc7a5 100644 --- a/SOLID_GRASP/src/Task.java +++ b/SOLID_GRASP/src/Task.java @@ -1,4 +1,4 @@ -package solid_grasp; +package src; import java.util.Date; diff --git a/SOLID_GRASP/src/TeamMember.java b/SOLID_GRASP/src/TeamMember.java index 5258b6a..e38c3ce 100644 --- a/SOLID_GRASP/src/TeamMember.java +++ b/SOLID_GRASP/src/TeamMember.java @@ -1,4 +1,4 @@ -package solid_grasp; +package src; import java.util.ArrayList; import java.util.List; From 26f398b8e28b3cb1738ccdac9a44b939a6acfa4a Mon Sep 17 00:00:00 2001 From: Tianqin Yu Date: Sun, 20 Oct 2024 17:46:38 -0400 Subject: [PATCH 05/10] Sprint2: Setup Android Studio project Co-authored-by: Tianrui Qi --- .../{Sprint0.5-main => Sprint0.5}/README.md | 0 .../app/build.gradle | 0 .../app/proguard-rules.pro | 0 .../ExampleInstrumentedTest.java | 0 .../app/src/main/AndroidManifest.xml | 0 .../example/sprintproject/MainActivity.java | 0 .../res/drawable/ic_launcher_background.xml | 0 .../res/drawable/ic_launcher_foreground.xml | 0 .../app/src/main/res/layout/activity_main.xml | 0 .../res/mipmap-anydpi-v26/ic_launcher.xml | 0 .../mipmap-anydpi-v26/ic_launcher_round.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin .../res/mipmap-hdpi/ic_launcher_round.webp | Bin .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin .../res/mipmap-mdpi/ic_launcher_round.webp | Bin .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin .../app/src/main/res/values-night/themes.xml | 0 .../app/src/main/res/values/colors.xml | 0 .../app/src/main/res/values/strings.xml | 0 .../app/src/main/res/values/themes.xml | 0 .../app/src/main/res/xml/backup_rules.xml | 0 .../main/res/xml/data_extraction_rules.xml | 0 .../sprintproject/ExampleUnitTest.java | 0 .../build.gradle | 0 .../gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.properties | 0 Project/{Sprint0.5-main => Sprint0.5}/gradlew | 0 .../{Sprint0.5-main => Sprint0.5}/gradlew.bat | 0 .../settings.gradle | 0 Project/Sprint2/.gitignore | 15 ++ Project/Sprint2/app/.gitignore | 1 + Project/Sprint2/app/build.gradle | 49 ++++ Project/Sprint2/app/google-services.json | 29 +++ Project/Sprint2/app/proguard-rules.pro | 21 ++ .../sprint1/ExampleInstrumentedTest.java | 26 +++ .../Sprint2/app/src/main/AndroidManifest.xml | 48 ++++ .../java/com/example/sprint1/model/User.java | 20 ++ .../java/com/example/sprint1/model/Users.java | 32 +++ .../sprint1/view/HomeAccommodations.java | 53 +++++ .../example/sprint1/view/HomeDestination.java | 74 ++++++ .../view/HomeDiningEstablishments.java | 51 +++++ .../example/sprint1/view/HomeLogistics.java | 51 +++++ .../sprint1/view/HomeTravelCommunity.java | 51 +++++ .../example/sprint1/view/MainActivity.java | 22 ++ .../com/example/sprint1/view/UserLogIn.java | 53 +++++ .../com/example/sprint1/view/UserSignUp.java | 45 ++++ .../sprint1/viewmodel/MainViewModel.java | 69 ++++++ .../src/main/res/drawable/accomodations.png | Bin 0 -> 1020 bytes .../main/res/drawable/accomodations_fill.png | Bin 0 -> 664 bytes .../app/src/main/res/drawable/destination.png | Bin 0 -> 2269 bytes .../main/res/drawable/destination_fill.png | Bin 0 -> 1057 bytes .../app/src/main/res/drawable/dining.png | Bin 0 -> 1015 bytes .../src/main/res/drawable/dinning_fill.png | Bin 0 -> 761 bytes .../res/drawable/ic_launcher_background.xml | 170 ++++++++++++++ .../res/drawable/ic_launcher_foreground.xml | 30 +++ .../app/src/main/res/drawable/logistic.png | Bin 0 -> 709 bytes .../src/main/res/drawable/logistic_fill.png | Bin 0 -> 706 bytes .../src/main/res/drawable/setting_fill.png | Bin 0 -> 1058 bytes .../src/main/res/drawable/travelcommunity.png | Bin 0 -> 834 bytes .../res/drawable/travelcommunity_fill.png | Bin 0 -> 658 bytes .../layout/activity_home_accommodations.xml | 73 ++++++ .../res/layout/activity_home_destination.xml | 215 ++++++++++++++++++ .../activity_home_dining_establishments.xml | 73 ++++++ .../res/layout/activity_home_logistics.xml | 73 ++++++ .../layout/activity_home_travel_community.xml | 73 ++++++ .../res/layout/activity_main_activity.xml | 36 +++ .../main/res/layout/activity_user_log_in.xml | 114 ++++++++++ .../main/res/layout/activity_user_sign_up.xml | 104 +++++++++ .../app/src/main/res/menu/menu_main.xml | 10 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 6 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 6 + .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1404 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 982 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1772 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1900 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3918 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2884 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5914 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3844 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 7778 bytes .../app/src/main/res/navigation/nav_graph.xml | 28 +++ .../app/src/main/res/values-land/dimens.xml | 3 + .../app/src/main/res/values-night/themes.xml | 7 + .../app/src/main/res/values-v23/themes.xml | 9 + .../src/main/res/values-w1240dp/dimens.xml | 3 + .../app/src/main/res/values-w600dp/dimens.xml | 3 + .../app/src/main/res/values/colors.xml | 6 + .../app/src/main/res/values/dimens.xml | 3 + .../app/src/main/res/values/strings.xml | 45 ++++ .../app/src/main/res/values/themes.xml | 9 + .../app/src/main/res/xml/backup_rules.xml | 13 ++ .../main/res/xml/data_extraction_rules.xml | 19 ++ .../com/example/sprint1/ExampleUnitTest.java | 17 ++ Project/Sprint2/build.gradle | 5 + Project/Sprint2/gradle.properties | 21 ++ Project/Sprint2/gradle/libs.versions.toml | 26 +++ .../gradle/wrapper/gradle-wrapper.properties | 6 + Project/Sprint2/gradlew | 185 +++++++++++++++ Project/Sprint2/gradlew.bat | 89 ++++++++ Project/Sprint2/settings.gradle | 23 ++ 106 files changed, 2213 insertions(+) rename Project/{Sprint0.5-main => Sprint0.5}/README.md (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/build.gradle (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/proguard-rules.pro (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/src/androidTest/java/com/example/sprintproject/ExampleInstrumentedTest.java (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/src/main/AndroidManifest.xml (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/src/main/java/com/example/sprintproject/MainActivity.java (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/src/main/res/drawable/ic_launcher_background.xml (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/src/main/res/drawable/ic_launcher_foreground.xml (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/src/main/res/layout/activity_main.xml (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/src/main/res/mipmap-hdpi/ic_launcher.webp (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/src/main/res/mipmap-mdpi/ic_launcher.webp (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/src/main/res/mipmap-xhdpi/ic_launcher.webp (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/src/main/res/values-night/themes.xml (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/src/main/res/values/colors.xml (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/src/main/res/values/strings.xml (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/src/main/res/values/themes.xml (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/src/main/res/xml/backup_rules.xml (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/src/main/res/xml/data_extraction_rules.xml (100%) rename Project/{Sprint0.5-main => Sprint0.5}/app/src/test/java/com/example/sprintproject/ExampleUnitTest.java (100%) rename Project/{Sprint0.5-main => Sprint0.5}/build.gradle (100%) rename Project/{Sprint0.5-main => Sprint0.5}/gradle.properties (100%) rename Project/{Sprint0.5-main => Sprint0.5}/gradle/wrapper/gradle-wrapper.properties (100%) rename Project/{Sprint0.5-main => Sprint0.5}/gradlew (100%) rename Project/{Sprint0.5-main => Sprint0.5}/gradlew.bat (100%) rename Project/{Sprint0.5-main => Sprint0.5}/settings.gradle (100%) create mode 100644 Project/Sprint2/.gitignore create mode 100644 Project/Sprint2/app/.gitignore create mode 100644 Project/Sprint2/app/build.gradle create mode 100644 Project/Sprint2/app/google-services.json create mode 100644 Project/Sprint2/app/proguard-rules.pro create mode 100644 Project/Sprint2/app/src/androidTest/java/com/example/sprint1/ExampleInstrumentedTest.java create mode 100644 Project/Sprint2/app/src/main/AndroidManifest.xml create mode 100644 Project/Sprint2/app/src/main/java/com/example/sprint1/model/User.java create mode 100644 Project/Sprint2/app/src/main/java/com/example/sprint1/model/Users.java create mode 100644 Project/Sprint2/app/src/main/java/com/example/sprint1/view/HomeAccommodations.java create mode 100644 Project/Sprint2/app/src/main/java/com/example/sprint1/view/HomeDestination.java create mode 100644 Project/Sprint2/app/src/main/java/com/example/sprint1/view/HomeDiningEstablishments.java create mode 100644 Project/Sprint2/app/src/main/java/com/example/sprint1/view/HomeLogistics.java create mode 100644 Project/Sprint2/app/src/main/java/com/example/sprint1/view/HomeTravelCommunity.java create mode 100644 Project/Sprint2/app/src/main/java/com/example/sprint1/view/MainActivity.java create mode 100644 Project/Sprint2/app/src/main/java/com/example/sprint1/view/UserLogIn.java create mode 100644 Project/Sprint2/app/src/main/java/com/example/sprint1/view/UserSignUp.java create mode 100644 Project/Sprint2/app/src/main/java/com/example/sprint1/viewmodel/MainViewModel.java create mode 100644 Project/Sprint2/app/src/main/res/drawable/accomodations.png create mode 100644 Project/Sprint2/app/src/main/res/drawable/accomodations_fill.png create mode 100644 Project/Sprint2/app/src/main/res/drawable/destination.png create mode 100644 Project/Sprint2/app/src/main/res/drawable/destination_fill.png create mode 100644 Project/Sprint2/app/src/main/res/drawable/dining.png create mode 100644 Project/Sprint2/app/src/main/res/drawable/dinning_fill.png create mode 100644 Project/Sprint2/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 Project/Sprint2/app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 Project/Sprint2/app/src/main/res/drawable/logistic.png create mode 100644 Project/Sprint2/app/src/main/res/drawable/logistic_fill.png create mode 100644 Project/Sprint2/app/src/main/res/drawable/setting_fill.png create mode 100644 Project/Sprint2/app/src/main/res/drawable/travelcommunity.png create mode 100644 Project/Sprint2/app/src/main/res/drawable/travelcommunity_fill.png create mode 100644 Project/Sprint2/app/src/main/res/layout/activity_home_accommodations.xml create mode 100644 Project/Sprint2/app/src/main/res/layout/activity_home_destination.xml create mode 100644 Project/Sprint2/app/src/main/res/layout/activity_home_dining_establishments.xml create mode 100644 Project/Sprint2/app/src/main/res/layout/activity_home_logistics.xml create mode 100644 Project/Sprint2/app/src/main/res/layout/activity_home_travel_community.xml create mode 100644 Project/Sprint2/app/src/main/res/layout/activity_main_activity.xml create mode 100644 Project/Sprint2/app/src/main/res/layout/activity_user_log_in.xml create mode 100644 Project/Sprint2/app/src/main/res/layout/activity_user_sign_up.xml create mode 100644 Project/Sprint2/app/src/main/res/menu/menu_main.xml create mode 100644 Project/Sprint2/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 Project/Sprint2/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 Project/Sprint2/app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 Project/Sprint2/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 Project/Sprint2/app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 Project/Sprint2/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 Project/Sprint2/app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 Project/Sprint2/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 Project/Sprint2/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 Project/Sprint2/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 Project/Sprint2/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 Project/Sprint2/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 Project/Sprint2/app/src/main/res/navigation/nav_graph.xml create mode 100644 Project/Sprint2/app/src/main/res/values-land/dimens.xml create mode 100644 Project/Sprint2/app/src/main/res/values-night/themes.xml create mode 100644 Project/Sprint2/app/src/main/res/values-v23/themes.xml create mode 100644 Project/Sprint2/app/src/main/res/values-w1240dp/dimens.xml create mode 100644 Project/Sprint2/app/src/main/res/values-w600dp/dimens.xml create mode 100644 Project/Sprint2/app/src/main/res/values/colors.xml create mode 100644 Project/Sprint2/app/src/main/res/values/dimens.xml create mode 100644 Project/Sprint2/app/src/main/res/values/strings.xml create mode 100644 Project/Sprint2/app/src/main/res/values/themes.xml create mode 100644 Project/Sprint2/app/src/main/res/xml/backup_rules.xml create mode 100644 Project/Sprint2/app/src/main/res/xml/data_extraction_rules.xml create mode 100644 Project/Sprint2/app/src/test/java/com/example/sprint1/ExampleUnitTest.java create mode 100644 Project/Sprint2/build.gradle create mode 100644 Project/Sprint2/gradle.properties create mode 100644 Project/Sprint2/gradle/libs.versions.toml create mode 100644 Project/Sprint2/gradle/wrapper/gradle-wrapper.properties create mode 100644 Project/Sprint2/gradlew create mode 100644 Project/Sprint2/gradlew.bat create mode 100644 Project/Sprint2/settings.gradle diff --git a/Project/Sprint0.5-main/README.md b/Project/Sprint0.5/README.md similarity index 100% rename from Project/Sprint0.5-main/README.md rename to Project/Sprint0.5/README.md diff --git a/Project/Sprint0.5-main/app/build.gradle b/Project/Sprint0.5/app/build.gradle similarity index 100% rename from Project/Sprint0.5-main/app/build.gradle rename to Project/Sprint0.5/app/build.gradle diff --git a/Project/Sprint0.5-main/app/proguard-rules.pro b/Project/Sprint0.5/app/proguard-rules.pro similarity index 100% rename from Project/Sprint0.5-main/app/proguard-rules.pro rename to Project/Sprint0.5/app/proguard-rules.pro diff --git a/Project/Sprint0.5-main/app/src/androidTest/java/com/example/sprintproject/ExampleInstrumentedTest.java b/Project/Sprint0.5/app/src/androidTest/java/com/example/sprintproject/ExampleInstrumentedTest.java similarity index 100% rename from Project/Sprint0.5-main/app/src/androidTest/java/com/example/sprintproject/ExampleInstrumentedTest.java rename to Project/Sprint0.5/app/src/androidTest/java/com/example/sprintproject/ExampleInstrumentedTest.java diff --git a/Project/Sprint0.5-main/app/src/main/AndroidManifest.xml b/Project/Sprint0.5/app/src/main/AndroidManifest.xml similarity index 100% rename from Project/Sprint0.5-main/app/src/main/AndroidManifest.xml rename to Project/Sprint0.5/app/src/main/AndroidManifest.xml diff --git a/Project/Sprint0.5-main/app/src/main/java/com/example/sprintproject/MainActivity.java b/Project/Sprint0.5/app/src/main/java/com/example/sprintproject/MainActivity.java similarity index 100% rename from Project/Sprint0.5-main/app/src/main/java/com/example/sprintproject/MainActivity.java rename to Project/Sprint0.5/app/src/main/java/com/example/sprintproject/MainActivity.java diff --git a/Project/Sprint0.5-main/app/src/main/res/drawable/ic_launcher_background.xml b/Project/Sprint0.5/app/src/main/res/drawable/ic_launcher_background.xml similarity index 100% rename from Project/Sprint0.5-main/app/src/main/res/drawable/ic_launcher_background.xml rename to Project/Sprint0.5/app/src/main/res/drawable/ic_launcher_background.xml diff --git a/Project/Sprint0.5-main/app/src/main/res/drawable/ic_launcher_foreground.xml b/Project/Sprint0.5/app/src/main/res/drawable/ic_launcher_foreground.xml similarity index 100% rename from Project/Sprint0.5-main/app/src/main/res/drawable/ic_launcher_foreground.xml rename to Project/Sprint0.5/app/src/main/res/drawable/ic_launcher_foreground.xml diff --git a/Project/Sprint0.5-main/app/src/main/res/layout/activity_main.xml b/Project/Sprint0.5/app/src/main/res/layout/activity_main.xml similarity index 100% rename from Project/Sprint0.5-main/app/src/main/res/layout/activity_main.xml rename to Project/Sprint0.5/app/src/main/res/layout/activity_main.xml diff --git a/Project/Sprint0.5-main/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/Project/Sprint0.5/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from Project/Sprint0.5-main/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml rename to Project/Sprint0.5/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/Project/Sprint0.5-main/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/Project/Sprint0.5/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 100% rename from Project/Sprint0.5-main/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml rename to Project/Sprint0.5/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/Project/Sprint0.5-main/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/Project/Sprint0.5/app/src/main/res/mipmap-hdpi/ic_launcher.webp similarity index 100% rename from Project/Sprint0.5-main/app/src/main/res/mipmap-hdpi/ic_launcher.webp rename to Project/Sprint0.5/app/src/main/res/mipmap-hdpi/ic_launcher.webp diff --git a/Project/Sprint0.5-main/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/Project/Sprint0.5/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp similarity index 100% rename from Project/Sprint0.5-main/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp rename to Project/Sprint0.5/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp diff --git a/Project/Sprint0.5-main/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/Project/Sprint0.5/app/src/main/res/mipmap-mdpi/ic_launcher.webp similarity index 100% rename from Project/Sprint0.5-main/app/src/main/res/mipmap-mdpi/ic_launcher.webp rename to Project/Sprint0.5/app/src/main/res/mipmap-mdpi/ic_launcher.webp diff --git a/Project/Sprint0.5-main/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/Project/Sprint0.5/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp similarity index 100% rename from Project/Sprint0.5-main/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp rename to Project/Sprint0.5/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp diff --git a/Project/Sprint0.5-main/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/Project/Sprint0.5/app/src/main/res/mipmap-xhdpi/ic_launcher.webp similarity index 100% rename from Project/Sprint0.5-main/app/src/main/res/mipmap-xhdpi/ic_launcher.webp rename to Project/Sprint0.5/app/src/main/res/mipmap-xhdpi/ic_launcher.webp diff --git a/Project/Sprint0.5-main/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/Project/Sprint0.5/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp similarity index 100% rename from Project/Sprint0.5-main/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp rename to Project/Sprint0.5/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp diff --git a/Project/Sprint0.5-main/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/Project/Sprint0.5/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp similarity index 100% rename from Project/Sprint0.5-main/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp rename to Project/Sprint0.5/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp diff --git a/Project/Sprint0.5-main/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/Project/Sprint0.5/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp similarity index 100% rename from Project/Sprint0.5-main/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp rename to Project/Sprint0.5/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp diff --git a/Project/Sprint0.5-main/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/Project/Sprint0.5/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp similarity index 100% rename from Project/Sprint0.5-main/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp rename to Project/Sprint0.5/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp diff --git a/Project/Sprint0.5-main/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/Project/Sprint0.5/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp similarity index 100% rename from Project/Sprint0.5-main/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp rename to Project/Sprint0.5/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp diff --git a/Project/Sprint0.5-main/app/src/main/res/values-night/themes.xml b/Project/Sprint0.5/app/src/main/res/values-night/themes.xml similarity index 100% rename from Project/Sprint0.5-main/app/src/main/res/values-night/themes.xml rename to Project/Sprint0.5/app/src/main/res/values-night/themes.xml diff --git a/Project/Sprint0.5-main/app/src/main/res/values/colors.xml b/Project/Sprint0.5/app/src/main/res/values/colors.xml similarity index 100% rename from Project/Sprint0.5-main/app/src/main/res/values/colors.xml rename to Project/Sprint0.5/app/src/main/res/values/colors.xml diff --git a/Project/Sprint0.5-main/app/src/main/res/values/strings.xml b/Project/Sprint0.5/app/src/main/res/values/strings.xml similarity index 100% rename from Project/Sprint0.5-main/app/src/main/res/values/strings.xml rename to Project/Sprint0.5/app/src/main/res/values/strings.xml diff --git a/Project/Sprint0.5-main/app/src/main/res/values/themes.xml b/Project/Sprint0.5/app/src/main/res/values/themes.xml similarity index 100% rename from Project/Sprint0.5-main/app/src/main/res/values/themes.xml rename to Project/Sprint0.5/app/src/main/res/values/themes.xml diff --git a/Project/Sprint0.5-main/app/src/main/res/xml/backup_rules.xml b/Project/Sprint0.5/app/src/main/res/xml/backup_rules.xml similarity index 100% rename from Project/Sprint0.5-main/app/src/main/res/xml/backup_rules.xml rename to Project/Sprint0.5/app/src/main/res/xml/backup_rules.xml diff --git a/Project/Sprint0.5-main/app/src/main/res/xml/data_extraction_rules.xml b/Project/Sprint0.5/app/src/main/res/xml/data_extraction_rules.xml similarity index 100% rename from Project/Sprint0.5-main/app/src/main/res/xml/data_extraction_rules.xml rename to Project/Sprint0.5/app/src/main/res/xml/data_extraction_rules.xml diff --git a/Project/Sprint0.5-main/app/src/test/java/com/example/sprintproject/ExampleUnitTest.java b/Project/Sprint0.5/app/src/test/java/com/example/sprintproject/ExampleUnitTest.java similarity index 100% rename from Project/Sprint0.5-main/app/src/test/java/com/example/sprintproject/ExampleUnitTest.java rename to Project/Sprint0.5/app/src/test/java/com/example/sprintproject/ExampleUnitTest.java diff --git a/Project/Sprint0.5-main/build.gradle b/Project/Sprint0.5/build.gradle similarity index 100% rename from Project/Sprint0.5-main/build.gradle rename to Project/Sprint0.5/build.gradle diff --git a/Project/Sprint0.5-main/gradle.properties b/Project/Sprint0.5/gradle.properties similarity index 100% rename from Project/Sprint0.5-main/gradle.properties rename to Project/Sprint0.5/gradle.properties diff --git a/Project/Sprint0.5-main/gradle/wrapper/gradle-wrapper.properties b/Project/Sprint0.5/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from Project/Sprint0.5-main/gradle/wrapper/gradle-wrapper.properties rename to Project/Sprint0.5/gradle/wrapper/gradle-wrapper.properties diff --git a/Project/Sprint0.5-main/gradlew b/Project/Sprint0.5/gradlew similarity index 100% rename from Project/Sprint0.5-main/gradlew rename to Project/Sprint0.5/gradlew diff --git a/Project/Sprint0.5-main/gradlew.bat b/Project/Sprint0.5/gradlew.bat similarity index 100% rename from Project/Sprint0.5-main/gradlew.bat rename to Project/Sprint0.5/gradlew.bat diff --git a/Project/Sprint0.5-main/settings.gradle b/Project/Sprint0.5/settings.gradle similarity index 100% rename from Project/Sprint0.5-main/settings.gradle rename to Project/Sprint0.5/settings.gradle diff --git a/Project/Sprint2/.gitignore b/Project/Sprint2/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/Project/Sprint2/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/Project/Sprint2/app/.gitignore b/Project/Sprint2/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/Project/Sprint2/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/Project/Sprint2/app/build.gradle b/Project/Sprint2/app/build.gradle new file mode 100644 index 0000000..016626e --- /dev/null +++ b/Project/Sprint2/app/build.gradle @@ -0,0 +1,49 @@ +plugins { + alias(libs.plugins.android.application) + id 'com.google.gms.google-services' +} + +android { + namespace 'com.example.sprint1' + compileSdk 34 + + defaultConfig { + applicationId "com.example.sprint1" + minSdk 24 + targetSdk 34 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + buildFeatures { + viewBinding true + } +} + +dependencies { + + implementation libs.appcompat + implementation libs.material + implementation libs.constraintlayout + implementation libs.navigation.fragment + implementation libs.navigation.ui + implementation libs.firebase.database + testImplementation libs.junit + androidTestImplementation libs.ext.junit + androidTestImplementation libs.espresso.core + + implementation platform('com.google.firebase:firebase-bom:33.4.0') + implementation 'com.google.firebase:firebase-analytics' +} \ No newline at end of file diff --git a/Project/Sprint2/app/google-services.json b/Project/Sprint2/app/google-services.json new file mode 100644 index 0000000..fd51155 --- /dev/null +++ b/Project/Sprint2/app/google-services.json @@ -0,0 +1,29 @@ +{ + "project_info": { + "project_number": "170259388946", + "project_id": "group24-travel-system", + "storage_bucket": "group24-travel-system.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:170259388946:android:db2b1cb6050b9e63dfd6cb", + "android_client_info": { + "package_name": "com.example.sprint1" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyCUx-TeFZoyINc01ZJlppWFDgCXjRlpnOE" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/Project/Sprint2/app/proguard-rules.pro b/Project/Sprint2/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/Project/Sprint2/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/Project/Sprint2/app/src/androidTest/java/com/example/sprint1/ExampleInstrumentedTest.java b/Project/Sprint2/app/src/androidTest/java/com/example/sprint1/ExampleInstrumentedTest.java new file mode 100644 index 0000000..56faba6 --- /dev/null +++ b/Project/Sprint2/app/src/androidTest/java/com/example/sprint1/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.example.sprint1; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.example.sprint1", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/Project/Sprint2/app/src/main/AndroidManifest.xml b/Project/Sprint2/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..dfa15ed --- /dev/null +++ b/Project/Sprint2/app/src/main/AndroidManifest.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Project/Sprint2/app/src/main/java/com/example/sprint1/model/User.java b/Project/Sprint2/app/src/main/java/com/example/sprint1/model/User.java new file mode 100644 index 0000000..dd9a0d9 --- /dev/null +++ b/Project/Sprint2/app/src/main/java/com/example/sprint1/model/User.java @@ -0,0 +1,20 @@ +package com.example.sprint1.model; + + +public class User { + private final String username; + private final String password; + + public User(String username, String password) { + this.username = username; + this.password = password; + } + + public String getUsername() { + return this.username; + } + + public String getPassword() { + return this.password; + } +} diff --git a/Project/Sprint2/app/src/main/java/com/example/sprint1/model/Users.java b/Project/Sprint2/app/src/main/java/com/example/sprint1/model/Users.java new file mode 100644 index 0000000..dc8e154 --- /dev/null +++ b/Project/Sprint2/app/src/main/java/com/example/sprint1/model/Users.java @@ -0,0 +1,32 @@ +package com.example.sprint1.model; +import java.util.HashMap; + + +public class Users { + private final HashMap users = new HashMap<>(); + + public User getUser(String username) { + return this.users.get(username); + } + + public void addUser(String username, String password) { + // note that username and password need to be check before call this function + this.users.put(username, new User(username, password)); + } + + public boolean checkUser(String username, String password) { + // note that username and password need to be check before call this function + if (!this.users.containsKey(username)) { + return false; + } + User user = this.users.get(username); + if (user == null) { + return false; + } + if (!user.getUsername().equals(username)) { + // can be delete in the future + return false; + } + return user.getPassword().equals(password); + } +} diff --git a/Project/Sprint2/app/src/main/java/com/example/sprint1/view/HomeAccommodations.java b/Project/Sprint2/app/src/main/java/com/example/sprint1/view/HomeAccommodations.java new file mode 100644 index 0000000..b0f4062 --- /dev/null +++ b/Project/Sprint2/app/src/main/java/com/example/sprint1/view/HomeAccommodations.java @@ -0,0 +1,53 @@ +package com.example.sprint1.view; + +import android.content.Intent; +import android.os.Bundle; +import android.widget.ImageButton; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; + +import com.example.sprint1.R; + +public class HomeAccommodations extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_home_accommodations); + EdgeToEdge.enable(this); + + ImageButton logButton = findViewById(R.id.view_acc_button_log); + ImageButton desButton = findViewById(R.id.view_acc_button_des); + ImageButton dinButton = findViewById(R.id.view_acc_button_din); + ImageButton traButton = findViewById(R.id.view_acc_button_tra); + + logButton.setOnClickListener(v -> { + Intent intent = new Intent( + HomeAccommodations.this, HomeLogistics.class + ); + startActivity(intent); + }); + + desButton.setOnClickListener(v -> { + Intent intent = new Intent( + HomeAccommodations.this, HomeDestination.class + ); + startActivity(intent); + }); + + dinButton.setOnClickListener(v -> { + Intent intent = new Intent( + HomeAccommodations.this, HomeDiningEstablishments.class + ); + startActivity(intent); + }); + + traButton.setOnClickListener(v -> { + Intent intent = new Intent( + HomeAccommodations.this, HomeTravelCommunity.class + ); + startActivity(intent); + }); + } +} \ No newline at end of file diff --git a/Project/Sprint2/app/src/main/java/com/example/sprint1/view/HomeDestination.java b/Project/Sprint2/app/src/main/java/com/example/sprint1/view/HomeDestination.java new file mode 100644 index 0000000..2b6bbe4 --- /dev/null +++ b/Project/Sprint2/app/src/main/java/com/example/sprint1/view/HomeDestination.java @@ -0,0 +1,74 @@ +package com.example.sprint1.view; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; + +import com.example.sprint1.R; + +public class HomeDestination extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_home_destination); + EdgeToEdge.enable(this); + + // Log Travel + + View button_LogTravel = findViewById(R.id.HomeDestination_LogTravel); + View view_LogTravel_Form = findViewById(R.id.HomeDestination_LogTravel_Form); + View button_LogTravel_Cancel = findViewById(R.id.HomeDestination_LogTravel_Cancel); + View button_LogTravel_Submit = findViewById(R.id.HomeDestination_LogTravel_Submit); + // show the form section after click LogTravel Bottom + // hide the form section after click LogTravel Bottom again + button_LogTravel.setOnClickListener(v -> { + if (view_LogTravel_Form.getVisibility() == View.VISIBLE) { + view_LogTravel_Form.setVisibility(View.GONE); + } else { + view_LogTravel_Form.setVisibility(View.VISIBLE); + } + }); + // hide the form section after click Cancel Bottom + button_LogTravel_Cancel.setOnClickListener(v -> {view_LogTravel_Form.setVisibility(View.GONE);}); + + // Calculate Vacation Time + + View button_Calculate = findViewById(R.id.HomeDestination_Calculate); + View view_Calculate_Form = findViewById(R.id.HomeDestination_Calculate_Form); + button_Calculate.setOnClickListener(v -> { + if (view_Calculate_Form.getVisibility() == View.VISIBLE) { + view_Calculate_Form.setVisibility(View.GONE); + } else { + view_Calculate_Form.setVisibility(View.VISIBLE); + } + }); + + + // Navigation Bar + + View logButton = findViewById(R.id.view_des_button_log); + View dinButton = findViewById(R.id.view_des_button_din); + View accButton = findViewById(R.id.view_des_button_acc); + View traButton = findViewById(R.id.view_des_button_tra); + logButton.setOnClickListener(v -> { + Intent intent = new Intent(HomeDestination.this, HomeLogistics.class); + startActivity(intent); + }); + dinButton.setOnClickListener(v -> { + Intent intent = new Intent(HomeDestination.this, HomeDiningEstablishments.class); + startActivity(intent); + }); + accButton.setOnClickListener(v -> { + Intent intent = new Intent(HomeDestination.this, HomeAccommodations.class); + startActivity(intent); + }); + traButton.setOnClickListener(v -> { + Intent intent = new Intent(HomeDestination.this, HomeTravelCommunity.class); + startActivity(intent); + }); + } +} \ No newline at end of file diff --git a/Project/Sprint2/app/src/main/java/com/example/sprint1/view/HomeDiningEstablishments.java b/Project/Sprint2/app/src/main/java/com/example/sprint1/view/HomeDiningEstablishments.java new file mode 100644 index 0000000..6bd0625 --- /dev/null +++ b/Project/Sprint2/app/src/main/java/com/example/sprint1/view/HomeDiningEstablishments.java @@ -0,0 +1,51 @@ +package com.example.sprint1.view; +import android.content.Intent; +import android.os.Bundle; +import android.widget.ImageButton; +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import com.example.sprint1.R; + + +public class HomeDiningEstablishments extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_home_dining_establishments); + EdgeToEdge.enable(this); + + ImageButton logButton = findViewById(R.id.view_din_button_log); + ImageButton desButton = findViewById(R.id.view_din_button_des); + ImageButton accButton = findViewById(R.id.view_din_button_acc); + ImageButton traButton = findViewById(R.id.view_din_button_tra); + + logButton.setOnClickListener(v -> { + Intent intent = new Intent( + HomeDiningEstablishments.this, HomeLogistics.class + ); + startActivity(intent); + }); + + desButton.setOnClickListener(v -> { + Intent intent = new Intent( + HomeDiningEstablishments.this, HomeDestination.class + ); + startActivity(intent); + }); + + accButton.setOnClickListener(v -> { + Intent intent = new Intent( + HomeDiningEstablishments.this, HomeAccommodations.class + ); + startActivity(intent); + }); + + traButton.setOnClickListener(v -> { + Intent intent = new Intent( + HomeDiningEstablishments.this, HomeTravelCommunity.class + ); + startActivity(intent); + }); + } +} \ No newline at end of file diff --git a/Project/Sprint2/app/src/main/java/com/example/sprint1/view/HomeLogistics.java b/Project/Sprint2/app/src/main/java/com/example/sprint1/view/HomeLogistics.java new file mode 100644 index 0000000..4fa9541 --- /dev/null +++ b/Project/Sprint2/app/src/main/java/com/example/sprint1/view/HomeLogistics.java @@ -0,0 +1,51 @@ +package com.example.sprint1.view; +import android.content.Intent; +import android.os.Bundle; +import android.widget.ImageButton; +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import com.example.sprint1.R; + + +public class HomeLogistics extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_home_logistics); + EdgeToEdge.enable(this); + + ImageButton desButton = findViewById(R.id.view_log_button_des); + ImageButton dinButton = findViewById(R.id.view_log_button_din); + ImageButton accButton = findViewById(R.id.view_log_button_acc); + ImageButton traButton = findViewById(R.id.view_log_button_tra); + + desButton.setOnClickListener(v -> { + Intent intent = new Intent( + HomeLogistics.this, HomeDestination.class + ); + startActivity(intent); + }); + + dinButton.setOnClickListener(v -> { + Intent intent = new Intent( + HomeLogistics.this, HomeDiningEstablishments.class + ); + startActivity(intent); + }); + + accButton.setOnClickListener(v -> { + Intent intent = new Intent( + HomeLogistics.this, HomeAccommodations.class + ); + startActivity(intent); + }); + + traButton.setOnClickListener(v -> { + Intent intent = new Intent( + HomeLogistics.this, HomeTravelCommunity.class + ); + startActivity(intent); + }); + } +} \ No newline at end of file diff --git a/Project/Sprint2/app/src/main/java/com/example/sprint1/view/HomeTravelCommunity.java b/Project/Sprint2/app/src/main/java/com/example/sprint1/view/HomeTravelCommunity.java new file mode 100644 index 0000000..537d3b3 --- /dev/null +++ b/Project/Sprint2/app/src/main/java/com/example/sprint1/view/HomeTravelCommunity.java @@ -0,0 +1,51 @@ +package com.example.sprint1.view; +import android.content.Intent; +import android.os.Bundle; +import android.widget.ImageButton; +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import com.example.sprint1.R; + + +public class HomeTravelCommunity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_home_travel_community); + EdgeToEdge.enable(this); + + ImageButton logButton = findViewById(R.id.view_tra_button_log); + ImageButton desButton = findViewById(R.id.view_tra_button_des); + ImageButton dinButton = findViewById(R.id.view_tra_button_din); + ImageButton accButton = findViewById(R.id.view_tra_button_acc); + + logButton.setOnClickListener(v -> { + Intent intent = new Intent( + HomeTravelCommunity.this, HomeLogistics.class + ); + startActivity(intent); + }); + + desButton.setOnClickListener(v -> { + Intent intent = new Intent( + HomeTravelCommunity.this, HomeDestination.class + ); + startActivity(intent); + }); + + dinButton.setOnClickListener(v -> { + Intent intent = new Intent( + HomeTravelCommunity.this, HomeDiningEstablishments.class + ); + startActivity(intent); + }); + + accButton.setOnClickListener(v -> { + Intent intent = new Intent( + HomeTravelCommunity.this, HomeAccommodations.class + ); + startActivity(intent); + }); + } +} \ No newline at end of file diff --git a/Project/Sprint2/app/src/main/java/com/example/sprint1/view/MainActivity.java b/Project/Sprint2/app/src/main/java/com/example/sprint1/view/MainActivity.java new file mode 100644 index 0000000..9fb9e64 --- /dev/null +++ b/Project/Sprint2/app/src/main/java/com/example/sprint1/view/MainActivity.java @@ -0,0 +1,22 @@ +package com.example.sprint1.view; +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import androidx.appcompat.app.AppCompatActivity; +import com.example.sprint1.R; + + +public class MainActivity extends AppCompatActivity { + private static final int DELAY_MILLIS = 1000; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main_activity); + new Handler().postDelayed(() -> { + Intent intent = new Intent(MainActivity.this, UserLogIn.class); + startActivity(intent); + finish(); + }, DELAY_MILLIS); + } +} \ No newline at end of file diff --git a/Project/Sprint2/app/src/main/java/com/example/sprint1/view/UserLogIn.java b/Project/Sprint2/app/src/main/java/com/example/sprint1/view/UserLogIn.java new file mode 100644 index 0000000..a0841d3 --- /dev/null +++ b/Project/Sprint2/app/src/main/java/com/example/sprint1/view/UserLogIn.java @@ -0,0 +1,53 @@ +package com.example.sprint1.view; +import android.content.Intent; +import android.os.Bundle; +import android.widget.Button; +import android.widget.EditText; +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import com.example.sprint1.R; +import com.example.sprint1.viewmodel.MainViewModel; + + +public class UserLogIn extends AppCompatActivity { + + private EditText username; + private EditText password; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_user_log_in); + //find button by id + Button logInButton = findViewById(R.id.btn_login); + Button createAccountButton = findViewById(R.id.btn_create_account); + Button quitButton = findViewById(R.id.quit); + + username = findViewById(R.id.text_username_input); + password = findViewById(R.id.text_password_input); + + MainViewModel mainViewModel = new MainViewModel(); + + logInButton.setOnClickListener(v -> { + boolean validLogIn = mainViewModel.userLogIn( + username.getText().toString().trim(), password.getText().toString().trim() + ); + + if (validLogIn) { + Intent intent = new Intent(UserLogIn.this, HomeLogistics.class); + //start the second activity + startActivity(intent); + } + }); + + createAccountButton.setOnClickListener(v -> { + //create an intent to go into the Logistic Screen + Intent intent = new Intent(UserLogIn.this, UserSignUp.class); + //start the second activity + startActivity(intent); + }); + //retrieve the intent that started this activity + quitButton.setOnClickListener(v -> finishAffinity()); + } +} \ No newline at end of file diff --git a/Project/Sprint2/app/src/main/java/com/example/sprint1/view/UserSignUp.java b/Project/Sprint2/app/src/main/java/com/example/sprint1/view/UserSignUp.java new file mode 100644 index 0000000..8984d48 --- /dev/null +++ b/Project/Sprint2/app/src/main/java/com/example/sprint1/view/UserSignUp.java @@ -0,0 +1,45 @@ +package com.example.sprint1.view; + +import android.content.Intent; +import android.os.Bundle; +import android.widget.Button; +import android.widget.EditText; + +import androidx.appcompat.app.AppCompatActivity; + +import com.example.sprint1.R; +import com.example.sprint1.viewmodel.MainViewModel; + + +public class UserSignUp extends AppCompatActivity { + private EditText username; + private EditText password; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_user_sign_up); + //find button by id + Button registerButton = findViewById(R.id.btn_create_account_register); + Button quitButton = findViewById(R.id.quit); + + username = findViewById(R.id.text_username_input); + password = findViewById(R.id.text_password_input); + + MainViewModel mainViewModel = new MainViewModel(); + + registerButton.setOnClickListener(v -> { + //create an intent to go into the Logistic Screen + boolean validSignUp = mainViewModel.userSignUp( + username.getText().toString().trim(), password.getText().toString().trim() + ); + + if (validSignUp) { + Intent intent = new Intent(UserSignUp.this, UserLogIn.class); + startActivity(intent); + } + }); + + quitButton.setOnClickListener(v -> finishAffinity()); + } +} \ No newline at end of file diff --git a/Project/Sprint2/app/src/main/java/com/example/sprint1/viewmodel/MainViewModel.java b/Project/Sprint2/app/src/main/java/com/example/sprint1/viewmodel/MainViewModel.java new file mode 100644 index 0000000..2d24ed1 --- /dev/null +++ b/Project/Sprint2/app/src/main/java/com/example/sprint1/viewmodel/MainViewModel.java @@ -0,0 +1,69 @@ +package com.example.sprint1.viewmodel; +import com.example.sprint1.model.Users; +import com.google.firebase.database.DataSnapshot; +import com.google.firebase.database.DatabaseError; +import com.google.firebase.database.DatabaseReference; +import com.google.firebase.database.FirebaseDatabase; +import com.google.firebase.database.ValueEventListener; +import androidx.lifecycle.ViewModel; +import androidx.annotation.NonNull; +import java.util.Map; +import java.util.HashMap; + + +public class MainViewModel extends ViewModel { + private final Users users = new Users(); + private final DatabaseReference databaseReference; + + public MainViewModel() { + // init Users users by data in firebase + databaseReference = FirebaseDatabase.getInstance().getReference(); + databaseReference.child("users").addListenerForSingleValueEvent(new ValueEventListener() { + @Override + public void onDataChange(@NonNull DataSnapshot dataSnapshot) { + if (dataSnapshot.exists()) { + for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) { + // get current user's username and password + String username = userSnapshot.child("username").getValue(String.class); + String password = userSnapshot.child("password").getValue(String.class); + // add user to Users users + users.addUser(username, password); + } + } + } + + @Override + public void onCancelled(@NonNull DatabaseError error) { } + }); + } + + public boolean userSignUp(String username, String password) { + // 1. input username and password invalid, return false + if (username == null || username.trim().isEmpty() + || password == null || password.trim().isEmpty()) { + return false; + } + // 2. check if username already exist + if (this.users.getUser(username) != null) { + return false; + } + // 2. update Users users + this.users.addUser(username, password); + // 3. update DatabaseReference databaseReference + Map user = new HashMap<>(); + user.put("username", username); + user.put("password", password); + databaseReference.child("users").child(username).setValue(user); + return true; // means user sign up success + } + + public boolean userLogIn(String username, String password) { + // 1. check input username and password + if (username == null || username.trim().isEmpty() + || password == null || password.trim().isEmpty()) { + return false; + } + // 2. check if username and password valid + return this.users.checkUser(username, password); + } +} diff --git a/Project/Sprint2/app/src/main/res/drawable/accomodations.png b/Project/Sprint2/app/src/main/res/drawable/accomodations.png new file mode 100644 index 0000000000000000000000000000000000000000..091313da978a739d54e016b298d3051095faaa91 GIT binary patch literal 1020 zcmVPx&wn;=mRCr$PnoVdEQ4q)fliGuN5kc_lpioi7gPy8*(SrvOdJu}mk8YEV?Wz|m zq8GvTBB-dKNM34Q%tniPRZvht4=N}HMHIwdJos@D4;2x#$>`Rk>~1%4SJS1td3y?P zhxgw6=0CIZc0*|Li<;bjC;&6Qf)e}F)*GnFhanqS@iRcl=4fxg+fn( zX$Ii-brg(2GcSf~L5MqmKYkO2&79cn1>wH{XsLZ2AYKJv1%Ng%ULt`vOf*`&l)3M< zV8{xX+yXI@g}f-Z_w-KyI{W))&l&rE9zeR5v>3=2rO@5?YXE3aufg*GT3c&RrIzyI zt3yMd?Dqo$=uY)*AfhKeE7)gKiUsaw%UuMSF<8ut0iSc$HPiL|ZR1or0H%X(L$9C& z2B7K2Hvn@2Y_?!Zk*wN#DWH)6s_S&8_wOJsU!MXY(Xz65>Ehe!cpw0pZd?P<6~Ork zQwHrV%1qAs9Tos>|0$<&}+w@8E4GAI2;&&rW+dpJaPh{Tc*r(*vI~WY8e4| zv7^|Ou)I(Z@4{3-MFs2%+Cx){&4B^*q>LUWTz1mrw3*LJw<^3+g^9b0x$KR|0?_on z!vLLjM3s13A(y>91wgv*oJSQtWJ+-^vH-eM`?eCX!`WKZThooZ0Jhk{FwkC<;#p(? zOgvvv9(C1#kL7Y{`<2T>Ppjiv%Gd?MRkxifGfToQf(@+!mC39kXca^Eb(0y-iLe?# zr^o$MrW8jb46+zqiP+G z=YIX(zHI5jM*{-`J;r1rTBK?Mb6U5ypHTpW%WjAnKpTHQi{;E3q)5 zH63dx07?NW1yl`i)fV*>sM!a^@o#c}^C{MUf%EfNRRH`@inEPUK%ArN$2X+_Ka}EZ qqZAP5==$+ZDZmeU<&edaSW-5 zdwV;!sL4R0_2Gt1ue{#$#O>(56sZM-0dt+Nq|t}ob!e=wwu58`KeK9@l)~A zsgJ6hAwi}``5X*c7??D;I-aTsI0QQAs5dfnF(p}YvIK|-oc2^`Skw^V$HXYYdZb7w zgLlWxce5{8o?otfgK-8USHou|&IdN@4_;*0CzX)HA$Z#|EG~TN@2~8&^|JiQ?BDC> z$1=@lsYneAeOIid((rM|&ycDUzv7e_WnQjN&NN}Ix&Jo&+|JO;JIw#@-McOFu{U4r zk859y?A9fFnlOGT@O^Aom9g=+)h*p3mOWcm+s*HL9k4j%!1ufVEBr}#_T2AZ&!IXxZT~({W#QIkJVtu%UMX_N0J0(tCcj9c)s+S&*~K4I^o+}v&dsVgd>+2e94LQVTwL-)7sGco{xcV z0{cXxg*t`StFzZfioetU&UGW;Z~i-HhToZA?A^D0dA*T8gTe~DWM4f$chuQ literal 0 HcmV?d00001 diff --git a/Project/Sprint2/app/src/main/res/drawable/destination.png b/Project/Sprint2/app/src/main/res/drawable/destination.png new file mode 100644 index 0000000000000000000000000000000000000000..0abb6910d85ff902969bd306ac0f7aa06695b972 GIT binary patch literal 2269 zcmV<32qO21P)Px-mq|oHRCr$PTMvvJRT=+%Z?6K4e-bI6tu_=;OZ<}Ug`6IPTQ8W;h-p=04 zba!@3P%MAMns^wATB;bNyYH?$yF0sx#*1QGv4V*857?r_h<_+rpb9m_UK2IgUg_<8 zcJB7h+u51f+nL!G(tF9}+L`x#-|zd)_rCYu_udgs@J1)N|Ck|QCIU`y24;r9u?~P< zU0;wu;#}BtIzXq5+void{Leb-Pu7aXXOAVOV-f+1o=r3JMFcDXaAq3^_cHJ(5&hgM z76!XbMpp@N90zk6z2uLQ4dFVlv2$zI(yh)514`UR`YE|xwL*G;# zu@jKgj74DVAi^nef@Q`b5SCX>`BqE{GNanC<5z39+cMIscouNQjL9Ma^9fvLEmT#<)wc*jO&-p9=!t*Oz;J5nRC!&p&qTJC5;FNAGXXYCL`jD3#L0nle^V>Sn z>8&TK1^|kdeE{IgTU0UYR%yVDVnR_f8imEUbv4du;ecRglt*UIwb&aDGCk z9|;5`E2gYP@gXt+ie~Hru*e1C7R!_yq5yNtDw=UKfUmlqKW3S7aTGg|2uSI8vjRkdKJr*eSSdF>GbOk*TuhrfbtQ%DQL~FXhs=8 zswwY8$OEAXQ1omcm`k0Ee?>E#Ebe6Uptiv>bj=hhv5c2vGM7TI; z$*X9_cL7}82I!Dw%4>WH7+WI4$pe#ZI=RD7U-$^{`V!!^6>}gT5WZg~!e;|>0OKpw zlDyS7ipGm91D!-(kiGB(czp>VUp3`gKZClipK*kHUI+ptY<_#tbf~DtMiACDC&A#z z>ka`a<4jJ#UBGNR4JP&MyNKD@%AVl{#*F@IN!}I&Skbau0bbQaKphJz6}k7A<^ac- zq8aQmy5BP8>Ft21s`{Ebz3TG-zjeGX{e_R zCA!Wk7B+>^*)ojcP%@z-r5P0l6c3#{EmL05i7iDnt_7iGdLzK9n6jxJ(23rz641y8 z&au^dqa?+~xIf_G*l#UUo)^X8t`l%|F8Au$hizy2YpNBF8>WqxS-2_4f!=g_zNm}8 zdGr}Mc#=46D4&1vWlewsu2(bOA%H*l04-Ri%z3@*?K4&gfggLlvw?TkO!>z+oge!o zaVwnA*VmU@Vhh`u8Cn}r_29pU*9;8}y)^MMsbxMzAkV6fu*K4HIsa%kuy&0A2W(2u zp3ls`_T&KAQcu{|Lx_>Y5qyz>j5k+wL8VyO*$wBr8Ud4$pc|Li49}7^fp&p-5PsJ<@O@{Xx;|j9T(NQ)Ftg3F7Kb+K|Wp80 z|7DC0n2Ch|pOf1b5>~6(wRD#YAEy5w7sL zYxsy|%4Nr!0B6-VrwIg+w2Fn+O^gevQ%i6jO=nNv;@)bp@I)9p ztJCQ>icygfL?3Y93>nkMJZO~$JQq;YwHG-8dez)ALAG;G;G_Vf{{gTMjC~+HKlX3J zK4S4aP=^hg3&uPW&TpOzU>*SHck|F{HgMQxaapaDKfXzDEDAirbGlz3bU#AQD#}7= z`G#QR2$%qn(u|Mu_}Txvqk?K9|2qOUR80AuIPAnmfCDC-PR|}06%GmSCmQ?PfY=%{ zoZaA0PVTWc3=R$+j7xE>1WW~`X}NRi%qy9AB>?9qOxsRO+Y?0FO*6kIjDmJDT_eD4 z*tr>Y%4p)$I`JGZol3-WxRK-t7-ptn5Fbb|4Ik>MANcm*;BY(ealAif1jGTh8#-nP r=mx8=B%L!6@Jjkx-N1UnN5KC8jwL>BAOh3+00000NkvXXu0mjf{CYqS literal 0 HcmV?d00001 diff --git a/Project/Sprint2/app/src/main/res/drawable/destination_fill.png b/Project/Sprint2/app/src/main/res/drawable/destination_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..4bdf65818e385a5c3d1d54e1ace2b40254894a81 GIT binary patch literal 1057 zcmV++1m63JP)Px&+et)0RCr$PoLy2YArOUUR(5qITBQ%!g}RG8XqB$SxUy)cAQ#7B_~~;Rk|Hmf z1cvZ&nr<3q=4rfC1ZGw3QF$5wl_D4b2S6nOW%Z%J0Z>UmS$!z*S^(ZZ?rx+n$K&)A z^y&23G))Kp**s5Q^8WpGfBsC#Kvlh|0tH$C%)`p=&^%8s@2~sk>I5GBWeL&*;Qiz7dEp$c1|l6`3wVLYraKub zz?Sf=AkqN#0M7y<4dC6w?ns~L3L5x$+f({VxoA)73m6|h-uAZz%(IHZ0d@-S1mkBJ zc#B>F!T~Y^`Z2p4-M4E9eom9P&C1dJZaDbO!#z^yJ0aS-GIU`?F z2CY5{z@E(*tv(7sxhN>utr1zY4nuu3fIZHI4E0d~_GHQ|^-%#j6*hM$On7vFJ*bdn zx_+{Su0+;m@RktS>Z2>r18w1zE#R2}w4M*G;F$t6ga}O*q=HfU9Ju@eLsrU8ttKoAgP*NCZ^85dFjrWB=t zSPJjFW+mO6O#zs*y;%b>=4o^1QAU^p2bfZyQ$*5pE}(3dFE~RD547O`6KW{xfDDEJ zFF8e!7{H?Tb38T!;OaR+%RqN4g@!g`2Eb?*n&}NQQ)d^Uz+@U9{gjQ|!$*t(ge$Nn z1MPu&2jk|wUk}#t59V=YWG(&A|DQ8gNg1^H(y}p`o;bJPka7(5(Ez$+K{q!Zvfxnx zdWiDZ`jIDrWRvlxR^ISAaP0^Ac+L8g}KngUGyxJ&qc0920B05||D2`H-%1rC5p0?O(`fdinD bfU^2GU6ey_qSHa900000NkvXXu0mjfbpFv5 literal 0 HcmV?d00001 diff --git a/Project/Sprint2/app/src/main/res/drawable/dining.png b/Project/Sprint2/app/src/main/res/drawable/dining.png new file mode 100644 index 0000000000000000000000000000000000000000..ca401188855a4790691186a2b80bd545e4fe4231 GIT binary patch literal 1015 zcmVPx&u}MThRCr$Pn_FwtP!PxelhRM12x1Wh!AA@FqA1u`ub?PYY!f%z?P*24>!bD2 zyCQAV?Pg6{v0zcqs;?FleNoUyK~O{yL_a}kMo#O>vfW(VZcKK27Ro|*GH2#@X6DRE zatKTOLrdI$C;%z~mN)^G0#O2>E8DvR9<3r^RTTN8Wf=GdjlYc-MxKS)5*h)zDc%6s z7^WztzrS^DYg3SIfdF(<+y`(VrOrh)Ytpr?gMPxk0J?j`F7hxHb(A#Av4-7aqt=sZ zHu?fE%-((m4W`+#sJ0RKsAG=|{S$!hj2Ixoh4PDt&=GaeB;}a#ynK9STpTM}19bu5 z6s+kaoeLY=$cpU>fQkT>0{_1T7#U$O;SK{sW43iv=BjRrSMuAntu6Aq+Z2NY^b_NV zQ?wkvd^XI!10Hxc0o$Yu11~htlw%K1rnUx@ts2v=ZFQ6vBe{CW;;EZL&WtQlzExQ| z&tTbrE%*@VU>JnNieNneWHP-QW{KVf&2kHKd$Bn3-Zy%ZS_SF>KsUv804GDj{Dx~= zrY3x(TXtI0KN3h0@>Js^G*R^;Y>XWHu)haWc;0K*g+ z2J9#R2rwPnDmE1W-4y2lT#5n!z?PI353<^Oe4d;+j0Bnm#e zwzW2OeSnee-^c7dh!Vm?+J2`n^srLaFvU#}<_tXK91_f%xPiYC=rw^R!*+8eJ>~Z#gLaP#(kQ9T zP^BTYI-mgjAy6y8#8Y6gGq~966#!KOQu17&)*MzTpo-u;fm$O-6+u-5RS`_b)8Sfk zSgitT6;P{yS_Ye<4~TMaFb2VRXH9*5y6Hu8io> z2>E&&mxMl#ksB{sqt(XteOFkX5zv^PCSh>B$MlGI`kfsJdtJVf&kB?{2A&y+a$us7 z&kO{f6_A8N0nBw}Jz|&U@oJB0MZLo_4t*N&4^N{nVUN)w1Bk=OwCIc!0ckNd4m%Wp lIH)#~P89)-G+S}l`Ww-gvVFOjBEtXx002ovPDHLkV1m2szVZM7 literal 0 HcmV?d00001 diff --git a/Project/Sprint2/app/src/main/res/drawable/dinning_fill.png b/Project/Sprint2/app/src/main/res/drawable/dinning_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..930d6690229417a853a44cb18fa86f5e7d5a6271 GIT binary patch literal 761 zcmVPx%vq?ljRCr$PoI#SpAP_~#$wp7&ROuqO7`;UnTBRo$=VXp(QiU<08$S^w-_0zB z4)n`!=msj4;SVBELDn=j1PF?N00|Hz0Gd;Q1PBrU&8fh50{q_8i_69Q7-JS-zqy*9 ztIGTx_sv#2K(zu_>-x7~a1Xqy%IvfdRRF&?^|n=>_QjOY?tD5lOUV%t;7sA&xLw0} zdE7T=A4C!0oI-a1l&C@tz>6f~lK+1?G+ssoD7<|F1jB;>2@oUznp1%U2oeCzlPa() ziTcU7O;D|0Ze2arR`B1}t~=YtCcL&E=eZ!dyLnQ8Zs)6Yeak1^I@3+khuV5808hOd zvwF%JpzCM|Kuxh93u18qHSjv+#wbH)4Y1w6wA*km|B3@BIn*bGs!-~0(pp$rL_+7l zknrt5qH`eu-j5+(4&%}QiW{8$5Ju<0q5w+HjI9)14*JSUBK7&UIWT1KV-8Es5MWDS z44~$WqSz3Qp+EvuQjDxX=tx$YHa=<&ydLa}r(^?(G;}DI6yOvg7xGLrg-O1hHBsfD zRv}u2BnQ~;|EZH-tztAUCI-AL0BRv>;dOJI4`M8M*#PWzqV3=Qttarx+*3HCyD$Ak zDCr_Hl(qB+gp^rB3PGPofbH3fGUXJTQGp^Ne**#}z%Yey4h&RG>_v%-2p5qs2~vTe zVhE4`(}o-sNCi@XUIJ4mrs(q-!VF=CFhkfwfV(ka0rJ$E011%WS)c~enr9cnX>o-2 zPJrRe9xMou06_wvITc8NAOX-kh5~2v#i9Y$;#E5FhHB`oDe#47Wv;nKCjzt{#lG>B z6{V5EXy92>6+qiC=AF9_04RoT=Ytxc1M#ciuejYlAs~G(%N0NnzzpBm00000NkvXXu0mjfMXE$T literal 0 HcmV?d00001 diff --git a/Project/Sprint2/app/src/main/res/drawable/ic_launcher_background.xml b/Project/Sprint2/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/Project/Sprint2/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Project/Sprint2/app/src/main/res/drawable/ic_launcher_foreground.xml b/Project/Sprint2/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/Project/Sprint2/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Project/Sprint2/app/src/main/res/drawable/logistic.png b/Project/Sprint2/app/src/main/res/drawable/logistic.png new file mode 100644 index 0000000000000000000000000000000000000000..a23118ba9e411e4ebcd64b44087630a51ede9dbd GIT binary patch literal 709 zcmV;$0y_PPP)Px%e@R3^RCr$PnoDxRFbsyBlNC+^GqA`lN^g+`%)m*So-9S3m?p+AIg)T2u>>c! zKK+tqnZ~UA)2!TnqX1L^D<_~KuyO%t64VgT5Lh_@4S`n*V1H~k*K^muat-1N*dN=| zFqk)E%*HXiZyNJ;J$ENbAYuT(+rwbqJ%&Ho+cf4w3WNxN(d%G*_D2c=JAe}7EhPyE z>;QI$b_lqAn*7{+@Ob2&7q*;T^nwf zj%}T6FZLOe6Vtmx3jk&z!5Ide0ARnLW&Ruh0dQ=2KpH^OkW%F!L;p9)mOhwzuGEvh zWSFCz)Otd{b1DETKR2NzGkO3(QaRNDfCUxo0#A7Z-t#AS0a!Ri9l$AnSR-2qSV{V} zHTM)4J0Nj-Uj#s?xXFoGZtsf#h=oE7f`sv60IZ>zCqrnAKtDjFQ^cMFTrUFz_|EAH z{d9xwxuBOa{Bh*YiN*gsMqB~4!BhZJ9)a!9?)PK-&!!%8fc;J^7qBT{(gg;if-SFv z18j0MTwP*P07OOynQ+twBmgiye~OT!1hE)EMy*d_v-ceoAQk~Y82_m1Y{3H-*`jBf zASXpqZth6-7@{S2se3YvCn;$sm1FE?sTe|$0unVniQzuSq~Xg9`E~;Mac~k6#%pW91kdf zf~#~@09J}iy1dxAu;WES02VctuGsalk1y#bqCZZBR?DGCRX00000NkvXXu0mjfh_EF% literal 0 HcmV?d00001 diff --git a/Project/Sprint2/app/src/main/res/drawable/logistic_fill.png b/Project/Sprint2/app/src/main/res/drawable/logistic_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..339bfbfb4bf05dc0f58c841273f4570f37be56e6 GIT binary patch literal 706 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)jKx9jP7LeL$-HD>V5;$SaSW-5 zdwVN3ugO7#^}*>=tF$k=$lq{%t5>nYGuHFvsf^=1#{>*~&i!Sq`gLu}>T}O`o|!V! z>jyJuNPuZ~YeNDDhlfJ|gHAdVCkI!@ zr*`j+oxS(i^uS+IiVae0tz|Mow0ARSZF|SDs9M{d;auE0k?p|;_7-F}ynF3j?(p@Hmo z(3umlDEPb0lL?U(r)=`G@68YL&&j@LK4FpE{r=i_u8dl(H@~KGa1;rHgGp}Qfqyn< zPHgOZIPLjk7N>eYwYh#B^8)TL&c9asa(DP`@pCKQEzoQD`zd9E3FGYaU3ZG-W^i%* znZB@Tw!-IK7vFfy;Y={O6L4QBNVFicKzPEc@1CX(XO9PK{r&yO)#Uv|t%mGF)wddg zEZr9~W$eA4J=LSvRz%`LQvG4BoHz42=51|b>@`2NR`=m%6RCz}?xt&4FPf<-R7i9- zupF5+N4MuECnHis+t@TdcphJCxrZ-iFM|aGlaPQ2!|9n0OifG)mcj(m#i#gFA^Zsw Ts#!Jy6D5PEtDnm{r-UW|1xzgo literal 0 HcmV?d00001 diff --git a/Project/Sprint2/app/src/main/res/drawable/setting_fill.png b/Project/Sprint2/app/src/main/res/drawable/setting_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..f150dd20602fd229282bc52f72c0787da4c130b4 GIT binary patch literal 1058 zcmV+-1l{|IP)Px&+(|@1RCr$PoJ(@sFc3t+lf^!XU1cwHi#WH?!mhGU66Iuyzye$hO$#&KgO8Ze zRs=bC==p(=rr;lnz(kGq!NCENB5;5XkR(73cLh2?k^ni}6}Sh0kI#pf^Ev#~%w?Lw zulLvEi)KuXYll$a!_(n+2;ojS!PCdv@m@K`{PIx%o{^b-ydAsS-`#)+?&0a+01*Yn zF^|uOyYo3j7gm3!Dcrxm9#86lh6B1Q5J@0;{v#xkn+AAEJlzvXcYtX8ODc4LB*4%+ z6L(c06aPkugA~A+L6Iz&GH>iWw8itc`4dSf(T;dSWDcJT$Yk_|`<*T&#h+4ZWudr| zy(N$tT526SE>N+U409P z;$0pw!2dyg3x^gb6cNCN@aDa}So*}BmfRtvI&Lm{Ta`r8gdzgiqHHO35X*4iVnL<$ zhyX_8D?*ILc6`I8+F7pAPgir{d}HgCm#*@)(x$ac})Sa>_xw`?7v!a|N;nm!N7lJXm`iAbG;8IY2h+6}l32 zRWO1ARfi)7OCt2i1`7qM0Md!(uYSb@N5e}=CbZrsZr2q0rD z^4_6Tx`3YW&u!5~RRgqumn^5d0HTH4ToVMM3ZNmpc>;*R8{LQcHzwBKtF!MXRqzftni0u0b zfem??6y6-ir88)#La9mBuG93#Vt~=wMzNQgCjQFEzwpe06+bd5%R5WqdV zvQ~W%z#S(Ps54T8=guNtvpg`=I01c8Q+od9iG9R%vzTCj zD-~`+tKGMv9nBi1HgPPU3j<7L4fIo~3TlM<={yJR(K<7LZ24gUl5s!QemDzTJlLwP zWZchU9+V4P7{G3mIY8_`W9GH%?Y={}FcSwIp#SZOMHKWu-k~WXFT~?Rdnb?~Vj!_O z0X6^hYOik4y^KlSfcn+s2nl2u1zM}3<^6_GV9N-_5BngniU4ageBtQ;# c1(E>&0^NmcZ$U4lyZ`_I07*qoM6N<$g1+kBfdBvi literal 0 HcmV?d00001 diff --git a/Project/Sprint2/app/src/main/res/drawable/travelcommunity.png b/Project/Sprint2/app/src/main/res/drawable/travelcommunity.png new file mode 100644 index 0000000000000000000000000000000000000000..4a1025115f6478ca1c49a7a92cf1d8cbcaa0c372 GIT binary patch literal 834 zcmV-I1HJr-P)Px%{7FPXRCr$Pn?G#RKorKmXC{~!*fKF8l?AC25)!ahNU#(kA>tM{iq$O}8)d2x z5-=2EsycE4DpI?FIyWm4D|@Nbfr^QN0f-;6+M+c0Z~W@GzRQxqci(&O=XZDS&Ne~u zA1NL`Gyt6eiWAU7AWZ^1SZL0`ry2pZH0>qZ7{vPw<7?M#Z%OJNX(eWWY1y9vOrM1D zjGBEgz36t@A2RlfZ5|82wCoK4vyujLYJKD1nC|tQy_`D#x<>-2H|$&FhXfF}r@vtEx+>|n$R)-neBW?R#*Aeq0 zGXQVR>8EvGqMd2ktN|P+pff-Z0X+xkNl>o>5-UugQHf=+eo(VqAF6Nnz_jb188~lO zS9jxJRSCecqU|u~?_jdxHc(Xu5O9dC8&m)QFx`&I0wn+t`z^1t`Z8=TPyzrmp7c7- zk_He$KxaVI8hN<3{&yZw#_e#JufuWaA)w~~;Yo0QzBx4@5<8cREmcR3<-!V^LWcki zc;7dS4S+98ZAdcew7ageINYaD0L-*9!Qg}4o8`GqXCeRq`ZCGj8CdVR&i&DhDJ%mr zrm9$T0)6rcE4{V$yD-s70@x(NYq3bfg#KX1^PHVH8}$WynHZ5zi^S@H5hp~S(By$= zTK0PY_o6gT0zhekpKCO(uy1SwbiOD6r3rqv)jE6b$Io?u?!;w~WCoNX__}S^_?K~! zXs}G6Ye~aL3P57;rey~YGH)a~RP=QT0Exi|K~)t%s^F^%U@FVY2zATeB4DQI6i>1@ z_7I3VM~gCOTK01Qtt5wvzCIR!ahxpcdqsr-2%sg^<>P?O+owF zGru2@r5GuD+n`ud8bI6)O8jQ1>~}Y>e;Pnuf~UQ|&VbW?2lM*>7sNzXUk{P4$N&HU M07*qoM6N<$g7V>O!2kdN literal 0 HcmV?d00001 diff --git a/Project/Sprint2/app/src/main/res/drawable/travelcommunity_fill.png b/Project/Sprint2/app/src/main/res/drawable/travelcommunity_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..9a1a6f9826220b40956065d1d36920716f24b3ea GIT binary patch literal 658 zcmV;D0&V??P)Px%Oi4sRRCr$P+d*!^Fc5`d=VXPGfCP)&qVyJ7fCMKgJsGVlkSL8kc3wBoIJRKrAPL&jeg=`^DwrUY&Cb@qJ5`pS#X| z9QVVn)EhjGo1DParhl&(?#FR;oqKy0ViMqb+wZQ)d)A4a<9*Jj!?2uVpx78DV54~7 z$NY6UFOU1-ToTa)Z0XV+fhwND6u?W#Ggx};(_t`=QTYt!;Hym!U_=-|C4PRMwdzS= zTnIobLB`(!1TZeZU06&AfB=dDVmS!}P!tf$LkSG5Z?pS}|8^M@`+|_uPXsWW@T5)- zfU!nFLO&6}_#A7d5J2N5Wi5jM1aR7S;nX%A2@JIK0Zd$AXD+0FjYRSy*fQRq1LokRPS! + + + + + + + + + + + + + + + + + + diff --git a/Project/Sprint2/app/src/main/res/layout/activity_home_destination.xml b/Project/Sprint2/app/src/main/res/layout/activity_home_destination.xml new file mode 100644 index 0000000..20c417c --- /dev/null +++ b/Project/Sprint2/app/src/main/res/layout/activity_home_destination.xml @@ -0,0 +1,215 @@ + + + + + + + + + +