From 9bf4dd36724f6122382a31dc57709a4dbf516e32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D1=80=D0=BD=D0=B0=D1=82=20=D0=90=D0=BD=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D0=B9?= Date: Mon, 1 Jun 2026 05:31:05 +0300 Subject: [PATCH] Initial QOffice implementation --- .gitignore | 18 + README.md | 55 + build/icon.ico | Bin 0 -> 34447 bytes build/icon.png | Bin 0 -> 21570 bytes electron/main.cjs | 258 + electron/preload.cjs | 20 + index.html | 12 + package-lock.json | 6807 ++++++++++++++++++++++ package.json | 67 + src/App.tsx | 143 + src/components/AppShell.tsx | 153 + src/data/sampleData.ts | 176 + src/features/qexcell/QExcell.tsx | 822 +++ src/features/qoutlook/QOutlook.tsx | 390 ++ src/features/qpowerpoint/QPowerPoint.tsx | 455 ++ src/features/qword/QWord.tsx | 416 ++ src/global.d.ts | 33 + src/hooks/usePersistentState.ts | 18 + src/hooks/useQOfficeCommand.test.tsx | 42 + src/hooks/useQOfficeCommand.ts | 25 + src/io/desktopOfficeFiles.test.ts | 18 + src/io/desktopOfficeFiles.ts | 56 + src/io/excellOffice.test.ts | 377 ++ src/io/excellOffice.ts | 1465 +++++ src/io/fileHelpers.test.ts | 21 + src/io/fileHelpers.ts | 52 + src/io/outlookMail.test.ts | 325 ++ src/io/outlookMail.ts | 797 +++ src/io/pdfExport.test.ts | 13 + src/io/pdfExport.ts | 18 + src/io/powerPointOffice.test.ts | 217 + src/io/powerPointOffice.ts | 507 ++ src/io/wordOffice.test.ts | 199 + src/io/wordOffice.ts | 804 +++ src/main.tsx | 10 + src/styles.css | 1416 +++++ src/test/setup.ts | 1 + src/types.ts | 111 + src/utils/download.ts | 15 + src/utils/spreadsheet.test.ts | 98 + src/utils/spreadsheet.ts | 373 ++ tsconfig.json | 20 + tsconfig.node.json | 10 + vite.config.ts | 21 + 44 files changed, 16854 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 build/icon.ico create mode 100644 build/icon.png create mode 100644 electron/main.cjs create mode 100644 electron/preload.cjs create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/App.tsx create mode 100644 src/components/AppShell.tsx create mode 100644 src/data/sampleData.ts create mode 100644 src/features/qexcell/QExcell.tsx create mode 100644 src/features/qoutlook/QOutlook.tsx create mode 100644 src/features/qpowerpoint/QPowerPoint.tsx create mode 100644 src/features/qword/QWord.tsx create mode 100644 src/global.d.ts create mode 100644 src/hooks/usePersistentState.ts create mode 100644 src/hooks/useQOfficeCommand.test.tsx create mode 100644 src/hooks/useQOfficeCommand.ts create mode 100644 src/io/desktopOfficeFiles.test.ts create mode 100644 src/io/desktopOfficeFiles.ts create mode 100644 src/io/excellOffice.test.ts create mode 100644 src/io/excellOffice.ts create mode 100644 src/io/fileHelpers.test.ts create mode 100644 src/io/fileHelpers.ts create mode 100644 src/io/outlookMail.test.ts create mode 100644 src/io/outlookMail.ts create mode 100644 src/io/pdfExport.test.ts create mode 100644 src/io/pdfExport.ts create mode 100644 src/io/powerPointOffice.test.ts create mode 100644 src/io/powerPointOffice.ts create mode 100644 src/io/wordOffice.test.ts create mode 100644 src/io/wordOffice.ts create mode 100644 src/main.tsx create mode 100644 src/styles.css create mode 100644 src/test/setup.ts create mode 100644 src/types.ts create mode 100644 src/utils/download.ts create mode 100644 src/utils/spreadsheet.test.ts create mode 100644 src/utils/spreadsheet.ts create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..28a14ba --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +node_modules/ +dist/ +release/ + +.vite/ +coverage/ + +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +.env +.env.* + +.DS_Store +Thumbs.db diff --git a/README.md b/README.md new file mode 100644 index 0000000..6370e26 --- /dev/null +++ b/README.md @@ -0,0 +1,55 @@ +# QOffice + +QOffice — оригинальная основа кроссплатформенного офисного пакета с четырьмя приложениями: + +- QWord: редактор документов +- QExcell: редактор таблиц +- QPowerPoint: редактор презентаций +- QOutlook: локальное рабочее пространство почты + +Репозиторий не содержит код, ресурсы, брендинг, иконки или проприетарные UI-материалы Microsoft Office. + +## Запуск + +```bash +npm install +npm run dev +``` + +## Desktop-оболочка + +```bash +npm run electron:dev +``` + +## Проверка + +```bash +npm run test +npm run build +``` + +## Поддержка форматов + +- QWord открывает `.docx` и сохраняет `.docx`; при экспорте DOCX сохраняются заголовки, абзацы, выравнивание абзацев, списки, простые таблицы, внешние гиперссылки, базовые растровые изображения и базовое inline-форматирование текста: полужирный, курсив, подчеркивание, цвет текста и подсветка. +- QExcell открывает `.xlsx` и сохраняет `.xlsx`; сетка расширяется по фактически заполненным ячейкам, поддерживает несколько листов, формулы за пределами стартового диапазона A-H, базовые merged cells, внешние гиперссылки ячеек, базовые диаграммы листа и базовое форматирование ячеек: полужирный, курсив, подчеркивание, заливку и числовые форматы XLSX для дат, процентов, денежных и дробных значений. +- QPowerPoint открывает `.pptx` и сохраняет `.pptx`; импорт учитывает порядок слайдов из `presentation.xml`, читает заметки докладчика через relationships слайда и сохраняет базовые растровые изображения слайдов. +- QOutlook открывает `.eml` и одиночные сообщения Outlook `.msg`, сохраняет письма в `.eml`; импорт EML поддерживает простые текстовые письма, `multipart/alternative`, `multipart/mixed`, `text/plain`, fallback из `text/html` в читаемый текст, base64, quoted-printable и MIME-вложения. Импорт MSG читает тему, отправителя, получателей, текст/HTML body и вложения, если эти поля доступны в MSG-файле. Новые письма можно сохранять в EML вместе с добавленными файлами. `.pst` и экспорт в `.msg` пока не реализованы. + +В desktop-режиме Electron используются системные диалоги открытия и сохранения файлов. В web-режиме остаются браузерный выбор файла и скачивание результата. +Экспорт PDF в desktop-режиме выполняется через Electron `webContents.printToPDF`; в web-режиме команда открывает браузерную печать, где пользователь может выбрать сохранение в PDF. + +Desktop-меню поддерживает системные команды для активного модуля: + +- `Ctrl/Cmd+O`: открыть файл текущего приложения. +- `Ctrl/Cmd+S`: сохранить файл текущего приложения. +- `Ctrl/Cmd+Shift+E`: экспортировать текущую рабочую область в PDF. +- `Ctrl/Cmd+P`: печать текущей рабочей области. + +Импорт и экспорт реализуют базовую совместимость с Office Open XML, EML и чтением MSG: текст, базовое inline-форматирование, цвет/подсветку текста и выравнивание абзацев DOCX, внешние гиперссылки DOCX/XLSX, базовые растровые изображения DOCX/PPTX, простые таблицы, несколько листов XLSX, ячейки, формулы, базовые merged cells, базовые стили, числовые форматы и простые bar/line/pie диаграммы ячеек XLSX, текстовые слайды PPTX, заметки докладчика, MIME-вложения EML и базовые поля одиночных MSG-писем. Сложные стили, макросы, сложные диаграммы, сложное позиционирование и обтекание изображений, PST, экспорт MSG и полная fidelity документов Microsoft Office в текущем инкременте не заявлены. + +## Сборка пакета + +```bash +npm run dist:desktop +``` diff --git a/build/icon.ico b/build/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..04de705834c232d3770984c50f7c37371f676cef GIT binary patch literal 34447 zcmafZWl$Zk()KwAJ2=JN-QC@a7I)X;P$=%M#VPLY?(S~IU5mRrU+=wtznM3gNwV3= zWRl6w^Xz5;03ZMwfPw<}SBL?45CDMre@4XrlT~2=0RMk;%*_9jGvNV%1vmgeSonYP zDKY@yhzS7r`Tb8uAOQgMDE~A5Pay_S3IPC?Ujcw{#cy8`;c)-01RzRFi7Wr>|Fa_s z82VpJbo*%p0DyL-#YI%zGW1mB!|>HmKDs=rJw2LS&Dl~nk|u{FZii9ji9b+5`jAOE zR9}3FV*|k~VJ!O<;8rlD8!QW#i0-sLc^%a?%IrOHo03*I4AYMvB=z+PsmB)@7@HHg zzo72ha=Tvi)jD6o9_6kC8=r^9^yL%2ONkR$oiABoP@drOndvd22AVVCB-9&;T^I<6+qIBO@f43DBa_A-RR;=oYQn=5*EbwMmd+WM8?4H$9dC&_IY9o( zp{mStKLo&iwPTkn>PceqL699UCnfbd*da*&`mm*eTbRjSR9$jQU9yuu@v_a?m`vlAgXO zRd!*3Ot8LHhR(Yh8ul04Uf&o>_>8X2t(V!)zWYv`XTwf@Vw(MFelPNQAxY@;2UEP8 zr;QOF(dWC~;&K8S!kC|V)@XY*QDiRb#mcjS`djjn-S&F8Nq?9U!L&RnFf$hETAGxs zm{mg_s1xVv340!x5VLbiWapL`+%}L~hR!maksslr_~JsgH78SUG{fzH z?Uxgw=XCqBa<6l*&%DTw_>G!SU`khW?K`G=YJnv+w3&Eiy7tqsD!YG=9w068O}t9fFyQ}V8pQw9#Q!x7 zCl8N1000K>f2L8W;T?scf$^E?bUEQ^ztvS|;N>Es8O5NOg9wK%ucNFCA-#kRAxfXd z2@H^dOZ!kl6T25elaGQf`;`_uv?^>R%29g1huknL8Cf7!k2(0ZQp6JHm;xg#l`L!pnBSqlA_lddkXS3VRFZq?`=Z?N6L~YSA z1)EvNyJ5IEaXhvm0dlz2AlD_#XMkwL<2J1?42Odsx28X(!Tlo?&(kd6RMG~EZ3O|G{38h78Gm0 z8!0jf0rUEQWwJs`SNJ86=L``Jg1%WYr}Gn-lzC=6}xZeL)4F!+J!Xyf`Q#~e*3wQnh=Mpuw~LoEN|@d)W^h# z@9oq;^jw8%gYJBD%jQBF@MA#ZGQFIL^Z8 z+_vN1!BcZHbsh1QaFZW?+Ght18@F_Kg(&lgq4LbY-Qp5D6|mf@SWZ>}^#gh-W9p|I zbWU)D9aJkK=o&W?Dduldx2|&Wrl5UyhvniHQzwV63Ukv|d)M}eb-(Ok&}AljW9>=j zc=ElS$K6h$61p^mx?GI#5WV)9eSfexBXUx!;@G%=Eap?(7#3V%)!T6LhWrqm$RYgg z;pC_*W~4p@w^dDT<&>N`F`~%WJWieALj@8`pU3#`;frg21+|m7wxa3qmpMfK)?26X z7nvL@zY_Ik5(@V;bJth;k@(nBTLP)h3Z1JLGbd}oNSpQBHw&T|-RDE`N5{Wd?;mdi zgAkq%Z?=b38;`y>y&Uiq=K2A8O2r>*0~)@WtlU#qJ5pGut{AD?l5>&7{wPn=9fS0IvuTUIxX&FSEkAKJce_z}4q z#=ZG0Q6ADfKif~c*l4!XKGrWy&#c^j7K$18Hu%&dMEsC?a?rtSk>RF+ zpWk1%@kl$~Tvu&H6^Y9WcH$+&^IsQ4w$ambf*Mh|ihjFMos!soRj`NaY!EMMtG{=& zBIqfIaQ38-!^J}>UAAbnL$ko<8nWrIy4;Q^DOUw&d0e#k*5lvMZLRA@@{!8*_tAqA zO+`=CZUy23VCKwhC#6=IP16sDE^EWV3U>J58!P6gp%?}9vA=anV=A@pG+@(dm`uA` z0uU{a%P+pa{E!39jX)eFu)H`Qp|&=jZg-3FU6O#WnP}@?%ez)=A~6aqdb$l<+bwS~ z>|x01%f_j5C5}4FaB@g$NU_?P;jG35`|qVsfs4?pjg&Ol=oExNyJc)3NtgJl4wQ-$ zNpw3(rJo}h*XvnyIwW|IcyWE~>Ua>t2xO;<(EX$J#Pua8h2_{4*at)Fg-CR$_K*kPGuO&;98_sa52P;l!YZ}Qwm9CDls{&u^On7-!$}5rad#%p7zm*o1kS(URyz(xk%MRDLhgUK3N)FH zt5koh_FKeNQYaYt<66B9$t6qWOhd}l?|^<4C6y&lu1DNn%+R#otrHi%pclq;Y$t@v z2`MR$hJ@NhsP@#v@Ew-$lYqD#E*97-4fv~6ZTvke44c`XTC^*upd(pex_wfg<8(%t z!Xf9Xw$NSy0--yquZ*&tOhC!gEcV(N=G9j>KwBMx^r0Mem3d73jB;Xg(} zS|RcoBxlw#HJM*g>1~*|@LH+zh`El9sP&Bs+Ll%Ux3A|j!uThOl9$U$R8e_twvSq!b@FQTrI;w0P zy_`p38Lp&@_JkmQV3X;BqK?HU$E!oz2tWyB8~oLON@=(ju2tZ8<^-_?X_OW5jUC22 zWFAY;EBn;;Jt?ZG6hqq=RcTRxBB4?nF=WG;W3;%4ciDgJLmQZamYUbQ9&t^+{)OTDPG4LnC_naxh@bJ)S`#Uj- z){YSP@*w_n$2>&PGGT8)ZIP~P{{T|2aO0W?IyOGDO*BHJ4a`VflyX+z!G zw^t*LHmVV^)2ev7EG;|PmjfOZAh9B#Kmb!z36QD`;4b-TeSJ5QcoR#N@*$3L69AEQ z=D1-?l>!}>W#&x!M|s^cdh}s^t(F=K*2-v)@w2=rF#@q!@+<3;0ElDi zFe0N1<34r_OjU?3&JcoZ$N#6ZY)26W9S{E}CzdEakXQG9!~R=XWt-3Lk!p@`Pc#lg zHPp{2oUYv0S##Rd2a2A!ZR3|^=}&Y(9O z1b>*PD}h+bVHFv%t(sFn-ZyOP*u09?1zSi@`%BVS@3kZ&{$L?^g#mhOo z#bP~90&3oN&c|99CVN?``ky&j{N!+E{_>j)V)~PF;^KXP+P{^Rp}#jCBat2Y&eD+7 zIj4TGfDlYoxz7g$UWLNP6KpeKV=T9&6O6Fk-rQ8mKKwn4Hr(bK>(?P$nMF^=f!#iT z#b$NEk@$Kr>k{zQDR28tRcWqBg%1P2bkG zz81RH@m9&m%JhAM)0N8?!=;CF5Pr!?je~#+QXERDf{-vOB6R=Zx}UjmJ~UyObhS)y z+j%>UQ>cr)9e(JFD`e1&xYW_+JHZjj7|%A1_lxG!5V-A;QvgXrK~2%fh$GCaDlnGF zF%F?6dSE<4xCCqM08JnOm+fuB^x_-@d*F$a*p&hO+D8QjzMgLyITtad>qxPcJx2db;W}yY`{-zWl8)811GXi^!>+N)^fh@ zCai{!`_xMJTkpBSxs+QJP~`aNj}$Ew;lVQZ3tn}AXqXvYtYmct4Ks1=+hhtTECdmp zp5dWPSdP!tRZ+B#dd}%4<6jYWbUr2$XoFYu4VNfYTkVV0tQwZE2VpFgNa(a7A4b}M zr8fkJIP{@qnz=E8GGR~4tdg_7GtN)f_8RlOZd90u^R@e)lS#csS3#4Ce-FTQuE~2~ zSIN-jHJpL(!OL;q!YTbU;HDtnooib&2fwqezC(@K;FJQ9C>Ld$A|W!3IxaD$`$^a*5o5bxHidbRGyo)gjW>K9$^eN;j?Yn*7j zDA88>gnR>LBmzA@*%L;N(J&smY+s>u(K+)#In)AjaDPwGxu50DRiSg_p+JXm1T75# z0SmSp<6a3J4<3r>^Wqo}l|2D9arm6Kctnel#6{;0Y2#5O$LNwPzTt3MJI@}%fm~(c zuul6`Z{u3Thm$JihVKVY8$t=gCCAR)35zKlbhK(ueWGE12}FkhFbg*SIo{3hO{81! zg=S$9mbtPm(OjNp0mh0cbN^-gwh%{6nVH-h+T*3MbEp!z(|BRw+pYS031^`)g7eVh zWg)zRvEW&!B5onH3)yWP(+>4fEzR;sv4T1zb7xuNT`t96(8&y!9PpIu9JPw>`nsJ_ z!II2^n~(;PDJX4Sh8i3QHH*j;-6mJs#_hfz7i^Ed0!o~elD=zoG3Nry1=A4w{nojT zrnxAGoomPI7pGe#<}sE~yTve_z=587@_Bv5Z-_#A7DP5@+mYrPuXt)xIQN<1p-%yX z#d7Gl`~D*MBC;COQIY#ba6~9r_`0PIn-f2fdbnq>bbcEaC`H0mLUf{26H|{g@IMto z%%g&dnwBN|;^>WU?!LGU6j(z&Z7JpiKUxp$1Zi22h|Mf7miv*;_7#?U2EtbX3%c!K z{rdId^f@%h(4`c~@-?PEUX%BW;h`Z(TRrr%XVJ zK0`v+l&r9(X$tXa{7#n=2bFm8`=yR$N%WobyZt%%ktqRP z+eotXA7@HdCs?Y3Pa&M3B2gy}4DPLd6T#+}%k4_~P?av?z=;p@gE!5n1p9n;Vrh5~ zO^y+++`@%KG8PZeAjcwJj{TKGiwoUpQFPg@T$~zBe)hgk`2sCY9lj+Vy%DCaY7z3G z6ER(rOVmM_W+d{*(!_5o)ZaiK zr>{avGfFxL!fs-|!Q|NDcs6NiGwNZpPV*p&8zh<@{xf5KEr?k$>VYW z%aP+0V!rH)O0ndgAjN2>#rwnlMXApBM0m^%mgx0q$KGExQhK!2B1NKS`lq&`pYtDx zzeOIgc=l*}<%S(C*8OOmMg5#_v7~=z0GbbmkR12H;(NU3^_6lKb-GD z=yCfKR*pF5w(ZV+wLYmY28Zxe=Zuq2T5+5Ozm32zM1`40jK7JH4E_&tF8og~{9kfj zX8B_i06?z$A35LPvyM$1{;|P!>;2lXu_kb_je;Cr4Eg&Pd64iBYTS<`1SM1d80y;n z0^>qd3`pZKrHY6=Gzkf5Q+OT9XMbB|rKEW3P&#GuiuhfaP}nbE90^n=h+P^K2jq*| z=9o*C%#+KtPMwQ~e-#t9Fvh5R*o$pLKwv{)gAGguBn?s{HvGocmrDWZC$F3c!wBegMYkOp_D4u604t&DT#u)k2gDC(gxKSF}`@j+j2z0F7r!PVZA4TyoVOkD-GF|aN!2CQ1% zOUGibXU2mi9^FQ}&6SQOrw>A~y~_fLmeXk2_7>d2kn(`ij1U^>gk2+PFCleGbSY=p zZB<$IeSE*zoktExR_|m{Y*XhoY?<}VMW1KO6g&bPu+mwWQ97yuKFpZx|`eWk*}7uAA<=8aWQqqZj`#feHuF>zj-(7VPwHq zeGww?e97`DS!lm-ahGWVaN@y zCra9%bB|kN!?O?rZs0**a^a+4&W63xnlTVczE4qq9C^apu66^_8*>N_mS@DIwx?Z} zG`P^p5?^DG73zhA$PQe-bI=~h1^3PZjL-~^>tO;uJ$V^Wm0+WFs?^CrB+t#mEJiK| ze9f8PgQ;_BSDb!0OZgH`qM%*Id@%Rindt?*wCr@f9ZigX@7Q=Tog-ZV^m&D;~wcLb{GT{eeZmW$IrqHZSq{$0J#Mc2J z&L`a3rjtMxI%*GyjoGy@q`tRvF^X$aUENVv^Qd2Vg!s0L)1}O9v-$n}Wl)HaI<~gE z8n(j#4!WApT|z>`X9wteHVZgi$*pqA?+D;AT>q{#GWXVGNKZ!4s$w$Z2Ov1BK`UrX zL(sH~Oe+Nixpo6f?bkI`FdNKy5Mg}_BK@(zKq$8&j?=f%-}%YyY)I0h;AlckR~nk_ zWQ8fV133gd%kt`0eKCE;&EOY_{0itUdh0lT(_(r8`X*{kS_`=>mT4_@U|Z1arLF4# z!V$!Rr`q-?b`1s~#o50o8h-Tf!@*;>CpFQG_810D5?HarpfgwTQp4gYDsEO9 zxEe%75dNSm8Q05l*9oMInWBd$is_MUD2mI3$gWem)m zC9KJ2f&KI66K<@04-V3s5s7yUFP>hCT_3cS5VYX4f7CnIUjqZuS>o30oBs~x`x_;G zJf*C;K0=ENlNi6)zR;cSOK;A$Xbokfqam{CF^2v(_nGRdlTOs6RFGgFuFLtR?@eFu z@1KgW3_U+MYNSy{YQ@9xJH#g9*n+!!AU%P7U?1fjOtJ0L`Ffv$ISjw!Vuqopg`zC+F)MHIi)fG?aT^!Z1@xV}& zd(r-Nuw*V6AedY$FP6(nad7l#kSruG>67TqW@LL%s$)zSSpyPOS0R16jk7hg+ig^S zGe@g0_=0|%MIU?WK@<`|8O!tC<@?K@LJnW{kBRvg$f9~quw-5sY(=H*usJMvadAPy z7LVOytY#XD?%{si|Kol>=_p1K2BCzmXOVG!h$3@@{P3fQDm;flc>K>JLrZU_0EKjB zDgE10SHjKN;J7I6Y@1$kytB0iQ@s{od56ZXcDwp|ecH@FunwZ0ApZ}raDq5W6y^>h znLS7z_Ukv-@ZzQma$COGu&)l|2J5Gc-IZCxTPhq_?a4D_(;b)=o4%-Nu0*-=pPbRS z-CaGF;{e)~uMOu65Z-aIdE#NEdFCia6FrO$YT%=VPoAQ-Kfe`~do{2W&byq<>EAD| z;ZZ590e+@xfW_(-*hfO{^!YF7)o+h1&y5swym~ju9FUNr;1cPmNVkJMT1o>|ib{aB zE#ZM{wEpfJFeotI=lTzPyKC1~rb|3982>japbEl5YAJ5P)pr(QK1#?tH&C6w!A@c3 zT&9)0Fqgccp!HT zx2Q$rqjU%>fRTxRM~hWu9ET6Pav`Tc{f{54nB>veXqNO7Cuy2~ivo|g+qcz30a7D= z!$dj)zB?JxcCM76%3x7{3tSm3o_~(%JDeYFpZ9=yjjtMI7MYk@oFA9faYdk(PPw0Q zL1U4_h+huuOyi#j0#+WYGsbozI){KF5imA@%ZLVR<0kPm-O9A?PgWvo@9BbuCouRhD+{F3`pAQHM__Hn2;v=%CeDr=t^Zz~U65C{6)l%t*e z>LePutbUIVt};x<-X~rus?`Q^_{9aElIY-cA)!srEDj>Y`<=!sq3-2nneU|-$rcZt zQVkqE4=3voH9Z*G@`H+CYrLm%8V@{$;D5T9=Fr*hE!s1UlYncWO+?L#d%!spNIbs} z?bBvro7hbm&RKe5``Rx@EmLB{P>N^y75*%4x8auUlDL^Y{&>C`ItOM!ckuL07LQ0q z^eYlqwb0Y`s_Tv&63P0Dn}HrJJp43<)=3WJsxdGViu@NZBHfM>L`qi~t9Papray zrTe_Z1U1J4lSeX}On&V!#Ii&0Q9UHg|N8WXr?|bZ(U1?Fg=3@)Fh*8H@gH@eLiSCW!03D8n%+4s>SSp z`~A;W#l(VoXn6Mdim&?H;Z#3)Fcun~K)$RNaN@h>*blnbiK(851(6YP-I}2`X#|mg zy%vYzJFC^}jU<6buT!c8gBH(__kktM0{XA;DzH;dkGlf#6N*3R_3uxe_b(j6xkBzF zEhc{8t6XDZV-?GnIBu=JwVz*G^x!>r4BYQ1z44(ZE|=#>25WUoLgzM+(ke@jntwS( zHL~A)a!yXra=$kHhE@9Zs0nlEj zx{HcrlUA>H_jR&8x}PeElI_irWhIM-5@@2Dux_96g<0!A;`;T{2K8Zc%GJ0n@(Nrl zvpZ?6FK(#C<$}I%*+dfB zjp96RVULF(^y2YW5ndfx`w+)*ZV*gDrqeJc0P^O6B@^6&5}Fvbw`K zAjQvb-uJLq+Cw+2>`w}FS|(!D|8wHb_0G+sa^1(>7aQe}=>eUP#?2}m9uH6ncC(+>a1RrLc^0XWK^!+0o{AGxO5<5qDQzI8X@J~83>Y;q&6o;Ri8Jqt{zI^4O{Ud1F* zJ|`44FC$r5J>0CDrfJWlh3(XyN<8`vYheX`{suTdVg*pDv-_MGJ~MaQ~*_{FZdmlF_R=<5*BQz z8iuA9ou3K^wN2d}rS0g~2!Se!KL>2q4^*1rXcps6H)G6+FQyrmg!rGOi84&L4Qbk2 zGF0m8XyQ+bsRx{rKYsp6-+UFBLSRK;3ksTPkVj`XzX`2ONX*m*6<`INP7wRUax!0y zf+Ba#VuxUYS~PN6Z+G+Wi#xa~&hc<*9a7rjf|izxp|H2$2(m)x@a)jNCI-5-@}3J; zsH$PWIdO3ojD6(|Ey)3&5P1z_9rU;J2>*wx@Apsd_g`1PU(jg$U!Kd{|6KiZZ`hx@ zgGmpaYWAm{jasbw`xtnEE5;85Ak#nuNIX%nX)u}#n0XW#f6ZUaF=V2~ECnAdo#G1$ zoWK+vc?e}d85!_{UB)rqhcdB|ZlY+MAJ-{65o*>S|7|<^+s3(k?TGKfq@5@O&AnG7Y!y16Zrz;+#FG&^~ZZY$YJdk1tmI6<4lo}-Sge^uR z9z14Z(E#M)blSIW&n?Ed;Nz{|fRV<*%%+!IWsS-K#SV3i7+uqdZ1K&~ZSg<``?9iC zpsB`Y!;B1(u`z5z1O8~tSrgU#Bm))#3IG%x!ay7Gejhy0C5HKM*0h(~I9`pZGH*2SSHvAB;4cEcBIva+%Y>7@>>RVf*(> z@WyZ1G*hofgE{5#GQ~QSr3O>jz#*KNb4SiH;{ZUwOLX9(Hbkb5d#zQ6jHm@iVqMna zZ8%9!*zeSs`Y-k@bBs@aEyN__GPlfy*YN98Odqaz%Q87#rYXe;OvSInF6l8qroKGt ze2jf{O&rYf8oZj# zjMUeIri)Tp><`qyyjdt})Fpa8IFsGeT9s1bgfciozDo z*ZlrVf-1fqqx5&W&qLDvseWR9XqnhiqNc@PMv%GGg2KX7y~1u>_v=n0ncj7{JW$m7 z%szkrJWn_fs`(H)>xznOVoMUq&}ehyWNwc!=`J~K8Mz{>!MZRBv(l^{G6}#T9+F_7 zr(g=wV>1aP~ZjfHj0#Lfoe(^@7RFmu? z$je0qtSsG7LFd9H3YYGdzZuZSrGqEd|G|pfbZ2PwylyX}TL7~g9s>MtW&%as`vY$a zZZ_(hc_j-Rk(&dAUNktkta%8XV?*$E3Iakjao7_*7D_5=mvDa-#3*5aY;qPfo%)wh zVU_PacsO2y82O{ijrI)N>+W()_bBdK^KDXoGs5vF5Brew6o|{+vvEJx6ytRXRS8vR zi(URgynWU2cRqw9C(Es!kI+Fga<$n(5;{}9sM6*VbifH#|hx{W$ z0;ET}npygeIVH$V!F%fmMFe<@$aq@=`u8@xgtcAvnP0|^D!IRtS=%IVXVfWCgb{m< zk{&10EH5x_-`C`s^^8Uac4{~s|1m`|8wY5zfrT3E%y2!T!KQ+j{JwRrla}%yZH(cV z-&bi>;e$Znf}n7kB0H})h|`NLd*(S72*~%G`ROlKsd+#Z3sbK`BS2%ujW4%NC=K@@UNuTD&{sep%W^!#+ky1n zdr@L3#7bS1$qy5pg4l_OBKm>q(?<>ZmE$#6bw3Fzcx_(dT?t~S=XciiAK1rpj*D2} zXF_18Ld19*wT7rwUO8>=mmWj_<$TJ?%qYtal(NwG=N`ppckNhx0DQ6}3>;*$27vWT z8107pg9zB60`8{aSs0IBaSRJlW=Jje9z(8zWl;KGe5jT!q3dhhu%Iw!8bS_u5lIuDa{W?ke{O(U zEYWv4CEfCL)b=*bn7T+o!HkQLKazguX82v#fjTyrHdNJ*2L7fAm^CW$evr|7t_H|q+g&hN3PBF1ZD-RIMcnS?i zSs?Fz*qY$^V(z8%^h%BbltbEniO=R}F1i|Y=XjRWKMq&iWs;2b7qz1Tso=LH?J^m! zEvXD50U+h%MC{Ux9_%c4?f(pCly7JB{|SBxBJmpYBp4Eo&CY8tFTp~%UgKB~%W*Q{Ct!q%W)rN*(& zofI&Mjdm2k7Q1I>*D*%wzwpX|>xy5kR|6D)Y7jz>!G}CV`-)Lo1BSE*4ixQP0)Rrb z1LF!K?O!_9C@?C3L{eqOT{G^37>fn*pq=Wi)%b4j(X!yA)lAJ_wg`h+5aJK;Xv`{eJRH=@p zjIvAUije1yVjpx0S6)y<4o}H(^9K4hBsqag;Gm8mFvBslSJjmPQaQYgZM|@RMmtsg z99#TI^s|E)$xB`e21i0LK&ABRrmVD(B00j(fL}C$vV~fWV=^uT`+Q}hMwSYJa-YE0 z!3iQ=ZVm#t?)U*@Ua8J!_{q^d^961Js8W|^{0awnMfa&lX!b+@moe!*lk5zg?~mvp zGiH2Npb9N>XPS~B9zyXvUkF~$Oh9*p8ldg*-@jC04`G@>TceFg*-)a{nTAR5X$hPb z6c{%4HU#_mF?W8iW6!mgMB7h!>)Y1-3ZXVg2vA5f00**)@N`p{7lNc7PBCe$2E8cS z9vdY^`D5hth2?nTYJMZNIBYJb(#8>!W-bB{IU&@+mDpejdqO0EIoJOhK%t003;_Pl z_p?d>JbRR-9-6Ez%}N9uDATFszrFxAZsU;dv#*6j|X| zen+h;GgAbq{@4>)vV(P+y26U#|9D7H_^`?};nO{C;3&c?A(0tXB`(qVwrrw+ znTnjrB|O1`Hj*ly5Sm>~6ct4$B2M3u#eKiOH|%{|SB*b3W7rmiK{o+~kOVGck6mfD zHE-zZ_PC9?@HRAKO=V^+qni0UCIc38^S9Sjk6tQ-ljJ?GwGa(3qS;T}Bvxw4Vt`8x zJ3EVl#PeuD@anZyIYIpux1zz02tnkvEwqI1boNF5E55swlOPp;bW(hM0~Kb@Joc1p z5NV$nDV_BjRUfAuO?;8Lg|+pS6~z zO@qd?*DeD09+)WuIqKAIWyQYi_YHM|Ja*+kD4S%_k`L? zha(?CsTbh6R`~AQW_i);G~~$$$(^`j5YCvR@KM;6yfc~|%mUbRyH`t|Y(Fc9_ptZb z#@HJas;&-qgwTv#lBn2^D@9~c8i@i-|ETX*W=@*|J%1ZqCjZ0vQ>D^5rmHS` zkibgqh)%||0Hh)mJ2RIKGtNqk(cH_fh`}Ge(a8uVAt7u$;%$RxgHzC=9B$A4@Z2~% zMhj%hVij1h(eq!|?gsDyJtD-ttVnLk&%KP)gW7S<%qAUGsgQl^tLp z_&zsZ+~K#`f!qkI4U-9{LD{_$iCLT4LqS=h5KD*2X+K%d>3V6pNqIP8|(|Hhg|f z_;6nKX3#k2{q_8Qn4YfeDE1w&p#^kTpmoG?*C?5a^81wu%y2t;+Qx#Po}$YCeOF3| zs5A^0o`UG>Wy0WlpNYtSfRav}nCN(=p~>0&NWH{;X*^LLP-PtDe+nV^eDjJ9gUOe# ztVq>cYx^{NpRFu!xpqaKGTLG^l(!xwnSvAUz=r$RoPKChe4V-7$&i4nK6=aLSbE#T z^rZhZfwUEhD9gQZK}y?DlanhGjCW_YHc_!J5WbVMs|P@2<^ML$-gp2@AZTvjjMYd zk0V#2&|4t~FU*PLQ@hn&7wpY$+NYsHZ9w#L@>JNKhQKp*K39fK+))?Y%w@7om%1x6 zreheq+&m{#cb(Lcy;y_@;Finm18EUWFA$+;UW~XBL;+&;Bim^2M8dlFE`?Sn_`$z{ z+>qMIEubxBo|U=Qb6w6d&N#mi+kum`cuOKjR0gNR)8P1T6llVx)Q%%-Xa1n&v`c5|z$HOX6V)J*0H*^3YBf)g04Sa!LI+f4`$uaOq z`sILfzgKo)%+cdK{#*dG`P!=JtgWr(hMVLIrGo{$%N)}I6@sKv$=_6b6FSO$ORI^4 zJ~(;MV2HTctk{ec@qXv(#_WDgAK%XRn%G>YaJ{-jP5YNkjo;FpGzLF6KtL}{)K3or zV(B#)O3KUA9=QK0rZ{HK>e_-D*6oR%?LOtC2_^!UREMVtJ@r-&Q;=akd0@FcF6BOv z;IJ%MUsfF+uHVQqTOR&?0!=YzkM;%|ysn>(Pi66Ws|N2m@p@f2agMJ#d_HL;d0#DVt%nCJ+v5ge?6Jr&R=*h&Id!T z^dNF?uxbXe4Mn~AC!T1hWKh-ZHv^GZ+o|=pO4SqjB}w~oCzcJI;UM(g2ns!|4<3(a{1;v(_FNN+QW%d=#^Zhns z<0IU2p&vWfj8Z9n`7_gHwgGc=`29cw4O!S7;O|$YtwSK>8vizUnS3kN7vd+^G??pb z!t{C}Fn#Ca@y%52`!}8jWjP-Dr%AYGcd_Kd0xQy+UrFa@@oU*mf}RuXpX=_&jgOxf zf#EL}Ce-F=Xc#tHhIc;mFZ*nt)$M#(4t5R{L5jz!eS$A3WR&S4gESX$ZRP$l+r)MG!sw_*bH0eY2u2UUYm`-6APW->i&TJ?A z+w_>T-e%iN)zzHY-ZXr@5d-wYoQ==OF^D;bp0WQ$eM z`=o=ZORHIkn{eikR`4w|aIg8eR{594dmiOdr^$*tSZw?J85i> zFEt=m-88(*F(ZT!oa=P3O>;NSHp%th_7qnTEr%*nzyYu!Sxan7WCh%&8Jvh-``7S@ zd>9fYOg&f#>zyI1g{X8fn5kCKQd1^^1f&{I*p81Uvw*qeVCD>kOxK->6&2j&-xv5# z{vczZ1hFb@W}VP`>RhobY#uIBB|duK`s=nQuuzxy!hdCs#<1%y{rg0U!>b6}yk)W1 zzW#M}ck@!k<&az7;(K7Ba>-E&o=AO%6rzPhj=b&|?xrO9tPuHMC|cmg;?r@ro&lS8 zcWeCu)b~l$QgRKEnqLLE?3ctd!0nMT;a1%q#;*KbcfSu}L8hz1twoHmJ)~8IkB6$; zTLS@WJ7MGFv3-*CTN-aUstAx86iYPr!`PB1Os5tywHWu|OYG#U$M3lw>@kf`&G)#M z2fgk941J}iG+k0gBZFP2s9BB49e?v&Tjr5{^7#Q$hb`yg zw&X1DlFy0qOT6l?cM|)JnP5FFWC5!siFFbPW_hIh(y&!uQSB^`0aYGXkItv$&zH#i zlR9KAb~|7p)F3Io?o@6rWsy0@lK-I!!bo$`FQqrbR0LAaK%1JDm@kX8cS zG0&CpQRK4}>_?WCJ6KtqT;=-i_Wk#_zp7b-iJetT( z1}A527m{(B>XlxaGz=SOS0msenEtjjp}LeF!3>)*QA`diDM|xpQq^#rkln<3dDv$; zdRYWg%dvOv1oXep#iY<)c<)vp%=ubzAZ4u*PxJgJIywnH4}A$-0<9T+2gi0H{a=sYWRo!eOcJxzU4 zFgGmPF8trwOG52<`#X0t7`nia$~ZU#x}^%bDgdQW)_91H{ieeVS8YDc4Idge_Z8lc zXJ4N`T8^(P7f-7#6N(_5;)pAwJkW@GlMbmx;v*>JU072UJk;P`)P4L3F?dP&ebpnD zbRtW)94TXw_&Dr^c{|}HDm(fDKg;u$>AbtE*}pIWsU;Y2bctczTytyZK2&7;*EEWz zjC<82YS&F;fi?$yd!&gL)cL~YNnUvE1x#U>U~g2D6D zWF70>!lS^Z@H)fDL0+}8q4HvVN2TPV+^=`d(s&xEpp>RCmF!;jOWf{s)>%HZ)82ja zo-~(ijQkg_Szye`pe*f6<(R_0+b3V7%0DT+%vRz4h?Nd_f*vCyKdP%Mfx_c;;{IGL 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

