From cde51060aa4b053021076d5007a3087e52d734c4 Mon Sep 17 00:00:00 2001 From: ChrisItisdud Date: Sun, 24 Sep 2023 16:19:10 +0200 Subject: [PATCH 1/5] finalise docs --- CONTRIBUTING.md | 42 +++++++++++++++++++++++++++--------------- README.MD | 16 +++++++++------- assets/settings.jpg | Bin 79711 -> 89452 bytes docs/generate_docs.py | 2 +- 4 files changed, 37 insertions(+), 23 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b3e175b..1fd87f9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -40,16 +40,16 @@ NOTE: Part of this will only take effect once this repository becomes public. Pl 2. Assign the issue to yourself, or ask to have it assigned to you. 3. Fork [this repository](https://github.com/4lex0017/AudioStreamSplitting) to your own account. 4. Implement your contribution and commit it to your forked repository. Be sure to follow the requirements outlined in [Requirements](#requirements). Test your implementation and ensure the program builds on your system. - - If something about the user workflow, the code structure, available commands or other usage details documented in this document and the [README.md](./README.MD) file is changed, also update the corresponding document(s) accordingly. + - If something about the user workflow, the code structure, available commands or other usage details documented in this document and the [README.md](./README.MD) file is changed, also update the corresponding document(s) accordingly. Ensure the documents don't contain spelling errors. 5. Create a pull request on this repository. 6. The pull request must be approved by at least two of the main maintainers of AudioStreamSplitting (as of current, that's @chubetho, @ChrisItisdud, @4lex0017 and @JosuaE-FHWS). Reviewers must also attempt to build and run the project locally to verify everything works fine. -7. After two approvals, the pull request gets merged. +7. After two approvals, the pull request gets merged. The merge should use squash merge in order to keep commit history reasonable on the main branch. ### Requirements The following requirements must be met by the system at any time: -1. Every function has documentation comments, formatted in the reST doc format. An example comment is shown below. These documentation comments are used to [generate the back-end documentation](#generating-documentation). +1. Every function has documentation comments, formatted in the reST doc format. An example comment is shown below. These documentation comments are used to [generate the documentation](#generating-documentation). Ensure the documentation comments build correctly and don't contain spelling errors. 2. All python code must comply to [the black code style](https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html). 3. All back-end/python code that can have unit tests (i.e. doesn't rely on files on the file system, external APIs or other outside resources) must have them. When adding a new module, add an according test file in the backend/tests folder. When updating an existing one, add or update tests in the correlating test file. All tests must pass (obviously). 4. All business logic must be in the back-end. The front-end should only contain the user interface. @@ -124,7 +124,7 @@ Tests are situated in ``backend/tests``. Each module that has unit tests has its ### Generating documentation -To generate and show documentation, run ``npm run docs``. This will generate back-end and front-end documentation and show it on a local server easily accessible on your browser (usually [localhost:5173](http://localhost:5173/)). Alternatively, you can find HTML docs for the back-end in docs/_build/html. Also showing the documentation as Github pages is planned for the future, but cannot be done before this repository goes public. +To generate and show documentation, run ``npm run docs``. This will generate back-end and front-end documentation and show it on a local server easily accessible on your browser (usually [localhost:5173](http://localhost:5173/)). Alternatively, you can find HTML docs for the back-end in docs/_build/html. The documentation is also available on [Github pages](https://4lex0017.github.io/AudioStreamSplitting/). ## Developing Environment @@ -180,21 +180,33 @@ npm run dev:be ``` ```bash -npm run dev:be +npm run dev:fe ``` +If ``npm run dev:be`` fails, check if the python executable the command calls is correct. If not, either call the command manually or change it in ``package.json`` (but don't commit the change!) + #### Available commands -| Command | Description | -| ------------------------ | --------------------------------- | -| npm run `dev:fe` | Run frontend server | -| npm run `dev:be` | Run backend server | -| npm run `view:app` | Run desktop app | -| npm run `build:fe` | Build frontend (html, js, css) | -| npm run `build:app` | Build desktop app | -| npm run `docs:gen:be` | Generate backend documentation | -| npm run `docs:gen:fe` | Generate backend documentation | -| npm run `docs` | Generate and show documentation | +| Command | Description | +| --------------------------- | --------------------------------- | +| npm run `dev:fe` | Run frontend server | +| npm run `dev:be` | Run backend server | +| npm run `test:fe` | Run frontend tests | +| npm run `test:be` | Run backend tests | +| npm run `view:app` | Run desktop app | +| npm run `build:fe` | Build frontend (html, js, css) | +| npm run `build:app` | Build desktop app | +| npm run `build:app:nocheck` | Build desktop app without checks | +| npm run `lint:fe` | Run frontend linter | +| npm run `lint:be` | Run backend linter | +| npm run `format:be` | Run backend formatter | +| npm run `typecheck` | Run frontend typechecker | +| npm run `orval` | Generate API call functions | +| npm run `docs:gen:be` | Generate backend documentation | +| npm run `docs:gen:fe` | Generate backend documentation | +| npm run `docs:gen` | Generate full documentation | +| npm run `docs:build` | Generate and build documentation | +| npm run `docs` | Generate and show documentation | ## Contributors diff --git a/README.MD b/README.MD index 0ee02a7..ad795bf 100644 --- a/README.MD +++ b/README.MD @@ -76,12 +76,20 @@ The buttons below the waveform window allow you to download, play back or delete #### Settings -The settings tab allows you to configure AudioStreamSplitting to your liking: +The settings tab allows you to configure AudioStreamSplitting to your liking. Each field has a short description below it to explain what it does:

The language field currently supports English, German, French and Spanish. Note that only the English and German translations are actively maintained, so translation issues will arise when using the other languages. +The "Save" section is where the settings related to saving files are situated. + +The "Save Directory" setting should be set to the directory you want to save the resulting files into. Make sure that this is an existing directory on your device, as saving files will not work otherwise. + +The "Output File Name" setting will control the file name of output files. You can include the placeholders ``{TITLE}``, ``{ARTIST}``, ``{ALBUM}`` and ``{YEAR}``, which will be replaced with the corresponding metadata when saving a song. As an example, saving the song "Thunderstruck" by "2Cellos" with the template ``"{TITLE}_{ARTIST}"`` will result in a file called ``"Thunderstruck_2Cellos.mp3"``. It is strongly recommended to include the ``{TITLE}`` placeholder in the file name to avoid overwriting files. + +The "Submit files to APIs on save" setting controls whether files the app identified will also be sent to the AcoustID API (and potentially others in the future) to further improve their database. As far as we can tell, no personally identifying data is submitted, and the data that is submitted is only used to ensure you have access to the API. We kindly ask you to turn this setting on as the AcoustID database depends on user submissions to work as well as it does. + Turning off the "Ask me what to do with each save" option allows choosing a file type, which all files will be saved as by default. If this is not set, you will instead be asked to choose a file type every time you save a file. The "Advanced" section is where the most important settings are situated. Note that for changes to these settings to apply, you must click the "Set" button next to the setting you changed. @@ -90,12 +98,6 @@ You need to provide at least one API Key for the song identification to work, bu The AcoustID API keys are split into two keys: The "AcoustID Application API Key" is the key you receive when registering an application. This key is necessary for any functionality involving AcoustID. The "AcoustID User API Key" is only required if you also want to submit identified songs to AcoustID. -The "Save Directory" setting should be set to the directory you want to save the resulting files into. Make sure that this is an existing directory on your device, as saving files will not work otherwise. - -The "Output File Name" setting will control the file name of output files. You can include the placeholders ``{TITLE}``, ``{ARTIST}``, ``{ALBUM}`` and ``{YEAR}``, which will be replaced with the corresponding metadata when saving a song. As an example, saving the song "Thunderstruck" by "2Cellos" with the template ``"{TITLE}_{ARTIST}"`` will result in a file called ``"Thunderstruck_2Cellos.mp3"``. It is strongly recommended to include the ``{TITLE}`` placeholder in the file name to avoid overwriting files. - -The "Submit files to APIs on save" setting controls whether files the app identified will also be sent to the AcoustID API (and potentially others in the future) to further improve their database. As far as we can tell, no personally identifying data is submitted, and the data that is submitted is only used to ensure you have access to the API. We kindly ask you to turn this setting on as the AcoustID database depends on user submissions to work as well as it does. - ## License This software is licensed under the GNU GPLv3 license, as found in the LICENSE.txt file or [on the GNU website](https://www.gnu.org/licenses/gpl-3.0.en.html). Note that this license only applies to the software itself, not to audio files generated by it, as they still belong to the songs' original copyright holders. diff --git a/assets/settings.jpg b/assets/settings.jpg index 2342273d2966ca7ae14896a9b6ac20dfa1651f2e..a5e665ff0d33fb3790a1611687b178364fa02fc9 100644 GIT binary patch literal 89452 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�Exf82m*Xst`tY71L1A!# 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 qi^+ezXaAQY)N1D9 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

2*iDVDUHWC`w zEadyOoJ~xDjvvBju8~bM2+Hs&Loi7=Cm;W)2fmO9X1n4=0kMCFFHaQ0)^S;fofJ@H zBSD_1ga=^XGZ}{_#EXLr@MmzBAT)GuArLu!EVZ&07Dn*xYgO(NtUDr##GXaR_5 zr`TcAcHC|~@Rv5Ju%Vx{CGSQ6zX^bs^ujuhn!NgD!m3DXMLB>mbLpYBw+X}L&?v-8 z0dnveY}btf5@dz9fwM#RfoVy6gye@&w=X2oU)KiE$#1Ne$JXq_hIPT1!o4jZO~on6wve-fKM>X+1^PxnX$lPUpU#vmzuoeY>|G+ZFa5E z_H|d)YOaiji=bffhpj{X=9bUO(Om08Sz=g zwgZ|Cu|!E2qV{(3j(^y-FOn%-9*Uk{X3t5jAtL~I`Y?td{}VtuJmSb4cpnTpy5fNF z&e6^GnYn2HE1t9*)$6o33La|H=9svzj*-urFXl!EhkaD;6rA4dgrCze3ZRc5_-qUB z>Hk;~Iu$PR^8(k*YkKqe`;u=qIt-WMEbRr#hM`wgZnL?BRGu7;kktf*V5V3FBx9IZ zU{U8adzq~!t|FgLb>C!1U8Yv3z>3a^YdjMVS9X zbn!(i?^8h&98`o&AkcLdSQ?nsXb&$R3_*@|V}%Z-fMmZ@AH~&o@yR1$zah_?&ipri zBaA7asPaD|T{_Y2V7&P>9ET!%NEAM_BEP197R$8g0cG(0v@k;U`iG@~N9uU;_ry3FlqcQfbof&G%Xi zDYoI627yxcd-+~81f=tw=TSLb)<^IsUL@rb#mimLH6ESKyXWxHmd`uDu^Q$o=^LC& zI}#~&Cz12T=c(^ES$2%y^Da}VVBa#EQ?6)Ev9mJ_@{->FI%Xur9du#kT};2|k?6Ru zsfioQjN9BFBNZMi@qzlk!Er959lUowi~L2I{IU*hNwXk$%xFXb+3`_8H*9vxMm}OM z+z%7!12B&L#2)~#4ElE*)XR`PIskC21VRhH}VGH!qqdr z)Zm7C)$QAt`?p@fq!y4Y_Htv>c1=RrnEXtH!k_0-U97`)xhVbU$1t;z zGF3fxWtS5m>3$;WXH&Y_luy~eP(AMIL}E<^QQV!t?Z9k){5pcW9i@Gos4Kl!_e-QG zAS&VNRWoGGO#UtfL_@yNX01EBxiUkh-%sHD1*QvQ!6Oe-@cBUGgh`L|5wVdZx^M5G zf6GhaxFE;5(>D$%niCU;2TWNv&`&nTX+3thV#?FV`F;C$Z5P^5x?svYz3 zql`8eT~%7x$1GCLgulP#+;0j@mgaKpP1q&IV;;kHGI zQ-;yH8KxOuXJI9kw{Mp{vj>G%>QhC3cQrRNC~BLBPxO)|F-Nw?f;=M*bA$4B(?m}{j5a&JmUQa}1@v%^4)7q(`7(3C zT=5-+#ETv*-3@9M@h7)Xg~a;pgzA1q?fChIDmjBB4u$d%TiUiJ7LBP!2Aw?kgs zxh_0OHXb^$-mN&CIcZ|pYA&m6uzd=H=!94%ww(@?x`Q8FMAG7wG2|Fb1)pUiyLg;j zg`ja&b=tDuWeKzh=;OU~6+xAu(?%i6(eQ`ph#Yy`O9uw*(YDb?*S2e4NOKkOVZ86H zXN?j?42M;^yK_#@rcRsOcHOoQBJ-_(QOW~suCn9YYeaUuPB|OP5Fj`?== z#?cVEJoo(+(v1I;D2t9luuZ;;C@altYC{%aCLq^t2X*M!_2qvGi(H=z?AFgJZ zNS@5y^A+R-Xw1&z@ZTRdW&LFJxC>I@Cq~F?PR#zWnVz0d;uJA?`8NQzJpShlp8u+! z{VDSpu!;nA$(<+n$scjodX9K6r7L=HxXd$5%K573q|EC#Y@YsUqhf8PzVZrGvN_t8 ziubD|PaNekkfnwz@z?AitTyZE^7ufL1w*S9XhiXhXr~xKXrFl+^{j;MEQ909*W-vo zmFAp28$80xO(Fe=m8gWH5v{svVSecKRpd4F1KtUX?#`GO#yLMH`gtueG4~8C_QMPc zHYQIxpi)*Bt5dcV+wX2*zqi@MaQ60g9*BbU0H>bbW4jSBcm5!2VCPZrJ^sMx?ZN`o zuiQGl?lN_C6<>nyM0R9r%MDRoCyQqiAjT?jP(TIAyrWHOLhCf1xkrm{{9vZSVq@5D zyspp9zEcnCuP=i5vL|FLzW$_%7 zsH2T!-NJVC>7YAr+@&ELn1mY82@iQ^-fqqGF( z7_#LzyP$N@wVTDldi6?2Oj>vP6L}t(3!Q4^0X zmpN4V?-2(PhWKMFl*|E-Q^;l~I1-@SCt^`GYov@Vg4WoX)Pb4Sng*3Q;Mtr9FLM;8 z$jUITaiZ$tU`VeZgCB$u&mLB`khKlg;-8Ry7;%((V}XV?rC6@%mUiQ)|a2nc}51y2!gkS7RwMA6K|k3~R$ zm6YW%O&(Y#lAr7&1G2}S_Rbe+1g(TlK$mi3(2U4OV5)hTT*looo)%~sY7YGr%iVb0 zM(z@ShryYxBB_yBA=PznF_LH#20WSNt{)k135-FyVLjjcGf ze|}#DU-@tx!2a5x^G%8|)FWWZs)vLk3>Uo{O^rJ=!>48<^#;sLkJYWkCg+B~qojVH zUF!%_!gmyh4GW01PWDA=$tXovK-Gp{xtD9qY1a}|YoMN!9RYT?M}lJC@fFY@cq;R^ zxgBJ&f?LNJH^*)V30(b0!CnSib!HZPpN^5*!S)5+?F&|4vI`=<-znq15ZQRxE)pHeU+;Q!&Bvy$4k_RO4V|1CR2R&wTj$E93!5NlxC(M0>kdh&-Bp1h z1o5ruxwh$|{gyeRqx)R5`kH3h7Bd~u4hQefMFF9M!nq$4yF}(feEL#*m>@w-v9*xM zRLxEcdRWL>c4eXJVNS~wAMRS8Agh)TyhGDzLQBM?#Fh6sK9W%>I1xc_8?(S=mQwgF z%FogTB(5?bvHoJ<`-*{)%s8ZfP;Ym3<0X69*F(F3)ekFV$ch{Ja$c;|O_smo{rsz* z4d;4pjdJ|9mO$7K^f{PbvHt7zldx82#qZS@q&<&I`TGyeOcouSb?hZ`z7@FoyO6r? zg_qE4A6RGsk}13Zra94akzf~?YSZ!pSq(GcY|H;NSDGvP*h(a3T=~YgU*77c&1Wr3 z$el=j4IW$wCbw(%Wz%lET;%?Y!Q;c!&FZHt1EHRihwfx(O$p=92zB?tEOda(4ez++ zXV14dnEPByGLYsbet1zvlT%uFif^E~{_K?xcg(KeK!CPp>G-O8eCGiiBK!sHGTyXO z{FTNjg4|Pw3pi=X0k@KV%w=~Q{%`kVBizq?tD&il57%{l>ixs`ee17HcY-3{38byi zsHrS-GGj3e3IDi(#+uB5bw}VX5LE1BpKe3r__OUg358aHd6R0o2HXCdGrhkGx(mt~ z-U!N_zi{^WNSg#~CTBQ3KEh<;H+tHjyv|;JL%rDrx#;M6t4G0|hmVPsHtMdYuF7hQ zPdl=MifVFcBA5H8+cQsXs6^IBIg6 z1LuYcwCagw6<6d3*q4u5zylof@qD-wW)zfsHe^9guxqgpTZX=NQ|47G!NEpG>+$^K zy`>G#z?qp=*bL#(hNVrz_I;cKX6H%HLyY>*h{m-?x4*{yK3hunxk3;?RcgltXh@~y zZSp9*_?^1C+LrWH!Lz^i82GG`E9N;9mCnq780pnjg|OH9-otEgYeX5jSOIBV^iOyV zxS`H4!EnnVAZt0O`q~z{F2K?MTCFqxDW@~m+J#Ub7y_V%==!SK8yUVMxhJkSFI zw)JO!_7l{}J>ITaMj3~EKT9qnVB_9iUi%%XR1Ri*xBH#nXe&J_fr5hgS+Gi*-kBAN!q^+Su>dU`Ij5;~xs z8WQS#L;ht*RKocW^TuO2*EJr!!*v}3yp_lStnH%sbMPWBxerKwJpIiOye;_05V+4L z%kBarASYmHG4NK0tR8eL(9eJ(R^*U>>6-&W#cK3x-8joWSA>nWiOCm8g)qFS46=9=dT zyPt{=0rk0}7)|a3M(EA~E@|5Z2o!1KAmrXqJqqZyKyw|bT8WH8V}F3Luiyh{6mpTD z3~;}Tz%_0Jy;KT_dN^Zy*WoG-+Lw#1ZIcMB=@ooP{!X5skX4kc3YzywUi~^;6E-oI z@N;P7y)S2nv3&ex@ev?&u#8+DIudiuaaTI_LGSB{16Z&2(0^5f{hw?1pEcqIatUCV z*=QIiKHo0OVGN-t!)*Vj$YwhLJN?^I&g7I;&Cu%sN!&>Mav0{=Fuo1%4F@)yY}I0@u2n)yMz9Q!3DWX7O2R?O>|UCA{F0=m z6m_gi-DiIB1T8T<5~DNGIvfYPUxELGnY-PkR98G0h>IA%oc#8=rzNuF5f6|SOTNv|WDey%}1)O;zUJJh3dsmms* zo0$WR_q_EPkalxWOL^;KXhO+y%^TE}D_38* zy4LGYJ%e6oZVVAl zpKdU|r1dbkp_dU^y zbBNMm-}qnWMOZ~%-;VZVelVE$sgYM=-TlQR>BheR6Egg5n$16fn2UZG7MtpDiu{>0 zp8x9SszLrHh-Jt89KL*2ndIp~qKCF2bfeq7?&Fg#0OstF`oA=={}vGYUmyH?_1k9~ zul0$>B+|OGtZir)7Z=E{WfcMW{1wAwS|BT&FMkja<7<;^fCvZp6bTb*muD?xgPP#P zlUabh3YZGBhf{*Tz{R2R^J_m5*KFMqj$XA(F zyZ__cVs@;=)ZYAF(4qkpmIzNX%Zocc)za_oHa}^W6w!Y1&GHq^Gl#{cD*$INc)bt# z8vYwPp?2qwOundp&aL}YjxVt%K+keIgQw}q@iC;euQMAjC)Xfekm+$2a{A9F8E*}-;+ z&YRV;38{-%`0QV~Kr{Jj=T%9Vfo+I@qf_3c3d~R6m(8_fB8{zFWdX&v9UB@L2{*su z)lGd;eyV^n59HXx1~My?7PIBLZIt7QB1=Z+j_i}Vl0p^|BKpSp>hxp}{vUB3J^;Fkvw`8X#PYk|TXAu>KWX`b;<0{6aOo+Y*~@%CT*- z!4ujA*393`=ZRi;I27wY)#ZgB>*AdRh=%m5?+|K%H#-tO{?vA48!A67^Drn|zTo(I zJ^zi2E?!?u#VOeh3JA|(PLu`MQ_|2_kIeECH>R zIAEl84QpJ5NuswlDsj!>9X;TSksF;q+&Tk**Cnu7^W^ue`j@-vnAVLWy~&RNt_58LGY3X5rpMr_!KY^M zk5(a^CjN>9y>umdH@fMGt?}b?uabo17aK+Vd`gT)jpTv~i?YlCVL^QtX{$VuZspOwHXRH}?8hcd70>O6!Zza0c8X#S$%{OCI!is1eR2 zQbQa3sx}HoYZI00<6CbL{HVk+$V*`oSE?5YZ*F{H$4OfZwz!EC=>&7OIN{8Dl!Av6 z0w;|E@Ei*ux)a+ z)@DX8WFwk8a33s}{<^gy1hv0gYCD}PK{UhDm%^@L+afWq>PQT|0-TdiGACzjvCCry z?hUMt-@~;POx09qublGK{wiwu&hiJkmb?4R0dsVdNtD8H>^u*y@^w?$hD;vbvVDD# z5E2AKNZYB)6t*2XiTOXDrAlo_bX&VA=xg^znh zuzTjE=6D5fZqaAmw6|WedB1$H_!L}S(GU@)6sX*pqlj~kJdnBJ1~;ghAc{CEo}i^I z&2+6by4;hMMBwl8-fj=mDHa6~j0110^K7w=S-oL?Ie;ZOSqYz=8t_{^MsLE$ImvRZ zxeL4Ym*NQ4fy`Y^a#6K}ZQEWnYg7zIM%;X~Qo|(wXOG`U8(TZ+23FhIitp9Nk9AmI zI&wUqYOlEbrTmsCnXmVV0z#xB$p+3qevma&ujwZYSqh9y*9`TT8aDr~r4;tPI#2?r ze&B#TiqTN6{FTEq1+F>Zm(p))O4-!6c1nI=aOX#0uFVLB;Vs8)1%KP!>b6$D z##Te0Hv7uXSc%H~EC1Y{LVP090p(fN@N+ozjuS|1i(KBiO<(kZ3XEX*)340QnqBll zl;<~XTFwV&gu0(wegcDa@n-FV4^rkR}wR{+8Ph-4%{D0m1zsi`1*{zJ7_0$ z@}ienfofGtXyh?=wK25N$ji-7^Zg)g%Jes}mrd`L`Yx!@vNn33lcztgn5)A<Zd`zo^mYAZ820iY`zdI|kKdh-8kmKEnXQ5ol-wvfvTcYzA9j%h$$ zmTMjFOswRnD6?Hz?))_ky1?{vwJmFed^*sw2dJPKCIGuR@;ff{+M>Y6d;ptGP_!|4 zFg9g$*Uu32-LQULn9AEHu9(CGx{p5w3JW-PfNPASxiXx1VFp-@Nw=k#JVwLH3U)hG zl<3kCmB`Bls>WfvWn!Ge#NsY0)ox5n6m}D*TbH-qCSQxge9xSZt85wckgw~s(~Ds5 z{Wj9_lp`M02x5#6a*nHOHeto5-W}gkumzu+o*h`#Dg3FBaO!j4>`jqt$>e?ZLC|B% zd>98_q?qVF-g48;30Qc1^*?;yDVC9LI;00~FEtp5BqTnJwGfv_V3$Dq4n9Efmu}_E z`{6LJFH;KB2cg1p(E)>g525}tk8`g2xxBHyt=(|v6C+_4-t5HuK?GSXeNV^PnWXU@H6o^zQxqRSY-py1J7^rsyrPC z8N>*Xq2ZFlf)kIWfSf9%v_~G)<2g$qbFL7lwl{OLf~?ZUqIE6F^<}Tuse7sOnyMBe z`oI{ESHaFnwTIZ~9v8B3VADzqwD5K&B2Gi(bTV`ikNTw-BEbG+&{X`1D7(Hy^w{o)yf*?~!0Pz;Cs2j-|HpztD$6Ox& z4P>EQ2}F$!{x*LkJhCu0inADJl+Z~?9XPJpKixlkduoDcjg#uj%-B|6%#BSya$7KA z{$-Qho9$GLI#XVo^~+gj%wnYe1bH9=_CJ>IL!q=V_^?*s}+ z>FSX&bPFDz%T~v4co>Tp$097o$vxQN`(s3@OLYZ3yrR5u@*Vs30*voP4ffeM?>_Jw z>P^P6FEPh@Affi`y(1eki$>y|sBw$*BmW%x`nQ`x`WNfPuHSm9eQX(Zrrc+;J}s}v z?OAEzn2qZcVLq;+PQFMhu+yHD1vsoH@OQ^`K*6lcf9iAm)BpbsKFB|Abk1$luxT*& z#T2PDoY>omyc*tMXwi+a#PZLlP#lmfc$XWv&wX}`YJC!>T1#`o1WyEtv`00W&q9S zDJ}Uxpy+_W`RK0T;Y1kF6n~a*8DWCum&_5R(813&Z}>tUc%hQmV2^P}@h#xfkqG=! zcjjue`@ODD8#b*yJ+&da+|P_xbm{J#lS;}<*bVzw-<#8lNpSA5d_A`rTz6RI$H+RP zqe&VVT0hHF)my&&x>V(?3QeJ(T0`G(4C*i)wsQc4o3C6si+kpB z=I3=#<(2E49V5CM-<9gZ|Akm6^*?;~uZQLSii!RQ#zakZ>_&cv?6SC~qx`d=V%rB@ zTd`*>rB_ponuXlN{LS;4z-&bDWQ&M1|71Srhj4>C7q=A|LOxtzO!JV`MR{$;u1QQ! zCxzYxHu7_cid=fU#cr?KxAn;sZTIB&Uf|Rn9?1kcUyfed4*wLKjC~b$48u#%SmCfGWz5)Ljb;%26p-oHV5CD-5&5Vkb?KV2xOgi3`BON{^`1KKwGROo) zCJuX`1jm%%{yc=RHS&+&Lk;z?9#_c!I`EdNQ0s8+cBjRqnE zW?F+8lO^*+{ps#4^-;s1^Tp}Px_Wkr+LD9eY64K|T3==sNT8#6(%rEF{mNu(?G%nQ z{Ri5oE^rEk2giEBDlsWdPj^=Eeno+$eZ~_+ro(CSNJ-BpgZzz;jLF8ohO(UOq?2DK zrQAqP)Kjg@J5lGx%GQEGY zwma%c`Qc;}gAs4jt&Ho&qY@$!9M?bT-Iyp@Difr8%9{}jQw<1RYz|fH9ko)}w6#}S zb~W(hT@?>Ws$p9B37dZNNiY$F;F)M~D&K4pNX|z?G<&lO$|~NRx_2hxwe4&9Il6gq zninr@Ea4n22E{H$MRW7EbGLqkz8%&~Xr4W`YB#ApPn>m3Y8{IeQ?c%q94IPmIxY&B zf{U`gtbCu-8tO~jCfWTW(`>S@2LsJ{yZsozV}i+$-&ra}$0=-jCq3?}E5TQQw4w^U z4tv=GPj~9N<8E`@3JWo4yi-`{I6a^Gr(3EPDyS3}* zCicGXQT?w1`%2^$m9IOh{0UE8!ZfCQ;alJ;bP)JwO~21W!rPht^&%;f|-3yx$9#9dz7g8!_P5jF$+3pak5@n0MsE?T*YJj zOc@`_tXTEZKM{cv2O?fL1Yyb&1pfzn?;X|D*6s^~1yGta=|lx7(v+?OQIRG>0Hv3J zG^vr^0#WH*KtO3xiXbgggS5~Q5s)q&5_(Oj0Yd!NzT-RJeb4>QxOeRPo_o$dckDkH z3CUVn$((b|`ON3}6)j>|5I8I^epxks`$vUz%aUO0{fqi`M=ymqycZapz>Fl7u?A@y z*_4!FNgJ7_K+~D=Hebf~v9JqLQpGm0FBwEx^oQMKT_0c%R@e))lN z?<|}0fXD-_jY(jKC%LvXRrmcAc2qe-a`y(sDU10Xw)&>tajeb09iHOOkag}!{*U{1 z2D^G^Yw)qiTVTJZTvRc6&wY`<&|D12&$G{GF4c`lUS66u$=)@Vn2nc)wT4U9p_mXrU2^mdt8WwHQ)pRtgv*u@ml>keqQK zmRYE5c>ZTcG{!!WErVU^lFj{>FQjhubMTA^ade2TJD_rWjsRhbbJjhQ9l=h&DFo86 zy;|_+-}J;wFQO} z&v++0eF^dFrzVoU@?)MFEuS*T)v%q4Bc4)LJ@cg&RaRZf|IEK9CWx*D(Eb1-OXa^m zm94!rmJ6q=tf(W%l^h-il@+ixC3wGhWBE`ZA)xTaiy+ZHr{3@a|NL%&R3p#vhQunJ z(H*JFYA4?{6ho$b^Qi0n5C#>)xy0uV_~nQR*MPOap!=Q46uUN>KEejHp$ays_by!V z)XC6}X)~1!wHa&>&0iDsFSGnLrR`hL<*}odc3uD4kGzC5@XZC+bxTf$ub<6MW4;ed zomZJqbc57Kt+)au z%|6`V%e%rXI(SS+&5&|O>Ff&LSxlyI19s7@&A)<-Y<1vSs^y1`1$OTpUT6b68{ig`ad ze1u-xom@0Y{)#-MFXFNSR>LcQ1`>GZuLQsQ%g6a}W`AilV&5qJ5tkinb5_Zs7`)2y zN#&JZp)k??6`qD)XUj_e1l;Bc<+Xo`#tBhYRu^ki<}Ks4cKUh)(VL}6!O|MHRQ zzsl~mTsgdP?~iMa(SdzlZtaY@sXy?5>;qxhtFZstuoWX2*K51&TpjUg1J3(6wW2B2D~4bjr0V2-bdXb`>4An9ojd&IurNLfRvp~aGX^!3Y4&ngry zc0N?4Ta(Uw_011)U_g-FM@7RL)XV&Qo4Jf4WRvID8`ay#^tyq zpAURz%gwSqD=4ULM9tZUU+ZmtaNVPs+U0yfBy~*ra4;5cDs6L&s zwU3v7Lv>*XrLg)0;hT}4aU=@es^hI*Tra?(XZ+aM4&*m5Cz3sZ`NU`_a{}EXvKY~! z*!hm|NG40(#@A?$ZF@)lNoq|_+Xp{bNkoR%YddkFZeC8?KuF_&rnT#e;YE4s~`gIT0o5Gu#~CZy*9ufjaS-3`7Wr{WRx+a*4 zp%S|hS#dMt+M6bh2jw{UkbyE@c-5NW7DX9m%b0C;pR!#Zv)fudnihoF<@%79ND3jl|gW)34q1t85P78Ev|W zsmkaKNHU-N^bwTIo#&Ghxqs4v$dS<<>^$Idnp`B+dG!qufW^Yltdi z?WM_n*2I#;9`3ozYU+lZ6uaNp=qGd}dkE2KYYNJKyOQ8m9dJ5HuS*Yl&zRg1EY&pR zlFM}%HctpTh@QDpjem%)q_;P_nQe9ToU*P@ER3n@Z}QZC6yT<+L>ANPr0J1^}-J(t28!PQ;ZUQ&(J?@oGch3O^}8xKfiX&zg`J!ph)Qs zv3izWbI|b^V*>0|4k5f8+kX)b#-EPtrF+MXMQ_``oYm%29Jr`LS7LC1GV|q!O#4Oz zz#j{b!9vC(=K2cQqe*AyCKEP!eIX5F`;K-IC(rJ~na`l;>w9k8$hBV3Ei92TQpi7e z8-O8#vPK$pXEKh+?3ihX;8BOJDkBR5?Yu)|Feku8Q@l`WrlzP;FdZWwJ#%lBU+$um zytmc&=FAsu3T0#1u8k3Qyw9vjgbDH0Trq}eWk;3%Fx*8_0;wA{Rd_>wQcUN`e_IzA zO&@7?Xe#jmvKnJEAjhsEz!&6@wtw94kjy0R+s-B54nFHwL{I6OKeAb6w*J|!Jlyf} zEooTI(?qs+uv^lbdqq3sZt|^afZhYNQJPV@Qa%7t@|ujZ(I2tThJF#x)Ge9usEz$< zWTcI`(*1(rcJnj}A-`k##d4=^2P!{AfCg+Ou;(z&~tq%g2;3!1k$J63I@fsWmGU z6VbPl<4gPn_63ssWiBA!j{;H&Do3WQ(jz_aOY>4JW>f)O;In9pf=XAVqKCom zBtt;_(|FEr-}FSX%gp5C&H?Pzx9hC`OyNt(9Ler)Jy zG5ZT-?~lT-6HBp>*N96p2^>UyvNqUw$evkLONez5drDEW>KB$pMM2>obrrBPy~2>PoAsx4@&0O{O{>!s zxZON79CMkUP!L^~dTYL(w)BZ+g|q*4_K9>g)jT1mHz7Z)PBJbkHbG=@d%AhJqS>8Y zOK0yTdXeWNW6O&x$4CPrDX%65Y1?jVhxAp4_Ud zPp3h5+R!zbI7Zo1`|`j&RTX*?KdZVr>_XJn2iMJ>E39l|_R$4qu7QWjtEa^nM`Q%3 zY9aW}Ps#mXCG+^b#I@ivV;_gg_~UoIn8c@J36X~({KZm_)^7InobL>V6U7O%_wflW z03m5Y@N*%z(v$Y|>si@p6yfS852J$U%IZ@dmGK+i_Mq&%L$H)qwarP{95KUJpSqF* zXSR<(JKdV_^d!qP%eqD%^k5tzuvNVUQ8E2;1T#ot|2$*vJaC#0+f!H=#$_@1JbT=k zU(Sc?WK=XNgOUfc&k#DZ2$F3gINr0ZO^AeTl3wn*<#qhyfX(=i&M)LxZ)rKpy!kFy zOuf@G;gfV14pMczeJ5Ufzy4&AGuRzk+TJ)~w@4I`{Qh{ae?q8BJ{wGY?;hlf(}IG; z8}qB*a!sek);(rqbr&|q)i8CH>n4Q==Y{p14{{GWaU=3SPMGV={bbqLi9#Uk0tq0w zp|Z=g=Y~uejF`j2mXm4BGJR!_4pkpjBwVkmgZ2A5EKH8orq?f-29|*ZlZLj2$`4Rc znCA%*+5|ARolC7s{dF$Um`sIFX)`rj=v4OUz9Cq+1*w zRGJwJcnpNg{j7?oy0BXr*DMPD;S7WhE{%wm871O)8F9I#NwS6@o)G1hyO^eI11k~;6F&6aj;X=$D8bPI?^_?Hp7hDPZ9Vnil#-)21n8n1kz z9FN%8#!e!bn&H~`<`SbBrrIyH^6Vd+&RF0d^WU`jZV$^=y;9gLm{&(AXoZFyBDor% z^O(p|oRUh{9p#U?tID7Rjry9}DzhWDg`_Q$H|p=+GM&@}EmOaOUez-Y$VbQv0l>M* zjBRvJepINz-Rl*LzbU$dLG@&wL&!J+%N_=ocO`&YEu}{6@LO>>D5LV*^aaBm9Wl4d zPtyexuTiPRzP-^xDa8L;+H!ghnt-GOJ3!Bn1ctmI?C5r0^|oyJ+R^>6@}aWQoD;DF zgo96wJkzH~pXYc(YlSG_UGozn--iql(?^9pSwg$B-?CNh>ubnvilwJr!@w$$M3Nx# z;%Bk@sLwY?5$UVdXc6Bb)L<)L%OKDZ6Ru1Jr^ zbv&m*k`oI&qa@+eGY ztvqgO^eGGG#7L+!qz5x4k^J*!jf4=_GF*4P>k)E8r_2_Kd!Tj$le^W8p5L99eB^Jdo#QR;&#;;Rqv$HZoD3_TQB79A14 z>a+`x3*GG7)?Z$W7`a53?$q7vyXl^o*y}gKT3QS%hHNEBE;Q{p=0oN;ukXAap2b$} z><*tSw*y{jRIhN_f!f5F`PmptcA`60awGED*TH?pa6EKv6s6* zo$kE{8fWLYZfq9^0q#xUtm^Su+lL?W`P8dRcLstE%(lPo(`5@19SN0lh}R?`tYjn; z>F$^!I{;jNj6T+$UaZM=^jF9TI8B$gP2_Zsptz*2oSD|K&F5$Kl*ov8XgTKldWu5K zJ2%3C_Q>g>FG;O)W1VSW+9hKXPOiknC+I(&ICE zGKoMf1j07maohAH)6;?m6D*8jZPp1tlke`lum*KVQC6)9mxqau08$HXG@M<$s(}&F z$~WOMV-08B^GSNdh&+;8Lx}zm|3I~pd>cB|bh9n)~_Kv{5Lp&Z{AH;*{0 z`KkNdv*+Xd_4R?ashW=xu)eWx?Zxs6%lNwxRb!#DsBue<4cG!K=6EZiz)!^@^8Sr? zdy|}>ypesP)f2Xtzct@dP)UUH4Vcu52qMjbd1jH)kUAd;xtKbO+1Z{$vs7`@iQH`@ z3wfA}I!<;|9xE9UEba%L?~24!T#a7V8dm0RK@^)#tGirDyn-w^ ztcfZo8eNiE|C=HsxG^xwk&SO6==*C(Sm;V!b&KnI=tu+wpqt(U%X%x$l}1%JvEE zi>yd1mp-txKB5heS&Km|j{K&WGPnkokZ}D}S(`e86?%(ovOD;2$lUbH>cWzG58y@V{_>{pMf@zEpQJv~6KCPuI`P9& z=X35%kB!GWg<0+t0f+L=`&%?QmK$&F>Wz-h1uZPp=*&uA{Etd_{3l=MFGfeU>^Qkf zx}1zV+@zn|rheD6Iy4#)ho^s#aK!N8MSZs(ZkPFO>ADMf1mWB^A?mZ1vrvs3|c+|X^?3TF^D&zDfM?}Hoi2~r8*_}PouOB>-S=?oNlyaz75d#$-$KaCIt>t<|L}j0d{@z;p7{{$$7w5vk~@aY>U1@Pyn6rB(q;kPsLNg zV*3o0gpEMRqHxQqF1ZiPq|6*V*~C8#B$j&SfT9;=iBk=l<$3TGykT|?ONWe;IlqU!(G` z@YM%;^Y{W5TL*@Ou~tkRJ;4EM85Rhrp|{M?RyKUi-nNXLc%OH(!T2fsmM(9GAGgj= z%G;%BVnt8me4pp99$}6YGsC1Wr@n4>Kh|-LPSTN*FUCa zj7$5z9t2GW{~XiFtI7y=t?l!hooO^8U&zJ&p<7zjwRs+OHz?vUfeNq)>Agj}(55sG zFW(Fc4o=w(LXudJxcspWV-m;A#U?YKS{k?-%N=N9J)d9gNuKLbjRWF7T2a5CUqtVT zsY2;q{Zh*I3dXV}=ind^QULL}i+~ga1t2G!55z0*37cv2i12LcRE>taI2%X*e3=qE zxfj~}0wM0Vy%TzTIB$!-O7d4G5VTY?4gv{DMC$p74QCjErR|Q021@Y>7DheoG{#k* zLeJl(5F5%Va7JF@e(S4O#)xX8P0o4PIiR^!l{uVJ)7)pDV;Ega_FVOM_#2;Yy@kYj z-^wH5h$#_zMi>`J1g4q?% zn-14uNn@mbz_90a9Els>^~!ACD2{Y@Zj9*bj*H{mmIYtrh!rWAR=X;ebFFw0IqNDK z#`$>jT>4@E#8qXg;GU-Q#3#67R2UzK0E^wn)k_y{U&A@rPj)w{NgY9XW_GDv9=C=28KPBYi+b!5cv{ zZZb=HHnbN&AL%9f@`U%x;JanW-B8g6kUPgPBUZ-Ov8Xucj)|f_@WT3Uic{gFue@s6T)cCWyH%;b zDf~-hQ~5~%SVL1e^RymgKTE%Y;Zo-8#rHf)P#FvsTs=S=2HbzfUsIQ^YEIeLuI!@z ze2(`Q?o1;K4jo6PC$|PHrnRCN;GB3=dq0b@NsDqlR+4j~bliX8-lQI<&eUha);Aw+ zatH~QlBfA@#>^i^VSq2k3gOnKipeovlTvFmc@}8G!RWy{>ae+ga@}tk$KGi~MB^*f zGO*Mk4K@zWzPvM$J-4GDhF!b*mS?WSNrf^tiGgORI`+0r#bbJl3;9# z9p^AH^U7GU*83yO_d`X`R#U#H6aU~*OQxTDptFwPi+g6@*ktd57>Xi8UqmGNzddJQ zf%oJhP^>3Byo@D!miCM+D3~YZRA>(KGC?aQ6y2I z9-ihjF_V9h8Hr!ZROcZqBprf$=)UMtnT#`FMX-KYIeD6{<`8ErfT^3vll(#PZSIY# zv!v&Ep``aNlw>qcslm*?m+x`LMy{kDElvr`UMd{Va2q^072cf6@*XLh+3fH-}=`k#sM z`zNnWt@S^6uDrrClEMKMy)t0J|0wP|vhtJ2a0A1Hd#k7F-}U@Ykazwqkof<~415}o zNKn+qAL^&+;n9)RFnTBE*3lh{=Z6&&j|jKUziDu}p#PLvI-WY;T2JFy<>hCZ-HJ)h zo-JfWf_&TbBMX(*rfVY&(g+!G*!9tbAn`mD)0KBUoy{rNpT5yi;7bWprTlt`ij*~* z29YmF;t%z{G}M*@T7muoKc~$e4fJq_*I!L(Id>^AB%KH_asYj}rfZ}JgPj=w0>Ur1 zz0Tu{yF-byy!?xBUWRU-*aUMUHdQU7WLPQYT-pj$zMkViJ77jXjXZ6$4JHcolj4vZ zn2pEC-xMlrJ31LB_u#q%BrsoyHG#il^bU`^|AkLx&Ok0y%&)WM(i>rO_tiZN>CW5lp0ySi}gj^&#KzAPJGUx6k0K|E+u%v27mSlkAMRb|guK|(>`;wQ|;y-eo7}O^%`RM&* z_b`5yJX4pz5d0I#N&@A!o(Rxu3uMuWlRtr!1p||6iWp|K_6v zfD*V8h&tY8B!^soQv9zaKauw(KB}^bHx7@MSzfRW`_}UO*XOPR)^Jr-bMnM6c=>o4 zaIlpp4xCmOBKr6HPsuPs!G~&*0V8ltHRBN(P{+dbl4TICPN3aWK(q>xL3;jE_V2g< zZkE4?!{4{T-?PKN=d7qdWufggznrR>Nk^3!!xP}C_uts)e`+oKi>*7k^Rx78WXaJ| zuOM2j#?k%28WEUvfmvhw?#**=5jxk!uB9}p>H_ldZN>H5 zF*J)u9GiWeM`m=lzOhpF4VX5uNzb17QH3iFT`0O@l?*?nKdn!V(B{$;q~sB1f9NBZ|f!9oGSSJ z`DwG(J0qisWsbh-5~a^4CB$TDeP8>TQOx6BaO%(~@HaX<{ghruky9rMi#R@AehF)E zWDEaIK{xKih|pp&#L3em-LDK;~JlU^PIy{el<}@u4F(+`i1eD3#41NpnP`?bM{~j#z z4=ZZV$N1ZQr8p(fJphaGHCKYny*T(-2|~^N6Klud3(hka2FcW<2N-3;1T2)U{!@&* z#|!?~O9N3%qI_pR_8Hs8T76Mg$f*NGTAmqgV)vUh!>2`V(#NB7rliRTsbTY_=ENGr+i^~CI3-xyo~x^`HSYN%qbL+)Z>9o`!esxf3o+^{|}b49+F3A zrx9a*h&|35Sx;834~woqi9*YyY@s&D@gJfxnx9bF#g)XngeL|>euCr!LT7}loqy5F zPSwx*g}Dt3CY&@c;$zi#_N@Da&2nxC3Cq-jRLJeYw+M_eO-fFdl%xBuDu#H;D4A)) zN%J9?P?EFtnThY~xAb4c#z#dd@PAMo#cX`VQ$HqTA{eSL+;E-&BMrjC9Uy$YU|5P1 z9P++foApjzHYM4jYv~-0(mL(OWS8lVxYp?-$R5Cp|lqS(01W+gh4vM;bKe);YX-`P&1sk?z+w49jnc zFm<%Hzn~RHNcz#eXwDqqgZjRA$w6jiW{?I~4tHeArq$)OC*OCYL;*t$FK5*y?;$_N zc?5uV9IqMbXu5)DCa!mQ5bF)_SlQ81Uq_c`FRz+dSS4!OwOnK^RJOT1U9B2`?${2! zLx(s6zd%UtxbuKm|9Bvnb0t7KA-uFKFM(bE{lWAMN0wdu2rY%&7b$Sh8%iM@k`wMT zMsmk*O}3y90$fZjni~DFZ0R#1mu=iVC=xX#jCwfcT)%B;dvk#|{c%d5b}p*C8m{Xj zWoh%mBsMufL_~DlDZq)E(k;1{?#JT{G{4}*GKytI!a-7jBRFuHbk*VT`|%dayMn7C zYcqfG@b+}jKuw0DYkUa#0wGX5V$*ECzTR_Dn*mv(#R;9a{$#n`x=dwu@Y9)}0<| zW*u%m5Bavm?xu3<_Nv7|VPmyOV@^)f5hQ)a$2}026j6_?NPH z12GJ@&9W8%3g6Fw@RT^05n;Mj@ArB__+~|3M?Eb3X5>-vjYeP>NYv6N-~yq%M2Ge} zmdFp!(-9F~M^zb&w8kb1gO~fPf(K~Zcci~v7t^Y|{p^JY4ae@vlaxC*!+TXF)jo_i zo^JX8WixNVnNl=BOZM8Rck~`242_E+=2?kdC!p?pqE^enEW?&8G-^UE#U18~@bq_j zoVr``gsRrp+e+YSI0^pp<=0Zi7zCvRHK92zZ&!We7%}|lR^!M=mpPX0!BaY|Y zZsz4{YX|d^c^plPiXDAt1cqG8Mj>_9frTS22NT)|EjCi^ubKW&Gn3O3-+x+|eXHmY zbD)baxY2z4ni4hJ{|j^Q6OZ21n&VY6)2;bJIL)KwEB*LwEvYIRBZEf~+J8;&EZh5J zw|^20x(@wgg@smcK2bYOvZ)!Gc~~=|sN&#I=pt~|jX&Lrd$KniG}ttS0u%S~(1)iV zm05@(%>hTxOT0B6_GEa^t%P2hSzvRmm6t zfC>S{BQC&I-L0CaMieayBCbt7#rGD^cHD6Y7vYfP+&9uoaPOWb8k{h%DYF{G{ZH;u z5gqW85SX&Fgd(I^+6>_?07kV9w@nh+Mi4h&1Pc@5F*sL^HNIep^?sqLSO zss82O{|m)dK>9NA&xVHo@-zM`KK><}-f%etkkf%in&z$ouHsbS5bS{2rp&m?nwV4a38oc`dbp=}^Hi5z~w;8`$ zK}={1XnJ)ypK-zk`m{WC+${%pn8>cz=ns-w@DQbXx%+2i5&p`@{>3C4jEB5VvY@)v z<&|M&5?lGkSHq}GrXvmXwlvR#W@e?%O+?o#0~mwXJ|uBKrv5ht&|Ns{j?%M_$Kbam zif!h#Z;Y8%#bX)o_+w29E(qW7xo~NVC(Oio2{O?$S5Kk@LP_hnk*Fb^>U!zblIHo1 z#nS}=ma&U1n)^?nLBRuV_j*x0#Ffi2|y)qtl^d)IyLRQ(arC+PgPGDA_O8~PrJVdf9YR#Eci)Ntc&7ZSCyKH1i2xk4P<%NF3 znO8+c!<#vAO6Q**`4{WQ5LqC-JJaL<*v?J;<$N8KrU^>N6+DOJT|-imyoK77)UkO1 zpo}?%eW5SOhVeU8JIlLr8-AhLPCM$?DUKo(qnDbv0o7noM?cqUHZwl;-9%TUw~%dh zrHQ`e%_3=Z-$v1g8|6Kh6i}6jx$NWKf)09l9C%~5^l`BRPWuk_@R5{_ixDt9m_ta$ zOqkOz`M^j)__>hI;%7Vi(`h)-{) z1(l4E&lmItWYxwyj-)4a^x+nZ>kvfR`aOhX8eH<^CP|loZqIUVwglnhMk}##m+eFJ ztIN|lpH+EZ*GQU&c0=E>b;Fry)w9^ z7MvB(@Ndp}r1xo?Ap8~lG-J{$eeKjo%JA*!Y}ogn?V1z0dU!$~I0AeQ?n;1Z64dhN zc`s@^4YkQ3U?Zj?Shd$Y@;{iSWFi(|DQD$*Z?ml%g7G@wiM#qgZARva)&b%IF?~<98( zu#Df<`au>R8tp)^FLg)FIv==O%xd{;>~>vmrH(sldB7RoUmp@{m}ox2uj#EhJ5qh@ z3sruv`CVqwU?an_Mh~{T;kWfUe`X~hWi+dB0%DDD7QOH8?8zB#Z2Kf!U0J8pALUu^4y$u-ya>DK_Jpa(l{dH1hQvJ?IY26yqRY}{9*B-l-Qo8JoNT~^23(^DT^@nN+t(eNBJ1O3H zk77}}OAqe9ah|I?1-x2c*Z94LT~@_|%xYDmar*eS8I7nzgS;K{SDQ)ByE7H}K5L$^ z{wKdFv=UR4p>~jDH{(gb9|%bJ8ZQ3d5H|jW!a>n#K>5ugaDFxf==lT&VlFngA{`vQ z$9tRvtIS^CWY++@a~LOnyZQ~Dm@th~jK)Wcw7O+}&Bg4adOk`=XZl-qc@p}uVauJ! zSUw3tq>B<;M`!3HsZB7bWmg z<7k7B3MH}y0XW6;6sJW%l6-eQJ8KRW5|9gZtn0&gVqr{LyeSJg;fJ?TlJ!)tG9$&rU=5ge$w|&jLHQ>NBrl>K7B(&qfb=KRHv=$yJMkLN?f zr$)NX8lfpG9?}*7l=C*MQi^nF{ zE@aMYUTdPssf>MUmFtRf1L{hWwROqfLVd@17(AQZE+AnaWQ2zt#Nv%MB2M(20}5V& zo)S>4fs^j}=4E*?yo-y)d9DJl9_4JAsH7Mge8<1gSzFx)D0$^>jac?jTOuDRgYAOdu@lwI!IjB5Xu_?4?XJ*^&lTT$z6~qi-X$n#& zu>mo*-+$^q$ZNTTYuH0$s^AD@iL!CnIqzSCb#)H70Uqdq<7irIdTAV&Y=b0476En4>vLR8a6 z^lyq_VDEV*2OyXh{{0pH?{0;u-6~ZP^2U=~^uh%hkERx{Cppni)e=XTw4`~?>m@<* zHQIBU67l^cmb8Odf=`Tdu_FLkLoxR)o=c25ebCouk!Q=oI>e76T~KvGw0%K1B98?z zN0vk2Bf*!-ra4VOIyJ(IJOtj;M(i|xLhNXR@Ef2B2XYjOY*f`x*8ISjT8R3LnEwT? z>OW&Vt_7M+QO0M#}VG3Ts4hYMeXTe|zGM4$+O$cgHy8+m@cNZWhz zm|U`_Fde9U5C(4X#y|ei#BX^Bu zr7l*Et4E{GZaB3<%&3EhKawL>!yxiWRVFj#QdZUmyW!G`?SMs723{VkT#Z%IYCA@> z0X)Ll^$DvdLHU!<(NY$sZk$lL>kqmUzfDo8`tV&ojVDVGF|FAWV`6anva|E=OE=5B zzIqjx2Psz6$f?jorad1nu2q;QDX7iOZ(RYDkXI0N!QZyA!emNm;>VI%Z2snchT4Q1 zE}z@^Bc;$`Zr^m)uhW@Z@d0B7?k8+SFyKoY-5`X=;dp{2h%q06ihaZOB^k8xW#`di zLR$Vm2Kj3zepyP#F3=?!Tw9&ZD3B*>5rU=>3+^!=+%rScK5~uv z8e8?EdSdDl!=l}kt`{}WD@%18V!Uj(89_Nm3@coxa01~|r~P!6RW3KEh|&Dm@joHE z>6T50j42frsSdsUD2~H)7h=rhlF{BjQv^00Fh}x7LWg{}R0HK-{id+*`Aq=|?mzBt zca_vjU)QfBTt`KSH{69ivrXF39C=jn4HS}k)~yYxr$@3q%~~Krai#3drfTK#@o!gOeshcNqYm8aA@3inEgeMa#f$AAOI2za5aUNV%GSM>dUMEiOLPq<# z;s-1~ea1tuf>A~0tLX_Z8z9!7O@B2NC}oYtx$_K|UTvF_k~&i^vbNyL+iTS}&+D_? zCeOzop*n1b->+_+fD~UZ2_F=BXZOtU-mkLz=R|H_%NqSnF$U|uKmMBnide86P-Uh0 zvvWaRdsl83Izi5tal85n=$NU^T+IQtYtk71#$qN|BOG_|1>Y4U(9B8 zzlGm%s z4~{LudN-$v&zDwd%M79)s-CL^eW0pvRkhf-Ah!{I{J2ro&G(mBN&II%$>wfbuI z)H|ca=c|0i-el#QoYC3&Xw@8+D)a2FyHNpgU{2UYQQfae`ls79JXRV=;yDb@C6>r7 zU$X)oI`DJ2cy`UHoDU+!#aMB`M ztQ5!i>u(=l+V$Np%PG=x_p$AK^oa0_qyr?<+x#4~fpXm@)W+A^nYZe=E4);4+f?>! zZzjZ(VRy~vK1ctFEPgtO0OTS89%FJ29&;L1gE=+}f}S0c`Lkv9zf`H)sDa#$WE5)% zI=TNGZQ3_5kEHF8jM|T|2{SX3-PKV3ft6MM;oMSKz^S18e0!*S4&N^26jte>qK+wfLIee{EOaEBBx$|ZSFD^V|RvLSD1 z3YV5Hl_i^&jaHzwlsCrSPoqn>59P8GM&yHF2>$(wzMd}M*=pZVW#N^HA)$?K*oOzb z{(Pl80ZOH>jX4%;Qt9VlEVisSbTsyGZ4ynF))64(^TGY;32oXEN?P~ueT`*ZpV1RG zv5ridp9Kiqaoan>VZOG@vEJYMn}-d{GeU>c)VyMLYa4ilV1XT%z%K-A%bzSX}5fh!2`SkkBt#!>q``XI$F7rG2Q6Y9?)OU?t z6gaJWUqJBye(f~j#0V}y48oS$V1=SSVDOv0vB^%Ng1I+JV#lr`gE_Hu{60?--q10m z9CfMMvF0*Bw(<`>02}MP<4LWRr$#q|-Nf@VJv4>p83q@SDxAYqR*dR z?jGeXCG1X%M4%7BN6`|bC8F>E_!vy}+qRX1NeJ1XCfIf;a?0=PvAP>wwV34NXV;>u z*!Ma#Tud|b6eLqT5F|c~xDzQuPS2yG9w|mfjrJ~l6DUT$dPlFRyDD(~8mCtxYOPF03&2*LZ>sQ`%r?6hV!Ek2YOIpNzblIxzj96p))KNR0;e!4DbFB8}^dJT1z*g|auCpP&*kBARlcl>k1sqd@-^UV`;eoUk z1TPOjc8F4e;Dh_uJd17c6K7{DtLWXE2^VzwPiv0BN@gsJpDe>qQY62@&(QkQt_;ia z)W)24M4VCKLIep6vD8yW!iqud6r5eXYe$ zx2cp&oa-YujP`(!Q%nFnhK^M1Da}oig77W5wY}S_+O{7I{lIr$roFh@uCe58L+^S9 z+eQ?UqZ}HIWUIS@kFvkEw&Cg26yeD5a}8(0z^0ql8J@opxtsgpc~qtA&n?rrh`k~g zS#)j11Jx0%T~2=e_?|qntE7@ygU#emZ=%)Gl$UFWl{)ONKB+~zzl5of{S5_L5T8+A zB2McYg7AfQSO5^hFv#KwyJmnFNWRv{#VTUrN8x6_!q>5pUz%a7>vm(21^&;jtIXGE zqb1tCnbMg5~9vqYelXd~si=59hGDCJ+oiHU0x8HTz4+1wNm%mSia?E z^#v->Vr^qO$!!Ss9qqOqU)0bHpj{{YcgGJ+}Hp3sPC7@-KkEw8ae2xIX9{!8EY&EX>OUVk-)5RyZojH5bD z{KFm42vZAJ#4dorZ5&ZhGoy#9zgfYC9e_$BE5O`w*qOvizTTP!62ImbefqLN1 zy2#yX^zUPTZt+t3G|uc+qkw!Ts$$LA$)$)KXgc?^awdShfl6PEc}yAx9=<{M^`O$LputMJE_1!OzQ*e7qZ1FLwrzfG=^s4}{h{0ign?-v zk8fS$Qxzqj6xd<`ifw2+pspj9%5KIUfqWE13zWz1c4H_S0)KdIlpe8ntgh={m;bda zzaEW0|2T-2maEt3l2Wxyf_aPgUGIS{vNSk=O!edc?86HPs|QopvIIEH^gRqoM{*-oIto1%-Zk za#))=J?W(x*z_>w*kbxun;(d$sBuHccs?EoR*@sEdNSJKQ>x0krSF0yyowX;HjfKJ z9pbdkJyXDoaH;WWu(keK{lfn(k`9wDpU2@tKYFvTLu}oGUNnQWMZVcS-_BV3hWMs5 zLEBF{07c||DFQmY2h=d{(_132fJ++j`EP^&XaWD*d%q3-HR0b^?O*Hgzp)PKKZkn- zzl5=EJ6bg{XU|{UN}qa!xRAguH-{N>iI*Oq;^ZYt~5#?^XNX@F~C%WQoi1Tmd}C`}7ZA0KhIzHAz4NPWpvP{PF!5k{9!@z<6u) z03<#R1V+LBXMcNU{;~i;H)gEpXRqTU!qJhdN(q(`0p9nnY6cjqtXA*mvOSQ3Gxl5K z$#(D_cUmWgSDJFRa^Q*IoeJWzlGSVjgKhbn64X1;5x+Y3^B03kuW>aHmTmr9m!J$Z z{Fzrn@tETj8ESeR4^E%Axx~l5)t4KmRZcc+SYymII{U@j*Zry*NMvrB^`*)2T%DeY zeX52?XNuNaCqJw8>Rbz_anH>CkWb!XU!hLUtlAO-S5AC>{W0jhEDaV?G z5#(nJfSc_k{uSV6^Jqz2y(HGY+yE3vkFvbcfCrIEAkhHVUOzB7DS{@r1mQq)So!SU z4UlfOV5szWdoBfH=_rwlyrYCQ?fWCLJW&tcKel{py*!H9~AtyrCK5i)6y#zYnn?}u0dPh2T;AY9pr##KBF6CnCvmq%qRe)yE$ zDh0YxJ-+dXRffmg-XNGc=?-sy4y_kKPZNNh1`gOOIImp1_(a(+v30OsQm|cFq|U?H zJ1V3J$3u{dl5y>HQ`&qPQl>yN?iRRv%#_sgaou_h1GrOS??N~kYfTM@pAcz5a8NGx zt7za;Q2a~#r&??6awh{~W&2+rYc~DadU5mY-qVy+^Bal{eByXi5aJXHei>#$Km~3Q zuudb}$Di(g?1vE!X;5X;41gHSG-eQl(!gRWH;UsHGm|E z0*g0~U=d8jY5J5KMJA^pFTB!%Ctb3zt@AD@;Y6@XjI6DPHI}H06V8}M zM4Eb#@Hk{p0quBB@I&s(7v+}UrQ{gbMs7V8myEh3dH&|{bElb6ivAj%;~M}szgm39 zt0K8rh}nP;p! z$ZQnWewrGsy^^1UNLLO`Uu?q#)VK7#S89=)wo(xrZ@B-$E+N&}qd{;JkS5fj=Af^ zdMN=MGObl#8pz3_Ve_=`?PjK{h3QEKqX}1qBJgw?nkD5v;em`u6y+?;Ip;~DpLHzG zS2B1lvGQq}ErX2UdArK@M`FtjUK(uLec`-1Yr@}S<>w4dDK9`3r5gDzb^v9E zVDn{k8#_+UY`6$Jhgj)dlvqun6^v641Jwh7$Nr}pOCRe%%rXNd0;~B0&^Mbr&%eN3 zD$f8x^gorcajeIZrWQ}DQU^4tiD-Z?5%>@|e*dJ%9e}Ekv=ph8d6$1YVX4bY=R1{< z9-f=u<|`HNm;Ai=>t|V}ih<7BSV1u_8K!Ao`;xcSk0*;{i&ibu(T_=5IA{IPE0dK` z>nff$M2@x_RYP*B3e8IOEpyR1vtnht9AIUOwWH5skB@O^V7ZBrYn(e#fO%pMH@S1r zww%^aSewsv`3w$}%jXF=<1=G^F~n)Tu4>~*;IuA}`sTUD(?fZ8W$_~ZKl5v0I{?1~ zGU;G{IwC&Y&uRjaw1>jzBFzk}{RwmsRx8*!LKZfBJ4Myo7-&@PdTcWFZQ_{L%j0Jl zMBa4>YflQ#oxJN+=*JE<1Nxx3 z!S2Y;n_rSIo9lewf5rPSd`>ho^=1BIfU?M1&`jT{CHTp2Y627~{o_8Cw}^JAh>e0G zxg}4=RGsCMM>gELQ$J!7dpw{z|%H|Lr-H3E-{O1lVzX^&nYJjZ808HbLcCo9Ry zYn6=h)G6~#FPDi(;nfB4fjZ4_SZ@!c2Ka8{A}D99O$S;aP;vMvOix8XX$IgGpeY*x z=J3&K`fdFu!pbn5g~`ii>$TR)w(?TCHez`Xg01NbVf`AH{C6={2o8WbjxDN< zJ^R@*DZON?93!bJtJX|FtnFox;G;91tvQ577aMC*fYYgvl&hq4XJ`6od7NhHeVsir z1HU~^;dG1TA+0#d9cm_c<}pkVaum_1Ohv|UKH(Q5dr!cyq`jlQ{E$SobvSJuQ6t{s zSg?Fkj&F`?ZIHBZ7L(*0-MO?4nH``A(l(c`AzZNHJ87e8ml2Je$TihdWzbdV8f4qI zR2M4K3jpCM6{~!1Y1?ziQfzB8i5}Nu+5F8>x4_xmaWvU0;n}G5?Lk+Em@dxiPhIBN zsu&Y`H|oT@7IQj_u%2B%cgujFfJ{Tbv`wW9?q$YNE}%DzhR}=@S4gn604eMvWKq4@ zPav{PVW3E&=UY(whim@+S;7ikw;JA5aZL^ZyIk358Y72%{v_UekWtUTnOyZ#lU!IOta{U<4_Z zcp0svCOVAf8(TJ0+6{>bsdIbkDI6}qlFcUB`RX-~Q|s5wBO-S}1^S`m{xDlo{d7NB z1twlc$a!6-`b^I9y=&dA{X{}(Q;C!LfKaq($Jg|W@-Jm-0C(IUTRJ8lLv)F@H@Lv`v1HoYGXu<}e_{gr6@pIC`-3LSvnsG_LefCtiz z=-lBEIz4{Xx;>+6giGf;U_;U~%zN_&@FcnTXG7ZGpPywS(Qqiv2XyaP{XgDk{%s=y zdo2iG!$)DJj7=_X(xHJ8OQ1U`MGwGsvj|=HhKn*vOP%xc0snV)*x2eqpil>GD=wWT zJ69|86mdNPVpvKW7+fz@*(-#RlBLzgc69ltHD_JBW!?llX<<*>ryEam_()+WEgfmi z$AQ^=Lfb0cfMgulj~Un!r>x3YkFj28b2%#3()d~WoL57`qxd9}@^mCWb8*UTeo3NK z>5RwYahJ-_a_zO*in2=a%E!0A6l?_V-AFV$XO`KouAQCSzew2y(2ia7j8~y6a&$4; zat8IHtqHejE(<4v5?tO4bp@g)lJbmYfJ`ee(MK67>HnIs} zQs#PkxG3mP{5z8M7lzXfBzl@UD`J!mcr+4gm$w{Y^z4w=#7@!lI(*rm<(&NG{Ay0h z%XQ339eDp_!rdZ`Kl-}n1stsbw1I|~|HRGz&;CabTl(j^Kwx+8;pwX`ev94)?*O6i zM+LCc+{ciTb2OBT%{jq<#ok;c?QqKhsJWk72;P;%5ICf1!nytW?{^t5Ed2J7KTaN2 z5}gldY_I;qXJXa>USTy5;a(IYh;nzs6_L+Mq!7;f)GjFHSi}J+EQ4%;Shqw>OF$@k zM(NQGKO`cM5K3;%y!g@shKu@<@i`fKbv z(0@Emmkh=g%rpTnBfxD@t?aFFEosIan;y1v>o_(_SBpkG#MB@)21H*nDpeF+pa3W|QLNxUOopJXs zLH2F{{8nzXMfwZ1EP&sNgaiCmL(I=0fZr--HUyr|7AVWka*!*)vI6a%4GTv0HIXM@ z2&~swh8V3Mm)m4#JLGIUEbZB&vv6<7bpeB^iOo)1UN((0w~97TeHYiQFBl(h;`rx1 zpp_sX;65Ki_ouP@XGQ}aF#pk75TzN~;ATRK;Y|-0?^V9}4>8?!7x+<%4yHV0eqv@J zd|fhIBkodqzmz%O?RLBKmv0b`)v?wV?3XezxZWZ7cKXoN zi)$AD#JXDQw@~)CEUMXzBmXiO{%4F6r^YRF#?EkF>sSSCir>LTdUY z{oTi@e3*0EdC&7&?w@|9buL`?)UB*rPJ9MzrB@nExCHl2fLsvlZ9{h(AB&l?H5J(u z{*P48L67MDE7j8hy zIHF0sxwQI*Ah1>5D=kfO;yT(Q+r9$GJPa(5zccbt*b`!|;z)o9{QLVEG`^sJ3y45X zq;m%dh#hj|84XUxzn+=5A4*{b@4Ov+I$x7A^R|yy$2<{hHaP$0C3Q$Qush&|Fa|D~ zKI5_X{C|SMPmZTCo|;KjXabHl0a25|1zv+I{M==jddDGVc{kN=<-Xjpqc-5x(Wd8} ze?Pze+p+XNDPA&9AxNT?<0(6eLk~-b2XCa!@7}JY4J3L8DnHwOmg~!R!|poM{TDv; zL6DOqhv~P-QwJbt>BEbO5cbt=aaH-9W^2HTmJ;Kcuk&m}P`*($pY3H**Ug`@S(e9ZwINi`_v<+|>MTFf?uJiBd)BP(N&;Uhn6$tevC?Zz5(?%CA~E%`?n|(QXM5 z7cOgdx*lWlKCH>)W_GvN`X~ATlr&qjmScQpGJSQ`iDF2yBQ!OQ>%~)40oEIl$Fd5| z5tWHN@xZC*bV&2(jf+_DD?2w8ZC*8zv z<^bK&)o7sBrVn^KA{t1a2c)5IQB%97C0^B#)uJSdZNlyff2!OvY7gTuEx@|0RDsGG z_wg{T8QSv6MjDocw3;QiUb`#o`$o#fSmnyY!@DhxZ3O?e5|Uz_McQ#956R$OyXWwL z>#5h*pIP>em2%+~QT0GGY(4*`sZ%5#JS2+yXc&J!5jS|JIAlsPs{qde9X5*DPf;XbsndR0xJY;8RY6JTwG0sBiB1i*CndA z4L(fdFnB=u1nk5WFfMWM`h@oJjELxgVecnIOYh;OqOSVU`JB~$f&s!25xLL#0%@tn zr>7@nRes)S2PLWw6~r#@X0Pt~!wIb(y;rQLyQ`%DiILNXvw45FQ9pu(qCQk7V?Umj z`w{DSW{LB03u5GfI@+A$;rnB6PhZ~^1AaRs;Q|+hwS?*C8WL-C*?Ae&N}he}OAw$E z`4!0tZ><4vf-nINz`az!Njex>rgu>XT^n4q?LYA*FSg~3vi$Hw;$sjfsQqXZk#TIm zFnlx?V{UC~v0Gvad1thnC%Tab5pl-E)$R#g@oAb)-HAi9>N81I;!^4zn!<2ADYk^Q z$$X3RQ?_IE2m}x;$v5Gvk(*x&vPpbIelVLQ$q6k$%7SURx$Lw*4@&TW- zpf-qs3qMI5M~q1rwb1Jid-AZQX{G^vV@z)zPMT_`@8;oKQO;3pag9gpsienk&DH)~ z*O%`oDu%$$3u9@=pb9RrMAuJ*jTS$%2&2YP^x2W8l)LN2MGjunbc3+q2=DWz_jlmNZs*_*huHCC>?!HwPef`!wHT#FxmenQ* zebJsNsBzXNG#`=q<+>U>wL`tcB|$Tjm?sgnbXNYXh*B`IRn`YzWd zW^8l@+loC#c|2UFNYunzl#JFHO$Wf6n!IY}%S7UEi_KN{4?uns_v7FA^a(o9W&hM( z8qgp4(P0@7Ff_iH`o6%>Jw~R)_0pb5mlvhn2`rA}TEZNmU0mT88md!%G|kKg@d>(f z0$P^h!ac8Bd#{20YV+w5+tZrUGRZyVBxf9X&EKeBvQE74hqHyPizF?TBUR>s#f5~E z1Ff9yAoCj%bd1avWXM-66I@~v-lcYd1?G*zDp9G|r!`l1hXTJVccsBw9!{qvFYETtT8Y*li}b(JbF zmn^S+p2XTAAd}UTzQWazls#4*sj|1GQMG>l%N%f5%B1Yl5M_jz1aKw!VTz^Un=NS! zM9vUNp``X`y!n8u6qO0bM>(pmdJsPi$wG=ImheQail~|8we{vS2 z^Y`xUcyo;>_RF)Tpy*Qpv1Hzd%g)#- z(Kt=X#0vX{KAy9qf$&iXJC4*vzUfoj%%KOEq}^WEOwDX9e5)(&dAjL~*U4NAf06Sg z>oW!co_m&?^EKAm=*Fn*4@r6gMJsb%sC?aOe3^m9-uls9E83V=c}g(=j>lgQ0ehezuKvPk|0BTvUz>*oN3r@$L5qH z92yc)Q4Ov~E?!JtSlQD3nx+i2uM(!_*pk#LFKpZzl(k}Pj9vOLDHN5}b(4G4adN&+ zS0bWxVedIn(^u2*PxdQ7IHTsck z0zAx_DDV8Ll(3VLKA)r@ zLdKVpegex(G zjke^q(O}9YqVVp$ctc_rjF)()WW^hcsY+dw&a`w$NKvynXVN6E-OzC@M^Q9qZa*&y zu~fO6A*$w>GoLht-}8XeFG#ZQb54WD8F3uhn3AhjB$Q!wQuBCEOEkt!rB&NA;!$2e z>iJr)uDcOzaiZo7M|>}S;9h}=PX1ED7=S zJ@+Z=AK!cXxGH}Js+5SmYQ3z9f6x`H_w)zw)2wvyB1@XqtmHi00I+Sc?^2~RI&?uT zbXw9MfX#@Uugl2HU=70l_5IWdo!4J{2YlU5${gs)dHaF zB+?rWubY~MkJ;Ydm2fL7@>V=?`E^_TIJ$s9D-Iw)fs+7T9e4(Lysgj&*<$?*D*L(8 zxXZ-b<-!}o^xhF7AaCIC_6)OBRAsq8D#TUAAq(Cwz#vENC4HwRUq89`~}upL(;egVJH&0_mPPChQ3bRv40ppirON8z`E9pncB3M?YRKJj7-K1)n3QAR}ak@Dc5=Pd(7!`w9F6!*N zdz>hp9Y`dWfDFLk)nRN(u_WMp#V7_|OC)rN7|^=OX9AFJ`YEeZ-YK;tncb=$6I~-O ztV2#RP+#g2pdF@Z-J&9xpfoL_+F4R8fybO=S>RKuJ0gcgu6~3`cQ!EDL$L zSgldo;c zptW(Ok?}bvdi+bY_r`K-{m6;ij%afoV)Xt*`CvABV@kRjN$-=?R1^A2MI(37qCgy) z=Tv#seDY>oX1b!yq=C z)M=KvA|Tv8(ETj4;Fl=Igrk?(O)hru?4hho^hPzSSp(uR>VUq`1JKpl05~K^>e@UU zPJ+z9^Kn>^&qT|PH;3C2`i!okbb9I!y>rzcZV0?R{N`Dkh?}*NEzw*)?c@lmPT(^s zn};Ldh<udCRB3&`g63XUO z6GJiFWi8PE)Z^@abcfK4m5i5;e^Y&rjgFkdf^h3X&17cqQF#I+owpn>k%xWxvDEye z`MAv*D}%i`tI$SB@IIRKNTaH>e8}}vRjLri`}WPIqw!TjCeb>r4Q@lxLCMrZ z#GEFoLnHVY{IZXhX-ezVMFKoxIz>Hm1?ataL5XjbSf1Y|oMd~B=jNqH^O+lMOjny& z1;S|(!{F(RWQ8Ce^D90!T7#4oRbefb?_qtRlifdaCLM&$j!mT2IUG*gOue?AKE6>_ znB(6DmHRCG!59gl4Fgixi9J|Mclam)K!aOoLW5DUw7l&>G3>;O zNmrxlp9`!d5H=cPNKS)Za(yK8;uJcf?*T}M`~E9xhWGnKvcR}Xq{A*8Dde>;9R`Cc zv~GlQOGlykd~nU`#6u3nM29H3#cejjkZHMOz0kORH0qDVb04mUh0D!^Q%ZS-MI5z;70jw^) zB+pIxe>Ua$FJKlQdB2x}N^)!M$^W3=govca8Gi%fd>`xLzTD*Jy5f=Y`;r+I zb+6XM+Ru0=Fwz~BD9&J+2(JgX#vD?Agi~%IrUkiihO!{d$Z9!9qaIZ%vH~DNt>W1x zn>6vpy8jpCR3^4V_Dh8so|6>FEYQ_LUoRy)0pGjpw__PFQBPLw%TeQ|+$Hq2^c^4b ziEm79Nh{6zksdFU+U>C?WpKageAGLM@UwIeX1SNe``{pFdSjCMjHBS7r-0?3nr)q}^(ShaHLv6f@kKwm`Zl-K$P{R`gVw@xQaBK_ zyAc3Mb4M6Bd@s3d!cg9= zYfvB&41F9v_aMKX2Bn<^&>FfwtLpeQ|3MP%`VMA$3QDC@$}y9i54SXOQ9j!cKy0VG z83#HSqyBPm;5VB;l)KJ9asf;T^~fY(T27fYT7!s{uO!x1X9r;xiEdb3CB@_`F4xk) zq9Gu=5T@xL&%e%B?N{%d1utH7IRL@B0ASnT_fe6bHp){O_S2-OV~xc zCHQ2Y%D&3fxe!8^^L)p=HvhTmFri3*hh^dx=kI21`THOFZDeF-2`0g5=!dJjvUR@r z00_=3N)E-gvI}+|@$}D?mdZZC#_18q#uTmuQUV=&IQ;kR4%06i=!n}ICCStRrci&h zN&MsM{1bD4>C|_C-uN-9lDY{z&@5WNjWh!PD@<6>#$m#_QIRT))2I{HmSZhBJ~}*~ zCG1}E>RtG8*TLhG#EtV|M;xt{W;Y)MJoru4_q)jNlKV2&3)@qRX_ivZt_!_8EGbna z;j(@Ee1dIU>ssc0SGLo4Ty35|E4Zf2Wl0~%EH^|kC*|f+9un^;jbzz9%4T%tak<*3 zKY)K;0Vs#VY{CUM`F^~}AD#>o+y&49aXW(5v>B)z?3m{9j|$ z{||igIudL5*5ha*2E&iEB;YA;nMWdyH4kI(OW>7P;QdR^OGuJ1GX*K#1R;k3;kINQ z{jjczY|^A%`Ix{Szy<3-MX#Nnjf`0XwLAXq49vsX%;ZCOYoPCVSGNdnlixxnj} z&pq^S*nKzl->`dt2JlnvdQ7e(DiJfYfGt&^vY{v+ml2dGEs6?x#~vUCCmev@@&TKA z?B^rP7UFZLztYkDQ*qo2HD-XA)c2Rl-ao09GrsqKbmK7|*=1l_+v)$|kn`@o%~E-= z-p(R;kq?N70YFKvWw7#HI1p|tZybQGuRzJm5SmoX9|x&*jkI46`@}~e#CTRxw}BAD zsrB1P<6l$$3$Dw(9}fg4yeze#(P(oUWYN5A;rvlq1C8@Ze}Vb^MH@-|k4g8^!^JfJ zSGM~9uAli+;#2mVkBiVEt9MPlZs&e%MB=~uj~c5S$=OX_0B-=l4OWZR51B=gbB0&E z9FA#tV+k*o4nUjZ3$%R*O*n>h{W&0JTLVtp0l(&&tqSXxhc)zD?NZJuAt*c5fRsJy z7d?)4nh#9#e*joX0>9Db{#9ZA5s@SR?5}BkdFOxs!zp$wqVY)10jSRzNnS#blEE{F z1`j|B<$csG3`LK>@zL7jXR>C1Sm-zt@&Ke-gxCP8QaDGT?nbYF07@GL?+yTxQ(1q8 z(0|?9|MIFW5txwU&L0jyb-x3e9s!yPHGK^slS!mDYp7~C^9wnJwR#J z4E~EB;a~M~1(NT-?l;DsKZ9aeNs}G2)F;q@*2k4Ati2;OE(J+vUVpRuk$2eZ^K9A+ z&w@Oq?}z^(J?x*`fiNZ#TG(@|Q}4V$x8vy#y#~eUe{5e``F$I>h51Pj03k)2h{Y?z zO7&qHIPkn1ZpIgZbPb}t9Kr4mVJKDte|QZ@^Mn6&@&DFE5Unfs2$Q&=p=!bT ztZAwGHB~Hu?SX`zFLcK;B*trdI^QoB6tu@;HQFE$v>)2m7irBwpnI=m@nFRaZuFpL z{d9BQfS#~&LKI(dt6OArdCM}ExP{zq6ri$|Zvn=q^fdjX85Fho0JJsct-a1@vxNnC zr8=0gKJ|W=r{&DYt$o6O3Ni|3APT0mBzmIn7hG)(QVUNn2Lq<2KpM#kn3_I8P~stm z{r4^cN#kFsj}JghUw@e|Bp-n0{EdJzL-KxNIB3uL7vD+-(J%LlZUsc=4mrp@AbETM z@9|FbP-lK2TpT-;_rr3f=4G7B@}~v6zTw-be8-Q>3(%cTYVsU40e%fax&qA{+IsJT zA9`Nf@#0K}^LabSWf0xA&+JVtdi!TGFK32#+x|wu=v6&jajZ(9ymD&tYzEdj)8H4o*5?Lbx&INx^;A}u(%C%4A)WsF@lXYS&%7(WloL(7P$h)r> zeaa9s38Gs9EI^S)cgeqMHviLpR^m~l&;!ur0}$B>D3*`fJ%BcY_kedM^r?x(g#;N3 z1oyRNfbu_B_0K5#{%xyQ2)pW}Ph=w!=XIh`@)Ha39yf2*w?UWOW-WD?AU6pS8tW7{*1eAAn|% zT0i~b4HPvp1HuT*I|HOJV%tu1Ka3G?UQmt+p-Es|gz;ZDmqu2cTwJ8)q8=Z<-1&I# zwqnObN1q%X!HsdyXQC*OWJDsKlh<_cCJ_E*G{==5LHi#Q77Ja^J{^Hxn_a*7-OM0| zHil$|@!(cA_(&J0B>}f3!Mnn7*!wBX-ke^hW@iEglX)(3=ON!$6j7vn@ZqztV`P1j z-^2_rl9?t1Q;EmPr}Ec}ye?SJ7|k3M3CG=H5Nq#XeQ#1Nk^sK4kgdq8_{lCa&SG~L zx3=Jz`(%yCE(LY!M%GMC){g~@x++P}sf7<9?2$p31`S%cv$0g_qW7~^CHLE5`@)m)SeGJ>dO&IFq<|BUEOmbdbb!-Zdi%mBkGL=+hr_q zdP%y?i7{Mo5{d)WCLCEm|E#&_@X2H^6xn;66p#0QO@Zc96a(?s^4fPAXN4zOlVVs%B-}^NLKRI(-VEK%>uicu!LCMV=WPk z5AqpXUMEc}y|G#FQDJAVAigC_Q+sl-bcLJs?-TZ{u6g_I(SQ_it%F9-ire^J*=Wr( zswU23g)kj@&L_~|MN=TOwEM)F<5J&Vuws@7iuu5o;_<>=CS2_ZtryFTnBk(P)_LHr zc}6{ka`_DCogwR*PjlF6UAyfb#dziwzT2?PefCs!&m*7Qu#S=Iq zz%fZ`)SuxA&?pQp`tTB#8NI04&8HJz3l*Ap*(yd#+UXrY%?D#6*m+1=w%2v>RLTM&_wF%kXRrS zgCYF|G&6}xlxak8z}!4=`X_z(5l8ht>#NRZog5#0aubI$KN-1fAxbIl5_o%LI|t@P z0x%WEyoClJskK4aAR1+6^uSF#@Zkk&&g!Q&RI;I_ z;Io2SW8{t6ZkRY3z~35W@cM_H0kUo|HHXH6I8+&^)J;?r z@7F-q*=;mk%USZPk9lo3U?*=GAyhYWKEB&n!t0CJb^Or# z@)aGZ3uoR!9(G2wc9F92{9(M=UchqdHR@<&(qvY-A_n9myfA}W3!aH#u)b5tX(15p zB0DA=`N-B0)vxd}?a;&r|IrC7cO7RY}IrcEj zn3&ari9`*s5S9ln*@Vb=E4*`X2sAwV%;Y-Pf}ojpF1!VEk|sbJ#IN$p5b47$n-EM7 z2cQKhx~GNahRi;^wllvdJ`Zb83Hio!KUY9>_93-WRuA%(CPrwBP~&;v?59?Yo7iA) zqC?`G$|h0n-K|rzZ43%mqQ3XFKfBiUv@Z->QA*K?$E%e1D9Y}s37RjC6wWPcjOxqt zXg@r8yNqqv`P`c2l_Y=5z|N{ra;;#Ss2tpnOm9Y#BBsh{gwNhg5l(?$_%GXrRg zz`2zHx8~|b%ijfiLy6mc<i{O`0q3wcJ5d zkuDeq=J1gzfiG1<_5Eea zEzJG^@039yuuT8bMLj9KyLuW;hc=b(EN3RFOp6}*Qe;{hwT412BV-#!PMzy{|SYcpl{0@es zC$YAs*1waAwE0;yfcKgV?e6WV>clH9WIbOZ<~K~8BdJg8A0;(?ecw473K?$xBI{eSkREi79 zJH4`zIT+vps))?Qtm=U+N~=mnS@qL!^Q{vGA-G#6(lYJ++JZVIzE7!&29ZN>G14$V zRBM}JBG@P4qz{u4w!w^xLANUE2Ph^`=*iC|U1IG7bm~Qit8cEqv1J-&Zj0gZ@xMp% z0H|$he4}Q~x-(Y7OVEu%mxaLLq9WJX)Hu2KEZ@^hF1f$pJ!yNQCeih-szVM5DD*VB zMp#=}71(LG55BUi3Dh6y$MmJ3O#JT?0bSS2|J{a^oN`dozW)9UGcDX=-+{&eBvc|@ zgi#s}vH!Fd^}hTcT+NXj6SvuI%zHwd(#@R8PL+7}PrLRY1Lb>_ciho$7GH!g}N6}>1g~n1e=Nz5+gO@sa3AcMh z?D09a)Q!!UA8U5C*+aY#2bAd!d4FTldKPGMZAX+FZDc+H(ErR!M?G~5TW= z-uj$=c`nX3GR`)2!1Z49!jsWYW|D-_2Adhwt3nl3{@T2ioy3P4&hlTrm3?c>V?Te2 z%^<|Y1jKQ2f%HB5r6IWfkK1-mN7_BCQz38Q!P3E zOgj!`fl%b;X@DGxAj^4~v{FculC5^8PD)LP6 zb(I|0I)2o29&guw)Uv&w$=3L7>ztMZTlDto)MbFjs{EBET|*kgS^4AiDnlqnA|b0V zWqy<(N2&FT0bMuQcan2?*(}$4AG|QOuj849G`~ilp%{OI>AN`sjemq3*B@(Ml8zOV zHGKE|wBhyWmiz8JboFgt{ZuQEGY~F)0>ZkUlo|WO5;)+3o8cVh>6j2rH@1FFL0|sc zJR7(3xv0|@k6idrS(Q;d0+U8Ik6KHR|I}slnJNuevNLbo~ zV91pCpKVcfCLVYcmor+hE?m@g+kbCkKKj^r_|Nv)&X#W=N?egMRQ-Fz z;QE%FkPXVS{U2(;t`=<#GsvJ5B`1>$*pT36qExZ<;89`L*0& z`VZu4tb-@txC^3G2kE4I=61&gW3PuYKj+J35#yUpQzwY@L0f&y6Qpzqy(5~xp0GNe z+A?mr0_7Vlh?0=xVSnA+o@NnpjWIGhgK1$WvVRN8=fesqC!(6M0yjQ68!Ve~SYNHy zzhq+#b`QisrlzZY=tS~*%YBgM0-VzjzLVue#L}MutKXKb?vq$6F&^Q9`HyV-eD(<;LomQE9;*oQK9speRCj zy|tJN;C(exxzk+&EI#zDB|aq#up9KDBBA#Nn39PP?iM`q>@IPQsz|##aIL*4$%2|# zCzQQ}WubKu`S;1D1c@)>%kpha5hu^+3!-oToOi}-J4<)=wjT$5(d6^(3mRV}I=py9 z(#zKJ6bJ__&-vu{J6F2zyWowZ@AodbTb-2+zhUfpXyXMum^8>&*(Qz(Puv%X@f1IG zQA2ZhJAk2%k1x`L`bO;C{E#|>NK(GYIA>zp5#Hy$TT>|geo=+Ju8&LO26~15h>1bn z4INeZoxKHoQUjQY!jfdzzfO6SZ{<_c*Ewe6Hj`6cT6a=&x3Wg2V(Xsv51V`6admgm zQADja{p0Ec{pPg81D+^uQX}?W;`b$anpAnk?dKX%O)@u^WDD+pz7)(-be6cXnZUMJ zZs<(`qw4ox#g#bk)6mwboucXGGJjK9frkUtwQewN9I;wHX2wHgrU7UD9RSm@D{zLL z96`25D}{@qWY_;c6JgghbO4=IkYe7_Yt=w!6^1+$$@-xR6k0^oE$9c!qLv@>4|Wfx zF>X%)d(*$?2Ek321)$A;*KDHycoe4_-OfGo`l9R-Q4?}G=?smi$Wu~BB@DI-LxjUx2LG6pn2en z$)-bT+VLb2@_||d0a=nQ=m6w7@Z&1-*$u$38E`V2{xT&z z2)jWx`#yf(O3OnnW+q>kaX9Mb&m5T_Jzw_u;#=Kl!!QNYay`S{2SY`kr!?37$>dya zr}d&Nr~fh4sW+a^yxFO9yk{F{rZu^BxxP3Z9)D!llAefr zCpiDTWBAir8oX+uwDG)>J994rCqu(EFQ82*^!%tgT>9(zGer)0-}{ea=T?Q(u@qeS zaU=AucFdI$>1Mmx^`*;w4rflfme$$v<10_=y|=Ma_3qy**S8lX*L)X} zl-shvS$2#4o73!TwCZ3iSO-U${5Imvqeck#a^CfL+AM2{T z1db^6*?6wY>m9aZN6W+$*0LuaZx=lg=9%it1OaJ_GyLH~(ZypxklrLO+@$nllC)lj*|HBHrX!F^M)jdyTXX

s$|DmcL=0Pmrm23-FD z%!0_;LeB=eZ Date: Sun, 24 Sep 2023 16:22:21 +0200 Subject: [PATCH 2/5] delete no longer necessary files --- .../backend_module_docs/api_service.md | 410 ------------------ .../backend_module_docs/audio_stream_io.md | 97 ----- .../file_name_formatter.md | 43 -- .../backend_module_docs/segmentation.md | 276 ------------ docs/backend/backend_module_docs/shazam.md | 160 ------- 5 files changed, 986 deletions(-) delete mode 100644 docs/backend/backend_module_docs/api_service.md delete mode 100644 docs/backend/backend_module_docs/audio_stream_io.md delete mode 100644 docs/backend/backend_module_docs/file_name_formatter.md delete mode 100644 docs/backend/backend_module_docs/segmentation.md delete mode 100644 docs/backend/backend_module_docs/shazam.md diff --git a/docs/backend/backend_module_docs/api_service.md b/docs/backend/backend_module_docs/api_service.md deleted file mode 100644 index cb66a2e..0000000 --- a/docs/backend/backend_module_docs/api_service.md +++ /dev/null @@ -1,410 +0,0 @@ -# Module API Service - -This class provides utilities for identifying songs using various song recognition APIs. Currently, the [Shazam API](https://rapidapi.com/apidojo/api/shazam) and [AcoustID](https://acoustid.org/) are supported. Support for other APIs might be added in the future (see issue #53). - -To aid in finding segmentation errors, the service is stateful. The currently identified song as well as the last one are stored to allow concatenating segments in case the splitting was too eager. Songs are stored as their duration, their starting offset in a given file as well as their metadata options as gathered from song recognition APIs. - -An example for the general workflow of the API service can be found in ``identify_all_from_generator``. - -## Contents - -Classes: - -- [``SongOptionResult``](#songoptionresult) -- [``ApiService``](#apiservice) - -## Classes - -### SongOptionResult - -Enum containing all possible results of ``get_song_options``: - -- ``SONG_EXTENDED: 0``: The previous and current song segments are the same song. This happens if the segmentation algorithm split a song in the middle. The previous segment has been extended to include the current one. -- ``SONG_FINISHED: 1``: The previous and current song segments are different songs. The previous segment has been stored in the ``last_song_*`` variables and can be retrieved using [``get_last_song``](#get_last_song). -- ``SONG_MISMATCH: 2``: The current song segment is recognised as a different song in the beginning and end. This happens if the segmentation algorithm didn't detect a change of songs. To solve this, the front-end should prompt the user to manually place the missing split. The previous segment has been stored in the ``last_song_*`` variables and can be retrieved using [``get_last_song``](#get_last_song). -- ``SONG_NOT_RECOGNISED: 3``: The current song segment couldn't be recognised. This happens if none of the song recognition APIs the user provided API keys for know the given song. The previous segment has been stored in the ``last_song_*`` variables and can be retrieved using [``get_last_song``](#get_last_song). - -### ApiService - -The ApiService class contains the business logic for retrieving song metadata via various song identification APIs. - -The currently analyzed song is stored in the ``current_song_*`` attributes, formatted as an offset and a duration to indicate its position in the analyzed file and the metadata options for the song, as gathered from the song recognition APIs. Once a new segment's metadata doesn't match the currently analyzed song, the current song is stored in the ``last_song_*`` attributes and can be retrieved using [``get_last_song``](#get_last_song). - -The workflow of using the API service, as implemented in [``identify_all_from_generator``](#identify_all_from_generator), should look as follows: - -```python -import modules.api_service - -segments = [(0, 160), (160, 90), (250, 110.4)] # the segment data - this will usually come from segmentation.py -filename = "my_file.mp3" # the target file -service = ApiService() -result_segments = [] -first_segment = True -for offset, duration in segments: - result = service.get_song_options(offset, duration, filename) - if (result is SongOptionResult.SONG_FINISHED or SongOptionResult.SONG_NOT_RECOGNISED and first_segment = False) or result is SongOptionResult.SONG_MISMATCH: - result_segments.append(service.get_last_song()) - if (result is not SongOptionResult.SONG_EXTENDED) - first_segment = False -result_segments.append(service.get_final_song()) -print(result_segments) -``` - -The condition involving ``first_segment`` is required as the service is initialised with placeholder values, which are written to the ``last_song_*`` attributes the first time a segment is passed in. - -#### ApiService:Contents - -Attributes: - -- [``last_song_offset``](#apiservicelast_song_offset) -- [``last_song_duration``](#apiservicelast_song_duration) -- [``last_song_metadata_options``](#apiservicelast_song_metadata_options) -- [``current_song_offset``](#apiservicecurrent_song_offset) -- [``current_song_duration``](#apiservicecurrent_song_duration) -- [``current_song_metadata_options``](#apiservicecurrent_song_metadata_options) - -Public functions: - -- [``identify_all_from_generator``](#identify_all_from_generator) -- [``get_last_song``](#get_last_song) -- [``get_final_song``](#get_final_song) -- [``get_song_options``](#get_song_options) - -Private functions: - -- [``_song_export``](#_song_export) -- [``_check_song_extended_or_finished``](#_check_song_extended_or_finished) -- [``_get_overlapping_metadata_values``](#_get_overlapping_metadata_values) -- [``_create_fingerprint``](#_create_fingerprint) -- [``_get_api_song_data_acoustid``](#_get_api_song_data_acoustid) -- [``_store_finished_song``](#_store_finished_song) - -#### ApiService:Attributes - -##### ApiService.last_song_offset - -``float`` Offset of the last finished segment. This is always >= 0 and smaller than the analyzed file's duration. - -##### ApiService.last_song_duration - -``float`` Duration of the last finished segment. This is always > 0 and smaller than the analyzed file's duration minus ``last_song_offset``. - -##### ApiService.last_song_metadata_options - -``dict`` Metadata options for the last finished segment. This can contain attributes for the song's title, artist, album and year. - -``title`` and ``artist`` must always be set. ``album`` and ``year`` will not be set if the service didn't offer them. - -Example: - -```python -{ - "title": "Thunderstruck", - "artist": "AC/DC", - "album": "The Razor's Edge", - "year": "1990" -} -``` - -##### ApiService.current_song_offset - -Offset of the currently analyzed segment. This is always >= 0 and smaller than the analyzed file's duration. If segments are properly provided in sequence, ``current_song_offset == last_song_offset + last_song_duration`` will always be true. - -##### ApiService.current_song_duration - -Duration of the currently analyzed segment. This is always > 0 and smaller than the analyzed file's duration minus ``current_song_offset``. - -##### ApiService.current_song_metadata_options - -``dict`` Metadata options for the currently analyzed segment. This can contain attributes for the song's title, artist, album and year. - -``title`` and ``artist`` must always be set. ``album`` and ``year`` will not be set if the service didn't offer them. - -Example: - -```python -{ - "title": "Thunderstruck", - "artist": "AC/DC", - "album": "The Razor's Edge", - "year": "1990" -} -``` - -#### ApiService:Public functions - -##### identify_all_from_generator - -Identify all song segments provided by a generator, which should be created by ``modules/segmentation.py``. - -This function will iterate over every segment the generator provides and call ``get_song_options`` with its parameters. Whenever a song is not extended, the result is written to the ``segments`` list. If ``get_song_options`` returns [``SongOptionResult.SONG_MISMATCH``](#songoptionresult), the segment's offset is additionally written to the ``mismatch_offsets`` list. - -###### identify_all_from_generator:Arguments - -- ``generator: Generator``: A generator (generated by ``modules/segmentation.py``) that provides tuples of song data as ``(offset: float, duration: float)``. The first provided tuple is only left for historic reasons and should be refactored out eventually. -- ``file_path: str``: The path to the analysed file. This needs to be properly formatted for the operating system this program is running in, so using ``\`` for Windows and ``/`` for \*nix systems. - -###### identify_all_from_generator:Returns - -Tuple ``(segments, mismatch_offsets)``. - -- ``segments``: A list containing all the identified segments, formatted as a ``dict`` with the keys ``offset`` for the segment start, ``duration`` for the segment duration and ``metadataOptions`` for the metadata options. -- ``mismatch_offsets`` contains all ``offset`` values from ``segments`` where [``SongOptionResult.SONG_MISMATCH``](#songoptionresult) occurred. - -###### identify_all_from_generator:Example - -Example: Simply segment a file and identify all segments. - -```python -import modules.segmentation -import modules.api_service - -api_service = ApiService() -generator = segment_file("my_file.mp3") -segments, mismatches = api_service.identify_all_from_generator(generator, "my_file.mp3") -print("Segments:") -print(segments) -print("Mismatches:") -print(mismatches) -``` - -###### identify_all_songs_from_generator:Raises - -- ``requests.exceptions.RequestException`` if a Shazam request fails due to too many redirections or other problems. ``ConnectionError``s are caught within the function, but other errors are not. A detailed list of Exceptions ``requests``can raise can be found in [the ``requests`` documentation](https://docs.python-requests.org/en/latest/user/quickstart/#errors-and-exceptions) - -##### get_last_song - -Retrieve a finished song. This should be called whenever [``get_song_options``](#get_song_options) returns [``SongOptionResult.SONG_FINISHED``](#songoptionresult), except for the first time (as it will then contain empty metadata). - -###### get_last_song:Arguments - -###### get_last_song:Returns - -A ``dict`` with the keys ``offset`` for the segment start, ``duration`` for the segment duration and ``metadataOptions`` for the metadata options. - -Example: - -```python -{ - "offset": 195.2 - "duration": 170 - "metadataOptions": [ - { - "title": "Thunderstruck", - "artist": "AC/DC", - "album": "The Razor's Edge", - "year": "1990" - }, - { - "title": "Thunderstruck", - "artist": "2Cellos" - } - ] -} -``` - -##### get_final_song - -Retrieve the final song. This should be called after calling [``get_song_options``](#get_song_options) for the last time for a file. This should be the very last call to an ``ApiService`` instance. - -###### get_final_song:Arguments - -###### get_final_song:Returns - -A ``dict`` with the keys ``offset`` for the segment start, ``duration`` for the segment duration and ``metadataOptions`` for the metadata options. - -Example: - -```python -{ - "offset": 195.2 - "duration": 170 - "metadataOptions": [ - { - "title": "Thunderstruck", - "artist": "AC/DC", - "album": "The Razor's Edge", - "year": "1990" - }, - { - "title": "Thunderstruck", - "artist": "2Cellos" - } - ] -} -``` - -##### get_song_options - -Call the song recognition APIs the user has provided an API key for and attempt to identify the given segment of the given file. - -If keys for multiple song recognition APIs are provided, AcoustID is queried first as it is fully free. Thus, if AcoustID can identify a song, limited or costly requests to other services can be saved for songs AcoustID cannot identify. The order of other API calls, if more song recognition APIs besides AcoustID and Shazam are added, is irrelevant, although it would be best practice to order them by cost per request so as to limit fees for users. - -The check for whether the given segment matches the currently analyzed song, as implemented in [``_get_overlapping_metadata_values``](#_get_overlapping_metadata_values) only accounts for song title and artist. If other metadata differ, the currently analyzed song's metadata are used. - -###### get_song_options:Arguments - -- ``offset: float``: The offset at which the segment begins, in seconds. -- ``duration: float``: The duration of the segment, in seconds. -- ``file_path: str``: The path to the analyzed file. This needs to be properly formatted for the operating system this program is running in, so using ``\`` for Windows and ``/`` for \*nix systems. - -###### get_song_options:Returns - -[``SongOptionResult``](#songoptionresult) indicating the new state of the service. - -#### get_song_options:Raises - -- ``requests.exceptions.RequestException`` if a Shazam request fails due to too many redirections or other problems. ``ConnectionError``s are caught within the function, but other errors are not. A detailed list of Exceptions ``requests``can raise can be found in [the ``requests`` documentation](https://docs.python-requests.org/en/latest/user/quickstart/#errors-and-exceptions) - -#### ApiService:Private functions - -While these functions aren't "private" in the sense that they cannot be accessed from the outside, they should not be called from outside this file. - -##### _song_export - -Format the given offset, duration and metadata as a dict for the API. This is used for formatting for [``get_last_song``](#get_last_song) and [``get_final_song``](#get_final_song). - -###### _song_export:Arguments - -- ``offset: float``: The offset at which the segment begins, in seconds. -- ``duration: float``: The duration of the segment, in seconds. -- ``metadata_options: list``: A list of the metadata options, formatted as dicts. - -###### _song_export:Returns - -A ``dict`` with the keys ``offset`` for the segment start, ``duration`` for the segment duration and ``metadataOptions`` for the metadata options. - -Example: - -```python -{ - "offset": 195.2 - "duration": 170 - "metadataOptions": [ - { - "title": "Thunderstruck", - "artist": "AC/DC", - "album": "The Razor's Edge", - "year": "1990" - }, - { - "title": "Thunderstruck", - "artist": "2Cellos" - } - ] -} -``` - -##### _check_song_extended_or_finished - -Check if the metadata options of the analyzed segment match those of the previous segment. Store the finished song if applicable. - -The check for whether the given segment matches the currently analyzed song, as implemented in [``_get_overlapping_metadata_values``](#_get_overlapping_metadata_values) only accounts for song title and artist. If other metadata differ, the currently analyzed song's metadata are used. - -###### _check_song_extended_or_finished:Arguments - -- ``offset: float``: The offset at which the analyzed segment begins, in seconds. -- ``duration: float``: The duration of the analyzed segment, in seconds. -- ``metadata_options: list``: A list of the metadata options for the analyzed segment, formatted as dicts. - -###### _check_song_extended_or_finished:Returns - -[``SongOptionResult``](#songoptionresult) indicating whether the previous segment was extended or finished. - -##### _get_overlapping_metadata_values - -From two sets of metadata, get all that have the same artist and title. If either of the sets is empty, return the other set. - -If metadata other than artist and title mismatch, the metadata from ``metadata1`` are used, even if that means discarding data that is empty in ``metadata1`` and set in ``metadata2``. - -###### _get_overlapping_metadata_values:Arguments - -- ``metadata1: list``: First list of metadata to compare. -- ``metadata2: list``: Second list of metadata to compare. - -###### _get_overlapping_metadata_values:Returns - -A ``list`` of the matching metadata options. - -Example: - -```python -[ - { - "title": "Thunderstruck", - "artist": "AC/DC", - "album": "The Razor's Edge", - "year": "1990" - }, - { - "title": "Thunderstruck", - "artist": "2Cellos" - } -] -``` - -##### _create_fingerprint - -Create a [chromaprint/AcoustID](https://github.com/acoustid/chromaprint) fingerprint for the given audio data in order to identify it using [AcoustID](https://acoustid.org). - -As of current, this works by writing the data to a temporary file and using the ``fpcalc`` command line tool to generate the fingerprint. The temporary file is deleted immediately afterwards. If it becomes feasible to build and distribute DLL versions of ``chromaprint`` for all target platforms, this should be refactored to use that instead. - -###### _create_fingerprint:Arguments - -- ``song_data: numpy.ndarray`` The song data to generate a fingerprint from. -- ``samplerate: int`` The sample rate of the song data. - -###### _create_fingerprint:Returns - -Tuple ``(song_duration, fingerprint)``. The ``song_duration`` is measured in seconds and used for the API call to AcoustID. The ``fingerprint`` is generated by ``fpcalc``. - -###### _create_fingerprint:Raises - -- ``acoustid.NoBackendError`` if ``fpcalc`` is not installed. -- ``acoustid.FingerprintGenerationError`` if fingerprint generation fails. - -##### _get_api_song_data_acoustid - -Get data about the provided fingerprint from the [AcoustID](https://acoustid.org) API. - -This uses the ``pyacoustid`` library as a wrapper, which will only return the song's title and artist, as well as a match score and the MusicBrainz ID, although those are discarded as they have no further use. This should be enhanced to include a second call to the AcoustID API that gathers more metadata for the song using the MusizcBrainz ID. - -###### _get_api_song_data_acoustid:Arguments - -- ``fingerprint: str`` The fingerprint generated using [``create_fingerprint``](#_create_fingerprint) or other usage of [chromaprint](https://github.com/acoustid/chromaprint). -- ``fingerprint_duration: float`` The duration of the fingerprinted data, in seconds. - -###### _get_api_song_data_acoustid:Returns - -A ``list`` of ``dict``s containing the results. The ``dict``s have the keys ``"artist"`` for the artist name and ``"title"`` for the song title. - -Example: - -```python -[ - { - "title": "Thunderstruck", - "artist": "AC/DC", - }, - { - "title": "Thunderstruck", - "artist": "2Cellos" - } -] -``` - -###### _get_api_song_data_acoustid:Raises - -- ``acoustid.WebServiceError`` if the request fails. - -##### _store_finished_song - -Store the data from the ``current_song_*`` variables in the ``last_song_*`` variables and replace the ``current_song_*`` variables with the provided data. This is used to correctly change the service's state in [``get_song_options``](#get_song_options) and functions called by it. - -###### _store_finished_song:Arguments - -- ``offset: float``: The new currently read song's offset, in seconds. -- ``duration: float``: The new currently read song's duration, in seconds. -- ``metadata_options: dict``: The new currently read song's metadata options. - -###### _store_finished_song:Returns diff --git a/docs/backend/backend_module_docs/audio_stream_io.md b/docs/backend/backend_module_docs/audio_stream_io.md deleted file mode 100644 index 9b8b7ae..0000000 --- a/docs/backend/backend_module_docs/audio_stream_io.md +++ /dev/null @@ -1,97 +0,0 @@ -# Audio Stream IO - -## Contents - -Public functions: - -- [read\_audio\_file\_to\_numpy](#read_audio_file_to_numpy) -- [read\_audio\_file\_to\_stream](#read_audio_file_to_stream) -- [overlapping\_stream](#overlapping_stream) -- [save\_numpy\_as\_audio\_file](#save_numpy_as_audio_file) -- [tag\_audio\_file](#tag_audio_file) - -## Public functions - -### read_audio_file_to_numpy - -Reads a file to load as a NumPy array. - -#### read_audio_file_to_numpy:Arguments - -- `` audiofile: string|path `` Path to audiofile -- `` mono: bool `` If true, convert to mono. -- `` offset: float `` Start of the segment to read, in seconds. -- `` duration: float `` Duration of the segment to read, in seconds. -- `` sample_rate: int `` Sample rate, defaults to Librosa standard 22050 Hz. - -#### read_audio_file_to_numpy:Returns - -Returns a ``Tuple[numpy.ndarray,float]`` of sound data. - -### read_audio_file_to_stream - -Reads an audio file as a stream. - -#### read_audio_file_to_stream:Arguments - -- `` audiofile: string `` Path to audio file -- `` block_len: int `` Block length of stream -- `` mono: bool `` If true, convert to mono. - -#### read_audio_file_to_stream:Returns - -Returns an `` audiostream: Generator `` the `` samplerate: int `` and the `` hop_length: int ``. - -### overlapping_stream - -Gets a stream and returns it with 75% overlap between each instance. - -#### overlapping_stream:Arguments - -- `` stream: Generator `` Takes a generator of stereo audio file data with the size $2\times x$ (2 channels) with $x$ as the block size. - -#### overlapping_stream:Retruns - -Returns a `` Generator `` with the size $2\times y$ (2 channels) with $y$ as the block size. - -### save_numpy_as_audio_file - -#### save_numpy_as_audio_file:Arguments - -- `` song: numpy.ndarray `` Numpy array of the song -- `` songname: string `` Name of the song -- `` file_path: string|path `` Path to file (without file name) -- `` rate: int `` Samplerate of the song {Default: 100} -- `` tags: dict `` Dict of tags {Default: {}} see [Tags](#tag_audio_file) -- `` extension: string `` String of the extension {Default: ".mp3"} - -### tag_audio_file - -#### tag_audio_file:Arguments - -- `` savename: string|path `` Path to save file -- `` songname: string `` Name of the song -- `` tags: dict `` A dict of tags - -##### tag_audio_file:Arguments:tags - -Possible tags are: - -- album -- albumartist -- artist -- artwork -- comment -- compilation -- composer -- discnumber -- genre -- lyrics -- totaldiscs -- totaltracks -- tracknumber -- tracktitle -- year -- isrc - -Also some aliases like album -> albumname are possible. diff --git a/docs/backend/backend_module_docs/file_name_formatter.md b/docs/backend/backend_module_docs/file_name_formatter.md deleted file mode 100644 index 6b6a9f4..0000000 --- a/docs/backend/backend_module_docs/file_name_formatter.md +++ /dev/null @@ -1,43 +0,0 @@ -# File Name Formatter - -This class provides functionality to format file names for finished songs based on a template. - -## Contents - -Public functions: - -- [``format_file_name``](#format_file_name) -- [``replace_all``](#replace_all) - -## Public functions - -### format_file_name - -Format a file name based on the given template and metadata. The template should contain at least one of the placeholders ``{TITLE}``, ``{ARTIST}``, ``{ALBUM}``, ``{YEAR}``, which will be replaced with the provided metadata. - -#### format_file_name:Arguments - -- ``template: str``: The template to replace metadata into. -- ``title: str``: The song title. -- ``artist: str``: The artist name. -- ``album: str``: The album name. -- ``year: str``: The song's release year. - -#### format_file_name:Returns - -``str`` containing the formatted text. - -### replace_all - -Replace all occurences of the given dict keys with the given dict values. - -NOTE: Do not use this function if the order in which keys are replaced is relevant. For example, if you have a ``replacements`` dict like ``{"house": "home", "om": "em"}``, the resulting example for ``"house om"`` will not be ``"home em"`` but ``"heme em"``. - -#### replace_all:Arguments - -- ``text: str``: The haystack to find and replace in. -- ``replacements: dict``: The keys and values to replace, formatted as ``{"find": "replace"}`` - -#### replace_all:Returns - -``str`` containing the text after replacing. diff --git a/docs/backend/backend_module_docs/segmentation.md b/docs/backend/backend_module_docs/segmentation.md deleted file mode 100644 index d4f4f33..0000000 --- a/docs/backend/backend_module_docs/segmentation.md +++ /dev/null @@ -1,276 +0,0 @@ -# Segmentation - -This file provides all functions necessary to split an audio file into smaller segments. -Where each segment represents a distinct portion of the file. Segmentation works on mono -audio, if stereo is provided it will be transformed to mono. - -If a file containing multiple songs is given, the resulting segments will represent the individual songs. -If a file containing one song is given, it may split the song into its multiple parts. - -This segmentation is based on a computed self similarity matrix and its novelty function and may be faulty. -If there are no clear transitions or consecutive similar audio, splits may be missing. Generally this method -adds more splits than necessary, since songs often have strong dissimilarities within themselves. - - -## Contents - -Classes: - -- [``FeatureType``](#FeatureType) -- [``Preset``](#Preset) - -Functions: - -- [``extract_chroma``](#extract_chroma) -- [``extract_spectro``](#extract_spectro) -- [``smooth_downsample_feature_sequence``](#smooth_downsample_feature_sequence) -- [``median_downsample_feature_sequence``](#median_downsample_feature_sequence) -- [``normalize_feature_sequence``](#normalize_feature_sequence) -- [``create_gaussian_checkerboard_kernel``](#create_gaussian_checkerboard_kernel) -- [``compute_self_similarity``](#compute_self_similarity) -- [``compute_novelty_ssm``](#compute_novelty_ssm) -- [``select_peaks``](#select_peaks) -- [``filter_peaks``](#filter_peaks) -- [``segment_block``](#segment_block) -- [``segment_file``](#segment_file) - - -## Classes - -### FeatureType - -Enum containing all Features we would want to extract from the audio. - -- ``CHROMA``: -- ``SPECTRAL``: - -### Preset - -Enum containing several presets of values used for splitting. -Set values are the length of the smoothing filter, downsampling factor and peak threshold. - -- ``EXTRA_STRICT`` -- ``STRICT`` -- ``NORMAL`` -- ``LENIENT`` -- ``EXTRA_LENIENT`` - -NORMAL is the recommended Preset. -STRICT and EXTRA_STRICT may result in missing segments. -LENIENT and EXTRA_LENIENT may not only result in more segments but also in faultier ones. - - -## Functions - -### extract_chroma - -Computes a chromagram feature vector on the given sequence. - -#### extract_chroma:Arguments - -- ``feature``: The feature sequence -- ``samplerate``: The samplerate of the audio -- ``hop_length: int``: The amount of samples advanced between each frame in the audio -- ``fft_window: int``: The window size used for fast-fourier-transformation - -#### extract_chroma:Returns - -A chroma feature vector. - - -### extract_spectro - -Computes a mel-scaled spectrogram feature vector on the given sequence. - -#### extract_spectro:Arguments - -- ``feature``: The feature sequence -- ``samplerate``: The samplerate of the audio -- ``hop_length: int``: The amount of samples advanced between each frame in the audio -- ``fft_window: int``: The window size used for fast-fourier-transformation - -#### extract_spectro:Returns - -A mel-scaled spectrogram feature vector. - - -### smooth_downsample_feature_sequence - -Blur the given feature sequence and downsamples it by the given factor. - -#### smooth_downsample_feature_sequence:Arguments - -- ``feature``: The feature sequence -- ``samplerate``: The samplerate of the feature sequence -- ``filter_len: int``: The length of the smoothing filter. Has to be odd (if even will be incremented). -- ``downsampling: int``: The downsampling factor. - -#### smooth_downsample_feature_sequence:Returns - -The downsampled and smoothed feature sequence. - - -### median_downsample_feature_sequence - -Compute a 2D median filter on the given feature sequence and downsample it by the given -factor. - -#### median_downsample_feature_sequence:Arguments - -- ``feature``: The feature sequence -- ``samplerate``: The samplerate of the feature sequence -- ``filter_len: int``: The length of the median filter. Has to be odd (if even will be incremented). -- ``downsampling: int``: The downsampling factor. - -#### median_downsample_feature_sequence:Returns - -The downsampled and smoothed feature sequence. - - -### normalize_feature_sequence - -Normalize a given feature sequence using a L2-norm to a range of [0.0 - 1.0]. - -#### normalize_feature_sequence:Arguments - -- ``feature``: The feature sequence to normalize. - -#### normalize_feature_sequence:Returns - -The normalized feature sequence. - - -### create_gaussian_checkerboard_kernel - -Computes a checkerboard kernel convolved with a 2D gaussian. -Used to detect corners on the blurred self similarity matrix. - -#### create_gaussian_checkerboard_kernel:Arguments - -- ``n: int``: The resulting kernel length will be 2 * n + 1 -- ``var: float``: The variance of the gaussian kernel -- ``normalize: bool``: Whether to normalize the kernel - -#### create_gaussian_checkerboard_kernel:Returns - -A 2D gaussian Kernel of length 2 * n + 1. - - -### compute_self_similarity - -Computes a self similarity matrix on the given sequence using the dot-product. -This function will utilize [``smooth_downsample_feature_sequence``](#smooth_downsample_feature_sequence) -and [``normalize_feature_sequence``](#normalize_feature_sequence) before the actual computation. -Edges and corners in the SSM represent transitions between segments. - -#### compute_self_similarity:Arguments - -- ``feature``: The feature sequence -- ``samplerate``: The samplerate of the feature sequence -- ``filter_len: int``: The length of the filter used for smoothing. Has to be odd (if even will be incremented). -- ``downsampling: int``: The downsampling factor. - -#### compute_self_similarity:Returns - -An SSM (Self similarity matrix) for the given feature vector. - - -### compute_novelty_ssm - -Computes a novelty function on the given SSM (Self Similarity Matrix) using -a given Corner detection kernel (or [create_gaussian_checkerboard_kernel](#create_gaussian_checkerboard_kernel) -by default). -The beginning and end of the resulting function will be inaccurate, since we mirror -the SSM for the convolution. These inaccurate parts may be excluded and set to 0. -This will result in a 1D representation of the SSM where peaks represent -transitions between segments. - -#### compute_novelty_ssm:Arguments - -- ``ssm``: The self similarity matrix to work with -- ``kernel``: The corner detection kernel to compute a novelty function with. -If None is specified, will default to [create_gaussian_checkerboard_kernel](#create_gaussian_checkerboard_kernel) -- ``n: int``: Influences the length of the default kernel -- ``var: float``: The variance of the default kernel -- ``exclude: bool``: Whether to exclude the first and last 2 * n + 1 values. -The edges of the ssm will be padded by reflection, which will result in inaccuracies. - -#### compute_novelty_ssm:Returns - -A novelty function of the given SSM - - -### select_peaks - -Finds the Indices of peaks in the given novelty function, -which represent transitions. -Indices are in audio frames and will be upsampled (if previously downsampled) -and incremented by a given offset. - -#### select_peaks:Arguments - -- ``novelty``: The novelty function -- ``peak_threshold: float``: The threshold by which peaks are selected. -See [Librosa Docs](https://librosa.org/doc/latest/generated/librosa.util.peak_pick.html#librosa.util.peak_pick) -- ``downsampling: int``: The downsampling factor by which the ssm was previously downsampled -- ``offset: float``: An offset to increment resulting peaks by. This is useful for streamed audio, since each block of -the stream starts at 0 - -#### select_peaks:Returns - -A list of peak indices (indices are audio frames, not samples). - - -### filter_peaks - -Filters a given vector to only include values that occur more than n (by default 3) -times. This may be necessary when working with overlapping block in a stream, where -the same peaks may appear multiple times. - -#### filter_peaks:Arguments - -- ``peaks``: The list of peak indices -- ``n: int``: The number of times a values has to appear, for it to be relevant. - -#### filter_peaks:Returns - -The filtered list of peak indices. - - -### segment_block - -Segments a block (see: [Librosa Docs](https://librosa.org/doc/latest/generated/librosa.stream.html#librosa.stream)). -This will extract a specified [``FeatureType``](#FeatureType) compute the SSM and Novelty Function -and finally search for Peaks. - -#### segment_block:Arguments - -- ``block``: A block of the streamed audio -- ``samplerate``: The samplerate of the audio -- ``hop_length: int``: The hop_length of the audio stream (amount of samples jumped between audio frames) -- ``feature: FeatureType``: The [``FeatureType``](#FeatureType) to use for segmentation -- ``filter_len: int``: The length of the smoothing filter. See [``smooth_downsample_feature_sequence``](#smooth_downsample_feature_sequence) -- ``downsampling: int``: The downsampling factor for the SSM. See [``smooth_downsample_feature_sequence``](#smooth_downsample_feature_sequence) -- ``threshold: float``: The peak threshold. See [``select_peaks``](#select_peaks) -- ``offset: float``: The offset by which peaks are incremented. See [``select_peaks``](#select_peaks) - -#### segment_block:Returns - -All peak indices found for the given block. - - -### segment_file - -Creates a generator, where each step results in a start_time and duration, representing a segment. -This will stream over the audio in overlapping blocks and segment each block individually. -The resulting peaks will be filtered, to make sure the peaks are not just local maximums, before being pairwise iterated. - -#### segment_file:Arguments - -- ``path``: The path to the audio file. -- ``preset: Preset``: The preset of values used in segmentation. - -#### segment_file:Returns - -A generator over each segment of the audio file. -Each segment consists of start_time, duration and samplerate. diff --git a/docs/backend/backend_module_docs/shazam.md b/docs/backend/backend_module_docs/shazam.md deleted file mode 100644 index d824be6..0000000 --- a/docs/backend/backend_module_docs/shazam.md +++ /dev/null @@ -1,160 +0,0 @@ -# Shazam - -This class provides functionality to access the [Shazam API](https://rapidapi.com/apidojo/api/shazam) to identify a segment of song data. - -Requests are performed using the Python ``requests`` library, so functions sending requests to the Shazam API may throw all exceptions the ``requests`` library can throw. - -## Contents - -Public functions: - -- [``lookup``](#lookup) - -Private functions: - -- [``_lookup_segment_with_offset``](#_lookup_segment_with_offset) -- [``_format_song_data``](#_format_song_data) -- [``_get_song_data_segment``](#_get_song_data_segment) -- [``_create_payload_from_song_data``](#_create_payload_from_song_data) -- [``_send_lookup_request``](#_send_lookup_request) -- [``_extract_value_from_metadata``](#_extract_value_from_metadata) - -## Public functions - -### lookup - -Attempt to identify the given song using the [Shazam API](https://rapidapi.com/apidojo/api/shazam). If the song can't be recognised from the first segment, step through it until the segment ends or a result is found. - -The step size is defined by the ``LOOKUP_OFFSET_INCREMENT`` constant and set to 10 seconds by default. The segment size is defined by the ``LOOKUP_SEGMENTS_DURATION`` constant and set to 4 seconds by default, as the [Shazam API](https://rapidapi.com/apidojo/api/shazam) expects segments between 3 and 5 seconds. - -#### lookup:Arguments - -- ``song_data: numpy.ndarray``: The song data. The data must be at a sample rate of 44100Hz as the [Shazam API](https://rapidapi.com/apidojo/api/shazam) will not work with other sample rates. -- ``apikey: str``: The Shazam API key. -- ``from_start: bool = True``: Whether to start attempting to identify segments of the given song from the beginning or the ending. - -#### lookup:Returns - -- If matches are found: The retrieved metadata as a ``dict``, with the keys ``"title"``, ``"artist"``, ``"album"`` and ``"year"`` for the respective metadata. -- ``None`` otherwise. - -Example: - -```python -{ - "title": "Thunderstruck", - "artist": "AC/DC", - "album": "The Razor's Edge", - "year": "1990" -} -``` - -#### lookup:Raises - -- ``requests.exceptions.RequestException`` if the request fails due to network problems, too many redirections or other problems. A detailed list of Exceptions ``requests``can raise can be found in [the ``requests`` documentation](https://docs.python-requests.org/en/latest/user/quickstart/#errors-and-exceptions) - -#### lookup:Example - -Load a song and load metadata for it using ``lookup``. - -```python -import librosa -import modules.apis.shazam - -song, sr = librosa.load("my_cool_file", sr=44100) -result = lookup(song, "MY-SHAZAM-API-KEY") - -print(result) -``` - -## Private functions - -While these functions aren't "private" in the sense that they cannot be accessed from the outside, they should not be called from outside this file. - -### _lookup_segment_with_offset - -Look up a snippet of the given song at the given offset. This function integrates functionality to create the payload required for a request, send the request to the [Shazam API](https://rapidapi.com/apidojo/api/shazam) and process the response. - -#### _lookup_segment_with_offset:Arguments - -- ``song_data: numpy.ndarray``: The song data. Must be at a sample rate of 44100Hz. -- ``apikey: str``: The API key. -- ``offset: int``: The offset the snippet should start at, in seconds. - -#### _lookup_segment_with_offset:Returns - -Tuple ``(matches, track)`` of the retrieved metadata, matching the sections of the API response with the same name. The format for the API response can be found using the test functionality on the [Shazam API](https://rapidapi.com/apidojo/api/shazam) website. - -#### _lookup_segment_with_offset:Raises - -- ``requests.exceptions.RequestException`` if the request fails due to network problems, too many redirections or other problems. A detailed list of Exceptions ``requests``can raise can be found in [the ``requests`` documentation](https://docs.python-requests.org/en/latest/user/quickstart/#errors-and-exceptions) - -### _format_song_data - -Format the song data as a mono 16-bit integer array, as the [Shazam API](https://rapidapi.com/apidojo/api/shazam) will not work with other formats. - -#### _format_song_data:Arguments - -- ``song_data: numpy.ndarray``: The song data. This is expected to be formatted as ``float``s between -1 and 1. - -#### _format_song_data:Returns - -``numpy.ndarray`` containing the formatted data. - -### _get_song_data_segment - -Extract a segment of the song data at the given offset. - -#### _get_song_data_segment:Arguments - -- ``song_data: numpy.ndarray``: The song data. -- ``offset: int``: The offset the snippet should start at, in seconds. - -#### _get_song_data_segment:Returns - -``numpy.ndarray`` containing the extracted segment. - -### _create_payload_from_song_data - -Create the payload to include with the request in the [Shazam API](https://rapidapi.com/apidojo/api/shazam)'s data format (A base64-encoded byte array). This expects that the song data has been formatted using [``format_song_data``](#_format_song_data) and that the song data is between 3-5 seconds. - -#### _create_payload_from_song_data:Arguments - -- ``song_data: numpy.ndarray``: The song data, formatted as a mono 16-bit integer array. - -#### _create_payload_from_song_data:Returns - -``str`` containing the payload. - -### _send_lookup_request - -Send the actual lookup request to the [Shazam API](https://rapidapi.com/apidojo/api/shazam). This uses the ``requests`` module to send the request and can thus throw all errors a failed ``requests.post()`` can. - -#### _send_lookup_request:Arguments - -- ``payload: str``: The payload as generated by [``_create_payload_from_song_data``](#_create_payload_from_song_data). -- ``apikey``: The Shazam API key. - -#### _send_lookup_request:Returns - -``requests.Response`` containing the request response. The format for the API response can be found using the test functionality at the [Shazam API](https://rapidapi.com/apidojo/api/shazam) website. - -#### _send_lookup_request:Raises - -- ``requests.exceptions.RequestException`` if the request fails due to network problems, too many redirections or other problems. A detailed list of Exceptions ``requests``can raise can be found in [the ``requests`` documentation](https://docs.python-requests.org/en/latest/user/quickstart/#errors-and-exceptions) - -### _extract_value_from_metadata - -Extract a value from the response's "Metadata" section. - -If an error occurs that leads to the "Metadata" section containing two sets of data with the same label, the first set of data is returned. - -#### _extract_value_from_metadata:Arguments - -- ``track: list``: The "track" segment of the API response. -- ``key: str``: The key to search for in the metadata. - -#### _extract_value_from_metadata:Returns - -- ``str`` containing the value if it exists. -- Empty ``str`` otherwise. From 0f9ab5f638e4d0db7ca2ad36694d8deed7706809 Mon Sep 17 00:00:00 2001 From: "phat.nguyen" <89086602+chubetho@users.noreply.github.com> Date: Sun, 24 Sep 2023 20:10:39 +0200 Subject: [PATCH 3/5] Style (#119) * Fix Doc tags * style: update * revert: change * add better logo.ico * revert: change in settings * style --------- Co-authored-by: 4lex0017 Co-authored-by: Christina / Itisdud / twyn!b <92167981+ChrisItisdud@users.noreply.github.com> --- docs/.vitepress/config.mts | 3 +- docs/frontend/composables/useEnv.md | 14 + docs/frontend/composables/useSaveSetings.md | 14 + docs/public/logo.ico | Bin 105227 -> 0 bytes docs/public/logo.svg | 8 + package-lock.json | 709 +++++++++++-------- package.json | 32 +- src/frontend/components/SettingsAdvanced.vue | 12 +- src/frontend/components/SettingsGeneral.vue | 8 +- src/frontend/components/SettingsSave.vue | 20 +- src/frontend/composables/useEnv.ts | 13 + src/frontend/composables/useSaveSettings.ts | 13 + src/frontend/index.html | 3 +- src/frontend/public/logo.ico | Bin 105227 -> 100526 bytes src/frontend/public/logo.svg | 8 + 15 files changed, 508 insertions(+), 349 deletions(-) create mode 100644 docs/frontend/composables/useEnv.md create mode 100644 docs/frontend/composables/useSaveSetings.md delete mode 100644 docs/public/logo.ico create mode 100644 docs/public/logo.svg create mode 100644 src/frontend/public/logo.svg diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index b399ea5..bda2eb9 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -50,7 +50,8 @@ export default defineConfig({ ignoreDeadLinks: true, base: '/AudioStreamSplitting', - head: [['link', { rel: 'icon', type: 'image/x-icon', href: '/logo.ico' }]], + head: [['link', { rel: 'icon', type: 'image/svg+xml', href: '/logo.svg' }]], + themeConfig: { logo: '/logo.ico', nav: [ diff --git a/docs/frontend/composables/useEnv.md b/docs/frontend/composables/useEnv.md new file mode 100644 index 0000000..8158390 --- /dev/null +++ b/docs/frontend/composables/useEnv.md @@ -0,0 +1,14 @@ +# useEnv +Provides a reactive object that wraps all environment variables needed for audio identification in the backend. Any changes made to this object will be immediately reflected in the `env` key of the localStorage. +## Returns +A reactive object representing the environment variables. +``` +() => RemovableRef<{ SERVICE_ACOUSTID_API_KEY: any; SERVICE_ACOUSTID_USER_KEY: any; SERVICE_SHAZAM_API_KEY: any; }> +``` +## Examples +```ts +const env = useEnv(); + +// Updating the SERVICE_API_KEY environment variable +env.SERVICE_API_KEY = 'somekey'; +``` \ No newline at end of file diff --git a/docs/frontend/composables/useSaveSetings.md b/docs/frontend/composables/useSaveSetings.md new file mode 100644 index 0000000..f343e2f --- /dev/null +++ b/docs/frontend/composables/useSaveSetings.md @@ -0,0 +1,14 @@ +# useSaveSetings +Provides a reactive object that wraps save settings. Any changes made to this object will be immediately reflected in the `save-settings` key of the localStorage. +## Returns +A reactive object representing audio identification settings. +``` +() => RemovableRef<{ fileType: string; shouldAsk: boolean; submitSavedFiles: boolean; saveDirectory: string; nameTemplate: string; }> +``` +## Examples +```ts +const saveSettings = useSaveSetings(); + +// Updating the fileType in audio identification settings +saveSettings.value.fileType = 'wav'; +``` \ No newline at end of file diff --git a/docs/public/logo.ico b/docs/public/logo.ico deleted file mode 100644 index 197323aa7bbef49b61ebecfe5281215bd8f0d60d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105227 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 X${_Dj_*vi0s%x^%iu?){5u@^d8=*0( diff --git a/docs/public/logo.svg b/docs/public/logo.svg new file mode 100644 index 0000000..ee8d0e6 --- /dev/null +++ b/docs/public/logo.svg @@ -0,0 +1,8 @@ + + + + diff --git a/package-lock.json b/package-lock.json index de2c02e..6c8d64f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,36 +14,36 @@ "simple-git-hooks": "^2.9.0", "vue": "^3.3.4", "vue-final-modal": "^4.4.5", - "vue-i18n": "^9.3.0", - "vue-router": "^4.2.4", - "wavesurfer.js": "^7.2.2" + "vue-i18n": "^9.4.1", + "vue-router": "^4.2.5", + "wavesurfer.js": "^7.3.2" }, "devDependencies": { - "@antfu/eslint-config": "^0.41.0", + "@antfu/eslint-config": "^0.43.1", "@iconify-json/carbon": "^1.1.21", - "@intlify/unplugin-vue-i18n": "^1.0.1", - "@types/node": "^18.17.14", - "@unocss/eslint-config": "^0.55.7", - "@unocss/reset": "^0.55.7", - "@unocss/transformer-directives": "^0.55.7", - "@unocss/transformer-variant-group": "^0.55.7", + "@intlify/unplugin-vue-i18n": "^1.2.0", + "@types/node": "^18.17.19", + "@unocss/eslint-config": "^0.56.1", + "@unocss/reset": "^0.56.1", + "@unocss/transformer-directives": "^0.56.1", + "@unocss/transformer-variant-group": "^0.56.1", "@vitejs/plugin-vue": "^4.3.4", "@vue/test-utils": "^2.4.1", - "eslint": "^8.48.0", + "eslint": "^8.50.0", "jsdom": "^22.1.0", "orval": "^6.17.0", "taze": "^0.11.2", "tsdoc-markdown": "^0.1.0", "typescript": "^5.1.3", - "unocss": "^0.55.7", + "unocss": "^0.56.1", "unplugin-auto-import": "^0.16.6", "unplugin-vue-components": "^0.25.2", "vite": "^4.4.9", "vite-plugin-pages": "^0.31.0", - "vitepress": "^1.0.0-rc.13", - "vitest": "^0.34.4", + "vitepress": "^1.0.0-rc.20", + "vitest": "^0.34.5", "vue-docgen-cli": "^4.67.0", - "vue-tsc": "^1.8.10" + "vue-tsc": "^1.8.13" }, "engines": { "node": ">= 18.17.1", @@ -247,14 +247,14 @@ } }, "node_modules/@antfu/eslint-config": { - "version": "0.41.4", - "resolved": "https://registry.npmjs.org/@antfu/eslint-config/-/eslint-config-0.41.4.tgz", - "integrity": "sha512-1bPnXjrv3DqF4FsRgorJvCjGM5oB1fOYeAXAER/TLS7WXO1oD/9s/G39mBy9K7HxLLyFuLuZAw0h/Uz0GR1k9w==", + "version": "0.43.1", + "resolved": "https://registry.npmjs.org/@antfu/eslint-config/-/eslint-config-0.43.1.tgz", + "integrity": "sha512-kTOJeCqhotaiQ/Rv6JxgfAX+SxUq2GII4ZIvTa3GWBUXhFMBvehdUNtxcmO8/HxwxYKkm34/qeF+v7osBsMF1w==", "dev": true, "dependencies": { - "@antfu/eslint-config-vue": "0.41.4", - "@typescript-eslint/eslint-plugin": "^6.7.0", - "@typescript-eslint/parser": "^6.7.0", + "@antfu/eslint-config-vue": "0.43.1", + "@typescript-eslint/eslint-plugin": "^6.7.2", + "@typescript-eslint/parser": "^6.7.2", "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-html": "^7.1.0", "eslint-plugin-import": "npm:eslint-plugin-i@2.28.1", @@ -272,16 +272,17 @@ } }, "node_modules/@antfu/eslint-config-basic": { - "version": "0.41.4", - "resolved": "https://registry.npmjs.org/@antfu/eslint-config-basic/-/eslint-config-basic-0.41.4.tgz", - "integrity": "sha512-bdBC8tyJzTa4a883m50efVLRjiVX8lMAhvmFxvpue6ScBnPLqW+J3sJupolefp/Xc00VU8ThD3iOBCE8Ja9qfg==", + "version": "0.43.1", + "resolved": "https://registry.npmjs.org/@antfu/eslint-config-basic/-/eslint-config-basic-0.43.1.tgz", + "integrity": "sha512-SW6hmGmqI985fsCJ+oivo4MbiMmRMgCJ0Ne8j/hwCB6O6Mc0m5bDqYeKn5HqFhvZhG84GEg5jPDKNiHrBYnQjw==", "dev": true, "dependencies": { - "eslint-plugin-antfu": "0.41.4", + "@stylistic/eslint-plugin-js": "0.0.4", + "eslint-plugin-antfu": "0.43.1", "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-html": "^7.1.0", "eslint-plugin-import": "npm:eslint-plugin-i@2.28.1", - "eslint-plugin-jsdoc": "^46.6.0", + "eslint-plugin-jsdoc": "^46.8.2", "eslint-plugin-jsonc": "^2.9.0", "eslint-plugin-markdown": "^3.0.1", "eslint-plugin-n": "^16.1.0", @@ -298,15 +299,16 @@ } }, "node_modules/@antfu/eslint-config-ts": { - "version": "0.41.4", - "resolved": "https://registry.npmjs.org/@antfu/eslint-config-ts/-/eslint-config-ts-0.41.4.tgz", - "integrity": "sha512-YikIdwZwFPKEAL08GELjC0tzSaEKceINg8R4cwpvVlkXIaut9Tiyhgw69OBlfWdf3oMhpJ4ksy2WFfWh2qmjaw==", + "version": "0.43.1", + "resolved": "https://registry.npmjs.org/@antfu/eslint-config-ts/-/eslint-config-ts-0.43.1.tgz", + "integrity": "sha512-s3zItBSopYbM/3eii/JKas1PmWR+wCPRNS89qUi4zxPvpuIgN5mahkBvbsCiWacrNFtLxe1zGgo5qijBhVfuvA==", "dev": true, "dependencies": { - "@antfu/eslint-config-basic": "0.41.4", - "@typescript-eslint/eslint-plugin": "^6.7.0", - "@typescript-eslint/parser": "^6.7.0", - "eslint-plugin-jest": "^27.2.3" + "@antfu/eslint-config-basic": "0.43.1", + "@stylistic/eslint-plugin-ts": "0.0.4", + "@typescript-eslint/eslint-plugin": "^6.7.2", + "@typescript-eslint/parser": "^6.7.2", + "eslint-plugin-jest": "^27.4.0" }, "peerDependencies": { "eslint": ">=7.4.0", @@ -314,13 +316,13 @@ } }, "node_modules/@antfu/eslint-config-vue": { - "version": "0.41.4", - "resolved": "https://registry.npmjs.org/@antfu/eslint-config-vue/-/eslint-config-vue-0.41.4.tgz", - "integrity": "sha512-tOZ4ria8wahZ4bn5Sglarcw+IPVn+QXNincjzB0tmwBzQP2XTM8fXYlvqO1VBA1/Jgr2BVGgZVXBHy1StDBTnA==", + "version": "0.43.1", + "resolved": "https://registry.npmjs.org/@antfu/eslint-config-vue/-/eslint-config-vue-0.43.1.tgz", + "integrity": "sha512-HxOfe8Vl+DPrzssbs5LHRDCnBtCy1LSA1DIeV71IC+iTpzoASFahSsVX5qckYu1InFgUm93XOhHCWm34LzPsvg==", "dev": true, "dependencies": { - "@antfu/eslint-config-basic": "0.41.4", - "@antfu/eslint-config-ts": "0.41.4", + "@antfu/eslint-config-basic": "0.43.1", + "@antfu/eslint-config-ts": "0.43.1", "eslint-plugin-vue": "^9.17.0", "local-pkg": "^0.4.3" }, @@ -659,21 +661,21 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.19", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.19.tgz", - "integrity": "sha512-Tinq7ybnEPFFXhlYOYFiSjespWQk0dq2dRNAiMdRTOYQzEGqnnNyrTxPYHP5r6wGjlF1rFgABdDV0g8EwD6Qbg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, @@ -1239,9 +1241,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", - "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1328,9 +1330,9 @@ "dev": true }, "node_modules/@iconify/utils": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.1.9.tgz", - "integrity": "sha512-mo+A4n3MwLlWlg1SoSO+Dt6pOPWKElk9sSJ6ZpuzbB9OcjxN8RUWxU3ulPwB1nglErWKRam2x4BAohbYF7FiFA==", + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.1.10.tgz", + "integrity": "sha512-0/+5hxjzCZ9RoYpqxnOzbnpQyMdZRuHcMxPJeuX+x/aZkAAD/N4TajDjAPT7LpX+M0bfLExj/p0bbDkUfp0lrg==", "dev": true, "dependencies": { "@antfu/install-pkg": "^0.1.1", @@ -2767,6 +2769,37 @@ "integrity": "sha512-sV+51I7WYnLJnKPn2EMWgS4EUfoP4iWEbrWwbXsj0MZCB/xOK8j6+C9fntIdOM50kpx45ZLC3s6kwKivWuqvyg==", "dev": true }, + "node_modules/@stylistic/eslint-plugin-js": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-0.0.4.tgz", + "integrity": "sha512-W1rq2xxlFNhgZZJO+L59wtvlDI0xARYxx0WD8EeWNBO7NDybUSYSozCIcY9XvxQbTAsEXBjwqokeYm0crt7RxQ==", + "dev": true, + "dependencies": { + "acorn": "^8.10.0", + "escape-string-regexp": "^4.0.0", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esutils": "^2.0.3", + "graphemer": "^1.4.0" + } + }, + "node_modules/@stylistic/eslint-plugin-ts": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-ts/-/eslint-plugin-ts-0.0.4.tgz", + "integrity": "sha512-sWL4Km5j8S+TLyzya/3adxMWGkCm3lVasJIVQqhxVfwnlGkpMI0GgYVIu/ubdKPS+dSvqjUHpsXgqWfMRF2+cQ==", + "dev": true, + "dependencies": { + "@stylistic/eslint-plugin-js": "0.0.4", + "@typescript-eslint/scope-manager": "^6.7.0", + "@typescript-eslint/type-utils": "^6.7.0", + "@typescript-eslint/utils": "^6.7.0", + "graphemer": "^1.4.0" + }, + "peerDependencies": { + "eslint": "*", + "typescript": "*" + } + }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -2867,6 +2900,22 @@ "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, + "node_modules/@types/linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-pTjcqY9E4nOI55Wgpz7eiI8+LzdYnw3qxXCfHyBDdPbYvbyLgWLJGh8EdPvqawwMK1Uo1794AUkkR38Fr0g+2g==", + "dev": true + }, + "node_modules/@types/markdown-it": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-13.0.1.tgz", + "integrity": "sha512-SUEb8Frsxs3D5Gg9xek6i6EG6XQ5s+O+ZdQzIPESZVZw3Pv3CPQfjCJBI+RgqZd1IBeu18S0Rn600qpPnEK37w==", + "dev": true, + "dependencies": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, "node_modules/@types/mdast": { "version": "3.0.12", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", @@ -2876,6 +2925,12 @@ "@types/unist": "^2" } }, + "node_modules/@types/mdurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", + "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==", + "dev": true + }, "node_modules/@types/ms": { "version": "0.7.31", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", @@ -2883,15 +2938,15 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.17.16", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.16.tgz", - "integrity": "sha512-e0zgs7qe1XH/X3KEPnldfkD07LH9O1B9T31U8qoO7lqGSjj3/IrBuvqMeJ1aYejXRK3KOphIUDw6pLIplEW17A==", + "version": "18.17.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.19.tgz", + "integrity": "sha512-+pMhShR3Or5GR0/sp4Da7FnhVmTalWm81M6MkEldbwjETSaPalw138Z4KdpQaistvqQxLB7Cy4xwYdxpbSOs9Q==", "dev": true }, "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz", + "integrity": "sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A==", "dev": true }, "node_modules/@types/sarif": { @@ -2924,16 +2979,16 @@ "integrity": "sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.0.tgz", - "integrity": "sha512-gUqtknHm0TDs1LhY12K2NA3Rmlmp88jK9Tx8vGZMfHeNMLE3GH2e9TRub+y+SOjuYgtOmok+wt1AyDPZqxbNag==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", + "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.0", - "@typescript-eslint/type-utils": "6.7.0", - "@typescript-eslint/utils": "6.7.0", - "@typescript-eslint/visitor-keys": "6.7.0", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/type-utils": "6.7.2", + "@typescript-eslint/utils": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -2959,15 +3014,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.0.tgz", - "integrity": "sha512-jZKYwqNpNm5kzPVP5z1JXAuxjtl2uG+5NpaMocFPTNC2EdYIgbXIPImObOkhbONxtFTTdoZstLZefbaK+wXZng==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.2.tgz", + "integrity": "sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.7.0", - "@typescript-eslint/types": "6.7.0", - "@typescript-eslint/typescript-estree": "6.7.0", - "@typescript-eslint/visitor-keys": "6.7.0", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", "debug": "^4.3.4" }, "engines": { @@ -2987,13 +3042,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.0.tgz", - "integrity": "sha512-lAT1Uau20lQyjoLUQ5FUMSX/dS07qux9rYd5FGzKz/Kf8W8ccuvMyldb8hadHdK/qOI7aikvQWqulnEq2nCEYA==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", + "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.0", - "@typescript-eslint/visitor-keys": "6.7.0" + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3004,13 +3059,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.0.tgz", - "integrity": "sha512-f/QabJgDAlpSz3qduCyQT0Fw7hHpmhOzY/Rv6zO3yO+HVIdPfIWhrQoAyG+uZVtWAIS85zAyzgAFfyEr+MgBpg==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz", + "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.7.0", - "@typescript-eslint/utils": "6.7.0", + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/utils": "6.7.2", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -3031,9 +3086,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.0.tgz", - "integrity": "sha512-ihPfvOp7pOcN/ysoj0RpBPOx3HQTJTrIN8UZK+WFd3/iDeFHHqeyYxa4hQk4rMhsz9H9mXpR61IzwlBVGXtl9Q==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", + "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3044,13 +3099,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.0.tgz", - "integrity": "sha512-dPvkXj3n6e9yd/0LfojNU8VMUGHWiLuBZvbM6V6QYD+2qxqInE7J+J/ieY2iGwR9ivf/R/haWGkIj04WVUeiSQ==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", + "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.0", - "@typescript-eslint/visitor-keys": "6.7.0", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3071,17 +3126,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.0.tgz", - "integrity": "sha512-MfCq3cM0vh2slSikQYqK2Gq52gvOhe57vD2RM3V4gQRZYX4rDPnKLu5p6cm89+LJiGlwEXU8hkYxhqqEC/V3qA==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", + "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.0", - "@typescript-eslint/types": "6.7.0", - "@typescript-eslint/typescript-estree": "6.7.0", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", "semver": "^7.5.4" }, "engines": { @@ -3096,12 +3151,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.0.tgz", - "integrity": "sha512-/C1RVgKFDmGMcVGeD8HjKv2bd72oI1KxQDeY8uc66gw9R0OK0eMq48cA+jv9/2Ag6cdrsUGySm1yzYmfz0hxwQ==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", + "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.0", + "@typescript-eslint/types": "6.7.2", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -3113,14 +3168,14 @@ } }, "node_modules/@unocss/astro": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/@unocss/astro/-/astro-0.55.7.tgz", - "integrity": "sha512-mw8r14ArxUQBVCCisAJlF/WsZb650iBsduD/lXMk56N/nQ3MMArCcn62kcAxgZSb5tfIOQGQu/tbR8hEcD8y2g==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/astro/-/astro-0.56.1.tgz", + "integrity": "sha512-ivWm69J76DRwCiEFM75qR4WPMCC6nyOrUM5iQDTypwKbBX26XlXcYYCN3DLoQTmWdp5f2BubZXAg3KIdgVxrYg==", "dev": true, "dependencies": { - "@unocss/core": "0.55.7", - "@unocss/reset": "0.55.7", - "@unocss/vite": "0.55.7" + "@unocss/core": "0.56.1", + "@unocss/reset": "0.56.1", + "@unocss/vite": "0.56.1" }, "funding": { "url": "https://github.com/sponsors/antfu" @@ -3135,16 +3190,16 @@ } }, "node_modules/@unocss/cli": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/@unocss/cli/-/cli-0.55.7.tgz", - "integrity": "sha512-ZHX2SR2WQbKfcmgOOHjBLB3V57Ct76Zb76YULzBj2EVX43lX/YDCVG87n6ePDY7rOcjCAthjrFQYCLV5KVLKHg==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/cli/-/cli-0.56.1.tgz", + "integrity": "sha512-s7lRtPkNw7GXdej3uYKFgfyal3Bq0Ux9oJKQ3rV7ysvY5AMfHs+ayc1EC6vXsAunziJ39dloPrRY5cx1H7abkQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.1", - "@rollup/pluginutils": "^5.0.3", - "@unocss/config": "0.55.7", - "@unocss/core": "0.55.7", - "@unocss/preset-uno": "0.55.7", + "@rollup/pluginutils": "^5.0.4", + "@unocss/config": "0.56.1", + "@unocss/core": "0.56.1", + "@unocss/preset-uno": "0.56.1", "cac": "^6.7.14", "chokidar": "^3.5.3", "colorette": "^2.0.20", @@ -3165,12 +3220,12 @@ } }, "node_modules/@unocss/config": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/@unocss/config/-/config-0.55.7.tgz", - "integrity": "sha512-+X6rPScyFEWbkZyCyM+HfoJhJNN+CEl2n2izWkm0kuDj3w9fY9B3f/0dsk+jmx/gJEI5Y797q9zspNMNDib1AA==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/config/-/config-0.56.1.tgz", + "integrity": "sha512-ZwKWtbMfg38laUNwjERkiTo3JKCgpw+hZMBqbbr2N4Rhc1ZaT4EJyQmcc/+P05JoNNr+ueYMoCMOCOtn/wuheQ==", "dev": true, "dependencies": { - "@unocss/core": "0.55.7", + "@unocss/core": "0.56.1", "unconfig": "^0.3.10" }, "engines": { @@ -3181,21 +3236,21 @@ } }, "node_modules/@unocss/core": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-0.55.7.tgz", - "integrity": "sha512-c+bWe844Xjlwc1EPwHj0+n3LpntJG7ELPbEOOxNIG+CQdcEX0l1G0rkM8+nKstJ9WJmgpf1HdJQLVMF62HXvhw==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/core/-/core-0.56.1.tgz", + "integrity": "sha512-2qmb/+hQ2CXmIgSqaeL6Pw2reO2MxsZlLMFuu71J8T3+UKrkI9NAwkZ4sdb38EoOisVIr2lvE48uc44XBfaOdg==", "dev": true, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/eslint-config": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/@unocss/eslint-config/-/eslint-config-0.55.7.tgz", - "integrity": "sha512-ykRUpPeT5kJSXHAduOJ2PxnEoaYsGOS2jG9iVjbbvER36ZQ+71xdwep/qpBlAr4LWLeoICy7Om+No1r43ZDntw==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/eslint-config/-/eslint-config-0.56.1.tgz", + "integrity": "sha512-ph1w2FO+wCHq0jz0iQyxUbjwLSVjSz6wQ2yd0fCsm6mHNlewWHmu6gD3Grs9j5XDyFJEwz4HZZRHspJanqSJyA==", "dev": true, "dependencies": { - "@unocss/eslint-plugin": "0.55.7" + "@unocss/eslint-plugin": "0.56.1" }, "engines": { "node": ">=14" @@ -3205,14 +3260,14 @@ } }, "node_modules/@unocss/eslint-plugin": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/@unocss/eslint-plugin/-/eslint-plugin-0.55.7.tgz", - "integrity": "sha512-U+poFU/GJH8NvFBQxLp64zRRfnLWSbY41+Q8Vnlw/nP/tizZumO2lNJ+UBIGFLa1TwyMulFjru6CXt2uSFKtaA==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/eslint-plugin/-/eslint-plugin-0.56.1.tgz", + "integrity": "sha512-WLTybFXK9FJUMmEdUBa4Yj6uZx4qTCThGVej5Rn3XA+5f58zNmcSbipUG5oz16Z/QqYKP8iKhtg5zAQJMi0erg==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "^6.4.1", - "@unocss/config": "0.55.7", - "@unocss/core": "0.55.7", + "@typescript-eslint/utils": "^6.7.2", + "@unocss/config": "0.56.1", + "@unocss/core": "0.56.1", "magic-string": "^0.30.3", "synckit": "^0.8.5" }, @@ -3224,23 +3279,24 @@ } }, "node_modules/@unocss/extractor-arbitrary-variants": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-0.55.7.tgz", - "integrity": "sha512-imK2g/frlo5Ag0uVB+C/Psyo5+9AnqhoRAgYa6gyrQ/TJnrnwf+M3jFngU9evIMHw92vig1DGfPa2ZId901DwQ==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-0.56.1.tgz", + "integrity": "sha512-2vEcVwUTpC0yROjvKGjR3HSE8jaf1cwQqL+Ba5oP+Y4Vrjlf8hqvoSowgVT+wp/ecPH8z82xFNhS+XMOdgXpGA==", "dev": true, "dependencies": { - "@unocss/core": "0.55.7" + "@unocss/core": "0.56.1" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/inspector": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/@unocss/inspector/-/inspector-0.55.7.tgz", - "integrity": "sha512-N0mjZozDDyqx8Mh6C/ZlMTlDzGiq22sXY/hPRX55Cf44WZI4W/ZWajqAAp42B+lw2MN0k1FYEMIAwn9n+xgq/g==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/inspector/-/inspector-0.56.1.tgz", + "integrity": "sha512-PJ3MEwOvUjLaiySPQQKlw0XgwpReNK7c+nDX0D8ZBmUyw3swSn8wSar2cCOLsKLRtKRRp4kz1brM/BaleyYyeg==", "dev": true, "dependencies": { + "@unocss/rule-utils": "0.56.1", "gzip-size": "^6.0.0", "sirv": "^2.0.3" }, @@ -3249,17 +3305,18 @@ } }, "node_modules/@unocss/postcss": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/@unocss/postcss/-/postcss-0.55.7.tgz", - "integrity": "sha512-53Z/yv/CNdlTqKZQ9gpYRoLZSuzQ28J0SDrGCdzwjLcvHG/FD7/x1S7yxE7cUp/4sjvLL15HSzkWq8vNy6SkwQ==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/postcss/-/postcss-0.56.1.tgz", + "integrity": "sha512-8jUS5ynopvMbZmdUQhGv+lvKziuAPHHl9LaZzCJ4uHgPOwITNXWTi4dmNbytdYC3iYPQ++8eOph93VPCxdqVsw==", "dev": true, "dependencies": { - "@unocss/config": "0.55.7", - "@unocss/core": "0.55.7", + "@unocss/config": "0.56.1", + "@unocss/core": "0.56.1", + "@unocss/rule-utils": "0.56.1", "css-tree": "^2.3.1", "fast-glob": "^3.3.1", "magic-string": "^0.30.3", - "postcss": "^8.4.28" + "postcss": "^8.4.30" }, "engines": { "node": ">=14" @@ -3272,25 +3329,25 @@ } }, "node_modules/@unocss/preset-attributify": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/@unocss/preset-attributify/-/preset-attributify-0.55.7.tgz", - "integrity": "sha512-L1sNw3DyM4mymIm4DBTTTOllk8LmhYlWMgDlaAW2MYWygjqDCsp99wRKT2175Ya5xHYBA6XetMoBryZD23qJYQ==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/preset-attributify/-/preset-attributify-0.56.1.tgz", + "integrity": "sha512-z+riyM9Fl+aYReg3cgxDRrI52teOL6ebj1UkMOje5sXuhneEQobUkg3k4Oi9NGTdalO5PU/jwcYCNfVksMPWZg==", "dev": true, "dependencies": { - "@unocss/core": "0.55.7" + "@unocss/core": "0.56.1" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/preset-icons": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/@unocss/preset-icons/-/preset-icons-0.55.7.tgz", - "integrity": "sha512-JXLOHkyEKKAjLTqjAxYfhwln05WXilGg3jctkZWKpMNawPaonrGt3kZT12YMuMmOryxk7UcyKB0dtYc+p3QYvw==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/preset-icons/-/preset-icons-0.56.1.tgz", + "integrity": "sha512-Jwyy7i39Hvt4gf+/vtlIcKucNP2y7IV5nF9KPuDnikho4xS/D24z3lbUclrscbH8XGfRcsUzGHI/y+8gD7zZjQ==", "dev": true, "dependencies": { - "@iconify/utils": "^2.1.9", - "@unocss/core": "0.55.7", + "@iconify/utils": "^2.1.10", + "@unocss/core": "0.56.1", "ofetch": "^1.3.3" }, "funding": { @@ -3298,61 +3355,63 @@ } }, "node_modules/@unocss/preset-mini": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/@unocss/preset-mini/-/preset-mini-0.55.7.tgz", - "integrity": "sha512-ZCskE2uprjGkpQezEPM6KPMf84rIZEUNc1p2DxWVHaFUPRV24/JSNsO4PsKrQgNIb2dLQxzPNlMzQJI7ssdBXQ==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/preset-mini/-/preset-mini-0.56.1.tgz", + "integrity": "sha512-hOujmUN5kiA7KCkH1mUFf3cStsa3WZTi3g/I91VQ8EM4S6R7aRvME7LBXlb38z68+pckoDLhOhbN7gSg2iZTjA==", "dev": true, "dependencies": { - "@unocss/core": "0.55.7", - "@unocss/extractor-arbitrary-variants": "0.55.7" + "@unocss/core": "0.56.1", + "@unocss/extractor-arbitrary-variants": "0.56.1", + "@unocss/rule-utils": "0.56.1" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/preset-tagify": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/@unocss/preset-tagify/-/preset-tagify-0.55.7.tgz", - "integrity": "sha512-aDsuN3a/ZirbCDKpFsue9tc8MHs3l0Rl81n2ZOdIrJoZW4YWyydMVl++cz/HERZW81ZySK8EJKwGBaMJMgsnHA==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/preset-tagify/-/preset-tagify-0.56.1.tgz", + "integrity": "sha512-cd1McbaEpoerduOt8dA6MOkVZQIutuF3dHyjrI/pXbDtoyzBWjT9MLEeV77Hlz3S09+9cqGZddBBkqo0WGsM0w==", "dev": true, "dependencies": { - "@unocss/core": "0.55.7" + "@unocss/core": "0.56.1" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/preset-typography": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/@unocss/preset-typography/-/preset-typography-0.55.7.tgz", - "integrity": "sha512-hLV4nsgsDIk66pt7Ej4NYUmaGtI2EfGb1h2yl5FmBtdtACrgPq+Skr2Br9Iq+Bj1QFhbsMOWLDdbojFQwBdH6A==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/preset-typography/-/preset-typography-0.56.1.tgz", + "integrity": "sha512-3p+dWEtMDe8MSPbUZseS94OpdYbv/pMTs2K1NBysE5BjIEVlyxRNWcZ8FC6risAJ1U0Ouctb6BqP6IA8r9BiWQ==", "dev": true, "dependencies": { - "@unocss/core": "0.55.7", - "@unocss/preset-mini": "0.55.7" + "@unocss/core": "0.56.1", + "@unocss/preset-mini": "0.56.1" } }, "node_modules/@unocss/preset-uno": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/@unocss/preset-uno/-/preset-uno-0.55.7.tgz", - "integrity": "sha512-z4pCxOv/OU1ARo++cvbijWNW2zy/EVTMqJXa+SEep9b99wFXPQE3gaPvLdURp/e5f1PoxVyPZ6JiBknbClSDuA==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/preset-uno/-/preset-uno-0.56.1.tgz", + "integrity": "sha512-rNnjpmnfrP/1P462dyELBQHe5NDlFSrJevwjCpAOeFXdO0XCCULpHokuaovZYwesNvzzWu+cZequya38n5hkSw==", "dev": true, "dependencies": { - "@unocss/core": "0.55.7", - "@unocss/preset-mini": "0.55.7", - "@unocss/preset-wind": "0.55.7" + "@unocss/core": "0.56.1", + "@unocss/preset-mini": "0.56.1", + "@unocss/preset-wind": "0.56.1", + "@unocss/rule-utils": "0.56.1" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/preset-web-fonts": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/@unocss/preset-web-fonts/-/preset-web-fonts-0.55.7.tgz", - "integrity": "sha512-ygAz0540kdBapErW2BcObWfQT/6g0SpVUPYg92PPiZD57CZAvuNXiYTfFMRXd88QrBL1zIrZ6NrzY0NZ645H+w==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/preset-web-fonts/-/preset-web-fonts-0.56.1.tgz", + "integrity": "sha512-SO2ZjrcFSi02QgQT3UVUtIlZE59A92gB1pzmYTMGZhjhmxqq6aghvBKEC00LfnQ200MRtAawgiZ+5Xysi/XsGg==", "dev": true, "dependencies": { - "@unocss/core": "0.55.7", + "@unocss/core": "0.56.1", "ofetch": "^1.3.3" }, "funding": { @@ -3360,104 +3419,121 @@ } }, "node_modules/@unocss/preset-wind": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/@unocss/preset-wind/-/preset-wind-0.55.7.tgz", - "integrity": "sha512-vLi0mtYDnvx3uYtBR4fSCR52T59drTUp3XVAAqQTbhvRctnSWm65MWE4G+gqdt2qQ9fM4SVCsxLLaXuJkI2eqw==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/preset-wind/-/preset-wind-0.56.1.tgz", + "integrity": "sha512-/fR0eYlmezu6R3wWvN5zVNAfOE6rcC1CsEZKH0SdwchMvNDjJNd0rmAechI2BnVBaa3++H2Cz+0AfCDEP8tsjg==", "dev": true, "dependencies": { - "@unocss/core": "0.55.7", - "@unocss/preset-mini": "0.55.7" + "@unocss/core": "0.56.1", + "@unocss/preset-mini": "0.56.1", + "@unocss/rule-utils": "0.56.1" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/reset": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/@unocss/reset/-/reset-0.55.7.tgz", - "integrity": "sha512-yvmLhxqUNgf6wue7IvhV/FdrQW9H9LF1Bmmhwwaiz2aV0E74aN4pbuYPZwNq3YafsQvNQ0UdtuXjddY4QMRCPw==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/reset/-/reset-0.56.1.tgz", + "integrity": "sha512-nfzLKv2W9Y3fZLny6lYTroa/YExczGYHsVPCBPGkVt0TrM0yDA+ZKOHbN93b5myY9hzJ3pHTEQmYFsFwzzr6Kg==", "dev": true, "funding": { "url": "https://github.com/sponsors/antfu" } }, + "node_modules/@unocss/rule-utils": { + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-0.56.1.tgz", + "integrity": "sha512-mmmbx10eELAyhYZqBWlQFPOafnL1hHp2fo18rUbZLedvMJWds3Z23Q/u3VKEpJnCszNkr03BXVwscR5+ZdF4uw==", + "dev": true, + "dependencies": { + "@unocss/core": "^0.56.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/@unocss/scope": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/@unocss/scope/-/scope-0.55.7.tgz", - "integrity": "sha512-r0CaS1aSpcC37ztqOJ3qaWIzM6zwdlX8r0rib2vTvWTckw1J0ocVhjNkWRBM9kRWte006JhecdiZzXNHA40akg==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/scope/-/scope-0.56.1.tgz", + "integrity": "sha512-qIq/JuibrVOAJw/TCUm54XwHRcDImgrb1abZVuaicFh6fjmpdOi/iglYxoFqXS5gusp0m2vNnOLbaBB4LrPf5Q==", "dev": true }, "node_modules/@unocss/transformer-attributify-jsx": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx/-/transformer-attributify-jsx-0.55.7.tgz", - "integrity": "sha512-ZyUBc0wguBhd+nbIlcrSYpmzKtqBi+8BII8SK4lIB/Ol1wBboByPTjBENsQkxRyffp5K9VTuZZ/LamFgPGOWDg==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx/-/transformer-attributify-jsx-0.56.1.tgz", + "integrity": "sha512-2dQ7immRBnZJQ9aU+VIiAbcFCycXq8yXG2RPd82Pl0tAV8f5DtLbbuTC5mzo5lGOhuXJ+/u+IpuL9xchjOV7WQ==", "dev": true, "dependencies": { - "@unocss/core": "0.55.7" + "@unocss/core": "0.56.1" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/transformer-attributify-jsx-babel": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx-babel/-/transformer-attributify-jsx-babel-0.55.7.tgz", - "integrity": "sha512-xl5K/Zg7tLyI6Oee+xHgvBm0gSEviYdBDwaGC4O6cP9VXTBm6waz9NUU6CmmVYKh4dSeLQ1PKNboMeg2nFuJMw==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx-babel/-/transformer-attributify-jsx-babel-0.56.1.tgz", + "integrity": "sha512-8+l4tfifHiSnga3iaxqXfAMgEJG7yLphKPDSm6DHEMUqKeia9rn3V/bABx5KZxpMmnH6FoiYboJL4uf5W58a5Q==", "dev": true, "dependencies": { - "@unocss/core": "0.55.7" + "@unocss/core": "0.56.1" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/transformer-compile-class": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/@unocss/transformer-compile-class/-/transformer-compile-class-0.55.7.tgz", - "integrity": "sha512-tiYiT9EG4ucSBvMo+9Hv43GY0YvXQjfQCXDhDm3tcJyreMg6BRMO412eir54RBS+JAdNU0DUoITVYu+PkF7hLg==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/transformer-compile-class/-/transformer-compile-class-0.56.1.tgz", + "integrity": "sha512-v3ICzTWj3oQ1S6qkGzg/oyzrk05ZgdcvjYFSZlgBIu2iUJldBhO0+7ZMuDpniaT21GjJvukLwiWrOF4mYyJCyg==", "dev": true, "dependencies": { - "@unocss/core": "0.55.7" + "@unocss/core": "0.56.1" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/transformer-directives": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/@unocss/transformer-directives/-/transformer-directives-0.55.7.tgz", - "integrity": "sha512-xNmR40FssHWYJSmJv/9TQC2IdTyZPV8U3Iv/PIuke1zndMwMciclghEFiw0wSeRmhoRI7iFZck5EI/Bokyo7CQ==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/transformer-directives/-/transformer-directives-0.56.1.tgz", + "integrity": "sha512-Pwh+JUxxn8ECqpEWETeD38OON5Y2oYAOC1CFKAyXoK22J7f51THoS07z2rZpDNdQA2T/szxenNCdRt72/NJ/pg==", "dev": true, "dependencies": { - "@unocss/core": "0.55.7", + "@unocss/core": "0.56.1", + "@unocss/rule-utils": "0.56.1", "css-tree": "^2.3.1" } }, "node_modules/@unocss/transformer-variant-group": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/@unocss/transformer-variant-group/-/transformer-variant-group-0.55.7.tgz", - "integrity": "sha512-uLyZ08XXVriUDenZCTGA3xGgMD3B9GVr6mSz002pDlLpQDi8FcMQTOGg8X4ViCGzS3l03S/+r+JY7kJTpMFa9w==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/transformer-variant-group/-/transformer-variant-group-0.56.1.tgz", + "integrity": "sha512-UwXNcW00R6MjHZajy8lmSfwWDwhnvd+rF9eRGfcJTEzWr+LtEmgw8SJBr7STCB4ZwRE37NIp4oLLl1jF8omGNg==", "dev": true, "dependencies": { - "@unocss/core": "0.55.7" + "@unocss/core": "0.56.1" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/vite": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/@unocss/vite/-/vite-0.55.7.tgz", - "integrity": "sha512-xmdyDnt9Ag4o7DGl22/P6MaB+HSjWOQw9qYYzIefSv3SVUvn3cEhIX/PCWqFp8Kts2HyvAoJLbZmygSf1XdZNQ==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@unocss/vite/-/vite-0.56.1.tgz", + "integrity": "sha512-IztLc304zP2LYQMsP3yVHmLwXlLUgCY3q6Nkqw6Hpds7l5JXBsE7Q19DtNW+4nDOp9wvWhw7CjQLmoh8d+V0lQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.1", - "@rollup/pluginutils": "^5.0.3", - "@unocss/config": "0.55.7", - "@unocss/core": "0.55.7", - "@unocss/inspector": "0.55.7", - "@unocss/scope": "0.55.7", - "@unocss/transformer-directives": "0.55.7", + "@rollup/pluginutils": "^5.0.4", + "@unocss/config": "0.56.1", + "@unocss/core": "0.56.1", + "@unocss/inspector": "0.56.1", + "@unocss/scope": "0.56.1", + "@unocss/transformer-directives": "0.56.1", "chokidar": "^3.5.3", "fast-glob": "^3.3.1", "magic-string": "^0.30.3" @@ -3483,13 +3559,13 @@ } }, "node_modules/@vitest/expect": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.4.tgz", - "integrity": "sha512-XlMKX8HyYUqB8dsY8Xxrc64J2Qs9pKMt2Z8vFTL4mBWXJsg4yoALHzJfDWi8h5nkO4Zua4zjqtapQ/IluVkSnA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.5.tgz", + "integrity": "sha512-/3RBIV9XEH+nRpRMqDJBufKIOQaYUH2X6bt0rKSCW0MfKhXFLYsR5ivHifeajRSTsln0FwJbitxLKHSQz/Xwkw==", "dev": true, "dependencies": { - "@vitest/spy": "0.34.4", - "@vitest/utils": "0.34.4", + "@vitest/spy": "0.34.5", + "@vitest/utils": "0.34.5", "chai": "^4.3.7" }, "funding": { @@ -3497,12 +3573,12 @@ } }, "node_modules/@vitest/runner": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.4.tgz", - "integrity": "sha512-hwwdB1StERqUls8oV8YcpmTIpVeJMe4WgYuDongVzixl5hlYLT2G8afhcdADeDeqCaAmZcSgLTLtqkjPQF7x+w==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.5.tgz", + "integrity": "sha512-RDEE3ViVvl7jFSCbnBRyYuu23XxmvRTSZWW6W4M7eC5dOsK75d5LIf6uhE5Fqf809DQ1+9ICZZNxhIolWHU4og==", "dev": true, "dependencies": { - "@vitest/utils": "0.34.4", + "@vitest/utils": "0.34.5", "p-limit": "^4.0.0", "pathe": "^1.1.1" }, @@ -3538,9 +3614,9 @@ } }, "node_modules/@vitest/snapshot": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.4.tgz", - "integrity": "sha512-GCsh4coc3YUSL/o+BPUo7lHQbzpdttTxL6f4q0jRx2qVGoYz/cyTRDJHbnwks6TILi6560bVWoBpYC10PuTLHw==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.5.tgz", + "integrity": "sha512-+ikwSbhu6z2yOdtKmk/aeoDZ9QPm2g/ZO5rXT58RR9Vmu/kB2MamyDSx77dctqdZfP3Diqv4mbc/yw2kPT8rmA==", "dev": true, "dependencies": { "magic-string": "^0.30.1", @@ -3552,9 +3628,9 @@ } }, "node_modules/@vitest/spy": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.4.tgz", - "integrity": "sha512-PNU+fd7DUPgA3Ya924b1qKuQkonAW6hL7YUjkON3wmBwSTIlhOSpy04SJ0NrRsEbrXgMMj6Morh04BMf8k+w0g==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.5.tgz", + "integrity": "sha512-epsicsfhvBjRjCMOC/3k00mP/TBGQy8/P0DxOFiWyLt55gnZ99dqCfCiAsKO17BWVjn4eZRIjKvcqNmSz8gvmg==", "dev": true, "dependencies": { "tinyspy": "^2.1.1" @@ -3564,9 +3640,9 @@ } }, "node_modules/@vitest/utils": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.4.tgz", - "integrity": "sha512-yR2+5CHhp/K4ySY0Qtd+CAL9f5Yh1aXrKfAT42bq6CtlGPh92jIDDDSg7ydlRow1CP+dys4TrOrbELOyNInHSg==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.5.tgz", + "integrity": "sha512-ur6CmmYQoeHMwmGb0v+qwkwN3yopZuZyf4xt1DBBSGBed8Hf9Gmbm/5dEWqgpLPdRx6Av6jcWXrjcKfkTzg/pw==", "dev": true, "dependencies": { "diff-sequences": "^29.4.3", @@ -3656,9 +3732,9 @@ "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" }, "node_modules/@vue/language-core": { - "version": "1.8.11", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.11.tgz", - "integrity": "sha512-+MZOBGqGwfld6hpo0DB47x8eNM0dNqk15ZdfOhj19CpvuYuOWCeVdOEGZunKDyo3QLkTn3kLOSysJzg7FDOQBA==", + "version": "1.8.13", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.13.tgz", + "integrity": "sha512-nata2fYBZAkl4QJrU+IcArJCMTHt1VP8ePL/Z7eUPC2AF+Cm7Qgo9ksNCPBzZRh1LYjCaSaqV7njqNogwpsMVg==", "dev": true, "dependencies": { "@volar/language-core": "~1.10.0", @@ -3779,13 +3855,13 @@ } }, "node_modules/@vue/typescript": { - "version": "1.8.11", - "resolved": "https://registry.npmjs.org/@vue/typescript/-/typescript-1.8.11.tgz", - "integrity": "sha512-skUmMDiPUUtu1flPmf2YybF+PX8IzBtMioQOaNn6Ck/RhdrPJGj1AX/7s3Buf9G6ln+/KHR1XQuti/FFxw5XVA==", + "version": "1.8.13", + "resolved": "https://registry.npmjs.org/@vue/typescript/-/typescript-1.8.13.tgz", + "integrity": "sha512-ALJjHFqQ3dgZVCI/ogAS/dZ7JEhIi1N0Em5I7uwabY1p9RDRK3odLsycMHyxZRjm5dLI15c07eeBloHiD2Otlg==", "dev": true, "dependencies": { "@volar/typescript": "~1.10.0", - "@vue/language-core": "1.8.11" + "@vue/language-core": "1.8.13" } }, "node_modules/@vueuse/core": { @@ -6060,15 +6136,15 @@ } }, "node_modules/eslint": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", - "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", + "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.49.0", + "@eslint/js": "8.50.0", "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -6160,12 +6236,12 @@ } }, "node_modules/eslint-plugin-antfu": { - "version": "0.41.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-antfu/-/eslint-plugin-antfu-0.41.4.tgz", - "integrity": "sha512-naDIFqCW/7vFIz/TZNuapLEjGd8XoWFot0h8SStbqUIcdXFKc0MgDXCKtHQIyJp6plkKiucOW3gZJ0jjYrc3Qg==", + "version": "0.43.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-antfu/-/eslint-plugin-antfu-0.43.1.tgz", + "integrity": "sha512-Nak+Qpy5qEK10dCXtVaabPTUmLBPLhsVKAFXAtxYGYRlY/SuuZUBhW2YIsLsixNROiICGuov8sN+eNOCC7Wb5g==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "^6.7.0" + "@typescript-eslint/utils": "^6.7.2" } }, "node_modules/eslint-plugin-es-x": { @@ -6273,9 +6349,9 @@ } }, "node_modules/eslint-plugin-jest": { - "version": "27.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.2.3.tgz", - "integrity": "sha512-sRLlSCpICzWuje66Gl9zvdF6mwD5X86I4u55hJyFBsxYOsBCmT5+kSUjf+fkFWVMMgpzNEupjW8WzUqi83hJAQ==", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.4.0.tgz", + "integrity": "sha512-ukVeKmMPAUA5SWjHenvyyXnirKfHKMdOsTZdn5tZx5EW05HGVQwBohigjFZGGj3zuv1cV6hc82FvWv6LdIbkgg==", "dev": true, "dependencies": { "@typescript-eslint/utils": "^5.10.0" @@ -6420,9 +6496,9 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "46.8.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.8.1.tgz", - "integrity": "sha512-uTce7IBluPKXIQMWJkIwFsI1gv7sZRmLjctca2K5DIxPi8fSBj9f4iru42XmGwuiMyH2f3nfc60sFmnSGv4Z/A==", + "version": "46.8.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.8.2.tgz", + "integrity": "sha512-5TSnD018f3tUJNne4s4gDWQflbsgOycIKEUBoCLn6XtBMgNHxQFmV8vVxUtiPxAQq8lrX85OaSG/2gnctxw9uQ==", "dev": true, "dependencies": { "@es-joy/jsdoccomment": "~0.40.1", @@ -7216,9 +7292,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.0.tgz", - "integrity": "sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", "dev": true, "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -10605,9 +10681,9 @@ } }, "node_modules/postcss": { - "version": "8.4.29", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", - "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", + "version": "8.4.30", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz", + "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==", "funding": [ { "type": "opencollective", @@ -12956,31 +13032,31 @@ } }, "node_modules/unocss": { - "version": "0.55.7", - "resolved": "https://registry.npmjs.org/unocss/-/unocss-0.55.7.tgz", - "integrity": "sha512-3W9P7vj2EhSk/4oPCHBS0VgrwSf5zZL6Az1/XARVOpBnRJtCM2szFInYxHkMgt9pkZTsW8SFCuk/g+QIJ6A8tg==", - "dev": true, - "dependencies": { - "@unocss/astro": "0.55.7", - "@unocss/cli": "0.55.7", - "@unocss/core": "0.55.7", - "@unocss/extractor-arbitrary-variants": "0.55.7", - "@unocss/postcss": "0.55.7", - "@unocss/preset-attributify": "0.55.7", - "@unocss/preset-icons": "0.55.7", - "@unocss/preset-mini": "0.55.7", - "@unocss/preset-tagify": "0.55.7", - "@unocss/preset-typography": "0.55.7", - "@unocss/preset-uno": "0.55.7", - "@unocss/preset-web-fonts": "0.55.7", - "@unocss/preset-wind": "0.55.7", - "@unocss/reset": "0.55.7", - "@unocss/transformer-attributify-jsx": "0.55.7", - "@unocss/transformer-attributify-jsx-babel": "0.55.7", - "@unocss/transformer-compile-class": "0.55.7", - "@unocss/transformer-directives": "0.55.7", - "@unocss/transformer-variant-group": "0.55.7", - "@unocss/vite": "0.55.7" + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/unocss/-/unocss-0.56.1.tgz", + "integrity": "sha512-jjkcyXfW90CUjN4tBV6SrHX9ifi5GQgcwAQlMRB0copJEW3ejM/nyZnRgNexaV7hi7Ao76XMVqCKbOC5B+IuOA==", + "dev": true, + "dependencies": { + "@unocss/astro": "0.56.1", + "@unocss/cli": "0.56.1", + "@unocss/core": "0.56.1", + "@unocss/extractor-arbitrary-variants": "0.56.1", + "@unocss/postcss": "0.56.1", + "@unocss/preset-attributify": "0.56.1", + "@unocss/preset-icons": "0.56.1", + "@unocss/preset-mini": "0.56.1", + "@unocss/preset-tagify": "0.56.1", + "@unocss/preset-typography": "0.56.1", + "@unocss/preset-uno": "0.56.1", + "@unocss/preset-web-fonts": "0.56.1", + "@unocss/preset-wind": "0.56.1", + "@unocss/reset": "0.56.1", + "@unocss/transformer-attributify-jsx": "0.56.1", + "@unocss/transformer-attributify-jsx-babel": "0.56.1", + "@unocss/transformer-compile-class": "0.56.1", + "@unocss/transformer-directives": "0.56.1", + "@unocss/transformer-variant-group": "0.56.1", + "@unocss/vite": "0.56.1" }, "engines": { "node": ">=14" @@ -12989,7 +13065,7 @@ "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { - "@unocss/webpack": "0.55.7", + "@unocss/webpack": "0.56.1", "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0" }, "peerDependenciesMeta": { @@ -13284,9 +13360,9 @@ } }, "node_modules/vite-node": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.4.tgz", - "integrity": "sha512-ho8HtiLc+nsmbwZMw8SlghESEE3KxJNp04F/jPUCLVvaURwt0d+r9LxEqCX5hvrrOQ0GSyxbYr5ZfRYhQ0yVKQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.5.tgz", + "integrity": "sha512-RNZ+DwbCvDoI5CbCSQSyRyzDTfFvFauvMs6Yq4ObJROKlIKuat1KgSX/Ako5rlDMfVCyMcpMRMTkJBxd6z8YRA==", "dev": true, "dependencies": { "cac": "^6.7.14", @@ -13294,7 +13370,7 @@ "mlly": "^1.4.0", "pathe": "^1.1.1", "picocolors": "^1.0.0", - "vite": "^3.0.0 || ^4.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" @@ -13418,13 +13494,14 @@ } }, "node_modules/vitepress": { - "version": "1.0.0-rc.13", - "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.0-rc.13.tgz", - "integrity": "sha512-TnVydQOZE38rtXu9gHCb7EGdN03jTcmYkDdhCqox6+pfKYgiyfm1qk2Uy8BZatnM9wXpa64f+T5p30R8P/9Z+A==", + "version": "1.0.0-rc.20", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.0-rc.20.tgz", + "integrity": "sha512-CykMUJ8JLxLcGWek0ew3wln4RYbsOd1+0YzXITTpajggpynm2S331TNkJVOkHrMRc6GYe3y4pS40GfgcW0ZwAw==", "dev": true, "dependencies": { "@docsearch/css": "^3.5.2", "@docsearch/js": "^3.5.2", + "@types/markdown-it": "^13.0.1", "@vue/devtools-api": "^6.5.0", "@vueuse/core": "^10.4.1", "@vueuse/integrations": "^10.4.1", @@ -13437,22 +13514,34 @@ }, "bin": { "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4.3.2", + "postcss": "^8.4.30" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } } }, "node_modules/vitest": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.4.tgz", - "integrity": "sha512-SE/laOsB6995QlbSE6BtkpXDeVNLJc1u2LHRG/OpnN4RsRzM3GQm4nm3PQCK5OBtrsUqnhzLdnT7se3aeNGdlw==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.5.tgz", + "integrity": "sha512-CPI68mmnr2DThSB3frSuE5RLm9wo5wU4fbDrDwWQQB1CWgq9jQVoQwnQSzYAjdoBOPoH2UtXpOgHVge/uScfZg==", "dev": true, "dependencies": { "@types/chai": "^4.3.5", "@types/chai-subset": "^1.3.3", "@types/node": "*", - "@vitest/expect": "0.34.4", - "@vitest/runner": "0.34.4", - "@vitest/snapshot": "0.34.4", - "@vitest/spy": "0.34.4", - "@vitest/utils": "0.34.4", + "@vitest/expect": "0.34.5", + "@vitest/runner": "0.34.5", + "@vitest/snapshot": "0.34.5", + "@vitest/spy": "0.34.5", + "@vitest/utils": "0.34.5", "acorn": "^8.9.0", "acorn-walk": "^8.2.0", "cac": "^6.7.14", @@ -13467,7 +13556,7 @@ "tinybench": "^2.5.0", "tinypool": "^0.7.0", "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0", - "vite-node": "0.34.4", + "vite-node": "0.34.5", "why-is-node-running": "^2.2.2" }, "bin": { @@ -13861,9 +13950,9 @@ } }, "node_modules/vue-router": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.4.tgz", - "integrity": "sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz", + "integrity": "sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==", "dependencies": { "@vue/devtools-api": "^6.5.0" }, @@ -13885,13 +13974,13 @@ } }, "node_modules/vue-tsc": { - "version": "1.8.11", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.11.tgz", - "integrity": "sha512-BzfiMdPqDHBlysx4g26NkfVHSQwGD/lTRausmxN9sFyjXz34OWfsbkh0YsVkX84Hu65In1fFlxHiG39Tr4Vojg==", + "version": "1.8.13", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.13.tgz", + "integrity": "sha512-Hl8zUXPVK2KzPtbXeMCN0CSFkwvD96YOtYt9KvJPG9W8QGcNpGk9KHwPuGMxA8blWXSIli7gtsoC+clICEVdVg==", "dev": true, "dependencies": { - "@vue/language-core": "1.8.11", - "@vue/typescript": "1.8.11", + "@vue/language-core": "1.8.13", + "@vue/typescript": "1.8.13", "semver": "^7.3.8" }, "bin": { diff --git a/package.json b/package.json index 81bcf3d..e270f33 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "vite": "vite -c src/frontend/vite.config.ts", "typecheck": "vue-tsc -p src/frontend --noEmit", "orval": "orval --config src/frontend/orval.config.ts", - "up": "taze major -I", + "deps:up:fe": "taze major -I", "docs:gen:be": "python3 docs/generate_docs.py", "docs:gen:fe": "vue-docgen -c src/frontend/docgen.config.js", "docs:gen": "npm run docs:gen:be && npm run docs:gen:fe", @@ -37,36 +37,36 @@ "simple-git-hooks": "^2.9.0", "vue": "^3.3.4", "vue-final-modal": "^4.4.5", - "vue-i18n": "^9.3.0", - "vue-router": "^4.2.4", - "wavesurfer.js": "^7.2.2" + "vue-i18n": "^9.4.1", + "vue-router": "^4.2.5", + "wavesurfer.js": "^7.3.2" }, "devDependencies": { - "@antfu/eslint-config": "^0.41.0", + "@antfu/eslint-config": "^0.43.1", "@iconify-json/carbon": "^1.1.21", - "@intlify/unplugin-vue-i18n": "^1.0.1", - "@types/node": "^18.17.14", - "@unocss/eslint-config": "^0.55.7", - "@unocss/reset": "^0.55.7", - "@unocss/transformer-directives": "^0.55.7", - "@unocss/transformer-variant-group": "^0.55.7", + "@intlify/unplugin-vue-i18n": "^1.2.0", + "@types/node": "^18.17.19", + "@unocss/eslint-config": "^0.56.1", + "@unocss/reset": "^0.56.1", + "@unocss/transformer-directives": "^0.56.1", + "@unocss/transformer-variant-group": "^0.56.1", "@vitejs/plugin-vue": "^4.3.4", "@vue/test-utils": "^2.4.1", - "eslint": "^8.48.0", + "eslint": "^8.50.0", "jsdom": "^22.1.0", "orval": "^6.17.0", "taze": "^0.11.2", "tsdoc-markdown": "^0.1.0", "typescript": "^5.1.3", - "unocss": "^0.55.7", + "unocss": "^0.56.1", "unplugin-auto-import": "^0.16.6", "unplugin-vue-components": "^0.25.2", "vite": "^4.4.9", "vite-plugin-pages": "^0.31.0", - "vitepress": "^1.0.0-rc.13", - "vitest": "^0.34.4", + "vitepress": "^1.0.0-rc.20", + "vitest": "^0.34.5", "vue-docgen-cli": "^4.67.0", - "vue-tsc": "^1.8.10" + "vue-tsc": "^1.8.13" }, "simple-git-hooks": { "pre-commit": "npx lint-staged" diff --git a/src/frontend/components/SettingsAdvanced.vue b/src/frontend/components/SettingsAdvanced.vue index 4e18f98..add526c 100644 --- a/src/frontend/components/SettingsAdvanced.vue +++ b/src/frontend/components/SettingsAdvanced.vue @@ -36,12 +36,12 @@ async function setApiKey(key: EnvKey) {

-
+
{{ t('settings.advanced.acoustid_api_key') }} -

+

{{ t('settings.advanced.hint.acoustid_api_key') }}

@@ -56,11 +56,11 @@ async function setApiKey(key: EnvKey) {
-
+
{{ t('settings.advanced.acoustid_user_key') }} -

+

{{ t('settings.advanced.hint.acoustid_user_key') }}

@@ -75,11 +75,11 @@ async function setApiKey(key: EnvKey) {
-
+
{{ t('settings.advanced.shazam_api_key') }} -

+

{{ t('settings.advanced.hint.shazam_api_key') }}

diff --git a/src/frontend/components/SettingsGeneral.vue b/src/frontend/components/SettingsGeneral.vue index 903dc99..1f2edf0 100644 --- a/src/frontend/components/SettingsGeneral.vue +++ b/src/frontend/components/SettingsGeneral.vue @@ -19,9 +19,9 @@ const { isDark } = useDarkToggle()
-
+

{{ t('settings.general.language') }}

-

+

{{ t('settings.general.hint.language') }}

@@ -34,9 +34,9 @@ const { isDark } = useDarkToggle()
-
+

{{ t('settings.general.darkmode') }}

-

+

{{ t('settings.general.hint.darkmode') }}

diff --git a/src/frontend/components/SettingsSave.vue b/src/frontend/components/SettingsSave.vue index 138acdc..c383d44 100644 --- a/src/frontend/components/SettingsSave.vue +++ b/src/frontend/components/SettingsSave.vue @@ -15,11 +15,11 @@ const settings = useSaveSetings()
-
+

{{ t('settings.save.file_type') }}

-

+

{{ t('settings.save.hint.file_type') }}

@@ -32,9 +32,9 @@ const settings = useSaveSetings()
-
+

{{ t('settings.save.ask_file_type') }}

-

+

{{ t('settings.save.hint.ask_file_type') }}

@@ -43,9 +43,9 @@ const settings = useSaveSetings()
-
+

{{ t('settings.save.submit_saved_files') }}

-

+

{{ t('settings.save.hint.submit_saved_files') }}

@@ -54,11 +54,11 @@ const settings = useSaveSetings()
-
+
{{ t('settings.save.save_directory') }} -

+

{{ t('settings.save.hint.save_directory') }}

@@ -67,11 +67,11 @@ const settings = useSaveSetings()
-
+
{{ t('settings.save.output_file_name') }} -

+

{{ t('settings.save.hint.output_file_name') }}

diff --git a/src/frontend/composables/useEnv.ts b/src/frontend/composables/useEnv.ts index 077cf86..5e74f7e 100644 --- a/src/frontend/composables/useEnv.ts +++ b/src/frontend/composables/useEnv.ts @@ -1,6 +1,19 @@ import { useLocalStorage } from '@vueuse/core' import { DEFAULT_ENV } from '../includes/constants' +/** + * Provides a reactive object that wraps all environment variables needed for audio identification in the backend. Any changes made to this object will be immediately reflected in the `env` key of the localStorage. + * + * @returns A reactive object representing the environment variables. + * + * @example + * ```ts + * const env = useEnv(); + * + * // Updating the SERVICE_API_KEY environment variable + * env.SERVICE_API_KEY = 'somekey'; + * ``` + */ export function useEnv() { return useLocalStorage('env', DEFAULT_ENV) } diff --git a/src/frontend/composables/useSaveSettings.ts b/src/frontend/composables/useSaveSettings.ts index 32499a5..7b0abb4 100644 --- a/src/frontend/composables/useSaveSettings.ts +++ b/src/frontend/composables/useSaveSettings.ts @@ -1,6 +1,19 @@ import { useLocalStorage } from '@vueuse/core' import { DEFAULT_SAVE_SETTINGS } from '../includes/constants' +/** + * Provides a reactive object that wraps save settings. Any changes made to this object will be immediately reflected in the `save-settings` key of the localStorage. + * + * @returns A reactive object representing audio identification settings. + * + * @example + * ```ts + * const saveSettings = useSaveSetings(); + * + * // Updating the fileType in audio identification settings + * saveSettings.value.fileType = 'wav'; + * ``` + */ export function useSaveSetings() { return useLocalStorage('save-settings', DEFAULT_SAVE_SETTINGS) } diff --git a/src/frontend/index.html b/src/frontend/index.html index cea39a0..11ed194 100644 --- a/src/frontend/index.html +++ b/src/frontend/index.html @@ -4,8 +4,7 @@ %VITE_APP_NAME% - - +
diff --git a/src/frontend/public/logo.ico b/src/frontend/public/logo.ico index 197323aa7bbef49b61ebecfe5281215bd8f0d60d..67eeb7c052ee57ccd2d3f8ca1bcbf27b62a030ae 100644 GIT binary patch literal 100526 zcmeHQd5jdr8lMFe59C@FugEU0$Uc?B0}wf6jf$cV1wj)8v#7uyAcq&H;=%C}kVQhm zv4Dt1qlU=wj3J`I_z>~n2!e{hE+8QH5LmgX_x%Q%^v?85cXe0wbkBT6KDwv6`m3*g z_1mwj>*`1(hyKl(6QTbLA~XM!6KNQUM2bi#Dsp$u`FJ{wbQ+TrDQq5z34Z$-gb;Zo zkCTibnMd+Jk}V{ElN=-ApcesP46K1Uuty!BE*>Lk;3pS!T1PU4qyq_gsc;0cHJ{{dl5!Fb;Y45?nf(??qoA^mY->#NF3AZJ4w-?#DJsSS zlBPl79odpgGMnTK35U!?0ChWqq<*@1M|q=t_8iH65)Rpcz&qIX00F!k_RzsO(py4unuG%* zU`7D%68%+jj`Z~-;r?1P%6x7{0Ni*^1?Nc5ze(7ynbGBQD+J)@x_jXq-QSkvxRr8_ zV+1S^K-=EcI|SWVkEEQ010x`Vzz#~BE92)VJ^FGN$z;N5837XlOX=KkpD?9;-gGaY zG6HT8=dI!JVxaPVZO(VzybPUJFkw?l$mehb4I`e0y9$iIMUmc1at4w9!{P- zDSrR`ck$zoKZ>uu`bw-=u|oXv%P(Tru3c%jjSX;&0QyL7PR2R9Hs7%(#R>Q9*(2u7 znC#2is8Pd`TV$whe8Ywf#o)n%#n!D`eY2f2a*V)9N|`WEnBvAe z)}SEa;>C+avu4d~x#WazMjCMTnP;96J9q9>U?Hneh`?KB2S<9*--bEs+QW_=JH(@p zKB|;w2H%V$p0|@HPZnp-2BImd9n%nGP(e0c?2n`KPJY;ocK_8^U#*pE2Ip`rE-n_k zcklM2Xq<;V0_~|zVu6xkor~5mWy%zhlau2c*Qj8zyz=w&#c#j;rnPKAQoefiYB7BH zaL=-L?_Sl#D!o9r2r1s6TDe)@m@#8~=b6Db9CLGX#hNv1%qC^z`Knc`MD5zOm0-PT z(Y77IT@8_R?7WL}YQ--w$zJX&6 zNV@3)ZOM`)X?cbw<6}`#kvMwvsIKCsO|MG7W?-j*Z@>q8M~u<|)b{P$Mg98qmHoXL zICwpxKRJ_v4z2-XO?(?p*uSp>f8Bi^UU&z;n+ZYnGt`W!Cce!h+*hf_{`1d2_w3hh zzx{SGa^y%cYt}5Wbm>y@$tRzP($Z2LZ>3Qw~=7?Nz#TC-|E?l_KU5078E96`QYS{BoS>GGR zj#AAdvhp>Ud*p>{M%91%>8H|tFONTt?KZ;^GJtCUS{c`%tgNg|%Ey44>({TxtxCd> zAw#6{zx?vcL-9<_5UweyW3!T8y?RO2_w&!IU6ym`&>`tQKg=5ra?si5(X?sPP|s&T zo8Ri0X%&aD`||Q~^Ry%RxMCCT9QpkQSIg)tSlWDu%dFP$Um3g>=H4aw%P8Ns$ zydVblYpH7mbAFQ5sa5>w(W6r<^lYp!u@ONS2FjyqU^{hED!{P4pMj_Vlwn>`y_ z{^|)>OJl`xt2p!-2Pv>$b58S^1A- zai4vrZ~Nbe9(u^JElrvklU1E2i~I7+FTG`GarYBXJRxPnoH=tWwCImwzvdm|7hil) zs;*nKXra`{VQ(ARHHTZaD4qW22t@X4j$pD)^u-rnNbwDRPt|+F@#Duut5&U~@=wRR zDf=~B8aYmYJ+!daGuiXgDjs`&VBNjffORld`cuV?8l`2aP|~6>*OEfx`oh401EuR7 z?-_3AKEkiL;aat7)qLGgiMi&QQYml5nqrx8d&B>r-SyH-FNwp452w^`zKHgk>@(EJ z@2ab=@@@SybIn|9>d&8g>M3a-XYc@PR>zJVE7q;U=dBY1)>UCIFT97!z8e^M7{}|b zyG}djm}`l3s5%Dgt1x%gs8_c~%=5VCo_hr5eLwv0!?FG1+^kbbmA_8TG1pWxE4jY$ zlPjBPKjg}B` zd(9G-Kt^I;Q|xVY?X}k`;T^_9F-E218Ef@yWxp0kTG<+fb<)^N5c^@)tXWfr&}6Bi`TG1oGO zSE))81kN$nQq@rAT}vnDm}{BGCnqIx+b7(u|6Z8zEy7L=a_3*O|gW+fB4~tww&qLuV2D_ zhAY!KcQJ8^`8Dv0pQz$>*sM;5p!_(BW$;5n!&VM3Z%;Lcr}a)OePr zI?A@!CQO*1eP50zu@O;VYSQI&0p4-9hFWbIyN0 z=*%$;Tw~7ZWPpFV!^Ab_oPWHC&k5h)nm>QO7%*UfC@wA*H{5W8s8gp-tRMf9OD>7+ zwU2i}?A?p`8DD?>wLo9LIRxoFbi{}eNyi`zo|%v4HPz-a@wqw#_U+pz-g)O8(XwSr zsk$-hsaCC8vHkGB{q|e&{rBGoW-YQT*NpNo=hSh_tZDb|-D1d)AyVJ+GwLMS5qpRv zyXGZcwtvkn*9;q(b7rP^J3oE;w3s?|sy07l)S0TI-&`~7X3lxz8Scj3828_QzZM^4 z)RW4i?0N&EFISZf+&|}@b7;rs<>iHjYqEX~V^pemX4b=gPM&l4&Z*3|c+GgH<6M?& zK*Z_XbT{Q;&N=5C{92f}Ci@IEBcXGxAwOHqNL!!dZ@zBbx>}wyZv2GZJ#PG3e976* z#UtX+Z+s`x%{omxPUyPs#jnL9%6={$5&geke);9B@@w&kvY(4bMBi_GQwHNtUVIV0 zq1w82Yk_ZDV*k|s{rkuE_*K2Hxr%3KG9;OE$&gVS|HvbcxaJ!6e=aL46Z`k?PioYf zHEUuVbhE#-`ENic*9_yCa|RN6j^Kiu@8E(vrKP3f)TvXB4XdcA5N^4Rc>sRx&CHy0 zT&27ffOm!$UU)%8wyt!rpK}FU z?56Vaa;bVAG-#0f%u?Km^$fLZ*LG|R=HsO^u%B~>KE4@l?n|{hpFVxMyNn#%C9@Xd zjyvvfpiyrU_H*+1e)G*YQhdX^tgg_dOBctsU_2uTfjK8v3s{?H=hMvB7cE*Omw`m; zu3fu2wgr2-1tsva)p<>XU=r4Try>=R;?V{(xOERN$q-*v!8Q@FK{yZ zFT3+sUU|itV#!o^PtMKFb!(cIg9sjn&lBXpelB_KELgBW%C}&i9QOTC75en)Bb7h;g|Xg0=z;y5bqyUncu>gB zxoyy(f!MlrtF=Oj*lE+INpTI&`lp|MS|W$^CS^Zojeqy<-KFat^SZZf+h(oMLF{|) zy(c{{1bo9f>@WrPbBVRJeED)|zM<~n=Va?2^EUxtVO$6r5g)L+N=c;}f zNV0_IZb@SgIZgMC)!~$V_d0tqT(9bmGS#aX9D+hJXVjP2L2 zpQn9(n>A}DCQX_oG_^VO6g>O1b};cRhl*dGP6)8yFV@E6TR`|$8=i@9z43x~j-sL> z(W6HXfjLMz<_M<~hYZcTg36U+@C`@$Jt1giJ$CF^tj`Sd;~*Hb2*doypy3z*d)_v4 z?E>El$S&ubO9r42Y(gjy0H^Zf`F4SGTE`kffess~8iBc1T)V)xBFgNn>I_+5)*^rj ztv4s*+Xc>HjEe&!paOx}sknB5Z@H9F^3CW~Siw570fB>5$k=#-1J3o&20*xsS`m28 zj%UVovI6~a`Zh4qT1-|R00jO^HdN_vGq{!PNa^d5pr4KdBOrso4oaMxj901R>ArR( zCuB0?v{{Y7aVq`YsW@eKjqb;srSL7(%<5`SOX0zh9(H_ka-H-HNJ|Mg(=Z`0$O)I6 zrlEqDkOY5omoU{(X4ne9Hoz&5WYUpdJX`UM=D-L50krLV%5X?FE$PQQ#7+_p*^R(< zDt=p8{ORUlk7Oeall364?XOlq4kbt^eK=Lo6o`ZHI+b~af zJPF#99KwkJ#xci{SkB808s}gS*;-f8qj3RlT1p6{=CBgo4$4EHnMF1EBYhVuS=aY;i!G0bMW$MyPTFPsM`Tl!_ zh|+MWIVw^;78k7&M-GhARk<}1xfgL&lSS%KTvc@uQWzB{;?m_%TwE69C8MGuE?s17 zG(KC(I4a(VPnRE!Hzg9O6FnE7EK)NXZyp&KjW;h6$+3(}FgX&5TE$f)j)3vY@15vSKSJxH`S!0b=aZSY5wF|prZ5O-1#K2apRj^@M zyK(h>^S{2q%k#a*qZIYc?{~P|`|iCnb85~xb7roEg{4Iz3yP&hPKyN@EG%5b{~jJ6 z&I=^Av`CoI!lG(b?YX0cMIl>D3w!$y=d1HsSp4WBp3JE|PiYH{R!ZdMi+ z%Vt?xjBC`OR*IxqlZscTsO{|3gkOQg;&+RegIpe1SY+r_+o{@51Fk-3(`rigF8wMy z%)Wl*?5T%!2A%EPuh!+!e-%mQH+r#0!lDJs+)UZKv6oA_F^!7aJ`MWehr8*AHu_~cbDrT70WO0+!zIR>5jLo~P@lFdHoA#caetLTSY1geSAJo}>_2P|tH-0bw?p>9} zgH{gO);1Q)ck!RjyiKaQ`36 zo-g!EG4GRolX<6~7_|Pn%aPalMhu(gId*L8H6F9~&+<)rr^KKcH(dH(e$(&r!r}YMs&QM?O=(@kFqaM=AU)IxpTRymiti2qzVE4Ieb?? zYaiy|dT`6k7NZmOp5JM$&-mu`re{i0srGsQg-fgZKRwlY{esXrzUi$tjk>YF@R(~G z+-$t=Z*1GrlJ&if=H%N4ORIbIT5U11x^>R% z?`?xdY?*lF*On&=rwbl1{$cdez^PJ@4C2d`0??L;A~0z`_w91B1e}qyfdQHMA_7 z=Tgrx4PLh`V}EvkkG>_nf6rr)BY{%$4;D9_cRB=JEB^FVss8pgS}n`=yZhP_DkeB_RTpHBQ z`fb__jY2P5SG>G)+nI@*dLHUIvE{FRL$YQI%uwrAmzfJ~d`9fK;9WAH{vV#Ng8Uz? zn&=^c~-6R#m{D` zWc^c~@@*4#9Na(Gh!>VtB?nblobOG+%(q88Pv|<)%ePC&_#+LM{t+;3#`v{6r~mFY zZ+qqcExh(?qXfGX7oX8VGvlI@b*jH6lsd64jpa{{kDg@nZP;dv#Z77wjMHRGl1iT0 zyp|WUU%Rwvo4t+hCr)7>dZ1ok+aZ%D6zKZGuaxJKRA*n!88Yj}wdE%=X6!gN%)$9| z@rn}*W%&Ex^INTIh2716vQ5Lo9p_JYUSeOpMuVo+ELx|m=g!(|?FRP9T(O*GvVO&b z_MNO{ne4wmZr52~%H__qC;lGg?rjK7oin>2w`fJJ<=s76R5;Q-dyh5mHfL-^G(Jfce`>W~;gAP_tXx;_;})@tUp6r~W8LX^tiIKVQtN&FW{Ts`w7@$<%%EJ=?u~(|PAB z+`#$yPxV7fRr8zE+0E~t)*E;AYF~TY`!uJ5OL;b}w!U40vuAC0WoxzlK&nF*_Y|CF zF)P^0`)-9td$PP6SF>=#R>@ji9nsMzS*ui+_ITV6F6~;eaufE1fGCjvey31{2IZWmvLwND+Eb@9H@RqUcYm9Ef9_nJbMIQG z$sIxyY^ZxCNuZVg^_*RodN;dJ?EMd`of8~AZ&lR8uFS2+)wgW8*|2si@Bg;`m~mFG zYzOXNu2DV7&$%0>>KHmWxclL}xd+b+nc&}K?bThiKXOIx-z_qgY}GXI()n_OOFiqb zw5@B(!jGQK$uPg+p>=OO3UplAXW`J}>n{6tUo62ul%cuq=vMqb-wR5<4))ePbzqGC3Tlm^?mu(+K z+3DZZosy4V^x%hO42f%RK1nCzL`vRkFG1)mmaw%+Nt z)U_=N_O)Ht{6*D7U2;t+ki&CLK=QYp&UYLII{cY^v^jX|P?76mJSzhuIF;d9UKemF^`coT+lZzWpf2nbn^+ zoqw`J@NKW);Oj?UWc&4IONWoFB}SG>&iQ-&@A`>UG^6fv1-^-Ps=egKHbF zltq>t>NIWN{_dmR+xq?KaB_FbM8D-+d7|W`xvP3Ebsn;F$&JbjeKaK=blx_zjD5Gx z2j7mJJUql>Ou-iZzdfB&!; zdBc*S-WA#>I-EKG0=uPMyy`DWdVI+A^q1?lzgpqF^{z}0mZWhF$!ImSSdF~tyqv-u zGp=h}`QiN2+bUm3QRLDuWtwJtwxf3@mn&IAR&-1rSZY_!yLqM^Npt?YTVhLWoYuWVS{duN{ozrSB>U*^I3{cr)yM8 zGV4Ks60iH8x&LHE*|2}7?>`*8e{7q@F3vgkO#f@2rd80GtL_d5y{x8G9lf@$-JyU? z_PaGrrdu}}o-2Fx#IIV0mGdsz&eCh}-G^tc9Cl4H>yH=j%5Ir+`_+h#jK1zb&Wow~ zCvz+m+NgfX(XNw{RW7nJU9+pIAJnO&n) zYX+TjUY0j3{jb$uzrR+{%JtHD_suUVEOK8s%I%@w@fw-dt@x#=!>ux5`Ms?UozD_% zHT8#PX|xJ?dhQJ6J0;kcV(&)xuq{n%-x|`Uz&z)c+x~H_cg41*+n?EcE!~#1?ky&j#V4`P#Wv%!i)5W~$GG|)ocXD64D+4DiS=BwA zTib?5JLVj?yP@yPN}c+rKApNo=BwF)3;CB=-RGZDedoGlD30+Vn&74hSrh1+^^j(R zwcTPq}MWw*j`@(@)>-;ALH}{ap9-mJ1WCNp)j<)kdw?zAkN-!!<#QwoY3f z)@{D8&(7g9&RK4HbnBOnvu9oo+3%EKViN!M`JSH|^%4Djy^@r2KKM9AhkqB2-uc^* z|4ne%T5(^#W%u{jOp~@w`$bkon`YS9f5VHC!OhdTJ$Na?_OKI?k5zw!*OM-^`_c%Cd4tG!4W?zb3Zev@_s_eNw&~l#RU#ot3 zu*b6L=|wdkoNgI-^;Ux#ey6N6&sf*J-J@-9iGMeWSO&`|n)!9LophUst>B?L_|_d1*B?SF6njUe$lz!u3j` z3RAads}Nwd!8dqs+D+@1El5_W#(tNPeMh^_>2dhST7@o!jZ5}Xm7Q&$zgPB-PZKt8 zb*IIq#iMRb%$X$F&J;Cn|9sA_WL@`lIsUazH^6fH>p6+<-kj*W@x`6&Lp)oo>}b9C zqm^0zsYN=kx)mpunAG|Cf6rPK&pV<(B`TCCqsOabJs0;pQzooH;^}S=O63YgO^iZ?n6eX|VL-@wEOwU0JpD zMD}-o%yIaAx95|xZWiZf^ht`J$m|u*4kfrRP9@jHy_SBtyanBi!KlB zXJgg!TDzs=n~wTmuctYm^X`E&O9 zb8lH#cyYH}XI-CHKAoto$A&9ok6F!f^K4;TX+!bYe3ZLqbI=73XZr3pVxypuKU(F=A} ztItleWB9-xId(tkc6qEzK)L3nA8#)n=#t&FPr6ChFS`2d^r{z>`TDqxn)7D{y=p)8 zXy?2G%6Jxb{jW-O_u{R(txuXh{l?tAdIY5Kf7>kkrJ7Z&-t@Ct0`HFJlG@g$s10Cy!zeVmMvYm>Y7PCQdw1c>ELxe zaP*9GZkel}&*IZB;fOqA?$1y7+}3qjb4Tx)9|wH=Ij0iC{ep+OCTo^|zTLx`YwnD( zFF0?TZM8oRZt(m)-R22>?QXbla&_HbDx)*}Jz7J?1=lxNEhS1HJD#2-jiTJ^vjY^EDW->RwpUCwImqwat9{cy;@6 z`C5$Z<-KFUe!JWL8@ngD)YZB}+r1kSRol13v6Pl3&iNnvJs;y=r*FXh7b(tM+TM8l z*~z_nH2P^%>f~o%RPJ{uQP~47Lr4BP;f>?WpkfVjb$ndzT?+56E*0JSWZZTpv3INB z{;qrL_bi=Ga7E)sw|nk7x2f-l*MHrdx~Wp19@jd1ZmHHKm1mxbBd4|Ze{j0&l+bR; z1Jj?YvElIVWrr1M^3mrQd&lyJO_kp_=##i(%Nd(bR!cq3Eph%{0eDWncR5xo_X)bws4>Rugjs4Q?9xenvl)zf!)NZlgAx6 z`6jWiQ-YsMZVMQ7;k?zomwvq_?YCP~FYU>KTNdW+l&kF8Y0hdx(_`e!10g?`nL2sM zzR(2qT-N?GsYl*%E|V7j(ep)a2mkKr-X-xqw5CDETIoG91+0Ia zbaCokD}Hn+Tx!acodbg%TXso#qRzb#yT=31w9LKx#qusT8y8P5UU&T(i;p@w&omqR zjxJ}nrwU5`y!7z4l|~Ftx2MvKkV`>ZPj*Uq-+T1j3F#~Ev?^QmdE&4oHa(o$9JW3G zynwguj9uwc9Bx}beQk>@JAyhF4(iY`?Z5p7H_E@oqR#Vlp$RS?usF49^4w(S?Y4}+ zZ@F|;>Pv-e26z24=y#XwrxU(={&v6+`~H?Hm7F(~%gVy{L-#zh_Bxcy|F;$08l=rM zweyaV+4l^zb;;4AbHJ`Lh5Ik^bzgST-+PDSOyBkY+dJoEhP5H5GXA}(bv>W!&Iy87 zWt&sKMYl(FiYWKyGI-u+5jZ>rjG#JeATpY2SW;^rlrzw-<&*Q|Zm-o&GZS&my@ z*V5YMT)o-rkFU;lW@FF~o7_H%#-tfDE6+}ut+Vs_oZh*Q4A2a&HJujW@yK-v4^o_SFJo@97<+|3D{T#-foOiJ0 zfxot%E=-_0I_=Gm4X>fkxPZ~ma(FLNbzw+YDFz3iUkSpsbu`gm^Y*~=?ndX?<~ z4oN4L=z6_h;wi|daI^Dd=utXTPp3K^-mmXk{@B(0tHw`maA5k31ZC%!YPu~;bDx)O zmKPcKTWF2to4U5Ry|};qw$kr|3gviJy!+pQ14=tCY-?4r?h$`K_XD$C(l^i)3Qk_i zZN0^X4fe^pRQ@B2#_{A*_hIv^9z2<7$|}v1)gP?^!WF$AS!#akHs|3P`xLhA_HVnk zX~6SN^{lTAT5>tzmf=@i3t4Z;k#*Ch(aAb?AKyA_@!=J#ziRoHef44Y&i>T8bh8^1 zd#}&juS13=nfGp}bp7@GPBwq{Pv~8zYNq99j{4jjtJ(GB@y3ti-lT4`E)Ggie&N)N zyUXCx6^)(zV)YVgz|QU5N_ zAE!C*92l1TK}o;jN%r0yux4ld5~FL67+^VTy`9}<>zQ*x5}z+pY1EFs0WHINce_^f zpsj6#(0vmw9;@?F+L}0r<{6lvTe-lj?wt=;Y@cG|n42f^RA|06tVTPtj6ZPi_Pw)7C9!ReRy}vvlDgO zee`ZqUQ3wX{@`n?1uokbZRj+saoID~3giq5OY3mVe|z_9X+1`~Ui3Dh|BVf`Qukb+ zbn%EOwGtdDUSVvH${*P`rDl9r?|>7HyI-65V$u135?xJi?Z3;%$VNY z-_bqskQ|Sep0+=+r0k5Pd+o)Dx!vVm#s$x|_CNd4BOKVH-|@tDf1FL@nrF-O7DtZ1 zXi_RuhM#)+=N#2D`Px$xZ|}PpVtKLZ@8bqJ3>h0zbl2XCm#P)c*yzZ!a-Ms}Y~Iu4 zMv@(FOFptxsdKG1j}1GOWvZct1UU5f9;|@xf9ph{k%jDzkn_|C;0WcmT5ua>uo$0)2QO;JE;Ei5dpL8Mp(7=d`e29HlOB7ytJW z&_;lyM;h_JjR5PoQV8PRSp|4#;jB2C%a_5xV^QrR0e%7`J@SkH855G5=`XPGZI?Kw zzd&CS0ok=MUmOn!I4OX-fiMB)@?|jaPE-rL79igT6iUn=JIu509plV0UAQf?52(b+^c=YOn-rhudqa!{-Tf80+MTC zfjBaTphtKY@J@iad>t5oR+4Ve5L(VRCja7h;s&X;fDIWafU(3}zHSUa!$1LtBB6g8 zaS!nW06zj-(roJqBz)xs8bV9_c4Bvcm<5Vh#5H1w9$LVkG?#A+1JG2`w_HT(TUdzS z%=G`Z=&jouz4RA1;Tr)S|NW=H!-o$w4<0t*KbCqNZ4}VwzN`QYj$mpCCbk@M{GN7F6zoS2k_hq`;|Dr!uK1iIIdW>PqM~Ub2X`z=m0?aGNxIpv3z(55G6eys{nKP#* zUAlCNd?VvA0XsW8MJK=$=gyr|>Ie-Djd7d5#0%ixM~@yUaQpV{aGXipMRtTwVo+9! zXI->lrhg0&8Qn+Y5&fr%J^s@SpXZ|mGyOj!1H?o6Ul-j6$TN&mdGX?fVv7d_ z1!?~GzyB$K&PVPell>GaQfP`6Evi8I^5r!S4h|ZQQokopp4_PJkagtCmrsKZ0BA>i zEcifY&z@DFbm`KX%$YN5(xgda5}wq0z{bWV+&}vF-zbwyjT#=tnFa#2K(1+&3iQW@ z#V^Os2NxdB}G{E@r<28T$@rP#IxN(}_fB#*9pMU;Y;R*DD?7zNah71`r6)IFv z0GkTD5F>~W1-Yj^#6D$Tv0IWRO{zhb_4P;JwM2;$X#nJfI4SV->C>2W5n4;SNBccH zcI?nhnKDH)a^y&(eSz*$u6=!d6?-i>IM`^tM~)oPEMB}=gPo)gC;G0fT)9$_vuoEd zZ@zp%=Og#fUdB3!aq4Tkp=*qD@>y(asYkH6zjQIv-#7)nb^1@7I8o8(wQAKe%F~XH zjv8bWKp%#Mg=r$=-(QI()29!Qe-rb3_3D)Z#ErjnVIGfIEOwhA{l)cq_3A0}H$FZ-8f?a> z6!?TO2B=%NuF-m0wrr^(mcm@amny_|q>jeUM|U&c8^e#j-*|>+d53%-?~YG}Ib7!P z;BkF@kTxIoiu8Y8zkVI1E)dh(xN)Nbty;CxTaT=pxy6nhJ8GCS{+tC_#2y0<9Xh1g zEZ8mhc-Z--+Io!j#DaiAg$iky`$TrIvjObM_*Brh@Tei55C0yU75gVP3i?LUTHg^~ zL?8Y7>#wmv?98+Qg zcX9C!#&v!Dk=KabppS{|#73DueR_C&I6lyycr!Yhn1=Mxp{4A7;P+~=~El1dTw{G3i z`1$#T&%rSFEazs7wM+dQ_5raS{ChbkgssPT|261*HD0mD(YJN#)G;Ucsq8h^> zr-zsxz&xKCm%9I>k32j);w1jdoDw?v&p-bR*W0F!_3Cya59ob-1v!qya4t_xlF$18 z)TvVy*=9~x-ACR3%a$#x*nrr9%=^jsKV!RY99v#P?zsp zVQduIg1rY^xNt#{ee@9VE+8uOm-#Bh^NHya*OM{Pua*AHYcCS(I*7OH(%jHFd5(-5 z%+W}@4q8*7cVJ+k0_1gaAGVyKcj;cAGiQ#*N6ayxPh+EyM<8Xia^=d3+#yWZqlTQlD~~l$2{_k z88a07fV^&?S+i!!eUZ)i%J*{Q8T5-BXBcauI^Tp$GUv>*2M-<$&t=C)$96MyE{FDT zFV8RsBF8Z1aGA%8svQ)cbp?77-y47r)HE^W|4f-ODRF{q*|J6XS@rv+ZH2CudOJF~ zU>7f5RGw#ClX@F}U0s(c|04@LPn=Y?huG1#R?PI*KMs5^^v8ZfuL0<8@?8LIUQ^_R zSgx@+vMKN29%*BvbLDu1O?dwNdCld^myL=Y{x|ml#F2TPxhDBeQ`h&hbEh&l zKwJ+T0lNN<(MEkGKN6ppc01#_%=I*t{-)yA)ce%2RdhJI7oBdbkhdjuG;0~q+sTq8 zGl_rI?SlSt%pg|8JBb^8%LV@!n+aIGdUg0ZHs)#=+f$}Y8D%`GaT?YC(I>>%fcEX% zEA!8@X3Yv;C#W8S<=R1f8Rn@0+Rd|3vGuU=0p@XtQv$?{m?Qj_Y`w_%7~D#~p1e?O z!u}AfIKuAaQFz zUemX3O+IVrh>gJW_zF_zN4Bo%Tc)$2zTsODlLzL{pRddpAkW11f!@7)D>=L5?MlFI zU%Pg#X5G4V;d_TMUrKBTK=!cnO&zP@7v`e@@@(Xq5_!#3TaWipFTfr}w1xRkY(3z6 zvh@tnJFc!HTT;%DIb;tRG$fyKah)+j>I{4Z+C$91T;d)BX8OlHj^lF;%;gYk2CyX= zBk=F>@c>iDg6QZ4#vAIum!)2S@r<@SdGaJaqwSk)8#))=iw>6h7~LEl+M4nVb^`U_ zFUT>7*paz>84M85C#FkWPwqW~4UY~mwGhCCu+uGVH^F!k=OM3f9zW#e_yg>iBb>o40DM;7%VR^z>BbW|^Or*U0aY&tU7J57>iR?$L;jp$_wy|0Sqw zTAjpniRlsBk+hUY#ssPJp}Q>d8e@mNm-$NcK6%Y@Y>DB1o3c9dF%B_crhgnFH=e#a zw#I*H=W%3TE9Bn%y@7a2bXBv=^j9I{JNlP7CG0WscBGBQ94>a7zPTKHd42=1_2j&- zlzVdin41Rh?eE;V6Jaigbx6ed@cE^^sm>$%j!+*jx*A*YKS_V+E^R%1`-tDae_zRQ zWZjOu&+H3)IaV;!|I6Y2OVvz%sf@j%uZjDTt0`l&(tnHWh<}fd2Vm;~ycf9#WR5m_ zQ1WdS06&pDrBbCzg~ywTJ@Z^-x#eF9U*B52u{HmT4IuTt)a8u#x`iArnb+Q+K?5bP zoplZJS@ZnAF2?kqBU9K-0N?T>M~-!a*lucIy&XC80DEe2FKZ`cZaMob$+=h7W-uSC z&(_l?|JZ-T^8w;|#C8CDJV2edgWN-V@)wsbU8(@GPo1pamh;WbJ<}fMqGkW0v))iY z*1nyq*y>WwSkp~zAGv%o*H0eVyNP^2fc28xORSc>L4dWLQug%C*Xg6Xyr!Q2!C#Q= z(T8REJuYZ3*Rn8X$al%3IsZ=|_CCF4rvIln`Bty6mj%8O!1y?N^k~JWW{)6%ygk}&2z?T_{z}w zAK3?DJF?x-9lg(ZZ%SJji{!ZUJ+A+O&!z8#y~g|+(7179#l}K@O~GSq-2*-3S`PB{ zi1m@TL+%EkFK&bVCimIK$HUIY)-$C|)F;=av~Alqd@TsN5IYjwe9OhW{`cehf5rl- z3%-~2zh?S>-}J|JlIv;ka7td@sS&XY}2N?BSEKE(hBaAV(X0kA62+ zn9JclfVdvd;@|T=K%f1muMLblaxFM(99aj>{zj|=2iW86TPxsJ`taE6`tV}xntA`9 zuahIt`|vaIIrjMmvS-h3l>W#P`hnQH^!1Qed_&@L@*4J(oUb*;JL=!yBkVS3XXo&} zT%xl!gLppkOT_iyX8_%Tod>AvH1+Mn~;5Az}?qgh|dz2V^2e4cu@bw zIKjGJ)^^H$BESa)oXBhJvq_wgIH3A@WB;?Jl(oXdlw+fy*JPX!{~o&zzBJYbeZPIH z`~R8g|IzN#M|XMcTctm1vsuqi%tQ87-!WINT*^Md>;t}i`*scAO@Mc>xd6FO3ULH^ z4gJe^Ww&kHrhL%Yzt%Y;Q@{U*ZOER?KxB5fF5R#%*wY(;2PCca9ifjLTXf$O({p0F zj0NWXzdvHqOn=k9^`hog><8?KZ(;v;_Hap?Hm%Yhbsy#b*y7mE?(Xi<-v5v>LC&Z2 z>C?xk{1fMmtMC8N4#p|$cbTJre~*2SoiFxK*@>t+VY4#*Y{rn zwR^&|7nCvleva?I5zm)C0kIuq86Gg!E`7f-Zz$u$U+edOI&|ou#K!Q`_4Sc&oZ!Hp%ziz|CNjvP5M+NuowkIe<(1Iipuef1He zBd2q~fC162FDeh>o1&*_8!=D-nE)q%zA;K)yO~>J++aLl|6qWzfLx0BY!gOi|Ha1l zzoEa33A4UmAO7Su;tb@D#^v`P_3;PsYiSb_+mUvisq~lahX>@dU&Hsmd-m+9%(oc& zZU=EcVs`j{H>Uw77uh%ZSZ^)AiLiI?UM1EQ+1?89{Duu1 zlz4mIym>VMxdF!HXUv!}%KiKH?faB4pXmxZTIy?bH#!_$F7u6T4T&d&?um;Rn;d{Z%x$!MGWA9e~M!trR$VVXOD?SwZ z2p?n1NxRNeTR`>;8&W=t{UgT$nKSVv`+4HT2}MR(Qz88_ef&)hJ~kpSVZsDu9+16y z85xmrG;&6c9XqDXEq_V8$hz^}@Zs>~q+dr{;Q@Vkk~CKz zp}+Je@hzpF8J}{>Svx7^+tgS%ed4=_K&48Rl>9;R$K-qXU5y7r|C942a}VR|-i+$? zZ}0)~Y$#@8sGnRXhd}BA-Wgwtnf}Hp5zpxlBLUBi_rmb6`1R;Gpl;o|;riGZFEd`q zTu*!)*7k9fx{lwCJl1siUGA|1w5z-QUP9V60$GxQq|R2b(xD1Y!?h!{HZ5 zJYmD=_Aj#Y7}6hF2WsJlI0DfgP>9h<8xETdIR>zC;DOlU1KxuS0QvIe(-bIBK#BK| zQwDqu^v5Q|FTgkCyHNl-Pv*LtdW<3cq4jkw_=qELO+bu`I{v|$TVymczdbTum%o!s zByByuHH*%PAs%Af-{`&o|4r&Gx!;7;p{5*T$m@KtW|J0t#1SylUm)Rgm3Tz|siMz7 ztSp)!_Js}rh{s{;bnV(TJcfndMvfUDWKOj7h0*Ww8ulP-x6$!(uO4g*z8?mVla0N{ z+QYB0FlNeJch)G$wTGr2qdJeKgCl4y>Fy%_2UhCb6XR3HWON)c8S=6LXo(IdS4-Fa zVO*Ej$mL`%mo)=2cRaqt^eFaLs#q6xjUV5a|WbL=xSPYZ3tF)1K?Yo&<)%Ly2!1$2bDd|McR zrXE@-C+RMa;<}ms-xj@fdlMP`lZgkiXyK$d-W6c}z@qpR60ZrhN|G0WgLH3c!{$m-vYR zXcH&^T1mQv$9RmNl4!gMqW6+F@GAqK|g5aZSA6On-rdcvwCc{jEjc zZ3LtdK&%+R#$YbVT>x{+zt>kN7(CnHd9S445%s#()_EA28q>5fPt^AG*Kmj9&>OIgfO_(;Y8$ z&ovPmkV+Hjd4v~yI=&YW{jDm%Lx814PVrZisumXMgeL)*QiT139hgS|w&`jC#0ZH+ z#@9mIh-EGofZsy?qtQ80LwFF+l@%~pfb@Isi~pYpcr75l7TWem03SWSB;YRr`0$kk zL>ey^_aqRIQb2P7vjm(L@HLm0qVfI$<_Lg?>01JQH0QeZ_bTFeM!>fe+n_J>sfqx- zIM80__do$}1$=9TJ_QP>A|R!j2gEsg4*mc~-(ufIx0FKP=wox8{-Ym|k#C9TMR)WT z`iO2T3l7B5S^zo{JrQYPe;(GvA3AhMvt!2&4SS`rpP9F}x3WhS`v9=UC7u`bI%6Ar zpI!jt1iI2-VZ9G~HnOIf{kYh>j5Xlwd&K%q_6Oqox_mc??J?b{mvzt7!#;(&`+3ku_<=o3_@8yIYTU5qm2X=h53yB{LDonkXY4tp zZ$BN@U9;Xg65hj>mG-<|o0c`$7cN{-`Y7p+tn>d5Km4HV(ZhGM*e{&*zkKfzJg9Mi zPGEg-B(yLIJ@lRR=j;i@{u+k*P8;BdNb01|MtvFhp6|t~`$ON+d+b~M?Afyj?Pd%B z59<5*pS8{xFJ6prZ*)$eyZlZSbkMDbbLh@~>Fh-lQ~k>r=j7xRp&sObJ^sM0u6|)` zWPiubojXT(hP~j%jvX7FE{8vZyu1)A%D$lMkoU+6 ze8b+5>gRs``RB+U`{Z}{349`h=oUlr4&B*@mU?4ztii5R^BQ^{U1zL7ucJqgDr16t z7Q8iYj!SKNfxqChojZ3bI#qY<0k^!LzOx@c-&JHSc5D{(nOdLoKl;sBK`$`oOWJcp zhR_L7DSU^A{b$wntKZ50@FsMp?{QHM9z3Y2R;^liUl`x9fmWi_4f@IOFk|SvdGi#$BBsFi^bF}b#yIweW?YF&U1usD z@Cng(jA!tJi;If}+YVq~cl7+MS+f**hv)Ul1~}jwQhe8)@kAfpd5+)Er}$2h__C%p z|FhhOo<~O^@A~K}`P$eKy2B@t?Wg})Iuyl9&`;=jbRF^zy^Zx%_cwGMyak^jcVBBk z&!g+0qZ$YBM8=F6m9dO{L8Xlc&vV|RM-N5cvPaU_UeNRCI^^X#)@x9jD$TsvE%V` zXU?3d$hAJ(4;&!>=y~2F3v{RN#EK-&;2Ufx?$eF6%jZ7V5q@63e!a54KQU7&2gKm7oz>p7%ZNvD^7$@~SJPyx8ciDIF1pd$!_|9wBu2uN!bM;r&Lu`k=8~MHu zKCqpgUHCXA`Pq~seE~<_?^Ta(J{~^t_yV_?+y+QpTvJ? zCvD1*A%ilOLtC!t<9qPKIDju>$eu?A&~?bWw1;(Z$#}thA~-~L;u;6EY5Vr=dTGn| z@lKvRso;lpkn_Pe&9Los+g-C}O(l*W8NJZ+=sM&bp4WX3=immL0bNPVH7<+4zrUtc zt5y-(0ey(i^1V8BJd=1FV<6u@s8gp-glFKN<;#~x+Em6k-ifY5-r+A@93UIWT>0|l zHA|N+Rpv+{eQ`8z*u8tVLJQdj_^)*7(njYOiB-TG@)?fImGg~bQww$kctqZ*Q~fUa zKe$1ka35n+TomU27_VfVjB8DrG%;EgF=^tsYW^iQ7S;Jb^gOx_d57l>=|t=ZV)W># z*tU@v?`7XPGWMA=kITO3+$-B0o&JMl^gOx_c~{#7>NbIA>OybCc8rX9ezo6*?DH*N zV+9?C&Qy;Bv@f!GQ+@A5ucGJCb;!FueE=@N4Ryc=u_+7WGB9pQd{aNVjB&vbuMwXo zMl7G<$hQud&x=k02k3cpoo*aST?c%CET9i!%SK{+W4>Qq4|wJqN6h^}Yjp_}d1%bp zGC!q$rd+vl$}{SFqxwI6qHpw3ty|RfNSz3-z*$V~1I9D_8MXeQZsxlf&-msK<34iA zxAMq~tWu>)gue4EI+Jf|#8zq|5D#e zp2Sb&yKuw^VymEc=ofr|Ea;;P?SSth=|6p@@8kd)3^XG{@b}cIQ#x7+)saT3i1JV9U-TUQqdtg4|3UjD0>}X-7dX;Fec1ivbK=uL zWBfk&4S6G`k8i;E{}mL1&E$TQ15PfuNd=tZ>)^+t8<8;y;0Ioh4ZUkpW1@c(iDG{V zAorg&05~V;f$ycT)&qk~SsN&hWd+O>@V%^mVXaRkF;0aSao$|O_p<&8ofly}q&QD0 zpo)M%0j!hy)(U+J6i`J#g!OMQfw=ZvuYc6R0sMiCV6?|>QmuI5XD;YU^%U>Ee^Xyg0gDECQ7=%GE=9xXqd zn*YWZ3`n~8erS-T_83mTpbyt=wEI|8k#uLD2zvo80xab|5qTruCqnR*rGV4|90ZIK za8dyK+I{XqoreTW5Ku-yasiBGqDP+=t_w&cpooAK0{#=giv_XIQ%KwFhQa1=nFxE?GZz8BgEo)gglafGL! z3w`@q3OoXzBdf>-yaj#q7W`RqmYDZrT?s%8`0m}iaT3GP+lYu4;csLVJ%el`AD6ErWC~p7BOO0IM9n${?XA%tf{pc450qCbs za8E3OIm7PVyDQ&|ht>1}dFJFukSh_BKG1Gxx@gfNjhB~K1R$obr_kn60?@G$^bN5P z;z6wKQpZM#|B?GdjEtNB*&lMA$b*dT{s^?4Jb30o)bHi}#NUY1>M6AOqyWZ=2!**y za@A!_lXsGDPJRySRXsgDm3hldnKFgiiGvlG_jROWQ$IKY?; z-B>HB`yA(0s#HnIB}H7#++zn5Uypx^3q^*01{b z_!!LHlWmFa5jz5#fI8UY0bNbo(39{H>j#*B)omN++(W(?N8R6PJ9BaS_wNtSwT*5Y zO?eJ}rXQ?fMn9tC(KF1Sq6@(&One3tjM~3w zwnGo>BwZQ*lKntd;dk05>44m$r=cm}-FcIJQ?)94dx zQqiH@7vGB1GvHtHJ9ww<*dN%|>^VT;-uTo9cme%xNJr9kxi*{mVE6}K`@9*%sLR*LD*Ucb#_0q87I}5py|GcS6NvlBw&6o^ z&VDxVE4ZRQ{2I0WZ_IzEPw+cDqbo0*legm&OST+xmpgZErTx5{v538Ebc?S4#eN3p zCPRh3^Nc<}0J|K&j5S0twWX;;#;wR-!Vl0_&`rb@C0`@Ak@@e?4t|Gcbm>4JYS*qE z<37N{(m%y_G!%aTpXgC}FESdL{|+7`|G_izS;?!h(FbHr>O0m5u{KN{yOOj(9*{{{ zH}MdB9#aak3cu^~<<)(Nj!eVr{EZyBsKh{N8~hH> z=%WLDi;he)Ub5~?uJIt2#du14$?;>~HT*9*p3+a&s_)&qH_GEFvTCdk@R+pyB<^&M zdSjr(P>37KI2>(+muNF%ff`?|WniqsUXD&N)(2$VK>V4iXgfwqg!nl>Fy>%4vKC&_ zLGqLOh@7wwDRLW0UMH_LSm*=eHgRwEYf*y%okp99{WAxk*Qr3ikPFYdSo=j=!8-z|rO2>8y`=X= zv44>{FXq0O17j}i6CM)R;%fo-%sDdm$Q)#00j4Q#abr9v%=I$otK>|HBY6YN34bl~ z*UYsu=Pp!

dhu;F*)>I(>_|Fp8JNa)H0$5%3(IKcIBrV;|@fbXg(*`Jf+PQZA^Q zHlSaSQTQBQkv37+*fdI1;vfJ$^GSY}@_9HL3kzR* zlJLWKWkkZzha!*KQ}ZF}81T?Oq8tT2eK{9+4&s=~!h$@loC2x}2+z|>Z9Gp)(6N|+ z(Exg?EuxIzm8E0ivZJi#WFy&_+OjfVeEk9Cfr4AanT>YR}_t<9$(qPNA+g zU_czf$0z;9eqb)1{a&yq49(x^yf-SR)Cs+z33v%F%!!ht!Fn`&SYoaC>iCZaY^LyM z)&FoW?Z$ov^w>o38hoJ?>{N0Z@F|EhVk2XNV;d5?#+M*|V@kmX!aujOvs0eqS^N{7 z5`oY0+nHabZfxsGlO`!^(|Jz%H258n?W0QF#P`%|?byQ%e@3T7kg*##ZYVgX-?Uxg z8e5YXKJ0>D$egC3f}P8HVs+ibT(C_e^8?^D=nc+UldmrL5v<)Ju0&h(73#*OSNkRS zRQNf%u`_+o;~&#M=skM$=m@sI+#{Ob>5FcmZsJ^O|BZed@v(GYq3|ekiSQcn5prXY zLG~FTh6DcLC-(AJ7wRUKqF(zBy=kW@{Z_vV8G~1;3($>4!kfg1WIThqiGi#8O&iHy zi;UjtdgcG{9PK844i4xO`|L1hPu;W${D3EXANW-Eo9p;;;9T;qd~Z~b=!?C3_bPJ> zypPx+{iY7uKwH@VNZoJr75$EB-G)>4O_r)Gi z>=lQMAs=zoZ`mGr4SIuf`c2*Bkg@LpK7C|*QNG8NBX~p~<70CK;B(1q@Bsa$ZrVj$ zikvAa7pBx<=pNodJd0cazF)!qyv#YOc@27lbNWr)a$PGtYD%osP~FT8k*_B8x8yJS zD`gKpmof&<>9<-g$nisOMYYfuVvREXOdb(9@6e$`INs5}%=fAJ9DLDlsUJ9UZY*Z6 zuWiKUz$?#Vf6zB{81#i6^q;*^h_UDva8AEv8^8x~U%ts=YLVj~;}?BY7jgD_2tZ|+dy5^spd)AWMHqA2sRL7E%qjL5tpStX-^Ozgda^Q;G8z7@i1)IFx^L~ z`$GbO_7}$M88c=m;~n+U2jm|6k3E^9Vu!<%?1=*}0pL@ooEGQUz!3_v1&-Mlk^Clj zpSj*xF4+9o{`df&_#d%cm%i6gXHh|Cd?0+k&+UJ;6Ll(ns5s((a!#8f_(I}5whML8 zU&a5V{}geKABrysP4I~#$b~qMNs)XGuNC`HE=+QJK6tAoc2dR@Om((WBIhPDeiy8(`iBeaT)* zy7kIub&u4`v)HrDr>pv_duxPq`oXi{nRri+O`pNGP@htOrvQRJ2g41^G+UdUI9rhVH z&E#t1<6{dzD|Mk>p5-0P%W4b!0}m?ep0KTW2mXUT|CGL93#sP!q#PNX57XA8?;zzz X${_Dj_*vi0s%x^%iu?){5u@^d8=*0( diff --git a/src/frontend/public/logo.svg b/src/frontend/public/logo.svg new file mode 100644 index 0000000..ee8d0e6 --- /dev/null +++ b/src/frontend/public/logo.svg @@ -0,0 +1,8 @@ + + + + From cd5f270e2329c4b75043b9c2a3675d8ee7d4fca6 Mon Sep 17 00:00:00 2001 From: ChrisItisdud Date: Sun, 24 Sep 2023 20:13:00 +0200 Subject: [PATCH 4/5] finalise docs --- assets/settings.jpg | Bin 89452 -> 92841 bytes docs/generate_docs.py | 1 - 2 files changed, 1 deletion(-) diff --git a/assets/settings.jpg b/assets/settings.jpg index a5e665ff0d33fb3790a1611687b178364fa02fc9..3fc058ec03266a9b8b7322681f783d00891b5a64 100644 GIT binary patch literal 92841 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ƺozS7XT9hx}lsmBye0Pr0= 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�Exf82m*Xst`tY71L1A!# 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 qi^+ezXaAQY)N1D Date: Sun, 24 Sep 2023 20:18:30 +0200 Subject: [PATCH 5/5] chore: remove d.ts --- src/frontend/vue-i18n.d.ts | 4296 ------------------------------------ 1 file changed, 4296 deletions(-) delete mode 100644 src/frontend/vue-i18n.d.ts diff --git a/src/frontend/vue-i18n.d.ts b/src/frontend/vue-i18n.d.ts deleted file mode 100644 index 7d02f25..0000000 --- a/src/frontend/vue-i18n.d.ts +++ /dev/null @@ -1,4296 +0,0 @@ -import type { App } from 'vue'; -import type { ComponentInternalInstance } from 'vue'; -import type { ComputedRef } from 'vue'; -import { DateTimeOptions } from '@intlify/core-base'; -import { FallbackLocale } from '@intlify/core-base'; -import type { FallbackLocales } from '@intlify/core-base'; -import { InjectionKey } from 'vue'; -import { DateTimeFormat as IntlDateTimeFormat } from '@intlify/core-base'; -import { DateTimeFormats as IntlDateTimeFormats } from '@intlify/core-base'; -import { FormatMatcher as IntlFormatMatcher } from '@intlify/core-base'; -import { LocaleMatcher as IntlLocaleMatcher } from '@intlify/core-base'; -import { NumberFormat as IntlNumberFormat } from '@intlify/core-base'; -import { NumberFormats as IntlNumberFormats } from '@intlify/core-base'; -import { IsEmptyObject } from '@intlify/core-base'; -import { IsNever } from '@intlify/core-base'; -import { LinkedModifiers } from '@intlify/core-base'; -import { Locale } from '@intlify/core-base'; -import type { LocaleMessage } from '@intlify/core-base'; -import { LocaleMessageDictionary } from '@intlify/core-base'; -import { LocaleMessages } from '@intlify/core-base'; -import { LocaleMessageType } from '@intlify/core-base'; -import { LocaleMessageValue } from '@intlify/core-base'; -import type { LocaleParams } from '@intlify/core-base'; -import { MessageFunction } from '@intlify/core-base'; -import { MessageFunctions } from '@intlify/core-base'; -import type { MessageResolver } from '@intlify/core-base'; -import { NamedValue } from '@intlify/core-base'; -import { NumberOptions } from '@intlify/core-base'; -import type { ObjectDirective } from 'vue'; -import { Path } from '@intlify/core-base'; -import { PathValue } from '@intlify/core-base'; -import type { PickupFormatKeys } from '@intlify/core-base'; -import { PickupFormatPathKeys } from '@intlify/core-base'; -import { PickupKeys } from '@intlify/core-base'; -import type { PickupLocales } from '@intlify/core-base'; -import { PickupPaths } from '@intlify/core-base'; -import { PluralizationRule } from '@intlify/core-base'; -import type { PluralizationRules } from '@intlify/core-base'; -import { PostTranslationHandler } from '@intlify/core-base'; -import type { RemoveIndexSignature } from '@intlify/core-base'; -import type { ResourcePath } from '@intlify/core-base'; -import type { ResourceValue } from '@intlify/core-base'; -import type { SchemaParams } from '@intlify/core-base'; -import { TranslateOptions } from '@intlify/core-base'; -import type { VNode } from 'vue'; -import type { WritableComputedRef } from 'vue'; - -/** - * BaseFormat Props for Components that is offered Vue I18n - * - * @remarks - * The interface definitions of the underlying props of components such as Translation, DatetimeFormat, and NumberFormat. - * - * @VueI18nComponent - */ -export declare interface BaseFormatProps { - /** - * @remarks - * Used to wrap the content that is distribute in the slot. If omitted, the slot content is treated as Fragments. - * - * You can specify a string-based tag name, such as `p`, or the object for which the component is defined. - */ - tag?: string | object; - /** - * @remarks - * Specifies the locale to be used for the component. - * - * If specified, the global scope or the locale of the parent scope of the target component will not be overridden and the specified locale will be used. - */ - locale?: Locale; - /** - * @remarks - * Specifies the scope to be used in the target component. - * - * You can specify either `global` or `parent`. - * - * If `global` is specified, global scope is used, else then `parent` is specified, the scope of the parent of the target component is used. - * - * If the parent is a global scope, the global scope is used, if it's a local scope, the local scope is used. - */ - scope?: ComponetI18nScope; - /** - * @remarks - * A composer instance with an existing scope. - * - * This option takes precedence over the `scope` option. - */ - i18n?: Composer; -} - -/** - * Cast to VueI18n legacy compatible type - * - * @remarks - * This API is provided only with [vue-i18n-bridge](https://vue-i18n.intlify.dev/guide/migration/ways.html#what-is-vue-i18n-bridge). - * - * The purpose of this function is to convert an {@link I18n} instance created with {@link createI18n | createI18n(legacy: true)} into a `vue-i18n@v8.x` compatible instance of `new VueI18n` in a TypeScript environment. - * - * @param i18n - An instance of {@link I18n} - * @returns A i18n instance which is casted to {@link VueI18n} type - * - * @VueI18nTip - * :new: provided by **vue-i18n-bridge only** - * - * @VueI18nGeneral - */ -export declare const castToVueI18n: (i18n: I18n) => VueI18n<{}, {}, {}, string, never, string, Composer<{}, {}, {}, string, never, string>> & { - install: (Vue: any, options?: any) => void; -}; - -export declare type Choice = number; - -export declare type ComponentInstanceCreatedListener = (target: VueI18n, global: VueI18n) => void; - -export declare type ComponetI18nScope = Exclude; - -/** - * Composer interfaces - * - * @remarks - * This is the interface for being used for Vue 3 Composition API. - * - * @VueI18nComposition - */ -export declare interface Composer> | PickupLocales> | PickupLocales>, Locales = OptionLocale extends Locale ? [ResourceLocales] extends [never] ? Locale : ResourceLocales : OptionLocale | ResourceLocales> extends ComposerCustom { - /** - * @remarks - * Instance ID. - */ - id: number; - /** - * @remarks - * The current locale this Composer instance is using. - * - * If the locale contains a territory and a dialect, this locale contains an implicit fallback. - * - * @VueI18nSee [Scope and Locale Changing](../guide/essentials/scope) - */ - locale: WritableComputedRef; - /** - * @remarks - * The current fallback locales this Composer instance is using. - * - * @VueI18nSee [Fallbacking](../guide/essentials/fallback) - */ - fallbackLocale: WritableComputedRef>; - /** - * @remarks - * Whether inherit the root level locale to the component localization locale. - * - * @VueI18nSee [Local Scope](../guide/essentials/scope#local-scope-2) - */ - inheritLocale: boolean; - /** - * @remarks - * The list of available locales in `messages` in lexical order. - */ - readonly availableLocales: Locales[]; - /** - * @remarks - * The locale messages of localization. - * - * @VueI18nSee [Getting Started](../guide/) - */ - readonly messages: ComputedRef<{ - [K in keyof Messages]: Messages[K]; - }>; - /** - * @remarks - * The datetime formats of localization. - * - * @VueI18nSee [Datetime Formatting](../guide/essentials/datetime) - */ - readonly datetimeFormats: ComputedRef<{ - [K in keyof DateTimeFormats]: DateTimeFormats[K]; - }>; - /** - * @remarks - * The number formats of localization. - * - * @VueI18nSee [Number Formatting](../guide/essentials/number) - */ - readonly numberFormats: ComputedRef<{ - [K in keyof NumberFormats]: NumberFormats[K]; - }>; - /** - * @remarks - * Custom Modifiers for linked messages. - * - * @VueI18nSee [Custom Modifiers](../guide/essentials/syntax#custom-modifiers) - */ - readonly modifiers: LinkedModifiers; - /** - * @remarks - * A set of rules for word pluralization - * - * @VueI18nSee [Custom Pluralization](../guide/essentials/pluralization#custom-pluralization) - */ - readonly pluralRules: PluralizationRules; - /** - * @remarks - * Whether this composer instance is global or not - */ - readonly isGlobal: boolean; - /** - * @remarks - * Whether suppress warnings outputted when localization fails. - * - * @VueI18nSee [Fallbacking](../guide/essentials/fallback) - */ - missingWarn: boolean | RegExp; - /** - * @remarks - * Whether suppress fall back warnings when localization fails. - * - * @VueI18nSee [Fallbacking](../guide/essentials/fallback) - */ - fallbackWarn: boolean | RegExp; - /** - * @remarks - * Whether to fall back to root level (global scope) localization when localization fails. - * - * @VueI18nSee [Fallbacking](../guide/essentials/fallback) - */ - fallbackRoot: boolean; - /** - * @remarks - * Whether suppress warnings when falling back to either `fallbackLocale` or root. - * - * @VueI18nSee [Fallbacking](../guide/essentials/fallback) - */ - fallbackFormat: boolean; - /** - * @remarks - * Whether to allow the use locale messages of HTML formatting. - * - * If you set `false`, will check the locale messages on the Composer instance. - * - * If you are specified `true`, a warning will be output at console. - * - * @VueI18nSee [HTML Message](../guide/essentials/syntax#html-message) - * @VueI18nSee [Change `warnHtmlInMessage` option default value](../guide/migration/breaking#change-warnhtmlinmessage-option-default-value) - */ - warnHtmlMessage: boolean; - /** - * @remarks - * Whether interpolation parameters are escaped before the message is translated. - * - * @VueI18nSee [HTML Message](../guide/essentials/syntax#html-message) - */ - escapeParameter: boolean; - /** - * Locale message translation - * - * @remarks - * About details functions, See the {@link ComposerTranslation} - */ - t: ComposerTranslation>; - /** - * Resolve locale message translation - * - * @remarks - * About details functions, See the {@link ComposerResolveLocaleMessageTranslation} - */ - rt: ComposerResolveLocaleMessageTranslation; - /** - * Datetime formatting - * - * @remarks - * About details functions, See the {@link ComposerDateTimeFormatting} - */ - d: ComposerDateTimeFormatting>; - /** - * Number Formatting - * - * @remarks - * About details functions, See the {@link ComposerNumberFormatting} - */ - n: ComposerNumberFormatting>; - /** - * Translation locale message exist - * - * @remarks - * whether do exist locale message on Composer instance [messages](composition#messages). - * - * If you specified `locale`, check the locale messages of `locale`. - * - * @param key - A target locale message key - * @param locale - A locale, it will be used over than global scope or local scope - * - * @returns If found locale message, `true`, else `false` - */ - te = PickupKeys>(key: Str | Key, locale?: Locales): boolean; - /** - * Locale messages getter - * - * @remarks - * If [UseI18nScope](general#usei18nscope) `'local'` or Some [UseI18nOptions](composition#usei18noptions) are specified at `useI18n`, it’s translated in preferentially local scope locale messages than global scope locale messages. - * - * Based on the current `locale`, locale messages will be returned from Composer instance messages. - * - * If you change the `locale`, the locale messages returned will also correspond to the locale. - * - * If there are no locale messages for the given `key` in the composer instance messages, they will be returned with [fallbacking](../guide/essentials/fallback). - * - * @VueI18nWarning - * You need to use `rt` for the locale message returned by `tm`. see the [rt](composition#rt-message) details. - * - * @example - * template block: - * ```html - *

- * - *
- * ``` - * script block: - * ```js - * import { defineComponent } from 'vue - * import { useI18n } from 'vue-i18n' - * - * export default defineComponent({ - * setup() { - * const { rt, tm } = useI18n({ - * messages: { - * en: { - * contents: [ - * { - * title: 'Title1', - * // ... - * paragraphs: [ - * // ... - * ] - * } - * ] - * } - * } - * // ... - * }) - * // ... - * return { ... , rt, tm } - * } - * }) - * ``` - * - * @param key - A target locale message key - * - * @return Locale messages - */ - tm = PickupKeys, Locale extends PickupLocales> = PickupLocales>, Target = IsEmptyObject extends false ? NonNullable[Locale] : RemoveIndexSignature<{ - [K in keyof DefineLocaleMessage]: DefineLocaleMessage[K]; - }>, Return = ResourceKeys extends ResourcePath ? ResourceValue : Record>(key: Key | ResourceKeys): Return; - /** - * Get locale message - * - * @remarks - * get locale message from Composer instance [messages](composition#messages). - * - * @param locale - A target locale - * - * @typeParam MessageSchema - The locale message schema, default `never` - * - * @returns Locale messages - */ - getLocaleMessage = never, LocaleSchema extends string = string, Locale extends PickupLocales> = PickupLocales>, Return = IsNever extends true ? IsEmptyObject extends true ? RemoveIndexSignature<{ - [K in keyof DefineLocaleMessage]: DefineLocaleMessage[K]; - }> : NonNullable[Locale] : MessageSchema>(locale: LocaleSchema | Locale): Return; - /** - * Set locale message - * - * @remarks - * Set locale message to Composer instance [messages](composition#messages). - * - * @param locale - A target locale - * @param message - A message - * - * @typeParam MessageSchema - The locale message schema, default `never` - */ - setLocaleMessage = never, LocaleSchema extends string = string, Locale extends PickupLocales> = PickupLocales>, MessageType = IsNever extends true ? IsEmptyObject extends true ? RemoveIndexSignature<{ - [K in keyof DefineLocaleMessage]: DefineLocaleMessage[K]; - }> : NonNullable[Locale] : MessageSchema, Message extends MessageType = MessageType>(locale: LocaleSchema | Locale, message: Message): void; - /** - * Merge locale message - * - * @remarks - * Merge locale message to Composer instance [messages](composition#messages). - * - * @param locale - A target locale - * @param message - A message - * - * @typeParam MessageSchema - The locale message schema, default `never` - */ - mergeLocaleMessage = never, LocaleSchema extends string = string, Locale extends PickupLocales> = PickupLocales>, Message = IsNever extends true ? Record : MessageSchema>(locale: LocaleSchema | Locale, message: Message): void; - /** - * Get datetime format - * - * @remarks - * get datetime format from Composer instance [datetimeFormats](composition#datetimeformats). - * - * @param locale - A target locale - * - * @typeParam DateTimeSchema - The datetime format schema, default `never` - * - * @returns Datetime format - */ - getDateTimeFormat = never, LocaleSchema extends string = string, Locale extends PickupLocales> = PickupLocales>, Return = IsNever extends true ? IsEmptyObject extends true ? RemoveIndexSignature<{ - [K in keyof DefineDateTimeFormat]: DefineDateTimeFormat[K]; - }> : NonNullable[Locale] : DateTimeSchema>(locale: LocaleSchema | Locale): Return; - /** - * Set datetime format - * - * @remarks - * Set datetime format to Composer instance [datetimeFormats](composition#datetimeformats). - * - * @param locale - A target locale - * @param format - A target datetime format - * - * @typeParam DateTimeSchema - The datetime format schema, default `never` - */ - setDateTimeFormat = never, LocaleSchema extends string = string, Locale extends PickupLocales> = PickupLocales>, FormatsType = IsNever extends true ? IsEmptyObject extends true ? RemoveIndexSignature<{ - [K in keyof DefineDateTimeFormat]: DefineDateTimeFormat[K]; - }> : NonNullable[Locale] : DateTimeSchema, Formats extends FormatsType = FormatsType>(locale: LocaleSchema | Locale, format: Formats): void; - /** - * Merge datetime format - * - * @remarks - * Merge datetime format to Composer instance [datetimeFormats](composition#datetimeformats). - * - * @param locale - A target locale - * @param format - A target datetime format - * - * @typeParam DateTimeSchema - The datetime format schema, default `never` - */ - mergeDateTimeFormat = never, LocaleSchema extends string = string, Locale extends PickupLocales> = PickupLocales>, Formats = IsNever extends true ? Record : DateTimeSchema>(locale: LocaleSchema | Locale, format: Formats): void; - /** - * Get number format - * - * @remarks - * get number format from Composer instance [numberFormats](composition#numberFormats). - * - * @param locale - A target locale - * - * @typeParam NumberSchema - The number format schema, default `never` - * - * @returns Number format - */ - getNumberFormat = never, LocaleSchema extends string = string, Locale extends PickupLocales> = PickupLocales>, Return = IsNever extends true ? IsEmptyObject extends true ? RemoveIndexSignature<{ - [K in keyof DefineNumberFormat]: DefineNumberFormat[K]; - }> : NonNullable[Locale] : NumberSchema>(locale: LocaleSchema | Locale): Return; - /** - * Set number format - * - * @remarks - * Set number format to Composer instance [numberFormats](composition#numberFormats). - * - * @param locale - A target locale - * @param format - A target number format - * - * @typeParam NumberSchema - The number format schema, default `never` - */ - setNumberFormat = never, LocaleSchema extends string = string, Locale extends PickupLocales> = PickupLocales>, FormatsType = IsNever extends true ? IsEmptyObject extends true ? RemoveIndexSignature<{ - [K in keyof DefineNumberFormat]: DefineNumberFormat[K]; - }> : NonNullable[Locale] : NumberSchema, Formats extends FormatsType = FormatsType>(locale: LocaleSchema | Locale, format: Formats): void; - /** - * Merge number format - * - * @remarks - * Merge number format to Composer instance [numberFormats](composition#numberFormats). - * - * @param locale - A target locale - * @param format - A target number format - * - * @typeParam NumberSchema - The number format schema, default `never` - */ - mergeNumberFormat = never, LocaleSchema extends string = string, Locale extends PickupLocales> = PickupLocales>, Formats = IsNever extends true ? Record : NumberSchema>(locale: LocaleSchema | Locale, format: Formats): void; - /** - * Get post translation handler - * - * @returns {@link PostTranslationHandler} - * - * @VueI18nSee [missing](composition#posttranslation) - */ - getPostTranslationHandler(): PostTranslationHandler | null; - /** - * Set post translation handler - * - * @param handler - A {@link PostTranslationHandler} - * - * @VueI18nSee [missing](composition#posttranslation) - */ - setPostTranslationHandler(handler: PostTranslationHandler | null): void; - /** - * Get missing handler - * - * @returns {@link MissingHandler} - * - * @VueI18nSee [missing](composition#missing) - */ - getMissingHandler(): MissingHandler | null; - /** - * Set missing handler - * - * @param handler - A {@link MissingHandler} - * - * @VueI18nSee [missing](composition#missing) - */ - setMissingHandler(handler: MissingHandler | null): void; -} - -/** - * Composer additional options for `useI18n` - * - * @remarks - * `ComposerAdditionalOptions` is extend for {@link ComposerOptions}, so you can specify these options. - * - * @VueI18nSee [useI18n](composition#usei18n) - * - * @VueI18nComposition - */ -export declare interface ComposerAdditionalOptions { - useScope?: I18nScope; -} - -/** - * The type custom definition of Composer - * - * @remarks - * - * The interface that can extend Composer. - * - * The type defined by 3rd party (e.g. nuxt/i18n) - * - * @example - * ```ts - * // vue-i18n.d.ts (`.d.ts` file at your app) - * - * declare module 'vue-i18n' { - * interface ComposerCustom { - * localeCodes: string[] - * } - * } - * ``` - * - * @VueI18nComposition - */ -export declare interface ComposerCustom { -} - -/** - * Datetime formatting functions - * - * @remarks - * This is the interface for {@link Composer} - * - * @VueI18nComposition - */ -export declare interface ComposerDateTimeFormatting = RemovedIndexResources, C = IsEmptyObject extends false ? PickupFormatPathKeys<{ - [K in keyof DefinedDateTimeFormat]: DefinedDateTimeFormat[K]; -}> : never, M = IsEmptyObject extends false ? PickupFormatKeys : never, ResourceKeys extends C | M = IsNever extends false ? IsNever extends false ? C | M : C : IsNever extends false ? M : never> { - /** - * Datetime formatting - * - * @remarks - * If this is used in a reactive context, it will re-evaluate once the locale changes. - * - * If [UseI18nScope](general#usei18nscope) `'local'` or Some [UseI18nOptions](composition#usei18noptions) are specified at `useI18n`, it’s translated in preferentially local scope datetime formats than global scope datetime formats. - * - * If not, then it’s formatted with global scope datetime formats. - * - * @param value - A value, timestamp number or `Date` instance or ISO 8601 string - * - * @returns Formatted value - * - * @VueI18nSee [Datetime formatting](../guide/essentials/datetime) - */ - (value: number | Date | string): string; - /** - * Datetime formatting - * - * @remarks - * Overloaded `d`. About details, see the [call signature](composition#value-number-date-string-string) details. - * - * In this overloaded `d`, format in datetime format for a key registered in datetime formats. - * - * @param value - A value, timestamp number or `Date` instance or ISO 8601 string - * @param keyOrOptions - A key of datetime formats, or additional {@link DateTimeOptions | options} for datetime formatting - * - * @returns Formatted value - */ - (value: Value, keyOrOptions: Key | ResourceKeys | DateTimeOptions): string; - /** - * Datetime formatting - * - * @remarks - * Overloaded `d`. About details, see the [call signature](composition#value-number-date-string-string) details. - * - * In this overloaded `d`, format in datetime format for a key registered in datetime formats at target locale - * - * @param value - A value, timestamp number or `Date` instance or ISO 8601 string - * @param keyOrOptions - A key of datetime formats, or additional {@link DateTimeOptions | options} for datetime formatting - * @param locale - A locale, it will be used over than global scope or local scope. - * - * @returns Formatted value - */ - (value: Value, keyOrOptions: Key | ResourceKeys | DateTimeOptions, locale: Locales): string; -} - -/** - * Number formatting functions - * - * @remarks - * This is the interface for {@link Composer} - * - * @VueI18nComposition - */ -export declare interface ComposerNumberFormatting = RemovedIndexResources, C = IsEmptyObject extends false ? PickupFormatPathKeys<{ - [K in keyof DefinedNumberFormat]: DefinedNumberFormat[K]; -}> : never, M = IsEmptyObject extends false ? PickupFormatKeys : never, ResourceKeys extends C | M = IsNever extends false ? IsNever extends false ? C | M : C : IsNever extends false ? M : never> { - /** - * Number Formatting - * - * @remarks - * If this is used in a reactive context, it will re-evaluate once the locale changes. - * - * If [UseI18nScope](general#usei18nscope) `'local'` or Some [UseI18nOptions](composition#usei18noptions) are specified at `useI18n`, it’s translated in preferentially local scope datetime formats than global scope datetime formats. - * - * If not, then it’s formatted with global scope number formats. - * - * @param value - A number value - * - * @returns Formatted value - * - * @VueI18nSee [Number formatting](../guide/essentials/number) - */ - (value: number): string; - /** - * Number Formatting - * - * @remarks - * Overloaded `n`. About details, see the [call signature](composition#value-number-string) details. - * - * In this overloaded `n`, format in number format for a key registered in number formats. - * - * @param value - A number value - * @param keyOrOptions - A key of number formats, or additional {@link NumberOptions | options} for number formatting - * - * @returns Formatted value - */ - (value: number, keyOrOptions: Key | ResourceKeys | NumberOptions): string; - /** - * Number Formatting - * - * @remarks - * Overloaded `n`. About details, see the [call signature](composition#value-number-string) details. - * - * In this overloaded `n`, format in number format for a key registered in number formats at target locale. - * - * @param value - A number value - * @param keyOrOptions - A key of number formats, or additional {@link NumberOptions | options} for number formatting - * @param locale - A locale, it will be used over than global scope or local scope. - * - * @returns Formatted value - */ - (value: number, keyOrOptions: Key | ResourceKeys | NumberOptions, locale: Locales): string; -} - -/** - * Composer Options - * - * @remarks - * This is options to create composer. - * - * @VueI18nComposition - */ -export declare interface ComposerOptions = LocaleMessages, _DateTimeFormats extends IntlDateTimeFormats = IntlDateTimeFormats, _NumberFormats extends IntlNumberFormats = IntlNumberFormats> { - /** - * @remarks - * The locale of localization. - * - * If the locale contains a territory and a dialect, this locale contains an implicit fallback. - * - * @VueI18nSee [Scope and Locale Changing](../guide/essentials/scope) - * - * @defaultValue `'en-US'` - */ - locale?: Locale; - /** - * @remarks - * The locale of fallback localization. - * - * For more complex fallback definitions see fallback. - * - * @VueI18nSee [Fallbacking](../guide/essentials/fallback) - * - * @defaultValue The default `'en-US'` for the `locale` if it's not specified, or it's `locale` value - */ - fallbackLocale?: FallbackLocale; - /** - * @remarks - * Whether inheritance the root level locale to the component localization locale. - * - * If `false`, regardless of the root level locale, localize for each component locale. - * - * @VueI18nSee [Local Scope](../guide/essentials/scope#local-scope-2) - * - * @defaultValue `true` - */ - inheritLocale?: boolean; - /** - * @remarks - * The locale messages of localization. - * - * @VueI18nSee [Getting Started](../guide/) - * - * @defaultValue `{}` - */ - messages?: { - [K in keyof _Messages]: MessageSchema; - }; - /** - * @remarks - * Allow use flat json messages or not - * - * @defaultValue `false` - */ - flatJson?: boolean; - /** - * @remarks - * The datetime formats of localization. - * - * @VueI18nSee [Datetime Formatting](../guide/essentials/datetime) - * - * @defaultValue `{}` - */ - datetimeFormats?: { - [K in keyof _DateTimeFormats]: DateTimeSchema; - }; - /** - * @remarks - * The number formats of localization. - * - * @VueI18nSee [Number Formatting](../guide/essentials/number) - * - * @defaultValue `{}` - */ - numberFormats?: { - [K in keyof _NumberFormats]: NumberSchema; - }; - /** - * @remarks - * Custom Modifiers for linked messages. - * - * @VueI18nSee [Custom Modifiers](../guide/essentials/syntax#custom-modifiers) - */ - modifiers?: LinkedModifiers; - /** - * @remarks - * A set of rules for word pluralization - * - * @VueI18nSee [Custom Pluralization](../guide/essentials/pluralization#custom-pluralization) - * - * @defaultValue `{}` - */ - pluralRules?: PluralizationRules; - /** - * @remarks - * A handler for localization missing. - * - * The handler gets called with the localization target locale, localization path key, the Vue instance and values. - * - * If missing handler is assigned, and occurred localization missing, it's not warned. - * - * @defaultValue `null` - */ - missing?: MissingHandler; - /** - * @remarks - * Whether suppress warnings outputted when localization fails. - * - * If `false`, suppress localization fail warnings. - * - * If you use regular expression, you can suppress localization fail warnings that it match with translation key (e.g. `t`). - * - * @VueI18nSee [Fallbacking](../guide/essentials/fallback) - * - * @defaultValue `true` - */ - missingWarn?: boolean | RegExp; - /** - * @remarks - * Whether suppress warnings when falling back to either `fallbackLocale` or root. - * - * If `false`, suppress fall back warnings. - * - * If you use regular expression, you can suppress fallback warnings that it match with translation key (e.g. `t`). - * - * @VueI18nSee [Fallbacking](../guide/essentials/fallback) - * - * @defaultValue `true` - */ - fallbackWarn?: boolean | RegExp; - /** - * @remarks - * In the component localization, whether to fallback to root level (global scope) localization when localization fails. - * - * If `false`, it's not fallback to root. - * - * @VueI18nSee [Fallbacking](../guide/essentials/fallback) - * - * @defaultValue `true` - */ - fallbackRoot?: boolean; - /** - * @remarks - * Whether do template interpolation on translation keys when your language lacks a translation for a key. - * - * If `true`, skip writing templates for your "base" language; the keys are your templates. - * - * @VueI18nSee [Fallbacking](../guide/essentials/fallback) - * - * @defaultValue `false` - */ - fallbackFormat?: boolean; - /** - * @remarks - * A handler for post processing of translation. - * - * The handler gets after being called with the `t`. - * - * This handler is useful if you want to filter on translated text such as space trimming. - * - * @defaultValue `null` - */ - postTranslation?: PostTranslationHandler; - /** - * @remarks - * Whether to allow the use locale messages of HTML formatting. - * - * See the warnHtmlMessage property. - * - * @VueI18nSee [HTML Message](../guide/essentials/syntax#html-message) - * @VueI18nSee [Change `warnHtmlInMessage` option default value](../guide/migration/breaking#change-warnhtmlinmessage-option-default-value) - * - * @defaultValue `'off'` - */ - warnHtmlMessage?: boolean; - /** - * @remarks - * If `escapeParameter` is configured as true then interpolation parameters are escaped before the message is translated. - * - * This is useful when translation output is used in `v-html` and the translation resource contains html markup (e.g. around a user provided value). - * - * This usage pattern mostly occurs when passing precomputed text strings into UI components. - * - * The escape process involves replacing the following symbols with their respective HTML character entities: `<`, `>`, `"`, `'`. - * - * Setting `escapeParameter` as true should not break existing functionality but provides a safeguard against a subtle type of XSS attack vectors. - * - * @VueI18nSee [HTML Message](../guide/essentials/syntax#html-message) - * - * @defaultValue `false` - */ - escapeParameter?: boolean; - /** - * @remarks - * A message resolver to resolve [`messages`](composition#messages). - * - * If not specified, the vue-i18n internal message resolver will be used by default. - * - * You need to implement a message resolver yourself that supports the following requirements: - * - * - Resolve the message using the locale message of [`locale`](composition#locale) passed as the first argument of the message resolver, and the path passed as the second argument. - * - * - If the message could not be resolved, you need to return `null`. - * - * - If you will be returned `null`, the message resolver will also be called on fallback if [`fallbackLocale`](composition#fallbacklocale-2) is enabled, so the message will need to be resolved as well. - * - * The message resolver is called indirectly by the following APIs: - * - * - [`t`](composition#t-key) - * - * - [`te`](composition#te-key-locale) - * - * - [`tm`](composition#tm-key) - * - * - [Translation component](component#translation) - * - * @example - * Here is an example of how to set it up using your `createI18n`: - * ```js - * import { createI18n } from 'vue-i18n' - * - * // your message resolver - * function messageResolver(obj, path) { - * // simple message resolving! - * const msg = obj[path] - * return msg != null ? msg : null - * } - * - * // call with I18n option - * const i18n = createI18n({ - * legacy: false, - * locale: 'ja', - * messageResolver, // set your message resolver - * messages: { - * en: { ... }, - * ja: { ... } - * } - * }) - * - * // the below your something to do ... - * // ... - * ``` - * - * @VueI18nTip - * :new: v9.2+ - * - * @VueI18nWarning - * If you use the message resolver, the [`flatJson`](composition#flatjson) setting will be ignored. That is, you need to resolve the flat JSON by yourself. - * - * @VueI18nSee [Fallbacking](../guide/essentials/fallback) - * - * @defaultValue `undefined` - */ - messageResolver?: MessageResolver; -} - -/** - * Resolve locale message translation functions - * - * @remarks - * This is the interface for {@link Composer} - * - * @VueI18nComposition - */ -export declare interface ComposerResolveLocaleMessageTranslation { - /** - * Resolve locale message translation - * - * @remarks - * If this is used in a reactive context, it will re-evaluate once the locale changes. - * - * If [UseI18nScope](general#usei18nscope) `'local'` or Some [UseI18nOptions](composition#usei18noptions) are specified at `useI18n`, it’s translated in preferentially local scope locale messages than global scope locale messages. - * - * If not, then it’s translated with global scope locale messages. - * - * @VueI18nTip - * The use-case for `rt` is for programmatic locale messages translation with using `tm`, `v-for`, javascript `for` statement. - * - * @VueI18nWarning - * `rt` differs from `t` in that it processes the locale message directly, not the key of the locale message. There is no internal fallback with `rt`. You need to understand and use the structure of the locale messge returned by `tm`. - * - * @param message - A target locale message to be resolved. You will need to specify the locale message returned by `tm`. - * - * @returns Translated message - * - * @VueI18nSee [Scope and Locale Changing](../guide/essentials/scope) - */ - (message: MessageFunction | VueMessageType): string; - /** - * Resolve locale message translation for plurals - * - * @remarks - * Overloaded `rt`. About details, see the [call signature](composition#message-messagefunction-message-message-string) details. - * - * In this overloaded `rt`, return a pluralized translation message. - * - * @VueI18nTip - * The use-case for `rt` is for programmatic locale messages translation with using `tm`, `v-for`, javascript `for` statement. - * - * @VueI18nWarning - * `rt` differs from `t` in that it processes the locale message directly, not the key of the locale message. There is no internal fallback with `rt`. You need to understand and use the structure of the locale messge returned by `tm`. - * - * @param message - A target locale message to be resolved. You will need to specify the locale message returned by `tm`. - * @param plural - Which plural string to get. 1 returns the first one. - * @param options - Additional {@link TranslateOptions | options} for translation - * - * @returns Translated message - * - * @VueI18nSee [Pluralization](../guide/essentials/pluralization) - */ - (message: MessageFunction | VueMessageType, plural: number, options?: TranslateOptions): string; - /** - * Resolve locale message translation for list interpolations - * - * @remarks - * Overloaded `rt`. About details, see the [call signature](composition#message-messagefunction-message-message-string) details. - * - * In this overloaded `rt`, return a pluralized translation message. - * - * @VueI18nTip - * The use-case for `rt` is for programmatic locale messages translation with using `tm`, `v-for`, javascript `for` statement. - * - * @VueI18nWarning - * `rt` differs from `t` in that it processes the locale message directly, not the key of the locale message. There is no internal fallback with `rt`. You need to understand and use the structure of the locale messge returned by `tm`. - * - * @param message - A target locale message to be resolved. You will need to specify the locale message returned by `tm`. - * @param list - A values of list interpolation. - * @param options - Additional {@link TranslateOptions | options} for translation - * - * @returns Translated message - * - * @VueI18nSee [List interpolation](../guide/essentials/syntax#list-interpolation) - */ - (message: MessageFunction | VueMessageType, list: unknown[], options?: TranslateOptions): string; - /** - * Resolve locale message translation for named interpolations - * - * @remarks - * Overloaded `rt`. About details, see the [call signature](composition#message-messagefunction-message-message-string) details. - * - * In this overloaded `rt`, for each placeholder x, the locale messages should contain a `{x}` token. - * - * @VueI18nTip - * The use-case for `rt` is for programmatic locale messages translation with using `tm`, `v-for`, javascript `for` statement. - * - * @VueI18nWarning - * `rt` differs from `t` in that it processes the locale message directly, not the key of the locale message. There is no internal fallback with `rt`. You need to understand and use the structure of the locale messge returned by `tm`. - * - * @param message - A target locale message to be resolved. You will need to specify the locale message returned by `tm`. - * @param named - A values of named interpolation. - * @param options - Additional {@link TranslateOptions | options} for translation - * - * @returns Translated message - * - * @VueI18nSee [Named interpolation](../guide/essentials/syntax#named-interpolation) - */ - (message: MessageFunction | VueMessageType, named: NamedValue, options?: TranslateOptions): string; -} - -/** - * Locale message translation functions - * - * @remarks - * This is the interface for {@link Composer} - * - * @VueI18nComposition - */ -export declare interface ComposerTranslation = RemovedIndexResources, C = IsEmptyObject extends false ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K]; -}> : never, M = IsEmptyObject extends false ? PickupKeys : never, ResourceKeys extends C | M = IsNever extends false ? IsNever extends false ? C | M : C : IsNever extends false ? M : never> { - /** - * Locale message translation - * - * @remarks - * If this is used in a reactive context, it will re-evaluate once the locale changes. - * - * If [UseI18nScope](general#usei18nscope) `'local'` or Some [UseI18nOptions](composition#usei18noptions) are specified at `useI18n`, it’s translated in preferentially local scope locale messages than global scope locale messages. - * - * If not, then it’s translated with global scope locale messages. - * - * @param key - A target locale message key - * - * @returns Translated message - * - * @VueI18nSee [Scope and Locale Changing](../guide/essentials/scope) - */ - (key: Key | ResourceKeys | number): string; - /** - * Locale message translation for plurals - * - * @remarks - * Overloaded `t`. About details, see the [call signature](composition#key-key-resourcekeys-number-string) details. - * - * In this overloaded `t`, return a pluralized translation message. - * - * You can also suppress the warning, when the translation missing according to the options. - * - * About details of options, see the {@link TranslateOptions}. - * - * @param key - A target locale message key - * @param plural - Which plural string to get. 1 returns the first one. - * @param options - Additional {@link TranslateOptions | options} for translation - * - * @returns Translated message - * - * @VueI18nSee [Pluralization](../guide/essentials/pluralization) - */ - (key: Key | ResourceKeys | number, plural: number, options?: TranslateOptions): string; - /** - * Locale message translation for missing default message - * - * @remarks - * Overloaded `t`. About details, see the [call signature](composition#key-key-resourcekeys-number-string) details. - * - * In this overloaded `t`, if no translation was found, return a default message. - * - * You can also suppress the warning, when the translation missing according to the options. - * - * About details of options, see the {@link TranslateOptions}. - * - * @param key - A target locale message key - * @param defaultMsg - A default message to return if no translation was found - * @param options - Additional {@link TranslateOptions | options} for translation - * - * @returns Translated message - */ - (key: Key | ResourceKeys | number, defaultMsg: string, options?: TranslateOptions): string; - /** - * Locale message translation for list interpolations - * - * @remarks - * Overloaded `t`. About details, see the [call signature](composition#key-key-resourcekeys-number-string) details. - * - * In this overloaded `t`, the locale messages should contain a `{0}`, `{1}`, … for each placeholder in the list. - * - * You can also suppress the warning, when the translation missing according to the options. - * - * About details of options, see the {@link TranslateOptions}. - * - * @param key - A target locale message key - * @param list - A values of list interpolation - * @param options - Additional {@link TranslateOptions | options} for translation - * - * @returns Translated message - * - * @VueI18nSee [List interpolation](../guide/essentials/syntax#list-interpolation) - */ - (key: Key | ResourceKeys | number, list: unknown[], options?: TranslateOptions): string; - /** - * Locale message translation for list interpolations and plurals - * - * @remarks - * Overloaded `t`. About details, see the [call signature](composition#key-key-resourcekeys-number-string) details. - * - * In this overloaded `t`, the locale messages should contain a `{0}`, `{1}`, … for each placeholder in the list, and return a pluralized translation message. - * - * @param key - A target locale message key - * @param list - A values of list interpolation - * @param plural - Which plural string to get. 1 returns the first one. - * - * @returns Translated message - * - * @VueI18nSee [Pluralization](../guide/essentials/pluralization) - * @VueI18nSee [List interpolation](../guide/essentials/syntax#list-interpolation) - */ - (key: Key | ResourceKeys | number, list: unknown[], plural: number): string; - /** - * Locale message translation for list interpolations and missing default message - * - * @remarks - * Overloaded `t`. About details, see the [call signature](composition#key-key-resourcekeys-number-string) details. - * - * In this overloaded `t`, the locale messages should contain a `{0}`, `{1}`, … for each placeholder in the list, and if no translation was found, return a default message. - * - * @param key - A target locale message key - * @param list - A values of list interpolation - * @param defaultMsg - A default message to return if no translation was found - * - * @returns Translated message - * - * @VueI18nSee [List interpolation](../guide/essentials/syntax#list-interpolation) - */ - (key: Key | ResourceKeys | number, list: unknown[], defaultMsg: string): string; - /** - * Locale message translation for named interpolations - * - * @remarks - * Overloaded `t`. About details, see the [call signature](composition#key-key-resourcekeys-number-string) details. - * - * In this overloaded `t`, for each placeholder x, the locale messages should contain a `{x}` token. - * - * You can also suppress the warning, when the translation missing according to the options. - * - * About details of options, see the {@link TranslateOptions}. - * - * @param key - A target locale message key - * @param named - A values of named interpolation - * @param options - Additional {@link TranslateOptions | options} for translation - * - * @returns Translated message - * - * @VueI18nSee [Named interpolation](../guide/essentials/syntax#named-interpolation) - */ - (key: Key | ResourceKeys | number, named: NamedValue, options?: TranslateOptions): string; - /** - * Locale message translation for named interpolations and plurals - * - * @remarks - * Overloaded `t`. About details, see the [call signature](composition#key-key-resourcekeys-number-string) details. - * - * In this overloaded `t`, for each placeholder x, the locale messages should contain a `{x}` token, and return a pluralized translation message. - * - * @param key - A target locale message key - * @param named - A values of named interpolation - * @param plural - Which plural string to get. 1 returns the first one. - * - * @returns Translated message - * - * @VueI18nSee [Pluralization](../guide/essentials/pluralization) - * @VueI18nSee [Named interpolation](../guide/essentials/syntax#named-interpolation) - */ - (key: Key | ResourceKeys | number, named: NamedValue, plural: number): string; - /** - * Locale message translation for named interpolations and plurals - * - * @remarks - * Overloaded `t`. About details, see the [call signature](composition#key-key-resourcekeys-number-string) details. - * - * In this overloaded `t`, for each placeholder x, the locale messages should contain a `{x}` token, and if no translation was found, return a default message. - * - * @param key - A target locale message key - * @param named - A values of named interpolation - * @param defaultMsg - A default message to return if no translation was found - * - * @returns Translated message - * - * @VueI18nSee [Named interpolation](../guide/essentials/syntax#named-interpolation) - */ - (key: Key | ResourceKeys | number, named: NamedValue, defaultMsg: string): string; -} - -export declare function createI18n(options: Options, LegacyVueI18n?: any): typeof options['legacy'] extends true ? I18n : typeof options['legacy'] extends false ? I18n : I18n; - -/** - * Vue I18n factory - * - * @param options - An options, see the {@link I18nOptions} - * - * @typeParam Schema - The i18n resources (messages, datetimeFormats, numberFormats) schema, default {@link LocaleMessage} - * @typeParam Locales - The locales of i18n resource schema, default `en-US` - * @typeParam Legacy - Whether legacy mode is enabled or disabled, default `true` - * - * @returns {@link I18n} instance - * - * @remarks - * If you use Legacy API mode, you need toto specify {@link VueI18nOptions} and `legacy: true` option. - * - * If you use composition API mode, you need to specify {@link ComposerOptions}. - * - * @VueI18nSee [Getting Started](../guide/) - * @VueI18nSee [Composition API](../guide/advanced/composition) - * - * @example - * case: for Legacy API - * ```js - * import { createApp } from 'vue' - * import { createI18n } from 'vue-i18n' - * - * // call with I18n option - * const i18n = createI18n({ - * locale: 'ja', - * messages: { - * en: { ... }, - * ja: { ... } - * } - * }) - * - * const App = { - * // ... - * } - * - * const app = createApp(App) - * - * // install! - * app.use(i18n) - * app.mount('#app') - * ``` - * - * @example - * case: for composition API - * ```js - * import { createApp } from 'vue' - * import { createI18n, useI18n } from 'vue-i18n' - * - * // call with I18n option - * const i18n = createI18n({ - * legacy: false, // you must specify 'legacy: false' option - * locale: 'ja', - * messages: { - * en: { ... }, - * ja: { ... } - * } - * }) - * - * const App = { - * setup() { - * // ... - * const { t } = useI18n({ ... }) - * return { ... , t } - * } - * } - * - * const app = createApp(App) - * - * // install! - * app.use(i18n) - * app.mount('#app') - * ``` - * - * @VueI18nGeneral - */ -export declare function createI18n, LocaleParams> = I18nOptions, LocaleParams>, Messages = Options['messages'] extends object ? Options['messages'] : {}, DateTimeFormats = Options['datetimeFormats'] extends object ? Options['datetimeFormats'] : {}, NumberFormats = Options['numberFormats'] extends object ? Options['numberFormats'] : {}, OptionLocale = Options['locale'] extends string ? Options['locale'] : Locale>(options: Options, LegacyVueI18n?: any): typeof options['legacy'] extends true ? I18n : typeof options['legacy'] extends false ? I18n : I18n; - -export declare interface CustomBlock { - locale: Locale; - resource: LocaleMessages; -} - -export declare type CustomBlocks = Array>; - -/** - * Datetime Format Component - * - * @remarks - * See the following items for property about details - * - * @VueI18nSee [FormattableProps](component#formattableprops) - * @VueI18nSee [BaseFormatProps](component#baseformatprops) - * @VueI18nSee [Custom Formatting](../guide/essentials/datetime#custom-formatting) - * - * @VueI18nDanger - * Not supported IE, due to no support `Intl.DateTimeFormat#formatToParts` in [IE](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/formatToParts) - * - * If you want to use it, you need to use [polyfill](https://github.com/formatjs/formatjs/tree/main/packages/intl-datetimeformat) - * - * @VueI18nComponent - */ -export declare const DatetimeFormat: { - name: string; - props: { - value: { - type: (NumberConstructor | DateConstructor)[]; - required: boolean; - }; - format: { - type: (ObjectConstructor | StringConstructor)[]; - }; - } & { - tag: { - type: (ObjectConstructor | StringConstructor)[]; - }; - locale: { - type: StringConstructor; - }; - scope: { - type: StringConstructor; - validator: (val: "parent" | "global") => boolean; - default: "parent" | "global"; - }; - i18n: { - type: ObjectConstructor; - }; - }; - setup(props: any, context: any): any; -}; - -/** - * DatetimeFormat Component Props - * - * @VueI18nComponent - */ -export declare type DatetimeFormatProps = FormattableProps; - -/** @VueI18nLegacy */ -export declare type DateTimeFormatResult = string; -export { DateTimeOptions } - -export declare type DefaultDateTimeFormatSchema> = IsEmptyObject extends true ? IntlDateTimeFormat : Schema; - -export declare type DefaultLocaleMessageSchema> = IsEmptyObject extends true ? LocaleMessage : Schema; - -export declare type DefaultNumberFormatSchema> = IsEmptyObject extends true ? IntlNumberFormat : Schema; - -/** - * The type definition of datetime format - * - * @remarks - * The typealias is used to strictly define the type of the Datetime format. - * - * The type defined by this can be used in the global scope. - * - * @example - * ```ts - * // type.d.ts (`.d.ts` file at your app) - * import { DefineDateTimeFormat } from 'vue-i18n' - * - * declare module 'vue-i18n' { - * export interface DefineDateTimeFormat { - * short: { - * hour: 'numeric' - * timezone: string - * } - * } - * } - * ``` - * - * @VueI18nGeneral - */ -export declare interface DefineDateTimeFormat extends IntlDateTimeFormat { -} - -/** - * The type definition of Locale Message - * - * @remarks - * The typealias is used to strictly define the type of the Locale message. - * - * The type defined by this can be used in the global scope. - * - * @example - * ```ts - * // type.d.ts (`.d.ts` file at your app) - * import { DefineLocaleMessage } from 'vue-i18n' - * - * declare module 'vue-i18n' { - * export interface DefineLocaleMessage { - * title: string - * menu: { - * login: string - * } - * } - * } - * ``` - * - * @VueI18nGeneral - */ -export declare interface DefineLocaleMessage extends LocaleMessage { -} - -/** - * The type definition of number format - * - * @remarks - * The typealias is used to strictly define the type of the Number format. - * - * The type defined by this can be used in the global scope. - * - * @example - * ```ts - * // type.d.ts (`.d.ts` file at your app) - * import { DefineNumberFormat } from 'vue-i18n' - * - * declare module 'vue-i18n' { - * export interface DefineNumberFormat { - * currency: { - * style: 'currency' - * currencyDisplay: 'symbol' - * currency: string - * } - * } - * } - * ``` - * - * @VueI18nGeneral - */ -export declare interface DefineNumberFormat extends IntlNumberFormat { -} - -/** - * Exported global composer instance - * - * @remarks - * This interface is the [global composer](general#global) that is provided interface that is injected into each component with `app.config.globalProperties`. - * - * @VueI18nGeneral - */ -export declare interface ExportedGlobalComposer { - /** - * Locale - * - * @remarks - * This property is proxy-like property for `Composer#locale`. About details, see the [Composer#locale](composition#locale) - */ - locale: Locale; - /** - * Fallback locale - * - * @remarks - * This property is proxy-like property for `Composer#fallbackLocale`. About details, see the [Composer#fallbackLocale](composition#fallbacklocale) - */ - fallbackLocale: FallbackLocale; - /** - * Available locales - * - * @remarks - * This property is proxy-like property for `Composer#availableLocales`. About details, see the [Composer#availableLocales](composition#availablelocales) - */ - readonly availableLocales: Locale[]; -} -export { FallbackLocale } - -/** - * Formattable Props - * - * @remarks - * The props used in DatetimeFormat, or NumberFormat component - * - * @VueI18nComponent - */ -export declare interface FormattableProps extends BaseFormatProps { - /** - * @remarks - * The value specified for the target component - */ - value: Value; - /** - * @remarks - * The format to use in the target component. - * - * Specify the format key string or the format as defined by the Intl API in ECMA 402. - */ - format?: string | Format; -} - -export declare interface Formatter { - interpolate(message: string, values: any, path: string): Array | null; -} - -/** - * I18n instance - * - * @remarks - * The instance required for installation as the Vue plugin - * - * @VueI18nGeneral - */ -export declare interface I18n { - /** - * Vue I18n API mode - * - * @remarks - * If you specified `legacy: true` option in `createI18n`, return `legacy`, else `composition` - * - * @defaultValue `'legacy'` - */ - readonly mode: I18nMode; - /** - * The property accessible to the global Composer instance or VueI18n instance - * - * @remarks - * If the [I18n#mode](general#mode) is `'legacy'`, then you can access to a global {@link VueI18n} instance, else then [I18n#mode](general#mode) is `'composition' `, you can access to the global {@link Composer} instance. - * - * An instance of this property is **global scope***. - */ - readonly global: Legacy extends true ? VueI18n : Legacy extends false ? Composer : unknown; - /** - * The property whether or not the Composition API is available - * - * @remarks - * If you specified `allowComposition: true` option in Legacy API mode, return `true`, else `false`. else you use the Composition API mode, this property will always return `true`. - */ - readonly allowComposition: boolean; - /** - * Install entry point - * - * @param app - A target Vue app instance - * @param options - An install options - */ - install(app: App, ...options: unknown[]): void; - /** - * Release global scope resource - */ - dispose(): void; -} - -/** - * I18n Additional Options - * - * @remarks - * Specific options for {@link createI18n} - * - * @VueI18nGeneral - */ -export declare interface I18nAdditionalOptions { - /** - * Whether vue-i18n Legacy API mode use on your Vue App - * - * @remarks - * The default is to use the Legacy API mode. If you want to use the Composition API mode, you need to set it to `false`. - * - * @VueI18nSee [Composition API](../guide/advanced/composition) - * - * @defaultValue `true` - */ - legacy?: boolean; - /** - * Whether to inject global properties & functions into for each component. - * - * @remarks - * If set to `true`, then properties and methods prefixed with `$` are injected into Vue Component. - * - * @VueI18nSee [Implicit with injected properties and functions](../guide/advanced/composition#implicit-with-injected-properties-and-functions) - * @VueI18nSee [ComponentCustomProperties](injection#componentcustomproperties) - * - * @defaultValue `true` - */ - globalInjection?: boolean; - /** - * Whether to allow the Composition API to be used in Legacy API mode. - * - * @remarks - * If this option is enabled, you can use {@link useI18n} in Legacy API mode. This option is supported to support the migration from Legacy API mode to Composition API mode. - * - * @VueI18nWarning Note that the Composition API made available with this option doesn't work on SSR. - * @VueI18nSee [Composition API](../guide/advanced/composition) - * - * @defaultValue `false` - */ - allowComposition?: boolean; -} - -/** - * Injection key for {@link useI18n} - * - * @remarks - * The global injection key for I18n instances with `useI18n`. this injection key is used in Web Components. - * Specify the i18n instance created by {@link createI18n} together with `provide` function. - * - * @VueI18nGeneral - */ -export declare const I18nInjectionKey: InjectionKey | string; - -/** - * Vue I18n API mode - * - * @VueI18nSee [I18n#mode](general#mode) - * - * @VueI18nGeneral - */ -export declare type I18nMode = 'legacy' | 'composition'; - -/** - * I18n Options for `createI18n` - * - * @remarks - * `I18nOptions` is inherited {@link I18nAdditionalOptions}, {@link ComposerOptions} and {@link VueI18nOptions}, - * so you can specify these options. - * - * @VueI18nGeneral - */ -export declare type I18nOptions | VueI18nOptions = ComposerOptions | VueI18nOptions> = I18nAdditionalOptions & Options; - -/** - * Vue I18n plugin options - * - * @remarks - * An options specified when installing Vue I18n as Vue plugin with using `app.use`. - * - * @VueI18nGeneral - */ -export declare interface I18nPluginOptions { - /** - * Whether to use the tag name `i18n` for Translation Component - * - * @remarks - * This option is used for compatibility with Vue I18n v8.x. - * - * If you can't migrate right away, you can temporarily enable this option, and you can work Translation Component. - * - * @defaultValue `false` - */ - useI18nComponentName?: boolean; - /** - * Whether to globally install the components that is offered by Vue I18n - * - * @remarks - * If this option is enabled, the components will be installed globally at `app.use` time. - * - * If you want to install manually in the `import` syntax, you can set it to `false` to install when needed. - * - * @defaultValue `true` - */ - globalInstall?: boolean; -} - -/** - * I18n Scope - * - * @VueI18nSee [ComposerAdditionalOptions#useScope](composition#usescope) - * @VueI18nSee [useI18n](composition#usei18n) - * - * @VueI18nGeneral - */ -export declare type I18nScope = 'local' | 'parent' | 'global'; -export { IntlDateTimeFormat } -export { IntlDateTimeFormats } -export { IntlFormatMatcher } -export { IntlLocaleMatcher } -export { IntlNumberFormat } -export { IntlNumberFormats } -export { IsEmptyObject } -export { IsNever } -export { LinkedModifiers } -export { Locale } -export { LocaleMessageDictionary } - -/** @VueI18nLegacy */ -export declare type LocaleMessageObject = LocaleMessageDictionary; -export { LocaleMessages } -export { LocaleMessageType } -export { LocaleMessageValue } -export { MessageFunction } -export { MessageFunctions } - -/** @VueI18nComposition */ -export declare type MissingHandler = (locale: Locale, key: Path, instance?: ComponentInternalInstance, type?: string) => string | void; -export { NamedValue } - -/** - * Number Format Component - * - * @remarks - * See the following items for property about details - * - * @VueI18nSee [FormattableProps](component#formattableprops) - * @VueI18nSee [BaseFormatProps](component#baseformatprops) - * @VueI18nSee [Custom Formatting](../guide/essentials/number#custom-formatting) - * - * @VueI18nDanger - * Not supported IE, due to no support `Intl.NumberFormat#formatToParts` in [IE](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/formatToParts) - * - * If you want to use it, you need to use [polyfill](https://github.com/formatjs/formatjs/tree/main/packages/intl-numberformat) - * - * @VueI18nComponent - */ -export declare const NumberFormat: { - name: string; - props: { - value: { - type: NumberConstructor; - required: boolean; - }; - format: { - type: (ObjectConstructor | StringConstructor)[]; - }; - } & { - tag: { - type: (ObjectConstructor | StringConstructor)[]; - }; - locale: { - type: StringConstructor; - }; - scope: { - type: StringConstructor; - validator: (val: "parent" | "global") => boolean; - default: "parent" | "global"; - }; - i18n: { - type: ObjectConstructor; - }; - }; - setup(props: any, context: any): any; -}; - -/** - * NumberFormat Component Props - * - * @VueI18nComponent - */ -export declare type NumberFormatProps = FormattableProps; - -/** @VueI18nLegacy */ -export declare type NumberFormatResult = string; -export { NumberOptions } -export { Path } -export { PathValue } -export { PickupFormatPathKeys } -export { PickupKeys } -export { PickupPaths } -export { PluralizationRule } - -export declare type PluralizationRulesMap = { - [locale: string]: PluralizationRule; -}; -export { PostTranslationHandler } - -export declare type RemovedIndexResources = RemoveIndexSignature<{ - [K in keyof T]: T[K]; -}>; -export { TranslateOptions } - -/** @VueI18nLegacy */ -export declare type TranslateResult = string; - -/** - * Translation Component - * - * @remarks - * See the following items for property about details - * - * @VueI18nSee [TranslationProps](component#translationprops) - * @VueI18nSee [BaseFormatProps](component#baseformatprops) - * @VueI18nSee [Component Interpolation](../guide/advanced/component) - * - * @example - * ```html - *
- * - * - * {{ $t('tos') }} - * - * - *
- * ``` - * ```js - * import { createApp } from 'vue' - * import { createI18n } from 'vue-i18n' - * - * const messages = { - * en: { - * tos: 'Term of Service', - * term: 'I accept xxx {0}.' - * }, - * ja: { - * tos: '利用規約', - * term: '私は xxx の{0}に同意します。' - * } - * } - * - * const i18n = createI18n({ - * locale: 'en', - * messages - * }) - * - * const app = createApp({ - * data: { - * url: '/term' - * } - * }).use(i18n).mount('#app') - * ``` - * - * @VueI18nComponent - */ -export declare const Translation: { - name: string; - props: { - keypath: { - type: StringConstructor; - required: boolean; - }; - plural: { - type: (StringConstructor | NumberConstructor)[]; - validator: (val: any) => boolean; - }; - } & { - tag: { - type: (ObjectConstructor | StringConstructor)[]; - }; - locale: { - type: StringConstructor; - }; - scope: { - type: StringConstructor; - validator: (val: "parent" | "global") => boolean; - default: "parent" | "global"; - }; - i18n: { - type: ObjectConstructor; - }; - }; - setup(props: any, context: any): any; -}; - -/** - * Translation Directive (`v-t`) - * - * @remarks - * Update the element `textContent` that localized with locale messages. - * - * You can use string syntax or object syntax. - * - * String syntax can be specified as a keypath of locale messages. - * - * If you can be used object syntax, you need to specify as the object key the following params - * - * ``` - * - path: required, key of locale messages - * - locale: optional, locale - * - args: optional, for list or named formatting - * ``` - * - * @example - * ```html - * - *

- * - * - *

- * - * - *

- * - * - *

- * ``` - * - * @VueI18nDirective - */ -export declare type TranslationDirective = ObjectDirective; - -/** - * Translation Component Props - * - * @VueI18nComponent - */ -export declare interface TranslationProps extends BaseFormatProps { - /** - * @remarks - * The locale message key can be specified prop - */ - keypath: string; - /** - * @remarks - * The Plural Choosing the message number prop - */ - plural?: number | string; -} - -export declare function useI18n(options?: Options): Composer, NonNullable, NonNullable, NonNullable>; - -/** - * Use Composition API for Vue I18n - * - * @param options - An options, see {@link UseI18nOptions} - * - * @typeParam Schema - The i18n resources (messages, datetimeFormats, numberFormats) schema, default {@link LocaleMessage} - * @typeParam Locales - The locales of i18n resource schema, default `en-US` - * - * @returns {@link Composer} instance - * - * @remarks - * This function is mainly used by `setup`. - * - * If options are specified, Composer instance is created for each component and you can be localized on the component. - * - * If options are not specified, you can be localized using the global Composer. - * - * @example - * case: Component resource base localization - * ```html - * - * - * - * ``` - * - * @VueI18nComposition - */ -export declare function useI18n, LocaleParams> = UseI18nOptions, LocaleParams>>(options?: Options): Composer, NonNullable, NonNullable, NonNullable>; - -/** - * I18n Options for `useI18n` - * - * @remarks - * `UseI18nOptions` is inherited {@link ComposerAdditionalOptions} and {@link ComposerOptions}, so you can specify these options. - * - * @VueI18nSee [useI18n](composition#usei18n) - * - * @VueI18nComposition - */ -export declare type UseI18nOptions = ComposerOptions> = ComposerAdditionalOptions & Options; - -/** - * Vue I18n Version - * - * @remarks - * Semver format. Same format as the package.json `version` field. - * - * @VueI18nGeneral - */ -export declare const VERSION: string; - -export declare function vTDirective(i18n: I18n): TranslationDirective; - -/** - * VueI18n legacy interfaces - * - * @remarks - * This interface is compatible with interface of `VueI18n` class (offered with Vue I18n v8.x). - * - * @VueI18nLegacy - */ -export declare interface VueI18n> | PickupLocales> | PickupLocales>, Locales = OptionLocale extends string ? [ResourceLocales] extends [never] ? Locale : ResourceLocales : OptionLocale | ResourceLocales, Composition extends Composer = Composer> { - /** - * @remarks - * Instance ID. - */ - id: number; - /** - * @remarks - * The current locale this VueI18n instance is using. - * - * If the locale contains a territory and a dialect, this locale contains an implicit fallback. - * - * @VueI18nSee [Scope and Locale Changing](../guide/essentials/scope) - */ - locale: Locales; - /** - * @remarks - * The current fallback locales this VueI18n instance is using. - * - * @VueI18nSee [Fallbacking](../guide/essentials/fallback) - */ - fallbackLocale: FallbackLocales; - /** - * @remarks - * The list of available locales in `messages` in lexical order. - */ - readonly availableLocales: Composition['availableLocales']; - /** - * @remarks - * The locale messages of localization. - * - * @VueI18nSee [Getting Started](../guide/) - */ - readonly messages: { - [K in keyof Messages]: Messages[K]; - }; - /** - * @remarks - * The datetime formats of localization. - * - * @VueI18nSee [Datetime Formatting](../guide/essentials/datetime) - */ - readonly datetimeFormats: { - [K in keyof DateTimeFormats]: DateTimeFormats[K]; - }; - /** - * @remarks - * The number formats of localization. - * - * @VueI18nSee [Number Formatting](../guide/essentials/number) - */ - readonly numberFormats: { - [K in keyof NumberFormats]: NumberFormats[K]; - }; - /** - * @remarks - * Custom Modifiers for linked messages. - * - * @VueI18nSee [Custom Modifiers](../guide/essentials/syntax#custom-modifiers) - */ - readonly modifiers: Composition['modifiers']; - /** - * @remarks - * The formatter that implemented with Formatter interface. - * - * @deprecated See the [here](../guide/migration/breaking#remove-custom-formatter) - */ - formatter: Formatter; - /** - * @remarks - * A handler for localization missing. - */ - missing: MissingHandler | null; - /** - * @remarks - * A handler for post processing of translation. - */ - postTranslation: PostTranslationHandler | null; - /** - * @remarks - * Whether suppress warnings outputted when localization fails. - * - * @VueI18nSee [Fallbacking](../guide/essentials/fallback) - */ - silentTranslationWarn: Composition['missingWarn']; - /** - * @remarks - * Whether suppress fallback warnings when localization fails. - */ - silentFallbackWarn: Composition['fallbackWarn']; - /** - * @remarks - * Whether suppress warnings when falling back to either `fallbackLocale` or root. - * - * @VueI18nSee [Fallbacking](../guide/essentials/fallback) - */ - formatFallbackMessages: Composition['fallbackFormat']; - /** - * @remarks - * Whether synchronize the root level locale to the component localization locale. - * - * @VueI18nSee [Local Scope](../guide/essentials/scope#local-scope-2) - */ - sync: Composition['inheritLocale']; - /** - * @remarks - * Whether to allow the use locale messages of HTML formatting. - * - * If you set `warn` or` error`, will check the locale messages on the VueI18n instance. - * - * If you are specified `warn`, a warning will be output at console. - * - * If you are specified `error` will occurred an Error. - * - * @VueI18nSee [HTML Message](../guide/essentials/syntax#html-message) - * @VueI18nSee [Change `warnHtmlInMessage` option default value](../guide/migration/breaking#change-warnhtmlinmessage-option-default-value) - */ - warnHtmlInMessage: WarnHtmlInMessageLevel; - /** - * @remarks - * Whether interpolation parameters are escaped before the message is translated. - * - * @VueI18nSee [HTML Message](../guide/essentials/syntax#html-message) - */ - escapeParameterHtml: Composition['escapeParameter']; - /** - * @remarks - * Whether `v-t` directive's element should preserve `textContent` after directive is unbinded. - * - * @VueI18nSee [Custom Directive](../guide/advanced/directive) - * @VueI18nSee [Remove preserveDirectiveContent option](../guide/migration/breaking#remove-preservedirectivecontent-option) - * - * @deprecated The `v-t` directive for Vue 3 now preserves the default content. Therefore, this option and its properties have been removed from the VueI18n instance. - */ - preserveDirectiveContent: boolean; - /** - * A set of rules for word pluralization - * - * @VueI18nSee [Custom Pluralization](../guide/essentials/pluralization#custom-pluralization) - */ - pluralizationRules: Composition['pluralRules']; - /** - * Locale message translation - * - * @remarks - * About details functions, See the {@link VueI18nTranslation} - */ - t: VueI18nTranslation>; - /** - * Resolve locale message translation - * - * @remarks - * About details functions, See the {@link VueI18nResolveLocaleMessageTranslation} - */ - rt: VueI18nResolveLocaleMessageTranslation; - /** - * Locale message pluralization - * - * @remarks - * About details functions, See the {@link VueI18nTranslationChoice} - */ - tc: VueI18nTranslationChoice>; - /** - * Translation locale message exist - * - * @remarks - * whether do exist locale message on VueI18n instance [messages](legacy#messages). - * - * If you specified `locale`, check the locale messages of `locale`. - * - * @param key - A target locale message key - * @param locale - A target locale - * - * @returns If found locale message, `true`, else `false` - */ - te = PickupKeys>(key: Str | Key, locale?: Locales): boolean; - /** - * Locale messages getter - * - * @remarks - * If [i18n component options](injection#i18n) is specified, it’s get in preferentially local scope locale messages than global scope locale messages. - * - * If [i18n component options](injection#i18n) isn't specified, it’s get with global scope locale messages. - * - * Based on the current `locale`, locale messages will be returned from Composer instance messages. - * - * If you change the `locale`, the locale messages returned will also correspond to the locale. - * - * If there are no locale messages for the given `key` in the composer instance messages, they will be returned with [fallbacking](../guide/essentials/fallback). - * - * @VueI18nWarning - * You need to use `rt` for the locale message returned by `tm`. see the [rt](legacy#rt-message) details. - * - * @example - * template: - * ```html - *
- * - *
- * ``` - * - * ```js - * import { createI18n } from 'vue-i18n' - * - * const i18n = createI18n({ - * messages: { - * en: { - * contents: [ - * { - * title: 'Title1', - * // ... - * paragraphs: [ - * // ... - * ] - * } - * ] - * } - * } - * // ... - * }) - * ``` - * @param key - A target locale message key - * - * @return Locale messages - */ - tm: Composition['tm']; - /** - * Get locale message - * - * @remarks - * get locale message from VueI18n instance [messages](legacy#messages). - * - * @param locale - A target locale - * - * @returns Locale messages - */ - getLocaleMessage: Composition['getLocaleMessage']; - /** - * Set locale message - * - * @remarks - * Set locale message to VueI18n instance [messages](legacy#messages). - * - * @param locale - A target locale - * @param message - A message - */ - setLocaleMessage: Composition['setLocaleMessage']; - /** - * Merge locale message - * - * @remarks - * Merge locale message to VueI18n instance [messages](legacy#messages). - * - * @param locale - A target locale - * @param message - A message - */ - mergeLocaleMessage: Composition['mergeLocaleMessage']; - /** - * Datetime formatting - * - * @remarks - * About details functions, See the {@link VueI18nDateTimeFormatting} - */ - d: VueI18nDateTimeFormatting>; - /** - * Get datetime format - * - * @remarks - * get datetime format from VueI18n instance [datetimeFormats](legacy#datetimeformats). - * - * @param locale - A target locale - * - * @returns Datetime format - */ - getDateTimeFormat: Composition['getDateTimeFormat']; - /** - * Set datetime format - * - * @remarks - * Set datetime format to VueI18n instance [datetimeFormats](legacy#datetimeformats). - * - * @param locale - A target locale - * @param format - A target datetime format - */ - setDateTimeFormat: Composition['setDateTimeFormat']; - /** - * Merge datetime format - * - * @remarks - * Merge datetime format to VueI18n instance [datetimeFormats](legacy#datetimeformats). - * - * @param locale - A target locale - * @param format - A target datetime format - */ - mergeDateTimeFormat: Composition['mergeDateTimeFormat']; - /** - * Number Formatting - * - * @remarks - * About details functions, See the {@link VueI18nNumberFormatting} - */ - n: VueI18nNumberFormatting>; - /** - * Get number format - * - * @remarks - * get number format from VueI18n instance [numberFormats](legacy#numberFormats). - * - * @param locale - A target locale - * - * @returns Number format - */ - getNumberFormat: Composition['getNumberFormat']; - /** - * Set number format - * - * @remarks - * Set number format to VueI18n instance [numberFormats](legacy#numberFormats). - * - * @param locale - A target locale - * @param format - A target number format - */ - setNumberFormat: Composition['setNumberFormat']; - /** - * Merge number format - * - * @remarks - * Merge number format to VueI18n instance [numberFormats](legacy#numberFormats). - * - * @param locale - A target locale - * @param format - A target number format - */ - mergeNumberFormat: Composition['mergeNumberFormat']; - /** - * Get choice index - * - * @remarks - * Get pluralization index for current pluralizing number and a given amount of choices. - * - * @deprecated Use `pluralizationRules` option instead of `getChoiceIndex`. - */ - getChoiceIndex: (choice: Choice, choicesLength: number) => number; -} - -/** - * Datetime formatting functions for VueI18n legacy interfaces - * - * @remarks - * This is the interface for {@link VueI18n} - * - * @VueI18nLegacy - */ -export declare interface VueI18nDateTimeFormatting = RemovedIndexResources, C = IsEmptyObject extends false ? PickupFormatPathKeys<{ - [K in keyof DefinedDateTimeFormat]: DefinedDateTimeFormat[K]; -}> : never, M = IsEmptyObject extends false ? PickupFormatKeys : never, ResourceKeys extends C | M = IsNever extends false ? IsNever extends false ? C | M : C : IsNever extends false ? M : never> { - /** - * Datetime formatting - * - * @remarks - * If this is used in a reactive context, it will re-evaluate once the locale changes. - * - * If [i18n component options](injection#i18n) is specified, it’s formatted in preferentially local scope datetime formats than global scope locale messages. - * - * If [i18n component options](injection#i18n) isn't specified, it’s formatted with global scope datetime formats. - * - * @param value - A value, timestamp number or `Date` instance - * - * @returns Formatted value - * - * @VueI18nSee [Datetime formatting](../guide/essentials/datetime) - */ - (value: number | Date): DateTimeFormatResult; - /** - * Datetime formatting - * - * @remarks - * Overloaded `d`. About details, see the [call signature](legacy#value-number-date-datetimeformatresult) details. - * - * @param value - A value, timestamp number or `Date` instance - * @param key - A key of datetime formats - * - * @returns Formatted value - */ - (value: Value, key: Key | ResourceKeys): DateTimeFormatResult; - /** - * Datetime formatting - * - * @remarks - * Overloaded `d`. About details, see the [call signature](legacy#value-number-date-datetimeformatresult) details. - * - * @param value - A value, timestamp number or `Date` instance - * @param key - A key of datetime formats - * @param locale - A locale, it will be used over than global scope or local scope. - * - * @returns Formatted value - */ - (value: Value, key: Key | ResourceKeys, locale: Locales): DateTimeFormatResult; - /** - * Datetime formatting - * - * @remarks - * Overloaded `d`. About details, see the [call signature](legacy#value-number-date-datetimeformatresult) details. - * - * @param value - A value, timestamp number or `Date` instance - * @param args - An argument values - * - * @returns Formatted value - */ - (value: number | Date, args: { - [key: string]: string | boolean | number; - }): DateTimeFormatResult; -} - -/** - * Number formatting functions for VueI18n legacy interfaces - * - * @remarks - * This is the interface for {@link VueI18n} - * - * @VueI18nLegacy - */ -export declare interface VueI18nNumberFormatting = RemovedIndexResources, C = IsEmptyObject extends false ? PickupFormatPathKeys<{ - [K in keyof DefinedNumberFormat]: DefinedNumberFormat[K]; -}> : never, M = IsEmptyObject extends false ? PickupFormatKeys : never, ResourceKeys extends C | M = IsNever extends false ? IsNever extends false ? C | M : C : IsNever extends false ? M : never> { - /** - * Number formatting - * - * @remarks - * If this is used in a reactive context, it will re-evaluate once the locale changes. - * - * If [i18n component options](injection#i18n) is specified, it’s formatted in preferentially local scope number formats than global scope locale messages. - * - * If [i18n component options](injection#i18n) isn't specified, it’s formatted with global scope number formats. - * - * @param value - A number value - * - * @returns Formatted value - * - * @VueI18nSee [Number formatting](../guide/essentials/number) - */ - (value: number): NumberFormatResult; - /** - * Number formatting - * - * @remarks - * Overloaded `n`. About details, see the [call signature](legacy#value-number-numberformatresult) details. - * - * @param value - A number value - * @param key - A key of number formats - * - * @returns Formatted value - */ - (value: number, key: Key | ResourceKeys): NumberFormatResult; - /** - * Number formatting - * - * @remarks - * Overloaded `n`. About details, see the [call signature](legacy#value-number-numberformatresult) details. - * - * @param value - A number value - * @param key - A key of number formats - * @param locale - A locale, it will be used over than global scope or local scope. - * - * @returns Formatted value - */ - (value: number, key: Key | ResourceKeys, locale: Locales): NumberFormatResult; - /** - * Number formatting - * - * @remarks - * Overloaded `n`. About details, see the [call signature](legacy#value-number-numberformatresult) details. - * - * @param value - A number value - * @param args - An argument values - * - * @returns Formatted value - */ - (value: number, args: { - [key: string]: string | boolean | number; - }): NumberFormatResult; -} - -/** - * VueI18n Options - * - * @remarks - * This option is compatible with `VueI18n` class constructor options (offered with Vue I18n v8.x) - * - * @VueI18nLegacy - */ -export declare interface VueI18nOptions = ComposerOptions> { - /** - * @remarks - * The locale of localization. - * - * If the locale contains a territory and a dialect, this locale contains an implicit fallback. - * - * @VueI18nSee [Scope and Locale Changing](../guide/essentials/scope) - * - * @defaultValue `'en-US'` - */ - locale?: Options['locale']; - /** - * @remarks - * The locale of fallback localization. - * - * For more complex fallback definitions see fallback. - * - * @VueI18nSee [Fallbacking](../guide/essentials/fallback) - * - * @defaultValue The default `'en-US'` for the `locale` if it's not specified, or it's `locale` value - */ - fallbackLocale?: Options['fallbackLocale']; - /** - * @remarks - * The locale messages of localization. - * - * @VueI18nSee [Getting Started](../guide/) - * - * @defaultValue `{}` - */ - messages?: Options['messages']; - /** - * @remarks - * Allow use flat json messages or not - * - * @defaultValue `false` - */ - flatJson?: Options['flatJson']; - /** - * @remarks - * The datetime formats of localization. - * - * @VueI18nSee [Datetime Formatting](../guide/essentials/datetime) - * - * @defaultValue `{}` - */ - datetimeFormats?: Options['datetimeFormats']; - /** - * @remarks - * The number formats of localization. - * - * @VueI18nSee [Number Formatting](../guide/essentials/number) - * - * @defaultValue `{}` - */ - numberFormats?: Options['numberFormats']; - /** - * @remarks - * The list of available locales in messages in lexical order. - * - * @defaultValue `[]` - */ - availableLocales?: Locale[]; - /** - * @remarks - * Custom Modifiers for linked messages. - * - * @VueI18nSee [Custom Modifiers](../guide/essentials/syntax#custom-modifiers) - */ - modifiers?: Options['modifiers']; - /** - * @remarks - * The formatter that implemented with Formatter interface. - * - * @deprecated See the [here](../guide/migration/breaking#remove-custom-formatter) - */ - formatter?: Formatter; - /** - * @remarks - * A handler for localization missing. - * - * The handler gets called with the localization target locale, localization path key, the Vue instance and values. - * - * If missing handler is assigned, and occurred localization missing, it's not warned. - * - * @defaultValue `null` - */ - missing?: Options['missing']; - /** - * @remarks - * In the component localization, whether to fall back to root level (global scope) localization when localization fails. - * - * If `false`, it's not fallback to root. - * - * @VueI18nSee [Fallbacking](../guide/essentials/fallback) - * - * @defaultValue `true` - */ - fallbackRoot?: Options['fallbackRoot']; - /** - * @remarks - * Whether suppress warnings outputted when localization fails. - * - * If `true`, suppress localization fail warnings. - * - * If you use regular expression, you can suppress localization fail warnings that it match with translation key (e.g. `t`). - * - * @VueI18nSee [Fallbacking](../guide/essentials/fallback) - * - * @defaultValue `false` - */ - silentTranslationWarn?: Options['missingWarn']; - /** - * @remarks - * Whether do template interpolation on translation keys when your language lacks a translation for a key. - * - * If `true`, skip writing templates for your "base" language; the keys are your templates. - * - * @VueI18nSee [Fallbacking](../guide/essentials/fallback) - * - * @defaultValue `false` - */ - silentFallbackWarn?: Options['fallbackWarn']; - /** - * @remarks - * Whether suppress warnings when falling back to either `fallbackLocale` or root. - * - * @VueI18nSee [Fallbacking](../guide/essentials/fallback) - * - * @defaultValue `false` - */ - formatFallbackMessages?: Options['fallbackFormat']; - /** - * @remarks - * Whether `v-t` directive's element should preserve `textContent` after directive is unbinded. - * - * @VueI18nSee [Custom Directive](../guide/advanced/directive) - * @VueI18nSee [Remove `preserveDirectiveContent` option](../guide/migration/breaking#remove-preservedirectivecontent-option) - * - * @defaultValue `false` - * - * @deprecated The `v-t` directive for Vue 3 now preserves the default content. Therefore, this option and its properties have been removed from the VueI18n instance. - */ - preserveDirectiveContent?: boolean; - /** - * @remarks - * Whether to allow the use locale messages of HTML formatting. - * - * See the warnHtmlInMessage property. - * - * @VueI18nSee [HTML Message](../guide/essentials/syntax#html-message) - * @VueI18nSee [Change `warnHtmlInMessage` option default value](../guide/migration/breaking#change-warnhtmlinmessage-option-default-value) - * - * @defaultValue `'off'` - */ - warnHtmlInMessage?: WarnHtmlInMessageLevel; - /** - * @remarks - * If `escapeParameterHtml` is configured as true then interpolation parameters are escaped before the message is translated. - * - * This is useful when translation output is used in `v-html` and the translation resource contains html markup (e.g. around a user provided value). - * - * This usage pattern mostly occurs when passing precomputed text strings into UI components. - * - * The escape process involves replacing the following symbols with their respective HTML character entities: `<`, `>`, `"`, `'`. - * - * Setting `escapeParameterHtml` as true should not break existing functionality but provides a safeguard against a subtle type of XSS attack vectors. - * - * @VueI18nSee [HTML Message](../guide/essentials/syntax#html-message) - * - * @defaultValue `false` - */ - escapeParameterHtml?: Options['escapeParameter']; - /** - * @remarks - * The shared locale messages of localization for components. More detail see Component based localization. - * - * @VueI18nSee [Shared locale messages for components](../guide/essentials/local#shared-locale-messages-for-components) - * - * @defaultValue `undefined` - */ - sharedMessages?: LocaleMessages; - /** - * @remarks - * A set of rules for word pluralization - * - * @VueI18nSee [Custom Pluralization](../guide/essentials/pluralization#custom-pluralization) - * - * @defaultValue `{}` - */ - pluralizationRules?: Options['pluralRules']; - /** - * @remarks - * A handler for post processing of translation. The handler gets after being called with the `$t`, `t`, `$tc`, and `tc`. - * - * This handler is useful if you want to filter on translated text such as space trimming. - * - * @defaultValue `null` - */ - postTranslation?: Options['postTranslation']; - /** - * @remarks - * Whether synchronize the root level locale to the component localization locale. - * - * If `false`, regardless of the root level locale, localize for each component locale. - * - * @VueI18nSee [Local Scope](../guide/essentials/scope#local-scope-2) - * - * @defaultValue `true` - */ - sync?: boolean; - /** - * @remarks - * A handler for getting notified when component-local instance was created. - * - * The handler gets called with new and old (root) VueI18n instances. - * - * This handler is useful when extending the root VueI18n instance and wanting to also apply those extensions to component-local instance. - * - * @defaultValue `null` - */ - componentInstanceCreatedListener?: ComponentInstanceCreatedListener; - /** - * @remarks - * A message resolver to resolve [`messages`](legacy#messages). - * - * If not specified, the vue-i18n internal message resolver will be used by default. - * - * You need to implement a message resolver yourself that supports the following requirements: - * - * - Resolve the message using the locale message of [`locale`](legacy#locale) passed as the first argument of the message resolver, and the path passed as the second argument. - * - * - If the message could not be resolved, you need to return `null`. - * - * - If you will be returned `null`, the message resolver will also be called on fallback if [`fallbackLocale`](legacy#fallbacklocale-2) is enabled, so the message will need to be resolved as well. - * - * The message resolver is called indirectly by the following APIs: - * - * - [`t`](legacy#t-key) - * - * - [`tc`](legacy#tc-key) - * - * - [`te`](legacy#te-key-locale) - * - * - [`tm`](legacy#tm-key) - * - * - [Translation component](component#translation) - * - * @example - * Here is an example of how to set it up using your `createI18n`: - * ```js - * import { createI18n } from 'vue-i18n' - * - * // your message resolver - * function messageResolver(obj, path) { - * // simple message resolving! - * const msg = obj[path] - * return msg != null ? msg : null - * } - * - * // call with I18n option - * const i18n = createI18n({ - * locale: 'ja', - * messageResolver, // set your message resolver - * messages: { - * en: { ... }, - * ja: { ... } - * } - * }) - * - * // the below your something to do ... - * // ... - * ``` - * - * @VueI18nTip - * :new: v9.2+ - * - * @VueI18nWarning - * If you use the message resolver, the [`flatJson`](legacy#flatjson) setting will be ignored. That is, you need to resolve the flat JSON by yourself. - * - * @VueI18nSee [Fallbacking](../guide/essentials/fallback) - * - * @defaultValue `undefined` - */ - messageResolver?: MessageResolver; -} - -/** - * Resolve locale message translation functions for VueI18n legacy interfaces - * - * @remarks - * This is the interface for {@link VueI18n}. This interfce is an alias of {@link ComposerResolveLocaleMessageTranslation}. - * - * @VueI18nLegacy - */ -export declare type VueI18nResolveLocaleMessageTranslation = ComposerResolveLocaleMessageTranslation; - -/** - * Locale message translation functions for VueI18n legacy interfaces - * - * @remarks - * This is the interface for {@link VueI18n} - * - * @VueI18nLegacy - */ -export declare interface VueI18nTranslation = RemovedIndexResources, C = IsEmptyObject extends false ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K]; -}> : never, M = IsEmptyObject extends false ? PickupKeys : never, ResourceKeys extends C | M = IsNever extends false ? IsNever extends false ? C | M : C : IsNever extends false ? M : never> { - /** - * Locale message translation. - * - * @remarks - * If this is used in a reactive context, it will re-evaluate once the locale changes. - * - * If [i18n component options](injection#i18n) is specified, it’s translated in preferentially local scope locale messages than global scope locale messages. - * - * If [i18n component options](injection#i18n) isn't specified, it’s translated with global scope locale messages. - * - * @param key - A target locale message key - * - * @returns Translated message - * - * @VueI18nSee [Scope and Locale Changing](../guide/essentials/scope) - */ - (key: Key | ResourceKeys): TranslateResult; - /** - * Locale message translation. - * - * @remarks - * Overloaded `t`. About details, see the [call signature](legacy#key-key-resourcekeys-translateresult) details. - * - * @param key - A target locale message key - * @param locale - A locale, it will be used over than global scope or local scope. - * - * @returns Translated message - */ - (key: Key | ResourceKeys, locale: Locales | Locale): TranslateResult; - /** - * Locale message translation. - * - * @remarks - * Overloaded `t`. About details, see the [call signature](legacy#key-key-resourcekeys-translateresult) details. - * - * @param key - A target locale message key - * @param locale - A locale, it will be used over than global scope or local scope. - * @param list - A values of list interpolation - * - * @returns Translated message - * - * @VueI18nSee [List interpolation](../guide/essentials/syntax#list-interpolation) - */ - (key: Key | ResourceKeys, locale: Locales | Locale, list: unknown[]): TranslateResult; - /** - * Locale message translation. - * - * @remarks - * Overloaded `t`. About details, see the [call signature](legacy#key-key-resourcekeys-translateresult) details. - * - * @param key - A target locale message key - * @param locale - A locale, it will be used over than global scope or local scope. - * @param named - A values of named interpolation - * - * @returns Translated message - * - * @VueI18nSee [Named interpolation](../guide/essentials/syntax#named-interpolation) - */ - (key: Key | ResourceKeys, locale: Locales | Locale, named: Record): TranslateResult; - /** - * Locale message translation. - * - * @remarks - * Overloaded `t`. About details, see the [call signature](legacy#key-key-resourcekeys-translateresult) details. - * - * @param key - A target locale message key - * @param list - A values of list interpolation - * - * @returns Translated message - * - * @VueI18nSee [List interpolation](../guide/essentials/syntax#list-interpolation) - */ - (key: Key | ResourceKeys, list: unknown[]): TranslateResult; - /** - * Locale message translation. - * - * @remarks - * Overloaded `t`. About details, see the [call signature](legacy#key-key-resourcekeys-translateresult) details. - * - * @param key - A target locale message key - * @param named - A values of named interpolation - * - * @returns Translated message - * - * @VueI18nSee [Named interpolation](../guide/essentials/syntax#named-interpolation) - */ - (key: Key | ResourceKeys, named: Record): TranslateResult; -} - -/** - * Locale message pluralization functions for VueI18n legacy interfaces - * - * @remarks - * This is the interface for {@link VueI18n} - * - * @VueI18nLegacy - */ -export declare interface VueI18nTranslationChoice = RemovedIndexResources, C = IsEmptyObject extends false ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K]; -}> : never, M = IsEmptyObject extends false ? PickupKeys : never, ResourceKeys extends C | M = IsNever extends false ? IsNever extends false ? C | M : C : IsNever extends false ? M : never> { - /** - * Locale message pluralization - * - * @remarks - * If this is used in a reactive context, it will re-evaluate once the locale changes. - * - * If [i18n component options](injection#i18n) is specified, it’s pluraled in preferentially local scope locale messages than global scope locale messages. - * - * If [i18n component options](injection#i18n) isn't specified, it’s pluraled with global scope locale messages. - * - * The plural choice number is handled with default `1`. - * - * @param key - A target locale message key - * - * @returns Pluraled message - * - * @VueI18nSee [Pluralization](../guide/essentials/pluralization) - */ - (key: Key | ResourceKeys): TranslateResult; - /** - * Locale message pluralization - * - * @remarks - * Overloaded `tc`. About details, see the [call signature](legacy#key-key-resourcekeys-translateresult-2) details. - * - * @param key - A target locale message key - * @param locale - A locale, it will be used over than global scope or local scope. - * - * @returns Pluraled message - */ - (key: Key | ResourceKeys, locale: Locales | Locale): TranslateResult; - /** - * Locale message pluralization - * - * @remarks - * Overloaded `tc`. About details, see the [call signature](legacy#key-key-resourcekeys-translateresult-2) details. - * - * @param key - A target locale message key - * @param list - A values of list interpolation - * - * @returns Pluraled message - */ - (key: Key | ResourceKeys, list: unknown[]): TranslateResult; - /** - * Locale message pluralization - * - * @remarks - * Overloaded `tc`. About details, see the [call signature](legacy#key-key-resourcekeys-translateresult-2) details. - * - * @param key - A target locale message key - * @param named - A values of named interpolation - * - * @returns Pluraled message - */ - (key: Key | ResourceKeys, named: Record): TranslateResult; - /** - * Locale message pluralization - * - * @remarks - * Overloaded `tc`. About details, see the [call signature](legacy#key-key-resourcekeys-translateresult-2) details. - * - * @param key - A target locale message key - * @param choice - Which plural string to get. 1 returns the first one. - * - * @returns Pluraled message - */ - (key: Key | ResourceKeys, choice: number): TranslateResult; - /** - * Locale message pluralization - * - * @remarks - * Overloaded `tc`. About details, see the [call signature](legacy#key-key-resourcekeys-translateresult-2) details. - * - * @param key - A target locale message key - * @param choice - Which plural string to get. 1 returns the first one. - * @param locale - A locale, it will be used over than global scope or local scope. - * - * @returns Pluraled message - */ - (key: Key | ResourceKeys, choice: number, locale: Locales | Locale): TranslateResult; - /** - * Locale message pluralization - * - * @remarks - * Overloaded `tc`. About details, see the [call signature](legacy#key-key-resourcekeys-translateresult-2) details. - * - * @param key - A target locale message key - * @param choice - Which plural string to get. 1 returns the first one. - * @param list - A values of list interpolation - * - * @returns Pluraled message - */ - (key: Key | ResourceKeys, choice: number, list: unknown[]): TranslateResult; - /** - * Locale message pluralization - * - * @remarks - * Overloaded `tc`. About details, see the [call signature](legacy#key-key-resourcekeys-translateresult-2) details. - * - * @param key - A target locale message key - * @param choice - Which plural string to get. 1 returns the first one. - * @param named - A values of named interpolation - * - * @returns Pluraled message - */ - (key: Key | ResourceKeys, choice: number, named: Record): TranslateResult; -} - -/** @VueI18nComposition */ -export declare type VueMessageType = string | VNode; - -export declare type WarnHtmlInMessageLevel = 'off' | 'warn' | 'error'; - -export { } - -declare module '@vue/runtime-core' { - /** - * Component Custom Options for Vue I18n - * - * @VueI18nInjection - */ - export interface ComponentCustomOptions { - /** - * VueI18n options - * - * @remarks - * See the {@link VueI18nOptions} - */ - i18n?: VueI18nOptions - /** - * For custom blocks options - * @internal - */ - __i18n?: CustomBlocks - /** - * For devtools - * @internal - */ - __INTLIFY_META__?: string - } - - /** - * Component Custom Properties for Vue I18n - * - * @VueI18nInjection - */ - export interface ComponentCustomProperties { - /** - * Exported Global Composer instance, or global VueI18n instance. - * - * @remarks - * You can get the {@link ExportedGlobalComposer | exported composer instance} which are exported from global {@link Composer | composer instance} created with {@link createI18n}, or global {@link VueI18n | VueI18n instance}. - * You can get the exported composer instance in {@link I18nMode | Composition API mode}, or the Vuei18n instance in {@link I18nMode | Legacy API mode}, which is the instance you can refer to with this property. - * The locales, locale messages, and other resources managed by the instance referenced by this property are valid as global scope. - * If the `i18n` component custom option is not specified, it's the same as the VueI18n instance that can be referenced by the i18n instance {@link I18n.global | global} property. - */ - $i18n: VueI18n | ExportedGlobalComposer - /** - * Locale message translation - * - * @remarks - * If this is used in a reactive context, it will re-evaluate once the locale changes. - * - * In {@link I18nMode | Legacy API mode}, the input / output is the same as for VueI18n instance. About that details, see {@link VueI18n#t | `VueI18n#t`}. - * - * In {@link I18nMode | Composition API mode}, the `$t` is injected by `app.config.globalProperties`. - * the input / output is the same as for Composer, and it work on **global scope**. About that details, see {@link Composer#t | `Composer#t` }. - * - * @param key - A target locale message key - * - * @returns translation message - */ - $t< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path - ): TranslateResult - /** - * Locale message translation - * - * @remarks - * Overloaded `$t`. About details, see the {@link $t} remarks. - * - * @param key - A target locale message key - * @param locale - A locale, override locale that global scope or local scope - * - * @returns translation message - */ - $t< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path - ): TranslateResult - /** - * Locale message translation - * - * @remarks - * Overloaded `$t`. About details, see the {@link $t} remarks. - * - * @param key - A target locale message key - * @param locale - A locale, override locale that global scope or local scope - * @param list - A values of list interpolation - * - * @returns translation message - */ - $t< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path, - locale: Locale, - list: unknown[] - ): TranslateResult - /** - * Locale message translation - * - * @remarks - * Overloaded `$t`. About details, see the {@link $t} remarks. - * - * @param key - A target locale message key - * @param locale - A locale, override locale that global scope or local scope - * @param named - A values of named interpolation - * - * @returns translation message - */ - $t< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path, - locale: Locale, - named: object - ): TranslateResult - /** - * Locale message translation - * - * @remarks - * Overloaded `$t`. About details, see the {@link $t} remarks. - * - * @param key - A target locale message key - * @param list - A values of list interpolation - * - * @returns translation message - */ - $t< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path, - list: unknown[] - ): TranslateResult - /** - * Locale message translation - * - * @remarks - * Overloaded `$t`. About details, see the {@link $t} remarks. - * - * @param key - A target locale message key - * @param named - A values of named interpolation - * - * @returns translation message - */ - $t< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path, - named: Record - ): TranslateResult - /** - * Locale message translation - * - * @remarks - * Overloaded `$t`. About details, see the {@link $t} remarks. - * - * @param key - A target locale message key - * - * @returns translation message - */ - $t< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path - ): string - /** - * Locale message translation - * - * @remarks - * Overloaded `$t`. About details, see the {@link $t} remarks. - * - * @param key - A target locale message key - * @param plural - A choice number of plural - * - * @returns translation message - */ - $t< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path, - plural: number - ): string - /** - * Locale message translation - * - * @remarks - * Overloaded `$t`. About details, see the {@link $t} remarks. - * - * @param key - A target locale message key - * @param plural - Which plural string to get. 1 returns the first one. - * @param options - An options, see the {@link TranslateOptions} - * - * @returns translation message - */ - $t< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path, - plural: number, - options: TranslateOptions - ): string - /** - * Locale message translation - * - * @remarks - * Overloaded `$t`. About details, see the {@link $t} remarks. - * - * @param key - A target locale message key - * @param defaultMsg - A default message to return if no translation was found - * - * @returns translation message - */ - $t< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path, - defaultMsg: string - ): string - /** - * Locale message translation - * - * @remarks - * Overloaded `$t`. About details, see the {@link $t} remarks. - * - * @param key - A target locale message key - * @param defaultMsg - A default message to return if no translation was found - * @param options - An options, see the {@link TranslateOptions} - * - * @returns translation message - */ - $t< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path, - defaultMsg: string, - options: TranslateOptions - ): string - /** - * Locale message translation - * - * @remarks - * Overloaded `$t`. About details, see the {@link $t} remarks. - * - * @param key - A target locale message key - * @param list - A values of list interpolation - * - * @returns translation message - */ - $t< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path, - list: unknown[] - ): string - /** - * Locale message translation - * - * @remarks - * Overloaded `$t`. About details, see the {@link $t} remarks. - * - * @param key - A target locale message key - * @param list - A values of list interpolation - * @param plural - A choice number of plural - * - * @returns translation message - */ - $t< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path, - list: unknown[], - plural: number - ): string - /** - * Locale message translation - * - * @remarks - * Overloaded `$t`. About details, see the {@link $t} remarks. - * - * @param key - A target locale message key - * @param list - A values of list interpolation - * @param defaultMsg - A default message to return if no translation was found - * - * @returns translation message - */ - $t< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path, - list: unknown[], - defaultMsg: string - ): string - /** - * Locale message translation - * - * @remarks - * Overloaded `$t`. About details, see the {@link $t} remarks. - * - * @param key - A target locale message key - * @param list - A values of list interpolation - * @param options - An options, see the {@link TranslateOptions} - * - * @returns translation message - */ - $t< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path, - list: unknown[], - options: TranslateOptions - ): string - /** - * Locale message translation - * - * @remarks - * Overloaded `$t`. About details, see the {@link $t} remarks. - * - * @param key - A target locale message key - * @param named - A values of named interpolation - * - * @returns translation message - */ - $t< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path, - named: NamedValue - ): string - /** - * Locale message translation - * - * @remarks - * Overloaded `$t`. About details, see the {@link $t} remarks. - * - * @param key - A target locale message key - * @param named - A values of named interpolation - * @param plural - A choice number of plural - * - * @returns translation message - */ - $t< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path, - named: NamedValue, - plural: number - ): string - /** - * Locale message translation - * - * @remarks - * Overloaded `$t`. About details, see the {@link $t} remarks. - * - * @param key - A target locale message key - * @param named - A values of named interpolation - * @param defaultMsg - A default message to return if no translation was found - * - * @returns translation message - */ - $t< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path, - named: NamedValue, - defaultMsg: string - ): string - /** - * Locale message translation - * - * @remarks - * Overloaded `$t`. About details, see the {@link $t} remarks. - * - * @param key - A target locale message key - * @param named - A values of named interpolation - * @param options - An options, see the {@link TranslateOptions} - * - * @returns translation message - */ - $t< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path, - named: NamedValue, - options: TranslateOptions - ): string - /** - * Resolve locale message translation - * - * @remarks - * If this is used in a reactive context, it will re-evaluate once the locale changes. - * - * In {@link I18nMode | Legacy API mode}, the input / output is the same as for VueI18n instance. About that details, see {@link VueI18n#rt | `VueI18n#rt`}. - * - * In {@link I18nMode | Composition API mode}, the `$rt` is injected by `app.config.globalProperties`. - * the input / output is the same as for Composer, and it work on **global scope**. About that details, see {@link Composer#rt | `Composer#rt` }. - * - * @param message - A target locale message to be resolved. You will need to specify the locale message returned by `$tm`. - * - * @returns translated message - */ - $rt(message: MessageFunction | VueMessageType): string - /** - * Resolve locale message translation for plurals - * - * @remarks - * Overloaded `$rt`. About details, see the {@link $rt} remarks. - * - * @param message - A target locale message to be resolved. You will need to specify the locale message returned by `$tm`. - * @param plural - Which plural string to get. 1 returns the first one. - * @param options - Additional {@link TranslateOptions | options} for translation - * - * @returns Translated message - */ - $rt( - message: MessageFunction | VueMessageType, - plural: number, - options?: TranslateOptions - ): string - /** - * Resolve locale message translation for list interpolations - * - * @remarks - * Overloaded `$rt`. About details, see the {@link $rt} remarks. - * - * @param message - A target locale message to be resolved. You will need to specify the locale message returned by `$tm`. - * @param list - A values of list interpolation. - * @param options - Additional {@link TranslateOptions | options} for translation - * - * @returns Translated message - */ - $rt( - message: MessageFunction | VueMessageType, - list: unknown[], - options?: TranslateOptions - ): string - /** - * Resolve locale message translation for named interpolations - * - * @remarks - * Overloaded `$rt`. About details, see the {@link $rt} remarks. - * - * @param message - A target locale message to be resolved. You will need to specify the locale message returned by `$tm`. - * @param named - A values of named interpolation. - * @param options - Additional {@link TranslateOptions | options} for translation - * - * @returns Translated message - */ - $rt( - message: MessageFunction | VueMessageType, - named: NamedValue, - options?: TranslateOptions - ): string - /** - * Locale message pluralization - * - * @remarks - * If this is used in a reactive context, it will re-evaluate once the locale changes. - * - * The input / output is the same as for VueI18n instance. About that details, see {@link VueI18n#tc | `VueI18n#tc` }. - * The value of plural is handled with default `1`. - * Supported for Legacy API mode only. - * - * @param key - A target locale message key - * - * @returns translation message that is pluraled - */ - $tc< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path - ): TranslateResult - /** - * Locale message pluralization - * - * @remarks - * Overloaded `$tc`. About details, see the {@link $tc} remarks. - * Supported for Legacy API mode only. - * - * @param key - A target locale message key - * @param locale - A locale, override locale that global scope or local scope - * - * @returns translation message that is pluraled - */ - $tc< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path, - locale: Locale - ): TranslateResult - /** - * Locale message pluralization - * - * @remarks - * Overloaded `$tc`. About details, see the {@link $tc} remarks. - * Supported for Legacy API mode only. - * - * @param key - A target locale message key - * @param list - A values of list interpolation - * - * @returns translation message that is pluraled - */ - $tc< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path, - list: unknown[] - ): TranslateResult - /** - * Locale message pluralization - * Supported for Legacy API mode only. - * - * @remarks - * Overloaded `$tc`. About details, see the {@link $tc} remarks. - * Supported for Legacy API mode only. - * - * @param key - A target locale message key - * @param named - A values of named interpolation - * - * @returns translation message that is pluraled - */ - $tc< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path, - named: Record - ): TranslateResult - /** - * Locale message pluralization - * Supported for Legacy API mode only. - * - * @remarks - * Overloaded `$tc`. About details, see the {@link $tc} remarks. - * Supported for Legacy API mode only. - * - * @param key - A target locale message key - * @param choice - Which plural string to get. 1 returns the first one. - * - * @returns translation message that is pluraled - */ - $tc< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path, - choice: number - ): TranslateResult - /** - * Locale message pluralization - * Supported for Legacy API mode only. - * - * @remarks - * Overloaded `$tc`. About details, see the {@link $tc} remarks. - * Supported for Legacy API mode only. - * - * @param key - A target locale message key - * @param choice - Which plural string to get. 1 returns the first one. - * @param locale - A locale, override locale that global scope or local scope - * - * @returns translation message that is pluraled - */ - $tc< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path, - choice: number, - locale: Locale - ): TranslateResult - /** - * Locale message pluralization - * Supported for Legacy API mode only. - * - * @remarks - * Overloaded `$tc`. About details, see the {@link $tc} remarks. - * Supported for Legacy API mode only. - * - * @param key - A target locale message key - * @param choice - Which plural string to get. 1 returns the first one. - * @param list - A values of list interpolation - * - * @returns translation message that is pluraled - */ - $tc< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path, - choice: number, - list: unknown[] - ): TranslateResult - /** - * Locale message pluralization - * Supported for Legacy API mode only. - * - * @remarks - * Overloaded `$tc`. About details, see the {@link $tc} remarks. - * Supported for Legacy API mode only. - * - * @param key - A target locale message key - * @param choice - Which plural string to get. 1 returns the first one. - * @param named - A values of named interpolation - * - * @returns translation message that is pluraled - */ - $tc< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path, - choice: number, - named: Record - ): TranslateResult - /** - * Translation message exist - * - * @remarks - * The input / output is the same as for VueI18n instance. About that details, see {@link VueI18n#te | `VueI18n.#te` }. - * Supported for Legacy API mode only. - * - * @param key - A target locale message key - * @param locale - A locale, optional, override locale that global scope or local scope - * - * @returns if found locale message, `true`, else `false` - */ - $te< - Key extends string, - DefinedLocaleMessage extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupPaths<{ - [K in keyof DefinedLocaleMessage]: DefinedLocaleMessage[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - key: Key | ResourceKeys | Path, - locale?: Locale - ): boolean - /** - * Datetime formatting - * - * @remarks - * If this is used in a reactive context, it will re-evaluate once the locale changes. - * - * In {@link I18nMode | Legacy API mode}, the input / output is the same as for VueI18n instance. About that details, see {@link VueI18n#d | `VueI18n#d` }. - * - * In {@link I18nMode | Composition API mode}, the `$d` is injected by `app.config.globalProperties`. - * the input / output is the same as for Composer instance, and it work on **global scope**. About that details, see {@link Composer#d | `Composer#d` }. - * - * @param value - A value, timestamp number or `Date` instance - * - * @returns formatted value - */ - $d(value: number | Date): DateTimeFormatResult - /** - * Datetime formatting - * - * @remarks - * Overloaded `$d`. About details, see the {@link $d} remarks. - * - * @param value - A value, timestamp number or `Date` instance - * @param key - A key of datetime formats - * - * @returns formatted value - */ - $d< - Value extends number | Date = number, - Key extends string = string, - DefinedDateTimeFormat extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupFormatPathKeys<{ - [K in keyof DefinedDateTimeFormat]: DefinedDateTimeFormat[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - value: Value, - key: Key | ResourceKeys - ): DateTimeFormatResult - /** - * Datetime formatting - * - * @remarks - * Overloaded `$d`. About details, see the {@link $d} remarks. - * - * @param value - A value, timestamp number or `Date` instance - * @param key - A key of datetime formats - * @param locale - A locale, optional, override locale that global scope or local scope - * - * @returns formatted value - */ - $d< - Value extends number | Date = number, - Key extends string = string, - DefinedDateTimeFormat extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupFormatPathKeys<{ - [K in keyof DefinedDateTimeFormat]: DefinedDateTimeFormat[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - value: Value, - key: Key | ResourceKeys, - locale: Locale - ): DateTimeFormatResult - /** - * Datetime formatting - * - * @remarks - * Overloaded `$d`. About details, see the {@link $d} remarks. - * - * @param value - A value, timestamp number or `Date` instance - * @param args - An argument values - * - * @returns formatted value - */ - $d( - value: number | Date, - args: { [key: string]: string } - ): DateTimeFormatResult - /** - * Datetime formatting - * - * @remarks - * Overloaded `$d`. About details, see the {@link $d} remarks. - * - * @param value - A value, timestamp number or `Date` instance - * - * @returns formatted value - */ - $d(value: number | Date): string - /** - * Datetime formatting - * - * @remarks - * Overloaded `$d`. About details, see the {@link $d} remarks. - * - * @param value - A value, timestamp number or `Date` instance - * @param key - A key of datetime formats - * - * @returns formatted value - */ - $d< - Value extends number | Date = number, - Key extends string = string, - DefinedDateTimeFormat extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupFormatPathKeys<{ - [K in keyof DefinedDateTimeFormat]: DefinedDateTimeFormat[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - value: Value, - key: Key | ResourceKeys - ): string - /** - * Datetime formatting - * - * @remarks - * Overloaded `$d`. About details, see the {@link $d} remarks. - * - * @param value - A value, timestamp number or `Date` instance - * @param key - A key of datetime formats - * @param locale - A locale, optional, override locale that global scope or local scope - * - * @returns formatted value - */ - $d< - Value extends number | Date = number, - Key extends string = string, - DefinedDateTimeFormat extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupFormatPathKeys<{ - [K in keyof DefinedDateTimeFormat]: DefinedDateTimeFormat[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - value: Value, - key: Key | ResourceKeys, - locale: Locale - ): string - /** - * Datetime formatting - * - * @remarks - * Overloaded `$d`. About details, see the {@link $d} remarks. - * - * @param value - A value, timestamp number or `Date` instance - * @param options - An options, see the {@link DateTimeOptions} - * - * @returns formatted value - */ - $d(value: number | Date, options: DateTimeOptions): string - /** - * Number formatting - * - * @remarks - * If this is used in a reactive context, it will re-evaluate once the locale changes. - * - * In {@link I18nMode | Legacy API mode}, the input / output is the same as for VueI18n instance. About that details, see {@link VueI18n#n | `VueI18n.n` }. - * - * In {@link I18nMode | Composition API mode}, the `$n` is injected by `app.config.globalProperties`. - * the input / output is the same as for Composer instance, and it work on **global scope**. About that details, see {@link Composer#n | `Composer.n` }. - * - * @param value - A number value - * - * @returns formatted value - */ - $n(value: number): NumberFormatResult - /** - * Number formatting - * - * @remarks - * Overloaded `$n`. About details, see the {@link $n} remarks. - * - * @param value - A number value - * @param key - A key of number formats - * - * @returns formatted value - */ - $n< - Key extends string = string, - DefinedNumberFormat extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupFormatPathKeys<{ - [K in keyof DefinedNumberFormat]: DefinedNumberFormat[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - value: number, - key: Key | ResourceKeys - ): NumberFormatResult - /** - * Number formatting - * - * @remarks - * Overloaded `$n`. About details, see the {@link $n} remarks. - * - * @param value - A number value - * @param key - A key of number formats - * @param locale - A locale, optional, override locale that global scope or local scope - * - * @returns formatted value - */ - $n< - Key extends string = string, - DefinedNumberFormat extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupFormatPathKeys<{ - [K in keyof DefinedNumberFormat]: DefinedNumberFormat[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - value: number, - key: Key | ResourceKeys, - locale: Locale - ): NumberFormatResult - /** - * Number formatting - * - * @remarks - * Overloaded `$n`. About details, see the {@link $n} remarks. - * - * @param value - A number value - * @param args - An argument values - * - * @returns formatted value - */ - $n( - value: number, - args: { [key: string]: string | boolean | number } - ): NumberFormatResult - /** - * Number formatting - * - * @remarks - * Overloaded `$n`. About details, see the {@link $n} remarks. - * - * @param value - A number value - * @param key - A key of number formats - * @param args - An argument values - * - * @returns formatted value - */ - $n( - value: number, - key: string, - args: { [key: string]: string | boolean | number } - ): NumberFormatResult - /** - * Number formatting - * - * @remarks - * Overloaded `$n`. About details, see the {@link $n} remarks. - * - * @param value - A number value - * @param key - A key of number formats - * @param locale - A locale, optional, override locale that global scope or local scope - * @param args - An argument values - * - * @returns formatted value - */ - $n( - value: number, - key: string, - locale: Locale, - args: { [key: string]: string | boolean | number } - ): NumberFormatResult - /** - * Number formatting - * - * @remarks - * Overloaded `$n`. About details, see the {@link $n} remarks. - * - * @param value - A number value - * - * @returns formatted value - */ - $n(value: number): string - /** - * Number formatting - * - * @remarks - * Overloaded `$n`. About details, see the {@link $n} remarks. - * - * @param value - A number value - * @param key - A key of number formats - * - * @returns formatted value - */ - $n< - Key extends string = string, - DefinedNumberFormat extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupFormatPathKeys<{ - [K in keyof DefinedNumberFormat]: DefinedNumberFormat[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - value: number, - key: Key | ResourceKeys - ): string - /** - * Number formatting - * - * @remarks - * Overloaded `$n`. About details, see the {@link $n} remarks. - * - * @param value - A number value - * @param key - A key of number formats - * @param locale - A locale, optional, override locale that global scope or local scope - * - * @returns formatted value - */ - $n< - Key extends string = string, - DefinedNumberFormat extends RemovedIndexResources = RemovedIndexResources, - Keys = IsEmptyObject extends false - ? PickupFormatPathKeys<{ - [K in keyof DefinedNumberFormat]: DefinedNumberFormat[K] - }> - : never, - ResourceKeys extends Keys = IsNever extends false ? Keys : never - >( - value: number, - key: Key | ResourceKeys, - locale: Locale - ): string - /** - * Number formatting - * - * @remarks - * Overloaded `$n`. About details, see the {@link $n} remarks. - * - * @param value - A number value - * @param options - An options, see the {@link NumberOptions} - * - * @returns formatted value - */ - $n(value: number, options: NumberOptions): string - /** - * Locale messages getter - * - * In {@link I18nMode | Legacy API mode}, the input / output is the same as for VueI18n instance. About that details, see {@link VueI18n#tm | `VueI18n#tm` }. - * - * @remarks - * In {@link I18nMode | Composition API mode}, the `$tm` is injected by `app.config.globalProperties`. - * the input / output is the same as for Composer instance, and it work on **global scope**. About that details, see {@link Composer#tm | `Composer.tm` }. - * Based on the current `locale`, locale messages will be returned from Composer instance messages. - * If you change the `locale`, the locale messages returned will also correspond to the locale. - * If there are no locale messages for the given `key` in the composer instance messages, they will be returned with fallbacking. - * - * @param key - A target locale message key - * - * @returns locale messages - */ - $tm< - Key extends string, - Messages extends object = {}, - ResourceKeys extends PickupKeys = PickupKeys - >( - key: Key | ResourceKeys - ): LocaleMessageValue | {} - } -}