From ae96001488717ababcfdd12888a94d0cef59d566 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=B5=9C=EC=A7=80=EC=B2=A0?= Date: Wed, 17 Dec 2025 14:39:53 +0900 Subject: [PATCH] dashboard modify --- apps/cm/.env.local | 3 +- apps/cm/public/images/icon_loginID.png | Bin 0 -> 70081 bytes apps/cm/src/entities/post/api/post-service.ts | 2 +- .../pages/dashboard/api/schedule-service.ts | 66 +++++++++++++++++ .../dashboard/model/dashboard-interface.ts | 32 -------- .../pages/dashboard/model/table-columns.tsx | 26 +++++-- .../cm/src/pages/dashboard/ui/banner-list.tsx | 4 +- .../src/pages/dashboard/ui/dashboard-page.tsx | 22 ++---- .../cm/src/pages/dashboard/ui/mypost-list.tsx | 47 ++++++++++++ .../src/pages/dashboard/ui/schedule-list.tsx | 70 ++++++++++++++++++ apps/cm/src/shared/config/api.ts | 4 + 11 files changed, 217 insertions(+), 59 deletions(-) create mode 100644 apps/cm/public/images/icon_loginID.png create mode 100644 apps/cm/src/pages/dashboard/api/schedule-service.ts delete mode 100644 apps/cm/src/pages/dashboard/model/dashboard-interface.ts create mode 100644 apps/cm/src/pages/dashboard/ui/mypost-list.tsx create mode 100644 apps/cm/src/pages/dashboard/ui/schedule-list.tsx diff --git a/apps/cm/.env.local b/apps/cm/.env.local index 59eac2cc7..da20c3611 100644 --- a/apps/cm/.env.local +++ b/apps/cm/.env.local @@ -3,7 +3,8 @@ NEXT_PUBLIC_PORT=3000 NEXT_PUBLIC_PROXY_HOST=http://localhost:3000 NEXT_PUBLIC_SITE_ID=CM NEXT_PUBLIC_SUB_DOMAIN=http://localhost:13000 -NEXT_PUBLIC_SERVER_API_URL=http://dev.onasys.co.kr:8000 +NEXT_PUBLIC_SERVER_API_URL=http://localhost:8000 +//NEXT_PUBLIC_SERVER_API_URL=http://dev.onasys.co.kr:8000 NEXT_PUBLIC_LINK_BACKEND_API_HOST=http://rsone.iptime.org:10014 NEXT_PUBLIC_TINY_API_KEY=t9nc4z6inquvvd5pq1vea8wcp7lb01qmqseh6egms9vpaju2 diff --git a/apps/cm/public/images/icon_loginID.png b/apps/cm/public/images/icon_loginID.png new file mode 100644 index 0000000000000000000000000000000000000000..062b41e4133e76d5c9bc7756db3465508bcdd835 GIT binary patch literal 70081 zcmeFa2Rzm7|3Cglwj{Gi8AtXw9D9#&$lhghaO^#kQE6x)lvU|uZ?em3A&OA8h6+iA z6sg~J$f^6*?f&ZX`~H9W{OfVwIM;Q(Ue|R!pRd>Jn&;$FAbkNGmy1Gstz8*eK9-b^nWn~sm zZx08wD++=F`%(=Y4GqTVW#@)wlr)cppVRcvrz2s}SBeg&joHn^N=l`1jP-IaonFJ% zJ$p7W-Mw^-;PmP6lXQA~6eq|Y6F+B7KYi%Ru@fx|PeQJ^^wiG1X!~;Qk=)C?>D1Eu z#PuW;3F;zxqTv+TN;|iX9J+J!_LJuV3K3*5Pl$@7)SlI6ksS~Ecu+=$m#v=o280** zkemdn*GjGz+Hv&jmT{#E=6KiOLU(4|d~b*r82 zGf0;ovgQnX@em46{dge+588i@l@9Mx48%f%I;H|SNke(}jZf@>Oobp?2hE$3&|`i` z2x;P=4i!~E_3c#TB@hV(B&2uj2sgAT1hT%%&K?LIz5vmxzBiG1$6G-4k_RAlp+u$% zCb=hKKMB7Vv5ASmPOf$&123(Z4Zcm1fk;Z#7d#~=eA4_`JcHqSswa*pgUq3THWV?y9tup1IeWpk4by_9qHnjN`XeBN=jMJE%P=cX$@Sp5u}?G z?~>5iu=X9pvpr$Tewu{g!jX@x4eFbyqhTz~$7uD~G-E{7;rb^GS&Y<~-^+UAOCB{> zt&Wkt3kgSlj;d9IpNlBblkK9ord*XJ&Ujcgo&15lFFffC{iWmw-erukC&ezme30w3 zrSFWK@*Sc2SKEk1Zn_Ey+-_1Tmf$0evuiD8%cID>%~)idM^JNo*6x0Bz$WU5J@uqw zn*x+rY<4QDo9;E$eypCwvIBlmx%Z6J;&+Jpm zzg(_gsCP7r2H}?^*>;E?sd+U&J^mr16NA$ny6}~6_13}oo!W^HOgdY~)LtdNBA5xF z*c?T7=*}@muIb7z&BQC(ggTu;qe>ktt6(&jGra7P5Ga z_}%eLJc5SVIT<-aIpjvuMy-ZtvMmil3sj9n44!3^b|vH*<)rFP7%&+)W=m%s&2h}~ zFqFp}G+R7QWY)B|NkQF7o5UxFW2!o2u5_!OQr&VAecSvQ?3vqbx7$~C6YXZ*t*JGx z^(IMQt15##Lwc|D-aBpg+S1#4E{G<}!XF90On#aCD0#TTdSBo^zVfW{N))o>`MwOZ zH|4eNNA^jYT{Sh@XHlw}pPJ9nQ8|pK-e`wB`Neo4m*KpFI?6f`j@MqY z3)%_BnB+eys<;}EGiNi!AooGe`{FaXXENeL!b4_O_r&Wf?pCzwG*WB+RZ zHTY`>lo`%}=SXloLNQ`L{=&!L1FUtY<)!*jA4+;B6;EEOQlwKn6PX`5+K|ucbocey zeAc;_=i6i2(UeDY55DSoKy35ECc5b$1?Q2YM@*vRPkSCSW$b__iUxEHDEkbn%&R1* z3?)0lbtDVv_(SB{E(?{bbMR z2zjH7iSlGBPn7exb?f9#nj{t+yuLeF%O%3Hp(V268lKApxe?jukD!oaz*?A)7G_V*n+9mZY^@u%&lOvp)m zkx1#jxwo%u^RRK*YT>UkN%9X3G)X7xVqB5J?+oa_UF@`gS^M+z?ItQ=W zJo@O~@rEg+_5&BPVsQ~`XVw;UlrQCkX?x_;=d~A+%cy8xr zsXqUcA$d=TAMWyJc4QWGR!VxGq?&Ayw6NcHf3?m%xsIOkq2SMI{kyiLAY{yfG^P!k z(S2i)591u)-#?iepBj2l;M0J0e|mYyOS|@A=Pe#n)l|MuI`@2yekolm-ERKA()WEy z|0s<~rAbnul$G1K@3_pDxQ9A-YEo*F3aZRqs@?=&zZT*!H^!7E-aa^UJ?I_%*PiY) zN!h{c)4?8dx8`Pt=?4#bb1t^G*7OE&zR9oEskNF>m{jal9z5DDzyHg?HH z1rL7go_N&WalYen;`_w7I=2H?7su--wiou_ZoIwoMsuJD+;YZvVX`4$Ab@%5%J3GQ z=LcBAxV}1lDxNiXkhu`IJudF+CW7nSBD7!VL35FjGp;q3^-B_#!ggaw6#`9TSOpCET%n?QbdANFM> zD|%E=K6c({PhYf$I}28?jje~DuPhrIwj$iW<$l@Q;p*}9^LAaT#okU3<%)7cx%>JE z!Uf=hKa&IK-~`=$zF`i~7YwxV1VTdpB&4OawwRmSPbGbP^-5Y zQAY54;&&LaC4JGpuBacRfsQ4QR&@3KYwAjdD;n$RQm!`cfc!vydz6EXpQ|sMoLi99 zw?(mxAl7wV(SMa+PW`LerDpxT1u}qCDP?aI);tY8JY40Lqty5HH&}jys3a;N%EF~( zV~2LfF3Y)P1phAfLqBm@C>0xDlpK&2=NE$W3yT_J1DcqWD1u)|R7yzb2PMlT|E5FB z!yfGr^fMjeQo=yxcO5^J{JRbigY9j6ZT?4Eek}V}Jz82)`Y3mMG&WQ!yW05p$N}^{ z9Hf8&FZE(|{wjGLZ!{QJY+O}5?EJ7X6R9HS=ZChJ5)<7cCL$>$CLyM*3WuvGDT?h8 zR*{epSKgzjtb`B}U(x>)`BioNpnG`~viGn9Rp5L@3hp4`AR#U$!7nUgYtIjdi`(!^ zB82St?Hu6tC?N+i2}vR0l?s1QwyGkeyN|DpyB!L20s`CI;X6)VL3K+X^G z1{*_w2dJZcKoAM~A!8+q8KAuWn!1t!!W%Yv{X54vropf*Wn+i+LpdKCU?*7men|V? zNJy^e|3Unp>j-c{ zx&JNR!QoP17WOSxEw^N;)ITfn@o?}Bu<=GII)W(iEgU1i&mmY=0V2>-2GABzU%No;O91ARfO{Pk#oStcNfekY6lpAH$=i1y1C`{V5Bmm|)XPalm03D3_A5MM2{1xoWNCn7=3JD1aE&ao~`EuI#3YL8vo9ZNokobE^ zr@zj>zv=XINBhd@q61N`J}WAhlD=!j0rf+>e^9l;imoeI>1%_r-RFl)Y>Tk7`@b3r z)_}fcfK3bKARG68n_|jo0l>fx=D(IRL%F(o1pI3;C0DS~`}0!Esef%S4uYR{as>f{ z02^OBCpB*mKhJey@IN$zZ@2+BP?K`RR)d9GPGxyRh-JBYmZkca8vJ9S?{qFJ!Q%g2 z4|Z)Wx4aqiO=v0QABB`XTs?q8`Tnh&-&Ow;=YK7+&ZXaX;iZ=QEWy15fr%5^ciExU zq<%>LN&Ek%!_C7UC8w{Z^bN12kN+;^i-k*9Uq^Y5fx$P)rKEqC^akrKVNuaxfBC{^GR)jVdSHM45^s!64--E61Cjb9qzE;M;|7Oa*6a8P}WNO$*|GT)^ zN~~Isll|8*wmf(JJ)G?SL&CoEyzxddB`_`eZ}zbjn%5N*H!@+krQh%2X5XP)Ph|Y> zVoeq@#IHCV=;beY-3lxl&g(?6UI!N!1Kf$O3{-CS?~*UEg@a|IaR&!qX#g=(66<$jzYTYw)!#g5J=}p_{)*q>VA*Kgi7ri5 zB;bHL@fEAw@NOsiD_#eeSQ#VN<#jkzHX3tFK8L{0Q^bCodCD(&9O9Q|DL7CzByU34 zaSnHuyWt(~mv|Fei6`swHykJ%jW-blc92_&lyLZOvk4}$Lc+QRxnB#F-(lHk+%3gQ zG3@pw95;6ScRC#|?5)e`zN50ym|NNegNtM5C*T_a-=$tze70O>(&k3)1>iU?&p|a7Kg9~AIFA<_x>Tt)28{X+a ztAAk^1=qjzafcJzaNL2jo^R*laKy@3u<^OWo!zV_V*c6z`FB`09CxA;fIDo&#N8Lz z_{@o}%%|4F+%E-894H%&H(~hFY0naID?Qur#DPZtLb&|3p$>PdzTuc#x|1TZG)WO& zS@Uds>VD}`3hw-WeIp$XmW{?8cn%eamT+1bl#Rw4_D%zcm!jBHR=Cj05VG-o z4tGgmJ=}qA{?cfN!)3#wR;NzTv_<6i#r@F8;!f=>B-W%0I`C{h9BjA>BciI!mf)rI1ZKnh`FCVy$Sae zn{Q_L&rdJ<$EV=@%ENDdc)rroLyFYAZGwDo3#OH)H~r);{||yok6~H~M@x@<`n?{^ zqz}%?me0z5n{c(#(DlsgR%F&?@hd|Ak-h(4e=w82tT1*~2Y!GHbSrbE4Iij*EnN?5 zIH7gXhLhT8ye)kZ5&QsigO!M};d#TgbUnP`gx19yPHLm^CXT%d0)Bum)ciJ^^thI; zhc}$ix_HA$Z8YAN?_XhmV)uG~pY1|iQ`f`Y_YSU$yzgQgjy>>*3+!I+(z!J5Ne~-8 zV1fq!!eZ*X)cV-NRkq>STRxWtKYy=V1-J_k>+(IE)cV-NiETLc#Fy`cEZr9uU)d$w z_`Zj0>bls&Nv)4PoY+QVPZ)d`5xWb8y%Pd{ehWt%p1to)T@QQTrPjsXcd-q}9=Jw_ zedY!BG9CE&+pvdg>bls&Nv)4PoY;nA53zKI75oJ3A%2@V=l7_1{} z1Meh)S0;e>hk{42|N6t;S9S<~%RNQ0rAvuRU(XfBeZ^zL4?ws_daTC>;J^0$-0!gb zM?Ubsu)7EsUcQBo-KP@!ZT34rtAAnH1zvmkO=?{M3Q2UrhcXY9Byb8UF`K(l{oz+2f4SQmTWaruwf``?(c|4io+ zFxdBw8T|Z(Pcq;=mQvvLX7+w|DDRb*X{)HRxT0;nZM=h6z?-zOUn>7gsqfbSWN9$}+gf_XE|6K3_V@Cp*w-?<`Yo3S?F=eN-i>AoUaE$2_rbn$SPa{%C859P z{8ZBHN6D4ymLz}3`6jt+Y$_-pJ8!h-5}4SGvYYlK#XZ?X|H70AM z{DEr?a8_sifonA;Yoz>vYYlK#XZ?X|H70AM{DEr?a8_sifonA;Yoz>vYYlK#XZ?X| zH70AM{DEr?a8_sifonA;Yoz>vYYlK#XZ?X|H70AM{DEr?a8_sifonA;Yoz>vYYlK# zXZ?X|H70AM{DEr?a8_sifonA;Yoz>vYYlK#XZ?X|H70AM{DEr?a8_sifonA;Yoz>v zYYlK#XZ?X|H70AM{DEr?a8_sifonA;Yoz>vYYlK#XZ?X|H70AM{DEr?a8_sifonA; zYoz>vYYlK#XZ?X|H70AM{DEr?a8_rn2^X1+d?2{f?}GAWLAl$@vIVfo%QbAPrGy}e z#ZFyc3xa|e^~E0tcgwYYP-WC#-Bl9RE`F1_QUXj(_saksD}6}!S?*DvYQ z%3|_q#}-FksZ|YrTJ*|QylUPnCQ|tFnb(ZzJR$M zOP0Rt$kERM5g4LaMvazp=lHpG^i^l>m!|KsLYp>uTz_`<>kz}@WA3qV%wQ}J$K;tW zHL0=XyWZ=0-3{}IFXN`Acx~r`pCzcg2|BHp@*Z|Arb}$TLtozqsdeRRzlwgelbQFS z!B{c%J~s3fOk2lS3qiEsjGY$Ow#RKlc;S(RBkF`a2KtW3)bw4c9M{ey0!t`m3Z(V$KP(9nZ%|-EEZ*0#&qjDI3LYaDJ zx~@=BQXoV|551(z-W@xS9H(3Sm}58^r>*gL)~GkOjAj0v8K_tZ0TGfbIG@Y@&>`&i zN{u(x3*#3nCq2VXOOXeo2W?`xfy&YCv_>jl*>#9Rlx@37|8DeYj9JGS$;;N4B27UJ z;nnfn?Ae)^tw(8d++hSrs~!54a%angXel1w#Mdo?4piuVg3ZSG)?zwhPsbUm2xmoj zBX?;8n{#~e!oAmP_?xu_p-G$Qw&7Q$6};m#EHz*klNGD zkhvd&PkbV4-u4p%Om-I;Q34IALIXavMb78g_Org#m@hDVhIzxz(%3XoLIT#O5KvyL zVI+tgHkfs#dt}g{Nv|Gk*%_wXP>;Wq8LDX{jeMygrPJNY16hh&b%w!YcajkqZzTq5 zo%iLOfTePbE#%zDAgg~8$~86|n?^=RFnSYDw`RsPW8QE@F;yELw4GGgaJi$r|q+w{a-PqDE(L>;V{l zpsHzST&z1eA;I)9tWvRC&RG~Hm=Uzi&TL8?}=QutsU*I*v=^}63ff!*(nMqaI_5SEp9NX2F@FfNpwys1ht1?n%r$^5 z?$I~tgwC=hsL!LgwgpCTf%ZK-VI+?Xi$^3OAWT*O$0CB3;(#jX2y1t=5j(O%z53)L zc{qUzOqONr5!TLuvLlAP#&XC+)m9@wpXYfpWL?6H0@pSY8bF`=5pTbgoT&%gyEj9W zCcDS(0CP}I2e#78W30uoco8#=BnWSn***3WC=<~G%2eoh*~e^+hMDh zJAvtnVJiwu$lV$Hg%!OC4ZS_K1!e&Zo_;GKm+3LT;uif`p4WBf&S|qjGA}OWI8J`0 zB_sN<6*S@4o+>HJ&O@_E~Uo`D>ZJ~oOhuvcx)U1-9*xs|QsxTcz2CH}W zV(=jDF(i^bFr6|RsKp<{rC(v(x^#W!tz3`nUmqSsCS)Q$2>;_o^7g@S9oY798j#3=zFKw_!Ny5foy+;fIoU3k}4 z*mZLY_OXjkgC!t^#qG#UIy#*!F2Q8EWC<=)OMa8OL|-N(1lhXU>b=_(pQsgfhAZ}w zZ_Gzq6f9n&Itl?nUcinbumP8luyt~@g>%dX$#9kkV!_)P@4GekhC$JQd4X`c^!yya z`K-d%cwa@XZ4y`l#1nEeIkZ?eLkiTju(7=w^n}p>TZkh%@<>xc?hfRAO-4=7Y1+3@ z7=s{n1Yzsg=r{_=iPe3imVL|~C(sHHG}J!OVibjW$z=ir{39_h)9>)<7VXe0NJ~JR z294x)Pr+nzn-$;TZv1$T_YM6fNP;wg;r2EW(_&r|Iiw=6>-vZcbu!g6s7uyY_f`q# z9Q@o?1)%cG^5KxBmCcBVjHiA>dmk$}yyeOrL>G-g#O!lH?(2%3elSq%_~kvfXkNcB z8JpTlNXTn8I_``NVgl#1t zj>Ry*t^#kYzm)?^r6wcFz^WM0O@U2l(~33;Zx$6a(Sm7Zn&Uw-S;sMB9d@i-rf^;p$ym#Tt_uK%o!w@g znjLm*T&A-Epx-*`jC+BOGfZq_q&u^f8%`XlJMoenA9@?l-C@UmI+7@u_DgIhFKjUe z20o~gpc;FdtISTBLs%neK&b}o~ib-Q%t zM)o;x!kY!^*WC79N}Ej13F+TG{-9RZEtxLM?IAuYgZ>V)yAbX2<8{Mf zLV4ZE6)v+GllzK`m7+~NIvV4XuLV#0pJ1S3x{`k9!LF@)W<<}DsgTpQWGtdRZ;Val*Q#ct?#<84V*PNy6M z_T^V;_P7j3@Q8`&`VhlTff!QCZF(-3K2|QiE5!?Mhs84@NvZ5G&Q!#uIHHC9yzFg* zx#xFek-2C)Fj-n|R1EG26$fIXlnUS{Agh)1PwWt^*Qlu3#DxRBAoQE^wFN z20MFOCe1=X=Y=c5&ZcL|h0XWA-CWM!W?r^Wr>;)dBedF_IH&P2{((osz>>~zn-1}s zywsTAvLOFfez1>r>|~6rs9&YkW}i|L43Yoq-b@C0vat)>$!BjdCg9=U7_9{Zw*+CU z^k_~E<_yPZ$yCz>pB*A2OwB^#M%{b>8p$&IcC2$Y`1v)R*$@%qvN3POT85L!(Nf^+Aqc~A4bJ(qV9kt$nVAs`=g7I+Jd zI<;HBQFd7E=i;;j0dkp?PxdSrh069EAWH~oF)GLC-1IYfdmgD=JOpJ(BT** zG2_=glV4LWqe~O1h-w{TFcDzM)j3(0#aYn61Ns<%qtm$w1yIOz0@;p}gla!Iv%D`NELsVi3wYd&8cno_b$8`%?2Z z+VJ9s!%u9d!fxn4lK)s;KA8ifsO(lm9s&dZc0%6SR-=TRMEh6G2g$`5`>ve&;yo59 z$~~f&WLbn-*tz&V;t|57gRwDuKfmE@=jMXy)+WD9lIRnhpZ9bcelV##b-!dL?%~m~ zjM%tyt)1j)G0E|l4Wa@}f|GQ1g%xXyZHb9mK*XQhZz;AYD!!;+kks%#@mw0q7=O@P z)*jCa`cu<>cj#!k3w_8N-xl3ZaC>n7O_&i=`5QKh%2WJfHv#69pp7j?1W0nj(2gA= zj38R|q?%~iej-%Qv21_R7m|to@bubYyb3e+Y!hJlV^LPOy*r|+;=KtgxVH~mZTb4t zw}tM8@%hC3qhVgv8n@>-DJr#?kYWCnsAV(9)& zX!nE{~d^8eIO&;@bb0&$$W%CC9ed6d#cfvx%M#)6Q zF1hf^e(5jmu0|37h<#7)>}PK45HSTq+t!?eJ1Af3js(i~iFV6}1)pFPzspL|)z_06 z;@4|s^&s6SnUuiYT9a`*8Ic^un&XB!N+XFgn`wbH#l5KR+LwcEw4=p0=*DdVM)9zX zL2DnArg%bTr9RFC))&(6jt0EvZk*sY@jL`ylp2q?n5t2wbbS=%_zL`)1DE;8^yUG7 za9#jRtsNVHYLN5h)M_w^zK;5OB?;ft+2&ad@35=8 zA~D`QXr>-*<;VJbJv{U)zJoB<)9gh1O^pc(91luNzPI^Bf- zg?yAuTMY0z=ygk_g^qfT&Ew>oO51eR8E3U^o+ar{#GVv)YFidGHIAw$are|lDsO(( zslVmRX9Nm`*-Aw14n{DG_hI+ZZ#riW<7Jj`Yz9lIQs#FrZnKWI#QKT@?cG&Ic7qJ( z0h*omD9qT6dP6_=?(;$;hN_)|9oh;FCt{*un{9_9X+#C@JtUBqHu@xa;cx_|<$iM) z_EQ`AG-$LaS0Cw)4kCl3I!u{vcW#xKODG?j6kxlO)`{C~`1d_{L(2Un_ei-AGNE z&|yeZq4GQ|ZxI+f@9(Tl<(XdGQJ~O}v!_ZUu8E$O0G4gzo}f{fgqcC?wtPY{hL(%B z6h&f(QUdLnL?_2f*4+;{VuMSD>yam8-0KcRCW*IjQb=e_tA46pd{1gVL&-V5eUgHk zb9Bf7&^FB>%gLR%NTluE`&@B;i1a!s{^_m)vk1x^CyP3zQ=B}3p@p4G)RI4|A#cdj zZfzl$&AmXLVy|0aJm0*%i3I=jhd7ZaH2Am)FB8o;Ny*J|b@$;#j;s8zQ10W=cq7{g zgUo{8osrj#!{2T3(@YIA+=dGR*`?Hc%wgCS^pteoeHFyb} z_9rFlsThFK(;Yd40LC)azDtYB^XhP_e9}>+CUj@IMP%eG9f_4Lg@(cbDqab0^V0AJ24TR-<}*_+pyh4sow~^lr79BNgNc7^Yr^5!j=P z(i%a%+c)9q+-+@tF#GZ}8;OKgXU!gca^o_a(~k1t1}9$+YSR!0aF7JH+-$HAEeVj0 z439gh^MTK}#IeZTepk2w);*%8&32It`8IvBI~O0LO63`g@jr>7<8vq+L6~SW=k;hY zQf-pS_KPE`_8zwe3SfTpyca}F#Y-li(B_|D%(6ca78#xye{!nOcu#F}_!U^b3+$>j zJcKawQ?J<_ZuV1to=@DiqvaM)N;^H_LnhzS=%MJDb@h?hGpyZKRm6NONun}$*)U@< zzNZf}U`Nm`NQ1{ip7?f{iS{S-ej~b%QbkVC4LyMwqz^U?5^8n|-prZwJVtt`I;YZy zJQAYR8>l+6o5I$Zp*^T@$K=j8{8%8xVsG3pkD~d=rx_sycHF>`-X^@R z##=PRMFR9GFxFJq8^TsAeJKrn`Et$_Yx}7W<6R|N6`^YnvQg}(UJs_RjLq8+j$wxpVKr+$QO#3aiYZ8>{N{cwi5a!45~$tB9D4^Hf1$!w9~1}W5& zTcxQ{6J<+(ZJ4kE6DFqW&AGC`veSmZkuO6lxNFDgjqNop&W1XK!;H>)JX9JU_^Td6MTeuc=AN zW;gHlUc&INi2LE;_HPtkMB1*u8EzFe27P!oFwAh_SB=PFU`AUjyh#!^o5~q*%XyP@thRy>%0nG6->6J6kNOJWtj-1t32~`fcqe zJI!sXT)h>){xQDokcI6&Y-l*>e$1Eq$y(lHY*S1L?+&xA(AyZD6k{*_r(9-tQTahKkyHvQV zPE!+vhOV0auH5Ch3S+&0xBwPqiV!Y=BK#}F_*#d)1EQ)UI zXp*WXZa%xNTxF3+C^pOFs6$EMN&FO)df7BA!}@r1{}Z9fWCkuykyMs&SWEL>lZ6+A zz>KmD!2WUrO>ns*a1B0uZgZ?@Y=)g;^N>Ime$XPt1Brfcp1#nhpe?5oZ1#tt!? zeZ>~`i>05G^Aa@Wj1x_{>A2m`qaW~2`{248%_lwq-=ojEsu#L)uz>L+vmm2a)J+fG6& z#PS~AZJ2J@wQ+@O{H8R`4DBHm1IIx3VY*fzO>_y!-LWT{8MGf>mYhn!7WTN+Awb&? zd{+fIFpu~0`hNH38WdJ>@^Sym=Na<6?8!6H=Pu@hMQbFauYOQF1G{kCl#+GZB1?>L z0_J_>VHuCJ0tsYCb1a@Q;4?@M6-NU3ZsOeW%7Pid5q`QgV<@=1VH_m`j|@>BNJex756S@y-@SQD>P`_yna70am!Ebd<;Siz@4x+Yh?fP=J=| zv7|-yT(#c3TU=th;2^g8(!Nx-nZ$GD)Z`}{pS<_3B-~+r65p$vukV7haS?2mT?Cv~ z+l{L=;6o7h2+6Tu466p5&fM&L(?YP+l&+=O1U_=InH+*f&iAR+JnR6IhcEVo;#p*B zBzQpK@dtIg33IndHf;XzMqV9IMyq~UPL$hJW@J0i`{FY=I=I~~yYQ{-6;PHzvVl%; zC}fTXAD}{g`Oz|%RTw4jNT%11o1(?B$>~CUmnp4^e9vv>O`1J{;6I|f)Eeb%ce2! zvdHcW2S#=?@%n>$A8(?*JZ-ZS{VnwOzmG_E?YkWR>!^8Ca47hq#+C8B$jB9#X77)wi?2`r2-W%8o=P z9-w_MKy{u8J7g#EXCE^kXAA;S;4i)fL6$kT0N!wD1DyTbG%14 z_7BxBIUsB=6B)hCd)xNqPnp)&*tS%5N9ETT7T3gr=%HI&qt8@cLPT$#-+h@dmoTWl zjlN)DFCcHL`eAyYZTE9L%Pu@2`iNi`Z>I)ZBJ$cS0uYO4AANohd5ePH+^wNS3-pUV zLd7ZAsli!wr)TNr{Q>BH0Rdm)SnMy)qnwC17`6kf+2JxH{ulZCv3^c%#U+sIqF;x1s(3&N~5_{DG8#(engNqkLx zR>^wu#;wT)vv@op1aBD#|;Zq*l{@}&9tDEoyTb|Ie%48q7W2sGp z?-m`8f#qOONJt0wqymaYKziO*$CB?Ul zZxA(on+G;@#|{zZlHeaZw1qye^EB`@kYyKxSNoby+Xgzx&qB#%`nF8`g}_7Lg{1h$ zE~kckm^f9{N`jvzX!_|URM-bLoD&_601cPHud=T!I-22`qx)^?$#>2@uOY{p9bU1$ zUcpEZSm@`v_7X)xwwJ&!ezX1BRF`bF;<3mseo+GPQxlx49=nS6NpLdZV5lLOEzb3> z%V;xGq5|nz##LW0r3Ie}7*Yt8nH^GEf(xX7ym-g*>)t0Myfp-VTTiRZJf66?brZNk za06|3%UvtEZEW);fs8iG^iy;-r1*ffVY&mS0!F~(6#Nap=G5)bW?7rS629;J^}u}k z{Jyj9s{JUcLHFBwdLrMW;m8kluLu|bd^EB{aehWR{Yj^@lq5M3BE)La{^`&l z=3*yN=)B@_4n3KWx(V#DbMRIXh`v3OC}(`jeJHxVAG>3@OE47ly?8R+8c%dPcl?6U z{5>_Wtm6%R!9JPuJcs&H24QaGj&Qq>@#}=NXZN zvY$*X@Bn8m$ByH#z=smI63E#}8qjwHHBmkuGj@@Blgudi<=k7HzX^MpbBVf{uP3;S~q#-UhPp?={<9=XR}gL$wwaUjv8~AwL5fWS=^v!sO&&nC>Il zx7BO|`v?<{KQ1o_8Sw*YXNAJ6d!3F%M#w((l2k}NQ0{tYXOdVV%LvaFt>o4u4~0Ra zD3ED9^HnGoRI%{MY+sqPh+;h*u$R1=ix)x52HnnL3dwrt-$Uastc^?`4M}U&@NS_Z z+TjL5k44B7f;o?jhDbMHKPA6u@?CB=XAZ1Y!? zT@RCe5+^#uTfjcV%qu2Tu+JOsNNC*S*=53LgTo3G17C)>Csm}(@p>i%wThR(2&klo zCH7P%$b`@5lBv;F1|*fg8PMG3c^Diu@pw)ljE)2ylcZvI*}`w?a+l!PsZ;&_V`^a` zNa9M}ZQO4_Op>4P*X*lwW3YjWOJ9HhT}lndUscc}^pDxxvj+AQu)%yo-rkbfsdbC>< zbUMnhk+6L5SCj63Bw}hME&vtV^>+$>k+eX`_;2D)2e!2M^y0%??1+fUkJXyY`-+TX z$f-gWC=JJ2YAn03V;TW+b~K92BIr>xFpU#J;U7)?z<7A%jY5j+@O2%A;V*e&MxMKO zHWz2xRtVf!G;2>3&oaVQ`q5__c)*2JyeyhhL@Cp)Ci1U3k)&+_tZgGY`H z@*cS5p8EA=Cbx;g)6gr*p*7ZCNmS}ZqZ1Wl1IZV=aIJ80*sa}-3aR(3ijgk|KV!sP2ls4K@aB`-*RW4TPQlw1 z9K`^5_IZTeRuOi7IeGs^7h#25zFSQt8ectqj~cHjIcR!XC~=N&o2=l(utys^Mc3WB zp_ELQH$fNf3`5Oxrzqn;(9(Q@s|FzLdfBpi-wgf-cLw&9XyMN2~EZigOu|>AaRBA?V^doAb zvy3g^?oXZa*AY*TQ&p7Y>RU@03cI(9%M}pvR()jdrq3I|h`1j}@g~G1O!;yG!k&UY zUfnhD{@l*61)s*Zm3M}}n9Em=a=)S7v_rS3lXCiu#N{oR^NYky)nmm0Gfx`3t4Gs| zozEsCxptQL+&{QD|3rMIC$p85KwWEiO#5hZ!~DsV@GfkUU(4pNJp)%KNSnYM#G=r^ z{Ug}&Rd)lWUU+_OvC`iskPQ#Q%WihuZXxM+tl+%xu^I{s9uN}0B+B)K3bq?d*wT=k ztu6;)CEereWuu3?iCE$(Z|H%a(cba_$1tMSH9tNrOKz-=Z$-T6E z_07aj!Ip2&uAPr8?zeX}D3G^Y-g@PtM0k8sU3?QGe$98#xDi~`gY<88`tA1{YSS6-dR9FF_WLryMhnR; zJP<{4>*QuHr+xJ-W)sUKz^h=$)k>>He1!|+ug-lZEX%`XvoaU z@l-i;T`wcVDkUGxQ%N>?W?b)RpJ9HXe({MQcc@9{J9}aYlRNZB=E065B1b2rQJocg zB2^*#?#7J)UBzwTrPmqAh*WpI5$rtu9tqBd!%IV}E-NJte~KjXMQ2}3ftw$yzQ%SA zHvci&uX^Ib8Phuyo@aX1=A*CB<(WMvs%!$Z_%-C~xPSv(vK08+z!F z%X?EomvT&LGnHqB->CHL%R9r5QtuzYco9fVoYa#QeLS3G?Q9KB!qbAnE?Zu#*$V>X zR+16s(g}kiIX3w~BTN4%)er84dZB$2V{;77Z({ulzNXGGXLUx4C!Uh>Yq7#Ia(cWGwD0_iR0 z*+;yb2Q3OH6CZu1W14-D**Xhc+f0SdeJ+@5+qSSS@k~)J)4KQ>wUWchzOH&%aYsLi z+UPR)Ia!)MyDx1@XFM{54qhk~B-PVz8sOVJIi%VYT;5T%)2+KayVSA5*kefV`ng+; zqDj{RPl4+IcT^J)8CGiGTw`ov`(TnOxSR3tC0}=IsnR+A%8n^;;o~CMj8aukQcUoy z23vfhXmyiR8BFqLx8$x*6NlN$4^F>j3Vzab>+n23I3DWCH1L^y^I)%RzqrwT|F$j` zanUJ_fhxy3`hq^p5ngeZFDJC-4}4Mu17Dl!=LCb(69vhFjQa~wGW3Og=_U?gmrWc5 zJ8px;D4n~IFu1p)I~*C$jXnx{GZ^&@(Q>~Bn7QA3A#gFleS7IcvvU5y`I`&DGqd+e zK5fHZf2k1L<2;davfb`>^@KspUg9JE6F>* zuPpVH4+X=?iOh-i?Q{>lrpHQVgM%E@3qx!7V#nm|+GSSyP2dJ&oh2dfzLFuj`y7Xr zu}1@#FR2K>z<|wDy{dApC;I2+U-IsnXwR(bEf>IU`lWl_IKlWLOYdMgI2hH_YuZ8g z0+kESk`BmenvJ1b)aSSd9l3c$EMm(%zA7?PsQHdqn=ViqbMH9qbSEt|2MjUqnM1Dm zy|e_E5f+ERiF0RK=)kBk!=p4w^F*zkv=xQBz^dX&WOp#yK^@#aN#PI}fvFv+pT6Ab z{PEV%WpJ@{cCyPn^VF-$&C1o>g3|1)!_y_rhk$=s)dhXrY;=U(_3*yOrBmSv`TaRy z5=^a1hMYF5{*+#vBsH+>(bTh2zEk4{*C|>GS{9SULXM}U7OP(jtBN@lZaAl{^+iw1 zu_#J&{_NfuXR_%Mzwu*lr0nc<{G5Ba(DHZkZn^l*4hoj;rrNm!dOlOYc^}q^Rx|Dl} zII4B(K*SwPeat>O(FgJcvK-kShLnCqJb8~^3OtOP5_oXODsT3AwVgUrnnP5sZ{Fk@ zk7-BjYzoGpnZEh|ba37AQ2&4YBn^rvG7_1I$ciXZ)*&$p(49*$O*sK{r++fpY@*I5vNrG3^J|H7scqpp89oPDVdFv z87liQ$<0__MV<(`Os|SdY^~8vdUW#@qu$V(B$T5FWetW`ney)wZ}Ym$xeQ|wSB_Dk zK9y>>LV?VSH>>Sc?9ntogVFFX5oZj+z2l45Se<(b)El};*E>`n-It-C;!e9b6Bc`| zk}`|v*6*M=XTihU833$$>shZH96_k5Z}6bCDQ>-}O8zh}7y#P<#Va%=WxZa{|kEcK1+#VcP%D zf9v)r@`BD_r=nA={CqaRks#vg|dFTs3NRT<{pGxHNMBYcVUbuEdgKWw6tZhes)ZOD_g5?=RNjugj3 z_nWDwgLUZT4gP&T0jpoU>ZYC?kI!7{Zfk!oOtjyAkhdJ{Lj(mNu|BR#;bJ}@Hav6O zt??Qfj(nfv#Nrg)Yzjj*!~5!{{>jdh>&mb?oe3h&Ik~QY9GL%-WlRq%cf)OEo{YFB zrM^v-QA4V$IKPwY@4uWH?u@Og^eP0PlzA@xb*0D7Mf1`YMz`NRfFsHrm^nT#7e1&> zb}QGuQ3+r@fpj@dv*%mWQ-*$;P??zzh;GOW_yvJQOV?}@Kedg;$P~=g$G>=pq*|ku z{UXK$dcX;!)NmEvX+IY?kl5fO(#^bfe?9LysQu}TI#PZyJreT@{ujJ7QW1T@7z5|y z_s46q@6Y>;AO6Apk=>>@xYRg6T}eN+`uCY*r@8@gW^79_%J0AaH8N7X5~mQ^wc-gt zgSwf@+w^1e`SG%3Oi4xldMciH<38bT$3(_Oci&O&pk zw_8$2SF4BGukVbN2S?+59$jLU1y4VIZ~X)W8gb+xuE#CL;a?4IaDUYTr5VI2+SIDC z{D1D*hR2Wj?L__m$lL|jxT)Y3lkMJns<>Z=`m^W#{^a`mjl2IcH!HoTT>#kx0M2>Z zTGTLt?L2pi0rC75RrG($K{LXh@!vBWJ%aL51deH(%*)UoGEUxC+BT)ZGYTz%_xJXMYIz7gPZbH6YG zxezl7VNX;*Fa~hGrqf9qhqXGNwbC(yejBsjih~e!aic^kb(`gWo0&klSNb*`{3(w! zFO@<{wz^)k1aDZf(8K>0jMzurm8^BRbNvsscI^Fi0)G*lf7&VB4g+jToMXawz^)Ax zMK_nw%MPE?hjiTl*)tzxSo00D1`v&EBu$j^(N1PH^zYP5-qBP)zcdj@y%I+CsgshK zcji>MB>iyGMZ62Rc1FdAx|Ul~hD<8$5bh4Vj&ABs<=foSKg<2sJhtaz_M z5gcNrmFniAc+80}f=Xt&tiOxb3>ORhyO|HQXw5twnjdCs{0}mN!=FaEpk9@+z9S@y z+O2-~;M!w?tjBRo(<`-wzxK3kMYDmXhi4ww7--nz=?MV~X~XQr%(MIv^Sq-J<%HNH zjCGYaC$UrXD1_JUs|J8so_?1DAjK@C8Rlh=GPz1zx>XL=7l7-)(n4abx^MZ#SEhM> zm%731>$j$bt{v(?)5m;L&9?BQnswp2trCajdA?r@@sL2qPmL!RttM@%JLEa2QxCAj ztC-~ifX`WvuGlnP@&)26`84CNCQ1%L907*{ty+ldqX2vL>oINIXg9?NMojS~LdxU* zeNuXU`0ZOM>EhMG$ngYP_w~E;>E$wqKV5Qx#CfXh@3k^1t3=(vFweNLayc^H5>gxc z8V@r%u;_RMuePc*?u`02Zq50+5Z&^ee*~ouG{=#s3xvnx*6kRR{6Ff^&1<#0t1U<9 z)kW^S-((o%t$fbH13*aZxV=rt=_%qZpyng#P>0)-@2NGRsTw`>gS1^2xIS?`oo@sRhx$WzNf!tbZqFku`?fV^i8~GFyR6RivkJv z)hK7z(*VrrrM$PFOGdM3srd4n(f_JaDjvM1@9?Xt>5O{Laqc{u1)-xG)kBlZo(e4! zDZhNOhBhFPyAj=({Y%YClRIy&%=m)0Mwh*kqiv~S4D}-AtRFpGW>ddxV)kPDFr#c4 zx>qe2YMC(DFAWfltWEP(1?*{9?nGTmo}2H_tEKsS6o2nIKLDUh#jfdM^%l~afHV{q zf>X_&=V1(hQ6+B9f;U+of66~%*gi~jeZ1ThSYAh*p)!3JccfTXxz^KDiPnPZ*;k4- zba&WR=rIlfxk|MM!OJrR0N`SDcmZS!li%;R44!oFfRIqe9rDblvAh=VXv-gxx_jIH zake;^28I*VON(#|PrpaiEtUIp^!A7x5ov`(x+-7vGpG#wS7qaW$8*cDXuSM->bZ?O zX02Z4Vt0llRpsr#M-CKTuq;YdxVeyZz-^rHAK)2oZqGcsT!lbZ05W-JHM3-H{GsF_ z;jIv`6kd_jC$Tyo-1t17TsD?GjE$vRJ9Ra`v$qA`(l-N=&pX@8df;M>0M6B4+_+s; zuo^~R{M~T#v8v6`f?l1hlOg;n74eyId4Q1vOrV6i>UHp|=RSARQ$fz3&IPU-(!+XZ zrpI^wNsVuQ_c&bXAvYkDq1>v42C@uqxwe}(hoBtP66^8KTkV2 zp*zwg-8A(UXhVua4hr@a2AdU)90ef4JHM1LX2rk+A+arH?fs)kRe7Wtalbs7*uzos zMA2?A_i!wtQB|QoPATn^^<~85tzF^`>d&LU-eISgH@z_qmh zRHjYUgw!qQ#Gx*qK-h{%3f~CbUU9O!P%Ln}W%$D#%a<$;4NcxaDY*hpH&7SItJw2s zfhACG(BiYG_85DbkYU@GCNz} zed_L93;l>dB-TIpju`h{QGUB+we{JRUv#-&0Gw{L=us!tAqR-QmuY=Yujl(SE+F1t z|CU~T4QlYO+ZI}S#DODVe7RXe=$wxPrEC{+#`~d@CxA}#;0uId^xqkmC*OGCBA%?r z6V^RC>pG#V_NiI<1|W>Zjv)TLJ2P&x5bKc9Bm8ClZg6F4OM=X|i8l=%fi+-uiC}j7 z$J_y;&{nK&c4e$gni=uHuHxfm7>RvJ4=R7>;3YdNooX=F0Y7$baQF>=RTo)8rw%pQ zGKKm*|Gx`HAdsezOw)cD8Qm5u@Y>K)MSc|}+=54Zk$aByro{-v`Y?cMAka6HKviv) z+!6QD`4CA{M_!g}H~=_5zrCtlW4J56aHK5TPUH-SMJdSHNn8ec`?MW>WmpVMfY@<} z5#im1Ti?tyn0k3yan1JsxG}A9(#Dl?szT;+6V2)9>{ui)&lTm~*+}jzwTVk!>DJ+v z7|`ITQv^_MiR8Hq?*;;^$FI9`+7LayggT54?96~(y$h4uaN*UvU3S{sFE$O&a@UB) zPF&z||1JN@j~h^PdH?`Ca|m%Y-GG;DPDjxRni3v~1gVvQdsziB%++)2*(mn!d%9aU zAAe>)(7zI!(yj0GHie(FX?lENH&^P!k$*yc6ACD!XeTa7w~ue6X|0>u9QzT1Vj+G# zx^yCgAnxlW2qrS(D@PV=8UkLp(AGqMjI1*t$~;dbMp>3@e0_a-iPtDFhrX~8gw%$H zRvU$$;YRi3j-o1{F&5abV)6l0x*2#vNlW#G60=1-22)0NE4_o_K=5HL*$2GEvu;V* z%?|g<6DK~4dv56IebicZkdR6Bg0yYq+?+v)=Sr%~=>qn~FzbU2!XJ4B2OKWd7 zp~wy(g&|vw>{x%q)oXSE%Vz-vHucuwlIyVjTTPIG5`vc31R0WQdd++l#U;#-h%p9? zV7jH@O)x|<|LR`F{~RrdKWo+Ze2Y)%t}B{Ak>)D_HU-ufan)4eZhVQ248J(qcCTPp zY_!5s!lX3IK1P93WJ7!LgXZpZSK93$LS&e(C?7^bymmP;I;vV^_%y_BM1n)TkA8r= z86h*{Qkuz8gzjPWD+|hg?q)xS9DdX8hAt>rZ z*rFzOk|gEF{n~Pr04uASxB7`N#yMP^(pon|oth`-%VzT+Vod9Z(qzTl`sGDEJ->+f zb5@Wbppi!PwQIFFdcL`*zmHYpgG!_WQf2mMQCjkHf2ItN zcqe1E8v>EmE~g#Z-LTb`J%YjwBdQaxvZBvJXOFSt8pSua2JoVj+Z)cC+ zHZ7-1*b>gmcg*6VHtiEzTdB1w;=L?62v5(abEU5anpMghm%2^aBlXiO6O4Gi*)i4; z9V_=CPB{bMI7OwQzCUE~ZC`N=&Xh=hS2!+YF1{!Y7!{eB-Qj5rh#qQ%e6*RNOI=*Z zPY3P#eM|+cq6-g^C91b29YR(G6}@6U9b!T#o5nq{wew#U%>7qWqN94P!}nwBHFc9n z8Oj%+8SKO;mH_k9Qm&~Psy({v0&BM_`3RNqGO)ygB6GzzcX>)Kc_zs{IK_&1KSfWo zW~lKFqI1P}l-}HGeSZUYG3PtmP|=N8!_)JaoBI&9w>ylR>xhPA-AxhggzAs_s!)(pVRB~rh7fu%ZRXo*Zf~DaSpZCoeNydy(Rj_=|&>esk~`#3;k-k zqQ(!#;ic9&`>(9E{U3V<_VgNmo9`cgHr=u0*}Ew~H-dD?X#hx$Q(Y!kAbE?$-ffhp z^C;T53ZclULGC@i6P$ZwO;SlRoc$o;&(p7kM{e-o9lTx(#9V2O|Oz!2)nvFb}cs?pEuN zrwy&wI{fIBR1002xlq$Ek8te;*)a_zms>^W?dv2cfAvedxL$wOO~ca@l3@H+f2a%jP(=IgM*EAg+?>6p^RjYt%jv zOv$Z=>WZ`Z^rDSEXPenGWL-Ge%6Rr)=&6#dHebt9TjJ91SgK25^Bs^`;8?VM-iLTF z7V&KfvZ>S2GCM9*?q%L$s3p3#av&+_EkB);0mgwT(XmX3Kb2U8OgN%BGvwf3PvEFd z-H6!BK8XB!h-s(duGIc%{UGPL!o0h_x^Pc#*Q@NL{@dr1;C-hTL ziAG(WJ;s~hZmu*V3+`WU0$T=#DK=(B+jk?TJh9qw`lz!u6TKFUC-k2{F zsQ!1U*?qV$ES3@R-sIGj)kEXKlT{^~z8CSs0Z|Yp{zniHpkaX6mXHuj`pkfsJPVF` z;H>&KCG_8q*|NcYDStL-KJ(A)h19jNav#QP42U-en*6$8kqp)^GY_444Tc8?X9sFP zK{sZ6aZ0}Vo_53&CNQ>)xSsgRCZBK*Fe7gcWVLmz<9e{C^))`w4BN-f&c$mV^<|~= zhTFKVxMXl#c`np(>_fnL>)Ne^<)st@p~DD7l-ElB`ToGlyDG^dO)q&0KSA}QeSrYo ze%iX~91koU@}Pw1lC?w_5bxQqcwlRjxX)TuNm%hrMO+!jBp(M7de~iNoyCA4eDW>q z)JK12iz0oCPu?POZ5WgtaQ?$eI?SD3_Ld*uL;J@ZU@9mUEeKY23|*`+pcCrPTKd=a z%7tTPC6PZq*L>cwIy#V)pw?*+IkFJ~?Fb&AT8Nw5Qt~f-wLV0ex6?-CW^5_=8$hv^ zDfb-3%l_g;tBD1OCIMfytR|kjb@^vH^TSaMp8nRUX*XD)s9alD7-0y>I}kPk~mc+NpBtSeLDXmCOHl( z+o>D=Wcn#iu{lsoviv1Tc^;}*C^ZPra~qp%#OpJ=PxF{M(KCQmM@ZnWQ~?j{nrVS8 zN;nBjtw}jxUSZgOmT=C!lgrl-SA9DZ8f61DRHq}KXtje~^_`Zo{h9Gj%qBQsYSO#K z9tj-?_9qs=9v{hp2ftdE58X^G{44~M70I#H;?n9IK;O?H=)m-k2}g5h%fFUA2rV9_r*WM4`(=bw_`k7{60%M?&_hEm z`nP6`iU*}>fVj?v9+5_bjh#|=;>!l%Vgos5c_D)m*YVhP?MyO&QJm5TLA4>JxndtC zE1b1b4s7QIL`exv%1jrAFML>MF>u+X8$@c7=3i9GhL>OiiS1eDm{mg60svL6sakw_#Gn1=qY0rw}1RW6`=)h1> zq%;inVH6BC!l->-0EYTksy_`HgY1B8W%tU(y_U_yJ-_E2`Nj41NRm-7e(q${h&+tf z)}h#iCe@Z%8}SSzEs@8Xl}#UPHN5%DM=fDF3m#vA@TKveC*;X_}A|dkt5& zgot*|Jolc-&YXeWJyR>{Zmi7lun&W>O=Lo_az$xgq)EBw%g&(5-WQ=c%73DKYh}IV zk)PPN8DXxuc*$+XOlM9rSOnc7Tva=4zsNYfzln0dU#WXfWL=J%)cmY5*uRXXY{YxF z>?Zcg9fi#_wN!TeO-0QdBqb$+kTYT83yD*@KQCoEuZu$h(CW*%HGo0o@}Mo^o^Qik zi@HaX2Gu%w#pa};?MwW<#NP7fCdIZvr^NPcR(Nh#dbflOV3IGxwV$w~<7%C@?}hK4 zwemJgQ4oW&w zqG1nPU=IcK*HDdTEg}Bmcw9Y73^r7DocLW~a2=kfvFI%F!{}~fA3lLC{^Q^7=0yn{ z;f6j+hqD!Nm4ZtZ~U`L(ob6BlQnCfv>f4T zT3hb);*T29$aFTOKW$PQ*ojHzKzCV_-&-bq_^8BJE$a@FC^=Ui;rUyX9iiMX>;BUj zjNx0`Db+SJq4%*P#PK1bpZc&1!~1Fnf%SaZx+gm0le+M5ETvkuAbZ#)oi9q07<&j& z@~Vj|gRgNY(wB*uYu>yv;}6Q>Br+OoB-^7Fa3@wF42mlL91L!sh)c4dLvMQJ_;ne> zPCgahV9s=wmL)aZ;C(0IQfgeU?bSt5>!ilq2fZxN-5+M75No`Ye& zgSbT3!p&K`7l=t-`1QP3PF;>9C3@7jG^Q|1QSsEvf8!Vw^cV`OcxCQX)LS0nfqnQ` z!B`+oNOQ-gPF98{RZu`s*Y?;Jgf>hmv+lzJ!T7-h-)Bju_+BE)oGAX{6pK7r73dP8 z{KHRQhA%rz*5#5by?>L8HTq-h=ZPTvU>vl4%JLQ||AIlO!|1hmBNPqUh19yold9om zI%Lr)T|$~Bf?!;BF7ZD22%2&6vFaa!?1JAsC_Qo1f(Xw&vYc4BCPL(T3z5x=1oU=K zQqs7{K4z}3rj^!UpSU`c1WJE1=>F_9Y9a19^Q`fqyLjmh!o1E~U-7UBy{K)5WV{;W zaF?1TTlbB-B0>ScefW)hxumuK8sf-vNM>z z^rUE$B|sO&Ko`Z>5pCxz)H>@l$Sfr8R87D`N7+^8JQt3g0ILAY``4n32Kyh1qYAY$ zpOAXv{v4u-E1j+EP-Nqf4qSF$b)FM$Ojl5?jj_QWBbMaf`%yBPa>#nybX z+>9FXZD9i|;PV=?%mwGlVO7R3$wMOhl+BbKOV&{{UdTNKl7~1upnwO?TC15)JbVDM zqK!K=8SluMJXKMsY96d}D~UcQ(`t`({C&R`qD(2aU4&h*O4H*}vvXHAZuugq^!)|s zq4z1$;y(fl7`=0u&ML8oVr)SrzhaWNMXoqvN413j1KuNTtxaA5yJ}13!OPAO_K9f2 z#_I)=q4!w;zDOGh5=2z;C1M4D=J>x-3u?${IU7){$)a*aTXO4E zL~vBE+$E8H1JyT29|hwdUL#*8B}MD*2h<)#OVWm%2U>BxGpUU9S%~vZ&JUf~2+!uJ zimtslYJ+SJ?k3FW&rf;=W!CN&^|qhrSql2ySt+CI;%MJiVsFB!9YMp@=WPMUnD*+l7hTW8~ z(ZU%LJ#SPw8^KbGaT4+)JS};X=SZ_!NEtqK2a*YvGS8kUCz>wk8f304C(+%Om808~ z@9l(4=}i%vQ$+seMsLJ1!#C4xYpjvH;;tUbjz)h_IWaen-JOcCgLQx=JGz16+!awb zVZf6^<<7`+c!eRNqL?E^IG8Ku<%}zX{7q2gtK<5XXk@tP(K64YuSYhFGo5*H*hiqVter_H(j7cu6gR_- zCgSMdKQ=)g)Edm?+8!fD3i~^S^_Hi^Vvl#;bc%B>tR>yaAjp{ms!LCf{#v*AVp4un zSW^k1iJh`6nV0Hpz%?i00Ko&2_EF9ygHWQ@k(5ktWSM4Jhb3IZ{c{K&A=c?E>KbJ_ zE1vmpghfZlMhbmiLHm{HGuACDG`0+R2-e*@V5=i>K*Mx%$ukvrJ!=V9Eh_pgfs>SEN7xTy4b3$RV+j^GYdECZxg(nQP}#9Mb`eiX z%E8O>c>N6)CI-JJE_LHjzbm?Uk$j>>ag}FiW%gthbl1fVR**BqinQY>j#*SOGUNpR z>clgguc%^7ys(6gX^1k1>n%!$toB1(dqO { const response = await client.get( - `${ENDPOINT.BOARD_SERVICE.POSTS}/mypost`, + `${ENDPOINT.BOARD_SERVICE.MY_POSTS}`, { params }, ); return response.data; diff --git a/apps/cm/src/pages/dashboard/api/schedule-service.ts b/apps/cm/src/pages/dashboard/api/schedule-service.ts new file mode 100644 index 000000000..34b8c9dd2 --- /dev/null +++ b/apps/cm/src/pages/dashboard/api/schedule-service.ts @@ -0,0 +1,66 @@ +import { client } from "@/shared/api"; +import { ENDPOINT } from "@/shared/config"; +import type { PageableList } from "@/shared/model"; + +export interface ScheduleParams { + siteId?: string; + schdlTtl?: string; + schdlSeCd?: string; + schdlBgngYmd?: string; + schdlEndYmd?: string; + reptYn?: string; + commSchdlYn?: string; +} + +export interface Schedule { + schdlSn: number; + siteId: string; + schdlTtl: string; + schdlSeCd: string; + schdlSeNm?: string; + schdlBgngDt: string; + schdlEndDt: string; + reptYn: string; + commSchdlYn: string; + schdlCn?: string; + actualDate?: string; + atflCd?: string | null; +} + + +export const getScheduleList = async (params?: ScheduleParams): Promise> => { + const response = await client.get( + ENDPOINT.CMS_SERVICE.SCHEDULES, + { params }, + ); + const data = response.data; + + return { + content: data as Schedule[], + pageable: { + sort: { + sorted: false, + unsorted: true, + empty: true, + }, + offset: 0, + pageNumber: 0, + pageSize: data.length as number, + paged: false, + unpaged: true, + }, + sort: { + sorted: false, + unsorted: true, + empty: true, + }, + totalPages: 1, + totalElements: data.length, + number: 0, + numberOfElements: data.length, + size: data.length, + first: true, + last: true, + empty: data.length === 0, + }; +}; diff --git a/apps/cm/src/pages/dashboard/model/dashboard-interface.ts b/apps/cm/src/pages/dashboard/model/dashboard-interface.ts deleted file mode 100644 index 9e038eef7..000000000 --- a/apps/cm/src/pages/dashboard/model/dashboard-interface.ts +++ /dev/null @@ -1,32 +0,0 @@ -export interface SiteStatisticsContent { - siteId: string; - siteNm: string; - accessHour: string; - accessCnt: number; -} - -export interface MenuStatisticsContent { - menuCd: number; - menuNm: string; - accessCnt: number; -} - -export interface Dashboard { - memberTotCnt: number; - memberTodayCnt: number; - pstTotCnt: number; - pstTodayCnt: number; - accessTodayCnt: number; - accessBefDayPer: number; - apiTodayCnt: number; - waitMemberCnt: number; - waitCntnCnt: number; - notiList: []; - schdlList: []; - siteAccessList: SiteStatisticsContent[]; - menuAccessList: MenuStatisticsContent[]; -} - -export interface DashboardService { - getDashboard(): Promise; -} diff --git a/apps/cm/src/pages/dashboard/model/table-columns.tsx b/apps/cm/src/pages/dashboard/model/table-columns.tsx index cee8e7412..ea1e4f0d0 100644 --- a/apps/cm/src/pages/dashboard/model/table-columns.tsx +++ b/apps/cm/src/pages/dashboard/model/table-columns.tsx @@ -1,6 +1,7 @@ import dayjs from "dayjs"; import type { ColumnDef } from "@tanstack/react-table"; import type { MyPost, NoticePost } from "@/entities/post"; +import type { Schedule } from "../api/schedule-service"; const noticePostTableColumns: ColumnDef[] = [ { @@ -27,20 +28,31 @@ const myPostTableColumns: ColumnDef[] = [ accessorKey: "pstTtl", header: "제목", }, - { - accessorKey: "wrtrNm", - header: "작성자", - }, { accessorKey: "regDt", header: "작성일", cell: ({ row }) => dayjs(row.original.regDt).format("YYYY-MM-DD"), }, +]; + + +const scheduleTableColumns: ColumnDef[] = [ { - accessorKey: "inqNocs", - header: "조회수", + accessorKey: "schdlTtl", + header: "주요일정", + cell: ({ row }) => { + const startDate = dayjs(row.original.schdlBgngDt).format("YYYY-MM-DD"); + const endDate = dayjs(row.original.schdlEndDt).format("YYYY-MM-DD"); + const schdlTtl = row.original.schdlTtl; + return ( +
+ [{startDate} ~ {endDate}]
{schdlTtl} +
+ ); + }, }, ]; -export { noticePostTableColumns, myPostTableColumns }; + +export { noticePostTableColumns, myPostTableColumns, scheduleTableColumns }; diff --git a/apps/cm/src/pages/dashboard/ui/banner-list.tsx b/apps/cm/src/pages/dashboard/ui/banner-list.tsx index da2ee5641..865540672 100644 --- a/apps/cm/src/pages/dashboard/ui/banner-list.tsx +++ b/apps/cm/src/pages/dashboard/ui/banner-list.tsx @@ -38,7 +38,7 @@ const BannerList: React.FC = () => { if (isLoading) { return ( -
+
로딩 중...
); @@ -46,7 +46,7 @@ const BannerList: React.FC = () => { if (!imageUrl) { return ( -
+
이미지 없음
); diff --git a/apps/cm/src/pages/dashboard/ui/dashboard-page.tsx b/apps/cm/src/pages/dashboard/ui/dashboard-page.tsx index ec6fceee4..5f9ce3440 100644 --- a/apps/cm/src/pages/dashboard/ui/dashboard-page.tsx +++ b/apps/cm/src/pages/dashboard/ui/dashboard-page.tsx @@ -28,6 +28,8 @@ import NoticeList from "./notice-list"; import BannerList from "./banner-list"; import SupportList from "./support-list"; import DataStatusList from "./datastatus-list"; +import MyPostList from "./mypost-list"; +import ScheduleList from "./schedule-list"; // Chart.js 등록 ChartJS.register( @@ -179,22 +181,10 @@ function DashboardPage() { ) : ( !error &&
사용자 정보를 불러오는 중...
)} -
-
-

일정 알림

-
-
- -
-
-
-
-

내 작성글

-
-
- -
-
+ + + +
diff --git a/apps/cm/src/pages/dashboard/ui/mypost-list.tsx b/apps/cm/src/pages/dashboard/ui/mypost-list.tsx new file mode 100644 index 000000000..ec5f97d48 --- /dev/null +++ b/apps/cm/src/pages/dashboard/ui/mypost-list.tsx @@ -0,0 +1,47 @@ +"use client"; + +import { useRouter } from "next/navigation"; +import { useQuery } from "@tanstack/react-query"; +import { getCoreRowModel } from "@tanstack/react-table"; +import { PostApi, type MyPost } from "@/entities/post"; +import { ENDPOINT } from "@/shared/config"; +import { useDataTable } from "@/shared/lib"; +import { + myPostTableColumns, +} from "../model/table-columns"; +import { Button } from "@common/components"; + + +const MyPostList: React.FC = () => { + const router = useRouter(); + const myPostQuery = useQuery({ + queryKey: [ENDPOINT.BOARD_SERVICE.MY_POSTS], + queryFn: () => + PostApi.getMyPostList({ + page: 0, + size: 5, + }), + }); + + const { tableComponent: myPostTableComponent } = useDataTable({ + query: myPostQuery, + tableOptions: { + columns: myPostTableColumns, + getCoreRowModel: getCoreRowModel(), + }, + dataTableOptions: { + variant: "line", + }, + }); + + return ( +
+
+

내 게시글

+
+ {myPostTableComponent} +
+ ); +}; + +export default MyPostList; \ No newline at end of file diff --git a/apps/cm/src/pages/dashboard/ui/schedule-list.tsx b/apps/cm/src/pages/dashboard/ui/schedule-list.tsx new file mode 100644 index 000000000..3cbfe0fe3 --- /dev/null +++ b/apps/cm/src/pages/dashboard/ui/schedule-list.tsx @@ -0,0 +1,70 @@ +"use client"; + +import { useRouter } from "next/navigation"; +import { useQuery } from "@tanstack/react-query"; +import { getCoreRowModel } from "@tanstack/react-table"; +import { ENDPOINT } from "@/shared/config"; +import { useDataTable } from "@/shared/lib"; +import { + scheduleTableColumns, +} from "../model/table-columns"; +import { getScheduleList } from "../api/schedule-service"; + +// 날짜를 YYYY-MM-DD 형식으로 포맷팅 +const formatDate = (date: Date): string => { + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, "0"); + const day = String(date.getDate()).padStart(2, "0"); + return `${year}-${month}-${day}`; +}; + +// 오늘부터 한 달 후까지의 날짜 계산 +const getDateRange = () => { + const today = new Date(); + const oneMonthLater = new Date(); + oneMonthLater.setMonth(today.getMonth() + 1); + + return { + startDate: formatDate(today), + endDate: formatDate(oneMonthLater), + }; +}; + +const ScheduleList: React.FC = () => { + const router = useRouter(); + const { startDate, endDate } = getDateRange(); + + const scheduleQuery = useQuery({ + queryKey: [ENDPOINT.BOARD_SERVICE.POSTS, startDate, endDate], + queryFn: () => + getScheduleList({ + siteId: "", + schdlTtl: "", + schdlSeCd: "", + schdlBgngYmd: startDate, + schdlEndYmd: endDate, + reptYn: "", + commSchdlYn: "Y", + }), + }); + + + const { tableComponent: scheduleTableComponent } = useDataTable({ + query: scheduleQuery, + tableOptions: { + columns: scheduleTableColumns, + getCoreRowModel: getCoreRowModel(), + }, + dataTableOptions: { + variant: "line", + }, + }); + + return ( +
+ {scheduleTableComponent} +
+ ); +}; + +export default ScheduleList; \ No newline at end of file diff --git a/apps/cm/src/shared/config/api.ts b/apps/cm/src/shared/config/api.ts index 241188bee..d6e151094 100644 --- a/apps/cm/src/shared/config/api.ts +++ b/apps/cm/src/shared/config/api.ts @@ -61,13 +61,17 @@ export const ENDPOINT = { APILOG: "/cms-service/api/v1/api-logs", SITE_AUTHORITY: "/cms-service/api/v1/site-authrt", CONNECTION_LOG: "/cms-service/api/v1/cntnlog", + SCEHDULES: "/cms-service/api/v1/schdls", }, BOARD_SERVICE: { BBS: "/board-service/api/v1/bbs", BBS_TEMPLATES: "/board-service/api/v1/bbsTmplt", POSTS: "/board-service/api/v1/posts", + MY_POSTS: "/board-service/api/v1/posts/me", POSTS_COMMENTS: "/board-service/api/v1/posts-cmnts", POST_EVALUATION: "/board-service/api/v1/pstEvl", + SITE_AUTHORITY_LIST: "/cms-service/api/v1/site-authrt/user", + CONNECTION_LOG_LIST: "/cms-service/api/v1/cntnlog/user", }, SEWERAGE_SERVICE: { PPL_LENGTH: "/sewerage-service/api/v1/ms/pplLength",