H=)G*X90T?l zn@Nd?D7HVS88T><`Ao}r+%45IVJh5|Gf%tkmw8PG6Fy8G0!qImM~!rakV1+Qb|6B- zZU(-P1^OfxKByf3Mt8rb+EE_NEXoSem4;c;*EI2n4UH}+1|)~};B6BKK+Me2hvGhr zv@+hb^y`Iz^NKqzjH2548(NCVV|?2hmRFL86*k3(Z$lrmbHvFke;!0+e4-m|*hZ@P z`GX8wg*uX1l1rc^f@riO3&rMh8RYvH>@H=$=R;II;pcaCn8};@x6rVrK$Z}U(A^gn zU!P(=@LhO-6H#J zglL0B8Co7yCfKcva)FdRIU3=)Ycojo9p(2?ld9?22EAzX_UlH1IJj;vfpiN*nUl>k!QXOlA72;YIAR1$9ms;1lH+g znVqDi9#(w8YK-o*LD!(jv$h?rAp8#EhP0(N;S>YPAFvUotSJ8o-OND>%c_FXV>@Fa zx^sFVe6OaapQV+;ec1%RaQbfjE-u#I*2kVk^YY(a@8cxqnT?S`TG&WNjSfyq2wMDT zC@-IfmEw6#HvTFHslC0-`YJ^BeQw0iE+OGq5KUzq{(u?9UCly5g^m9tYzvd*{&ZizYTSqya?+>RkYT=xF~N9J~n}eJ{I1YajKCGkTqI$ z*guXGdibd7Sj>-nGZxZRj9;$cFNU`|m)iq3#@~X=jdl(@J%W|xf2dgoE@87!4lZO- zdtEDUIp<4`BSmW@0t-|q78oY@gg&~#ZT%NhIT6_1yUq!Iz>)!uFVgQ)5FD@1MApZN zUKm55=c!V zDoPP8Q3l(-g(dK4(UxMxC&r@;vb?gEpf!yC#}&FI+_uqj^~+1Q)7wd9=aRg_l;t~U zJIAhko~JlBC`S6JB%YB^|s)HOD|FG-D6!!R>6d<=9L_9gWJ zSuU!;(TY-^-&5aHMCdSs^EclcujB0;<5ZGVCl=*C*-Ky!wZZ%^ojJ2iL9&%ld_GWl zb#vr`h~&SaJ|W%HYgz8uIw%D&H*G0l4b38k6U0`5 zu3bNnR>na&lZ(EL#=h_qEHKRL`O%0@3n9lqCSQO-X;N3fU05d32*iQ@1MyW7Uq*1Pb^+PX;mCnZ6 ztpGf`s2i2yc}TsQscI1~f@iG?DbR_8(+<)R2y8n$nMzm&eKWmv^n6L}juvRMVRo|F z{<;0k;0W|!W!Ml7@z(>GY;yzA`0067=SjaBLMlWHUROIw%JA)uz-7JY?~O?&3)MW?^*p#*!VS12^3%~!{Bj@CRG2ArDCC6{h!BzjjwaX zyayDqTvsq0z`KN#{2wR8$4=_FD^}!uT(>V@mO{o?Y%|FK$S?y@5%oT;=0Eu>ihY;Q zAo)qkWw7d3UlNONewSay|8BLL+9-2fMq+;F4ecNgQj5NP zKN0qra%Sv#dr zp0jHSBj8(o6c0UovOa7zL~sioKucUGS+6yo&j8fOB~g+{e)q6+$|GWkWuP7^SCFE$ zpY?avOP$?j=C^Uci5A5C&;4>*CI$lixd7utRiAywN)$Si?Ph!mYMP3wu0pfo%j3Fs@!Wa`MR>NLv^nF zXN)T0Cgr}0lt`){8RUR~jv96?d-d8%$O#sg#P^fR8tbr2b+{&YGMX*Up$Y&-R=p!C zU~V2AvW|-Zq7aaT)%P<_@CPGdyp5|$*B_uQ9ybF4L*R?Kw)=)s`f#WQpw1k$8Wy35cvN)h?n>M!xg`=-1v?V}zA)dSv?El>R#8Nc zf!s6b?Y?gAysqdKsf;3y#N?Hc%8c6Pw;9bjjBYl;Kqw$aUfOn7sYKFLH$7@ol629wehm_Dl^wL{^&K;w%WlablO3~g#4 zss=652OrS%S$#CpXVzuBEEQ+}))@&er;t$Vg`vnUqt)?U_}5EdW;~B z=OWFjZIs$X=(tl^(1ik)ej%TF?oHO_ay4<=+!hR`6r6DEJs04)lH2kZ<1#-8Vq?0) zQk^Qg03=a16E^C}@0Y5*8yG`GAB+uyVuw!Y->aW`X=ppBRRsIPnIXoF6&v)b0BtNc z@NZ917e^b@kE_JIWxS6+%K<#V7w(NxVAjr zghar^T3}@>nm89&&=jhcVOU=_7q7T7f%K|F32CV3CLb(hU8m9~(-1s!O55=`Smm*F zt2?<#nQ$2xZ)_g-?vNRo+UHmiLMinP*9kY!+rpAqL)qpemwE`;T?cv+qwOpTse; z&@~(%TA2c8A4papTx6Q9Mrpf{7TOB5+>rTzkz^U7jeFXH{z^SUC)VG)U_#8-P1JgQ zbfQ35Nz51#6OOn6RL1B5K^kvH$L6j*JWDILc#4`KjR-1$=G2#n9ZZo#P?gTGnesXC zSUAcu5ku#6RwK?5R0Bq?$x*-y68yUrC5%y8vyWRPq)pS~J6mVVMk-UBxhKO>3{Vr; zygu&tnkg|HJLvrD2N+Zd(Ks_Y*k6N)Sy{k~D~nbOLQag`FnmKEwf^KXxv3^f*V8i- zsT&1AW~pjb)fUZKQxQRrw7CD~9h%UO>86(zlFuIvb>1e^X8jN@Bo69B)U10~C4M2A zf5lNDnN=#f>E!gS5ptI|`B29ws6r^HP*oXOGbdFCtP*1I5OCs6N_-hO!2NJ7aW!lM zlEnQsxbDn1YSD#%Kgna_E^foX0>_qPkHVI zVjq9WU8+Ee9alw;m0nIZQ8+wx9AO5BMq5mDnPUq)MClJje-!jgU z%oMy%L0-^MF#k1EdFqnp!iiZIBGwPa7>5oy+}=WkwYUZp%9&*=CX1z5ko4ijmM>t> zTosaJ3N}**V1P;{dXx#fq%hg+SdvN*Vpg#WW@BH^oLDnYkDbZC`PW^ShfQ=ZvA1#h z1=5pLloiGS;w*E}8M2Tp!JFe)?mZ_zray|c0k66cE558r1;}En2s740u<({Fua}>F z9z40SRs!vf-Y|DiDR;h%xpfv;TbrO*b7YMbQ8au}kOOaptOV{vlOhJ93@+P0YDOn> z&fMH1(|`M2YG}#lFH%*>W%_w!3QKydqkoBA=07|Tc>2^4P{;VC#4^S!TMpl7b`+C> zDSw>$5S+IZrUUU5B?$uoU2`!ZfebQJ_+@+A7MOrc!W4qL`avSO=dX!kQ1TEPj_Spg zDZ2^s)Zk3Pr3qi5x*qw7XX4m;tD9Wknu0GYucP4!^wh7iSn@7Cf7Q`B@f6`@XmvVf z6Emmu`D=9V46U_?bQHisW65LqQqZxTO9a;re4^u@?7*km^(8t5GOMthC$_2DtbHwkYm zD_5CD`r_R=X(1}a&cj07uR#XEKhG^EKEH^{c7ypZ(%gx$&LxI6_%3jUuF?)QU4slY z?4aD8e(lDSYAn~A2rn+Jv58Y1A7phz=5ePq-{S_AezONr2ijKjSuRpbfM-sPzVNF;09=&-;Q{O1% zqZKg#nJ?Y!C3~-2a8u|%qwT$w6@Fs;*5WJ45>Q6Rr;d13raO)WH-8UHG||pM2}(B^ z(bO4=x_By|(tAOv&C2On8VLWsP+#SRA11^AU$u${`v(AE%D10u2g6!H3nAqev^Aiq z4^&|Ca~5j=S;(#`WcFUt``P0=%AMp>3KO#erwS%iQDh~`wr@T2HsJPk%#O{Ixh}E> zK&KCDY7!L`%n=w(8sPhBCB4t@x%|-UgTGCH@WX_=;EH~MrmsAfGGk5u3Ea3W=yX)b zQmOGUT&N=jn#qVN{@mx`2LaqPSR_H?`yS~!pV<4!1^+mJL zif}ZeMZt#~QONJ@zGCjKiCpUsMl}i%!YUP71N{^MkYkS)6P7{-Xb|PqzA-%%0pzxOc1fR_P6-&vtRaHAJ+KGvr+kPS4tj-racpw2|&vP&mk4urx3#T zhpyPytOTtfG=mN|6$&cN>hvFtx$svE7-wkO5H{pgv?T2X#vcL3@0KWU@3`dPP5VA) z9P;?s`Xha_Mfj`rA>CCOr9};?4!vL1bYVhihl*!q} zCp4@4{X&Qv)*wBEo~yAF0RCJ&_L2HUcN6UHQe3&yO<>b}w`bB`zNXyxU_=rigqQJ^ zy*bs~gs(i8N)IB?p>K-VutF7IGwB3>a$5jH5h#S!3^ueCuZ=V_8F-V!B-2z8?M0J* z10XB}6$<>yNh|F2p#X+b3guZM{pjo&)pZfz6^KO)N+#~1dK}d99Kjn$*VXMe}vAzEg+(6yUDb<4T$2icLs-cpOHXuI}vU7 z`4Iv-7;zT8I*QPR$POYhQ}#gHH{*~-z%>Cx&i2G7Qt_yPcw8A#96fP~rg-GYvIcG# zY%Cpuc=Yze01-X(mY{{OqlbR?1Q5-eo#o*pMBAg`Qd{erT8t3o%ji;nO|5FrE1AQY z?*Y7n!cHjJi9?xD6GRkwg$36G@Oo!w2&nSrH>4tr$d@0xBUHU(E%_K8-NT^BA}l!1 zV~8TLk%5rOb25#@hDr_sQs~Wk)&MO$l04bTjVJ>wI1^t)(>S+4KmjuMP_hc5?B272 zLnZP@kog7_u+IysB&}x&*n~qdX90=?FGhEx$T+Ow3A1~s={Tb30`Ai5g0~_xXH~Bp z5v>&UKIg01UaYQ$ADO1T9##IuK}9HJ>k;%DD#u`zEA{T7S5Wx^)?Z{A3r<7J{3mnG z+YbvwM5~h;zwzlVx?SLk!y$^?UBYcL3(|P?O#q?fBcuY827JN0Jq#Qo%a>KWT+4?v zN>VQw*4&OkFa`E*T?c3RmfsO*^z$nOM45Y;o}&EMj=7(_YzTRtltC_U2{gskR~cpf zjT`uo!eepZ)DqrSq@Y1W`B4}KD+en2ugakbFW}#&mFq|{eCTNqD;`l4%9!1|(ZdjK z7~Kz5K9aaD+R;PcMo8!u`$HctS_y_1nmzKG1+6~^{i7jI$3{E}hfzaf{TG&=P%hf* z3#%`Pf8lA{|1Pre-{7Qh?FCZMZY1s^8{S1dPr6{VXAKjD0qF0B*3O+k0UI7ufk$$` z=CL6g$|UsrQNBR{N9oweM2NO@|Ix%o8fCSegH9?G$GeC{4Fh_2TK_M8KIHLo?v=$> zbAQ0F<7&2&`>QNTk{rUng%P9V6JdXG;V5L+kI>NP^9i0u5D5wF29gf{5p5JkC5Hue zz|F>?;9DDzNeDNzO4@3tVb6{ve|m$GVSDbpJCp@&>G_TaI-k)GQpD4qObS9*Qz~vj zqIlZc$xa~V)QPYlzQR;u!Onpg#XOI!HqA3PSl1dKi}Vk1kJe+&QCQ#^`7}&Z$sxOD20NPj9tt(dYlqU^Hv9*` zGFcG-*nH%y##xX{=V|DIw0pKCoE-xo<6#B^j?)vezdW7W3=cwHef1Cj)aS;+hp4Mu z8NfZ1ts1-XwVhD8!y#wD-cOnxtLZHY0J1DvC7Fy z5?Pqgf%Nj1y5UN)KjLW()qFoLQO|+*02oPMveh>169YyMXQzl{R-iXOwNOC%UCaH)= z1d_>i^1vt#S;or~m2FN{3b^tiidD;`gD^Knjjql-g6Hl9R4@eciH0iJRvR#4Vpb9& zc|>yKMyR>pnFy(!t1R}w5p}$|7#BjkaYNX98rwgT^_3MhVY04vlp5Jwbzg~qO7g=5 zl$^ScG1G^=Ip}eG>p(%MgW+`rECm#_6Re3SFcWBV>{C^1-i)Oq9o?B`SVpo%heX#Z ztqc!ZXSjPrpdZ&I5{t3En!epsMoBHhEI5ibJEFZfzd#^uJAwkVj--hQr819huHLg^ z2@BtEQREV}6HQr4L|OuK(xQ{QxRFbq3<|vFG;?S@iuMcT=(q=(~fTn%q z3amDR!}Cf4D=3ITShHx$`$_RelH$e2(CK(!%_3P<{@MTE=* zVmVQO{#Z@HMIZw4B9m1xV+xy4GX5nON_MB=dpxwjM)qHpF{z(f zTb~3^;iC1C5aq{beniP=DfTG+3wwqsP14?2Rzy;ow>6Udhi%GO(G?}x^(v;Yj!k`c z<4ZPmJ~7+~Pq7-)Y=|rgvq+}4w0k@v{YNYCOTyvMv12Y|)Dyg{kf{7OFVippv?HJt zkz*?~paa_3;U*1MXr~cOm&JZ}?h*C(0mnh}0+@$nFzcKOR>D>w>{|b?4oDt+0&-5q zO~$}Z-`xZnwylcHzk%)Z(wLfnU4ldet4%9Tg6>-{Q_T-7i+bYne(SBacrar1X9pSk z`IiX%BX}nS2y6ucI*ZX3b=mtU+O11(YBphVHg_79nyZi9$v?(Lt|H1IAh)DiCwEV$ zyaovch?aw7Z!T00;LWQ*$;SayaQ81t+kye1gbOUa6Cpwbr{3jtaUEDZ<43R!3S1a#qPC#a$zCChEHY+r;^k(?4bOQ`%;6DzLvO*$pj`gUqg?fa{Ol zX(NCI%eS7bh!%5umGl3N)g&ERDgQa=B6Z(aUt{{LUU`nWMU8rD@%8MpiX6z~sVo&6urI{E+GTF+JLHrDV% zA1vjsw>A(kv*G_LUG{mE?FBs#E9`4o>50o=3t<}c-{t9lMwkBqt|e_?ORbb2=gk{v z79)~gsf#a9t$|Gotr*zF zUGvcQOMU6SO|gaLV>e@B`@iOI%61MktbfcGHmi~uW$^j#pU2OMOdauya$5_}$DG@< zX`9!zn6rCcY%Q$5pD(s)>+H3twmm{rw+SsxMxMdGKSk=kLyno}=yXHQZsX@m1GnEF zIHYI(#7|*nc(O|6O_f<`D1HY+DQ6~G+%RD7FuDdJN#0PTuIOg`zHJcx%;AqQd9C6o zRn%@)NU-1{bNM7&<(?NohDr-m{)3O0H)_{pvee_<|v?qe0Y3z_L@t1|B~uo_uTaNHnED3 z(A4q%!Q}eKVfxu3DZFE1Wd;iq%IaBo=h$YM`9EJQ$Kov8TdoLf)o^%*C?kN(LH*=Q zREO*3-&&t%`Zxre{;pUWau*RY-}+%<9+qm&yh8y7RH?u8^iYR`#IuOsFGW!oafY9Hkmd*^T&Se zJ4H!EHpHqqYPy`C86UWuqp+CvtIpL|C1zzJ6Q@6`FMq=?E?a(ZZ6yyZzfvgCk0oGl z)O&NO^t*hnf8u|xye}Q1Hg!KLG&65{;@heko|AcJp!bj7-Xl z^B}{3B(G*DxRuwHAN6a~dYQdvH0j5Fr+eS(%J2KP)HzjNl`0arEbVgZHy_{Z(>JNb zYmn!MXQ1A$*$!Se%!>@T`n`9H?bx{DWT}O-rmXH{MBFH@S^fq8mrvtm(=vAj>>gWg z?m1GI&yAZp0Xms`tH`XzwgI`BjGlAuVkhl)HA@8AZnn4IuXo60gpqy2KQ1r#&qu!x zieiYo3^aHe%Ojul<*t}vX0C1N;}dT_O6`yIqltzQ1=4bjC#PhMW39rZzl?>045+#2 zA&ULW0o<{cxvVJTswpiu)7R;7wu4t6Gj9`KpVn7>?P%B@qq%LbW<=PWBRLh;!w^_6 zcD!Ekd+xkkKNCLlY+b8r#CZ|>yV25Iua;9E)aD9D=%4eC{&&%>q#^81}DQUTrkI+v$_nTE?_W=5=+Oulg|dsZ6)Jj49UXIFRFg zp*&p1c|O6^x0QOSsax<22bFdU42OW4lT(=N4z*n3QtX3rxCW{n#Jgdm`3#$PGr<=K#=M*c(F?qU`+9G3II`KPy;3N0Ajky`mab?P( zmz(iDW`DJsZR8MO{FLTnuFP&zVD(enDtbCJ={n;=`Eo;OIiI{+Z`Z3|ENHSs51rL; z0c-SA-H=zh{z`YbHDjc_%q=}gRNmfy6SKHoziyUsDNND1vzvPZp2GF=0>PzgEuw92 zkXF!Mi5OqD5AKS1v^AlQ)0)x1qaTqqbE0(zBC&&g(Q(LHU|-&he)~w)&9O zbx$ZwEE?M9EVonZUao9KB{G(85w1DW&S6rsjUG2vyUl)Ju7~EJBTsypplw&7$? z(p!hWP|pik4JdK#$*~K``HRtA5zz}%)K=|9<%pF#rurfvbuU1{QifSseW)uk?IQ*$ zcRtMOyy~-1&dZ&uqcWbt`e1VkR)Y{ zi2&eDvFGwta%^H|{eDc<=@(JX%AI;6uHQWfwyqS|TofVi)Z8gT`*7AYBQ7u7Jkuxt z&e3A3`}hs-H3W*E$#_xx8=j5>H)l_D`U)%_skci{xU^DpXne6E!lC?STTMpCq<5{J zJ=+sm=|tl0K!jV!u2^|H{djmxH=uQsLBR7Z&7!jYG($))lD{{rdE49_JzNp%e*{tbx4v`Yq+Jm>!TF9HBU-kTR zPS#d`t-Zkly8-OE(&y_&mOmpmflnmRu@v+-WqZsE>zkJJ2 z#hl&G!`WTyd^JZ$WVgr9@;6D}%3GrfN3&1(Y)c;#i*J{_te1b?;Z7}~S$+Oo!dS~?{w)`# zcQeNG>8ag6zVp_-5Dm$zA0{G`AmEn!%M9hEv|)LU^}~aoHio-?OK!R%ygycP@D8zd zQ`wk>MUt%b4eRcaAg=gb2|eSg#TH(}R)&U*#)NTkdPkGibLnjkCz=HlT^w^3qWul3 zX5Tv~n!ZygC1J)3)_$Q@oVNInXuW+(muHlRPpV#waPIn=Cd5+m_?=4!d$DNTu7v!h zZmD8w%FW1`u-Gv%DqYy&BCGvcRbEyh|1~QUm*Phqr`690Xu9l21wXEv+OMH>=0+?Y zFQ$if>FA%)ZZ=$+G5#d(`14$?eZq{uN8=Y2al#2Qc?+qN%q(}iMO)>J_cpbn!*AvI znKi*}4R^-OMQ#?yhwvKetU(@_E%u`}UFj@i$luzh&t);dOKNLE#(?K!zrx_dn;-pO zsFw>m7McIDC>?&G6{;S=sPpA(&t7V?v3Y3RRy*YTjk(z4FQ3l{?{5azm&d~!Z`lK` zm-0_LxDNd+XB#R~N&d;q>W`3QtbEw6b-IZ$-PO=LJtW{xuTdS(p;`>yH_XZER+ah8 zB~=^Z*?h@*uiH{`s2pRYQMd`(!`*h~rm(uM1P;rOH7D*=uAMNLt70y4p5bGDRc2I8 z_>?QjT`FYmKsbj&Jx9HSTsA9MKv->iSoW~Ze3RvSar#8v%9tJKY0NP0`Ng!;-POp9_#i-;x|}n=GXCKS z{WlDPbGFJoZth1h-^J{n+zJ6%S91mz+e*o$gyGFwC&4Bx`J{JR0jDB&SX5RqH()0{ zH_TU)S-Th|?mBd?Dt%?VA~2KgE1owj8|ANTWgZu>Q`douSJ`$^G}GCTKmq-P&IhEP zvTjp)7W%uxHhTV`60^RdT>nV3UqR1`6xZ)s>E(3m_KQ{E0%{b34Sh<|q)z7rS?7`V zdyQ_~o0zI%p+VU%=In31T<91MKeW`6;#YRM{>PWEPrLfvCqi3t@^NHMAduzUbAeXv z#tb_LF>Pl5?-5Jav9JpMD|wF5T~rQlLf-guO}<|j*d`K!TQ6?m|NUElh-{967xP4| zPVPjhb+7R(wJ0^dC_kV6t?D}G>ltOO(jZ*>vZ>}47mWX%WI4&~S=IbR6fld(S2j%B ztji(3TIMH9i9 z`NX4a4>O-xbSMUd%~Kwjhy#6-D)ijdcX7woj#FzJqx|LX=5^(l%I$mqO|^aDNz&0x z$z_ueGI}jh^2iw7->_e=~+~pr~c?lcelTksm;0M zk5DFThRp6K7&@6&#xliaO|MIff2i?(7aO(G(T!8brR(2nl-0|bieBbpWkXxY0GuR0 z-ma5nIZH`wPv)zmxFP2~FrP|1C=@CS6oVK$EY+0C?xO;!CGxEq(KMMFu<|=Iyo89y2E1C*9+G5$#o*hn_O36BGmFpa=_V_Nx>Wzzm@~|KJ71IZvQIvvMBlb(EL(K+j^{x2uRPZy;Cvp;K1FSBFGK z5A^tw5RDG5`-4@MvFR+AR(LsmPgq+vN5j;3?3KQm7T)CNQ5oM38`l{uw;^d2RNo?< zbw0OAe_M;r%|D;a{qGa%bzAdfQ-@`A#zG;UIHkr50lU9ijsY#kvXp-yqvaQ=#RY%v z);qAwOMM34%TVDd)u!%}oxsB`8~%n{D}e@Lye=tBnJK1)=?ci*liUwm=q%t!-+Q4S z@g}tsW@(A`HAc5hk!J?=wW^5pr*8e(R{5jZVo|%A0W1s_g3~tRU|!A^Y`QAqoAk8j z`P|`jA_oaIf$OSLXx_SQON+xNa4KL<9S#p{ z`5WEPV!}g?<=@=EbCF1~S)#_Ai;afu0N345@5{$lNe^1;;8#B|sbP^kTb~@Iw6W#p zf#td?wgf_?&PM1z8`j%bM!)uF>G|q?s*`2w9j`!+ov)86iuHGJcf~O zK;NfUIJTtALR5V|F5E5ORllC-k|u#90R;VwqZqp$1fuBm7A;(UQ)%XTSAWNf(?oa@dTO%n`lD}?_G#nb_vkjN)4LzZ(lH@sa%~eaXcIR2K-1zn?=fhJlk4( z(@_^aK0dB$CizcT;o#S?&ZNj_o%bq#p#atQDvB8qakl8ycZeh|?}Q*^A|Z0Yh=`mv z>JTY!&+U2XukjSRkVprAteIo#R(L83!`fPiRkVycyAf?CLpDfI=L614mNXs3kHeR5 zde-m8`tJ0S_q}Grih|xR5RH{w62quj@kCIVW$c@}Uio5oELvW7V_kJ`*}J zj4zclM&#R_k2G~hE-KBuw~!NK6s2c*=ILZdd>lAQD*0h5*>pp^Rg1r$+8>hGy0ephOJ4q`&Ur}Y`1UFZ zZ*tMWbk|4x2_nVaYcAz=cYYL-j{ydYUa^?Q^Hus<;xQb^bP*h4sPwr zLl{SfwDHz$L62Z@S%YL#?hKE0xJRdam}i-9#L>=PAIp?4?1&aaUf*6LpODkd4_v$Z z${xgJ-&=lJ9@@CA#gwRGbY|ViBiN3s5ojcz<8zku7ZY*_aII8YZC)x$IAeJ8wd}*o zU#_Yh?Zfph0VU!h_k8!*io~v(5L1(dEOYuVe&K>dDI~ zTC}whUveDBQX{hvcrdPxMu&|NWDg`7XB<9!Pc6Fgm;Xkh0gtsx7$ z+qP3~EC0HVsasu4-S$K-c8;3nS<~mLOD;=~UX?iB?BKgGDB`*qug&7yEnhK2{%*yt zA@IuAHK;TQf%%-`a-_p5!`3)veM5G_#r>POl+BsGDQhHY!*#Dje^e2?>vpTQyF zj6~o~$Q-FWrpnS#?fN}z+dT_`{(1Wme$h5pO~>ZLesYdyZb$GSHvQWhSZVv^T?a=x zP7PwFii6{JqeOSGoX#s2u)vI?QDNZ8w^7{ewp!C*qOXhhdhNY3Qa?{zOwn~JX(20% zK-we5vV33e+UI@{$+`dAeQtQUl^g#|p|I1tK7mUNU6#wwKS0$sbhP9|q{ADOXuJ0X zKlU=dRK{s_eY&Z+KG=cVpO;hCz8AKr6)wy5S;{VpqR+uRww*N1o%=%kS-Qy&I9BP} zInaZM@&waf_A6I8?}=Cy6YR=SQ_(@8-?*K(R7+qLHe@+^;e*N3m+DaT+&L?=AEzpX{??$b?E zMRD1-DONMXE{C26D%W^0mw_GI8C`X!%3_%=^1>a22K z+lpF5hRL`vQ?qtSH2bkNv*&qO#fp#ktlpj0PhUn06Kc14Q5X9XbmsbRrhRyQ`}Y5% zsnKUg?}^$gEyisVDYd7aZOygU9bB$&Yo7YHlDAI&aRQ^GSD(6+9&F#5bVEIcFP2$4 zeub^_Gh?jCTveQ7P6~&d0>1Kull!HS|DCQ*&f)1BbB6-y-EZ{6UFs}F+{TAoe)UJ( zF$-AJES%@=rYb+}W5~FnzbI?Hd~?xDQ!#7l0dJUG_${3I-1yU5GHMJxFG`rh(qo;> zTdlYz;S62wO4hL-NHlOe-f^z9(;nyA6*#x4>UZGh0P1}3d@6mt(@7Wisgi;Z`IDTj z5z7qG)8ml~D?I7iW4Z!;AXF<-+?;bM|LhCjd?4nm>nLANe~~v?BQM#o_lq?zwflkJ zyUm)vU`sHm&m1=m6L;^g&$c#feQk-8_dekxKp(P$J*se+#D|+qBJB^TSDk?}A-oP`R9P|^Cf+S_n;Y)&o{Piv? zn=xjJ=%MzkjReI*1|kac>v+d?4&D9k&#~o8%<#hvMe@P?1|=VRGzxld7bLijH$C;* znQl;Xp*iU~m8q;N7o4ztK*wD}&`8&cx#$bKz+M-QEe==|j*Mx^*z4}ciDd5Z>32Kt zjo~+oRlLr|VqacQK5dfEPKU_jIktk!F{Vwg+JeHfGKUk3r8(Z`ws}MNweQxToXK@T zqxUD`4&`RuIW36(*Z#Q{Nf!L0IQpNu*`iFF&)5r!1*6?H(eV z((T3MZBCDunhJXq2r!zRld6;QTzUt6i2}Q~#1Gc4n}5Ewc2dR26QU-V@wo0q`MC9K zyOm@kZi0r;nmK}EarhPS7gAbgSbQ8}hudN2jm4LT+G@h{Qj9y3RTtsByZ!g*J(%O+v<+ z+RG4#bh|k<>=DmXJo2ebUyrRNb*O+4HruK1RRF>NznywhKf1X-i5e zd}u+8cFabSF7PGp!&Tkl>hD3M$bb#q@5kCyxMu3USiUN`0Cw0MY(i42ro&xL?3}GH zWpLY3J>Ok-gGlz#UD;#TH#Vi}wfQS{QdG)NG5#=)NL& z)c7p-LePEpt^);(UApLoZ$hq%dcUA*f2Z@VxCILrf9m=359hVgtu&0+p6pb1xLa!t zcsmTo|9pKMiv?$8OS)X$YW%2iW^!F@w#EHsaBX4+DJ0L)Ha0!P;*_Q_=YADx)4b(z zb+g-nTzliha^?vHjPRMgDT3A|s>~&(o->59P(b&Q& zeGLI6L#k9jmu)q+d(WXG)-3Jq%an>FQz2af$CgUSG|)S2)13Cp!Em5izaUgx976iY7#gMkEm@HnG)J{l~ZAizI>MYyzv2lH%8 z+yQo8tM-^F#IolYxsfA4VV9BJc#LMV*30yF0Z9?x-#%^E%e}i09bpeyDIXNWKSMt! zc>P-J^_#lE=LEKD!1~fdw7j7@UoW*M&z4Q&hGoYlfqd>`etv}_fm|LcC$P+q!zKem zzfAq(GNoic2#!vg{QmZ|IpMcUF$d~-3aoQ9u)kKA7|XLmQfDYM@6GbZpz%SMZ^uKk z{0`rFr{HEUNI2!IW7#&)D#NF6x0PFdINKo_kWu?`>hP=p`X&U{a>}Y-V%hmv>%FJV z@#4omLVnM!VLj&tEYO~rj^#l(@GWJ$nJRPgRY?jdax7ABb!(Oj=6mY-m+||&LGveq z7Jx!0tI@Y!*b#UXn=&JHROT#K-3oTmns#%VS~1r4wEBtc_ufI<2m4a`d|yQWzBM<#KDnnq(Xr=6>|=1n zjV2*PJORWzGOaqEbtgl?cItkI#vlGh05Z@pBG~V`fB`xYea(0xG z!6WLLU(RmiOw&oK`Y8NiS(uMy_F7E!o@c*iuVn`26#2Beoh+H?h;3+<(Fs2k zr86>ga$fV5rOyeg+})XNkW-Eh--aoF*7Q(3YvOo&TXVjqb_OqZyG<>uNEK%|>gN2! zmifinYWP+6_dRKK(4A_?SLp$t3`x!uB8RCV1D{|?+|JRExBjc~E-z+Fm5cQwdJ~+U zS@n=V0CL5h);6r+C*C=w^6~i2{7kvgI|%&-mtV=kr>>SNt^C1Qt1Io{>%SfioZk3i zEpw?q?(ppc2jMKnYTT~R$LECcWQl0L2LIQ(_yb3BFOM}`xsvfYpxStIipnH6CH(MZ z4)W3CMQvQH8roNbx!PxHdd?Okov%p!!W}Sx>GWrhj6Z- zWG5upd2Hk>H6DAx)xHpP%J|m1+^8KluxZks4_|s>8K%xHat!OjU=XmqJvr&khby&h z2CsDacG#rMEb?<6U2FJMB3ab{w2MJi30`tpb+ zVa0rM`3wQ;e6zbJ3@_~*O(F$P-prjyO3-h=Q>B|XBRND#Ar~A% z8*IR9KTFkAp_!|oCTlF-&K%7Rw#)518tf3)tPqkkxDLUoBt)a}rMOzrQ^pG!rx#RVjx0hDaC9?&+|ph|c>rn=@6eMhJ1froZL5kI`{8q!AJz;wj()Yo zX}WyxcgdUit}Bw3rNDub)qs}?KK*AbTqpG_wkVDc6sn-}DNf60C;1{6C;Qh}FP@+0 zsgJW!!cqZ2;DsSpCCwPM~d#@xDDE7zd7ht(}P0Ccv&E|7}j(f zA*cP#$~k?nlhWy>-Niqz8&19(j?R{OZZMf=t-O(?CF2BmN%u<0vy{AHx-+^zF&F22 zPV|)zBy9=3#ey4Wo~h?#pexXG^LU9T+>J5^1(Vkq!qI3z&S>Z5E zr`CRF#-K>O{jHX)?2x$-M22%`wAUiA=f0#o-!mzmznr;KWK+eTb(9;oT48guu&drd zq1P^A^rRdiKI?jzEgphEuogT$Y`>VZB*Pe6vs0Yfcc=Dz)jg5MbFnfUrHx3OTJc`L zKX1{e6>@Hh{Cb|=Gxz6&!y@^q~HROcvl$ulV-uit6sNpirPV+VJfvysc->IUvg z!lFh6)0ydzg@rGF8h1;>LC;qdsQKpI0^20YCk!gSQ z7d*dz`lXnON3UQ|1yQf>{`j^;Wl(v2-FsUrwmCKJ_5PzEK|6SvPNem1KqyhQSm01T znj zO6?sEX^J*yHPfz&y*nXe!gDgB)s?!auAGxL)omCz`DAXlJQhg|ew~u++&1W~^l7;3 zw78PxN>0tCKW+At{_@tkif4Z=4^eG)A8+cWB|>i15ulk#?k@UCfBBCuazJG~ZqM&) zo4TH#k-hS({j-R0g_Y@)pOT{$9kzRM`U?x+KdJZ4j?eCh$2K{E^9t5IhIzBGe*T6w zZpDt$ROw`F#C)I?h@bP*Qzln4F$@Uu4}5|RZLJp}`9jQ)9%|QHb%*<}hTxrCuk@A2 zXS^RXN)`H*V1|eK!xb1$E&#f7;>trg5DCj1VpY3Gie(~_I*Qa~C#%_-&KzVc3>IGu zsxP^mb{n!yeqL(J==)lq_4|GmHCy;<>C0lVm5o9+y{{dCKd?liFvo>^&MDlJn7lFXe4Xs>f9z_L)(4Y-*pomDqG$I^7wW9!EE#IvGGd z&-&>{z1(AFsyS}HKU^v<>DJeoqO0nr^+9ecr526f27TYrPG6X6W>(c`Ye(30B{#_{ z(}T)QhK~!9D^lTzq$v0d$s53Z?uDhAXc|x##shB~VeT(%_Z|9$n@7fa+di(5&CU{= zH*e<`;Q|l0{W`^&`qrJsSaj))j>SfZC`|41s~_@m&NbNc{FIlUO-$vvz0z{~dR5-* z?YnFLj3ZZ{&v#2r76&99Y?Jz6w=3VOY+!g_*~_Zt%L)!n_m4B*X4VXq);;*Fd(c#; z`vTRDF(BjaY}%X4T=emSv@pr_;UnsQh36dV%4MpqR2AkrxOYB33Wf=7sTf?FVkh&1(_WJ_UdV=IV1aSu9fOIS;86N zd{??Rii5v9M@suopz795J5tiG8NyCd1lB$>9!q?ItQlc{dU3P(*3;oz&z6+6F)zH; zrMDYC6=y-@SCAGGGVxDZ2y$!yK8(>{V(@Y?6MW8W77wnbKX`a&mio3Zmqd$^48{PH zr};|)%OLbevDl?4<%lUD=1{v5)udO@_QKu*V?BDrt#icMIBYF5Lk>= zRqh`~ zrCh4waOxbLn_e{$YG|{x0A8_ZBJMyOLnhmd7mp<1JUX1~3YP$pt)IBGClu5Z!NRGmpYqYdprvQ z(u7^m>)difL9p_4#t;v4rn=KVf3T&h=8{-E-@p)aJ+aqiHebKcX=<4bk3#mt&?P#B zSrzDzQ&5r9eI+WGPWL%s;9CCkrlDrBXBPh2Wx8e*8AD+UhC+4V^A(5uuFpw^E7QNc znVr)8PZT>d-lv^E-#cEI`5~@kc8L1QD+4fj^hslZ%8nAfZSmo=KfcG7T6EX77OGR- zFZE7YjEORr!cV_1vUVW^>UE@5DDSF|Wtyw2(B$(cenRjSNBIKWLyNvFk)1I482CWb zAT*tuhw4ao>lFb*E4;D2HF2rk8R$F*+b49eHRolnFScB~%9(O?N~v?lSnD$~8gC}z zkmOE_Lgsf*q)>t#5%ETN)bnnE`?@Q7cNFRdeD9Kbb_b7zkHFN}RQtx4msSTp4b+nn z!e!S2-#maax&Qdxfo@`?EN~QBzp=t;(H7nAz;2#y{OzJK0H<}fl*gEG*S zVshN3jp>T86P<|st?Td$Wnq*L`UO2q-Qzb}!AX+GpneqI{!F!^ZHDn84zF)vhK{{w zKl6esh6I?S0&BX7VA$DD?y+a(Q>g8Sf+^P_E3>!!V`}1 zgRy}|RLcY@&{zOB_KKZ^*J~N}#gi~8E?{BDc_JkE3!<1atMbR-N0H{9NQFiY(adCR zBQ!d3o2boU6`yRtL+>g=(Bk0&61k6D@Rf!-!2p2++c4K>!N5e(Y9RD%7)ef(f%wC# zr5#X$Y-xBV1f|&3(rzgEU?ouu&SJHM!Kq7bMjKa6_~?8hQu86v?*1nps;mUS!*xB3 zat(&jA#A+ZFd!OQsoU5_$UM!N@^H-_F&_{0XaYq%QHad0hLI7 ztlPaC@TigtYi=zNP0au_D0v)vv1Pq2TLAQs`T}mqM?Dc7_U&Rvj}78I<|#Gp1jKTj zjm#1vIlZ^Oz=bS7?y)&5wZsd z1nBUDX@EaOCc^&_=%a*(D2Y3;0iWu>ypFU3gYg3*tsaJ?lw&2x;s}s$l7#smlS2NO z&M4Unjx~iqtd(MDMFAYfJ%N@87?$NW6$eubAzw1=CE)Q3F+@|{fX_%kcQC>p6PhED zv2;yZDkSFZamG03G?n|91}`cwF5He6;u2zE8*{&=)VtM@+oWGHK(LV$s+q|O(#{|< zNF90po^Be>Y=dCI4;3`Oo(!T3GPVIfz=FDf5O0lUS&ha$kqbAjMVY1mOjjlGh|u7` zMzSR(ez=com7(Rp!*d5-5*lO#Y0GN@3}FHg|8d}YO=w*X5@F^v;Reo{l255X(vFWT z%K&w*kQ1_hC@JiSW(K5Og%ALUn-~P}MbCW@)Nm3qVqRN^W6fXu=?llO;1eVWl$X@3r8U&d~LBJf5!)(pD|#cuwb zPIJU=Fdas^_T>?g37`K@GJm%wEs9do66^N48be{RgR9Y#< zodG9ZM5cI{tBxW>xk100l(0a=+&9p|Xy;o)Xij?dMiWYQSPA<=1$OQDpPg3)$YT@? z{(nEp3eW!UzB*UR>zmkCu6P zHWHdDr}H;phsFLIv`Fih@i=mROTPz}(gu^of|2#_!`dfY$f(DESzZE^FI*UTc9=l; z13UD+s)7D)?`g6QLY=nC#NF7cx=Ic>NWS%-gXEt!O5XUT>%X_$sXY$9^#fQmYQyoF z0{2@^!#_3L&e|bLPhTGM3wGEMg>0XD&Q)AgZ~k4O=jRBH1*k9-AZW6a~q zpCukDK=>U=Kn=?#1f=$S`9P%x9_%X(IYd?*`;MKjf03^PUjZ`lEG420CVugwg%o74 zH0}VZ%Hy!r-G6Vj0T7g-cM95F0#F1g=jC#4BAvN{_cPDFnbDA|fbmFMqaUy7L^ zCd2xY>P1GhoC^ztE5W5f>;mTH%hs0f6j>vsSs7CUzVV_+@WKq?jRKDR20rCb_U08L#d7i1kQ`TOnm{~{J_hY;JH{59~Za~oSK zf80iuO+CAaFrqomF9fW@Lm{-;Q9Z;GOMLV+CwIsl9Kar<5N!7i;y_+N3X87@Gg62p8U-vi^DCc<>)|(*L7T;eQ%c!y|pHjgLG3dEmW~ zbA8A%ce?c7UqWa+G{LLdpLL>cwSn~ycfdDN9>dTJ{;WNAR_4UtI%4E4JG!Q33(bV& zc&H5(n*BWwS1#fx`(vj))17DEsBwnBSG-B`vVWj+JyCgf4T-3&}V=^3#kzR z(2%vq44B8E1k_r~g3goSST`V$cfq+lxa))IxgFUMTCPHwCz^^{vK2UlNDxLl^pma#E@`{0yPNmWZVPhQHFk zEem<$`c+A#Y&Eb^=&+)|>AQ9wY3$Kry3}2_AIRNPY*JNl*BpQ&N!$xurgo)aMoi;k zW<|#rfV2&R@XQd^^Nsh-`i0(dF`8bTD?^t*^nD8VI}&S|7sbd6!wjnbi`5b4vG zVt15gKMC>`LU4?n+|cXIlzcS?8y}OeELxoTuc}ED?_jIz%Kk<}KT|BWU96vcWGxw( zvyBIYBFl1dpd@kUd_!C~33HgC$@$?C5%3ye_oT4VS(7MALgK!eCXUYv_fvwG6g4gr zye9KeBGEVX30cgE85%PK=*d8osnZFuThOZq* zaOd7@Gd0g&i1pF=2n5M_u>GfwTvHU`RR?0)(5!LQUgZ(CQ;K2ZMU>6Ovma3Si0)(l zf@6>sln{yM{LH)&zJ1fX7B11wvJk(+J-&1JORkQh^0$;F9I`!zI@2CHcCwu~>qRud zHJJ*MM~P)?Bo<~S+-QcBx4<5_{&iMW6`g>3nqEw(u2`k6ax364@Y?)H^pYm-8~C=q zpbLtabDLJ)lyRBfV-Hyf*j;KW^uUY|h0&<6d^Yh z^BWRD&mK=vWpK$+XFr^4dL`M~^pGgOJ%kFGwfu##(^x+n{&D=WZZl@~!n=QNdrJS! z%gu(=dVVVIE<9~&K1sg|zSob*uG8!}*Joq(u9LDF#n?HSd8xx(2SK)j4PQ+uUG`Hvhj!Gj{TCws~)<&dj^Y+&~$#O{16hipluC1W{L zW^mDz{s;ibc>7SLPYhmM1Vcf5b9p3%KgJ6AnDG<7Oa2@m*XBg8MZ|I5R!M=8&-w9) vTC-sy>L>?qvP_6n!uiuM sendFocusedCommand("open") }, + { label: "Сохранить как...", accelerator: "CmdOrCtrl+S", click: () => sendFocusedCommand("save") }, + { type: "separator" }, + { label: "Экспорт в PDF...", accelerator: "CmdOrCtrl+Shift+E", click: () => sendFocusedCommand("export-pdf") }, + { type: "separator" }, + { label: "Печать...", accelerator: "CmdOrCtrl+P", click: () => sendFocusedCommand("print") }, + { type: "separator" }, + isMac ? { role: "close", label: "Закрыть окно" } : { role: "quit", label: "Выход" } + ] + }, + { + label: "Правка", + submenu: [ + { role: "undo", label: "Отменить" }, + { role: "redo", label: "Повторить" }, + { type: "separator" }, + { role: "cut", label: "Вырезать" }, + { role: "copy", label: "Копировать" }, + { role: "paste", label: "Вставить" }, + { role: "selectAll", label: "Выделить все" } + ] + }, + { + label: "Вид", + submenu: [ + { role: "resetZoom", label: "Сбросить масштаб" }, + { role: "zoomIn", label: "Увеличить" }, + { role: "zoomOut", label: "Уменьшить" }, + { type: "separator" }, + { role: "togglefullscreen", label: "Во весь экран" } + ] + }, + { + label: "Окно", + submenu: [ + { role: "minimize", label: "Свернуть" }, + { role: "reload", label: "Перезагрузить" }, + ...(isDev ? [{ role: "toggleDevTools", label: "Инструменты разработчика" }] : []) + ] + } + ]; + + Menu.setApplicationMenu(Menu.buildFromTemplate(template)); +} + +ipcMain.handle("qoffice:open-office-file", async (event, kind) => { + const config = validatedKind(kind); + const result = await dialog.showOpenDialog(ownerWindow(event), { + title: config.title, + properties: ["openFile"], + filters: config.filters + }); + + if (result.canceled || result.filePaths.length === 0) { + return { canceled: true }; + } + + const filePath = result.filePaths[0]; + const bytes = await fs.readFile(filePath); + return { + canceled: false, + fileName: path.basename(filePath), + filePath, + base64Data: bytes.toString("base64") + }; +}); + +ipcMain.handle("qoffice:save-office-file", async (event, payload) => { + if (!payload || typeof payload !== "object") { + throw new Error("Некорректный запрос сохранения файла QOffice."); + } + + const { kind, defaultFileName, base64Data } = payload; + const config = validatedKind(kind); + if (typeof base64Data !== "string") { + throw new Error("Некорректные данные файла QOffice."); + } + + const result = await dialog.showSaveDialog(ownerWindow(event), { + title: config.saveTitle, + defaultPath: safeDefaultName(kind, defaultFileName), + filters: config.filters + }); + + if (result.canceled || !result.filePath) { + return { canceled: true }; + } + + await fs.writeFile(result.filePath, Buffer.from(base64Data, "base64")); + return { + canceled: false, + fileName: path.basename(result.filePath), + filePath: result.filePath + }; +}); + +ipcMain.handle("qoffice:export-pdf", async (event, defaultFileName) => { + const sourceWindow = ownerWindow(event); + if (!sourceWindow) { + throw new Error("Не удалось найти окно QOffice для экспорта PDF."); + } + + const result = await dialog.showSaveDialog(sourceWindow, { + title: "Экспорт PDF", + defaultPath: safeFileNameWithExtension(defaultFileName, "pdf", "QOffice.pdf"), + filters: [{ name: "PDF (.pdf)", extensions: ["pdf"] }] + }); + + if (result.canceled || !result.filePath) { + return { canceled: true }; + } + + const pdf = await event.sender.printToPDF({ + printBackground: true, + preferCSSPageSize: true + }); + + await fs.writeFile(result.filePath, pdf); + return { + canceled: false, + fileName: path.basename(result.filePath), + filePath: result.filePath + }; +}); + +function createWindow() { + const mainWindow = new BrowserWindow({ + width: 1440, + height: 920, + minWidth: 1080, + minHeight: 720, + title: "QOffice", + backgroundColor: "#f6f8fb", + webPreferences: { + preload: path.join(__dirname, "preload.cjs"), + contextIsolation: true, + nodeIntegration: false + } + }); + + mainWindow.webContents.setWindowOpenHandler(({ url }) => { + shell.openExternal(url); + return { action: "deny" }; + }); + + if (isDev) { + mainWindow.loadURL("http://127.0.0.1:5173"); + } else { + mainWindow.loadFile(path.join(__dirname, "../dist/index.html")); + } +} + +app.whenReady().then(() => { + createApplicationMenu(); + createWindow(); + + app.on("activate", () => { + if (BrowserWindow.getAllWindows().length === 0) { + createWindow(); + } + }); +}); + +app.on("window-all-closed", () => { + if (process.platform !== "darwin") { + app.quit(); + } +}); diff --git a/electron/preload.cjs b/electron/preload.cjs new file mode 100644 index 0000000..005f124 --- /dev/null +++ b/electron/preload.cjs @@ -0,0 +1,20 @@ +const { contextBridge, ipcRenderer } = require("electron"); + +ipcRenderer.on("qoffice:command", (_event, command) => { + if (typeof command === "string") { + window.dispatchEvent(new CustomEvent("qoffice-command", { detail: { command } })); + } +}); + +contextBridge.exposeInMainWorld("qoffice", { + isDesktop: true, + platform: process.platform, + openOfficeFile: (kind) => ipcRenderer.invoke("qoffice:open-office-file", kind), + saveOfficeFile: (kind, defaultFileName, base64Data) => + ipcRenderer.invoke("qoffice:save-office-file", { + kind, + defaultFileName, + base64Data + }), + exportPdf: (defaultFileName) => ipcRenderer.invoke("qoffice:export-pdf", defaultFileName) +}); diff --git a/index.html b/index.html new file mode 100644 index 0000000..5d74977 --- /dev/null +++ b/index.html @@ -0,0 +1,12 @@ + + + + + + QOffice + + +

+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5861356 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6807 @@ +{ + "name": "qoffice", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "qoffice", + "version": "0.1.0", + "dependencies": { + "@kenjiuno/msgreader": "^1.28.0", + "buffer": "^6.0.3", + "docx": "^9.7.1", + "fast-xml-parser": "^5.8.0", + "jszip": "^3.10.1", + "lucide-react": "^0.468.0", + "mammoth": "^1.12.0", + "pptxgenjs": "^4.0.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "string_decoder": "^1.3.0" + }, + "devDependencies": { + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^15.0.7", + "@types/react": "^18.3.27", + "@types/react-dom": "^18.3.7", + "@vitejs/plugin-react": "^6.0.2", + "concurrently": "^10.0.0", + "electron": "^42.3.0", + "electron-builder": "^26.8.1", + "jsdom": "^29.1.1", + "typescript": "^5.7.3", + "vite": "^8.0.14", + "vitest": "^4.1.7", + "wait-on": "^8.0.5" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.5.0.tgz", + "integrity": "sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@asamuzakjp/css-color": { + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.11.tgz", + "integrity": "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/generational-cache": "^1.0.1", + "@csstools/css-calc": "^3.2.0", + "@csstools/css-color-parser": "^4.1.0", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.1.1.tgz", + "integrity": "sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/generational-cache": "^1.0.1", + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.2.1", + "is-potential-custom-element-name": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/generational-cache": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz", + "integrity": "sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/nwsapi": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", + "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bramus/specificity": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", + "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^3.0.0" + }, + "bin": { + "specificity": "bin/cli.js" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", + "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@csstools/css-calc": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz", + "integrity": "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.1.tgz", + "integrity": "sha512-eZ5XOtyhK+mggRafYUWzA0tvaYOFgdY8AkgQiCJF9qNAePnUo/zmsqqYubBBb3sQ8uNUaSKTY9s9klfRaAXL0g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^6.0.2", + "@csstools/css-calc": "^3.2.1" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.4.tgz", + "integrity": "sha512-wgsqt92b7C7tQhIdPNxj0n9zuUbQlvAuI1exyzeNrOKOi62SD7ren8zqszmpVREjAOqg8cD2FqYhQfAuKjk4sw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@develar/schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@electron/asar": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", + "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/asar/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/@electron/asar/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@electron/asar/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@electron/fuses": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz", + "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.1", + "fs-extra": "^9.0.1", + "minimist": "^1.2.5" + }, + "bin": { + "electron-fuses": "dist/bin.js" + } + }, + "node_modules/@electron/fuses/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/@electron/fuses/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/fuses/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/@electron/get": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-5.0.0.tgz", + "integrity": "sha512-pjoBpru1KdEtcExBnuHAP1cAc/5faoedw0hzJkL3o4/IJp7HNF1+fbrdxT3gMYRX2oJfvnA/WXeCTVQpYYxyJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^3.0.0", + "graceful-fs": "^4.2.11", + "progress": "^2.0.3", + "semver": "^7.6.3", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=22.12.0" + }, + "optionalDependencies": { + "undici": "^7.24.4" + } + }, + "node_modules/@electron/notarize": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz", + "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/osx-sign": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz", + "integrity": "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@electron/rebuild": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-4.0.4.tgz", + "integrity": "sha512-Rzc39XPdk/+/wBG8MfwAHohXflep0ITUfulb6Rgz3R0NeSB1noE+E9/M/cb8ftCAiyDD9PPhLuuWgE1GaInbKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.1.1", + "node-abi": "^4.2.0", + "node-api-version": "^0.2.1", + "node-gyp": "^12.2.0", + "read-binary-file-arch": "^1.0.6" + }, + "bin": { + "electron-rebuild": "lib/cli.js" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@electron/universal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.3.tgz", + "integrity": "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "^3.3.1", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "dir-compare": "^4.2.0", + "fs-extra": "^11.1.1", + "minimatch": "^9.0.3", + "plist": "^3.1.0" + }, + "engines": { + "node": ">=16.4" + } + }, + "node_modules/@electron/universal/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/@electron/universal/node_modules/brace-expansion": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/universal/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@electron/windows-sign": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz", + "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "dependencies": { + "cross-dirname": "^0.1.0", + "debug": "^4.3.4", + "fs-extra": "^11.1.1", + "minimist": "^1.2.8", + "postject": "^1.0.0-alpha.6" + }, + "bin": { + "electron-windows-sign": "bin/electron-windows-sign.js" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/windows-sign/node_modules/fs-extra": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@exodus/bytes": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz", + "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, + "node_modules/@hapi/address": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-5.1.1.tgz", + "integrity": "sha512-A+po2d/dVoY7cYajycYI43ZbYMXukuopIsqCjh5QzsBCipDtdofHntljDlpccMjIfTy6UOkg+5KPriwYch2bXA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^11.0.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@hapi/formula": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-3.0.2.tgz", + "integrity": "sha512-hY5YPNXzw1He7s0iqkRQi+uMGh383CGdyyIGYtB+W5N3KHPXoqychklvHhKCC9M3Xtv0OCs/IHw+r4dcHtBYWw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/hoek": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.7.tgz", + "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/pinpoint": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.1.tgz", + "integrity": "sha512-EKQmr16tM8s16vTT3cA5L0kZZcTMU5DUOZTuvpnY738m+jyP3JIUj+Mm1xc1rsLkGBQ/gVnfKYPwOmPg1tUR4Q==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/tlds": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@hapi/tlds/-/tlds-1.1.6.tgz", + "integrity": "sha512-xdi7A/4NZokvV0ewovme3aUO5kQhW9pQ2YD1hRqZGhhSi5rBv4usHYidVocXSi9eihYsznZxLtAiEYYUL6VBGw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@hapi/topo": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-6.0.2.tgz", + "integrity": "sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^11.0.2" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@kenjiuno/decompressrtf": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@kenjiuno/decompressrtf/-/decompressrtf-0.1.4.tgz", + "integrity": "sha512-v9c/iFz17jRWyd2cRnrvJg4VOg/4I/VCk+bG8JnoX2gJ9sAesPzo3uTqcmlVXdpasTI8hChpBVw00pghKe3qTQ==", + "license": "BSD-2-Clause" + }, + "node_modules/@kenjiuno/msgreader": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@kenjiuno/msgreader/-/msgreader-1.28.0.tgz", + "integrity": "sha512-+iv2rWCGRHmX/3sBwXZzkThEuuywGJjnYsvxj6Kp1L/FDMICQcFrtqN+6MFrnh2d+umtfGtX904wxaYEDZ52MQ==", + "license": "Apache-2.0", + "dependencies": { + "@kenjiuno/decompressrtf": "^0.1.3", + "iconv-lite": "^0.6.3" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@malept/cross-spawn-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", + "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/@malept/flatpak-bundler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@nodable/entities": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.1.tgz", + "integrity": "sha512-Pig3HxDIoMgjdEH8OCf/dkcTmLFjJRjWuq8jSnklu284/TKOPibSRERmOykiwmyXTtv61mP+44f3GMx0tLAyjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nodable" + } + ], + "license": "MIT" + }, + "node_modules/@oxc-project/types": { + "version": "0.132.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.132.0.tgz", + "integrity": "sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.2.tgz", + "integrity": "sha512-ZS4D1JPGn/MYQN/SYDWftIE/nVsM8j/AFOYEzAoOE2O3NktQOZru+/vYXGbR/qtdLdIfGCP0lcoJiYVzsEz+iQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.2.tgz", + "integrity": "sha512-vdFA9+C/rekyGce7WqHs/xoT0ioZEWaOFyZLIV1mEeNFaFDUQrPIo8Vs2GvJ6eetb3rzDUtUBgzto3ExpXJB3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.2.tgz", + "integrity": "sha512-BewSOwTHazv77DTYiAZXSqqKZ4KP/KonFisDMVU7PImxoWfB2aepnPhd2E4SWz3zDzYgDNbs6jBmTdgNnF02GA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.2.tgz", + "integrity": "sha512-m41o7M0YWtUdqk61Tb+jnKb2rN++iRdIASlExkUoKfIAH30DOHCB8fVLzSUpbWHHU8esmEioY62PxzexE8MBuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.2.tgz", + "integrity": "sha512-jcojB9H7W/jS29pMKWAK1N+fU99vXodHDTatS3b3y/XSOCiHo0kkA74pL3jJmkoQtYpOCxDvaKs1fo2Ij/1X5w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.2.tgz", + "integrity": "sha512-1jn6qDU5iiOgFgygDzKUuKP0maTi0/f1+sBLgvij/76C77Nm3ts6ufz9Bjg5q5dduxiUIxtq86JIoBvo1xQ4Ig==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.2.tgz", + "integrity": "sha512-QVLO/czFMdoMFSqlX3bcswcJNm/23r+qoa/jgtmFc/qEp6/jXmIkDjF/XIo8dPfGaiwy1xfQn8o77L79GeXFgw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.2.tgz", + "integrity": "sha512-hgO5Abm0w5UL6FEa2iFnZqo2KlK7TQ5QhV5x09hujBf7t5KzHQ1VmfPuTpqRy/rNlSxua3eWH374xxiVrP+lcA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.2.tgz", + "integrity": "sha512-fy8rXxuYEu602abC8MUNaPjYLIFzReOaEIEMKMUa0rFEUxNpVXhs15KSSQ4qlqSaM7B6rcj9rDZgADh/IGDzLQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.2.tgz", + "integrity": "sha512-0+bOkiQ779+r1WpoHOWHqncvyySci0vKph+myNDYb+im6meJAzHQXay6oEgnkHuUGouM1LKTZwqKpBow6Kj7CQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.2.tgz", + "integrity": "sha512-mjSkrzZK5Qsl0a9d1JgILOiuZOSDTVdKENcSXBoqbzSrspLR/4/IRVDo5wd2GgZjNss/viBFJdeq+j7qH2nypw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.2.tgz", + "integrity": "sha512-1v5vHasdfQAZoEHakBV72LIFAC9JjnymsiKxp+GEr/ma3+NJCPSaYK+qavInOovJkgwFrs7GccX2d6IgDA3Z5w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.2.tgz", + "integrity": "sha512-mb1VobWn6NheziTk5/WEaR6AKVbrwT5sOi6C7zk3gy/pD1qtJfU1j4PgTo2NJnOtbL9Dl3Aeei8w9jJ7qC2jZQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.2.tgz", + "integrity": "sha512-SqKonF56vA/L2yHwHYcEp2P34URpOZ7d1fS635cTkpDnUtEGdUbhI6NzsPdqeSWvAAeGDrxjWjNmibDIdFf9/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.2.tgz", + "integrity": "sha512-v7qRI7gXLRINcOGXt+7YmAZ6iFuyZVMIoXAxhd8oP+DR9dLfL9GfNIx7PLMxmhZdvq8waUJBQiWN9EKNy+TRBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/@testing-library/dom/node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/react": { + "version": "15.0.7", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-15.0.7.tgz", + "integrity": "sha512-cg0RvEdD1TIhhkm1IeYMQxrzy0MtUNfa3minv4MjbgcYzJAZ7yD0i0lwoPOTPr+INtiXFezt2o8xMSnyHhEn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^10.0.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "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/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", + "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/@types/plist": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*", + "xmlbuilder": ">=11.0.1" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.29", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.29.tgz", + "integrity": "sha512-ch0qJdr2JY0r04NXSprbK6TXOgnaJ1Tz23fm5W+z0/CBah6BSBc3n96h7K9GOtwh0HrilNWHIBzE1Ko4Dcw/Wg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/verror": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.11.tgz", + "integrity": "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.2.tgz", + "integrity": "sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/@vitest/expect": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.7.tgz", + "integrity": "sha512-1R+tw0ortHEbZDGMymm+pN7/AFQ/RkFFdtd7EN+VBpynKmLbP8A3rpEXdshBJ7+8hQ9zBJh/i1s0yKNtxAnU7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.7", + "@vitest/utils": "4.1.7", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.7.tgz", + "integrity": "sha512-vY7nuamKgfvpA1Koa3oYIw/k7D6kZnpGyNMZW8loow2bsBYla1TFdqTaXncWdRn4pgwNs+90RhnXhJScDwQeJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.7", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.7.tgz", + "integrity": "sha512-umgCarTOYQWIaDMvGDRZij+6b9oVeLIyJzfN+AS88e0ZOU3QTgNNSTtjQOpcvWr3np1N0j4WgZj+sb3oYBDscw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.7.tgz", + "integrity": "sha512-BapjmAQ2aI78WdMEfeUWivnfVzB+VPGwWRQcJE0OUq7qEeEcBsCSf+0T5iREBNE5nBb4wA5Ya0W6IA+sghdEFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.7", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.7.tgz", + "integrity": "sha512-ZacLzja+TmJeZ1h14xW2FB/WpeimUD3haBXQPyJqxvo8jQTmfeA8zv58mtjN2C7EHXZDYVcVYdYmAxjkWVvKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.7", + "@vitest/utils": "4.1.7", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.7.tgz", + "integrity": "sha512-kbkI5LMWakyuTIvs6fUJ5qdIVb1XVKsYJAT4OJ938cHMROYMSfmoQdZy0aaAnjbbc8F61vkoTqz/Az+/HiIu5Q==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.7.tgz", + "integrity": "sha512-T532WBu791cBxJlCl6SO+J14l81DQx6uQHm1bQbmCDY7nqlEIgkza/UFnSBNaUtSf41unldDFjdOBYEQC4b5Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.7", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", + "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/7zip-bin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", + "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/abbrev": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", + "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "peer": true, + "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/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/app-builder-bin": { + "version": "5.0.0-alpha.12", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-5.0.0-alpha.12.tgz", + "integrity": "sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/app-builder-lib": { + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.8.1.tgz", + "integrity": "sha512-p0Im/Dx5C4tmz8QEE1Yn4MkuPC8PrnlRneMhWJj7BBXQfNTJUshM/bp3lusdEsDbvvfJZpXWnYesgSLvwtM2Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@develar/schema-utils": "~2.6.5", + "@electron/asar": "3.4.1", + "@electron/fuses": "^1.8.0", + "@electron/get": "^3.0.0", + "@electron/notarize": "2.5.0", + "@electron/osx-sign": "1.3.3", + "@electron/rebuild": "^4.0.3", + "@electron/universal": "2.0.3", + "@malept/flatpak-bundler": "^0.4.0", + "@types/fs-extra": "9.0.13", + "async-exit-hook": "^2.0.1", + "builder-util": "26.8.1", + "builder-util-runtime": "9.5.1", + "chromium-pickle-js": "^0.2.0", + "ci-info": "4.3.1", + "debug": "^4.3.4", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", + "ejs": "^3.1.8", + "electron-publish": "26.8.1", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "isbinaryfile": "^5.0.0", + "jiti": "^2.4.2", + "js-yaml": "^4.1.0", + "json5": "^2.2.3", + "lazy-val": "^1.0.5", + "minimatch": "^10.0.3", + "plist": "3.1.0", + "proper-lockfile": "^4.1.2", + "resedit": "^1.7.0", + "semver": "~7.7.3", + "tar": "^7.5.7", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0", + "which": "^5.0.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "dmg-builder": "26.8.1", + "electron-builder-squirrel-windows": "26.8.1" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.1.0.tgz", + "integrity": "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get/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/app-builder-lib/node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/app-builder-lib/node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/app-builder-lib/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/app-builder-lib/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/app-builder-lib/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "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/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.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==", + "dev": true, + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/axios": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz", + "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/axios/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/axios/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/builder-util": { + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.8.1.tgz", + "integrity": "sha512-pm1lTYbGyc90DHgCDO7eo8Rl4EqKLciayNbZqGziqnH9jrlKe8ZANGdityLZU+pJh16dfzjAx2xQq9McuIPEtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/debug": "^4.1.6", + "7zip-bin": "~5.2.0", + "app-builder-bin": "5.0.0-alpha.12", + "builder-util-runtime": "9.5.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.6", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "js-yaml": "^4.1.0", + "sanitize-filename": "^1.6.3", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0" + } + }, + "node_modules/builder-util-runtime": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.5.1.tgz", + "integrity": "sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/builder-util/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/builder-util/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/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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/concurrently": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-10.0.0.tgz", + "integrity": "sha512-DRrk10z3sVPpguNe8od2cGNqZGqbT15rwAnxD4dG3b78mdNNb/gJyr8T834Oj518WcBmTktrt4FhdwZn09ZWSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "5.6.2", + "rxjs": "7.8.2", + "shell-quote": "1.8.4", + "supports-color": "10.2.2", + "tree-kill": "1.2.2", + "yargs": "18.0.0" + }, + "bin": { + "conc": "dist/bin/index.js", + "concurrently": "dist/bin/index.js" + }, + "engines": { + "node": ">=22" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "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/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "license": "MIT" + }, + "node_modules/crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "buffer": "^5.1.0" + } + }, + "node_modules/crc/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/cross-dirname": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", + "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", + "dev": true, + "license": "MIT", + "optional": true + }, + "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/cross-spawn/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/cross-spawn/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/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/data-urls": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", + "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/dingbat-to-unicode": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dingbat-to-unicode/-/dingbat-to-unicode-1.0.1.tgz", + "integrity": "sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w==", + "license": "BSD-2-Clause" + }, + "node_modules/dir-compare": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", + "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5", + "p-limit": "^3.1.0 " + } + }, + "node_modules/dir-compare/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/dir-compare/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/dir-compare/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dmg-builder": { + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.8.1.tgz", + "integrity": "sha512-glMJgnTreo8CFINujtAhCgN96QAqApDMZ8Vl1r8f0QT8QprvC1UCltV4CcWj20YoIyLZx6IUskaJZ0NV8fokcg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "app-builder-lib": "26.8.1", + "builder-util": "26.8.1", + "fs-extra": "^10.1.0", + "iconv-lite": "^0.6.2", + "js-yaml": "^4.1.0" + }, + "optionalDependencies": { + "dmg-license": "^1.0.11" + } + }, + "node_modules/dmg-license": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", + "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "@types/plist": "^3.0.1", + "@types/verror": "^1.10.3", + "ajv": "^6.10.0", + "crc": "^3.8.0", + "iconv-corefoundation": "^1.1.7", + "plist": "^3.0.4", + "smart-buffer": "^4.0.2", + "verror": "^1.10.0" + }, + "bin": { + "dmg-license": "bin/dmg-license.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/docx": { + "version": "9.7.1", + "resolved": "https://registry.npmjs.org/docx/-/docx-9.7.1.tgz", + "integrity": "sha512-ilXFf9Moz47ABjFpDiA5s1w9lpb4EFSp7+5iiJSbfyYDM+bpZdAgLlSr7fW4aXhVe/E+F6QCv0EvRVFEd5CsWg==", + "license": "MIT", + "dependencies": { + "@types/node": "^25.2.3", + "hash.js": "^1.1.7", + "jszip": "^3.10.1", + "nanoid": "^5.1.3", + "xml": "^1.0.1", + "xml-js": "^1.6.8" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/duck": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/duck/-/duck-0.1.12.tgz", + "integrity": "sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg==", + "license": "BSD", + "dependencies": { + "underscore": "^1.13.1" + } + }, + "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==", + "dev": true, + "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/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron": { + "version": "42.3.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-42.3.0.tgz", + "integrity": "sha512-9ZiLdRXk+WDxW1OgIUz8J2rIQ5TYU9o629gCOjU48Q3dQiOmym7osWsH5Ubs/Jh4uuFLn6m6SBD2rmRXLAPz9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/get": "^5.0.0", + "@types/node": "^24.9.0", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js", + "install-electron": "install.js" + }, + "engines": { + "node": ">= 22.12.0" + } + }, + "node_modules/electron-builder": { + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.8.1.tgz", + "integrity": "sha512-uWhx1r74NGpCagG0ULs/P9Nqv2nsoo+7eo4fLUOB8L8MdWltq9odW/uuLXMFCDGnPafknYLZgjNX0ZIFRzOQAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "26.8.1", + "builder-util": "26.8.1", + "builder-util-runtime": "9.5.1", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "dmg-builder": "26.8.1", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "electron-builder": "cli.js", + "install-app-deps": "install-app-deps.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/electron-builder-squirrel-windows": { + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.8.1.tgz", + "integrity": "sha512-o288fIdgPLHA76eDrFADHPoo7VyGkDCYbLV1GzndaMSAVBoZrGvM9m2IehdcVMzdAZJ2eV9bgyissQXHv5tGzA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "app-builder-lib": "26.8.1", + "builder-util": "26.8.1", + "electron-winstaller": "5.4.0" + } + }, + "node_modules/electron-builder/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/electron-builder/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-builder/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/electron-builder/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/electron-builder/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-builder/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-publish": { + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.8.1.tgz", + "integrity": "sha512-q+jrSTIh/Cv4eGZa7oVR+grEJo/FoLMYBAnSL5GCtqwUpr1T+VgKB/dn1pnzxIxqD8S/jP1yilT9VrwCqINR4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/fs-extra": "^9.0.11", + "builder-util": "26.8.1", + "builder-util-runtime": "9.5.1", + "chalk": "^4.1.2", + "form-data": "^4.0.5", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" + } + }, + "node_modules/electron-publish/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/electron-publish/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/electron-winstaller": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", + "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "^3.2.1", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.21", + "temp": "^0.9.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "@electron/windows-sign": "^1.1.2" + } + }, + "node_modules/electron-winstaller/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/electron-winstaller/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-winstaller/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/electron/node_modules/@types/node": { + "version": "24.12.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.4.tgz", + "integrity": "sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/electron/node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "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==", + "dev": true, + "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/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "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==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "optional": true + }, + "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-xml-builder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz", + "integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.5.0", + "xml-naming": "^0.1.0" + } + }, + "node_modules/fast-xml-parser": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.8.0.tgz", + "integrity": "sha512-6bIM7fsJxeo3uXv7OncQYsBAMPJ7V16Slahl/6M98C/i2q+vB1+4a0MtrvYwDFEUrwDSbAmeLDRXsOBwrL7yAg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "@nodable/entities": "^2.1.0", + "fast-xml-builder": "^1.2.0", + "path-expression-matcher": "^1.5.0", + "strnum": "^2.3.0", + "xml-naming": "^0.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/filelist": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", + "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/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/filelist/node_modules/brace-expansion": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "dev": true, + "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.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "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/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/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/glob/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "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-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.6.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz", + "integrity": "sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==", + "license": "ISC" + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-corefoundation": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", + "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "cli-truncate": "^2.1.0", + "node-addon-api": "^1.6.3" + }, + "engines": { + "node": "^8.11.2 || >=10" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/image-size": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", + "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", + "license": "MIT", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/isbinaryfile": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", + "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/joi": { + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-18.2.1.tgz", + "integrity": "sha512-2/OKlogiESf2Nh3TFCrRjrr9z1DRHeW0I+KReF67+4J0Ns+8hBtHRmoWAZ2OFU6I5+TWLEe6sVlSdXPjHm5UbQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/address": "^5.1.1", + "@hapi/formula": "^3.0.2", + "@hapi/hoek": "^11.0.7", + "@hapi/pinpoint": "^2.0.1", + "@hapi/tlds": "^1.1.1", + "@hapi/topo": "^6.0.2", + "@standard-schema/spec": "^1.1.0" + }, + "engines": { + "node": ">= 20" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.1.tgz", + "integrity": "sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^5.1.11", + "@asamuzakjp/dom-selector": "^7.1.1", + "@bramus/specificity": "^2.4.2", + "@csstools/css-syntax-patches-for-csstree": "^1.1.3", + "@exodus/bytes": "^1.15.0", + "css-tree": "^3.2.1", + "data-urls": "^7.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.3.5", + "parse5": "^8.0.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.1", + "undici": "^7.25.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.1", + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.1", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/lru-cache": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/jsdom/node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "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-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-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC", + "optional": true + }, + "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/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "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/lazy-val": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "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/lop": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/lop/-/lop-0.4.2.tgz", + "integrity": "sha512-RefILVDQ4DKoRZsJ4Pj22TxE3omDO47yFpkIBoDKzkqPRISs5U1cnAdg/5583YPkWPaLIYHOKRMQSvjFsO26cw==", + "license": "BSD-2-Clause", + "dependencies": { + "duck": "^0.1.12", + "option": "~0.2.1", + "underscore": "^1.13.1" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lucide-react": { + "version": "0.468.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.468.0.tgz", + "integrity": "sha512-6koYRhnM2N0GGZIdXzSeiNwguv1gt/FAjZOiPl76roBi3xKEXa4WmfpxgQwTTL4KipXjefrnf3oV4IsYhi4JFA==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mammoth": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/mammoth/-/mammoth-1.12.0.tgz", + "integrity": "sha512-cwnK1RIcRdDMi2HRx2EXGYlxqIEh0Oo3bLhorgnsVJi2UkbX1+jKxuBNR9PC5+JaX7EkmJxFPmo6mjLpqShI2w==", + "license": "BSD-2-Clause", + "dependencies": { + "@xmldom/xmldom": "^0.8.6", + "argparse": "~1.0.3", + "base64-js": "^1.5.1", + "bluebird": "~3.4.0", + "dingbat-to-unicode": "^1.0.1", + "jszip": "^3.7.1", + "lop": "^0.4.2", + "path-is-absolute": "^1.0.0", + "underscore": "^1.13.1", + "xmlbuilder": "^10.0.0" + }, + "bin": { + "mammoth": "bin/mammoth" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/mammoth/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/mammoth/node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", + "license": "MIT" + }, + "node_modules/mammoth/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/mammoth/node_modules/xmlbuilder": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-10.1.1.tgz", + "integrity": "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.11.tgz", + "integrity": "sha512-v+KEsUv2ps74PaSKv0gHTxTCgMXOIfBEbaqa6w6ISIGC7ZsvHN4N9oJ8d4cmf0n5oTzQz2SLmThbQWhjd/8eKg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/node-abi": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-4.31.0.tgz", + "integrity": "sha512-Erq5w/t3syw3s4sDsUaX4QttIdBPsGKTT1DTRsCkTonGggczhlDKm/wDX3o+HPJpQ41EjXCbcmXf0tgr5YZJXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.6.3" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-api-version": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz", + "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + } + }, + "node_modules/node-gyp": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.3.0.tgz", + "integrity": "sha512-QNcUWM+HgJplcPzBvFBZ9VXacyGZ4+VTOb80PwWR+TlVzoHbRKULNEzpRsnaoxG3Wzr7Qh7BYxGDU3CbKib2Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "tar": "^7.5.4", + "tinyglobby": "^0.2.12", + "undici": "^6.25.0", + "which": "^6.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-gyp/node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/node-gyp/node_modules/undici": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.26.0.tgz", + "integrity": "sha512-4yqz8a3n5HmGTlsbADNtr/dJlhkh/55Rq798G6ibiULcXbDtaLpTl1pvdqcbFfeoj3iSi52lePFM7h9H21cw/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/nopt": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", + "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^4.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/option": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/option/-/option-0.2.4.tgz", + "integrity": "sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A==", + "license": "BSD-2-Clause" + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-expression-matcher": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", + "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pe-library": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", + "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "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.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "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/postject": { + "version": "1.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", + "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "commander": "^9.4.0" + }, + "bin": { + "postject": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/postject/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/pptxgenjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pptxgenjs/-/pptxgenjs-4.0.1.tgz", + "integrity": "sha512-TeJISr8wouAuXw4C1F/mC33xbZs/FuEG6nH9FG1Zj+nuPcGMP5YRHl6X+j3HSUnS1f3at6k75ZZXPMZlA5Lj9A==", + "license": "MIT", + "dependencies": { + "@types/node": "^22.8.1", + "https": "^1.0.0", + "image-size": "^1.2.1", + "jszip": "^3.10.1" + } + }, + "node_modules/pptxgenjs/node_modules/@types/node": { + "version": "22.19.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.19.tgz", + "integrity": "sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/pptxgenjs/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "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/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "bin": { + "read-binary-file-arch": "cli.js" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resedit": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz", + "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pe-library": "^0.4.1" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/rolldown": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.2.tgz", + "integrity": "sha512-oZx5zVDtVB44AW3eaifgDml1gWRDZGvjcfdxonE4swNPG98PrrXjaO/KrnUjzlMnztCCRVlUueA1kCXhARGk6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.132.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.2", + "@rolldown/binding-darwin-arm64": "1.0.2", + "@rolldown/binding-darwin-x64": "1.0.2", + "@rolldown/binding-freebsd-x64": "1.0.2", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.2", + "@rolldown/binding-linux-arm64-gnu": "1.0.2", + "@rolldown/binding-linux-arm64-musl": "1.0.2", + "@rolldown/binding-linux-ppc64-gnu": "1.0.2", + "@rolldown/binding-linux-s390x-gnu": "1.0.2", + "@rolldown/binding-linux-x64-gnu": "1.0.2", + "@rolldown/binding-linux-x64-musl": "1.0.2", + "@rolldown/binding-openharmony-arm64": "1.0.2", + "@rolldown/binding-wasm32-wasi": "1.0.2", + "@rolldown/binding-win32-arm64-msvc": "1.0.2", + "@rolldown/binding-win32-x64-msvc": "1.0.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sanitize-filename": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.4.tgz", + "integrity": "sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==", + "dev": true, + "license": "WTFPL OR ISC", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "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/shell-quote": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz", + "integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "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/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/std-env": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", + "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strnum": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.3.0.tgz", + "integrity": "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/supports-color": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tar": { + "version": "7.5.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.15.tgz", + "integrity": "sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp-file": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + } + }, + "node_modules/tiny-async-pool": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz", + "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^5.5.0" + } + }, + "node_modules/tiny-async-pool/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.2.tgz", + "integrity": "sha512-kCwffuaH8ntKtygnWe1b4BJKWiCUH30n5KfoTr6IchcXOwR7chAOFJxFrH3vjANafUYrIA4a7SDL+nn7SiR4Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.4.2" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.2.tgz", + "integrity": "sha512-nwEyF4vl4RSJjwSjBUmOSxc3BFPoIFdlRthJ6e+5v9P3bHNsoD06UjuqMUspqp7vsEZ1beaHi1km+optiE17yA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/tough-cookie": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, + "license": "WTFPL", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/underscore": { + "version": "1.13.8", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", + "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==", + "license": "MIT" + }, + "node_modules/undici": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.26.0.tgz", + "integrity": "sha512-3O9Tf67pGhgOv9jM35AbhkXAKi13f3oy3aE4CSgr+TckGeY+/iu97ZXN+J7DpHPzLbVApFd1IFhcnBjREYXYcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.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/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/vite": { + "version": "8.0.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.14.tgz", + "integrity": "sha512-s4BJJ+5y1pYL6Otw51FHhVJQhPnuRinKig64g/1+EUNaJsd3gCKdD31IPFvswUgW9/60QT9oFHbZHbQK5imcxw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.15", + "rolldown": "1.0.2", + "tinyglobby": "^0.2.16" + }, + "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", + "@vitejs/devtools": "^0.1.18", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.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 + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "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/vitest": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.7.tgz", + "integrity": "sha512-flYyaFd2CgoCoU+0UKt3pxksgC+S02iTDN0n3LtqaMeXsI9SBcdNujc2k0DeFLzUn/0k538yNjOSdwgCqcrwJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.7", + "@vitest/mocker": "4.1.7", + "@vitest/pretty-format": "4.1.7", + "@vitest/runner": "4.1.7", + "@vitest/snapshot": "4.1.7", + "@vitest/spy": "4.1.7", + "@vitest/utils": "4.1.7", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.7", + "@vitest/browser-preview": "4.1.7", + "@vitest/browser-webdriverio": "4.1.7", + "@vitest/coverage-istanbul": "4.1.7", + "@vitest/coverage-v8": "4.1.7", + "@vitest/ui": "4.1.7", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/wait-on": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-8.0.5.tgz", + "integrity": "sha512-J3WlS0txVHkhLRb2FsmRg3dkMTCV1+M6Xra3Ho7HzZDHpE7DCOnoSoCJsZotrmW3uRMhvIJGSKUKrh/MeF4iag==", + "dev": true, + "license": "MIT", + "dependencies": { + "axios": "^1.12.1", + "joi": "^18.0.1", + "lodash": "^4.17.21", + "minimist": "^1.2.8", + "rxjs": "^7.8.2" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-url": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", + "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.11.0", + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "license": "MIT" + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xml-naming": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", + "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "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/package.json b/package.json new file mode 100644 index 0000000..c59d329 --- /dev/null +++ b/package.json @@ -0,0 +1,67 @@ +{ + "name": "qoffice", + "version": "0.1.0", + "private": true, + "author": "QOffice", + "description": "Кроссплатформенный офисный пакет QOffice с QWord, QExcell, QPowerPoint и QOutlook.", + "main": "electron/main.cjs", + "type": "module", + "scripts": { + "dev": "vite --host 127.0.0.1", + "build": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.node.json --noEmit && vite build", + "preview": "vite preview --host 127.0.0.1", + "test": "vitest run", + "electron:dev": "concurrently -k \"npm:dev\" \"wait-on http://127.0.0.1:5173 && electron .\"", + "dist:desktop": "npm run build && electron-builder" + }, + "dependencies": { + "@kenjiuno/msgreader": "^1.28.0", + "buffer": "^6.0.3", + "docx": "^9.7.1", + "fast-xml-parser": "^5.8.0", + "jszip": "^3.10.1", + "lucide-react": "^0.468.0", + "mammoth": "^1.12.0", + "pptxgenjs": "^4.0.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "string_decoder": "^1.3.0" + }, + "devDependencies": { + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^15.0.7", + "@types/react": "^18.3.27", + "@types/react-dom": "^18.3.7", + "@vitejs/plugin-react": "^6.0.2", + "concurrently": "^10.0.0", + "electron": "^42.3.0", + "electron-builder": "^26.8.1", + "jsdom": "^29.1.1", + "typescript": "^5.7.3", + "vite": "^8.0.14", + "vitest": "^4.1.7", + "wait-on": "^8.0.5" + }, + "build": { + "appId": "dev.qoffice.suite", + "productName": "QOffice", + "files": [ + "dist/**/*", + "electron/**/*" + ], + "directories": { + "buildResources": "build", + "output": "release" + }, + "icon": "build/icon", + "win": { + "target": "nsis" + }, + "mac": { + "target": "dmg" + }, + "linux": { + "target": "AppImage" + } + } +} diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..3854879 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,143 @@ +import { useMemo } from "react"; +import { AppShell } from "./components/AppShell"; +import { QOutlook } from "./features/qoutlook/QOutlook"; +import { QPowerPoint } from "./features/qpowerpoint/QPowerPoint"; +import { QWord } from "./features/qword/QWord"; +import { QExcell } from "./features/qexcell/QExcell"; +import { initialState } from "./data/sampleData"; +import { usePersistentState } from "./hooks/usePersistentState"; +import type { AppId, MailMessage, QOfficeState, SlideDeck, WordDocument, Workbook } from "./types"; + +const STORAGE_KEY = "qoffice-state-v1"; + +function migrateQOfficeState(state: QOfficeState): QOfficeState { + const launchChecklistAttachments = initialState.mail.messages.find((message) => message.id === "mail-1")?.attachments; + const sampleSheet = initialState.workbook.sheets.find((sheet) => sheet.id === "sheet-1"); + const sampleWordHtml = initialState.word.html; + const needsSampleWordColor = + state.word.id === initialState.word.id && + sampleWordHtml.includes("Ключевой результат") && + !state.word.html.includes("Ключевой результат"); + + let changed = false; + if (needsSampleWordColor) { + changed = true; + } + const messages = state.mail.messages.map((message) => { + if (!launchChecklistAttachments || message.id !== "mail-1" || (message.attachments?.length ?? 0) > 0) { + return message; + } + + changed = true; + return { ...message, attachments: launchChecklistAttachments }; + }); + + const sheets = + state.workbook.id === initialState.workbook.id && sampleSheet + ? state.workbook.sheets.map((sheet) => { + if (sheet.id !== "sheet-1") { + return sheet; + } + + const needsMergedCells = (sheet.mergedCells?.length ?? 0) === 0; + const needsSampleCell = !sheet.cells.A8 && sampleSheet.cells.A8; + const missingSampleFormats = Object.entries(sampleSheet.cellFormats ?? {}).filter(([address]) => !sheet.cellFormats?.[address]); + const missingSampleCharts = (sampleSheet.charts ?? []).filter((chart) => !(sheet.charts ?? []).some((existingChart) => existingChart.id === chart.id)); + if (!needsMergedCells && !needsSampleCell && missingSampleFormats.length === 0 && missingSampleCharts.length === 0) { + return sheet; + } + + changed = true; + return { + ...sheet, + cells: needsSampleCell ? { ...sheet.cells, A8: sampleSheet.cells.A8 } : sheet.cells, + mergedCells: needsMergedCells ? sampleSheet.mergedCells : sheet.mergedCells, + cellFormats: + missingSampleFormats.length > 0 + ? { + ...sheet.cellFormats, + ...Object.fromEntries(missingSampleFormats) + } + : sheet.cellFormats, + charts: missingSampleCharts.length > 0 ? [...(sheet.charts ?? []), ...missingSampleCharts] : sheet.charts + }; + }) + : state.workbook.sheets; + + return changed + ? { + ...state, + word: needsSampleWordColor ? { ...state.word, html: sampleWordHtml } : state.word, + workbook: { ...state.workbook, sheets }, + mail: { ...state.mail, messages } + } + : state; +} + +export function App() { + const [state, setState] = usePersistentState(STORAGE_KEY, initialState, migrateQOfficeState); + + const status = useMemo(() => { + const updatedAt = + state.activeApp === "word" + ? state.word.updatedAt + : state.activeApp === "sheets" + ? state.workbook.updatedAt + : state.activeApp === "slides" + ? state.deck.updatedAt + : undefined; + + return { + savedLabel: "Сохранено локально", + updatedAt + }; + }, [state]); + + function setActiveApp(activeApp: AppId) { + setState((current) => ({ ...current, activeApp })); + } + + function updateWord(word: WordDocument) { + setState((current) => ({ ...current, word: { ...word, updatedAt: new Date().toISOString() } })); + } + + function updateWorkbook(workbook: Workbook) { + setState((current) => ({ ...current, workbook: { ...workbook, updatedAt: new Date().toISOString() } })); + } + + function updateDeck(deck: SlideDeck) { + setState((current) => ({ ...current, deck: { ...deck, updatedAt: new Date().toISOString() } })); + } + + function updateMail(updater: (mail: QOfficeState["mail"]) => QOfficeState["mail"]) { + setState((current) => ({ ...current, mail: updater(current.mail) })); + } + + function setMailFolder(folder: MailMessage["folder"]) { + updateMail((mail) => { + const firstInFolder = mail.messages.find((message) => message.folder === folder); + return { + ...mail, + activeFolder: folder, + activeMessageId: firstInFolder?.id ?? mail.activeMessageId + }; + }); + } + + const activeSurface = + state.activeApp === "word" ? ( + + ) : state.activeApp === "sheets" ? ( + + ) : state.activeApp === "slides" ? ( + + ) : ( + + ); + + return ( + + {activeSurface} + + ); +} diff --git a/src/components/AppShell.tsx b/src/components/AppShell.tsx new file mode 100644 index 0000000..7b50506 --- /dev/null +++ b/src/components/AppShell.tsx @@ -0,0 +1,153 @@ +import { + BarChart3, + FileText, + HelpCircle, + Mail, + MonitorCog, + PanelRight, + Presentation, + Save, + Search, + Settings, + Share2, + Table2 +} from "lucide-react"; +import type { ReactNode } from "react"; +import type { AppId } from "../types"; + +interface AppShellProps { + activeApp: AppId; + onAppChange: (appId: AppId) => void; + status: { + savedLabel: string; + updatedAt?: string; + }; + children: ReactNode; +} + +const apps: Array<{ id: AppId; label: string; icon: typeof FileText; accent: string }> = [ + { id: "word", label: "QWord", icon: FileText, accent: "word" }, + { id: "sheets", label: "QExcell", icon: Table2, accent: "sheets" }, + { id: "slides", label: "QPowerPoint", icon: Presentation, accent: "slides" }, + { id: "mail", label: "QOutlook", icon: Mail, accent: "mail" } +]; + +const ribbonGroups = [ + { + title: "Буфер", + commands: [ + { label: "Вставить", icon: FileText }, + { label: "Копировать", icon: Save } + ] + }, + { + title: "Вставка", + commands: [ + { label: "Таблица", icon: Table2 }, + { label: "Диаграмма", icon: BarChart3 }, + { label: "Панель", icon: PanelRight } + ] + }, + { + title: "Совместная работа", + commands: [ + { label: "Поделиться", icon: Share2 }, + { label: "Параметры", icon: MonitorCog } + ] + } +]; + +export function AppShell({ activeApp, onAppChange, status, children }: AppShellProps) { + const active = apps.find((app) => app.id === activeApp) ?? apps[0]; + + return ( +
+ + +
+
+
+ {active.label} + {status.savedLabel} +
+
+ + +
+
+ +
+
+ {["Файл", "Главная", "Вставка", "Рецензирование", "Вид", "Экспорт"].map((tab, index) => ( + + ))} +
+
+ {ribbonGroups.map((group) => ( +
+
+ {group.commands.map((command) => { + const Icon = command.icon; + return ( + + ); + })} +
+ {group.title} +
+ ))} +
+
+ +
{children}
+ +
+ Готово + {status.updatedAt ? `Обновлено: ${new Date(status.updatedAt).toLocaleString("ru-RU")}` : "Локальная почта"} + Масштаб 100% +
+
+
+ ); +} diff --git a/src/data/sampleData.ts b/src/data/sampleData.ts new file mode 100644 index 0000000..e8991ed --- /dev/null +++ b/src/data/sampleData.ts @@ -0,0 +1,176 @@ +import type { QOfficeState } from "../types"; + +export const initialState: QOfficeState = { + activeApp: "word", + word: { + id: "qword-project-proposal", + title: "Проектное предложение.qdocx", + updatedAt: new Date().toISOString(), + html: ` +

Проектное предложение

+

1. Обзор

+

Документ описывает цели, область работ, сроки и ожидаемые результаты предлагаемого проекта.

+

2. Цели

+

Ключевой результат: подготовить проверяемую версию офисного пакета с импортом и экспортом документов Microsoft Office.

+
    +
  • Поставить масштабируемое и сопровождаемое решение.
  • +
  • Повысить операционную эффективность.
  • +
  • Обеспечить безопасность данных и соответствие требованиям.
  • +
  • Показать измеримую бизнес-ценность.
  • +
+

3. Область работ

+

Проект включает анализ требований, проектирование системы, разработку, тестирование, внедрение и сопровождение после запуска.

+

Дополнительные материалы доступны по ссылке проекта.

+ + + + + + + + + +
ЭтапОписаниеОтветственный
ПланированиеТребования и календарный планАлиса К.
ПроектированиеАрхитектура и UXБорис Л.
ПоставкаРазработка и контроль качестваКарина М.
+ ` + }, + workbook: { + id: "qexcell-quarter-plan", + title: "Квартальный план.qxlsx", + updatedAt: new Date().toISOString(), + activeSheet: "sheet-1", + sheets: [ + { + id: "sheet-1", + name: "Revenue", + cells: { + A1: "Продукт", + B1: "1 кв.", + C1: "2 кв.", + D1: "3 кв.", + E1: "Итого", + A2: "Базовый", + B2: "12500", + C2: "14300", + D2: "16800", + E2: "=SUM(B2:D2)", + A3: "Команды", + B3: "8200", + C3: "9100", + D3: "9900", + E3: "=SUM(B3:D3)", + A4: "Корпоративный", + B4: "19600", + C4: "21400", + D4: "23800", + E4: "=SUM(B4:D4)", + A6: "Общий итог", + E6: "=SUM(E2:E4)", + A8: "Объединённая строка примечания" + }, + mergedCells: [{ start: "A8", end: "E8" }], + cellFormats: { + B2: { numberFormat: "# ##0.00 ₽" }, + C2: { numberFormat: "# ##0.00 ₽" }, + D2: { numberFormat: "# ##0.00 ₽" }, + E2: { numberFormat: "# ##0.00 ₽" }, + B3: { numberFormat: "# ##0.00 ₽" }, + C3: { numberFormat: "# ##0.00 ₽" }, + D3: { numberFormat: "# ##0.00 ₽" }, + E3: { numberFormat: "# ##0.00 ₽" }, + B4: { numberFormat: "# ##0.00 ₽" }, + C4: { numberFormat: "# ##0.00 ₽" }, + D4: { numberFormat: "# ##0.00 ₽" }, + E4: { numberFormat: "# ##0.00 ₽" }, + E6: { numberFormat: "# ##0.00 ₽" } + }, + charts: [ + { + id: "chart-revenue-total", + type: "bar", + title: "Итого по продуктам", + labelRange: "A2:A4", + valueRange: "E2:E4" + } + ] + } + ] + }, + deck: { + id: "qpowerpoint-roadmap", + title: "Дорожная карта.qpptx", + updatedAt: new Date().toISOString(), + activeSlideId: "slide-1", + slides: [ + { + id: "slide-1", + title: "Дорожная карта QOffice", + subtitle: "Единая рабочая среда для документов, данных, презентаций и коммуникации.", + notes: "Начать с цели продукта и текущего этапа.", + theme: "classic" + }, + { + id: "slide-2", + title: "Модули продукта", + subtitle: "QWord, QExcell, QPowerPoint и QOutlook используют общую оболочку и модель хранения.", + notes: "Описать общую архитектуру и навигацию между модулями.", + theme: "ocean" + }, + { + id: "slide-3", + title: "Следующий этап", + subtitle: "Импорт и экспорт файлов, совместная работа, аудит доступности и подпись пакетов.", + notes: "Завершить последовательностью реализации.", + theme: "graphite" + } + ] + }, + mail: { + activeFolder: "inbox", + activeMessageId: "mail-1", + messages: [ + { + id: "mail-1", + folder: "inbox", + from: "Мария Чен", + to: "product@qoffice.local", + subject: "Контрольный список запуска", + body: "Пожалуйста, проверьте этапы редакторов, цели упаковки и ответственных за качество до пятницы.", + time: "09:24", + read: false, + flagged: true, + attachments: [ + { + id: "attachment-launch-checklist-1", + fileName: "launch-checklist.txt", + contentType: "text/plain", + size: 37, + contentBase64: "0J/RgNC+0LLQtdGA0LjRgtGMIERPQ1gvWExTWC9QUFRYL0VNTA==", + disposition: "attachment" + } + ] + }, + { + id: "mail-2", + folder: "inbox", + from: "Иван Белл", + to: "product@qoffice.local", + subject: "Проверка формул таблиц", + body: "Последний слой таблиц поддерживает диапазоны, основные агрегатные функции, числовые форматы и базовые диаграммы. Следующий шаг — расширение fidelity сложных книг.", + time: "Вчера", + read: true, + flagged: false + }, + { + id: "mail-3", + folder: "sent", + from: "product@qoffice.local", + to: "team@qoffice.local", + subject: "Заметки дизайн-ревью", + body: "Я отправил наблюдения по оболочке, ленте команд, инспектору и строке состояния после последнего ревью.", + time: "Пн", + read: true, + flagged: false + } + ] + } +}; diff --git a/src/features/qexcell/QExcell.tsx b/src/features/qexcell/QExcell.tsx new file mode 100644 index 0000000..671d8c2 --- /dev/null +++ b/src/features/qexcell/QExcell.tsx @@ -0,0 +1,822 @@ +import { useMemo, useRef, useState } from "react"; +import type { CSSProperties } from "react"; +import { + BarChart3, + Bold, + Download, + Eraser, + FileText, + FileUp, + FunctionSquare, + Italic, + Link, + LineChart, + PaintBucket, + PieChart, + Plus, + Save, + Sigma, + Trash2, + Underline +} from "lucide-react"; +import type { CellFormat, SheetChart, SheetChartType, Workbook } from "../../types"; +import { cellId, columnLabelsForCount, evaluateCell, formatCellValueForDisplay, mergedCellInfo, summarizeColumn, usedSheetBounds } from "../../utils/spreadsheet"; +import { downloadBlobFile, downloadTextFile } from "../../utils/download"; +import { chartDataPoints, exportXlsxBlob, importXlsxFile } from "../../io/excellOffice"; +import { replaceFileExtension } from "../../io/fileHelpers"; +import { isDesktopOfficeBridgeAvailable, openDesktopOfficeFile, saveDesktopOfficeFile } from "../../io/desktopOfficeFiles"; +import { exportPdfOrPrint } from "../../io/pdfExport"; +import { useQOfficeCommand } from "../../hooks/useQOfficeCommand"; + +interface QExcellProps { + workbook: Workbook; + onChange: (workbook: Workbook) => void; +} + +const extraEditableRows = 1; +const extraEditableColumns = 1; +const emptyHyperlinks: Record = {}; +const emptyCellFormats: Record = {}; +const emptyCharts: SheetChart[] = []; + +const fillSwatches = [ + { color: "", label: "Без заливки" }, + { color: "FFF2CC", label: "Светло-желтая заливка" }, + { color: "D9EAD3", label: "Светло-зеленая заливка" }, + { color: "DDEBF7", label: "Светло-синяя заливка" }, + { color: "FCE4D6", label: "Светло-коралловая заливка" }, + { color: "EADCF8", label: "Светло-фиолетовая заливка" } +]; + +const numberFormatOptions = [ + { value: "", label: "Обычный" }, + { value: "0.00", label: "Число" }, + { value: "# ##0.00 ₽", label: "Деньги" }, + { value: "0%", label: "Процент" }, + { value: "dd.mm.yyyy", label: "Дата" }, + { value: "dd.mm.yyyy hh:mm", label: "Дата и время" } +]; + +const chartTypeOptions: Array<{ value: SheetChartType; label: string }> = [ + { value: "bar", label: "Столбчатая" }, + { value: "line", label: "Линейная" }, + { value: "pie", label: "Круговая" } +]; + +function normalizedLinkInput(value: string | null) { + const raw = value?.trim(); + if (!raw) { + return ""; + } + + const candidate = /^[a-z][a-z0-9+.-]*:/i.test(raw) ? raw : `https://${raw}`; + try { + const url = new URL(candidate); + return ["http:", "https:", "mailto:", "tel:", "ftp:"].includes(url.protocol.toLowerCase()) ? url.href : ""; + } catch { + window.alert("Введите корректный адрес ссылки."); + return ""; + } +} + +function normalizedFillColor(value?: string) { + const raw = value?.trim().replace(/^#/, "").toUpperCase() ?? ""; + return /^[0-9A-F]{6}$/.test(raw) ? raw : ""; +} + +function normalizedCellFormat(format: CellFormat): CellFormat | undefined { + const fillColor = normalizedFillColor(format.fillColor); + const numberFormat = format.numberFormat?.trim(); + const normalized: CellFormat = { + ...(format.bold ? { bold: true } : {}), + ...(format.italics ? { italics: true } : {}), + ...(format.underline ? { underline: true } : {}), + ...(fillColor ? { fillColor } : {}), + ...(numberFormat ? { numberFormat } : {}) + }; + + return Object.keys(normalized).length > 0 ? normalized : undefined; +} + +function cellInputStyle(format?: CellFormat): CSSProperties { + return { + ...(format?.bold ? { fontWeight: 700 } : {}), + ...(format?.italics ? { fontStyle: "italic" } : {}), + ...(format?.underline ? { textDecoration: "underline" } : {}), + ...(format?.fillColor ? { backgroundColor: `#${format.fillColor}` } : {}) + }; +} + +function normalizedChartRange(value: string) { + const raw = value.trim().replace(/\$/g, "").toUpperCase(); + const [start, end = start] = raw.split(":"); + if (!/^[A-Z]+[1-9][0-9]*$/.test(start) || !/^[A-Z]+[1-9][0-9]*$/.test(end)) { + return ""; + } + + return `${start}:${end}`; +} + +function chartTypeIcon(type: SheetChartType) { + if (type === "line") { + return LineChart; + } + if (type === "pie") { + return PieChart; + } + return BarChart3; +} + +function chartTypeLabel(type: SheetChartType) { + return chartTypeOptions.find((option) => option.value === type)?.label ?? "Столбчатая"; +} + +export function QExcell({ workbook, onChange }: QExcellProps) { + const fileInputRef = useRef(null); + const [selectedCell, setSelectedCell] = useState("A1"); + const [selectedChartId, setSelectedChartId] = useState(""); + const [chartTitle, setChartTitle] = useState("Итого по продуктам"); + const [chartType, setChartType] = useState("bar"); + const [chartLabelRange, setChartLabelRange] = useState("A2:A4"); + const [chartValueRange, setChartValueRange] = useState("E2:E4"); + const activeSheet = workbook.sheets.find((sheet) => sheet.id === workbook.activeSheet) ?? workbook.sheets[0] ?? { id: "sheet-1", name: "Лист 1", cells: {}, mergedCells: [] }; + const activeMergedCells = activeSheet.mergedCells ?? []; + const activeHyperlinks = activeSheet.hyperlinks ?? emptyHyperlinks; + const activeCellFormats = activeSheet.cellFormats ?? emptyCellFormats; + const activeCharts = activeSheet.charts ?? emptyCharts; + const selectedRawValue = activeSheet.cells[selectedCell] ?? ""; + const selectedHyperlink = activeHyperlinks[selectedCell] ?? ""; + const selectedCellFormat = activeCellFormats[selectedCell] ?? {}; + const selectedFormattedValue = formatCellValueForDisplay(evaluateCell(selectedCell, activeSheet.cells), selectedCellFormat); + const boundsCells = useMemo( + () => + [...Object.keys(activeHyperlinks), ...Object.keys(activeCellFormats)].reduce>( + (cells, address) => ({ ...cells, [address]: cells[address] || activeHyperlinks[address] || "format" }), + { ...activeSheet.cells } + ), + [activeCellFormats, activeHyperlinks, activeSheet.cells] + ); + const sheetBounds = useMemo(() => usedSheetBounds(boundsCells, activeMergedCells), [activeMergedCells, boundsCells]); + const rows = useMemo(() => Array.from({ length: sheetBounds.rowCount + extraEditableRows }, (_, index) => index), [sheetBounds.rowCount]); + const visibleColumnLabels = useMemo( + () => columnLabelsForCount(sheetBounds.columnCount + extraEditableColumns), + [sheetBounds.columnCount] + ); + + const totals = useMemo(() => { + return summarizeColumn(activeSheet.cells, 4); + }, [activeSheet.cells]); + + function updateCell(id: string, value: string) { + onChange({ + ...workbook, + sheets: workbook.sheets.map((sheet) => + sheet.id === activeSheet.id ? { ...sheet, cells: { ...sheet.cells, [id]: value } } : sheet + ) + }); + } + + function updateHyperlink(id: string, href: string) { + const normalizedId = id.toUpperCase(); + const nextHyperlinks = { ...activeHyperlinks }; + if (href) { + nextHyperlinks[normalizedId] = href; + } else { + delete nextHyperlinks[normalizedId]; + } + + onChange({ + ...workbook, + sheets: workbook.sheets.map((sheet) => (sheet.id === activeSheet.id ? { ...sheet, hyperlinks: nextHyperlinks } : sheet)) + }); + } + + function updateCellFormat(id: string, formatPatch: CellFormat) { + const normalizedId = id.toUpperCase(); + const nextFormats = { ...activeCellFormats }; + const nextFormat = normalizedCellFormat({ ...(nextFormats[normalizedId] ?? {}), ...formatPatch }); + if (nextFormat) { + nextFormats[normalizedId] = nextFormat; + } else { + delete nextFormats[normalizedId]; + } + + onChange({ + ...workbook, + sheets: workbook.sheets.map((sheet) => (sheet.id === activeSheet.id ? { ...sheet, cellFormats: nextFormats } : sheet)) + }); + } + + function toggleSelectedFormat(key: "bold" | "italics" | "underline") { + updateCellFormat(selectedCell, { [key]: !selectedCellFormat[key] }); + } + + function insertLink() { + const href = normalizedLinkInput(window.prompt("Введите адрес ссылки", selectedHyperlink)); + if (!href) { + return; + } + + const nextCells = selectedRawValue ? activeSheet.cells : { ...activeSheet.cells, [selectedCell]: href }; + onChange({ + ...workbook, + sheets: workbook.sheets.map((sheet) => + sheet.id === activeSheet.id + ? { + ...sheet, + cells: nextCells, + hyperlinks: { ...activeHyperlinks, [selectedCell]: href } + } + : sheet + ) + }); + } + + function clearSelectedCell() { + const nextCells = { ...activeSheet.cells }; + const nextHyperlinks = { ...activeHyperlinks }; + const nextFormats = { ...activeCellFormats }; + delete nextCells[selectedCell]; + delete nextHyperlinks[selectedCell]; + delete nextFormats[selectedCell]; + onChange({ + ...workbook, + sheets: workbook.sheets.map((sheet) => + sheet.id === activeSheet.id ? { ...sheet, cells: nextCells, hyperlinks: nextHyperlinks, cellFormats: nextFormats } : sheet + ) + }); + } + + function updateActiveSheetName(name: string) { + onChange({ + ...workbook, + sheets: workbook.sheets.map((sheet) => (sheet.id === activeSheet.id ? { ...sheet, name } : sheet)) + }); + } + + function selectChart(chart: SheetChart) { + setSelectedChartId(chart.id); + setChartTitle(chart.title); + setChartType(chart.type); + setChartLabelRange(chart.labelRange); + setChartValueRange(chart.valueRange); + } + + function resetChartForm() { + setSelectedChartId(""); + setChartTitle("Итого по продуктам"); + setChartType("bar"); + setChartLabelRange("A2:A4"); + setChartValueRange("E2:E4"); + } + + function upsertChart() { + const labelRange = normalizedChartRange(chartLabelRange); + const valueRange = normalizedChartRange(chartValueRange); + if (!labelRange || !valueRange) { + window.alert("Введите диапазоны диаграммы в формате A2:A4."); + return; + } + + const nextChart: SheetChart = { + id: selectedChartId || `chart-${Date.now()}`, + type: chartType, + title: chartTitle.trim() || chartTypeLabel(chartType), + labelRange, + valueRange + }; + const nextCharts = selectedChartId + ? activeCharts.map((chart) => (chart.id === selectedChartId ? nextChart : chart)) + : [...activeCharts, nextChart]; + + onChange({ + ...workbook, + sheets: workbook.sheets.map((sheet) => (sheet.id === activeSheet.id ? { ...sheet, charts: nextCharts } : sheet)) + }); + setSelectedChartId(nextChart.id); + } + + function deleteChart(id: string) { + const nextCharts = activeCharts.filter((chart) => chart.id !== id); + onChange({ + ...workbook, + sheets: workbook.sheets.map((sheet) => (sheet.id === activeSheet.id ? { ...sheet, charts: nextCharts } : sheet)) + }); + if (selectedChartId === id) { + resetChartForm(); + } + } + + function exportCsv() { + const exportBounds = usedSheetBounds(activeSheet.cells, activeMergedCells); + const exportRows = Array.from({ length: exportBounds.rowCount }, (_, index) => index); + const exportColumnLabels = columnLabelsForCount(exportBounds.columnCount); + const csv = exportRows + .map((row) => + exportColumnLabels + .map((_, column) => { + const value = activeSheet.cells[cellId(column, row)] ?? ""; + return `"${value.replace(/"/g, '""')}"`; + }) + .join(",") + ) + .join("\n"); + downloadTextFile(workbook.title.replace(/\.qxlsx$/i, ".csv"), csv, "text/csv"); + } + + async function openXlsx(file: File | undefined) { + if (!file) { + return; + } + + try { + const imported = await importXlsxFile(file); + onChange({ + ...workbook, + title: imported.title, + activeSheet: imported.sheets[0]?.id ?? "sheet-1", + sheets: imported.sheets.length > 0 ? imported.sheets : [{ id: "sheet-1", name: "Лист 1", cells: {}, mergedCells: [] }] + }); + } catch (error) { + window.alert(error instanceof Error ? error.message : "Не удалось открыть XLSX."); + } finally { + if (fileInputRef.current) { + fileInputRef.current.value = ""; + } + } + } + + async function saveXlsx() { + try { + const fileName = replaceFileExtension(workbook.title, ".xlsx"); + const blob = await exportXlsxBlob(workbook); + if (isDesktopOfficeBridgeAvailable()) { + await saveDesktopOfficeFile("xlsx", fileName, blob); + return; + } + + downloadBlobFile(fileName, blob); + } catch (error) { + window.alert(error instanceof Error ? error.message : "Не удалось сохранить XLSX."); + } + } + + async function chooseXlsx() { + if (isDesktopOfficeBridgeAvailable()) { + const file = await openDesktopOfficeFile("xlsx"); + await openXlsx(file ?? undefined); + return; + } + + fileInputRef.current?.click(); + } + + async function exportPdf() { + try { + await exportPdfOrPrint(workbook.title); + } catch (error) { + window.alert(error instanceof Error ? error.message : "Не удалось экспортировать PDF."); + } + } + + useQOfficeCommand({ + open: chooseXlsx, + save: saveXlsx, + "export-pdf": exportPdf, + print: () => window.print() + }); + + return ( +
+
+
+ void openXlsx(event.target.files?.[0])} + aria-label="Открыть XLSX" + /> + onChange({ ...workbook, title: event.target.value })} + /> + + + + +
+ + + +
+
+
+ + + + +
+ +
+ {selectedCell} + updateCell(selectedCell, event.target.value)} + placeholder="Введите значение или формулу, например =SUM(B2:D2)" + /> +
+ +
+ + + + + ))} + + + + {rows.map((row) => ( + + + {visibleColumnLabels.map((_, column) => { + const id = cellId(column, row); + const merge = mergedCellInfo(id, activeMergedCells); + if (merge && !merge.isOrigin) { + return null; + } + + const raw = activeSheet.cells[id] ?? ""; + const evaluatedDisplay = raw.startsWith("=") ? evaluateCell(id, activeSheet.cells) : raw; + const hyperlink = activeHyperlinks[id] ?? ""; + const cellFormat = activeCellFormats[id]; + const display = formatCellValueForDisplay(evaluatedDisplay, cellFormat); + return ( + + ); + })} + + ))} + +
+ {visibleColumnLabels.map((column) => ( + {column}
{row + 1} + setSelectedCell(id)} + onChange={(event) => updateCell(id, event.target.value)} + /> +
+
+ + {activeCharts.length > 0 ? ( +
+ {activeCharts.map((chart) => ( + selectChart(chart)} + onDelete={() => deleteChart(chart.id)} + /> + ))} +
+ ) : null} +
+ + +
+ ); +} + +function SheetChartPreview({ + chart, + cells, + selected, + onSelect, + onDelete +}: { + chart: SheetChart; + cells: Record; + selected: boolean; + onSelect: () => void; + onDelete: () => void; +}) { + const Icon = chartTypeIcon(chart.type); + const points = chartDataPoints(chart, cells); + + return ( +
+
+
+ + {chart.title} +
+ +
+ +

+ {chartTypeLabel(chart.type)} · {chart.labelRange} / {chart.valueRange} +

+
+ ); +} + +function ChartSvg({ type, points }: { type: SheetChartType; points: Array<{ label: string; value: number }> }) { + if (points.length === 0) { + return ( + + + Нет данных + + + ); + } + + if (type === "pie") { + return ; + } + + if (type === "line") { + return ; + } + + return ; +} + +function BarChartSvg({ points }: { points: Array<{ label: string; value: number }> }) { + const max = Math.max(1, ...points.map((point) => Math.abs(point.value))); + const width = 320 / points.length; + + return ( + + + {points.map((point, index) => { + const barHeight = Math.round((Math.abs(point.value) / max) * 112); + const x = 32 + index * width; + return ( + + + + {point.label.slice(0, 10)} + + + ); + })} + + ); +} + +function LineChartSvg({ points }: { points: Array<{ label: string; value: number }> }) { + const max = Math.max(1, ...points.map((point) => Math.abs(point.value))); + const step = points.length > 1 ? 300 / (points.length - 1) : 0; + const coordinates = points.map((point, index) => { + const x = points.length > 1 ? 30 + index * step : 180; + const y = 142 - (Math.abs(point.value) / max) * 112; + return { x, y, label: point.label }; + }); + const path = coordinates.map((point) => `${point.x},${point.y}`).join(" "); + + return ( + + + + {coordinates.map((point, index) => ( + + + + {point.label.slice(0, 10)} + + + ))} + + ); +} + +function PieChartSvg({ points }: { points: Array<{ label: string; value: number }> }) { + const total = points.reduce((sum, point) => sum + Math.max(0, point.value), 0) || 1; + let startAngle = -90; + + return ( + + {points.map((point, index) => { + const value = Math.max(0, point.value); + const angle = (value / total) * 360; + const path = pieSlicePath(95, 90, 58, startAngle, startAngle + angle); + startAngle += angle; + return ; + })} + {points.slice(0, 5).map((point, index) => ( + + + + {point.label.slice(0, 18)} + + + ))} + + ); +} + +function pieSlicePath(cx: number, cy: number, radius: number, startAngle: number, endAngle: number) { + const start = polarToCartesian(cx, cy, radius, endAngle); + const end = polarToCartesian(cx, cy, radius, startAngle); + const largeArcFlag = endAngle - startAngle <= 180 ? "0" : "1"; + return `M ${cx} ${cy} L ${start.x} ${start.y} A ${radius} ${radius} 0 ${largeArcFlag} 0 ${end.x} ${end.y} Z`; +} + +function polarToCartesian(cx: number, cy: number, radius: number, angle: number) { + const radians = (angle * Math.PI) / 180; + return { + x: cx + radius * Math.cos(radians), + y: cy + radius * Math.sin(radians) + }; +} diff --git a/src/features/qoutlook/QOutlook.tsx b/src/features/qoutlook/QOutlook.tsx new file mode 100644 index 0000000..56a4572 --- /dev/null +++ b/src/features/qoutlook/QOutlook.tsx @@ -0,0 +1,390 @@ +import { Archive, Download, FileText, FileUp, Flag, MailOpen, Paperclip, PenLine, Search, Send, X } from "lucide-react"; +import { useMemo, useRef, useState } from "react"; +import type { MailAttachment, MailMessage, QOfficeState } from "../../types"; +import { downloadBlobFile } from "../../utils/download"; +import { attachmentToBlob, createMailAttachmentFromFile, exportEmlBlob, importMailFile } from "../../io/outlookMail"; +import { replaceFileExtension } from "../../io/fileHelpers"; +import { isDesktopOfficeBridgeAvailable, openDesktopOfficeFile, saveDesktopOfficeFile } from "../../io/desktopOfficeFiles"; +import { exportPdfOrPrint } from "../../io/pdfExport"; +import { useQOfficeCommand } from "../../hooks/useQOfficeCommand"; + +interface QOutlookProps { + mail: QOfficeState["mail"]; + onChange: (updater: (mail: QOfficeState["mail"]) => QOfficeState["mail"]) => void; + onFolderChange: (folder: MailMessage["folder"]) => void; +} + +const folders: Array<{ id: MailMessage["folder"]; label: string }> = [ + { id: "inbox", label: "Входящие" }, + { id: "sent", label: "Отправленные" }, + { id: "drafts", label: "Черновики" }, + { id: "archive", label: "Архив" } +]; + +function formatBytes(bytes: number): string { + if (!Number.isFinite(bytes) || bytes <= 0) { + return "0 Б"; + } + + const units = ["Б", "КБ", "МБ", "ГБ"]; + let value = bytes; + let unitIndex = 0; + + while (value >= 1024 && unitIndex < units.length - 1) { + value /= 1024; + unitIndex += 1; + } + + return `${Number.isInteger(value) ? value : value.toFixed(1)} ${units[unitIndex]}`; +} + +export function QOutlook({ mail, onChange, onFolderChange }: QOutlookProps) { + const fileInputRef = useRef(null); + const draftAttachmentInputRef = useRef(null); + const [query, setQuery] = useState(""); + const [draft, setDraft] = useState<{ to: string; subject: string; body: string; attachments: MailAttachment[] }>({ + to: "", + subject: "", + body: "", + attachments: [] + }); + const activeMessage = mail.messages.find((message) => message.id === mail.activeMessageId) ?? mail.messages[0]; + + const visibleMessages = useMemo(() => { + const normalizedQuery = query.trim().toLowerCase(); + return mail.messages.filter((message) => { + const inFolder = message.folder === mail.activeFolder; + const matchesQuery = + !normalizedQuery || + [message.from, message.to, message.subject, message.body, ...(message.attachments ?? []).map((attachment) => attachment.fileName)].some((field) => + field.toLowerCase().includes(normalizedQuery) + ); + return inFolder && matchesQuery; + }); + }, [mail.activeFolder, mail.messages, query]); + + function updateMessage(id: string, patch: Partial) { + onChange((current) => ({ + ...current, + messages: current.messages.map((message) => (message.id === id ? { ...message, ...patch } : message)) + })); + } + + function sendDraft() { + if (!draft.to.trim() || !draft.subject.trim()) { + return; + } + + const id = `mail-${Date.now()}`; + const message: MailMessage = { + id, + folder: "sent", + from: "product@qoffice.local", + to: draft.to.trim(), + subject: draft.subject.trim(), + body: draft.body.trim(), + time: new Date().toLocaleTimeString("ru-RU", { hour: "2-digit", minute: "2-digit" }), + read: true, + flagged: false, + attachments: draft.attachments + }; + + onChange((current) => ({ + ...current, + activeFolder: "sent", + activeMessageId: id, + messages: [message, ...current.messages] + })); + setDraft({ to: "", subject: "", body: "", attachments: [] }); + } + + async function openMailFile(file: File | undefined) { + if (!file) { + return; + } + + try { + const imported = await importMailFile(file); + onChange((current) => ({ + ...current, + activeFolder: "inbox", + activeMessageId: imported.id, + messages: [imported, ...current.messages] + })); + } catch (error) { + window.alert(error instanceof Error ? error.message : "Не удалось открыть письмо."); + } finally { + if (fileInputRef.current) { + fileInputRef.current.value = ""; + } + } + } + + async function saveEml(message: MailMessage) { + try { + const blob = exportEmlBlob(message); + const fileName = replaceFileExtension(message.subject || "Письмо", ".eml"); + if (isDesktopOfficeBridgeAvailable()) { + await saveDesktopOfficeFile("eml", fileName, blob); + return; + } + + downloadBlobFile(fileName, blob); + } catch (error) { + window.alert(error instanceof Error ? error.message : "Не удалось сохранить EML."); + } + } + + async function addDraftAttachments(files: FileList | null) { + if (!files || files.length === 0) { + return; + } + + try { + const attachments = await Promise.all(Array.from(files).map((file) => createMailAttachmentFromFile(file))); + setDraft((current) => ({ ...current, attachments: [...current.attachments, ...attachments] })); + } catch (error) { + window.alert(error instanceof Error ? error.message : "Не удалось добавить вложение."); + } finally { + if (draftAttachmentInputRef.current) { + draftAttachmentInputRef.current.value = ""; + } + } + } + + function removeDraftAttachment(id: string) { + setDraft((current) => ({ + ...current, + attachments: current.attachments.filter((attachment) => attachment.id !== id) + })); + } + + function downloadAttachment(attachment: MailAttachment) { + downloadBlobFile(attachment.fileName, attachmentToBlob(attachment)); + } + + async function chooseMailFile() { + if (isDesktopOfficeBridgeAvailable()) { + const file = await openDesktopOfficeFile("mail"); + await openMailFile(file ?? undefined); + return; + } + + fileInputRef.current?.click(); + } + + async function exportPdf() { + try { + await exportPdfOrPrint(activeMessage?.subject || "Письмо QOutlook"); + } catch (error) { + window.alert(error instanceof Error ? error.message : "Не удалось экспортировать PDF."); + } + } + + useQOfficeCommand({ + open: chooseMailFile, + save: () => { + if (activeMessage) { + void saveEml(activeMessage); + } + }, + "export-pdf": exportPdf, + print: () => window.print() + }); + + const activeAttachments = activeMessage?.attachments ?? []; + + return ( +
+ + +
+ +
+ {visibleMessages.map((message) => { + const attachmentCount = message.attachments?.length ?? 0; + return ( + + ); + })} + {visibleMessages.length === 0 ?

В этой папке нет писем.

: null} +
+
+ +
+ {activeMessage ? ( + <> +
+ + + + + +
+
+

{activeMessage.subject}

+

+ От: {activeMessage.from} · Кому: {activeMessage.to} · {activeMessage.time} +

+

{activeMessage.body}

+ {activeAttachments.length > 0 ? ( +
+

Вложения

+
    + {activeAttachments.map((attachment) => ( +
  • + + + + {attachment.fileName} + + {attachment.contentType} · {formatBytes(attachment.size)} + + + + +
  • + ))} +
+
+ ) : null} +
+ + ) : ( +

Выберите письмо.

+ )} + +
{ + event.preventDefault(); + sendDraft(); + }} + > +

Новое письмо

+ setDraft({ ...draft, to: event.target.value })} placeholder="Кому" aria-label="Кому" /> + setDraft({ ...draft, subject: event.target.value })} + placeholder="Тема" + aria-label="Тема" + /> +