From 1194e36e6ea693bf18361eb8eddc3859e71aae12 Mon Sep 17 00:00:00 2001 From: Knut Ahlers Date: Tue, 16 Jan 2024 16:13:04 +0100 Subject: [PATCH] Add basic frontend & account sidebar --- .eslintrc.js | 152 + .gitignore | 6 + .npmrc | 2 + Dockerfile | 30 + Makefile | 19 + ci/build.mjs | 30 + frontend/components/accountsSidebar.vue | 280 ++ frontend/components/app.vue | 46 + frontend/lato.scss | 26 + frontend/latofont/OFL.txt | 94 + .../lato-v20-latin-ext_latin-700.woff2 | Bin 0 -> 24712 bytes .../lato-v20-latin-ext_latin-italic.woff2 | Bin 0 -> 26312 bytes .../lato-v20-latin-ext_latin-regular.woff2 | Bin 0 -> 25320 bytes frontend/main.js | 20 + frontend/router.js | 13 + frontend/style.scss | 10 + main.go | 2 + package-lock.json | 3471 +++++++++++++++++ package.json | 18 + pkg/api/account.go | 15 +- pkg/api/transaction.go | 2 +- pkg/database/constants.go | 36 +- pkg/database/database.go | 42 +- pkg/database/database_test.go | 24 +- pkg/frontend/assets/index.html | 20 + pkg/frontend/frontend.go | 79 + 26 files changed, 4399 insertions(+), 38 deletions(-) create mode 100644 .eslintrc.js create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 Dockerfile create mode 100644 Makefile create mode 100644 ci/build.mjs create mode 100644 frontend/components/accountsSidebar.vue create mode 100644 frontend/components/app.vue create mode 100644 frontend/lato.scss create mode 100755 frontend/latofont/OFL.txt create mode 100644 frontend/latofont/lato-v20-latin-ext_latin-700.woff2 create mode 100644 frontend/latofont/lato-v20-latin-ext_latin-italic.woff2 create mode 100644 frontend/latofont/lato-v20-latin-ext_latin-regular.woff2 create mode 100644 frontend/main.js create mode 100644 frontend/router.js create mode 100644 frontend/style.scss create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 pkg/frontend/assets/index.html create mode 100644 pkg/frontend/frontend.go diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..dfa6809 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,152 @@ +/* + * Hack to automatically load globally installed eslint modules + * on Archlinux systems placed in /usr/lib/node_modules + * + * Source: https://github.com/eslint/eslint/issues/11914#issuecomment-569108633 + */ + +const Module = require('module') + +const hacks = [ + '@babel/eslint-parser', + 'eslint-plugin-vue', +] + +const ModuleFindPath = Module._findPath +Module._findPath = (request, paths, isMain) => { + const r = ModuleFindPath(request, paths, isMain) + if (!r && hacks.includes(request)) { + return require.resolve(`/usr/lib/node_modules/${request}`) + } + return r +} + +/* + * ESLint configuration derived as differences from eslint:recommended + * with changes I found useful to ensure code quality and equal formatting + * https://eslint.org/docs/user-guide/configuring + */ + +module.exports = { + env: { + browser: true, + node: true, + }, + + extends: [ + 'plugin:vue/recommended', + 'eslint:recommended', // https://eslint.org/docs/rules/ + ], + + globals: { + process: true, + }, + + parserOptions: { + ecmaVersion: 2020, + parser: '@babel/eslint-parser', + requireConfigFile: false, + }, + + plugins: [ + // required to lint *.vue files + 'vue', + ], + + reportUnusedDisableDirectives: true, + + root: true, + + rules: { + 'array-bracket-newline': ['error', { multiline: true }], + 'array-bracket-spacing': ['error'], + 'arrow-body-style': ['error', 'as-needed'], + 'arrow-parens': ['error', 'as-needed'], + 'arrow-spacing': ['error', { after: true, before: true }], + 'block-spacing': ['error'], + 'brace-style': ['error', '1tbs'], + 'camelcase': ['error'], + 'comma-dangle': ['error', 'always-multiline'], + 'comma-spacing': ['error'], + 'comma-style': ['error', 'last'], + 'curly': ['error'], + 'default-case-last': ['error'], + 'default-param-last': ['error'], + 'dot-location': ['error', 'property'], + 'dot-notation': ['error'], + 'eol-last': ['error', 'always'], + 'eqeqeq': ['error', 'always', { null: 'ignore' }], + 'func-call-spacing': ['error', 'never'], + 'function-paren-newline': ['error', 'multiline'], + 'generator-star-spacing': ['off'], // allow async-await + 'implicit-arrow-linebreak': ['error'], + 'indent': ['error', 2], + 'key-spacing': ['error', { afterColon: true, beforeColon: false, mode: 'strict' }], + 'keyword-spacing': ['error'], + 'linebreak-style': ['error', 'unix'], + 'lines-between-class-members': ['error'], + 'multiline-comment-style': ['warn'], + 'newline-per-chained-call': ['error'], + 'no-alert': ['error'], + 'no-console': ['off'], + 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', // allow debugger during development + 'no-duplicate-imports': ['error'], + 'no-else-return': ['error'], + 'no-empty-function': ['error'], + 'no-extra-parens': ['error'], + 'no-implicit-coercion': ['error'], + 'no-lonely-if': ['error'], + 'no-multi-spaces': ['error'], + 'no-multiple-empty-lines': ['warn', { max: 2, maxBOF: 0, maxEOF: 0 }], + 'no-promise-executor-return': ['error'], + 'no-return-assign': ['error'], + 'no-script-url': ['error'], + 'no-template-curly-in-string': ['error'], + 'no-trailing-spaces': ['error'], + 'no-unneeded-ternary': ['error'], + 'no-unreachable-loop': ['error'], + 'no-unsafe-optional-chaining': ['error'], + 'no-useless-return': ['error'], + 'no-var': ['error'], + 'no-warning-comments': ['error'], + 'no-whitespace-before-property': ['error'], + 'object-curly-newline': ['error', { consistent: true }], + 'object-curly-spacing': ['error', 'always'], + 'object-shorthand': ['error'], + 'padded-blocks': ['error', 'never'], + 'prefer-arrow-callback': ['error'], + 'prefer-const': ['error'], + 'prefer-object-spread': ['error'], + 'prefer-rest-params': ['error'], + 'prefer-template': ['error'], + 'quote-props': ['error', 'consistent-as-needed', { keywords: false }], + 'quotes': ['error', 'single', { allowTemplateLiterals: true }], + 'require-atomic-updates': ['error'], + 'require-await': ['error'], + 'semi': ['error', 'never'], + 'sort-imports': ['error', { ignoreCase: true, ignoreDeclarationSort: false, ignoreMemberSort: false }], + 'sort-keys': ['error', 'asc', { caseSensitive: true, natural: false }], + 'space-before-blocks': ['error', 'always'], + 'space-before-function-paren': ['error', 'never'], + 'space-in-parens': ['error', 'never'], + 'space-infix-ops': ['error'], + 'space-unary-ops': ['error', { nonwords: false, words: true }], + 'spaced-comment': ['warn', 'always'], + 'switch-colon-spacing': ['error'], + 'template-curly-spacing': ['error', 'never'], + 'unicode-bom': ['error', 'never'], + 'vue/new-line-between-multi-line-property': ['error'], + 'vue/no-empty-component-block': ['error'], + 'vue/no-reserved-component-names': ['error'], + 'vue/no-template-target-blank': ['error'], + 'vue/no-unused-properties': ['error'], + 'vue/no-unused-refs': ['error'], + 'vue/no-useless-mustaches': ['error'], + 'vue/order-in-components': ['off'], // Collides with sort-keys + 'vue/require-name-property': ['error'], + 'vue/v-for-delimiter-style': ['error'], + 'vue/v-on-function-call': ['error'], + 'wrap-iife': ['error'], + 'yoda': ['error'], + }, +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a0fa113 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +accounting +node_modules +pkg/frontend/assets/app.* +pkg/frontend/assets/*.ttf +pkg/frontend/assets/*.woff2 +test.db diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..52d5ff0 --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +@fortawesome:registry=https://npm.fontawesome.com/ +//npm.fontawesome.com/:_authToken=${FONTAWESOME_NPM_AUTH_TOKEN} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d4ef76f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,30 @@ +FROM golang:alpine as builder + +COPY . /go/src/accounting +WORKDIR /go/src/accounting + +RUN set -ex \ + && apk add --no-cache \ + git \ + make \ + nodejs \ + npm \ + && make build + + +FROM alpine:latest + +LABEL maintainer "Knut Ahlers " + +RUN set -ex \ + && apk --no-cache add \ + ca-certificates + +COPY --from=builder /go/src/accounting/accounting /usr/local/bin/accounting + +EXPOSE 3000 + +ENTRYPOINT ["/usr/local/bin/accounting"] +CMD ["--"] + +# vim: set ft=Dockerfile: diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..dbcdf52 --- /dev/null +++ b/Makefile @@ -0,0 +1,19 @@ +PORT := 5000 + +default: build + +build: frontend + go build \ + -ldflags "-X main.version=$(shell git describe --tags --always || echo dev)" \ + -mod=readonly \ + -trimpath + +.PHONY: frontend +frontend: node_modules + node ci/build.mjs + +node_modules: + vault2env --key secret/jenkins/fontawesome -- npm ci --include=dev + +run: frontend + envrun -- go run . --listen=:$(PORT) diff --git a/ci/build.mjs b/ci/build.mjs new file mode 100644 index 0000000..e8ed7e7 --- /dev/null +++ b/ci/build.mjs @@ -0,0 +1,30 @@ +import esbuild from 'esbuild' +import { sassPlugin } from 'esbuild-sass-plugin' +import vuePlugin from 'esbuild-plugin-vue3' + +esbuild.build({ + assetNames: '[name]', + bundle: true, + define: { + 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'dev'), + }, + entryPoints: ['frontend/main.js'], + legalComments: 'none', + loader: { + '.ttf': 'file', + '.woff2': 'file', + }, + minify: true, + outfile: 'pkg/frontend/assets/app.js', + plugins: [ + sassPlugin(), + vuePlugin(), + ], + target: [ + 'chrome87', + 'edge87', + 'es2020', + 'firefox84', + 'safari14', + ], +}) diff --git a/frontend/components/accountsSidebar.vue b/frontend/components/accountsSidebar.vue new file mode 100644 index 0000000..4d0a6e2 --- /dev/null +++ b/frontend/components/accountsSidebar.vue @@ -0,0 +1,280 @@ + + + diff --git a/frontend/components/app.vue b/frontend/components/app.vue new file mode 100644 index 0000000..7a393f1 --- /dev/null +++ b/frontend/components/app.vue @@ -0,0 +1,46 @@ + + + diff --git a/frontend/lato.scss b/frontend/lato.scss new file mode 100644 index 0000000..0fc0a4a --- /dev/null +++ b/frontend/lato.scss @@ -0,0 +1,26 @@ +/* lato-regular - latin-ext_latin */ +@font-face { + font-family: 'Lato'; + font-style: normal; + font-weight: 400; + src: url('latofont/lato-v20-latin-ext_latin-regular.woff2') format('woff2'); + /* Chrome 26+, Opera 23+, Firefox 39+ */ +} + +/* lato-italic - latin-ext_latin */ +@font-face { + font-family: 'Lato'; + font-style: italic; + font-weight: 400; + src: url('latofont/lato-v20-latin-ext_latin-italic.woff2') format('woff2'); + /* Chrome 26+, Opera 23+, Firefox 39+ */ +} + +/* lato-700 - latin-ext_latin */ +@font-face { + font-family: 'Lato'; + font-style: normal; + font-weight: 700; + src: url('latofont/lato-v20-latin-ext_latin-700.woff2') format('woff2'); + /* Chrome 26+, Opera 23+, Firefox 39+ */ +} \ No newline at end of file diff --git a/frontend/latofont/OFL.txt b/frontend/latofont/OFL.txt new file mode 100755 index 0000000..6d2c416 --- /dev/null +++ b/frontend/latofont/OFL.txt @@ -0,0 +1,94 @@ +Copyright (c) 2010-2015, Łukasz Dziedzic (dziedzic@typoland.com), +with Reserved Font Name Lato. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/frontend/latofont/lato-v20-latin-ext_latin-700.woff2 b/frontend/latofont/lato-v20-latin-ext_latin-700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..5ba583e88bd15ddf67ec94dea0c65109de9800a9 GIT binary patch literal 24712 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

bCTtd8K6sjaBnR#Y@DtqM>s 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 InE?O*0Klo&J^%m! literal 0 HcmV?d00001 diff --git a/frontend/latofont/lato-v20-latin-ext_latin-italic.woff2 b/frontend/latofont/lato-v20-latin-ext_latin-italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..75f438eaf6ad181b12986b4c2c1da090a17f5a9d GIT binary patch literal 26312 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

GEJdBh~@`+ z6mo@E$2=Y&8HDYH9=>`Bdp2j%SXZzO11@6qz#^(-nJ*3g54;sgvJcOtZCkrrV^IIO z1;vecswL7x;)hwJ$5XuP;wijGXOTWU;9ShdJM5LG27k=|!2yYr@i=}Nk_aM*U>x?5 zkBMxGtZM!LA0YNTM1jfAL)Sm)X^Eb5n0>uvmzT>DvhTk95x7}<+_l(rUF{_Bd)*r0 zm{M(&A|tPD7#BS;>HBYHJZrDQG{G+ODZalAcfZ2HaB40b|j*Xz``{0}RTsld?uKV(in4bV2>Q<^d zYKU4k78`xQe% zxTE8-qg$fwIO^^%U!9B-Uw6{zb8AMaXqi^siC(~2$VKbry&qgY=)JIeA$3E6^|v#% z><4xDf4>~&c_VGHAX24jtzdq}S zS6G<-L`!wYGhMG;@4rl*c8$p7+_>a*Jfsq?QP)9F|5g(+6 zZpFlI$+Vm{?)~~$ZI78F{Yw#Wkat)MI;1?k90L7F75?PRWO$IvA`Y7Zmb#-QY@EP$ z!L>CwZ>;LgC#{SU^pTSG2~6x*;Rs~&V?8pkifEjGY3#|mYR0PR$Q;3rT+Kl_^`hFX z@PelJ43e(Zwwi{-N(>)vo9I8ff;ByYCuJw^Ddo9xvmn`q``v?QE%bNa0rjo1gh4Zb zA{s{F;lwR7#ZIQ!NN};?E+->^_$sDNVqm5lP_Z@tD6{{lW4_%FyXSBL?{WQi3<+k6 zuU?wHtgQNqn+6+tlF-EGN2?1~ui_9s0Zw3vmMo(C6MOlAHvbUo_t3d<2QzrhA1no# z4}=5gIC}*lKf4NudpzNXV-3v00)@X4z0{Hpa!j6x=Mb%n9uD+I1qorAt}*%o&% zXGm%eyIO0MEXe0eFjV+sAWIr3Ge-Urb3L1+)Q!A|ov&06VRMXG4wPpQ;WwJw?@032 zNWsOQse(+cC01*c<$zZbDKwNe!zw3gD2rsTDwuubjQ`10R{JPYS1;a>K$!@U0zXpu zdg+Ep-l3@F&T&6!8gaTO-=0$)t5%26WbcYs-i6mGE~1o-E&@DnJ=jMG4*E6InALT-k68B-olzS+!EC+ep{O z+<=AIkSp^ymFP6-c9?lP&AhI?tOsrzhdagNPV@vC`!te|cRSSJn(xCP-D8kN8-Mlj zb-n{5Tsdx9upF^kEON@3!wRkpN%1S0keGC#)9G z_T$HUq%>C~BiPsq=W0Qxo$C7HYx()%z#X%2a{G)w&)SsDJ^UehYQjzCCTpnw{u>1} zs=*f}P=F?Fowrj+lN?S4_CA@5s!>cqBcqfMJ{>aRoM!uXN<=%_SUs7sol|;}pMLVw zv{SmCv3!x_Q*h*jsl#59e7HPzqV&!@@qzQ3NCA-uNSlpeDh z;O6G)Ui1F6qjOwtI}~Q4@f@YuaJ!_m{9p+g=5ZA2 zx0ypT0>ZaH4K4|#WlaJ*sk}=%BNLJVR$#Sl)S$QHBf-N$WKBiwq!%%o>=h``GVTzZ_LL zqK3XS@uQ4+0WLUYYW%(8@mPUA4+ zfo=r=DbkQ^f0Mvr>~sy-Iw0#@-E1(TG~vioIumABCYP#4S00j0Ou7Q>qc3W=MAk> z_zdC;)pv-nj{gRW1>CvF*~%_+EJK&8bso9tAB5@vDWqL1fjH*t>z+A8|-vS-$`rjF;9u0d(q( z24J+$8)HUz5CqO7e(IJANgzoO$OY0Ovv@!TlbyN`L;1a0XJw%~p1mgvGwj=`$LH zn>7=%#mo`i%<{W##W_v7394Ho9u!btROtHHIT*wjl1m&B1gs!loS9Y%k}&byN!sG0 zq+yE1(J99|ZJR{(pjAj`+~DCQK523#w?>p6@1m6t!t}YNLA+l$Q}xdBUbb@v!<9Os zoVk^<+-P;$h$XbZi;k~^;OcG6cnIc{^4jo1S$U-JQxz52fe?$bRV@~aR50+Qf(_bePY^}x4 zZmY8q@bx!trr5EHcXyq{5@c>MqxigH-VvPO@|SRE7Z69fCHzRD)qW~-GXXr=)L2e# zFnlQJLW#3cg8xq9a-9=;0Skok;^Qg;%=W}ty4&4%+X??)80rlp_{>gA%!p^b zBKLhDtyb)e?$i=3$C6sJgFAq>Rw>2DT8Z4vUz#Vnr#} zHJJFOM!s)xT|i=Of^u>(2FBF0exI^NnBVw#z!J|(|9Gg$_JD5$d!)dwE_s90pay5U zL-d((;ok~@0%=L>(gIl2NJcWN{ua1qH-8=ng|9%=W(7l6I^?wGp*hhqPliUAfWe>w za^<4G?jC^=qM?i_0JrPV^|0~5S!CZoor?vMa*dCv7Y35Gr{I*1W9cG3LjJ8pV!rJz z(a*83OSrf;t}YYa>7=bS{y`uzg`6N!t*fq{Y6l1zCxT$sh|r}hvXm*J3*!|JRl<~4 zgLIQt$E%s=v|z-|&|kH6$t@i$A&ol#gd1tQ8TXq9Yw@9^(e%!NI$13jtiA5U6|(j;)%9A~*wLJ>Jjpy6`oIprRuUHce!p9()Xp^X z5C=@Iy69GaUUn#%r=_A4`ZUJo>3guHrT%;Ua%VRm_w@k31*5T(to3%x+xwc8l7+_E z=K#|wS^c#O0J zfR)!3VYih~`m-@1-bhJAy@fOh5uhFbn~kU}*50S{f`dA>Ul)!PW!ctk5VNzZL}v^* zroBvvW6jX(N{Al7b9md^p^8&h#P-y%k%SP;m3LU7uMN8Uxc6L1&woMdi`KApjnJRF zHL|U%uXl`=>x&jx6mXNrJ~e z?`%6Wmpbkxb$?TY?aiNJH zEtmJ8#)(WRm1MAVLBqT=aAfE^JGhQrDBg~##Sy3?F|kF~1paobVb1I=E)OT0PS_{0 zU-yGospkzNto!;rgIM8J*N5$V`@H;2X<6o)X(iCsI zPiikbRREt5%zXHf>&0S{>6K}Wo`wWO_{BwbK#vz`Xq7x_027lc&INKX*a1amW(O?! z6LxsQy4o9b-pbFdFy@K0gqzRlWmy%eN3pDv)a+` z4s2m9`u3;FRQ!N>41|A8qkEv440=Djz-vc0dU+Or!pUe7u?ICJ_<1gM;dia8%Fi*Dd=5M6iNflc&g)EghNP``pq!+yei;*2{b zftx{^ksV8genLi{9;ulaGz2?okMctVC6jW5k3=&n|5tB?iaBZC5h@0`06ADc>2y@+X(4x5UY7t9&i1a3-G_Yo z9g!EOyQ%1n&V0qA~oyp)d zTPqVt;Op)xwIW`%+&)(ivmshVmjNICHg9{r7Kmg#VitPc)wBWh# z1TDg8u*bdkZ8q{x6#2v6dh-$33bNaZKnG8Hy>EZ7CBeZ#+{M98ewy^Qj+7mFBfGdB zylyv~lh8?W1867(-!9NcEmi9Ymk-j$PwwRuJ7MCA!w2&pKrc#6H;9}dSW`cG;sE-9 zM=WMTCxwO(g3ec5NGihNrQ3-On!0>_U#^!;%I)W+qNDdMWjYv=OMJBMw&P~Y=OiiI zu?w+Z+q5C^BHX*U;KG^MpS^N7Z>k?inX!Jz;J3D@<05!U(e7;o!e8!REjQj)31(~? zwndH=vhC{T+78(P9u9^YAn_hy8gS1AWlUBtAUg#0 zuk>y@07K(jG0Ek!<8g%!Kr9>;GzFp%dn&;Tgf6W zuMo{)+UNwuN*W@v z5AQwRNT{qoJV*J|J=~nX2+YJWx=)Zw`2-pfv81g*SEPnp^C=h=gQXGz6L%n^fc~_GV~hjI-cZH zhB#&0(P1;gx%&-1A6btnpB&*1YuTTY#YQ)9|FicwbjB(qj@zjM&)<{Gy zK`X!aYeZF2)pD_oiV%bkA+#_`y0Iyf#L$>_f{}7OZ%#tpRncii(ibb-$|LJf`f=(e zbBxfqW6K_n<`l)U3h85;_p2I4o1Z*DYy5e8`C)21hWZU2J+@RrOET=|WHU=$d-bA1 zT0wh)Ra=>dVE~@GXh=wfZX$);qtztst(Q2C5WI=L|$7m0QCDK?NsBKLC zbR>m;Uw9=0X~Z4~gFTMBP$6@7wcA1TDoIzQHa4-tT69SuE@3XRDyPtGZ>&DkmYpqR zFZL!f!ZAX4s$}CA<=2nbo;6l6s-@y74p7=qo&H=c&Oz4UQ;MKRV*z?&$m>$kKf)(Q zXS7S_ZWm7lCz-=p@%=Mdi`qfgCM^MpWcEfM!dUMQC5oCY?9)qME!0n}&%&TH#@X^L zZxiHH59;_rm#sfA$CS%(`RiHpU+ps`Cf&?8SyoFxxYjyCqA;b6DYWmu<8 z{)Ewgkl)(i8N}}A$Y*n2@;~$vJm>_@*|_RHcOSnX!R}x>IAXEKy1>TY*;w;a6=pOJ zL#`{&apQ~;onN`0Ze@=z_Z3!?GxorlZWdrcQ{!H_5tMrbZ@_=1XwnUE#nmURrk4R$ zrnPYmDvNAmKUS~RPBxm1rNgf>VsDRMpnj(klbClYs^+T5`r+U2OMU7+w7q|hQbP_5 zcbNUJ2_VQ~L}ksMSv)N0Y48NO;m*W#Q2t_^d{A4{G>B&NnS(uWH``DbPh4g82ET^! z%9P~t-gVVnPnzGOCgY=TH1FSyv6CP9I}`Ag@%gX3-FPfOE_r*m83=&5$l-f;dIUsA zJqJrYcm)dbHpg%TK7JJEUc5dP_R0iyeB~yTPF)lMU=J?AHvpY;=HPrKo)=W$tKtGISR`<{29q4^HPIs3)K938^*e#T(3BOnN!^w9|+{N$Ch5+H0S*Kc9bsD2^X5SkMXv2_9KaNw`m%5Q9ACbhJR1+Bsf%1!A zR=sH^zNs6cGfc=_OPCnQ@wymv>5KejEQ-DL+2=WmiVMNc2Rg&135`h8i*tTmlJpDq zU#*up!%DtF-ePF3t6KcUtAgqvkkdIPiFH@5h;)AZ@ZLmC(dBCgSE8oDE5dab^r`U0 zpMfh~tOu6Y-xPfOgURUvD3g?}lrw{&RO`+F!Yr8 z^vKC$B~!*y9TOrA+1cT=gC~fnI~0oNORa3p*Gb8#_>1$y>ZDCi^RQjrbntm`Lv7;i zhQ>R|jr=2Oletf90I4`r0ixmh&bvJ?(0L{;D%Z#>?xi@CWG3kT9`wMeQTZGZG>xKG z6y&zg?TuD!=O}A;zzpvt(!EegKS-_16~wp=X#CuLWdq23{HV{SA!~*G9o(jX(|LS?va2k8`gXgpWb$mMo`{1e(~^Xf+zw{bt)l)C|zfM*lM+V!0@!% zu(!PmjZOrce?XkH+Ae#r)C}S(YIYpuxubM<9Q{a*si86bBiA{CSC#%U8xHzTm;dC= zCkY9Re50S&eWcGH5{svp=klH7Glkt_NOW_105#X*;GTYjQw|40{Xp}c78Xtm-0GPT zP;Ma$0c)=l^V?d%ruC4+1Gpi2@BLr=@CLl(>7LE{x$p^XajOBch2uRq^>ydhU~4VA zlAT#sUu7T0IBi+$1(omU`ZB?LVI6;OyA-6GM*2>NwBT}G3ja+b@=Dy_u(%dz+Qdtl zX&!xu>D0|e>{aDfS?U|>6=QJD)GHsnF^{9AmWuEoSI4tjwhd^aCaMJzrKts9qJ4jM z0Y!8G?>GPG2(v;4gb4xdIBZXGl?ULcUEh%VVw8WX1V&O(jAmBnJ zT=bKZryrUqmC|-%?M_>b+i2F5{EJ(fW`f=YGdusv7+rjKJxzTs69%6}Q`-UyLD6Gk zr-nFh`y#*=L}ihd)rAy?QVO=65HdAE5(Hp$1#0^k;Nx~X4IV)uImU~#bvTxcE=uZJ z%jUE~%nnV(hgdZGgyZ`~nD;xdBBx9dl zsA`Mb$uqYjmr^1YD4hq2K;I&li?Qg(Df(4ERK>+4bdnU%K`mG=_nA(yFsk7gGfYf8XAdh zgtD{r;Nn&5t<3l`{FUgTFS)Qaezm4>%@ z+I_L8A;EF73}5y(S~?*5z(Xb}Kh5yi8LV3ITV;|s)?8lnr5knA z#i^jS!o>~>4JDMv%u&o!Ny%NruOaKM2|C**g@ux-HyD_`(AYp^={q{dmQuR_Zyjdw zK{|0|n-f(woT%uN19ooS5;1aQA zyT(&mL1OHcJglkiQ>L1rqM34@L7@Nb@N=Yg`Sh{?c z4wmFnYKZpyS?Uas1|jTrxu@FeN1*OtlKkeCo}5|V{7((%07q zc&ghvMxtxuhv-kR>|S-`tiNNH-g><~eNAXFGKw`Gb|VwSQTla7sqkB2$-!@{jlBnO z^|G70y6d>$zxye&#)~ixxS)>z9d7Rx2k*#9@B0jFajdg6It4kAEs`fx(ca4nfE@{2 ze|YvR$}7p$XwLO)Zf}S}&XS9-QX9nhqoKfA8ZfxKI48$k+8|UlSS4(|6ry7bwcLes zjdh8Boh^X4UeqoWlQJO6x?ic7!gOc+Hv@*ZX^7@TDUsN<7IyWv18xav`oU;;kuEem z#TKV=MUuX6Nc|4wjl(?lm*J(uAima{Tk_sUb+@{#pMI0;$LH>@ zqkSdn`a{cmeE~#aAR8IY#R#qrqFw~AY&W!Vh30MD%3+XH1@$~Xlx848|n@=Drj*sA->jBC@)dWWmX@MgP12qxH09KRjm zB35P37^*w}hW%_6OV*iP&w^_wj8E8XC90@X00d`X}+4CXXja zUU8L52XGGWgu#l#LnABV=cZ&D|DKK}KqMJV`!;0kY5n!M)1)gTjh^jd%|yKEL93Ic zVJVk6CD~SYOq(z)Hj@BhzwRgqGdU)q8^KRz8X~+rc5%!iGJDwqbtZvZ31NcJq{NBB zwIl2xgl0)%a_ZZND92cWju@FOff;!slE+pF5OEy7jPf*}nnH8mUpKM*l6$K^UtINk z{-v*wBVgI@J9-VYEA>=f5Vf0F-&^)5ugtME+WM*WzA{V6edD@&M>dwb!_(Bd0~n-r zA3uLj+SCg`SS3*1!U)UcFpl7Nks7MbxfBgoIbEO&Neb*qc@3}wZRUv{R|w`XI^ zOt*_R)71XvYQPdFs~W^|R_&59YX+gMTt``#xq3Hh?W*lSd_`QOlJ#9w*nhXH2V8&4 z>qQ%K=<<@w!zga6!D{R|Vt@sr>+Jzbcueu(V?o1`%oyg(0TI9l;K8-{ULX1P)A{eI zr~(VZhll>!GoN8|X@j`;#b2}=LHvR8gd?lpSa|$CmjA8uXrDLcAHaH3Z~#B}SzRhH zP4D^No7pQ~T~x#Ky2uU}ZeV9=ue`ZQhig^)mPyfPtF{tB2i}kxszdpz%1VsECX^m+ z$!=OJFL=$J9^dTNeAI4VQ442R`&i(;Ro}Y|U+~9M=h8ZblA@}xba+py$YCKG=zhrV zie!A6A;O*%#O#wOWxP^aNfq%E=*#hRw9eSkKWonwWsq+!shi|YH8-1d4rLrPY-+eE z7}O-wauN3c1$43n1U?)mJH5NT9z1>4s5-5yHQqKZ>*zo~Z@12c&uJ5lV%jzq{a|=B z#ErdhU0y6KZ{(l{@Gy|@&|h*$z21*C_Ps_dT*Hv;bq%-b7w#Bs(ky5g$7vMTLMWSu z#r)@{^#wy8b0+=_QI;v?rv*qBQX+I>9p<-1b=|zjjZfQj2S9#UNwfr)U9Y01%#o zy;+8%jUVYcshR6Vtn3LRGSI0r@NJDM!+1FziPtA)%kZlc>zgc4_~=uiS{98gvbX93 z4jOgM7=WE#AopWUSHY+NP4t`gcd@xo#%Cq%(9~}T#P}a%190d=@X7-s29w7(VaL(Y zQRoFipQy-F@We>|%SsZF`ky$wFB6&)(rDR#W-kjWL7l&GN51(;Lg_JsC#4B;cbewM zhk=twCkXTxV>1SA@z8D~k>rh;3H#lv@(;hAjwZM1h6 z*3yeVvFvVpU;gC}&Uuk4y2Y#sqxA7AQHM|*mG4#!T4TxN)2|{l%bvG`NgPC-T$=r{ zb0(uUogKhQ)o{90Pmt?yL4uS$)CVY%4E|W%x98C0Vj%A6*V> z@o)HF>6^c|TNzgz6dBc;x2~z;CrNl=cpOB3W6I@v(oqk2UU%4L zt)@KKJc@yRuLvq_H{>US|IY7KEEfT}+1*MMm46w&k~5TbDPz-OjlECsbCH(((j!apg27jo0I!HLu=Tmt-Dowu=9ra=yqKjrpZm@Ug7eDjH~=DB z0-fgmrq?9!AmfX*joD-O%eaNQB%qK=Ax8%^e1}nx=B%|U;!&6x@zj~=Rc_XI8V-gV zyN3^^|4WG*2Dlr0yDSizPQ*4y7IsU5Ulnfz-p+vv?g9#E6)Q$JBEH{o0wppi^1I_= zINr}f*8Po@IXaUE3a=5P1{sFk$(_U|`}Y%||NdQv8nz=i(p(_M=f@l>LK10FQA!W4 zEs$E0fYOS5R&cNowj@{86x2N}0@0;>mK5z|sh(;_KS=1qFlf5Hy3k0e6NBV+fo(P@ z$;ISK$x~r2_sVh|9)dpU?KLY%y~fnh&I#7f#fcwJUKc+Kv>Gd`nymPH>H0MS3*KVa z*`t)W#+>!YZd|2O32`l?qG@P7XXyilsHOttJk}SMH&cSwnp(YTUlL<&yBR>IdytCK zoH-*+YgB}2-BNyB@>0XouO?gt6w>wIM({|1r_!DLoJql6+oH2}C?2X#q@aq&S#AV> z^DjlPc<2U5ONwuWR?!QY8P!9$pJ&NU3Ba+bW1VX6WpNL2hHymg1!x$Q)mE_N$qW zy)3GB-+pJ7iRaHd+CyaSR4(gl+9vcy;OdSex92A@xK2Ycc(p^$;=_^RXbjyu+yKl2 zud6cS`2%i#pX=vWP2d!{R~BBmv$eiTmEG9_nFEtUCCl}Abl*y@Mpma$*}^NxmU4^ce3e{TNaBfW{yQp$hfTQf4s=doM96Od1~lEhd8V?_FP zbX6bkgFl~j@<5(9KC^0DJ;@L5-q{+!56fjL3y9Lj0DA{;WXai$;y*H zVAGLaC}NAC5!ejS=@?zqxAtF@AA=^W4BD}K2)eNSIKaAS1i+a}j~EVK2M0ulB%3qh>kBoa3;p+Mr21zEN>v{pe@CT=S^YXR;h@2X!I#jpf^zAph zGA^D1$JjtN7N9eK-g=Dhe0=^#Lne1;zOxfMg^5|!vF*gQr%rTtHp5HunA>zDHb=w5 z0)w-21ghoJ$@w4!)!)5o>U$lIMvA;;KSq%X!`sqpan4?CPT=+$)mTz2E7X8pLujQ4AU^= zKtE(cDWwoKQHrNjOH~)Jb#(w198STicA&K~r|N#m!E~zXbVE%cV%{(qfzKJBz58{E zOgx=Mg&3)}#RE|d@r=LliYVRjmVU|PRS_T58jxq=)OJq1$~elpf* zWYjljC_W161hkZA_1MToWJqDVU@sS{b2qC^L>?_9s^2fIZYAamD^GQ@eM(5=EIvdj zr0bCbcSvG=_Vjl=hTOwx*mwo|s7Hk#!o#sFFru~S7>qX2E`oi`zks!}oU4|qf+|KK zt>X})Dq1M(_iw>&!d(o03{qOH}gg z%{b3Iu0Vsa{~JAZjj0!=GOLkT5}Dl+0@9{52@p(OWYLrnVjX+QwT{yHGc5NPqOrwVPpU+}v}HSKt1fQk+T#{o(~HZC^!Rj+*XM_L=!( zW)w5c6<)Cc6GSo7Zz#lq3-6g3!%q%DUi>7>4eYsDy4V4?g^1>na}`*q@9nbCK^R_}`g1_wE~qXKuN(79CGDpl8b9Ol60iJqKM& zi0ya9F9Sk^-jef1HR|pm9v@hBUWW6`;l1`|)y0R}Sg%y-p*g{Y{j`eqtcmtlTmP%Y}nT|0*=AluaB1 z@&VcRG_B0naS(2RZXX+t0pr%$qlhs^^aZ)89;nRQO?R~lR>6SKBNSQy8C@DEay)9=w?9Sia z4J-S#8G}6<-+-wenc7nj1)8au=F-6u3~vXQaThk3;#T*{H~}S3RoWjWfLu`X0DmXu zLoEWn0f%D7>QvXYN0iHFEMDcC^Y61aE34luCB)cbmcrFD#;^oK7AP+`W_lh{m2zvc z&76VZSYX#hC82@mj(&RyENznS*{Q2zjBHSy03Ki2zp&f!F#B~<4a2MA8U@d)M{qF& z!FUTGJxY0O6Wp;M_ioz8hp&~xeE1a3zzOKHyK^q^@CI8y`-E^pvLBGs>GO5dpVxhT zG;h)2>&gkALD5by`U|#Bh6Cmj8ZANpKLIi(&Dnmh#^nkeG~6rp9;cZ>#1yY1`k>g$ zNRf+6$%}C3Ic_t|&C9%l?wLfQKR<=|iWN9T*ABr(J^D#hwyuj<4Jg!r_f-@+r!)+4@gr6KiR@XMjEolQf6 zXK#KYB*y4Ah)7Q}mLvwmfx_J9x(Vr^{jfuC{}EDD1*}vw0d*|Rft%6I1mO09z#nWi z7v(n|Wz!7<*=o5G!0Am|BXk~i-#eMBK*|;(mR>M21|||lw)PEa$rW{0)t_-!2SI`3 z;x`HrgN5BRK_-L2&>jl~*${%Xu(Q$hdoM~W3iQ<*)ulnXH30&IEUK~!fcBsRV57nQ z4yzDkb`#dD-Zd0*w)s!cFhik<0p~4{EQ^{TuNH-1!X1UN0@OfmbiS9sQH2$%Enq6T z{%J_ND+u^wO9o#F4h05*(RlQDQ2+@Zh8ds9Enb$}Z@fXbn!EseG?_dNa2oi6({*D{ zI)+Vy_zVc0I$|1rPL2e@-dk{TkOTP{o2kwc+(yFh-f*Ki_X>{q7$ODw9@3=O(Ztdc zUa1jx?b-4icvPg!Yd+(Q@Fl;93G4$Sx%lOiI{Ao zGO}VvZZ6viNQFZJq`Sj(^_X;D%^@o^EbD@fC|6fTY}FIzKacIC5hyQw$uD{|UY`&= zY|kzywAjGKOJ&*|?ExXCW>9P+*+>riLEWLMpu7O%EY(V--I_@rB_j(x6#o#5VW8q; z2ndGJrpXMm|E;w>wsjh7>65i%Nr`u-rU-uV+Ov2pZnj}Djo{qOloU&V&}r0N>{{$> zrD&;=#U=?*!kroI+4|gzsIKV|k`wNPFNH;puZP`vTUsS{4O6-P6qCoiv6MLniIf_Q zoiO60dH{hBjavPTc`J^be^-*@Awd8IkM>qCPe#ZbEZN;DpivBbk*Jxtg08fKz-)}c z1Wr`bMkj7)#L$h({(+N+_dEl+{(JuuKU-_rEx%DLGr1YaZ`JLu)tp<$A>@YO2oB~} zARdT9juWzMBW$6FyUjf&c15)}W0P zendvy5>+b*;k1~HXi(3!Zh#H}Nj_QMw@@n_KqJ#SwMR zc>rY9;d=@rg=SGzWO!cB(0ZIHz|9&klqJD&dZc$`BdPPu?NCG^C%~>c=X5MM96{pn z2Yi+|liYDMO5-_tf7z}0Fxg>&ud;qIF*F@FD7PY}_Jkc4Uf1H|J>-nTKn;fi^>IKq#c@ZB{1p`?0BTLj9@;{^Oi`VX zmIu&)giZ*^7KS|95au$?7%&PbxENz(7-WQeg_j))sFIOu&laRt14td=Zh(_k60JgD zvD#ETqrHPFLKEXGsFan-%VR8@vvMfOZZbUN=oYdw`0ej~=-VQboRW3Mnf&j`#Y0sN0 zJ^#Py652gvBoIOEGtdTw0m5ooZg_u9d8PXm(HJ|^Jmj1n)ZA&{E4HDPW_sBmD6of{ zjET*JX~a!pgP2;=eC&8_B432Zp?D9o#nZk4e9+FI-}Is}nKMk-Oq$(9hWV~AG!bKZ zF+m$Aj zffR!=%{V)@UfUc^r~+c+s!d`glBdG%sX)@1r4V4Gj21A6jteH$%PU);hB&CN5#k4u zO9D8_TP`@Liw)FYW$;)Pkw#B>azq!VPuHt4%LodImrZs*>Xxj$mBnD$rCAfLnw}~S z?&UZ%$eWcGOwnVEpw)_V-z9^X3g%{(PRscH&VM$Q%_DuIt5~`Onk8=90AYvNQKp?& zNRO$7djhG&ATk2c`4LA8t(pWUj1GYSc$kh|_TXp+5I|$cT6R&nJyrx6fKFJg2^8Tp z(9JMo$r)Hw5qK4gfOrFBNPi{?TE_-4MUx>yeR7h3099S@=v`-|zG(R9mHGE5Gh+D76f>Ii8>xmoXBi!pqDMJBL%4u`nzuM+& zTjXg#ys7w#+E%woZngnSNz}N!Uf=*0?bH+%crwJ46(+qvx53wwjhS_-lfnlOZ*fu95QSgW^1)_&s zSAYDR^Q;wOvJ>U-Be%@ui_6vI=?K~pu$RMl z`M6se>$5yF*AJc>X_xEX^n&dgI)?Jv)&N|uUCo`K^T}!Nc-R&ol8{VvV6A#OIufd8 zG&j>cJ{P_2lNGCKU_-Rj8YkO=k?T@|On5mM!3zr(NcB9QUooq< zCGPN9%K6ljs{2rh!LuZU?h2U1nd~eQT)s1%6rsPZ7|8i2C|@b4A?dZLhY`}Ct~pn| z1mmG)0K<|sT%xg{SW_&Am#R;_pQ>Q)+C3%Ux+^Kt5lJ6F8NCBTPWgNlPH???0G?vS0_F_)0zF$xa2}C%ivP zRzqLW41)rD3Le!)pd2&$utTHhsw&-J+5?wb9zG9WZjGwyb?YP02_NCclB^>p=lSm7 zm*4)o>^6g5{k`!X?O)GL^^W>+FyxrASz(Y{s= zz=#*8;c&*(yu< zNS;l-sxFk)l@nf_bAs!rEg8STpqQi(eoH!DQT>EuHQWZYxN}yO7hs%Y2z23fyk!O& zlN`8C%s?G{47qNqHg9uD+W4z`Ouoa6fQ&APrFK)0aIs4|&8b<8NT)$(Em>d{X?03Q z-GOM_u}W!YG`RSH(4j(b_o~-Dddkz2VAssM;{Alps=}X$hHYDF6*q*1^KP>{^|0ne zGj0X#F4mEI!zDj$0@{sI5!_6(+9K9pq3VV-C~A3Ix>*_>xgeo7T`MqP3pOdf(|6`MV*9Dnn~48?IOpXQ7a^; z7>6Z=1Y$}%e&Sc%ep6&=Opgb!6|uHBKK4(iEqGx>&^A@RG?A+QvVlTFqHIyZrR!bK z3NY?B@HGa_OOI3RM=LC19UuE%^hTB_g0F-jrS6u~kTJk>Z1dZyqg66VZ;V_zbxAGs zlJ;zAG&*N9T{`D@reMg?2x?z02yffUWZc2 zpL0aXcvbgc04v-{;^4qafpD9fZ)>?80|*13Xz>mY@29bAZJxxE<2Cd)=c?Ue>J_wN z4kF90Oj|Xe(D(I0%k4@=-l%HBiLy)YawwL@aYmBXXG~2%rU9PdmEAQF1f?Xhpj{ij z{PudB#=6WBqYbJBS2)0|@&@E;lwX4^uk^jcbL1hKp&HS@p6oI;N#q>@rK_x7Bw}oV z0QOOQG^cG94q8S_^Ij`3^ne6^ zG>FEmNT8ee>@&b%YUl^5j+fK<0!0k}D+;s8@tLV%rK%>T7ItGdk z!&*2iU@$sJB^`eD_6v??!qc;yD10DQhgkS%FMw)r<4!@;3BN0v2`CRA2j;cqALZfB zTB}?due0e`tJ9||iobo->S}!EqHgVD)4Rdp*7Zdl;I!P4oO{dKFW>}hB*!$Lplpn` z5mN9Qa9;Wark0@ORV^l`^er1y6??2beZadm*sw7gvacw^~88WyN zl}^|13vYa${Hq=E;2xXd1BhOumwvZ${Cu1zSMYG1&*+Ng6_iHvs3=V%zRGV7TJ-yG z1It_4VXC2KHT+snprObspxgQ;fCvbGJntS7*p~zUhG$2Qn&HrWRXAE=*F+O9{rM;} zf0fq^Yhp8*au0qF<;+2W-aw5A18x0=z&|Xh+|7po^~{ICwfVT#z`Y|qSe5`dNu9scb``Drvtf&R%WIS4%! z1#gk`EVwuC0&p5!bMxL#v!t1cx@jcc8f8nTOMw5J1z_>Cnwv#T$J;ZBg}+iCGH|`3 zlT|+OEKud~k@o(~Gpcu5!TAOvW-(qXVsCqh_gRX}CNz#5*K4_yM|CGT&4E@@%;g8eIlB&+b62EpkoZLnfzQ$tO(R%@49(`YqIYtb={;GMfgCKvL*Qp0>(dF~PsCLU z=AHH!Vh#A5C*y;Iw#iYZ&9;t?Ro%}6NF3Ut%M6sMSMzHT8-ald zyJchbPrKtamXG_SVBwA6k5=*q?9N;`UYy}>!!DR2O8VHrsk9?SBzXa^w@dsGmg|;i z_svEtVT3hGx8W9*lZ_oOQR&V%rWLC9YLCJ0XC6|keG z?>=k$ubzj4ey?@;d0)>%m&796{#pKvkhINLn09Mid6OKEL`0RYXYspbSfoW`mY`BW z5QTb<>H{N<_C_N_MVfDXd%;27aB>3P56GH=dI%PusD$hHxVQx#KWxmxA7JC0wxAUH zD*;Fxa)RsKxmu8nt$g(_MID=em&I%}=(Jl`@8|8(x8^VX^NlNIu(c5MxtYY57UTl?*??3=b_{2`zyV%VS+uT zeiw$PC^OG>!V;9?umBSHgDq}0vpGn?Rr^p7ooY^lzXVb_Fo7rH?+LlGnB!@=0_kp# ztLXZs4!V!4;6k0L}hg} zTd>6(0lCAiycR*iKRLf(MN%fUgillezO|?JYrmyJ;H* z!^kLuv@=6l(vtb2xFy*F0qk`Rr#1kDpzbi@9hWYbhYt(pg0ij{bSMO)Z8c8v^iV&4 z-f4l>$`ZkrjyHNUE0FOSMdogqYkhwm2JctoLz;A04&)94o->Vzt5FeCW~$K*nrt(n z8NBO8rV|%~>~RI{e%n3YSOa)0(2iX~EKuP0v z0#0~n?gt<;YbCpT+<2y0is-Q&ff*Eeb)#G7j~~4 z9gB-L3&f6)if}S`z(puNK1P^kh`;ZETsq?GToc58=|u~z*L|6eTk zw`7iN0shU90vsy5{6|1y;j%q$OVe-pHh6&qdQEr96d>y?GhJ%($T~wOB5r zWYa_*k9TC^<0q(^G<^$e3o=y!4g zsw|P5;@YTHt znGBrgmh}P#rHiKq_s_b8-8Z%o^!RsXkiQ*2DkX(U5l{tjF&LEl^ucg!GJ$6QA;=^I z1ng%o=Hg3ha%8pQjns-JHT%D#WbTzlWEbS!iJl-@M5GnUiYWMOIS6i0 zl6RmR-J0uP`g`RBqqqb$q|`y)UL^l`jGyJZhs6=Cm%s4dN{frDK16hPN1 zfh={df}&6dDZqku!PzNPN0w@fbn4vQ5Y$%kRIASuh<=@584@5$RaT5eN6p^zSBcs^iBYW=)p?S(6bBQc*&tH6r9Fo=!%TTt6X zc*i&jLe0P*k;EC{ZDL=tu9WC|kauz$Rw~D8YyhsMg&m+o)souz3y7FgAfZr;LlaqE z*%zB=aR4CmjA}LNGW;_qtid|+0)ux20T$q1fmIXMjh4w?(%inZ6#MR>m+O94mDR>%p~_EXB3!X~Xp6xeyX-+Sr46Q5vdQxI1gV0kenT*`>>CT2v&|WBB_21sg(;_Nm&S*=( z22Uk$gof)P7zR4_6}XHppuGOxwr_}?+XUQ&U`IL!y;o9;jlI)B0xh+GuF`2(10gp* zKR7o8Tga7V&P*?rj&8-U4xQdox-*XRs-czCK7(r=JT%lo?7n;1yYGAJ=EZqxYbC0) zbW69as`Y%OY8O{Z?GU2Om}l7sm!s=`*tk~e;>KWlTtT}IyCh!REL+rgC6u`&v6b!f>ol-GDH``gX)%!6`U^dadCe++7nsbfePy>;Y6n!Col5 z`W9)5GTc2>At_A4!h^f9EC1qOM(w4E=U>K$W}9h;zg;;q9kRByBKZhI)3zNY4>8u( zeW^OHYrTzZv)sxC4SHXQ6EKpNSGXq7JDt{e%Lt0@a*MoTVYGbyZA&IBOkhHDqi8~K zN1-1ZnMQr)LCcgNF~R1q`2ue102^+00D1QpLRz}^8Dy;;`iq8i?ZJkTM;8oWg^!>4 zqTF5Zb#`l@6LtiXYC^A^R;wk#@IB>)oPsqmWQfYbE$p&>GD`w@88b0@Mg1u)Frt_y zbuoFkVwbiFo?x_?evj9JI~j-dV`w8a2)NXeT25Ftz*J})&G4`t8bMyVEwNzDwBKX` z+G9`WnSm-c1OIdYm|jcnq?<^#&mvK<%v+n10hhr;kIYys zk=PGqP$5IWcp!&Y&+KfG1l2(ci05G=OOuo>dt2@(NLB9B+%(IZ&mZI!2#i*c_ZVIn zlK&5a|A>wxvXP%@keOIwd{$B{Z!}|E(D?5LSXH$5%p#|z4tv-6{9gX~muobYEz(#k z7U;FM5i#-~Vg5w2Luyw<;w$xP)!S|$VkDmZ>$8$0t7pyfgW*0f+{rMUXNyxzk1;z4 zIw7(ZI`9W@XAeUIO~`n_Pf1zuSJW8T5r{BzFeG<&Vgd6$(F_;;6ffOHDH zV-(_bZQ4php6U;L(9ods285$;t0tdN+E`i*mm~-pCc~06;uOPb#)3C@X`}^B4}7xg zVGLw;qYp%9aWtx&QdG**?zc5n7n<6W=YypJ@CyUw)OsDH4`%3f*TGh)hO}@v46tr0 zO5c&r0$jv%tc{Im8K3NESbrg}kU|zaP%R930hd7QRf88iN0tcpe>9eat5eS*x6w+Ahmo^G}y4vY->fHvIIGa|J*2dzmUucM@n@P?DMfGX6c5hT65CYwJA_K}7gz)G?Rm zy+Z7H0f>#B{q5B9=hMRaoz9qj$B8c<$gXW?*Zm(Wr<;^>Hf_+HxL|+)0+_uwCvaLg z@(LfNyW@ACLVhb71j82haLQY4&L_UEnUZQIQQyzl!RWEu*J-OcqeuVm+|02i_Mqe> zRxcq>j00VY@Dh;)0bh}2YBlw{{&G0RmxIlyjU~2i`BZQJio70-OTL4(?y+@8s>KfvXgH_v%nZB~86qal>-b(a6>N`lT6PukhmCfCJM{2Ir6{iY>$ z6IC^+w4X#Og$F7siySNos%*Yg?%SaV%itjeJq5^t@cqO#Odx6kwW_25l)_^W<$}W* z%=Iot;#%L34}n0As`ge$rb*8ak)3@5<;jz?#<0vOm(muNw>C{($vu~;f>p&r)b7+> zi^|3F{=>!?w*2^Gv5#}UXql~@GG4f&`R(l2eLq4b>tn1TIYZfv$95N6bntkEl3HV> ze(f{$N1y_|5$hZCoB{uu%tJmmkU0W6Cyz`oxj+C5in&5+5r}m-?cR={$2zw|?AYXX zRD49=j*&+D?G&*wp;PMnZTUBSXuZ>gZ9i ziE{aom$E8ngO;vN39A~-(D<4;*xB68`Oq4QwTeDPHM_^`s?~#`6G9crnWtv3Dr48< zhf8NwtHOwnk8yPS%&G}8>X^|O=*VcsG$hhBtWfDov1>;FyrBzrYB+op9J2TyV%8-; z$Ep-HGxk)qE1f|qMh0!Q3nZn#N05}pND?rMktLl`Yqyq*OGtNgD6CbHwO;df>QrY- zEb#;^vtBzMV;~}ajQsNJmG9vi@$7nO>J_bCc>h!(lv0>qwU^UaqvK0d>bKkn4MXx?*t@TE~HAZZ-$M$eD+t+$b zd+)z_cGE$ZJo4-8y;hKnHseFN;hKZ;X<9K4cOXSIqXOA}EH&fof~LkI zYI%`0a*b?^H1A;=&#P&iFx|^ca}`+HG4;&o&P7p}-vd&jq?|+qP}nwr$&Zwr$(CZQHhO>%8B8E>6ze%%sVrE6r-B)3omLVoU&l z0RJtca{z?@Hb9{G|IShWuk3&F|Np`+m%woVGXVGp0zn5EV~Pj^6;zKBl&B6Jzu~LuqCI6rE#UJ*cMt;l`&9=ZR75H2d7}76ASUe6xtE5z=C~7T` zUotbTI9Cno#zeGOmOe zq()`{ZaPzMA+~-_0L_XdcL%^VkiQ|&Z=!aGfPOx;TmW)Q1}h#z+xl@<4x9s8iMEm4 zvuU9Q=y#o>X4O8T@S(V9-aeuk1;rg9d(CoiX_z-c97Q}rUAR1MtA1GY-Ph+9J3JZU zjAX*L;iyw5ac4{aUMl?G-{qvk0)S;y*%Pn{xCJ2V(8{cuk^)}k((+}cHTQd;^M|#v zp_o7;hqyTOa`%p@d0<%5ubN*y<#VNax5^x$G_X#BEGE2pc0@==zKh?y*~Xj%F+E)cI0e_S z&fCsrwf0G8)v`~lB(r8OJZ_RZJ3|QCDZwv@AONn{PzA^>!SY%d2T%<|(d83eyS%?^_CIt!I}uKB;Ng6@f`F~RuZOcwzgUs7aCg4n z%+knp0a#YZVm^+utoZO`~v~t+iFK53XgKuN3 z?r!2IJrg@dg}( zg9xGo1^JOkv}m$8ogR=#q>`fp{i6fKBxHo7Me%gPr8JzCDpjiBfde(on^@Miiv`MQ zcD$d_>o!r0N3EN7VUo&jnQYc+oLw_THn=VrNLXmOjLN4pnoX|Trmr}hT^F@u+dnIN zKU;sEkEc`m`341pyl+~?7JFjD6y448;AGF28d(H05Ya1V5k}H9$%WNawrVAr%f(u* zmdPPV#z;y`PEeEoXbBWBvI$2eWg<0cs%>JghEFS)&uqtZoQ@K@fV&OVrif`E8OoBe zRB2|MLxD>#+{1wnaB|4v15KD3J02^gw^IvcS~l$#*L|{9v*T{l*C9C$G>Ki#@osrVEkCh$g{th3*UpjrR?gT185s_w} z`09`(U38_QDe?v-iJzgOPDFyQ@`sfzDU@qkhaX9cO^#8LTW$=-YI(olaL}$H0|)nE zWTyWIeT#07@xWH`Z+p1VicLkb_j{Sjc$~Iv`Yp2vDS|&aO zSx>~r^{QE_jmyH~;+%GkZ7f#T`xTdiCLQ~KIBY@47{`F9vyQj`%Vx9fwd`*99WLE+ zoQil7<#W1tyY+M}hIo!tk7o`b8i)(cO97@S56i7AF+XdKV*;Rz_hcelPIbvNhJNBP6D(<-p`=w0Yg96EYp%GD|al1%v&B5D|4_A`F6) z8HxaIVN)|w_>Utpds;T_H?9y^8Nu-}dJ2+G77RiLqMYLY90rCeAMrnbaa8b*F70EQ z(V{1db6!g*m8Av)fY|5g2du?dvjnJ`T@YXx@!+c8$Ukj#K;Oj@OkrS9jJiNdN=#5z z@N?C=upQxEZ!zBs9Qp?c6f%Ih8J;zb1O31F2g2`q`t8ZRQ^0W$5W#ahTaq0xfCdvN zyx)%j6xMGG2B2NP>g%QgJ*&Uthkhu)k)$jCUubgExht74wT{tD?WBQio#W*oEMbnG50+P91csQ+g~Wa4>=07g{P#Jk}@2dWtMqoUAb-)z<VEHQU37DWPiF=KOU34D(m_ha5^L^JmVkEg{iQ>Bv!Kl} z#B~T9*uK~0={a@F!&!3AvYJSAWG|Ql8i0E``|U@R5g*AvVrscUN#1Ra+-Tn{fO|xM zeE&}n0Jl}Z>iX8$b#0iqdyQMBb5!kJ{Sw#Il+34a7`bvHUYG?O;uEQlhV31bNU=gi z3l^-P(Si$$*^Qi0Okf@DQVS39rGx&B$BYD|&+&*&LNW`EO?swV=OYQKAIlRc@Qm_bef-`L-fhtc?)HeL_JHcugCF1E9M4;A;M_-_dFM-0{T0=KKm21Mzqh8D z2L?vPv)@uct)?h#;Iei})b4EqM?FT{Z*!SjgodC)Oz=nX6#-gTkBM)$NQtYXW{k~P1i{a)p&jKW8}+c7X^P8- zws5TI1B63O&^`m05besoz9RovMXuc64`HZQVj)vvp@^I*Pi9*G;_I>P8FFySmY*A> z?FYAlVc?QIZ+0d7emA;5F z;o|H=7~i)XcgvvQl}L9~OybFyPHnWBtf}C~xVI-B<{T|0!)$=J>Q+Wj=D{(jrF671 zn{gCmaIN#7pyB#u$6B}0fW2ZXd2y`@8=9*B?R;8ZVHUtj4L&X&)MYcMv7Ep-xs z8yT!k(jGY|gjHv&lnCE%2(}zzCG6!4$*C8cBp?FZ)lwWJ@=QM}-T@4T{DlTh^D?Ss2|9{g z0<2?Z0gcNH1CwY6C;egjyx$NBWlV^5#@}ek*fqiy6rlzb4!@jmWO~>bYj{gDei#zx22Q3ygi@c&<;T%e~zwNhVFIMaaH* z9k%h4Z);OJw~uY#>V$LGgM-#DMUvjwbQ4%RO`5!{4e`|*M|So)l)f;-ARh|U;*%k` zM*kPFwK*%}^w47`M_K%2ta!|f$*(I>EHJ8^&*>q4bke{NSCij-bYEZ^!ZQVL_A>xa zyg!xCtIA!OgB*6lz?)!D4l76Xd^A*Jt`h#vt0}OAb3D7ogf~GM5`2lV9eE>h&d-=Bl;(s|Jr&ybK z=}#Y%bcR+VS~zlaf%^cvxn16h_Z@{(eQuO%%uQ60O!KAhc@m*hEf+SCDilH}h@(z? zfQcjh&jW-~Ay5QPE$YlvvGDZ)DNY9>k+bWn^(o=vzW!+)A_Q8^1!3wYGhOrPPoll% zHBswP#ra&0B8jLnB0p#B9q+@V@HjD=H3097EezrzF7Eg2P*@Mr*@E~aD4HFRANS>t zRk=826GtKM_vgpeYW8WTE6N!frrNpe@ca0r44K(HvB}4@r$wMvphzp4%A(ZBvKJ<5 zpv!E&_Mpo8;sKI{6*lZ>j&LSK2%lDrAI3(e1&4qD-?r#@Fz~$VV{_&{O(ls+2~`i9 zS3~r}$AB&y_`+3DqnffQ!h5}QN5#xkR6*FTdC8 z!H%W!iP;#I(K^N=PWdBm20d7Y4+OPYiK-sYkRWHA+D>VOw@^szfE=fe)6Q1Jadojt!_K;7X3&UmLal z#AR1&YQj#}rI+tL>e(n>qRGwcy$uul;u+BYK-_3?ZrR|?;f0y!yoPH&^DplO)iT>2 zulQ`OqGNOuK)9ZB?<`ZQAR>qzflsXD*c8W*nu#EXQWd1Hr|fBfKOW>qQbuaF#6> zd!znYKOnu`mi!HAs^F=)<3(bc6(%~T^+&-Srg{AXrT>W>n!F8wOFYjP5whvq$%QZO z#5`+yI^*#0EZ&Pp%ZUMzhcb9bw24}uv{*A)bC^@hqXDI!wnoPXkWd$U_Ih6+y#rHl zF6#`=!<5nM^j1A<;CVpm=jMw6cFaFlkPEd{8asKEt5o)hB!4R zeWMPYoAditS5>w9p^815e@fN^W&wbieL>%0L1nmcElh;~oO1{J1EF_$0ORrH6aB@o zj=j&`NGlxoox&-@t({4;VGb!#GQPfH96~~zwpIj3q-l`kSW`PAZ2d&afstH;T4XTh zP;X>m|6&)|GIa`5S8Gr>#ecVi+-pON5}rzwLs_qC{RHx5r+9M4C!%z6=n{5s8;MP+ zXy#@5^kgR&`}D^Ce*DAd^k>H=-y+#dg&9v=ta|rQ_=UcRkFogeNaWnG>jwKl)Sk9q zz^rTcemjKh3x3dU6v*_kd!%`&OaIAD86Z?gm>lE^&!#1H>S^0Ig=S--W!1l2K&b`q zAy>RF$=p(QEb6kbSk<||d?6n%Ee8=d0ry2? z6Y5Lhk@*kp`3c7s{=|7p(j3ONQmi4)_pR`nA&1?(Toz}=ADwdu znuk9b^;8D?*~F`lk=Bd0bn@ARigT+UXg!y~=M$+g&M(aRy9O`NYM-0saQ7{hZ!1rG zeOu&?7O^naTzx9aw7|`JhDwTHld}%OJ~aGy+9x8VN>=9GoUKZy{$VQ7C`?H(62y{+ zXX{|{aAaVxB5Nogkpb-098+Q<3Ipn#Z1GV55_-6rPj7B+7c1o6CFxRXaYkZ#bc3N5 zL0&N!z^WMFBjU}(=QGE{$eG5MqsINS5uzS`EGWBn`r7x;AHXzuj~3+g4LL()XsQq! zb5zNC1b2?Bj!zv+a88YQPdGtxlh@*jP5GvmZh7*?QA5@Ofc2~>_indt^lak@J&c(T zB-h;>;s~1IN?)nmAM5urIlIusSX9SU)dvss>IRKiy7f(6W)P^H4w zCqmhBwGdRPRN9<_o#$;qwiLNz8r@kQy?`0-@uF|7dR%L@Qj(nIX$YItr{lU}BnSte z`DD)D?X;wRw2G^PJC&lR_O<#}E~GGp(&q`2Updx%V{(}J&A8%vM2h`vy_%xn6s8E4 z9#wT@ozgD(@Si|I9DXtHlo=$ucduP6bw4(XW=SswBLwmokeO6Vs(RA$jBy`7_T^I{ zDp#`hZ18-9vY!-M`0Wnli24nYT;kWa|$a9I$b%Wc82g= zpOzW_Yt6t2hBCh%Ok{@FxOf+bO_87kHTu4H77UK_0%@`xMcE)C9%2n17jv+iW68Qi zi6Twg=Q)#V{{>L62SOB#zbij(dE?Kq+lQkxk+nbNN>3d=h|AIx6gIVRY$*O}sVxmN z4h0t*mH=oNoLR4Dv09e9mR{RYTUQ1bnRQ*)1p!1Fv*@2s!0vsCj9c2_b+A-qw#L2f zLm^N>R6y>Lejm4jk^8>bi6 zehTOO&Q$E10m{CWeHN|9@W8J2S!W`Z&}@=ocamPLn+DgWe2OK6dl6y_4o&hIX!a}$ zk(XTS%GJt`23s2ktLL>qt`bhffD@6(w@XB}X`|1^C#X1+-f`jnGe1@P-6`tnKI^hc zW(DmKZ;-W9Szz&3+1(`9HzeK47Nz*aFH_;QD6l*4ks8vW+a*JKBDp$pN5*jL} zXo^Kkbc0V2@$eSQX$$a0_M3-peY$A4NyU?~QDxEhO^O+S3SaW^M{oC86m^oRL6X&H^OU|Cb@!j<*;67^UL{F88`L=4?+XrWBtumviZk*%)~>< z1LzEQK?)-KMWrTo+)RSQ2mYsQiV3C+b}99n=P$#%esLLFo_p2MR(~!KityW^WU=Jut-NB# zO$T}$cel?e7G|wFcMhtoOizgCNp`GvZcaQgPbG672p+z{k%JW8dWm0!m>93s@jF&G zK;zku#y98wTjZLKsyh0X{3&iib{HZ_*rjE|@8jHa)d1ses#n|Oc*5M{-&eZ;>hM@d ziaM^NaJEAsS0Y|~fvJ9Hzrn12s^G*Mq5rHeXum%wBM^>yw6)vn92rvh6-%rZdQYX? zNum34?Ggg=Y7T@r(v2N)LYr^6g#N!dT9U_9+yYD#-oS@VF)pkCo!QeI1HIgzg>5{` z^`cDmLBBUw2dDj#pOLAW?@9gI|MIMu56(``RlkA#UKez!L*df*(`n3Pp_VWD6+6yB z;M+rj@t;v$62yZ~%x&X)M*p#w*q+hXK8)?YRjwnumaDqsdr`&7K}q>}s!;wNjPCH!bsPf6Z{qOZV%m@^u!TVG;tX6-+60mAAJTqqnkuo(LDZ3 zOV-0qg&xbC)sM3<%5KBbTIn>6nsL%1y1tajSyVcN#Go#ct7myMn2w=frutxvH7s90 z9S4O!qZDc+yKe!OUG2c5`PXd7?~%7o>p#L>YtS}UJy~&cpD)*I1jiBbe$X98ki2}| z{@v!^^Wz1yyxOnormI6byLf_yxx9bCq9VufjUJY1cYe1wj`mwiEubObPD{dXHb>W6 z4{htqiT8LitgyYN_vprL-wsD_0*nbw-y@!&4*TmP%ZZCm6*`3Ax%~9tusD07mXa{% zbpSbh?C8$?MP;$GMxF_~Mb#ZogKvw9qkF;LtmV1oSs;U(aYu}`dNG|E6G9tg05}`a z@9VVC7fB1Kp3@67pcUd98XBIxtu=ZVvEJu*N7_Doh|fUxz2{RjCa9n(WaMEcj>yc4 zjEon6JXo4sEANOG963n`Cx-EHD_LcQa))&E#qtW$O~~FVI5LF733yvv2s|G3Lll`d z)Vu=hYSZ)8Vt({GbZ`g){qR$QEcZJIfZQ7>bZBV_qDnSw5wVkM4q?KRo6iBOnxxDe zIjO>S7cXM{p#an%7J%PQwaNHKTQ*SUFc9SypkpIN)VZ6*#sollR z$M9WTbBWM@a-qHrl!a7plQ`*xiGC9mUJ5sAv7}x%wd~rq zVdwVm&zrEog~ewg;EnH42qPf3{EijhhI7|m;#_?@yNKRzX=Vr>)5R!1JD5UN6u1QD zCDaW+1Xt6ja1zEneur|w|83V6Yjg* z3txuT&}UdpO1qD9WNVJUsp0Wps68I3#~h$b8`WaN!`f`;xo4qb{% zQ6GSqj%d0!-$q{oyU51VU{=Lh;?-rk@ewydzx)biCtCe>eUHETL&ecx@tB#@;-RPN zK$Vr{V!2e3=mzG+jX4Ro&aVNOtkX??vPs&tx=Y)++3^t48Km>J01`DWK1u6-p);GE zF`r#OmF@#f4V7I#&1SQ6>u1~^@13tZ$k{BJSlgTp;|_gev(k(YFCTOb*9@zNmDvD@ z`+Zj0s4|f@RHu(!1DsqDdd+&libN}sZi8p^NXs8Jr#R-cI~r`leGNKCp~Y=<@We$$ z<$`*%X6?ryf>z@jDXo2Z9fkESfvyp$xKcOvA|9;W^d#DYiP1~uRcHaSpEH!(u1G}* zPfae&Ol=uEX?ot+(*6jEe&N|g3>;pSLBE{}1c*~qcO&Fdwd?v@To7bOq8_Fi-+o?l zEp!3X@^sukTNrMC>&>Uuw`{gG|C|GYx7!^d0rWj*xVCzz2WP(ZP@ck<-EnNSmVE~( zrRZ}8Z3Fb*J%xevD~@S_NB9j702qsF5Dfd{1M~rUonco-wCwHu@$wPzV8B&hBR6V$VrZ z+v>U4ZP&<^`0ZRs*`z>FDvV^hVQgpS6QGf91iO0QND2<;LIEw>l742Q3Y-P4V;Dz7Vt)O#Lj?F8I;gU-aNCW#(}t(h<6z z)7}iC7%W#{ZU&y~ZDlf}aWTDjl(MQ&L(R$C?QFH4Wq~)#&%uy;e$hAzIRkab5Qn1T zmlKfAn{qb16x1BNFmh6P>1wGx>iF&`+Ku!pCkY{E>FHlWPAG_|BdBZ>Rfi)d;?5P9 znT)L-X$fByHL*Ug+Cch_YcY+{RQAxIJ=Wdl$zFFp_+gjDzl_BKw|iDKNi6jc)24}?XAJ5?ujVuoxBsefh4^p zVf8mfV4D0zL0@}l{go^_^uYspRT2huaeO9Y#$vqb=5T=U&hjo# z-6jk69pGX8d=0#nr4dBLs793DId6wz=$ZR{AHPhATDU7m&9Z2V;!OtOY(VR>zxA; zw4&#G8}el0x=SLxf5Bd-;t&6xObs{V4}5(b@-fuOT@+5GatHy-^`b6fS`bdZ6VZVt1c(m{*F%?U?kfFQF6 zYH}5NA~)^n>DgAYGPzoaoeN_)v|a>BHIUS;x(t_MMhIupCy-Fa2YEj4yY>9|sVI_U z#K7lp_<7J?g9yB6s3jVxspn%GVQm$mXH6ZVPl1`EdUo^}L2Z%tK!F3U6t_+pgVae* zPg)GzzrQ$(O(Q7h;kKq?ml&=79i5^mO7+Usi-0$u;ES^ zP|-z6HJNv?=46+QJ{C*2{D>E~4(evNS;uCy&*;6tZ1|`-ULs7bqxBTOjlj-OJTh}9 zS|k?%temicC7?$i(qnMEhw)EvPBQuu4QM4aw_)5xrMFCx!B#ZdAOg9;MPfg%f_rf! z9%Re48PxQz{~PLF)%$&k6&kJRyp<<8xv?$E^5qgr1bRv@te$6`uac?aHix6ho|Pqa zzhc&sfSN7unf;~z3xGhBIZB(H9&QCat`6B$=W3w(_5*7GYE$z7WkMm+s*zlhS9!qi zeF^}xpM9-tvUjTpG7%pwc}$P)?5vizP`mQ+h+rTi*UC1P6uc>{x0wIq<*S_;T>i=U z@3JPZga`-8A=$^hOq)*_k@%TkE(=)D*-_L1kszm#7?km-w6W56m5=D~bYtRSVPm39 zVP3h^MV}cCU^$*DGe;8TN98F-3#E_5mTU8rnI&E7TjUW&ojM_IRaL_ZK2ieGv@MAf zXi|U(nW0+z_!h>7)91>Z1Wdg{@d${d!R9~b);(N$bbEMA<$M!~+NaE*iwII<5RWbU ziA{ZbVl!&+K0Sw*A1l-S9hT<<*@@+)E{e$|V}KRbdd)Q?<-V#eSCbZmwhdnX)TO-4 zggu?xtf8ZE)@2+F(FKVGtneXBUGXlf$Ez3+%u5`xJcmrpo&vHc)zPn$9W45%Wbb4K z&?ZaK*s2$}r;4JN^7@9b77gX8&f$+DpsE#hmX~_^mDPH5z(rUWuQhHqubcOXg)3tu zYE=^myw$6qFcD6*%U@ZofTJ&=ZL>M7P#eB3lFtM;JJ>&C6IZfOy3c^V%*A?q&S#=k zvT`-RU3}jpnrvBWh@Pg&n-jCH3AQ7GqSjr#wMwJ(y#3CE6&`=s9os~$`W7zyIWRgQ zZd!-Ag!1Xp!usx7agm~HkU?o>icm4ckNNnHfOu3wwk3M>9898Uatmb7gcYzG1rxIa zzu5=|H)Aq{_4(3!+2}+fWN?OeY9XCeeLDfQa)yL_^F_&!i%7b}RhASMw-e>M&DGk| zL$5m&27h*r(=}BpcRpKO}43{LNh#e*=fy{8wa8{oHRkBktD^S3EtCm@aPEHZ)63 z6<5xByYf47F&lZGFzg~#Xaa3;U_S_K_i^LKA4s=;`}_8+V{c^6sMkbn>a+PCm;qq) z#whH|sfCr~r6N-U;@bmCIg-*(<8Ko$3Bg+XfB_0^HF_UE_m(fb~Ux@WY zTqS%&qNr9!VxA{J&OI9P?-;YNtYR?uu+K^ytFgZ+Uc zEnLW{^x`U&gDk}J3dIcVPE%kC_j_6CK&$~>3Ai>V<1+`*6wU%@azSu%GzCESEXaYB z1wB6EHT;e_UbCIWN2v~;W?%jFp^_Us&Ye;&ViL_q4R6tvt& z^QCibb}MBuG5XW+#bX%@;PRDnbw4=iXF+WKY<#8i`1pPCcsS_hLV4o+y0fwE5YdOV zMByS*ke@^nh=Nc`ei{D)y{H)87$#}6CMm*W=V`~&it^939Y;pSv-;1O*oQHUSduf# z=oHSXj^ak<>dn>&2DrgZ`~~{#`!b<^c^%opX#%0;LHBh`5Y4(nEMgNL#xEkIESsRN z;w|2>zsQtL?xUeOj7XFvC*Y|e=gKHL5-?#hN*RHHB^$$y zt7-bmkj6kRROsr`R}o$LV@QZV{nN%rCK;%rV=nM%G2V1sLk51Wg9NAc`VAO{x11=d zZ~R5@T-^7X2g3KdhVJ0;8|)F)LJ!1Fx|6h1PQhY2v=uVAXKKr(H;tK`UsqRVo1CJ? zHg-h7-tgV$%q19Ea@ED+EACm1D0|haY5K_%GVJc&pT%ps$QfVash^FAx`2tpr9bo3eehe{as9CLuOXuOTx_RNwhBTjFWsph}tRn_7RQKKd zQBhIFP>m=-b-Hlwnurm6j`MtD>)~^@?tHEenw%#Oy1MM?v%=={#w#9d;=+;M%g z8{B#BouCLWwI_bJ9R>4v$9ERO`RcnG_^RrQ0B*UOuOeKW_rt7*2MCM1yB{^h@1Y6d zup6VUkXJg~=3}QME2Rdx(rK>8D^+Y=Nz$}&Gb&@Mjhcw4=hFXCwoqqbdiV#51q>d2 zP{i~B*bfTP;%ArW{xwwz#o^cB-r>??Q*JGGm7o=TUKq`d0FHNaO5OMa(GrFXawb{6 znVnA46Hp^CYjmR3w*74H;CsjYU|vh}N=C2W3nNdA6{HL}Khd01TZ9}=tCZ~70B|?A zWcGtN6-zc4Qo+gIiN`7rpg(-Kea!LvoG}CWWr~9HeEiV^we*G`2uiI0c|0g4D>8Y$ zt3;Kh2~!81m_em67OIRFY0L~tcYT2qgcSAdISMETQdbd^in4-w&c2vEfNxX~QI{0= zD@FyC9C-Z$M5DQqdKw;<2iTE}BYZkGDK&K$Dj~I$sF1~~X1R%NnP#H^dh}LO1Y~7p z1uU=JyaY&YU5noN+r8+y zk(^j32bu(|>Evg(9l@+`Vnzn&JJLnv=T2?dx$`E$ zspFIml>BA4vTb+Fd|30~maEtb^f>bK-z&XlPb~K?UA_*}2X1k(X{mQhoVW9Z0jBzu z(|xP#j;}{~GyQ@a>F>kJ)4cHSG~49eQ|#|7X<_fb&w6R-F>*OrFm`f-Dlv+~@T3JE zWDFUd>u%0HDY+8bKm_^t5o93FDUNBUcPHxL-!s@9a$3Zm+&B9R*)RE`T3>KlC?&WP z{6V>28bHSf`25WDp4^w?Z5^mxB-Pxhpz4oZ990>e)hZbT=XMs3%cHWBo|ZYzo_Kr4 z_nsa8v7aXd+ljz-gSi9WxFK`BZCXhUiq715O6FcBRp#%K%AvOvj})G7UZ&Of#3UPr z%%~@3kzyHgXS2uDtVWErqE9RhF{U>Y*|#bBO-<-$fU!nsmTebS8d42SNuPMuYu_xh z2I1k}>sz>;BZ%R0EOXJjO5zYHNt+uRbM45J@E+@CJ2wM7u64Yu-tM)ZmXoL4GekWw zJZCaLn*Dex7Kr@g@ydFfF-A8tIu>hAER)j^d7NJT_U>gg#c#ID2NlsMq!I zqEQD`B%ur{de&eh*|>(}qJS`7m7Dk4M18~> z3bNT6>YuDi1kw{Q@`x#-5iK27aY>t0YnouPqoXKZbl9#0kuFsI<4Ad;MfL%6%!@7? zaSjh|Hs;x0rofqQjUAIN6G?9aw`d0AI)3jXsH7oXtLmPW0jj%EwfdLmHw)etAwJnT zPBPSCEz(wt3`P^F9EvF5vG{ zzS|YH$8k3*(yHlE_u#VU{4_2yqUCMuHhUJ1lvC;UFnAFxCzP$m#Z&)zms`JwT8QtB zYP#e7=+meZy5ZE4V&X)eyQ8@=jXxY-XAPbGJ^op{ja|KvuHG3YKjoG0HCE>DN{2b4 z&aY{i&ad1Pbnp@x`!1|IBRU zue11a;hrxj2u>Np=i7+PC{)Ikh1HQxz9l+AQ~Ae|&CKJG%Un-Gy|IwZ@Hi=lcIf$SJ}(BH@zrDPO_)*dhy%8kR@wN{{B7>?@u{39U#R(57gY- z>D8U}(+QM-;Jtru{d9f3@5Z%%69EvQhs1*8V;k z09_^i8Wi}JHC2qs@lr&m$l)I%N|jKMgkb3Hs7d>c=rAf4^XQZRjV5)eP-7B)^^1gL zQ~P!F_+sqDj?RLjV%>*!+;E-c^V<_Rk9+N8XB(HJaC^#ie^p#-qhO7*p?40UXZNV* z?FyJAEjdTpB=FznUfSLJ&gS+pDi^-i>cQdLp{wV(zr;H9>&~#+n(Qvkjy43q9$+*? zZL8jLW9!9V%j4hn;8c5=IUM8JwW%$YYmQ6$dciWT+$-zO$_$; zNT-sV+8!=9$qx?zmd#D-c$$_>1?AhzeGjMO@Gbfjbp%Q;hHw6CV&K>!Xqn--WwQz# z!InM!(rFy34>MjfeKr0(ZdQ4*u#gSx+bOeML@6eVJN3WuCKc@+P_lrcH;Vqm#&yPK zUjt|NXz8ua?3SHc_uZnulHE@m0HvGIuid>LDQ*<6I#jTU4)Bn{{Wll{jV<1Hpl304 zu#l7;=f#d~>M+46-)6)1xAnX2QNo{?0rG7FO1@vhoh$EcdAAnRjdIllTTNZ^9q-+3 zo@|®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 C-b5q- literal 0 HcmV?d00001 diff --git a/frontend/main.js b/frontend/main.js new file mode 100644 index 0000000..5f780cd --- /dev/null +++ b/frontend/main.js @@ -0,0 +1,20 @@ +/* eslint-disable sort-imports */ +import { createApp, h } from 'vue' + +import './style.scss' + +import appMain from './components/app.vue' +import router from './router.js' + +const app = createApp({ + name: 'AccountingApp', + + render() { + return h(appMain) + }, + + router, +}) + +app.use(router) +app.mount('#app') diff --git a/frontend/router.js b/frontend/router.js new file mode 100644 index 0000000..3857448 --- /dev/null +++ b/frontend/router.js @@ -0,0 +1,13 @@ +import { createRouter, createWebHistory } from 'vue-router' + +const routes = [ + { component: null, name: 'budget', path: '/' }, + { component: null, name: 'account-transactions', path: '/accounts/:id' }, +] + +const router = createRouter({ + history: createWebHistory(), + routes, +}) + +export default router diff --git a/frontend/style.scss b/frontend/style.scss new file mode 100644 index 0000000..5c73c47 --- /dev/null +++ b/frontend/style.scss @@ -0,0 +1,10 @@ +// Force local fonts +$web-font-path: ''; + +@import "../node_modules/bootstrap/dist/css/bootstrap.css"; +@import "lato"; + +$fa-font-path: "../node_modules/@fortawesome/fontawesome-pro/webfonts"; +@import "../node_modules/@fortawesome/fontawesome-pro/scss/fontawesome.scss"; +@import "../node_modules/@fortawesome/fontawesome-pro/scss/solid.scss"; +@import "../node_modules/@fortawesome/fontawesome-pro/scss/brands.scss"; \ No newline at end of file diff --git a/main.go b/main.go index 5595f14..4dff4e1 100644 --- a/main.go +++ b/main.go @@ -7,6 +7,7 @@ import ( "git.luzifer.io/luzifer/accounting/pkg/api" "git.luzifer.io/luzifer/accounting/pkg/database" + "git.luzifer.io/luzifer/accounting/pkg/frontend" "github.com/gorilla/mux" "github.com/pkg/errors" "github.com/sirupsen/logrus" @@ -60,6 +61,7 @@ func main() { router := mux.NewRouter() api.RegisterHandler(router.PathPrefix("/api").Subrouter(), dbc, logrus.StandardLogger()) + frontend.RegisterHandler(router, logrus.StandardLogger()) var hdl http.Handler = router hdl = httpHelper.GzipHandler(hdl) diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..458161f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3471 @@ +{ + "name": "accounting", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "accounting", + "dependencies": { + "@fortawesome/fontawesome-pro": "^6.4.2", + "bootstrap": "^5.3.2", + "vue": "^3.4.14", + "vue-router": "^4.2.5" + }, + "devDependencies": { + "@babel/eslint-parser": "^7.23.3", + "esbuild": "^0.19.11", + "esbuild-plugin-vue3": "^0.4.0", + "esbuild-sass-plugin": "^2.16.1", + "eslint": "^8.56.0", + "eslint-plugin-vue": "^9.20.1" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", + "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "dev": true, + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.7", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/eslint-parser": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz", + "integrity": "sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==", + "dev": true, + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "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, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", + "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", + "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", + "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", + "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", + "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", + "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", + "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", + "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", + "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", + "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", + "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", + "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", + "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", + "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", + "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", + "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", + "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", + "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", + "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", + "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", + "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", + "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", + "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", + "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fortawesome/fontawesome-pro": { + "version": "6.5.1", + "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-pro/-/6.5.1/fontawesome-pro-6.5.1.tgz", + "integrity": "sha512-XLi5HOQ3XLNtM9UhrCyT5jEj0RHkx5GfzKDmUPpVTea4C/Ekj5plOYVAp9dUWgH+NWo3IrVpwhsnhIFh/FZPgA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.21.tgz", + "integrity": "sha512-SRfKmRe1KvYnxjEMtxEr+J4HIeMX5YBg/qhRHpxEIGjhX1rshcHlnFUE9K0GazhVKWM7B+nARSkV8LuvJdJ5/g==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "dev": true, + "dependencies": { + "eslint-scope": "5.1.1" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vue/compiler-core": { + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.14.tgz", + "integrity": "sha512-ro4Zzl/MPdWs7XwxT7omHRxAjMbDFRZEEjD+2m3NBf8YzAe3HuoSEZosXQo+m1GQ1G3LQ1LdmNh1RKTYe+ssEg==", + "dependencies": { + "@babel/parser": "^7.23.6", + "@vue/shared": "3.4.14", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.14.tgz", + "integrity": "sha512-nOZTY+veWNa0DKAceNWxorAbWm0INHdQq7cejFaWM1WYnoNSJbSEKYtE7Ir6lR/+mo9fttZpPVI9ZFGJ1juUEQ==", + "dependencies": { + "@vue/compiler-core": "3.4.14", + "@vue/shared": "3.4.14" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.14.tgz", + "integrity": "sha512-1vHc9Kv1jV+YBZC/RJxQJ9JCxildTI+qrhtDh6tPkR1O8S+olBUekimY0km0ZNn8nG1wjtFAe9XHij+YLR8cRQ==", + "dependencies": { + "@babel/parser": "^7.23.6", + "@vue/compiler-core": "3.4.14", + "@vue/compiler-dom": "3.4.14", + "@vue/compiler-ssr": "3.4.14", + "@vue/shared": "3.4.14", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.5", + "postcss": "^8.4.33", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.14.tgz", + "integrity": "sha512-bXT6+oAGlFjTYVOTtFJ4l4Jab1wjsC0cfSfOe2B4Z0N2vD2zOBSQ9w694RsCfhjk+bC2DY5Gubb1rHZVii107Q==", + "dependencies": { + "@vue/compiler-dom": "3.4.14", + "@vue/shared": "3.4.14" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.1.tgz", + "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==" + }, + "node_modules/@vue/reactivity": { + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.14.tgz", + "integrity": "sha512-xRYwze5Q4tK7tT2J4uy4XLhK/AIXdU5EBUu9PLnIHcOKXO0uyXpNNMzlQKuq7B+zwtq6K2wuUL39pHA6ZQzObw==", + "dependencies": { + "@vue/shared": "3.4.14" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.14.tgz", + "integrity": "sha512-qu+NMkfujCoZL6cfqK5NOfxgXJROSlP2ZPs4CTcVR+mLrwl4TtycF5Tgo0QupkdBL+2kigc6EsJlTcuuZC1NaQ==", + "dependencies": { + "@vue/reactivity": "3.4.14", + "@vue/shared": "3.4.14" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.14.tgz", + "integrity": "sha512-B85XmcR4E7XsirEHVqhmy4HPbRT9WLFWV9Uhie3OapV9m1MEN9+Er6hmUIE6d8/l2sUygpK9RstFM2bmHEUigA==", + "dependencies": { + "@vue/runtime-core": "3.4.14", + "@vue/shared": "3.4.14", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.14.tgz", + "integrity": "sha512-pwSKXQfYdJBTpvWHGEYI+akDE18TXAiLcGn+Q/2Fj8wQSHWztoo7PSvfMNqu6NDhp309QXXbPFEGCU5p85HqkA==", + "dependencies": { + "@vue/compiler-ssr": "3.4.14", + "@vue/shared": "3.4.14" + }, + "peerDependencies": { + "vue": "3.4.14" + } + }, + "node_modules/@vue/shared": { + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.14.tgz", + "integrity": "sha512-nmi3BtLpvqXAWoRZ6HQ+pFJOHBU4UnH3vD3opgmwXac7vhaHKA9nj1VeGjMggdB9eLtW83eHyPCmOU1qzdsC7Q==" + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/bootstrap": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.2.tgz", + "integrity": "sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001576", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001576.tgz", + "integrity": "sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "peer": true + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "peer": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "peer": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.630", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.630.tgz", + "integrity": "sha512-osHqhtjojpCsACVnuD11xO5g9xaCyw7Qqn/C2KParkMv42i8jrJJgx3g7mkHfpxwhy9MnOJr8+pKOdZ7qzgizg==", + "dev": true, + "peer": true + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", + "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.11", + "@esbuild/android-arm": "0.19.11", + "@esbuild/android-arm64": "0.19.11", + "@esbuild/android-x64": "0.19.11", + "@esbuild/darwin-arm64": "0.19.11", + "@esbuild/darwin-x64": "0.19.11", + "@esbuild/freebsd-arm64": "0.19.11", + "@esbuild/freebsd-x64": "0.19.11", + "@esbuild/linux-arm": "0.19.11", + "@esbuild/linux-arm64": "0.19.11", + "@esbuild/linux-ia32": "0.19.11", + "@esbuild/linux-loong64": "0.19.11", + "@esbuild/linux-mips64el": "0.19.11", + "@esbuild/linux-ppc64": "0.19.11", + "@esbuild/linux-riscv64": "0.19.11", + "@esbuild/linux-s390x": "0.19.11", + "@esbuild/linux-x64": "0.19.11", + "@esbuild/netbsd-x64": "0.19.11", + "@esbuild/openbsd-x64": "0.19.11", + "@esbuild/sunos-x64": "0.19.11", + "@esbuild/win32-arm64": "0.19.11", + "@esbuild/win32-ia32": "0.19.11", + "@esbuild/win32-x64": "0.19.11" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", + "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", + "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", + "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", + "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", + "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", + "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", + "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", + "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", + "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", + "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", + "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", + "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", + "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", + "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", + "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", + "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-plugin-vue3": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/esbuild-plugin-vue3/-/esbuild-plugin-vue3-0.4.0.tgz", + "integrity": "sha512-CRm34hWeyMKITJmfsE2yEinG0HoV2DgCAv4sa8fiWqN0zxhpXkVX1Rd/glyYAfkY+4CzBEn6azPlfTBWlqByYg==", + "dev": true, + "dependencies": { + "@vue/compiler-core": "^3.2.26", + "@vue/compiler-sfc": "^3.2.26", + "esbuild": "^0.14.8", + "typescript": "^4.7.4" + }, + "peerDependencies": { + "cheerio": "^1.0.0-rc.10", + "html-minifier": "^4.0.0", + "pug": "^3.0.2", + "sass": "^1.35.2" + }, + "peerDependenciesMeta": { + "cheerio": { + "optional": true + }, + "html-minifier": { + "optional": true + }, + "pug": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/esbuild-plugin-vue3/node_modules/@esbuild/linux-loong64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", + "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-plugin-vue3/node_modules/esbuild": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", + "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/linux-loong64": "0.14.54", + "esbuild-android-64": "0.14.54", + "esbuild-android-arm64": "0.14.54", + "esbuild-darwin-64": "0.14.54", + "esbuild-darwin-arm64": "0.14.54", + "esbuild-freebsd-64": "0.14.54", + "esbuild-freebsd-arm64": "0.14.54", + "esbuild-linux-32": "0.14.54", + "esbuild-linux-64": "0.14.54", + "esbuild-linux-arm": "0.14.54", + "esbuild-linux-arm64": "0.14.54", + "esbuild-linux-mips64le": "0.14.54", + "esbuild-linux-ppc64le": "0.14.54", + "esbuild-linux-riscv64": "0.14.54", + "esbuild-linux-s390x": "0.14.54", + "esbuild-netbsd-64": "0.14.54", + "esbuild-openbsd-64": "0.14.54", + "esbuild-sunos-64": "0.14.54", + "esbuild-windows-32": "0.14.54", + "esbuild-windows-64": "0.14.54", + "esbuild-windows-arm64": "0.14.54" + } + }, + "node_modules/esbuild-sass-plugin": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/esbuild-sass-plugin/-/esbuild-sass-plugin-2.16.1.tgz", + "integrity": "sha512-mBB2aEF0xk7yo+Q9pSUh8xYED/1O2wbAM6IauGkDrqy6pl9SbJNakLeLGXiNpNujWIudu8TJTZCv2L5AQYRXtA==", + "dev": true, + "dependencies": { + "resolve": "^1.22.6", + "sass": "^1.7.3" + }, + "peerDependencies": { + "esbuild": "^0.19.4" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", + "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", + "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", + "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", + "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-vue": { + "version": "9.20.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.20.1.tgz", + "integrity": "sha512-GyCs8K3lkEvoyC1VV97GJhP1SvqsKCiWGHnbn0gVUYiUhaH2+nB+Dv1uekv1THFMPbBfYxukrzQdltw950k+LQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.13", + "semver": "^7.5.4", + "vue-eslint-parser": "^9.4.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-vue/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-vue/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-vue/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "peer": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "peer": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "peer": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "peer": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true, + "peer": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", + "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sass": { + "version": "1.69.7", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.7.tgz", + "integrity": "sha512-rzj2soDeZ8wtE2egyLXgOOHQvaC2iosZrkF6v3EUG+tBwEvhqUCzm0VP3k9gHF9LXbSrRhT5SksoI56Iw8NPnQ==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "peer": true, + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vue": { + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.14.tgz", + "integrity": "sha512-Rop5Al/ZcBbBz+KjPZaZDgHDX0kUP4duEzDbm+1o91uxYUNmJrZSBuegsNIJvUGy+epLevNRNhLjm08VKTgGyw==", + "dependencies": { + "@vue/compiler-dom": "3.4.14", + "@vue/compiler-sfc": "3.4.14", + "@vue/runtime-dom": "3.4.14", + "@vue/server-renderer": "3.4.14", + "@vue/shared": "3.4.14" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-eslint-parser": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.0.tgz", + "integrity": "sha512-7KsNBb6gHFA75BtneJsoK/dbZ281whUIwFYdQxA68QrCrGMXYzUMbPDHGcOQ0OocIVKrWSKWXZ4mL7tonCXoUw==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vue-eslint-parser/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vue-eslint-parser/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vue-eslint-parser/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/vue-router": { + "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" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "peer": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..7544255 --- /dev/null +++ b/package.json @@ -0,0 +1,18 @@ +{ + "devDependencies": { + "@babel/eslint-parser": "^7.23.3", + "esbuild": "^0.19.11", + "esbuild-plugin-vue3": "^0.4.0", + "esbuild-sass-plugin": "^2.16.1", + "eslint": "^8.56.0", + "eslint-plugin-vue": "^9.20.1" + }, + "name": "accounting", + "private": true, + "dependencies": { + "@fortawesome/fontawesome-pro": "^6.4.2", + "bootstrap": "^5.3.2", + "vue": "^3.4.14", + "vue-router": "^4.2.5" + } +} \ No newline at end of file diff --git a/pkg/api/account.go b/pkg/api/account.go index 58ab326..7187eb4 100644 --- a/pkg/api/account.go +++ b/pkg/api/account.go @@ -45,7 +45,7 @@ func (a apiServer) handleCreateAccount(w http.ResponseWriter, r *http.Request) { return } - http.Redirect(w, r, u.String(), http.StatusTemporaryRedirect) + http.Redirect(w, r, u.String(), http.StatusFound) } func (a apiServer) handleGetAccount(w http.ResponseWriter, r *http.Request) { @@ -69,9 +69,12 @@ func (a apiServer) handleGetAccount(w http.ResponseWriter, r *http.Request) { } func (a apiServer) handleListAccounts(w http.ResponseWriter, r *http.Request) { - var payload any + var ( + payload any + showHidden = r.URL.Query().Has("with-hidden") + ) if r.URL.Query().Has("with-balances") { - accs, err := a.dbc.ListAccountBalances() + accs, err := a.dbc.ListAccountBalances(showHidden) if err != nil { a.errorResponse(w, err, "getting account balances", http.StatusInternalServerError) return @@ -80,14 +83,14 @@ func (a apiServer) handleListAccounts(w http.ResponseWriter, r *http.Request) { } else { at := database.AccountType(r.URL.Query().Get("account-type")) if at.IsValid() { - accs, err := a.dbc.ListAccountsByType(at) + accs, err := a.dbc.ListAccountsByType(at, showHidden) if err != nil { a.errorResponse(w, err, "getting accounts", http.StatusInternalServerError) return } payload = accs } else { - accs, err := a.dbc.ListAccounts() + accs, err := a.dbc.ListAccounts(showHidden) if err != nil { a.errorResponse(w, err, "getting accounts", http.StatusInternalServerError) return @@ -116,7 +119,7 @@ func (a apiServer) handleTransferMoney(w http.ResponseWriter, r *http.Request) { return } - if amount, err = strconv.ParseFloat(mux.Vars(r)["to"], 64); err != nil { + if amount, err = strconv.ParseFloat(r.URL.Query().Get("amount"), 64); err != nil { a.errorResponse(w, err, "parsing amount", http.StatusBadRequest) return } diff --git a/pkg/api/transaction.go b/pkg/api/transaction.go index c47f13c..c7346cd 100644 --- a/pkg/api/transaction.go +++ b/pkg/api/transaction.go @@ -37,7 +37,7 @@ func (a apiServer) handleCreateTransaction(w http.ResponseWriter, r *http.Reques return } - http.Redirect(w, r, u.String(), http.StatusTemporaryRedirect) + http.Redirect(w, r, u.String(), http.StatusFound) } func (a apiServer) handleDeleteTransaction(w http.ResponseWriter, r *http.Request) { diff --git a/pkg/database/constants.go b/pkg/database/constants.go index 5ab8d4e..49ddfde 100644 --- a/pkg/database/constants.go +++ b/pkg/database/constants.go @@ -1,13 +1,41 @@ package database -import "github.com/google/uuid" +import ( + "fmt" + "math" + "strconv" -const constAcctIDNamespace = "17de217e-94d7-4a9b-8833-ecca7f0eb6ca" + "github.com/google/uuid" +) + +const constAcctIDNamespace = "00000000-0000-0000-0000-%012s" var ( // UnallocatedMoney is a category UUID which is automatically created // during database migration phase and therefore always available - UnallocatedMoney = uuid.NewSHA1(uuid.MustParse(constAcctIDNamespace), []byte("unallocated-money")) + UnallocatedMoney = makeConstAcctID(1) + // StartingBalance is a category UUID which is automatically created + // and hidden during database migration and used in frontend as constant + StartingBalance = makeConstAcctID(2) //nolint:gomnd - invalidAcc = uuid.NewSHA1(uuid.MustParse(constAcctIDNamespace), []byte("INVALID ACCOUNT")) + invalidAcc = makeConstAcctID(math.MaxUint32) + + migrateCreateAccounts = []Account{ + { + BaseModel: BaseModel{ID: UnallocatedMoney}, + Hidden: false, + Name: "Unallocated Money", + Type: AccountTypeCategory, + }, + { + BaseModel: BaseModel{ID: StartingBalance}, + Hidden: true, + Name: "Starting Balance", + Type: AccountTypeCategory, + }, + } ) + +func makeConstAcctID(fixedNumber uint32) uuid.UUID { + return uuid.MustParse(fmt.Sprintf(constAcctIDNamespace, strconv.FormatUint(uint64(fixedNumber), 16))) +} diff --git a/pkg/database/database.go b/pkg/database/database.go index 7badc44..475d758 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -60,15 +60,11 @@ func New(dbtype, dsn string) (*Client, error) { return nil, fmt.Errorf("migrating database schema: %w", err) } - if err = db.Save(&Account{ - BaseModel: BaseModel{ - ID: UnallocatedMoney, - }, - Name: "Unallocated Money", - Type: AccountTypeCategory, - Hidden: false, - }).Error; err != nil { - return nil, fmt.Errorf("ensuring unallocated money category: %w", err) + for i := range migrateCreateAccounts { + a := migrateCreateAccounts[i] + if err = db.Save(&a).Error; err != nil { + return nil, fmt.Errorf("ensuring default account %q: %w", a.Name, err) + } } return &Client{ @@ -146,8 +142,8 @@ func (c *Client) GetTransactionByID(id uuid.UUID) (tx Transaction, err error) { // ListAccountBalances returns a list of accounts with their // corresponding balance -func (c *Client) ListAccountBalances() (a []AccountBalance, err error) { - accs, err := c.ListAccounts() +func (c *Client) ListAccountBalances(showHidden bool) (a []AccountBalance, err error) { + accs, err := c.ListAccounts(showHidden) if err != nil { return nil, fmt.Errorf("listing accounts: %w", err) } @@ -191,9 +187,17 @@ func (c *Client) ListAccountBalances() (a []AccountBalance, err error) { } // ListAccounts returns a list of all accounts -func (c *Client) ListAccounts() (a []Account, err error) { +// +//revive:disable-next-line:flag-parameter +func (c *Client) ListAccounts(showHidden bool) (a []Account, err error) { if err = c.retryRead(func(db *gorm.DB) error { - return db.Find(&a, "hidden = ?", false).Error + q := db.Model(&Account{}) + + if !showHidden { + q = q.Where("hidden = ?", false) + } + + return q.Find(&a).Error }); err != nil { return a, fmt.Errorf("listing accounts: %w", err) } @@ -202,9 +206,17 @@ func (c *Client) ListAccounts() (a []Account, err error) { } // ListAccountsByType returns a list of all accounts of the given type -func (c *Client) ListAccountsByType(at AccountType) (a []Account, err error) { +// +//revive:disable-next-line:flag-parameter +func (c *Client) ListAccountsByType(at AccountType, showHidden bool) (a []Account, err error) { if err = c.retryRead(func(db *gorm.DB) error { - return db.Find(&a, "type = ?", at).Error + q := db.Where("type = ?", at) + + if !showHidden { + q = q.Where("hidden = ?", false) + } + + return q.Find(&a).Error }); err != nil { return a, fmt.Errorf("listing accounts: %w", err) } diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index 7fc1639..5c63508 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -43,29 +43,29 @@ func TestAccountManagement(t *testing.T) { assert.Equal(t, "test", act.Name) // List all accounts - accs, err := dbc.ListAccounts() + accs, err := dbc.ListAccounts(false) assert.NoError(t, err) assert.Len(t, accs, 2) // Hide account and list again assert.NoError(t, dbc.UpdateAccountHidden(actID, true)) - accs, err = dbc.ListAccounts() + accs, err = dbc.ListAccounts(false) assert.NoError(t, err) assert.Len(t, accs, 1) // Unhide account and list again assert.NoError(t, dbc.UpdateAccountHidden(actID, false)) - accs, err = dbc.ListAccounts() + accs, err = dbc.ListAccounts(false) assert.NoError(t, err) assert.Len(t, accs, 2) // List accounts from other type - accs, err = dbc.ListAccountsByType(AccountTypeCategory) + accs, err = dbc.ListAccountsByType(AccountTypeCategory, false) assert.NoError(t, err) assert.Len(t, accs, 1) // List accounts from existing type - accs, err = dbc.ListAccountsByType(AccountTypeBudget) + accs, err = dbc.ListAccountsByType(AccountTypeBudget, false) assert.NoError(t, err) assert.Len(t, accs, 1) @@ -128,7 +128,7 @@ func TestTransactions(t *testing.T) { assert.NotEqual(t, uuid.Nil, tx.ID) // Now we should have money… - bals, err := dbc.ListAccountBalances() + bals, err := dbc.ListAccountBalances(false) require.NoError(t, err) checkAcctBal(bals, tb1.ID, 1000) checkAcctBal(bals, tb2.ID, 0) @@ -138,7 +138,7 @@ func TestTransactions(t *testing.T) { // Lets redistribute the money require.NoError(t, dbc.TransferMoney(UnallocatedMoney, tc.ID, 500)) - bals, err = dbc.ListAccountBalances() + bals, err = dbc.ListAccountBalances(false) require.NoError(t, err) checkAcctBal(bals, tb1.ID, 1000) checkAcctBal(bals, tb2.ID, 0) @@ -148,7 +148,7 @@ func TestTransactions(t *testing.T) { // Now transfer some money to another budget account require.NoError(t, dbc.TransferMoney(tb1.ID, tb2.ID, 100)) - bals, err = dbc.ListAccountBalances() + bals, err = dbc.ListAccountBalances(false) require.NoError(t, err) checkAcctBal(bals, tb1.ID, 900) checkAcctBal(bals, tb2.ID, 100) @@ -158,7 +158,7 @@ func TestTransactions(t *testing.T) { // And some to a tracking account (needs category) require.NoError(t, dbc.TransferMoneyWithCategory(tb1.ID, tt.ID, 100, tc.ID)) - bals, err = dbc.ListAccountBalances() + bals, err = dbc.ListAccountBalances(false) require.NoError(t, err) checkAcctBal(bals, tb1.ID, 800) checkAcctBal(bals, tb2.ID, 100) @@ -178,7 +178,7 @@ func TestTransactions(t *testing.T) { }) require.NoError(t, err) assert.False(t, lltx.Cleared) - bals, err = dbc.ListAccountBalances() + bals, err = dbc.ListAccountBalances(false) require.NoError(t, err) checkAcctBal(bals, tb1.ID, 700) checkAcctBal(bals, tb2.ID, 100) @@ -197,7 +197,7 @@ func TestTransactions(t *testing.T) { // Oh, wrong category require.NoError(t, dbc.UpdateTransactionCategory(lltx.ID, UnallocatedMoney)) - bals, err = dbc.ListAccountBalances() + bals, err = dbc.ListAccountBalances(false) require.NoError(t, err) checkAcctBal(bals, tb1.ID, 700) checkAcctBal(bals, tb2.ID, 100) @@ -219,7 +219,7 @@ func TestTransactions(t *testing.T) { // We made an error and didn't pay the landlord require.NoError(t, dbc.DeleteTransaction(lltx.ID)) - bals, err = dbc.ListAccountBalances() + bals, err = dbc.ListAccountBalances(false) require.NoError(t, err) checkAcctBal(bals, tb1.ID, 800) checkAcctBal(bals, tb2.ID, 100) diff --git a/pkg/frontend/assets/index.html b/pkg/frontend/assets/index.html new file mode 100644 index 0000000..f4c3d4b --- /dev/null +++ b/pkg/frontend/assets/index.html @@ -0,0 +1,20 @@ + + + + + + + + Accounting + + + + +

+ + + + + diff --git a/pkg/frontend/frontend.go b/pkg/frontend/frontend.go new file mode 100644 index 0000000..b9b360f --- /dev/null +++ b/pkg/frontend/frontend.go @@ -0,0 +1,79 @@ +// Package frontend contains compiled frontend assets and a registration +// for the HTTP listeners +package frontend + +import ( + "embed" + "errors" + "fmt" + "io" + "io/fs" + "mime" + "net/http" + "path" + + "github.com/gorilla/mux" + "github.com/sirupsen/logrus" +) + +type ( + frontendServer struct { + router *mux.Router + log *logrus.Logger + } +) + +//go:embed assets/* +var assets embed.FS + +// RegisterHandler takes a Router and registers the frontend onto that +// router +func RegisterHandler(router *mux.Router, logger *logrus.Logger) { + srv := frontendServer{router, logger} + + router. + PathPrefix("/assets"). + Handler(http.StripPrefix("/assets", http.HandlerFunc(srv.handleAsset))). + Methods(http.MethodGet) + router.NotFoundHandler = http.HandlerFunc(srv.handleIndex) +} + +func (f frontendServer) handleAsset(w http.ResponseWriter, r *http.Request) { + asset, err := assets.Open(path.Join("assets", r.URL.Path)) + if err != nil { + if errors.Is(err, fs.ErrNotExist) { + http.Error(w, "that's not the file you're looking for", http.StatusNotFound) + return + } + http.Error(w, fmt.Sprintf("opening asset: %s", err), http.StatusInternalServerError) + return + } + defer func() { + if err := asset.Close(); err != nil { + f.log.WithError(err).Error("closing assets file (leaked fd)") + } + }() + + w.Header().Set("Content-Type", mime.TypeByExtension(path.Ext(r.URL.Path))) + + if _, err = io.Copy(w, asset); err != nil { + f.log.WithError(err).Debug("copying index to browser") + } +} + +func (f frontendServer) handleIndex(w http.ResponseWriter, _ *http.Request) { + index, err := assets.Open("assets/index.html") + if err != nil { + http.Error(w, fmt.Sprintf("opening index: %s", err), http.StatusInternalServerError) + return + } + defer func() { + if err := index.Close(); err != nil { + f.log.WithError(err).Error("closing assets file (leaked fd)") + } + }() + + if _, err = io.Copy(w, index); err != nil { + f.log.WithError(err).Debug("copying index to browser") + } +}