From 0fee703b842b99fd34b3c73aa313919bac3d635f Mon Sep 17 00:00:00 2001 From: beabigegg Date: Sun, 17 Aug 2025 15:26:44 +0800 Subject: [PATCH] back --- .env | 19 + .../action_item_routes.cpython-312.pyc | Bin 0 -> 6164 bytes __pycache__/ai_routes.cpython-312.pyc | Bin 0 -> 2905 bytes __pycache__/api_routes.cpython-312.pyc | Bin 0 -> 23456 bytes __pycache__/app.cpython-312.pyc | Bin 0 -> 6003 bytes __pycache__/celery_app.cpython-312.pyc | Bin 0 -> 453 bytes __pycache__/celery_worker.cpython-312.pyc | Bin 0 -> 529 bytes __pycache__/models.cpython-312.pyc | Bin 0 -> 6864 bytes __pycache__/tasks.cpython-312.pyc | Bin 0 -> 22250 bytes action_item_routes.py | 112 + ai_routes.py | 40 + api_routes.py | 349 ++ app.py | 95 + celery_app.py | 13 + celery_worker.py | 14 + frontend/.gitignore | 24 + frontend/README.md | 12 + frontend/eslint.config.js | 29 + frontend/index.html | 13 + frontend/npm | 0 frontend/package-lock.json | 3805 +++++++++++++++++ frontend/package.json | 34 + frontend/public/LOGO.png | Bin 0 -> 3392 bytes frontend/public/static/css/style.css | 97 + frontend/public/vite.svg | 1 + frontend/src/App.css | 42 + frontend/src/App.jsx | 68 + frontend/src/assets/react.svg | 1 + frontend/src/components/Layout.jsx | 52 + frontend/src/components/NewMeetingDialog.jsx | 82 + .../src/components/TextProcessingTools.jsx | 116 + frontend/src/contexts/AuthContext.jsx | 88 + frontend/src/index.css | 27 + frontend/src/main.jsx | 16 + frontend/src/pages/ActionItemPage.jsx | 174 + frontend/src/pages/AdminPage.jsx | 237 + frontend/src/pages/DashboardPage.jsx | 291 ++ frontend/src/pages/LoginPage.jsx | 155 + frontend/src/pages/MeetingDetailPage.jsx | 308 ++ frontend/src/pages/ProcessingPage.jsx | 228 + frontend/src/services/api.js | 94 + frontend/vite.config.js | 15 + migrations/README | 1 + migrations/__pycache__/env.cpython-312.pyc | Bin 0 -> 4370 bytes migrations/alembic.ini | 50 + migrations/env.py | 104 + migrations/script.py.mako | 24 + ...a44b_implement_user_centric_status_and_.py | 34 + ...ation_with_users_meetings_.cpython-312.pyc | Bin 0 -> 39764 bytes ...t_user_centric_status_and_.cpython-312.pyc | Bin 0 -> 1727 bytes ...d_result_fields_to_meeting.cpython-312.pyc | Bin 0 -> 2713 bytes ...add_status_and_result_fields_to_meeting.py | 52 + models.py | 93 + requirements.txt | 28 + .../__pycache__/dify_client.cpython-312.pyc | Bin 0 -> 4163 bytes services/dify_client.py | 93 + static/css/style.css | 38 + static/js/script.js | 275 ++ tasks.py | 431 ++ templates/index.html | 168 + 60 files changed, 8042 insertions(+) create mode 100644 .env create mode 100644 __pycache__/action_item_routes.cpython-312.pyc create mode 100644 __pycache__/ai_routes.cpython-312.pyc create mode 100644 __pycache__/api_routes.cpython-312.pyc create mode 100644 __pycache__/app.cpython-312.pyc create mode 100644 __pycache__/celery_app.cpython-312.pyc create mode 100644 __pycache__/celery_worker.cpython-312.pyc create mode 100644 __pycache__/models.cpython-312.pyc create mode 100644 __pycache__/tasks.cpython-312.pyc create mode 100644 action_item_routes.py create mode 100644 ai_routes.py create mode 100644 api_routes.py create mode 100644 app.py create mode 100644 celery_app.py create mode 100644 celery_worker.py create mode 100644 frontend/.gitignore create mode 100644 frontend/README.md create mode 100644 frontend/eslint.config.js create mode 100644 frontend/index.html create mode 100644 frontend/npm create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/public/LOGO.png create mode 100644 frontend/public/static/css/style.css create mode 100644 frontend/public/vite.svg create mode 100644 frontend/src/App.css create mode 100644 frontend/src/App.jsx create mode 100644 frontend/src/assets/react.svg create mode 100644 frontend/src/components/Layout.jsx create mode 100644 frontend/src/components/NewMeetingDialog.jsx create mode 100644 frontend/src/components/TextProcessingTools.jsx create mode 100644 frontend/src/contexts/AuthContext.jsx create mode 100644 frontend/src/index.css create mode 100644 frontend/src/main.jsx create mode 100644 frontend/src/pages/ActionItemPage.jsx create mode 100644 frontend/src/pages/AdminPage.jsx create mode 100644 frontend/src/pages/DashboardPage.jsx create mode 100644 frontend/src/pages/LoginPage.jsx create mode 100644 frontend/src/pages/MeetingDetailPage.jsx create mode 100644 frontend/src/pages/ProcessingPage.jsx create mode 100644 frontend/src/services/api.js create mode 100644 frontend/vite.config.js create mode 100644 migrations/README create mode 100644 migrations/__pycache__/env.cpython-312.pyc create mode 100644 migrations/alembic.ini create mode 100644 migrations/env.py create mode 100644 migrations/script.py.mako create mode 100644 migrations/versions/919aff0aa44b_implement_user_centric_status_and_.py create mode 100644 migrations/versions/__pycache__/3b11caf37983_initial_migration_with_users_meetings_.cpython-312.pyc create mode 100644 migrations/versions/__pycache__/919aff0aa44b_implement_user_centric_status_and_.cpython-312.pyc create mode 100644 migrations/versions/__pycache__/ac069534da31_add_status_and_result_fields_to_meeting.cpython-312.pyc create mode 100644 migrations/versions/ac069534da31_add_status_and_result_fields_to_meeting.py create mode 100644 models.py create mode 100644 requirements.txt create mode 100644 services/__pycache__/dify_client.cpython-312.pyc create mode 100644 services/dify_client.py create mode 100644 static/css/style.css create mode 100644 static/js/script.js create mode 100644 tasks.py create mode 100644 templates/index.html diff --git a/.env b/.env new file mode 100644 index 0000000..0d5f07e --- /dev/null +++ b/.env @@ -0,0 +1,19 @@ +# Dify API Base URL (Common for all apps) +DIFY_API_BASE_URL="https://dify.theaken.com/v1" + +# --- Dify API Keys for Specific Apps --- +DIFY_TRANSLATOR_API_KEY="app-YOPrF2ro5fshzMkCZviIuUJd" +DIFY_SUMMARIZER_API_KEY="app-oFptWFRlSgvwhJ8DzZKN08a0" +DIFY_ACTION_EXTRACTOR_API_KEY="app-UHU5IrVcwE0nVvgzubpGRqym" +DIFY_STT_API_KEY="app-xQeSipaQecs0cuKeLvYDaRsu" + +# Celery Configuration +CELERY_BROKER_URL="redis://localhost:6379/0" +CELERY_RESULT_BACKEND="redis://localhost:6379/0" + +# Flask App Configuration +FLASK_RUN_PORT=12000 + +# Database and JWT Configuration +DATABASE_URL="mysql+pymysql://A060:WLeSCi0yhtc7@mysql.theaken.com:33306/db_A060" +JWT_SECRET_KEY="your-super-secret-key-that-no-one-should-know" diff --git a/__pycache__/action_item_routes.cpython-312.pyc b/__pycache__/action_item_routes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d092ad10119ea27abd22f125a4fa584c083c22c GIT binary patch literal 6164 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 KTLMfO*6^RQ<#7oB literal 0 HcmV?d00001 diff --git a/__pycache__/api_routes.cpython-312.pyc b/__pycache__/api_routes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4906f3e8109c34437d39726a21c05bf5e3da6eab GIT binary patch literal 23456 zcmcJ1Yg8LqdSFQ^p@I?!5FkJpgoVNK1N=5N*cclOel)mk?6zrlt7S@nWROUe@PmkM zdS{ZxNpEcLOvZS-vu1WDXYgrfhfZd9n4CFhJ&)e$Y<_IXr9PrH%w}@dyE)$7vrEUl zC)rMZ?DySLJp={ro+NeP>ej9Aes!PU`_`Z5=jTyy4gIrk5C5W>qW&x1D3>*pdA zdlW};rV*-N{x$WR;NCo99<}saM(KWf)Y@+y&FRk>we{Of2xA#xMsxdfNAvpgM%jLL z)ZT9=<@8AYXhDAg$y-MpqmF(D$>)p|ju!P7jTZM8k2?FEqb2<%q}(=AI$G9WHtOnk zjh6S9k5=?oj8^tnnkX|B%;A`zo6CKa_kl%jYkw8DpJTsn>faEo3LjEBqWyAqE`P}M zsNe&$T*f)RPJNJh++VXsox&A$iga~6Yt$*`oci}bTl19na3xxOrL4bp4Lqgm;3+e} zvvCbP#o2wxYLCkRk9Q3`%CtBMZ|;156ETVDhdr)^!GWHm`wa(>i$S4ey*pht)7F zOgn{Og!2#b(NRAa;)4URD1S4Zdvs(xIL3z}u{1j{&hx=Y%pVvV^U-PN03Qs*g8sn3 zKu{3;vFO!cByA60kNFWZAmGx4L&2CIOF|sf3&n1xZJ83EDeVw~fH3GE42=XMfzcoo zF&rR_g&OdD2xoH^V$bup=jhpEI0}s$QcNZ1fhk+!5c9?FaXUO z=R#3`EFfG>mqJNI7~n%!pnY1glN66&t7A}0hII<#qoV;nG@&od35pjCdfd` z^2YfQ{}>+}4BZ&Wa1=8C$T^WCJzs+LaF2?cVx$<8upTZ`ddsPbI7F3 zAZHmg51P+W>*I)*}|}&HUG6xk^=IY)Z=}EiocJ zAavNS)X{#!4lS?b;ufVgmqS`i$BL9^;bJAH{VE*tJt|JWNBx0$()xmTmTGmCT%3wq z6^=id1ATHSPqg27j?yj@70=-)9Pt%%V$+QlBhQI1wj~91j-_3Z6(b z<{5}aVu4V^6Y$_-_KXGi*t0vZAkx%CVNX;p6kxRu#Dd&2BpegP=Ob4m(d!ZU8NvJP zb9myj^SGSSRzxK5H0Bv)hwwP^X>(La(_?|yaGDXuMnbrd)Aaawh)Y{B-IJ!n(NH8! z3xR7vpDmp~J~k2!z`l--aIl#OGXK@!%`}Z@(?wA}G!%*iM$~B$F`+9p% zUv59)AC-5sKOhJpAr^?lJlj1Nb~Wz2jN6Wnj>m#R;}~ph?1NwKKoGhB?c#U98=dek z{5MFZs70IOo7eA6-knU?>J}Z&Zw}2|7dQ8a)xA>L8S(6SvGjuIxF9kYme}Ikhi)C3 zDNnE)r#cpG>^qZhPtKU1*ecap2gT|ZsjPKjKrB5fI*y9W(NAscQq|VEj_VIzC?vj+|nXdv@X1ysA!umSlUqgp#OgVdzWW=<_?Qn4vLj6(~hN* zvU^>3yY8L7dwO=myhAEEGM&4~*l*|F%Dv-DGF6L?@|n8nw?w9Tk#&5tVP?Nr*DO{Z zkctm3921Lbl$I-b?U$q9H$T#diaF+1p2f|N zR8j&&TP^2o9HS#3xkzAqc|BP+{dCq4}(|i;bHx|PUqw>q5 z0LO)p>A?ma7zu<%1(23z#X&9nsokoNE(7ZeN(2M4bD6+}FPRV+e`Pn$y=4=N-@noDSu&yuEb zuLB{1KJqQ_P{4Hvl!0%;dRDS{`7X$N@!>;Arl_ZEaf)>(ShvJ(nCe(!9k&nOI+$W> z5^T*}$@j`1md|gIe1}A~Mq&@A*p39-A+g7&I$&Ggp;Lw4M4@-KY9^< z2bNr0zJF|i{tvbv+WzFU_*x+K+F;_fK{0mYZzyWqbkzKr`g7iN%=|e;m3Nq@?Msfb z+0#kKPLbIORN_vj=-w+j_et#j1*gciigYW#6Iwfw+r$TlfLaCltSzTX0RI;F{XOc- zZaLUMsuTd&Gncl3CQWNVs2d9;022>VfZ&KB6($#F;b`5`vl3|nCyrcUm4_=Oz|9S| zXWXPMY@@BIY+pY6%`3R(IVzXZ$rmP~y=P>iNlV-kR;2;0HF33fCMu@N2u54kkh81A z;f1wPAX#xKy@I;hc(R;bH=g-8o?a?esZ_0__)C-Y3tGBCf!2O?@2XZx!yYB4{f2R~ zthl%WSw2#TSyp>3oI}^%!a?(Z`4YtyP10}DAmxzX>!$0}4a+6!y2)2OvE|J8m66bZ z2PFS7kQ!p1L7*Lx;B`VvJo19)14w`x<=ws?TEk=izu0&_L(V*b2&d8;Pk;|XJy`+Z zktXu{5Za|dkAU95-Sh-+z-AJj-3R)_9|w?!X88?BS&+L4LSQI3QGxY5vZ}#(gmI#5 z433YC+0 z$oa^Xz`#`=*HStM$lnk&0|(A$R zLIaH06!m!yWq0bRCx|h(Z``^ulP5X6Q{CBjf5|%UHv^fQv5B>vqU*Ti==#_xI!=qs z>8BtGO}sskvbhsB_v}T{=9X-YDchceZBNp+FH`5B=xUK1C>c50MW%h3&b4-$mYlBH z^7)*kbN@86$P}iS4GCt$%y5!vSYq;S=iSP?U2v=5&W$AF$=s)yiUd=UWZZ}~SM(kh zU2T%%$YZbQ=oFdGzg=QW{+hBNX1RWfaVHpelG(7tI8#hzf~ia~o&@6&z0C_n3l_1q zHOU;xwD6GVIxIQb9z(A>K4CikZrO&2z7RYxU_W8neaCiDKi!qvSz`HVOM5}5!}3wC z32r`eSRtLTHwC!SP^1Z`KuBAXGbKQ=P!$AC61Ty${D{ zV|O}GH2?jcx$%T^uf*;X>3#q2iF2=jlksDxt9>T}ayMz9@rw8sz`=@uRKASFY$HCe zj6cks%4-bg&Or25>b_v^OcQzE^S(~r3~Ajz7;%B(pA6_odLd~}Qh#h2#*_%v2P zjsg?PQ29k)d7g0L&$-%jn5^l+7U7nB9$O)jDMR;9;6utXSCMZhm@#xXszD=je+*_57U5x86~ zU-#w$@@7^Ug19MedE`)APRHr6s<$aHpkeAoK~~+`n6TPO?$V} zC#b8ACbV)LK~8xa2O<|}dqpzge-dv` zVS+n^?}5bUSV>ZG&B)@5wjouah400uD68;iFnJl1vzXvcT_u9Z>f8l*v{L?HGge-t z6Z{|moI{{oMFjcML^w;+%a%@7+<_L@e5?7+@tNZi>jh$ z10jjFr|60VT`{vcNqd**oOe#Xee#{2w|nk1C+VupeTptk(4|S*g}PyL%IQrwy^?d2 z#MaMQM0Tr4Z5_0?LAq9z^=SY`!ynNaq3b2x^F00@rE)5pOGmkY(Q$_s^kUjTfg=? zd4RzsgF=YDW%N ztdnk3a*norT^pPk9ThwpZ$fK0@~hKPOV%N!s7_66B?4(iUKt2P&>+u&u{{>_#D;?* z-h*a#u$V>1BQZi_zbH5l8$6=_ z>9(n!PuYqL>`u|OOLFX@mt;NF3@ua< zD0(Waaut$|X2unaXO%>p3r<@jBd6xR1fqu9Qf?0@)hn-X>BOlh!)Nc z?^21pRtpGoeimUS5;G8H)gJ+b`7#(9*Kdabdr`&;+EJyv&xkdIYn7+kFR&59GKjfR zFHh?kd6ABk7ptUPHaAjecGQt_=L<+VAA*^yp!EYnV|ksn1owVlL9ND9$LsO%nM?3C-8!DhH`ZJVLz`Y`w&Jt_uZEGib6x)-ga z?wU}JOH>xrR|w@q9?z!X#9YXq#~K-1;TYsKa-Lxdod`g52twF#LUcC65*dn+cFk~k z4S>D||H9s{O5?u*>CX1(WJ~rS$!F;Oe$mw|ISwpQ%IYjQhj z%TG7A7j?8*es;hFH$Q8$LJEGOjCVWRHLDWlKZW)1BAXFsA~N~^(Rq{5sIlTwHa9Uc zsFJ=0#HlhDF)|oIs2&rYH%YZQaWtoo8_CJY>FW|_O>H+Ks%ncZn$s4|0h;4hfrx2u zQPp>?X9^T&d&GQ@AxA(SRnq#UrEfi1Tfg@D(ziNhU?xE3zT#5at1u>xIE8iOe9MXo za2wvfx=dH2arM*i&edfr-yGh(Hq2y>rW?j{z>;j!S(0sW+j>1yt&ytPYL#Yj2_kyd zA7k&@Z36~Yr#ubUD>>~q?9=i}j?0T%QQJ^P9dM}g1Z$hsu`avHx~y+ni53FC8tcl~ z#BE>`&+p-P!3)yXSad8jkhUwKEJRo*3W>K5pAfH@{^4rR*aUkb;yJ@dhj{QNflcNH z;N@>(auwf@r|2VrSULxyWMbn2F$GOj9uELF;?QaGZ6qeWkgfwZo z$_k?suPQ1lm>jVsgPz4hd=lthWCQ?v5JHB~!0cmWe;JNWx==r&esDs_&@6h;GLML^ zlV&n^0=g1O_@ICm7s4eWk)3OfVQ^hStdj!4|2BZU5C6hj8jpPE&9~p2DSKk80q&4; z)Fd1=lB0H-UMwuR$J}LRTvB1}v~|&4^Pu^D^K6gg-YqiapE^nsRoj-Fl`~!9rjw%k zl;k}9@qp-jS+u{rYC;PPD%02LL{3yWb|cw=KHrK4){>1=FWKFQD=rim`mAC24P1vKQce%Dy3C-;lJ|;Hz6w z?#6_>QF8B)oIB@tLrjBc-}kwlDsXkF)S>Z4LuS2^?1?%b|Y%SWy41zm-fpXZt2=I4c0NGB>) zo-144G82l%H=l*S1c-P6lOag5)FstbFafz2ab+VM=%YFYT<*H#qN;yTN3|&eFIaCZ^OW{O9hBV3 zwMLs%nv4ng}Wr0-Z2xj?9ND~nDw*H#86FK(!YWePkD-X0Aa4D(nfi zeO0-z=>XY512na1HjaVi0#uO3k{9L@089{V&caj=3kC^mw7Frio`)RvGpaH zR}$d`l<(+32$(zv=2MJn@j$TgsGt};iEizylqCQRnMvoNyBB=Cdv@%RgKOg0{6m-= z!Gv@UWd&JRK8Crgm>?DANw23dcMB8T?ffJrZ(?#26V0E6sxuy87zEL2nE15#C=|i5 zfIN-%^S_0aIuX>NoLx{1q)bTglQCQA@G8xg3BZ5~q1_|=ZNTzF_!oYvNCu9w+oQKe zQw8;jg8JDBsbJSs*Hc>okrqlNTXnXy@GEd0akttQt2__7?|09>B2{gl?t1s7Mb>#I z2Jw$i39Fy(U2;`_<0eKk&t8yR+vaTv*Z%45Po3`XSZ2FYbq5l42PDtI9}PTik`AAJ z;yDZ8vsSTz6KjH!Yfv1%D!Q(Ug;y6L6#3%)i?hShh9-DR&m!xZ*#j|^i?y4+TmJ3x zxouMI{^_oy9fFQaX6OW4wOGCJ!SMaz*_%@JPN>ie!N|l1*OO$uOWv(1?}3E(z(U=^ zn~8%xlD9YI?Mrz3B<}@8;>j|sLUfOMj}bdF`;&|phT_ikdvD!+OLA?N96pipDFaph z#8wM3#_t{=vDsx3>zVC(!fr+Jpi}f76Wtw>v-7baI!}uBlUXK#nT8~@F{>mKSOfte zr$yIGlA}jF1NP)|B6ALG#CGSM{rB4Lwn@%9iQOd9n`Eb5-P&?PlX@&9OJG1{6BKyr z`TvIGA1W{ac~HqGpvzofvDDO*RR=_X?6C@@k#$rjkeD?*z{*rssMMw?jy5hwrHQk? zuPRO)QT=_k9%7W5Xi%sG`amL4k49Kf!BEGoQTDblO)?p3f?yvTp3VWOES)Ep`Qcd2 zv;PDQ0wJGh5=ck*-@$}X0zw#2XG~kcT@kp+cOa~Ve-|Necc*E@nC;mpQd^)1_WTTh z{tEsDBsU~_$YA#_qK|sR6Lv$!40KX-ost|Vw>w@InU|N?>J(d-VC!c4C3XjfD;Lki z9$deFeSvvg@^jaZU5|6ceJ2ynQxc1H*q256WqFmAG{vIP5uqvTpwa-eM7`8i1t({5 zRY59W7{MZ6VH}GU7e|f)DdNRtfSn{EUl0~-dJ$_j3Mtdp4rfLl##tsH1&5$2dKs-E zICNuHqdD}39gER1A6RpSr+eEw{KtDwcXXcRaYQEQ#_NG={9VZM{{oZW zhs2jh4u@nSF5yhhU}%U(0gXr5jQ3)KG8X?WOvutA%ZX0sg(73)7~>fmCM!J6!Vwg; zirm_*i$^8X58{s#ghvm&dkV(X)p)Ye0Zt%nw(iLE_Sc`w8gOr5-A z{nTc^bAEbcskr1`!`+5d@y0~)#@T~XapT-?B#L*=A5Rn?oI16{Zb-4-1nZqWInPRL z>sMKGuFRTK_NHe#@8NT_C$3xr79Q1pIT(k`H_~`@x?P#+UOAZjEI>Vnf8i1& zUuwpmvYr%MpI}jBV0V3$875u>=o51`3-5$iD$pcR)E!Ah*hMi6Gs zqHcU3IawzW3~a|5J2KLH!49k^BkC#wa$&SKY{uneZ7{mEp&q}X$w@g!EWo3fIs!uS zI0TrFBksTY;oHwX_~z4vKl<?UqyTfA5j`>EZtbMBYQ`VJXZ7rg!RdO6!5ae@i8f&{e-zKrgzRI#}SVx4C z)doLN8?vM*oLn5T=l>p(Ur&m9qz2A})ujT+GMBozP1>T1o4}+E2O`wqXe2Kx2~uim zzFXC#t;#`aaI_f=!R8*Hi3lRT963mX$SxSWLCls~Tx>>O!DCyfMajdFrpc(_AgE-f ziiFGRfJnq_MxWsy0w@E5fp7vcWbR9<<#4o=b9=(MeW6lxZkL=LDQ9=W*)2IwPMro3 z66r$_>fB1yp9NQY88hK-(l<~xq+uh`ik3BdxVp*g{TImn zdb6jb>#0VEO#(g$+@I4D#}2Z&Kd z3X78?)!-a4c%~~e8A&?|4uajbek3YqK`1Z~o{d`tXFNwJiravsq98^tBX^u;ZVRLD zVa274-Xs%e3`fugqgAz{65J|8U2i~J0|NsXs@KJ!nbVBhkP8?*>tayn4vcsV7({(* zv_&=I@kK9!h`>i}pm(aCwFbOq>f04(WMdv*AM+}$4c93-?N@Kr_A1sJ@`z^ng0}C~#z4tswSE1buRm&PzhQT+GUVN)&@k5wFO?&?1`f(#ROZUv)dt+mqi+E zIFBnpZuJVw+#`IDZJFbL7t8#ZL?Q9zrfnHULI#2V=TMj~$}-8}@n_Aur^a0V9zqs^ ztxmD(ktb;fTJK~=NeYN)CE#ubW-4E@qE?)d+;yCd|6>4yuToLM|Aa&qqRQlhbQ#I~ zy2Lht2vk-tm2IBtT`I46FZV(I{ruTMseHRgmoB*~XZAd3z2BO0?@hS(N-j7yRPrka zn646zt>80*$8C~ptJu_*aDkJoWT~uTrb#N>@@Qbb?g!gH+%7d9Nt7L#>Q#(jXf6E9 z!g6pJe(1=8`|hQ0Uy@3irs;QcGveON z4LCaOe(09U_ChIZT>2}vbfzT1ZdlyY{DbZfyBGSCd%9;jh-tDvS+(P1Zn^`Fld=`? zWD-n=z30Tf*PrzI-|tRU?MhVbn%}dKm)Lzws_IBpok&!jNLHN^gCVT8$|$DT12L0*+J#i$;OzC>qt3G@~0+@g`GSwJp4n2 z9U!g-20tS`S+5=A*24?F!lH>Fs%K1Briv`YK;#VCdsbZQ`QCte zYW=ht3p6?(k7^7hoS^88M)~0@N1-4mAM-&|MA{LE#R3DvqxjV%VqF@AQlE1rUDjxD z9z2)nGNHzV2JgT!)Ny3gChzUxL8l{h;c8RjOilqGGp5 zmnmfRsV#51O|rS)7ewz~sb=33+rA&|UU*At=}n%yAinZy>J={W3MZWlK4}S})(Uq0 zU7~BZw-VA>66eLiN*`p$TR3;lmiWR#x zW5Ui>iO@PiRHE;|nCLBOMwS=!OV_E*=?-rfuiWA3N50?p&G$r{efXX2H!=|9No5*OI?J0{-Mjq115jcj0PDav zFpox{bUwU!EE*ArKp4n&YdFw4Ko+0uJK=u4Y<*@3j;Fy_j=-%K zz90V4#K(32+4pC@%q@XCj;r1o|u_I5tzejfU9NIdge z;`r;*UjKCdok92tfLOgV!R!L-!<|DCTPxDFsviWLHBIUcf-MytGiJ6|pi93Vv*k?i z?IAN%hYJY1Y8x^-bPtOFKc$olactl{$8a`uLZe^#8hp);lRezDJkd5Z*@2Xr&XJ$W zlV>86C%`OF8P`BAc8bgs|1p&I;RGQCClh34@pxh8&|$+|pGa3EX);jVGa=ErSz>*2 zyG6E9q#KnXQ&wJ6D}Me8m);tb=Loz+PkFwK>nILic70?~zNrekf|hOQI4b!8kg-+v z1p~NN)ips&c+vve%{#^6)XD5m+;_T0%pC+zJ$;WIs<|Jqern49TJ>jU+O!`53o&V0rr~zkt^g0iX)GH8Z_WT)bilr4 z8g7^K6yV70wb@|=Zpr``nzpH!cP!IzyIhw677Mn_Uz|UQ&}|v$a#I&+F=@yV(=v?( z%X`!cyBC5BuV97FOob9tK&x;ZDqw-u(W|qabNgo7u*U98jSABdt;U{Z8t<3)sc+cw zWY1{?e<=g*HPx%_?*aU9zkCwDhD;_zEZDPfZGrT+D+6yeoz>8HLj^2Qr$;QPo4Yng zD(p9^0H^K)fQStA8yy>wE z;ZJ1X&8EX@hfhNL;eMG>!MDx_7cPo>k7Es`%U)BfS_69w_xd5)wQymf8{w5XD>fa| zh6v{j3zj#l@2Hhb8`aKkR8f1euN#-Op;b?24I>G+x|Y{TrcD{FCeszI0rj8J Jcu#in{|6QLKv4hy literal 0 HcmV?d00001 diff --git a/__pycache__/app.cpython-312.pyc b/__pycache__/app.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a409ade695d098390a5dce5a382f6a73efa55cbc GIT binary patch literal 6003 zcmbstZA=?ScGkOVuWf7$7zhwx18s=YgoNZ08ZJ%Z7()qPDL9v4q3k){CAG7*>Fja| z7UV!h0`5*1sB$7vuSz0S3a3P;{nK$pvd-G=IeeM3;<#Hf+{#bkG-FI9FeN6`DW6cAPI0~U9BqEWLQP}9IFa=|a zY)Q~znj$z_W)f_e)nP`qCTwAw4zn_su!rqBY?U1eXV|I3Hn}L_3cGZelii8paB;#D z_9RNeB|6S7mnO=>WdJ*7P}plhlJ{O-p>VlWAv!PZLI}44zEVQ*{if1|K7OzOn~+!} zy6#zw(LLA|dBW9FdA!wtH@Bi&suqjyd+yN&mO|syIOQw(h79|BlxA0B2}zV>H39>+ zLyjny0C38wh$x6DRZ9K}hPK|=MI2Ej03D~!hI%8($VCamhzax$4EkuzB3{s}7ovE4 zRMnU>icYgeC0WAb(aq`b=Xc_KhmRmwQ+Gp@uC;0aiYs}k4Ty8`~+T$$t%)oi78lQ?z1NTC&;vlHuI)`0ypP&i}FU+LS1od*i6g@|QK`i+Z zYAKJXxk1x=v1sfEFQ`jb z7O&j)W-9kDSFBX-e?p_u#gmn^$?g|Ud6#A<8h|Z}MnX|=2 zEU9tiZppD|+$h}Ta{0g2j&J^Aopax>^TTL3toN;(BeE!*7zo>4L z8uyq`p^uZ3dG49msQ00o_}|A6mH{50OFg{B~5%p1|D&om##pFQJVX}#R!|vqBCd=PRUZb z$iE>9xGI}?!@Naa8H+|GMHv~Bocyp#|~82u>9sXJO*gC*=n7Q{@os^8>2g zLtlR@;I{m&#=jf7Pu=!*7yD`Do_3D?jAnuQ8OH+VGZ#%@58Ga4^XUIL9=M>N1>SxlC|{JG%WPfb*?HOOw{lfAx2kVe->SP= zm)X^pt@`<{L%?Dof~h_yc6j=U91t&6Qo z#}|)(eBf^Doz}a@?;QWjo7u*r*|N8$dU8PSTWk<9&ig{gngbi^2CiW^s$*B--p*=D<^yBFwH z#+zdtv;EWk3xQQ;TaIzg1+JIsSofSV)1PCwxw4rq!r>$wYfQxoQ?a0s16^er{>{*A z%k`0^ON*BtBLLSqR8}|BG1L7$Ff=@5>K`(D9x%2wrh0{`zHt~h3Zp}-%#On7$SU(X z+@sY#J2X8sr@VjuTMNauJ))7-yG|gG479V;XJ>_JVc~q1eJ#g2X3tNbUpSRz>o>!X zEN-@iF!CD>NCwOM>gUJ9_+s-NL|`KH+r#Kqxi`2{~=s->m;a z@Bxw`?@i#tDGY&JlrD^2^liuF9T5xAXdH1l@}<-8b#{b&=hP#GW;MQY>ajy}=>#ER zeD2h}SSvMf@yn_JF9J}jNuuuAn!_MOQxF4)mupriLnYY=2u2vtGmgXf5UK|U5(sop z(Ot?2Q#7O<+)W5Qq!}SiBWa$i0=c6`nR^Vs2UJqeDk*5zX^Nu0MD{OH(L+@C5LN2! zj)%zi5Y_w(HLjq>hp6^DriY@6za6$9Tgm(K6#W(LoJ)UBSN+53p2OGD^XY3>=dWh! nnm=K(#fP%a!&B{W@3WoLoeNdBz00Ag&M%k)>nvib^{e?W$RyQ< literal 0 HcmV?d00001 diff --git a/__pycache__/celery_app.cpython-312.pyc b/__pycache__/celery_app.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a54ff01b3fc8e553230e8ed9f68ea88b74076a57 GIT binary patch literal 453 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 A=Kufz literal 0 HcmV?d00001 diff --git a/__pycache__/tasks.cpython-312.pyc b/__pycache__/tasks.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe3da5c072371635534223a1ef4d40fc77005e9a GIT binary patch literal 22250 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 UlrDe`{6/action-items/batch") +@jwt_required() +def batch_create_action_items(meeting_id: int): + """ + 批次建立代辦(AI 預覽 → 一鍵儲存) + Request body: { "items": [ {item/context, action*, owner/owner_id, due_date/duedate}, ... ] } + """ + payload = request.get_json(force=True) or {} + items = payload.get("items") or [] + if not isinstance(items, list) or not items: + return jsonify({"error": "items must be a non-empty array"}), 400 + + meeting = Meeting.query.get(meeting_id) + if not meeting: + return jsonify({"error": "meeting not found"}), 404 + + created = [] + try: + for r in items: + action_text = (r.get("action") or "").strip() + if not action_text: + continue # 沒有 action 的略過 + + item_text = (r.get("item") or r.get("context") or "").strip() or None + owner_id = r.get("owner_id") + if owner_id is None: + owner_id = _resolve_owner_id(r.get("owner")) + due = _parse_date(r.get("due_date") or r.get("duedate")) + + ai = ActionItem( + meeting_id=meeting_id, + item=item_text, + action=action_text, + owner_id=owner_id, + due_date=due, + status="pending", + ) + db.session.add(ai) + created.append(ai) + db.session.commit() + return jsonify([c.to_dict() for c in created]), 201 + except Exception as e: + db.session.rollback() + return jsonify({"error": f"batch create failed: {e}"}), 400 diff --git a/ai_routes.py b/ai_routes.py new file mode 100644 index 0000000..392575c --- /dev/null +++ b/ai_routes.py @@ -0,0 +1,40 @@ +# ai_routes.py +from flask import Blueprint, request, jsonify +from flask_jwt_extended import jwt_required, get_jwt_identity +from services.dify_client import translate_text as _translate_text, summarize_text as _summarize_text, extract_action_items as _extract_action_items + +ai_bp = Blueprint("ai_bp", __name__, url_prefix="/api") + +@ai_bp.post("/translate/text") +@jwt_required() +def translate_text_api(): + data = request.get_json(force=True) or {} + text = (data.get("text") or "").strip() + target = (data.get("target_lang") or "繁體中文").strip() + if not text: + return jsonify({"error": "text is required"}), 400 + user_id = str(get_jwt_identity() or "user") + translated = _translate_text(text, target, user_id=user_id) + return jsonify({"translated": translated}) + +@ai_bp.post("/summarize/text") +@jwt_required() +def summarize_text_api(): + data = request.get_json(force=True) or {} + text = (data.get("text") or "").strip() + if not text: + return jsonify({"error": "text is required"}), 400 + user_id = str(get_jwt_identity() or "user") + summary = _summarize_text(text, user_id=user_id) + return jsonify({"summary": summary}) + +@ai_bp.post("/action-items/preview") +@jwt_required() +def preview_action_items_api(): + data = request.get_json(force=True) or {} + text = (data.get("text") or "").strip() + if not text: + return jsonify({"error": "text is required"}), 400 + user_id = str(get_jwt_identity() or "user") + items = _extract_action_items(text, user_id=user_id) + return jsonify({"items": items}) diff --git a/api_routes.py b/api_routes.py new file mode 100644 index 0000000..63bfc5b --- /dev/null +++ b/api_routes.py @@ -0,0 +1,349 @@ +import os +import uuid +from flask import request, jsonify, send_from_directory, Blueprint, current_app +from flask_jwt_extended import create_access_token, jwt_required, get_jwt_identity, get_jwt +from werkzeug.utils import secure_filename +from datetime import datetime + +from models import db, User, Meeting, ActionItem +from tasks import ( + celery, + extract_audio_task, + transcribe_audio_task, + translate_text_task, + summarize_text_task +) + +api_bp = Blueprint("api_bp", __name__, url_prefix="/api") + +def save_uploaded_file(upload_folder, file_key='file'): + if file_key not in request.files: + return None, (jsonify({'error': 'Request does not contain a file part'}), 400) + file = request.files[file_key] + if file.filename == '': + return None, (jsonify({'error': 'No file selected'}), 400) + if file: + original_filename = secure_filename(file.filename) + file_extension = os.path.splitext(original_filename)[1] + unique_filename = f"{uuid.uuid4()}{file_extension}" + file_path = os.path.join(upload_folder, unique_filename) + file.save(file_path) + return file_path, None + return None, (jsonify({'error': 'Unknown file error'}), 500) + +# --- User Authentication & Admin Routes --- +@api_bp.route('/login', methods=['POST']) +def login(): + data = request.get_json() + user = User.query.filter_by(username=data.get('username')).first() + if user and user.check_password(data.get('password')): + access_token = create_access_token(identity=str(user.id), additional_claims={'role': user.role, 'username': user.username}) + return jsonify(access_token=access_token) + return jsonify({"msg": "Bad username or password"}), 401 + +@api_bp.route('/register', methods=['POST']) +def register(): + """Public endpoint for new user registration.""" + data = request.get_json() + username = data.get('username') + password = data.get('password') + + if not username or not password: + return jsonify({"error": "Username and password are required"}), 400 + + if User.query.filter_by(username=username).first(): + return jsonify({"error": "Username already exists"}), 409 # HTTP 409 Conflict + + try: + new_user = User(username=username, role='user') # Default role is 'user' + new_user.set_password(password) + db.session.add(new_user) + db.session.commit() + return jsonify({"message": "User created successfully"}), 201 # HTTP 201 Created + except Exception as e: + db.session.rollback() + current_app.logger.error(f"Error creating user: {e}") + return jsonify({"error": "An internal error occurred"}), 500 + +@api_bp.route('/admin/users', methods=['GET']) +@jwt_required() +def get_all_users(): + if get_jwt().get('role') != 'admin': + return jsonify({"msg": "Administration rights required"}), 403 + users = User.query.all() + return jsonify([user.to_dict() for user in users]) + +@api_bp.route('/users', methods=['GET']) +@jwt_required() +def get_all_users_for_dropdown(): + """A public endpoint for all logged-in users to fetch a list of users for UI selectors.""" + users = User.query.all() + return jsonify([user.to_dict() for user in users]) + +@api_bp.route('/admin/users', methods=['POST']) +@jwt_required() +def create_user(): + if get_jwt().get('role') != 'admin': + return jsonify({"msg": "Administration rights required"}), 403 + data = request.get_json() + username = data.get('username') + password = data.get('password') + role = data.get('role', 'user') + if not username or not password: + return jsonify({"error": "Username and password are required"}), 400 + if User.query.filter_by(username=username).first(): + return jsonify({"error": "Username already exists"}), 409 + + new_user = User(username=username, role=role) + new_user.set_password(password) + db.session.add(new_user) + db.session.commit() + return jsonify(new_user.to_dict()), 201 + +@api_bp.route('/admin/users/', methods=['DELETE']) +@jwt_required() +def delete_user(user_id): + if get_jwt().get('role') != 'admin': + return jsonify({"msg": "Administration rights required"}), 403 + + # Prevent admin from deleting themselves + if str(user_id) == get_jwt_identity(): + return jsonify({"error": "Admin users cannot delete their own account"}), 400 + + user_to_delete = User.query.get(user_id) + if not user_to_delete: + return jsonify({"error": "User not found"}), 404 + + try: + # Disassociate meetings created by this user + Meeting.query.filter_by(created_by_id=user_id).update({"created_by_id": None}) + + # Disassociate action items owned by this user + ActionItem.query.filter_by(owner_id=user_id).update({"owner_id": None}) + + db.session.delete(user_to_delete) + db.session.commit() + return jsonify({"msg": f"User {user_to_delete.username} has been deleted."}), 200 + except Exception as e: + db.session.rollback() + return jsonify({"error": f"An error occurred: {str(e)}"}), 500 + +@api_bp.route('/admin/users//password', methods=['PUT']) +@jwt_required() +def update_user_password(user_id): + if get_jwt().get('role') != 'admin': + return jsonify({"msg": "Administration rights required"}), 403 + + user_to_update = User.query.get(user_id) + if not user_to_update: + return jsonify({"error": "User not found"}), 404 + + data = request.get_json() + password = data.get('password') + if not password: + return jsonify({"error": "Password is required"}), 400 + + try: + user_to_update.set_password(password) + db.session.commit() + return jsonify({"msg": f"Password for user {user_to_update.username} has been updated."}), 200 + except Exception as e: + db.session.rollback() + current_app.logger.error(f"Error updating password for user {user_id}: {e}") + return jsonify({"error": "An internal error occurred while updating the password"}), 500 + +# --- Meeting Management Routes --- +@api_bp.route('/meetings', methods=['GET', 'POST']) +@jwt_required() +def handle_meetings(): + if request.method == 'POST': + data = request.get_json() + topic = data.get('topic') + meeting_date_str = data.get('meeting_date') + if not topic or not meeting_date_str: + return jsonify({'error': 'Topic and meeting_date are required'}), 400 + try: + meeting_date = datetime.fromisoformat(meeting_date_str).date() + new_meeting = Meeting( + topic=topic, + meeting_date=meeting_date, + created_by_id=get_jwt_identity(), + created_at=datetime.utcnow(), # Explicitly set creation time in UTC + status='In Progress' # Set default status to 'In Progress' + ) + db.session.add(new_meeting) + db.session.commit() + return jsonify(new_meeting.to_dict()), 201 + except Exception as e: + db.session.rollback() + current_app.logger.error(f"Failed to create meeting: {e}") + return jsonify({'error': 'Failed to create meeting due to a database error.'}), 500 + + meetings = Meeting.query.order_by(Meeting.meeting_date.desc()).all() + return jsonify([meeting.to_dict() for meeting in meetings]) + +@api_bp.route('/meetings/', methods=['GET', 'PUT', 'DELETE']) +@jwt_required() +def handle_meeting_detail(meeting_id): + meeting = Meeting.query.get_or_404(meeting_id) + + if request.method == 'PUT': + data = request.get_json() + # Only update fields that are present in the request + if 'topic' in data: + meeting.topic = data.get('topic') + if 'status' in data: + # Security check: only admin or meeting creator can change the status + current_user_id = get_jwt_identity() + is_admin = get_jwt().get('role') == 'admin' + if not is_admin and str(meeting.created_by_id) != str(current_user_id): + return jsonify({"msg": "Only the meeting creator or an admin can change the status."}), 403 + meeting.status = data.get('status') + if 'transcript' in data: + meeting.transcript = data.get('transcript') + if 'summary' in data: + meeting.summary = data.get('summary') + if data.get('meeting_date'): + meeting.meeting_date = datetime.fromisoformat(data['meeting_date']).date() + + db.session.commit() + # Refresh the object to avoid session state issues before serialization + db.session.refresh(meeting) + return jsonify(meeting.to_dict()) + + if request.method == 'DELETE': + if get_jwt().get('role') != 'admin': + return jsonify({"msg": "Administration rights required"}), 403 + db.session.delete(meeting) + db.session.commit() + return jsonify({"msg": "Meeting and associated action items deleted"}), 200 + + # GET request + return jsonify(meeting.to_dict()) + +@api_bp.route('/meetings//summarize', methods=['POST']) +@jwt_required() +def summarize_meeting(meeting_id): + meeting = Meeting.query.get_or_404(meeting_id) + if not meeting.transcript: + return jsonify({'error': 'Meeting has no transcript to summarize.'}), 400 + task = summarize_text_task.delay(meeting_id) + return jsonify({'task_id': task.id, 'status_url': f'/status/{task.id}'}), 202 + +# --- Independent Tool Routes --- +@api_bp.route('/tools/extract_audio', methods=['POST']) +@jwt_required() +def handle_extract_audio(): + input_path, error = save_uploaded_file(current_app.config['UPLOAD_FOLDER']) + if error: return error + output_path = os.path.splitext(input_path)[0] + ".wav" + task = extract_audio_task.delay(input_path, output_path) + return jsonify({'task_id': task.id, 'status_url': f'/status/{task.id}'}), 202 + +@api_bp.route('/tools/transcribe_audio', methods=['POST']) +@jwt_required() +def handle_transcribe_audio(): + input_path, error = save_uploaded_file(current_app.config['UPLOAD_FOLDER']) + if error: return error + # The 'language' parameter is no longer needed for the Dify-based task. + task = transcribe_audio_task.delay(input_path) + return jsonify({'task_id': task.id, 'status_url': f'/status/{task.id}'}), 202 + +@api_bp.route('/tools/translate_text', methods=['POST']) +@jwt_required() +def handle_translate_text(): + data = request.get_json() + text_content = data.get('text') + target_language = data.get('target_language', '繁體中文') + if not text_content: + return jsonify({'error': 'Text content is required'}), 400 + task = translate_text_task.delay(text_content, target_language) + return jsonify({'task_id': task.id, 'status_url': f'/status/{task.id}'}), 202 + +# --- Action Item & Task Status Routes (largely unchanged) --- +@api_bp.route('/meetings//action_items', methods=['GET']) +@jwt_required() +def get_action_items_for_meeting(meeting_id): + action_items = ActionItem.query.filter_by(meeting_id=meeting_id).all() + return jsonify([item.to_dict() for item in action_items]) + +@api_bp.route('/action_items/', methods=['PUT', 'DELETE']) +@jwt_required() +def handle_action_item(item_id): + item = ActionItem.query.get_or_404(item_id) + current_user_id = get_jwt_identity() + current_user_role = get_jwt().get('role') + meeting_owner_id = str(item.meeting.created_by_id) + + is_admin = current_user_role == 'admin' + is_meeting_owner = str(current_user_id) == meeting_owner_id + is_action_owner = str(current_user_id) == str(item.owner_id) + + if request.method == 'PUT': + # Edit Permission: Admin, Meeting Owner, or Action Item Owner + if not (is_admin or is_meeting_owner or is_action_owner): + return jsonify({"msg": "You do not have permission to edit this item."}), 403 + + data = request.get_json() + item.item = data.get('item', item.item) + item.action = data.get('action', item.action) + item.status = data.get('status', item.status) + # Handle owner_id, allowing it to be set to null + if 'owner_id' in data: + item.owner_id = data.get('owner_id') if data.get('owner_id') else None + if data.get('due_date'): + item.due_date = datetime.fromisoformat(data['due_date']).date() if data['due_date'] else None + db.session.commit() + db.session.refresh(item) + return jsonify(item.to_dict()) + + elif request.method == 'DELETE': + # Delete Permission: Admin or Meeting Owner + if not (is_admin or is_meeting_owner): + return jsonify({"msg": "You do not have permission to delete this item."}), 403 + + db.session.delete(item) + db.session.commit() + return jsonify({'msg': 'Action item deleted'}), 200 + +@api_bp.route('/action_items//upload', methods=['POST']) +@jwt_required() +def upload_action_item_attachment(item_id): + item = ActionItem.query.get_or_404(item_id) + + # Basic permission check: only meeting creator or action item owner can upload + meeting_creator_id = item.meeting.created_by_id + current_user_id = get_jwt_identity() + + if str(current_user_id) != str(meeting_creator_id) and str(current_user_id) != str(item.owner_id): + return jsonify({"msg": "Permission denied"}), 403 + + file_path, error = save_uploaded_file(current_app.config['UPLOAD_FOLDER']) + if error: + return error + + # TODO: Consider deleting the old file if it exists + item.attachment_path = os.path.basename(file_path) + db.session.commit() + + return jsonify({'attachment_path': item.attachment_path}), 200 + +@api_bp.route('/status/') +@jwt_required() +def get_task_status(task_id): + task = celery.AsyncResult(task_id) + response_data = {'state': task.state, 'info': task.info if isinstance(task.info, dict) else str(task.info)} + if task.state == 'SUCCESS' and isinstance(task.info, dict) and 'result_path' in task.info: + response_data['info']['download_filename'] = os.path.basename(task.info['result_path']) + return jsonify(response_data) + +@api_bp.route('/task//stop', methods=['POST']) +@jwt_required() +def stop_task(task_id): + celery.control.revoke(task_id, terminate=True) + return jsonify({'status': 'revoked'}), 200 + +@api_bp.route('/download/') +@jwt_required() +def download_file(filename): + return send_from_directory(current_app.config['UPLOAD_FOLDER'], filename, as_attachment=True) diff --git a/app.py b/app.py new file mode 100644 index 0000000..ce65fdc --- /dev/null +++ b/app.py @@ -0,0 +1,95 @@ +import os +import click +from datetime import timedelta +from flask import Flask +from dotenv import load_dotenv +from flask_migrate import Migrate +from flask_jwt_extended import JWTManager +from flask_cors import CORS + +from models import db, bcrypt, User +from celery_app import celery # Import celery instance + +def create_app(): + """Application Factory Pattern""" + load_dotenv() + app = Flask(__name__) + + # --- Configuration --- + app.config.from_mapping( + SQLALCHEMY_DATABASE_URI=os.environ.get('DATABASE_URL'), + JWT_SECRET_KEY=os.environ.get('JWT_SECRET_KEY'), + SQLALCHEMY_TRACK_MODIFICATIONS=False, + JWT_ACCESS_TOKEN_EXPIRES=timedelta(days=3), + CELERY_BROKER_URL=os.environ.get('CELERY_BROKER_URL', 'redis://localhost:6379/0'), + CELERY_RESULT_BACKEND=os.environ.get('CELERY_RESULT_BACKEND', 'redis://localhost:6379/0'), + DIFY_API_BASE_URL=os.environ.get("DIFY_API_BASE_URL"), + DIFY_STT_API_KEY=os.environ.get("DIFY_STT_API_KEY"), + DIFY_TRANSLATOR_API_KEY=os.environ.get("DIFY_TRANSLATOR_API_KEY"), + DIFY_SUMMARIZER_API_KEY=os.environ.get("DIFY_SUMMARIZER_API_KEY"), + DIFY_ACTION_EXTRACTOR_API_KEY=os.environ.get("DIFY_ACTION_EXTRACTOR_API_KEY") + ) + + project_root = os.path.dirname(os.path.abspath(__file__)) + UPLOAD_FOLDER = os.path.join(project_root, 'uploads') + if not os.path.exists(UPLOAD_FOLDER): + os.makedirs(UPLOAD_FOLDER) + app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER + app.config['MAX_CONTENT_LENGTH'] = 1024 * 1024 * 1024 # 1GB upload limit + + # --- Initialize Extensions --- + db.init_app(app) + bcrypt.init_app(app) + Migrate(app, db) + JWTManager(app) + CORS(app) + + # --- Configure Celery --- + celery.conf.update(app.config) + # This custom Task class ensures tasks run with the Flask app context + class ContextTask(celery.Task): + def __call__(self, *args, **kwargs): + with app.app_context(): + return self.run(*args, **kwargs) + celery.Task = ContextTask + + # --- Import and Register Blueprints --- + from api_routes import api_bp + from ai_routes import ai_bp + from action_item_routes import action_bp + app.register_blueprint(api_bp) + app.register_blueprint(ai_bp) + app.register_blueprint(action_bp) + + # --- Root Route --- + @app.route('/') + def index(): + return "AI Meeting Assistant Backend is running." + + # --- CLI Commands --- + @app.cli.command("create_admin") + @click.argument("username") + @click.argument("password") + def create_admin(username, password): + """Creates a new admin user.""" + with app.app_context(): + try: + if User.query.filter_by(username=username).first(): + print(f"Error: User '{username}' already exists.") + return + admin_user = User(username=username, role='admin') + admin_user.set_password(password) + db.session.add(admin_user) + db.session.commit() + print(f"Admin user '{username}' created successfully.") + except Exception as e: + db.session.rollback() + print(f"An error occurred: {e}") + + return app + +app = create_app() + +if __name__ == '__main__': + port = int(os.environ.get("FLASK_RUN_PORT", 5000)) + app.run(host='0.0.0.0', port=port, debug=True) diff --git a/celery_app.py b/celery_app.py new file mode 100644 index 0000000..2460d11 --- /dev/null +++ b/celery_app.py @@ -0,0 +1,13 @@ +from celery import Celery +from dotenv import load_dotenv + +# Load environment variables from .env file +load_dotenv() + +CELERY_BROKER_URL = 'redis://localhost:6379/0' +CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' + +celery = Celery('tasks', + broker=CELERY_BROKER_URL, + backend=CELERY_RESULT_BACKEND, + include=['tasks']) # Point to the tasks module diff --git a/celery_worker.py b/celery_worker.py new file mode 100644 index 0000000..747359b --- /dev/null +++ b/celery_worker.py @@ -0,0 +1,14 @@ +# This monkey-patching is crucial for eventlet/gevent to work correctly. +# It must be done at the very top, before any other modules are imported. +import eventlet +eventlet.monkey_patch() + +from dotenv import load_dotenv +# Load environment variables BEFORE creating the app +load_dotenv() + +from app import create_app +from celery_app import celery + +app = create_app() +app.app_context().push() diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..7059a96 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,12 @@ +# React + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project. diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js new file mode 100644 index 0000000..cee1e2c --- /dev/null +++ b/frontend/eslint.config.js @@ -0,0 +1,29 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{js,jsx}'], + extends: [ + js.configs.recommended, + reactHooks.configs['recommended-latest'], + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + parserOptions: { + ecmaVersion: 'latest', + ecmaFeatures: { jsx: true }, + sourceType: 'module', + }, + }, + rules: { + 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }], + }, + }, +]) diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..8a9181c --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,13 @@ + + + + + + + Meeting Assistant + + +
+ + + diff --git a/frontend/npm b/frontend/npm new file mode 100644 index 0000000..e69de29 diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..9894ce1 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,3805 @@ +{ + "name": "frontend", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontend", + "version": "0.0.0", + "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@mui/icons-material": "^7.3.1", + "@mui/material": "^7.3.1", + "axios": "^1.11.0", + "jwt-decode": "^4.0.0", + "react": "^19.1.1", + "react-dom": "^19.1.1", + "react-router-dom": "^7.8.0" + }, + "devDependencies": { + "@eslint/js": "^9.33.0", + "@types/react": "^19.1.10", + "@types/react-dom": "^19.1.7", + "@vitejs/plugin-react": "^5.0.0", + "eslint": "^9.33.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.3.0", + "vite": "^7.1.2" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", + "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", + "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.6", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/generator": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", + "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.0", + "@babel/types": "^7.28.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.2.tgz", + "integrity": "sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.2.tgz", + "integrity": "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", + "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", + "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.14.1", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", + "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.33.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.33.0.tgz", + "integrity": "sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.2", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.30", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", + "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.3.1.tgz", + "integrity": "sha512-+mIK1Z0BhOaQ0vCgOkT1mSrIpEHLo338h4/duuL4TBLXPvUMit732mnwJY3W40Avy30HdeSfwUAAGRkKmwRaEQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-7.3.1.tgz", + "integrity": "sha512-upzCtG6awpL6noEZlJ5Z01khZ9VnLNLaj7tb6iPbN6G97eYfUTs8e9OyPKy3rEms3VQWmVBfri7jzeaRxdFIzA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^7.3.1", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.3.1.tgz", + "integrity": "sha512-Xf6Shbo03YmcBedZMwSpEFOwpYDtU7tC+rhAHTrA9FHk0FpsDqiQ9jUa1j/9s3HLs7KWb5mDcGnlwdh9Q9KAag==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.2", + "@mui/core-downloads-tracker": "^7.3.1", + "@mui/system": "^7.3.1", + "@mui/types": "^7.4.5", + "@mui/utils": "^7.3.1", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.12", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^19.1.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material-pigment-css": "^7.3.1", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@mui/material-pigment-css": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.3.1.tgz", + "integrity": "sha512-WU3YLkKXii/x8ZEKnrLKsPwplCVE11yZxUvlaaZSIzCcI3x2OdFC8eMlNy74hVeUsYQvzzX1Es/k4ARPlFvpPQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.2", + "@mui/utils": "^7.3.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.3.1.tgz", + "integrity": "sha512-Nqo6OHjvJpXJ1+9TekTE//+8RybgPQUKwns2Lh0sq+8rJOUSUKS3KALv4InSOdHhIM9Mdi8/L7LTF1/Ky6D6TQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.2", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.3.1.tgz", + "integrity": "sha512-mIidecvcNVpNJMdPDmCeoSL5zshKBbYPcphjuh6ZMjhybhqhZ4mX6k9zmIWh6XOXcqRQMg5KrcjnO0QstrNj3w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.2", + "@mui/private-theming": "^7.3.1", + "@mui/styled-engine": "^7.3.1", + "@mui/types": "^7.4.5", + "@mui/utils": "^7.3.1", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.5.tgz", + "integrity": "sha512-ZPwlAOE3e8C0piCKbaabwrqZbW4QvWz0uapVPWya7fYj6PeDkl5sSJmomT7wjOcZGPB48G/a6Ubidqreptxz4g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.2" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.3.1.tgz", + "integrity": "sha512-/31y4wZqVWa0jzMnzo6JPjxwP6xXy4P3+iLbosFg/mJQowL1KIou0LC+lquWW60FKVbKz5ZUWBg2H3jausa0pw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.2", + "@mui/types": "^7.4.5", + "@types/prop-types": "^15.7.15", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.1.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.30.tgz", + "integrity": "sha512-whXaSoNUFiyDAjkUF8OBpOm77Szdbk5lGNqFe6CbVbJFrhCCPinCbRA3NjawwlNHla1No7xvXXh+CpSxnPfUEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.2.tgz", + "integrity": "sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.2.tgz", + "integrity": "sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.2.tgz", + "integrity": "sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.2.tgz", + "integrity": "sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.2.tgz", + "integrity": "sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.2.tgz", + "integrity": "sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.2.tgz", + "integrity": "sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.2.tgz", + "integrity": "sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.2.tgz", + "integrity": "sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.2.tgz", + "integrity": "sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.2.tgz", + "integrity": "sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.2.tgz", + "integrity": "sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.2.tgz", + "integrity": "sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.2.tgz", + "integrity": "sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.2.tgz", + "integrity": "sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.2.tgz", + "integrity": "sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.2.tgz", + "integrity": "sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.2.tgz", + "integrity": "sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.2.tgz", + "integrity": "sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.2.tgz", + "integrity": "sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.1.10", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.10.tgz", + "integrity": "sha512-EhBeSYX0Y6ye8pNebpKrwFJq7BoQ8J5SO6NlvNwwHjSj6adXJViPQrKlsyPw7hLBLvckEMO1yxeGdR82YBBlDg==", + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.7.tgz", + "integrity": "sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.0.0.tgz", + "integrity": "sha512-Jx9JfsTa05bYkS9xo0hkofp2dCmp1blrKjw9JONs5BTHOvJCgLbaPSuZLGSVJW6u2qe0tc4eevY0+gSNNi0YCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.30", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", + "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.2.tgz", + "integrity": "sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001733", + "electron-to-chromium": "^1.5.199", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001734", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001734.tgz", + "integrity": "sha512-uhE1Ye5vgqju6OI71HTQqcBCZrvHugk0MjLak7Q+HfoBgoq5Bi+5YnwjP4fjDgrtYr/l8MVRBvzz9dPD4KyK0A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.200", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.200.tgz", + "integrity": "sha512-rFCxROw7aOe4uPTfIAx+rXv9cEcGx+buAF4npnhtTqCJk5KDFRnh3+KYj7rdVh6lsFt5/aPs+Irj9rZ33WMA7w==", + "dev": true, + "license": "ISC" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.33.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.33.0.tgz", + "integrity": "sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.33.0", + "@eslint/plugin-kit": "^0.3.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz", + "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", + "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jwt-decode": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", + "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", + "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", + "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.1" + } + }, + "node_modules/react-is": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.1.tgz", + "integrity": "sha512-tr41fA15Vn8p4X9ntI+yCyeGSf1TlYaY5vlTZfQmeLBrFo3psOPX6HhTDnFNL9uj3EhP0KAQ80cugCl4b4BERA==", + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.8.0.tgz", + "integrity": "sha512-r15M3+LHKgM4SOapNmsH3smAizWds1vJ0Z9C4mWaKnT9/wD7+d/0jYcj6LmOvonkrO4Rgdyp4KQ/29gWN2i1eg==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.8.0.tgz", + "integrity": "sha512-ntInsnDVnVRdtSu6ODmTQ41cbluak/ENeTif7GBce0L6eztFg6/e1hXAysFQI8X25C8ipKmT9cClbJwxx3Kaqw==", + "license": "MIT", + "dependencies": { + "react-router": "7.8.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", + "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.46.2", + "@rollup/rollup-android-arm64": "4.46.2", + "@rollup/rollup-darwin-arm64": "4.46.2", + "@rollup/rollup-darwin-x64": "4.46.2", + "@rollup/rollup-freebsd-arm64": "4.46.2", + "@rollup/rollup-freebsd-x64": "4.46.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.46.2", + "@rollup/rollup-linux-arm-musleabihf": "4.46.2", + "@rollup/rollup-linux-arm64-gnu": "4.46.2", + "@rollup/rollup-linux-arm64-musl": "4.46.2", + "@rollup/rollup-linux-loongarch64-gnu": "4.46.2", + "@rollup/rollup-linux-ppc64-gnu": "4.46.2", + "@rollup/rollup-linux-riscv64-gnu": "4.46.2", + "@rollup/rollup-linux-riscv64-musl": "4.46.2", + "@rollup/rollup-linux-s390x-gnu": "4.46.2", + "@rollup/rollup-linux-x64-gnu": "4.46.2", + "@rollup/rollup-linux-x64-musl": "4.46.2", + "@rollup/rollup-win32-arm64-msvc": "4.46.2", + "@rollup/rollup-win32-ia32-msvc": "4.46.2", + "@rollup/rollup-win32-x64-msvc": "4.46.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.2.tgz", + "integrity": "sha512-J0SQBPlQiEXAF7tajiH+rUooJPo0l8KQgyg4/aMunNtrOa7bwuZJsJbDWzeljqQpgftxuq5yNJxQ91O9ts29UQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.6", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.14" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..c5ca0fd --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,34 @@ +{ + "name": "frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@mui/icons-material": "^7.3.1", + "@mui/material": "^7.3.1", + "axios": "^1.11.0", + "jwt-decode": "^4.0.0", + "react": "^19.1.1", + "react-dom": "^19.1.1", + "react-router-dom": "^7.8.0" + }, + "devDependencies": { + "@eslint/js": "^9.33.0", + "@types/react": "^19.1.10", + "@types/react-dom": "^19.1.7", + "@vitejs/plugin-react": "^5.0.0", + "eslint": "^9.33.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.3.0", + "vite": "^7.1.2" + } +} diff --git a/frontend/public/LOGO.png b/frontend/public/LOGO.png new file mode 100644 index 0000000000000000000000000000000000000000..16a178699d209da7b27cea489842ae0fd4e08467 GIT binary patch literal 3392 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
+
+

AI 會議助手

+

一個強大的工具,用於轉錄、翻譯和總結您的會議內容。

+
+ +
+
+ +
+
+
+ +
+
影片轉音訊 (.wav)
+

從影片檔案中提取音軌,以便進行後續處理。

+
+ + +
+ +
+ + +
+
音訊轉文字 (Whisper)
+

將音訊檔案轉錄成帶有時間戳的逐字稿。

+
+ + +
+
+
+ + +
+
+
+ + +
+ +
+ + +
+
逐段翻譯 (Dify)
+

將逐字稿檔案進行逐段對照翻譯。

+
+ + +
+
+ + +
+ +
+ + +
+
會議結論整理 (Dify)
+

從逐字稿或貼上的文字中生成會議摘要。

+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+
+ + + + +
+
+ + + + +