diff --git a/.dockerignore b/.dockerignore index 762eda321de6fcd05a277ab12e97c5ce01e648ba..db7b4285480598fe3ca884c25206a38768bb873f 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,4 @@ node_modules .git dist +.idea diff --git a/.gitignore b/.gitignore index b0b76d98da60c6d4518fd5dd1d5bb5d81a5a340d..dec6fc796b98fc1450aa486afe8c5fa909925761 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,5 @@ coverage *.sln *.sw? .env + +public/env.js diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 850d339540bd5a9e675c07d2f7343b59b724457f..7f2ba9a7fd7aeb4e8520120bb0d07850cf9a1610 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,4 @@ -image: node:16 +image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/node:18 cache: paths: - node_modules @@ -6,15 +6,23 @@ cache: stages: - test - build + - deploy -before_script: - - npm --version # For debugging - - npm install +default: + tags: + - docker + before_script: + - npm --version # For debugging + - npm install --no-fund lint: stage: test script: - npm run lint + +type-check: + stage: test + script: - npm run type-check build: @@ -24,3 +32,38 @@ build: artifacts: paths: - dist + +build-publish-dev-docker-container-job: + stage: deploy + image: + name: gcr.io/kaniko-project/executor:v1.17.0-debug + entrypoint: [""] + only: + refs: + - main + before_script: + - echo "{\"auths\":{\"${CI_REGISTRY}\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"},\"$(echo -n $CI_DEPENDENCY_PROXY_SERVER | awk -F[:] '{print $1}')\":{\"auth\":\"$(printf "%s:%s" ${CI_DEPENDENCY_PROXY_USER} "${CI_DEPENDENCY_PROXY_PASSWORD}" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json + script: + - /kaniko/executor + --context "${CI_PROJECT_DIR}" + --dockerfile "${CI_PROJECT_DIR}/Dockerfile" + --destination "${CI_REGISTRY_IMAGE}:dev-${CI_COMMIT_SHA}" + --destination "${CI_REGISTRY_IMAGE}:dev-latest" + +build-publish-docker-container-job: + stage: deploy + image: + name: gcr.io/kaniko-project/executor:v1.17.0-debug + entrypoint: [""] + only: + - tags + before_script: + - echo "{\"auths\":{\"${CI_REGISTRY}\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"},\"$(echo -n $CI_DEPENDENCY_PROXY_SERVER | awk -F[:] '{print $1}')\":{\"auth\":\"$(printf "%s:%s" ${CI_DEPENDENCY_PROXY_USER} "${CI_DEPENDENCY_PROXY_PASSWORD}" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json + script: + - /kaniko/executor + --context "${CI_PROJECT_DIR}" + --dockerfile "${CI_PROJECT_DIR}/Dockerfile" + --destination "${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG}" + --destination "${CI_REGISTRY_IMAGE}:$(echo ${CI_COMMIT_TAG} | cut -d'.' -f1-2)" + --destination "${CI_REGISTRY_IMAGE}:$(echo ${CI_COMMIT_TAG} | cut -d'.' -f1)" + --destination "${CI_REGISTRY_IMAGE}:latest" diff --git a/CHANGELOG.md b/CHANGELOG.md index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..e8cf31a6b094281a12945d0c8ca77146773e18c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -0,0 +1,13 @@ +## Version 1.0.1 + +### General +* Improved UI when browsing a non-existing bucket or a bucket without permissions for +* Improved UI when not browsing a bucket +* Load environment variables dynamically instead of injecting them into the build process. +You can now restart the docker container with new env variables without rebuilding it. +The browser cache for this file is disabled to immediately see the changes #27 +### Fixes +* Show correct number of visible objects when searching for objects #28 +### Internal +* Use a central repository for the buckets and current user permissions to simplify complex interactions between components #29 +* Add healthcheck to docker container diff --git a/DEVELOPING.md b/DEVELOPING.md index 7cb00f0d03b4c94c2513395f613143cecab6f909..43f07429d385b7ce75263efa6dd5249c5a2e49ad 100644 --- a/DEVELOPING.md +++ b/DEVELOPING.md @@ -7,11 +7,14 @@ npm install ``` ## Environment Setup -Create the file `.env` with the following (or similar) content. See the [README](README.md) for details on these -environment variables. -``` -VITE_API_BASE_URL=http://localhost:9999/api -VITE_S3_URL=http://localhost:9998 +This has to be done only once. Export the environment variables with the appropriate values and use the `envsubst` command +to populate the template and create the file the `public/env.js` +```shell +export AUTH_API_BASE_URL=http://localhost:9999/api/auth-service +export WORKFLOW_API_BASE_URL=http://localhost:9999/api/workflow-service +export S3PROXY_API_BASE_URL=http://localhost:9999/api/s3proxy-service +export S3_URL=http://localhost:9998 +envsubst < src/assets/env.template.js > public/env.js ``` ## Backend Setup Clone the [repository](https://gitlab.ub.uni-bielefeld.de/denbi/object-storage-access) for the backend and set up the diff --git a/Dockerfile b/Dockerfile index a32d8d61f4c7cad7b5ed2720d1b2b2d2805b13a8..59677c69b7ffce60fcccbea4501d5a1e92c4cc0b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,16 +1,17 @@ # build stage -FROM node:16 as build-stage +FROM gitlab.ub.uni-bielefeld.de/cmg/clowm/dependency_proxy/containers/node:18 as build-stage WORKDIR /app -# RUN apk add yarn COPY package.json ./ COPY package-lock.json ./ -RUN npm install +RUN npm install --no-fund COPY . . RUN npm run build-only # production stage -FROM nginx:stable-alpine as production-stage +FROM gitlab.ub.uni-bielefeld.de/cmg/clowm/dependency_proxy/containers/nginx:stable-alpine as production-stage +HEALTHCHECK --interval=30s --timeout=4s CMD curl --head -f http://localhost || exit 1 COPY --from=build-stage /app/dist /usr/share/nginx/html +COPY --from=build-stage /app/src/assets/env.template.js /tmp COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 -CMD ["nginx", "-g", "daemon off;"] +CMD ["/bin/sh", "-c", "envsubst < /tmp/env.template.js > /usr/share/nginx/html/env.js && exec nginx -g 'daemon off;'"] diff --git a/README.md b/README.md index c563b1bd93f21f66050cd92ce2b9b2bed7949cd4..4733d826e19f1495e86207bb7bd713ed97185739 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,19 @@ -# ProxyAPI-UI +# CloWM-UI ## Description -This is the Frontend to manage your S3 Buckets and start Workflows. For further information visit the repository for the -backend https://gitlab.ub.uni-bielefeld.de/denbi/object-storage-access +This is the Frontend to manage your S3 Buckets and start Workflows. ## Environment Variables -These needs to be present when bundling the JavaScript files. -This needs to be considered when building docker images. +The docker container replaces them in the `env.template.js` file and moves that file to the same location as the `index.html`. +When accessing the website, these variables will be loaded dynamically into the application. -| Variable | Default | Value | Description | -|---------------------|---------------------------|-----------|----------------------------------------| -| `VITE_API_BASE_URL` | http://localhost:9999/api | HTTP URL | Base URL for the API as backend | -| `VITE_S3_URL` | unset | HTTP URL | URL of the S3 storage to interact with | -## Getting started - -This service depends on multiple other services. See [DEVELOPING.md](DEVELOPING.md) how to set these up for developing -on your local machine. +| Variable | Default | Value | Description | +|-------------------------|---------|----------|--------------------------------------------------| +| `AUTH_API_BASE_URL` | unset | HTTP URL | Base URL for the Auth Service API | +| `WORKFLOW_API_BASE_URL` | unset | HTTP URL | Base URL for the Workflow Service API | +| `S3PROXY_API_BASE_URL` | unset | HTTP URL | Base URL for the S3Proxy Service API | +| `S3_URL` | unset | HTTP URL | URL of the S3 storage to interact with | +| `DEV_SYSTEM` | `false` | boolean | Flag if the service is installed on a Dev system | diff --git a/index.html b/index.html index 87d4c4bbfbf28d649522ab90fe2b7412cb0af47d..61088270988b1c5c2bd89e8457bf83bc02b0d28b 100644 --- a/index.html +++ b/index.html @@ -1,13 +1,14 @@ <!DOCTYPE html> -<html lang="en"> +<html lang="en" data-bs-theme="light"> <head> <meta charset="UTF-8" /> <link rel="icon" href="/favicon.ico" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - <title>S3 Proxy</title> + <title>CloWM</title> + <script src="/env.js"></script> </head> <body> - <div id="app"></div> + <div id="app" class="d-flex flex-column justify-content-between" style="min-height: 100vh"></div> <script type="module" src="/src/main.ts"></script> </body> </html> diff --git a/nginx.conf b/nginx.conf index 1424297eef187edb0899678349378b38859a80d3..eca71fafffaa1157d81bd2dd6bed4fef96f96c31 100644 --- a/nginx.conf +++ b/nginx.conf @@ -7,6 +7,11 @@ server { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html; + # Disable cache for env.js + location ~ env\.js { + add_header Cache-Control 'no-store'; + expires off; + } } diff --git a/package-lock.json b/package-lock.json index 0bd1e52a3b7a1e549b97c21e7f538cce432c9cf0..526ec7500ee19be500f24e93b3b264b18cc526e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,47 +1,67 @@ { - "name": "proxyapi-ui", - "version": "1.0.0", - "lockfileVersion": 2, + "name": "clowm-ui", + "version": "2.0.0", + "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "proxyapi-ui", - "version": "1.0.0", + "name": "clowm-ui", + "version": "2.0.0", "dependencies": { - "@aws-sdk/client-s3": "^3.216.0", - "@aws-sdk/lib-storage": "^3.216.0", - "@aws-sdk/s3-request-presigner": "^3.216.0", - "@popperjs/core": "^2.11.6", - "bootstrap": "^5.2.3", - "bootstrap-icons": "^1.10.2", - "dayjs": "^1.11.6", - "filesize": "^10.0.5", - "pinia": "^2.0.26", - "vue": "^3.2.45", - "vue-router": "^4.1.6", - "vue3-cookies": "^1.0.6" + "@aws-sdk/client-s3": "^3.440.0", + "@aws-sdk/lib-storage": "^3.440.0", + "@aws-sdk/s3-request-presigner": "^3.440.0", + "@fortawesome/fontawesome-free": "~6.4.2", + "@popperjs/core": "~2.11.8", + "ajv": "~8.12.0", + "bootstrap": "~5.3.1", + "chart.js": "~4.3.3", + "chartjs-plugin-zoom": "~2.0.1", + "dayjs": "~1.11.9", + "dompurify": "~3.0.5", + "filesize": "~10.0.12", + "idb-keyval": "^6.2.1", + "pinia": "~2.1.6", + "semver": "~7.5.4", + "showdown": "~2.1.0", + "vue": "~3.3.4", + "vue-router": "~4.2.4", + "vue3-cookies": "~1.0.6" }, "devDependencies": { - "@esbuild-plugins/node-globals-polyfill": "^0.1.1", - "@esbuild-plugins/node-modules-polyfill": "^0.1.4", - "@rushstack/eslint-patch": "^1.2.0", - "@types/bootstrap": "^5.2.6", - "@types/node": "^16.11.45", - "@vitejs/plugin-vue": "^3.2.0", - "@vue/eslint-config-prettier": "^7.0.0", - "@vue/eslint-config-typescript": "^11.0.2", - "@vue/tsconfig": "^0.1.3", - "axios": "^1.2.0", - "eslint": "^8.28.0", - "eslint-plugin-vue": "^9.7.0", - "npm-run-all": "^4.1.5", - "openapi-typescript-codegen": "^0.23.0", - "prettier": "^2.8.0", - "rollup-plugin-node-polyfills": "^0.2.1", - "sass": "^1.56.1", - "typescript": "~4.7.4", - "vite": "^3.2.4", - "vue-tsc": "^1.0.9" + "@esbuild-plugins/node-globals-polyfill": "~0.2.3", + "@esbuild-plugins/node-modules-polyfill": "~0.2.2", + "@rushstack/eslint-patch": "~1.2.0", + "@tsconfig/node18": "^18.2.1", + "@types/bootstrap": "~5.2.6", + "@types/dompurify": "~3.0.2", + "@types/node": "^16.18.48", + "@types/semver": "~7.5.1", + "@types/showdown": "~2.0.1", + "@vitejs/plugin-vue": "~4.3.4", + "@vue/eslint-config-prettier": "~8.0.0", + "@vue/eslint-config-typescript": "~11.0.3", + "@vue/tsconfig": "~0.4.0", + "axios": "~1.6.0", + "eslint": "~8.48.0", + "eslint-plugin-vue": "~9.17.0", + "npm-run-all": "~4.1.5", + "openapi-typescript-codegen": "^0.25.0", + "prettier": "~3.0.3", + "rollup-plugin-node-polyfills": "~0.2.1", + "sass": "~1.66.1", + "typescript": "~5.1.6", + "vite": "~4.4.9", + "vue-tsc": "~1.8.10" + } + }, + "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/@apidevtools/json-schema-ref-parser": { @@ -57,1795 +77,1257 @@ } }, "node_modules/@aws-crypto/crc32": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-2.0.0.tgz", - "integrity": "sha512-TvE1r2CUueyXOuHdEigYjIZVesInd9KN+K/TFFNfkkxRThiNxO6i4ZqqAVMoEjAamZZ1AA8WXJkjCz7YShHPQA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", "dependencies": { - "@aws-crypto/util": "^2.0.0", - "@aws-sdk/types": "^3.1.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", "tslib": "^1.11.1" } }, + "node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@aws-crypto/crc32c": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-2.0.0.tgz", - "integrity": "sha512-vF0eMdMHx3O3MoOXUfBZry8Y4ZDtcuskjjKgJz8YfIDjLStxTZrYXk+kZqtl6A0uCmmiN/Eb/JbC/CndTV1MHg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz", + "integrity": "sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==", "dependencies": { - "@aws-crypto/util": "^2.0.0", - "@aws-sdk/types": "^3.1.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", "tslib": "^1.11.1" } }, + "node_modules/@aws-crypto/crc32c/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@aws-crypto/ie11-detection": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.0.tgz", - "integrity": "sha512-pkVXf/dq6PITJ0jzYZ69VhL8VFOFoPZLZqtU/12SGnzYuJOOGNfF41q9GxdI1yqC8R13Rq3jOLKDFpUJFT5eTA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", "dependencies": { "tslib": "^1.11.1" } }, + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@aws-crypto/sha1-browser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-2.0.0.tgz", - "integrity": "sha512-3fIVRjPFY8EG5HWXR+ZJZMdWNRpwbxGzJ9IH9q93FpbgCH8u8GHRi46mZXp3cYD7gealmyqpm3ThZwLKJjWJhA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-3.0.0.tgz", + "integrity": "sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==", "dependencies": { - "@aws-crypto/ie11-detection": "^2.0.0", - "@aws-crypto/supports-web-crypto": "^2.0.0", - "@aws-sdk/types": "^3.1.0", + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", "@aws-sdk/util-locate-window": "^3.0.0", "@aws-sdk/util-utf8-browser": "^3.0.0", "tslib": "^1.11.1" } }, + "node_modules/@aws-crypto/sha1-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@aws-crypto/sha256-browser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz", - "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==", - "dependencies": { - "@aws-crypto/ie11-detection": "^2.0.0", - "@aws-crypto/sha256-js": "^2.0.0", - "@aws-crypto/supports-web-crypto": "^2.0.0", - "@aws-crypto/util": "^2.0.0", - "@aws-sdk/types": "^3.1.0", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", "@aws-sdk/util-locate-window": "^3.0.0", "@aws-sdk/util-utf8-browser": "^3.0.0", "tslib": "^1.11.1" } }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@aws-crypto/sha256-js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz", - "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", "dependencies": { - "@aws-crypto/util": "^2.0.0", - "@aws-sdk/types": "^3.1.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", "tslib": "^1.11.1" } }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@aws-crypto/supports-web-crypto": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.0.tgz", - "integrity": "sha512-Ge7WQ3E0OC7FHYprsZV3h0QIcpdyJLvIeg+uTuHqRYm8D6qCFJoiC+edSzSyFiHtZf+NOQDJ1q46qxjtzIY2nA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", "dependencies": { "tslib": "^1.11.1" } }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@aws-crypto/util": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.2.tgz", - "integrity": "sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", "dependencies": { - "@aws-sdk/types": "^3.110.0", + "@aws-sdk/types": "^3.222.0", "@aws-sdk/util-utf8-browser": "^3.0.0", "tslib": "^1.11.1" } }, - "node_modules/@aws-sdk/abort-controller": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.215.0.tgz", - "integrity": "sha512-HTvL542nawhVqe0oC1AJchdcomEOmPivJEzYUT1LqiG3e8ikxMNa2KWSqqLPeKi2t0A/cfQy7wDUyg9+BZhDSQ==", - "dependencies": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/abort-controller/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "node_modules/@aws-sdk/chunked-blob-reader": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-3.188.0.tgz", - "integrity": "sha512-zkPRFZZPL3eH+kH86LDYYXImiClA1/sW60zYOjse9Pgka+eDJlvBN6hcYxwDEKjcwATYiSRR1aVQHcfCinlGXg==", - "dependencies": { - "tslib": "^2.3.1" - } - }, - "node_modules/@aws-sdk/chunked-blob-reader-native": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.208.0.tgz", - "integrity": "sha512-JeOZ95PW+fJ6bbuqPySYqLqHk1n4+4ueEEraJsiUrPBV0S1ZtyvOGHcnGztKUjr2PYNaiexmpWuvUve9K12HRA==", - "dependencies": { - "@aws-sdk/util-base64": "3.208.0", - "tslib": "^2.3.1" - } - }, - "node_modules/@aws-sdk/chunked-blob-reader-native/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/chunked-blob-reader/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@aws-sdk/client-s3": { - "version": "3.216.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.216.0.tgz", - "integrity": "sha512-zja00+kLB7Kw8X326ueXvCgMJNF5iuTPrFDUgI+JClk1rjXVMa/T1sOLTgZg9W2pbtOO+3GloxwNGVygXNjt8A==", - "dependencies": { - "@aws-crypto/sha1-browser": "2.0.0", - "@aws-crypto/sha256-browser": "2.0.0", - "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/client-sts": "3.216.0", - "@aws-sdk/config-resolver": "3.215.0", - "@aws-sdk/credential-provider-node": "3.216.0", - "@aws-sdk/eventstream-serde-browser": "3.215.0", - "@aws-sdk/eventstream-serde-config-resolver": "3.215.0", - "@aws-sdk/eventstream-serde-node": "3.215.0", - "@aws-sdk/fetch-http-handler": "3.215.0", - "@aws-sdk/hash-blob-browser": "3.215.0", - "@aws-sdk/hash-node": "3.215.0", - "@aws-sdk/hash-stream-node": "3.215.0", - "@aws-sdk/invalid-dependency": "3.215.0", - "@aws-sdk/md5-js": "3.215.0", - "@aws-sdk/middleware-bucket-endpoint": "3.215.0", - "@aws-sdk/middleware-content-length": "3.215.0", - "@aws-sdk/middleware-endpoint": "3.215.0", - "@aws-sdk/middleware-expect-continue": "3.215.0", - "@aws-sdk/middleware-flexible-checksums": "3.215.0", - "@aws-sdk/middleware-host-header": "3.215.0", - "@aws-sdk/middleware-location-constraint": "3.215.0", - "@aws-sdk/middleware-logger": "3.215.0", - "@aws-sdk/middleware-recursion-detection": "3.215.0", - "@aws-sdk/middleware-retry": "3.215.0", - "@aws-sdk/middleware-sdk-s3": "3.215.0", - "@aws-sdk/middleware-serde": "3.215.0", - "@aws-sdk/middleware-signing": "3.215.0", - "@aws-sdk/middleware-ssec": "3.215.0", - "@aws-sdk/middleware-stack": "3.215.0", - "@aws-sdk/middleware-user-agent": "3.215.0", - "@aws-sdk/node-config-provider": "3.215.0", - "@aws-sdk/node-http-handler": "3.215.0", - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/signature-v4-multi-region": "3.215.0", - "@aws-sdk/smithy-client": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/url-parser": "3.215.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.215.0", - "@aws-sdk/util-defaults-mode-node": "3.215.0", - "@aws-sdk/util-endpoints": "3.216.0", - "@aws-sdk/util-stream-browser": "3.215.0", - "@aws-sdk/util-stream-node": "3.215.0", - "@aws-sdk/util-user-agent-browser": "3.215.0", - "@aws-sdk/util-user-agent-node": "3.215.0", - "@aws-sdk/util-utf8-browser": "3.188.0", - "@aws-sdk/util-utf8-node": "3.208.0", - "@aws-sdk/util-waiter": "3.215.0", - "@aws-sdk/xml-builder": "3.201.0", - "fast-xml-parser": "4.0.11", - "tslib": "^2.3.1" + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.468.0.tgz", + "integrity": "sha512-j0MnSYKu7KRAPXXn5egmJBzzPAgM/Hb0UUr0CHRrj8eMV7Ni/cZQpbU8tqgFel7BrsS4YINB5W/Q3FShHpI/8w==", + "dependencies": { + "@aws-crypto/sha1-browser": "3.0.0", + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.468.0", + "@aws-sdk/core": "3.468.0", + "@aws-sdk/credential-provider-node": "3.468.0", + "@aws-sdk/middleware-bucket-endpoint": "3.468.0", + "@aws-sdk/middleware-expect-continue": "3.468.0", + "@aws-sdk/middleware-flexible-checksums": "3.468.0", + "@aws-sdk/middleware-host-header": "3.468.0", + "@aws-sdk/middleware-location-constraint": "3.468.0", + "@aws-sdk/middleware-logger": "3.468.0", + "@aws-sdk/middleware-recursion-detection": "3.468.0", + "@aws-sdk/middleware-sdk-s3": "3.468.0", + "@aws-sdk/middleware-signing": "3.468.0", + "@aws-sdk/middleware-ssec": "3.468.0", + "@aws-sdk/middleware-user-agent": "3.468.0", + "@aws-sdk/region-config-resolver": "3.468.0", + "@aws-sdk/signature-v4-multi-region": "3.468.0", + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-endpoints": "3.468.0", + "@aws-sdk/util-user-agent-browser": "3.468.0", + "@aws-sdk/util-user-agent-node": "3.468.0", + "@aws-sdk/xml-builder": "3.465.0", + "@smithy/config-resolver": "^2.0.20", + "@smithy/eventstream-serde-browser": "^2.0.15", + "@smithy/eventstream-serde-config-resolver": "^2.0.15", + "@smithy/eventstream-serde-node": "^2.0.15", + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/hash-blob-browser": "^2.0.16", + "@smithy/hash-node": "^2.0.17", + "@smithy/hash-stream-node": "^2.0.17", + "@smithy/invalid-dependency": "^2.0.15", + "@smithy/md5-js": "^2.0.17", + "@smithy/middleware-content-length": "^2.0.17", + "@smithy/middleware-endpoint": "^2.2.2", + "@smithy/middleware-retry": "^2.0.23", + "@smithy/middleware-serde": "^2.0.15", + "@smithy/middleware-stack": "^2.0.9", + "@smithy/node-config-provider": "^2.1.7", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/protocol-http": "^3.0.11", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-body-length-browser": "^2.0.1", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.22", + "@smithy/util-defaults-mode-node": "^2.0.28", + "@smithy/util-endpoints": "^1.0.6", + "@smithy/util-retry": "^2.0.8", + "@smithy/util-stream": "^2.0.23", + "@smithy/util-utf8": "^2.0.2", + "@smithy/util-waiter": "^2.0.15", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, "node_modules/@aws-sdk/client-sso": { - "version": "3.216.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.216.0.tgz", - "integrity": "sha512-9F7JLx9RXEXovg6V4ylqQtpH+sIqQBMIPIrRSGWiQu65rmQQLskRkUka94JsGsBzq1IQwrnqtsuP3Lb0XtwLRA==", - "dependencies": { - "@aws-crypto/sha256-browser": "2.0.0", - "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.215.0", - "@aws-sdk/fetch-http-handler": "3.215.0", - "@aws-sdk/hash-node": "3.215.0", - "@aws-sdk/invalid-dependency": "3.215.0", - "@aws-sdk/middleware-content-length": "3.215.0", - "@aws-sdk/middleware-endpoint": "3.215.0", - "@aws-sdk/middleware-host-header": "3.215.0", - "@aws-sdk/middleware-logger": "3.215.0", - "@aws-sdk/middleware-recursion-detection": "3.215.0", - "@aws-sdk/middleware-retry": "3.215.0", - "@aws-sdk/middleware-serde": "3.215.0", - "@aws-sdk/middleware-stack": "3.215.0", - "@aws-sdk/middleware-user-agent": "3.215.0", - "@aws-sdk/node-config-provider": "3.215.0", - "@aws-sdk/node-http-handler": "3.215.0", - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/smithy-client": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/url-parser": "3.215.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.215.0", - "@aws-sdk/util-defaults-mode-node": "3.215.0", - "@aws-sdk/util-endpoints": "3.216.0", - "@aws-sdk/util-user-agent-browser": "3.215.0", - "@aws-sdk/util-user-agent-node": "3.215.0", - "@aws-sdk/util-utf8-browser": "3.188.0", - "@aws-sdk/util-utf8-node": "3.208.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.216.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.216.0.tgz", - "integrity": "sha512-O8kmM86BHwiSwyNoIe+iHXuSpUE9PBWl3re8u+/igt/w5W5VmMVz+zQr7gRUDQ1FDgLWNEdAJa0r+JFx3pZdzA==", - "dependencies": { - "@aws-crypto/sha256-browser": "2.0.0", - "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.215.0", - "@aws-sdk/fetch-http-handler": "3.215.0", - "@aws-sdk/hash-node": "3.215.0", - "@aws-sdk/invalid-dependency": "3.215.0", - "@aws-sdk/middleware-content-length": "3.215.0", - "@aws-sdk/middleware-endpoint": "3.215.0", - "@aws-sdk/middleware-host-header": "3.215.0", - "@aws-sdk/middleware-logger": "3.215.0", - "@aws-sdk/middleware-recursion-detection": "3.215.0", - "@aws-sdk/middleware-retry": "3.215.0", - "@aws-sdk/middleware-serde": "3.215.0", - "@aws-sdk/middleware-stack": "3.215.0", - "@aws-sdk/middleware-user-agent": "3.215.0", - "@aws-sdk/node-config-provider": "3.215.0", - "@aws-sdk/node-http-handler": "3.215.0", - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/smithy-client": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/url-parser": "3.215.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.215.0", - "@aws-sdk/util-defaults-mode-node": "3.215.0", - "@aws-sdk/util-endpoints": "3.216.0", - "@aws-sdk/util-user-agent-browser": "3.215.0", - "@aws-sdk/util-user-agent-node": "3.215.0", - "@aws-sdk/util-utf8-browser": "3.188.0", - "@aws-sdk/util-utf8-node": "3.208.0", - "tslib": "^2.3.1" + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.468.0.tgz", + "integrity": "sha512-NabkDaiFsMP8lBR3+JzdtOVarH8kCJst30fQyBIs2PI0uMfajFJ+SK9JTg1J1YZY6aNJBxo2Bxu3dl0fjZ5N/g==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.468.0", + "@aws-sdk/middleware-host-header": "3.468.0", + "@aws-sdk/middleware-logger": "3.468.0", + "@aws-sdk/middleware-recursion-detection": "3.468.0", + "@aws-sdk/middleware-user-agent": "3.468.0", + "@aws-sdk/region-config-resolver": "3.468.0", + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-endpoints": "3.468.0", + "@aws-sdk/util-user-agent-browser": "3.468.0", + "@aws-sdk/util-user-agent-node": "3.468.0", + "@smithy/config-resolver": "^2.0.20", + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/hash-node": "^2.0.17", + "@smithy/invalid-dependency": "^2.0.15", + "@smithy/middleware-content-length": "^2.0.17", + "@smithy/middleware-endpoint": "^2.2.2", + "@smithy/middleware-retry": "^2.0.23", + "@smithy/middleware-serde": "^2.0.15", + "@smithy/middleware-stack": "^2.0.9", + "@smithy/node-config-provider": "^2.1.7", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/protocol-http": "^3.0.11", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-body-length-browser": "^2.0.1", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.22", + "@smithy/util-defaults-mode-node": "^2.0.28", + "@smithy/util-endpoints": "^1.0.6", + "@smithy/util-retry": "^2.0.8", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/client-sso/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, "node_modules/@aws-sdk/client-sts": { - "version": "3.216.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.216.0.tgz", - "integrity": "sha512-8rpMZhZXh1kjsAvQ0WNBMDrnP4XneKkBQtt5XcDEmv/GpULt8jOIJnSIJQxt2gkRfd/I9MUC9C3aZNQoSMxa+g==", - "dependencies": { - "@aws-crypto/sha256-browser": "2.0.0", - "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.215.0", - "@aws-sdk/credential-provider-node": "3.216.0", - "@aws-sdk/fetch-http-handler": "3.215.0", - "@aws-sdk/hash-node": "3.215.0", - "@aws-sdk/invalid-dependency": "3.215.0", - "@aws-sdk/middleware-content-length": "3.215.0", - "@aws-sdk/middleware-endpoint": "3.215.0", - "@aws-sdk/middleware-host-header": "3.215.0", - "@aws-sdk/middleware-logger": "3.215.0", - "@aws-sdk/middleware-recursion-detection": "3.215.0", - "@aws-sdk/middleware-retry": "3.215.0", - "@aws-sdk/middleware-sdk-sts": "3.215.0", - "@aws-sdk/middleware-serde": "3.215.0", - "@aws-sdk/middleware-signing": "3.215.0", - "@aws-sdk/middleware-stack": "3.215.0", - "@aws-sdk/middleware-user-agent": "3.215.0", - "@aws-sdk/node-config-provider": "3.215.0", - "@aws-sdk/node-http-handler": "3.215.0", - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/smithy-client": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/url-parser": "3.215.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.215.0", - "@aws-sdk/util-defaults-mode-node": "3.215.0", - "@aws-sdk/util-endpoints": "3.216.0", - "@aws-sdk/util-user-agent-browser": "3.215.0", - "@aws-sdk/util-user-agent-node": "3.215.0", - "@aws-sdk/util-utf8-browser": "3.188.0", - "@aws-sdk/util-utf8-node": "3.208.0", - "fast-xml-parser": "4.0.11", - "tslib": "^2.3.1" + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.468.0.tgz", + "integrity": "sha512-EausH7ezv1AIgl/4rfZRNRxrFND5hChbIqkuAf8e5wZ74HUEVBMmD5Jiwfs0WRCso3ejOjsNtS8PAOA3djn28w==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.468.0", + "@aws-sdk/credential-provider-node": "3.468.0", + "@aws-sdk/middleware-host-header": "3.468.0", + "@aws-sdk/middleware-logger": "3.468.0", + "@aws-sdk/middleware-recursion-detection": "3.468.0", + "@aws-sdk/middleware-sdk-sts": "3.468.0", + "@aws-sdk/middleware-signing": "3.468.0", + "@aws-sdk/middleware-user-agent": "3.468.0", + "@aws-sdk/region-config-resolver": "3.468.0", + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-endpoints": "3.468.0", + "@aws-sdk/util-user-agent-browser": "3.468.0", + "@aws-sdk/util-user-agent-node": "3.468.0", + "@smithy/config-resolver": "^2.0.20", + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/hash-node": "^2.0.17", + "@smithy/invalid-dependency": "^2.0.15", + "@smithy/middleware-content-length": "^2.0.17", + "@smithy/middleware-endpoint": "^2.2.2", + "@smithy/middleware-retry": "^2.0.23", + "@smithy/middleware-serde": "^2.0.15", + "@smithy/middleware-stack": "^2.0.9", + "@smithy/node-config-provider": "^2.1.7", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/protocol-http": "^3.0.11", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-body-length-browser": "^2.0.1", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.22", + "@smithy/util-defaults-mode-node": "^2.0.28", + "@smithy/util-endpoints": "^1.0.6", + "@smithy/util-retry": "^2.0.8", + "@smithy/util-utf8": "^2.0.2", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/config-resolver": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.215.0.tgz", - "integrity": "sha512-DxX4R+YYLQOtg0qfceKBrjVD4t1mQBG1eb7IVr2QSlckFCX8ztUNymFMuaSEo3938Jyy/NpgfUDpFqPDaSKnng==", + "node_modules/@aws-sdk/core": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.468.0.tgz", + "integrity": "sha512-ezUJR9VvknKoXzNZ4wvzGi1jdkmm+/1dUYQ9Sw4r8bzlJDTsUnWbyvaDlBQh81RuhLtVkaUfTnQKoec0cwlZKQ==", "dependencies": { - "@aws-sdk/signature-v4": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-config-provider": "3.208.0", - "@aws-sdk/util-middleware": "3.215.0", - "tslib": "^2.3.1" + "@smithy/smithy-client": "^2.1.18", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/config-resolver/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.215.0.tgz", - "integrity": "sha512-n5G7I7Pxfsn81+tNsSOzspKp9SYai78oRfImsfFY4JLTcWutv7szMgFUbtEzBfUUINHpOxLiO2Lk5yu5K1C7IQ==", - "dependencies": { - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-env/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/credential-provider-imds": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.215.0.tgz", - "integrity": "sha512-/4FUUR6u9gkNfxB6mEwBr0kk0myIkrDcXbAocWN3fPd/t7otzxpx/JqPZXgM6kcVP7M4T/QT75l1E1RRHLWCCQ==", + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.468.0.tgz", + "integrity": "sha512-k/1WHd3KZn0EQYjadooj53FC0z24/e4dUZhbSKTULgmxyO62pwh9v3Brvw4WRa/8o2wTffU/jo54tf4vGuP/ZA==", "dependencies": { - "@aws-sdk/node-config-provider": "3.215.0", - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/url-parser": "3.215.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.468.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-imds/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.216.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.216.0.tgz", - "integrity": "sha512-tSfrhgRO/l83Ou6WSOE4HauTLbDCOLMo/23Q6oGO8cs/d874J5rE4UM7a9OzE3QdM3eVbdAP7kXUgUS6i71cUw==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.215.0", - "@aws-sdk/credential-provider-imds": "3.215.0", - "@aws-sdk/credential-provider-sso": "3.216.0", - "@aws-sdk/credential-provider-web-identity": "3.215.0", - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/shared-ini-file-loader": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.468.0.tgz", + "integrity": "sha512-DBYsptYBq0xC+GTh+3dN3Q9/wRZiPpsHA4yCC1mskEbJfMy7EIZZKtZ8lOkZ24NOI5oea4o3L+wFTxOeFSKntA==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.468.0", + "@aws-sdk/credential-provider-process": "3.468.0", + "@aws-sdk/credential-provider-sso": "3.468.0", + "@aws-sdk/credential-provider-web-identity": "3.468.0", + "@aws-sdk/types": "3.468.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.216.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.216.0.tgz", - "integrity": "sha512-Tumt53phB454DTkNB7a1tyCfrkA4JUGHzNLya14VLResGIGW5Re64atahUcO/WS7aTEs5vfAhBXO+p9o4K1rhQ==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.215.0", - "@aws-sdk/credential-provider-imds": "3.215.0", - "@aws-sdk/credential-provider-ini": "3.216.0", - "@aws-sdk/credential-provider-process": "3.215.0", - "@aws-sdk/credential-provider-sso": "3.216.0", - "@aws-sdk/credential-provider-web-identity": "3.215.0", - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/shared-ini-file-loader": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.468.0.tgz", + "integrity": "sha512-iZlWWZXp6zAH4sP3VrqF7RpAmzl8Qr8tuVkF7ubUZhzyWzKfhLVzqRJqbMYCBPGmfZLAZWjsziPHaBErYkG/5g==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.468.0", + "@aws-sdk/credential-provider-ini": "3.468.0", + "@aws-sdk/credential-provider-process": "3.468.0", + "@aws-sdk/credential-provider-sso": "3.468.0", + "@aws-sdk/credential-provider-web-identity": "3.468.0", + "@aws-sdk/types": "3.468.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.215.0.tgz", - "integrity": "sha512-JNvj4L5B7W8byoFdfn/8Y4scoPiwCi+Ha/fRsFCrdSC7C+snDuxM/oQj33HI8DpKY1cjuigzEnpnxiNWaA09EA==", + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.468.0.tgz", + "integrity": "sha512-OYSn1A/UsyPJ7Z8Q2cNhTf55O36shPmSsvOfND04nSfu1nPaR+VUvvsP7v+brhGpwC/GAKTIdGAo4blH31BS6A==", "dependencies": { - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/shared-ini-file-loader": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.468.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-process/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.216.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.216.0.tgz", - "integrity": "sha512-1Cag6AUPU4wkeMnZDJvcXXJgwrlrIxbTcRsresJYBFvs1vGJGcTbjtWV0K6fiBRP66GtvuOL9WzQ/eqRf2J7Ag==", - "dependencies": { - "@aws-sdk/client-sso": "3.216.0", - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/shared-ini-file-loader": "3.215.0", - "@aws-sdk/token-providers": "3.216.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.468.0.tgz", + "integrity": "sha512-eIdGoIw10xyBm7TDcV5Y/W7tzNs2f4H+2G5ZdjG2XGLAELsKCoixe+9ZB662MLtLCxvm7eE1GjOjKsSua6MImQ==", + "dependencies": { + "@aws-sdk/client-sso": "3.468.0", + "@aws-sdk/token-providers": "3.468.0", + "@aws-sdk/types": "3.468.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-sso/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.215.0.tgz", - "integrity": "sha512-AWaDDEE3VU1HeLrXvyUrkQ6Wb3PQij5bvvrMil9L0da3b1yrcpoDanQQy7wBFBXcZIVmcmSFe5MMA/nyh2Le4g==", + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.468.0.tgz", + "integrity": "sha512-rexymPmXjtkwCPfhnUq3EjO1rSkf39R4Jz9CqiM7OsqK2qlT5Y/V3gnMKn0ZMXsYaQOMfM3cT5xly5R+OKDHlw==", "dependencies": { - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.468.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/eventstream-codec": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-codec/-/eventstream-codec-3.215.0.tgz", - "integrity": "sha512-Uwgkq6ViQnfd1l+qhWPGdzxh+YhD1N6RYL0kEcp1ovsR+rC/0qUsM9VZrSckZn4jB+0ATqIoOXtcUYP4+xrNmg==", - "dependencies": { - "@aws-crypto/crc32": "2.0.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-hex-encoding": "3.201.0", - "tslib": "^2.3.1" - } - }, - "node_modules/@aws-sdk/eventstream-codec/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/eventstream-serde-browser": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.215.0.tgz", - "integrity": "sha512-VfTl69/C/cOjm47blgvdBz2pw8//6qkLPvQetfDOgf40JvsjBp9afUDNiKV08ulzoUeVZBosgHs09oZ2VDj09Q==", + "node_modules/@aws-sdk/lib-storage": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.468.0.tgz", + "integrity": "sha512-0z2dtg0YQOik6kNM7Xyqgwjk1n5P4hdNVD3MGcjYElPBnp5jVIIZSv7KGaMzgtKSCaHtkjqMidS1DS8Oae9YJg==", "dependencies": { - "@aws-sdk/eventstream-serde-universal": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "@smithy/abort-controller": "^2.0.1", + "@smithy/middleware-endpoint": "^2.2.2", + "@smithy/smithy-client": "^2.1.18", + "buffer": "5.6.0", + "events": "3.3.0", + "stream-browserify": "3.0.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-s3": "^3.0.0" } }, - "node_modules/@aws-sdk/eventstream-serde-browser/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/eventstream-serde-config-resolver": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.215.0.tgz", - "integrity": "sha512-NrVb8HA0tUsruAj8yVWTaRIfcAB9lsajzksCqS7W917x/esoIRwoeF2zua63Ivro7hLeCjzS2Mws5IhvSl+/tQ==", + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.468.0.tgz", + "integrity": "sha512-Dak7sSaPxkTWuBzvFI0zXL1t+/6JdeZZVLRckp2reoQ46CY/hnCbd5/wITtO7CYyjHX7WrEILjTynfZoa1E7Qw==", "dependencies": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-arn-parser": "3.465.0", + "@smithy/node-config-provider": "^2.1.7", + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", + "@smithy/util-config-provider": "^2.0.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/eventstream-serde-config-resolver/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/eventstream-serde-node": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.215.0.tgz", - "integrity": "sha512-DxABFUIpmFV1NOfwF8FtX+l7kzmMTTJf2BfXvGoYemmBtv9Cc31Qg83ouD8xuNSx9qlbFOgpWaNpzEZ400porA==", + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.468.0.tgz", + "integrity": "sha512-/wmLjmfgeulxhhmnxX3X3N933TvGsYckVIFjAtDSpLjqkbwzEcNiLq7AdmNJ4BfxG0MCMgcht561DCCD19x8Bg==", "dependencies": { - "@aws-sdk/eventstream-serde-universal": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.468.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/eventstream-serde-node/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/eventstream-serde-universal": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.215.0.tgz", - "integrity": "sha512-8DmY3vVZtXAKzW0wOSC0bN+WF8qNZKaCqe5JCM3WwS1Wu6F6qI7b064VSe5b3d9BbJzeMccOcJeCg3ZU/3nYUQ==", + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.468.0.tgz", + "integrity": "sha512-LQwL/N5MCj3Y5keLLewHTqeAXUIMsHFZyxDXRm/uxrOon9ufLKDvGvzAmfwn1/CuSUo66ZfT8VPSA4BsC90RtA==", "dependencies": { - "@aws-sdk/eventstream-codec": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "@aws-crypto/crc32": "3.0.0", + "@aws-crypto/crc32c": "3.0.0", + "@aws-sdk/types": "3.468.0", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/eventstream-serde-universal/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/fetch-http-handler": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.215.0.tgz", - "integrity": "sha512-JfZyrJOE+0ik1PumsIUZd0NfgEx4sZ43VSdPCD9GRhssRWudNsSF1B5fz3xA5v+1y5oQPjXZyaWCzKtnYruiWw==", - "dependencies": { - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/querystring-builder": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-base64": "3.208.0", - "tslib": "^2.3.1" - } - }, - "node_modules/@aws-sdk/fetch-http-handler/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/hash-blob-browser": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.215.0.tgz", - "integrity": "sha512-plHPFOSEHig0g/ou1H4QW31AyPGzwR0qgUKIEUFf3lWIfBI3BnvA4t24cJ87I204oqENj/+ZSNAj5qeAZfMFXw==", - "dependencies": { - "@aws-sdk/chunked-blob-reader": "3.188.0", - "@aws-sdk/chunked-blob-reader-native": "3.208.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - } - }, - "node_modules/@aws-sdk/hash-blob-browser/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/hash-node": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.215.0.tgz", - "integrity": "sha512-MkSRuZvo1RCRmI0VNEmRYCGGD/DkMd9lqnLtOyglMPnSX1mhyD4/DyXmcc3rYa7PsjDRAfykGWJRiMqpoMLjiQ==", + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.468.0.tgz", + "integrity": "sha512-gwQ+/QhX+lhof304r6zbZ/V5l5cjhGRxLL3CjH1uJPMcOAbw9wUlMdl+ibr8UwBZ5elfKFGiB1cdW/0uMchw0w==", "dependencies": { - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-buffer-from": "3.208.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.468.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/hash-node/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/hash-stream-node": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-stream-node/-/hash-stream-node-3.215.0.tgz", - "integrity": "sha512-1VEpiXu0jH7bSRYfEeSrznYq41zpUV4TtStoBXdcEVaOqT4LNQ5k1g1602544UWKUJ7D+E9NCNXpjM6TSMmG4A==", + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.468.0.tgz", + "integrity": "sha512-0gBX/lDynQr4YIhM9h1dVnkVWqrg+34iOCVIUq8jHxzUzgZWglGkG9lHGGg0r1xkLTmegeoo1OKH8wrQ6n33Cg==", "dependencies": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.468.0", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/hash-stream-node/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/invalid-dependency": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.215.0.tgz", - "integrity": "sha512-++bK4BUQe8/CL/YcLZcQB8qPOhiXxhbuhYzfFS7PNVvW1QOLqKRZL/lKs24gzjcOmw7IhAbCybDZwvu2TM4DAg==", - "dependencies": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - } - }, - "node_modules/@aws-sdk/invalid-dependency/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/is-array-buffer": { - "version": "3.201.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", - "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.468.0.tgz", + "integrity": "sha512-X5XHKV7DHRXI3f29SAhJPe/OxWRFgDWDMMCALfzhmJfCi6Jfh0M14cJKoC+nl+dk9lB+36+jKjhjETZaL2bPlA==", "dependencies": { - "tslib": "^2.3.1" + "@aws-sdk/types": "3.468.0", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/is-array-buffer/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/lib-storage": { - "version": "3.216.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.216.0.tgz", - "integrity": "sha512-mRNT3V6/wtpNuWD81TAG6SrM3cj3x3gqJAMRaF5dHJ7qfCeys0U2hIsNmHU0wIJWpfisVaFztfT4MmYh0lLOyA==", + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.468.0.tgz", + "integrity": "sha512-vch9IQib2Ng9ucSyRW2eKNQXHUPb5jUPCLA5otTW/8nGjcOU37LxQG4WrxO7uaJ9Oe8hjHO+hViE3P0KISUhtA==", "dependencies": { - "@aws-sdk/middleware-endpoint": "3.215.0", - "@aws-sdk/smithy-client": "3.215.0", - "buffer": "5.6.0", - "events": "3.3.0", - "stream-browserify": "3.0.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.468.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" - }, - "peerDependencies": { - "@aws-sdk/abort-controller": "^3.0.0", - "@aws-sdk/client-s3": "^3.0.0" } }, - "node_modules/@aws-sdk/lib-storage/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "node_modules/@aws-sdk/md5-js": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/md5-js/-/md5-js-3.215.0.tgz", - "integrity": "sha512-2f5r2raNDG9USKHKRgAW2r1MzCrkemLASlDXASgAuAD3gYGURVi4ZDhI3I1GECY5dPEgGC+3B2rkEb9MfQAaEg==", + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.468.0.tgz", + "integrity": "sha512-8Ma8tdHYH0stMmGQHh/8eI53oAfiuUJvnQdILWcNArAwlVXt+DJirCSGWP8SqvYdKGa4+jr1YW3+nTdhnm2FZg==", "dependencies": { - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-utf8-browser": "3.188.0", - "@aws-sdk/util-utf8-node": "3.208.0", - "tslib": "^2.3.1" - } - }, - "node_modules/@aws-sdk/md5-js/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.215.0.tgz", - "integrity": "sha512-zMeYrnHX8S9VFDPH3fryXdPXW1DWeX9URKAkU1oxZLGpBX91CsWzUDjaMhbkDgvwO2oeKgjnZ2vCwcNNKP266w==", - "dependencies": { - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-arn-parser": "3.208.0", - "@aws-sdk/util-config-provider": "3.208.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-arn-parser": "3.465.0", + "@smithy/node-config-provider": "^2.1.7", + "@smithy/protocol-http": "^3.0.11", + "@smithy/signature-v4": "^2.0.0", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "@smithy/util-config-provider": "^2.0.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-bucket-endpoint/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/middleware-content-length": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.215.0.tgz", - "integrity": "sha512-zKJRb6jDLFl9nl/muSFbiQHA4uK3skinuDRcyLbpMvvzhuK/PVodv9QI1+wIUsFdXkaSxAlva1oG4bL8ZFi+sQ==", + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.468.0.tgz", + "integrity": "sha512-xRy8NKfHbmafHwdbotdWgHBvRs0YZgk20GrhFJKp43bkqVbJ5bNlh3nQXf1DeFY9fARR84Bfotya4fwCUHWgZg==", "dependencies": { - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "@aws-sdk/middleware-signing": "3.468.0", + "@aws-sdk/types": "3.468.0", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-content-length/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/middleware-endpoint": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.215.0.tgz", - "integrity": "sha512-W0QXL5emcN9IXtMbnWT/abLxBFH2tGIfnre2jPNmZ9M7uVFxUwwv5OTUXxNLGNehJHKhiJPwhfQvMy20IDzVcw==", + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.468.0.tgz", + "integrity": "sha512-s+7fSB1gdnnTj5O0aCCarX3z5Vppop8kazbNSZADdkfHIDWCN80IH4ZNjY3OWqaAz0HmR4LNNrovdR304ojb4Q==", "dependencies": { - "@aws-sdk/middleware-serde": "3.215.0", - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/signature-v4": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/url-parser": "3.215.0", - "@aws-sdk/util-config-provider": "3.208.0", - "@aws-sdk/util-middleware": "3.215.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.468.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.7.0", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-endpoint/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.215.0.tgz", - "integrity": "sha512-X2G7MnBSYPPmLqqd9xDGl2ik9dUsGYcYzulf2Z1HVEGJO6btZJtPfC+IIwuJjsiCWCgbypM1X/oOSxdrmRkUNQ==", + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.468.0.tgz", + "integrity": "sha512-y1qLW24wRkOGBTK5d6eJXf6d8HYo4rzT4a1mNDN1rd18NSffwQ6Yke5qeUiIaxa0y/l+FvvNYErbhYtij2rJoQ==", "dependencies": { - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.468.0", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-expect-continue/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.215.0.tgz", - "integrity": "sha512-fAFcR+QsrGPCgYssdTYmayoCXDKYzlv0a14jaJtZsacXQNGefXly9D856lri+yG2jxqQ6Sa0FzU4Pm7s3j4mvg==", - "dependencies": { - "@aws-crypto/crc32": "2.0.0", - "@aws-crypto/crc32c": "2.0.0", - "@aws-sdk/is-array-buffer": "3.201.0", - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.468.0.tgz", + "integrity": "sha512-lmqaEChVWK6MvNpM/LH504pRsP3p/IuZugWwxCbelKw4bGVU4IgG3mbjfATiIlHo4rW8ttHh1bTsZIGjWOqNeA==", + "dependencies": { + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-endpoints": "3.468.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.215.0.tgz", - "integrity": "sha512-GOqI7VwoENZwn+6tIMrrJ4SipIqL2JCh+BNvORVcy7CQxn1ViKkna7iaCx+QMjpg/kn9cR6kfY0n1FmgZR1w9A==", + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.468.0.tgz", + "integrity": "sha512-EkDfaumuBhDJFg4lmvWiBE8Ln4BF6hYNC2YfkjKCTEuePy5BKryFedwylYZZ3CJG/uVyfr8xBy+mvoR8plpHjg==", "dependencies": { - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "@smithy/node-config-provider": "^2.1.7", + "@smithy/types": "^2.7.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-host-header/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.215.0.tgz", - "integrity": "sha512-taDOIGv2rsAyDEJxSm/nhKS4nsBPUKKCvIpK26E7uGshQZFLtTLTJMp8zGb1IBfUSxRngdWljRmOS5AJUexNbQ==", + "node_modules/@aws-sdk/s3-request-presigner": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.468.0.tgz", + "integrity": "sha512-B01d7O3LXaF+WWmDTUaALy/lYM7bMd/i3xJ0MvnypaFosUoE9qmWdq0+lGF2BUExCXe+uZ7ID0rtwXKNsHrExA==", "dependencies": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "@aws-sdk/signature-v4-multi-region": "3.468.0", + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-format-url": "3.468.0", + "@smithy/middleware-endpoint": "^2.2.2", + "@smithy/protocol-http": "^3.0.11", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-location-constraint/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.215.0.tgz", - "integrity": "sha512-0h4GGF0rV3jnY3jxmcAWsOdqHCYf25s0biSjmgTei+l/5S+geOGrovRPCNep0LLg0i9D8bkZsXISojilETbf+g==", + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.468.0.tgz", + "integrity": "sha512-ADMWVrqUUjaiWmK7IcBuekOd8nNW6qV1G8ZM9Dgu2U7ezC4gzgZ3IFqZRcQXANX32EC1K3EpDx6fhPpOE/Unbg==", "dependencies": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "@aws-sdk/middleware-sdk-s3": "3.468.0", + "@aws-sdk/types": "3.468.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-logger/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.215.0.tgz", - "integrity": "sha512-KQ+kiEsaluM4i6opjusUukxY78+UhfR7vzXHDkzZK/GplQ1hY0B+rwVO1eaULmlnmf3FK+Wd6lwrPV7xS2W+EA==", - "dependencies": { - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "node_modules/@aws-sdk/token-providers": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.468.0.tgz", + "integrity": "sha512-IpLbthZmFXotwtgkE1Bw4HcKjwpAsGM+6iTXs4amZJqllJClOgyV/sV5Cze+8AqanfCZoPIFTmXyg8LfJTYwbw==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.468.0", + "@aws-sdk/middleware-logger": "3.468.0", + "@aws-sdk/middleware-recursion-detection": "3.468.0", + "@aws-sdk/middleware-user-agent": "3.468.0", + "@aws-sdk/region-config-resolver": "3.468.0", + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-endpoints": "3.468.0", + "@aws-sdk/util-user-agent-browser": "3.468.0", + "@aws-sdk/util-user-agent-node": "3.468.0", + "@smithy/config-resolver": "^2.0.20", + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/hash-node": "^2.0.17", + "@smithy/invalid-dependency": "^2.0.15", + "@smithy/middleware-content-length": "^2.0.17", + "@smithy/middleware-endpoint": "^2.2.2", + "@smithy/middleware-retry": "^2.0.23", + "@smithy/middleware-serde": "^2.0.15", + "@smithy/middleware-stack": "^2.0.9", + "@smithy/node-config-provider": "^2.1.7", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-body-length-browser": "^2.0.1", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.22", + "@smithy/util-defaults-mode-node": "^2.0.28", + "@smithy/util-endpoints": "^1.0.6", + "@smithy/util-retry": "^2.0.8", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/middleware-retry": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.215.0.tgz", - "integrity": "sha512-I/dnUPVg2Kp3lW+MywBoPp06EOng8IfuaS9ph4bcJpQKrhNU5ekRgCHH2C4k1A6GcP8uyHxQ5TVV6j+l0QPIsA==", + "node_modules/@aws-sdk/types": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.468.0.tgz", + "integrity": "sha512-rx/9uHI4inRbp2tw3Y4Ih4PNZkVj32h7WneSg3MVgVjAoVD5Zti9KhS5hkvsBxfgmQmg0AQbE+b1sy5WGAgntA==", "dependencies": { - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/service-error-classification": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-middleware": "3.215.0", - "tslib": "^2.3.1", - "uuid": "^8.3.2" + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-retry/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.215.0.tgz", - "integrity": "sha512-+SM+xCIFNSFIKM9KyvgIu4Ah5Z/SbHS8mDkinHkY8X/iUryrsKKBs7xnpMAaJCTFkK/8gO6Lhdda1nbvGozhdA==", - "dependencies": { - "@aws-sdk/middleware-bucket-endpoint": "3.215.0", - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-arn-parser": "3.208.0", - "tslib": "^2.3.1" + "node_modules/@aws-sdk/util-arn-parser": { + "version": "3.465.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.465.0.tgz", + "integrity": "sha512-zOJ82vzDJFqBX9yZBlNeHHrul/kpx/DCoxzW5UBbZeb26kfV53QhMSoEmY8/lEbBqlqargJ/sgRC845GFhHNQw==", + "dependencies": { + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.215.0.tgz", - "integrity": "sha512-wJRxoDf+2egbRgochaQL8+zzADx8FM/2W0spKNj8x+t/3iqw70QwxCfuEKW/uFQ3ph6eaIrv7gYc8RRjwhD8rg==", - "dependencies": { - "@aws-sdk/middleware-signing": "3.215.0", - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/signature-v4": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.468.0.tgz", + "integrity": "sha512-P91EbMG2+1ZToJeTLaRkdO7qM7RI0svuMVLkIdHV9rHR7PeUKUWMpf46xh8rQsIjKC9Arf+I9ueWp3iHJt1T5w==", + "dependencies": { + "@aws-sdk/types": "3.468.0", + "@smithy/util-endpoints": "^1.0.6", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-sts/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/middleware-serde": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.215.0.tgz", - "integrity": "sha512-+uhLXdKvvQZcRRFc3UmemSr/YUHA4Jc+1YMjHxc3v8vvfztFJBb0wgBx999myOi8PmkYThlRBQDzXy9UCIhIJw==", + "node_modules/@aws-sdk/util-format-url": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.468.0.tgz", + "integrity": "sha512-CtHApPmudJz/Z2MHVogWfkaSw4wWHQKVLQs4Q5XjvLcDSzODzxHbiOIckFCXQm2Mme4+TTe4GFU9g869ufegXg==", "dependencies": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.468.0", + "@smithy/querystring-builder": "^2.0.15", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-serde/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/middleware-signing": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.215.0.tgz", - "integrity": "sha512-3BqzYqkmdPeOxjI8DVQE7Bm7J5QIvDy30abglXqrDg6npw6KonKI2Q3FIPFf+oLpZTMStwkoQOnwXHTPrSZ6Tg==", - "dependencies": { - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/signature-v4": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-middleware": "3.215.0", - "tslib": "^2.3.1" + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.465.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.465.0.tgz", + "integrity": "sha512-f+QNcWGswredzC1ExNAB/QzODlxwaTdXkNT5cvke2RLX8SFU5pYk6h4uCtWC0vWPELzOfMfloBrJefBzlarhsw==", + "dependencies": { + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-signing/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.215.0.tgz", - "integrity": "sha512-iIiB2fGneR8iZN2tgQoACq1jQlG50zU49cus/jAAKjy6B7QeKXy5Ld8/+eNnzcjLuBzzeLtER2YWwFLWqUOZpw==", + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.468.0.tgz", + "integrity": "sha512-OJyhWWsDEizR3L+dCgMXSUmaCywkiZ7HSbnQytbeKGwokIhD69HTiJcibF/sgcM5gk4k3Mq3puUhGnEZ46GIig==", "dependencies": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" + "@aws-sdk/types": "3.468.0", + "@smithy/types": "^2.7.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" } }, - "node_modules/@aws-sdk/middleware-ssec/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/middleware-stack": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.215.0.tgz", - "integrity": "sha512-rdSVL7LxRgjlvoluqwODD4ypBy2k/YVl6FrDplyCMSi8m2WHZG99FzdmR9bpnWK+0DGzYZSMRYx6ynJ9N9PsSw==", + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.468.0.tgz", + "integrity": "sha512-9p+Zyp6xmJUkcryTNmQQwdhRK6gAC6zVEJZLomLGQhD7sWcCzstolw//mAS3AKVQFYWnCEGKrDJdgT0KObCf4g==", "dependencies": { - "tslib": "^2.3.1" + "@aws-sdk/types": "3.468.0", + "@smithy/node-config-provider": "^2.1.7", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/middleware-stack/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.215.0.tgz", - "integrity": "sha512-X6GfoMNoEITTw7rGL/gWs8UZ0cmmmezvKcl+KtHsA642R05OR4mY5G7LdbWAw0bcrwKsuKOGmwUrC9lzGqbWUw==", + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", "dependencies": { - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/types": "3.215.0", "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-user-agent/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/node-config-provider": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.215.0.tgz", - "integrity": "sha512-notckD94QwwxC0GsfpTxB7VH8SREIIlMsUSddqGtpModa0cq/wRb9rqnydZSoznbYpK1ND6h0C9hr/2PNz89zw==", + "node_modules/@aws-sdk/xml-builder": { + "version": "3.465.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.465.0.tgz", + "integrity": "sha512-9TKW5ZgsReygePTnAUdvaqxr/k1HXsEz2yDnk/jTLaUeRPsd5la8fFjb6OfgYYlbEVNlxTcKzaqOdrqxpUkmyQ==", "dependencies": { - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/shared-ini-file-loader": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/node-config-provider/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/node-http-handler": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.215.0.tgz", - "integrity": "sha512-btKWSR7m0UuWIN3p5MfSIvhqeYik7xri7U6nWuVI5GVzIYjzxEZOMvPAinDLDxL5wipodi0ZvTUNdDJdm7BcGQ==", - "dependencies": { - "@aws-sdk/abort-controller": "3.215.0", - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/querystring-builder": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "node_modules/@babel/parser": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", + "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=14.0.0" + "node": ">=6.0.0" } }, - "node_modules/@aws-sdk/node-http-handler/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + "node_modules/@esbuild-plugins/node-globals-polyfill": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz", + "integrity": "sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==", + "dev": true, + "peerDependencies": { + "esbuild": "*" + } }, - "node_modules/@aws-sdk/property-provider": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.215.0.tgz", - "integrity": "sha512-dDPjMCCopkRURAmOJCMSlpIQ5BGWCpYj0+FIfZ5qWQs24fn1PAkQHecOiBhJO0ZSVuQy3xcIyWsAp1NE5e+7ug==", + "node_modules/@esbuild-plugins/node-modules-polyfill": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.2.2.tgz", + "integrity": "sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==", + "dev": true, "dependencies": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "escape-string-regexp": "^4.0.0", + "rollup-plugin-node-polyfills": "^0.2.1" }, - "engines": { - "node": ">=14.0.0" + "peerDependencies": { + "esbuild": "*" } }, - "node_modules/@aws-sdk/property-provider/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/protocol-http": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.215.0.tgz", - "integrity": "sha512-qp6Y6v4S534LAjadiVl9p7ErK7ImphOKq6yhFyQwxko6iITLcz8ib3yU27fs4QJcnNj5ZooqW/YlL/0EikDxCQ==", - "dependencies": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.8.tgz", + "integrity": "sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true, "engines": { - "node": ">=14.0.0" + "node": ">=12" } }, - "node_modules/@aws-sdk/protocol-http/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/querystring-builder": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.215.0.tgz", - "integrity": "sha512-eilk8CqG37BVhQklLif00K2dOJgDzacUi8h3KVQ72ry1V3h345i4HsmaFIxvnz8XtNyDvV8qFAzeYg9n2P9RQA==", - "dependencies": { - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-uri-escape": "3.201.0", - "tslib": "^2.3.1" - }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.8.tgz", + "integrity": "sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true, "engines": { - "node": ">=14.0.0" + "node": ">=12" } }, - "node_modules/@aws-sdk/querystring-builder/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/querystring-parser": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.215.0.tgz", - "integrity": "sha512-8h/9H8dWM4fZO27UGzo8W5JXln4yJMugPyUl4qFA437gzPgNFN95+oLJWXtHMlfCHC5T/PDKetY9TarMDgBD0Q==", - "dependencies": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.8.tgz", + "integrity": "sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true, "engines": { - "node": ">=14.0.0" + "node": ">=12" } }, - "node_modules/@aws-sdk/querystring-parser/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/s3-request-presigner": { - "version": "3.216.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.216.0.tgz", - "integrity": "sha512-JK7W/F3yFh0Bm585mBBTqYdkGPDelDT8OO6vv/NwzjxHkqfN3MTc1/sGPWd0XqJ4EHnscck+rq4jYHyYcem7mQ==", - "dependencies": { - "@aws-sdk/middleware-endpoint": "3.215.0", - "@aws-sdk/middleware-sdk-s3": "3.215.0", - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/signature-v4-multi-region": "3.215.0", - "@aws-sdk/smithy-client": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-create-request": "3.215.0", - "@aws-sdk/util-format-url": "3.215.0", - "tslib": "^2.3.1" - }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.8.tgz", + "integrity": "sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, "engines": { - "node": ">=14.0.0" + "node": ">=12" } }, - "node_modules/@aws-sdk/s3-request-presigner/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "node_modules/@aws-sdk/service-error-classification": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.215.0.tgz", - "integrity": "sha512-SKBvClGFGzMPsjBBKjneaUazLCNr6bSxe9eFvOr3gCwuwE2jPQwW3VE1mb62howuvm6cLthEDwLQp/FsT1gMsw==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.8.tgz", + "integrity": "sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, "engines": { - "node": ">=14.0.0" + "node": ">=12" } }, - "node_modules/@aws-sdk/shared-ini-file-loader": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.215.0.tgz", - "integrity": "sha512-unzQeLOyUiYHr8WxxandHo0OaCj31gx0wpt8dn2cZcHm/MdCqHcHcsQqOVnQsWQrrxY/XZ27cPyMVQeicNKYwQ==", - "dependencies": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.8.tgz", + "integrity": "sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, "engines": { - "node": ">=14.0.0" + "node": ">=12" } }, - "node_modules/@aws-sdk/shared-ini-file-loader/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/signature-v4": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.215.0.tgz", - "integrity": "sha512-Rc73uUCi3eJneO25DydLTfJYamXeuKS9YIhNMTKlpvcN1UQAmAnUbAmCuEmqvkYOiGD1i4/kd8kBga708iIikQ==", - "dependencies": { - "@aws-sdk/is-array-buffer": "3.201.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-hex-encoding": "3.201.0", - "@aws-sdk/util-middleware": "3.215.0", - "@aws-sdk/util-uri-escape": "3.201.0", - "tslib": "^2.3.1" - }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.8.tgz", + "integrity": "sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, "engines": { - "node": ">=14.0.0" + "node": ">=12" } }, - "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.215.0.tgz", - "integrity": "sha512-XOUUNWs6I4vAa+Byj6qL/+DCWA5CjcRyA9sitYy8sNqhLcet8WoYf7vJL2LW1nvdzRb/pGBNWLiQOZ+9sadYeg==", - "dependencies": { - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/signature-v4": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-arn-parser": "3.208.0", - "tslib": "^2.3.1" - }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.8.tgz", + "integrity": "sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "@aws-sdk/signature-v4-crt": "^3.118.0" - }, - "peerDependenciesMeta": { - "@aws-sdk/signature-v4-crt": { - "optional": true - } + "node": ">=12" } }, - "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/signature-v4/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/smithy-client": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.215.0.tgz", - "integrity": "sha512-PiZfCdZkPohzMPrRmJ46TPOf2Tr/dhKYdwQArRnOOIsJABUGXjlzCUE8vysDN35XZYRx5f9hd+/U7kayhniq2w==", - "dependencies": { - "@aws-sdk/middleware-stack": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.8.tgz", + "integrity": "sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=14.0.0" + "node": ">=12" } }, - "node_modules/@aws-sdk/smithy-client/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.216.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.216.0.tgz", - "integrity": "sha512-cEmOfG7njWl0OA5lR65Sp2SW1i8ZLjf7C95TZ1e6t2Oo5aUFeN3aKBxMOV//1yc+BNzcFBnoHP/f29GhWxUOxA==", - "dependencies": { - "@aws-sdk/client-sso-oidc": "3.216.0", - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/shared-ini-file-loader": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.8.tgz", + "integrity": "sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=14.0.0" + "node": ">=12" } }, - "node_modules/@aws-sdk/token-providers/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/types": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.215.0.tgz", - "integrity": "sha512-eRbCVjwzTYd9C5e2mceScJ6D2kYDDEC3PLkYfJa+1wH9iiF2JlbiYozAokyeYBHQ+AjmD93MK58RBoM8iZfH0Q==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.8.tgz", + "integrity": "sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=14.0.0" + "node": ">=12" } }, - "node_modules/@aws-sdk/url-parser": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.215.0.tgz", - "integrity": "sha512-r/qIk3TUlV36JvoRjTErFm0LzzgNKLB1YUG8zVZCGAc2TEATi8OVEmsZvi+KfTmsbszulITJVcjZKbHLbGoUzg==", - "dependencies": { - "@aws-sdk/querystring-parser": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.8.tgz", + "integrity": "sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" } }, - "node_modules/@aws-sdk/url-parser/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.208.0.tgz", - "integrity": "sha512-QV4af+kscova9dv4VuHOgH8wEr/IIYHDGcnyVtkUEqahCejWr1Kuk+SBK0xMwnZY5LSycOtQ8aeqHOn9qOjZtA==", - "dependencies": { - "tslib": "^2.3.1" - }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.8.tgz", + "integrity": "sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=14.0.0" + "node": ">=12" } }, - "node_modules/@aws-sdk/util-arn-parser/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/util-base64": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz", - "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==", - "dependencies": { - "@aws-sdk/util-buffer-from": "3.208.0", - "tslib": "^2.3.1" - }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.8.tgz", + "integrity": "sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=14.0.0" + "node": ">=12" } }, - "node_modules/@aws-sdk/util-base64/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/util-body-length-browser": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", - "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", - "dependencies": { - "tslib": "^2.3.1" + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.8.tgz", + "integrity": "sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" } }, - "node_modules/@aws-sdk/util-body-length-browser/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/util-body-length-node": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz", - "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==", - "dependencies": { - "tslib": "^2.3.1" - }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.8.tgz", + "integrity": "sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=14.0.0" + "node": ">=12" } }, - "node_modules/@aws-sdk/util-body-length-node/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/util-buffer-from": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", - "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", - "dependencies": { - "@aws-sdk/is-array-buffer": "3.201.0", - "tslib": "^2.3.1" - }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.8.tgz", + "integrity": "sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, "engines": { - "node": ">=14.0.0" + "node": ">=12" } }, - "node_modules/@aws-sdk/util-buffer-from/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/util-config-provider": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", - "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==", - "dependencies": { - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/util-config-provider/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/util-create-request": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-create-request/-/util-create-request-3.215.0.tgz", - "integrity": "sha512-V+f6YYSUHGNWVLQpdTgpbCPgnkXmHtC9uEk/rQjzJAvzAZmqYuPc2hheBSAt7gN6yzLoMeDBmjhZMh79fFZ3UQ==", - "dependencies": { - "@aws-sdk/middleware-stack": "3.215.0", - "@aws-sdk/smithy-client": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/util-create-request/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/util-defaults-mode-browser": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.215.0.tgz", - "integrity": "sha512-MiNfZgB0I4dR8CBxH163W7c9KvE38sgCHNPWopMqSX5ezz7cuCPohCU0XsWd4I7K31PvzuqmKgOiKBAZraQJMA==", - "dependencies": { - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/types": "3.215.0", - "bowser": "^2.11.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@aws-sdk/util-defaults-mode-browser/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/util-defaults-mode-node": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.215.0.tgz", - "integrity": "sha512-mSp3R8GljQ+4UT3QMOksQk9L0cWbFLvR7bBmAlt4+GobgTjpRfzFjBP3uwrCqFa3BKDUR3FeJq3qwo+xeY1Krg==", - "dependencies": { - "@aws-sdk/config-resolver": "3.215.0", - "@aws-sdk/credential-provider-imds": "3.215.0", - "@aws-sdk/node-config-provider": "3.215.0", - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@aws-sdk/util-defaults-mode-node/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.216.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.216.0.tgz", - "integrity": "sha512-uHje4H6Qj/z/op8UZoSuvGpEZhz/r+AGY0rCihFo7XjhT4RYVxb2Eb9uHRK/IAeHU4kjHAdpQiWGMSmnT/UacA==", - "dependencies": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/util-endpoints/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/util-format-url": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.215.0.tgz", - "integrity": "sha512-j8X2pIwpSxtS23Za6t36pQjeVe5ouunoMuOj4wdj2uB3Cbf2vvd84J5lF8bUHQA35f5PRqdYtU1KyolQudCXsA==", - "dependencies": { - "@aws-sdk/querystring-builder": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/util-format-url/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/util-hex-encoding": { - "version": "3.201.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", - "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", - "dependencies": { - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/util-hex-encoding/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.55.0.tgz", - "integrity": "sha512-0sPmK2JaJE2BbTcnvybzob/VrFKCXKfN4CUKcvn0yGg/me7Bz+vtzQRB3Xp+YSx+7OtWxzv63wsvHoAnXvgxgg==", - "dependencies": { - "tslib": "^2.3.1" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@aws-sdk/util-locate-window/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "node_modules/@aws-sdk/util-middleware": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.215.0.tgz", - "integrity": "sha512-DfHGlFlQCr+T/xhjS36HH8JEThDVB5lg5NZ6x4Cibhyeps9YX/4ovLAIx3B19H34sdWhZi7q6LfslCHLRu2+7Q==", - "dependencies": { - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/util-middleware/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/util-stream-browser": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-browser/-/util-stream-browser-3.215.0.tgz", - "integrity": "sha512-UVyCJJ5sCYLVHCW4Lpm8+ae+ISHPHZ/OqAoLbUpehk2RLGP6QhpQOrpJADLXPuB8YuWFMkoLLIVL8VE7mmTPWA==", - "dependencies": { - "@aws-sdk/fetch-http-handler": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-hex-encoding": "3.201.0", - "@aws-sdk/util-utf8-browser": "3.188.0", - "tslib": "^2.3.1" - } - }, - "node_modules/@aws-sdk/util-stream-browser/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/util-stream-node": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-node/-/util-stream-node-3.215.0.tgz", - "integrity": "sha512-7Vyp61P/2dGA9Fzn6uN/KdRd+Z7n8gCGmXBd/dQSrHx3UFIm1TuEmMwROzbWWxPOS6qDWY/dwQgMZH/tq78Llg==", - "dependencies": { - "@aws-sdk/node-http-handler": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-buffer-from": "3.208.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/util-stream-node/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/util-uri-escape": { - "version": "3.201.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", - "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", - "dependencies": { - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/util-uri-escape/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.215.0.tgz", - "integrity": "sha512-uZz6BJWr8sJcA+onveS1lFqnbIXBHwvkyHLgCuuGhAxd5yY6YNLhpJBnhy9Fb8/aSbk6yao3qxlokqw9gthmAw==", - "dependencies": { - "@aws-sdk/types": "3.215.0", - "bowser": "^2.11.0", - "tslib": "^2.3.1" - } - }, - "node_modules/@aws-sdk/util-user-agent-browser/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.215.0.tgz", - "integrity": "sha512-4lrdd1oGRwJEwfvgvg1jcJ2O0bwElsvtiqZfTRHN6MNTFUqsKl0xHlgFChQsz3Hfrc1niWtZCmbqQKGdO5ARpw==", - "dependencies": { - "@aws-sdk/node-config-provider": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@aws-sdk/util-user-agent-node/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/util-utf8-browser": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz", - "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==", - "dependencies": { - "tslib": "^2.3.1" - } - }, - "node_modules/@aws-sdk/util-utf8-browser/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "node_modules/@aws-sdk/util-utf8-node": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.208.0.tgz", - "integrity": "sha512-jKY87Acv0yWBdFxx6bveagy5FYjz+dtV8IPT7ay1E2WPWH1czoIdMAkc8tSInK31T6CRnHWkLZ1qYwCbgRfERQ==", - "dependencies": { - "@aws-sdk/util-buffer-from": "3.208.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/util-utf8-node/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/util-waiter": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.215.0.tgz", - "integrity": "sha512-RX/EkRcuDjWKP/5K6XOnbq5cPaO9KSJ5Etotn+z5sPGUJ0xmGWEyFyfXKSL51az32tHcNoGAqboBTFDISB0LyA==", - "dependencies": { - "@aws-sdk/abort-controller": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/util-waiter/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@aws-sdk/xml-builder": { - "version": "3.201.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.201.0.tgz", - "integrity": "sha512-brRdB1wwMgjWEnOQsv7zSUhIQuh7DEicrfslAqHop4S4FtSI3GQAShpQqgOpMTNFYcpaWKmE/Y1MJmNY7xLCnw==", - "dependencies": { - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/xml-builder/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@babel/parser": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", - "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", - "bin": { - "parser": "bin/babel-parser.js" - }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.8.tgz", + "integrity": "sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, "engines": { - "node": ">=6.0.0" + "node": ">=12" } }, - "node_modules/@esbuild-plugins/node-globals-polyfill": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.1.1.tgz", - "integrity": "sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.8.tgz", + "integrity": "sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==", + "cpu": [ + "x64" + ], "dev": true, - "peerDependencies": { - "esbuild": "*" + "optional": true, + "os": [ + "sunos" + ], + "peer": true, + "engines": { + "node": ">=12" } }, - "node_modules/@esbuild-plugins/node-modules-polyfill": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.1.4.tgz", - "integrity": "sha512-uZbcXi0zbmKC/050p3gJnne5Qdzw8vkXIv+c2BW0Lsc1ji1SkrxbKPUy5Efr0blbTu1SL8w4eyfpnSdPg3G0Qg==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.8.tgz", + "integrity": "sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "escape-string-regexp": "^4.0.0", - "rollup-plugin-node-polyfills": "^0.2.1" - }, - "peerDependencies": { - "esbuild": "*" + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=12" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.10.tgz", - "integrity": "sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.8.tgz", + "integrity": "sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==", "cpu": [ - "arm" + "ia32" ], "dev": true, "optional": true, "os": [ - "android" + "win32" ], + "peer": true, "engines": { "node": ">=12" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz", - "integrity": "sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==", + "node_modules/@esbuild/win32-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.8.tgz", + "integrity": "sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==", "cpu": [ - "loong64" + "x64" ], "dev": true, "optional": true, "os": [ - "linux" + "win32" ], + "peer": true, "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/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": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "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.4.0", - "globals": "^13.15.0", + "espree": "^9.6.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -1859,13 +1341,53 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/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/@eslint/js": { + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", + "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fortawesome/fontawesome-free": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.4.2.tgz", + "integrity": "sha512-m5cPn3e2+FDCOgi1mz0RexTUvvQibBebOUlUlW0+YrMjDTPkiJ6VTKukA1GRsvRw+12KyJndNjj0O4AgTxm2Pg==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", - "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -1887,17 +1409,27 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, + "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/@jsdevtools/ono": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", "dev": true }, + "node_modules/@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1933,14 +1465,34 @@ "node": ">= 8" } }, - "node_modules/@popperjs/core": { - "version": "2.11.6", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", - "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } + "node_modules/@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "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==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } }, "node_modules/@rushstack/eslint-patch": { "version": "1.2.0", @@ -1948,2062 +1500,1858 @@ "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==", "dev": true }, - "node_modules/@types/bootstrap": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.2.6.tgz", - "integrity": "sha512-BlAc3YATdasbHoxMoBWODrSF6qwQO/E9X8wVxCCSa6rWjnaZfpkr2N6pUMCY6jj2+wf0muUtLySbvU9etX6YqA==", - "dev": true, + "node_modules/@smithy/abort-controller": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.15.tgz", + "integrity": "sha512-JkS36PIS3/UCbq/MaozzV7jECeL+BTt4R75bwY8i+4RASys4xOyUS1HsRyUNSqUXFP4QyCz5aNnh3ltuaxv+pw==", "dependencies": { - "@popperjs/core": "^2.9.2" + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "16.11.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.45.tgz", - "integrity": "sha512-3rKg/L5x0rofKuuUt5zlXzOnKyIHXmIu5R8A0TuNDMF2062/AOIDBciFIjToLEJ/9F9DzkHNot+BpNsMI1OLdQ==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.30.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.7.tgz", - "integrity": "sha512-l4L6Do+tfeM2OK0GJsU7TUcM/1oN/N25xHm3Jb4z3OiDU4Lj8dIuxX9LpVMS9riSXQs42D1ieX7b85/r16H9Fw==", - "dev": true, + "node_modules/@smithy/chunked-blob-reader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-2.0.0.tgz", + "integrity": "sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg==", "dependencies": { - "@typescript-eslint/scope-manager": "5.30.7", - "@typescript-eslint/type-utils": "5.30.7", - "@typescript-eslint/utils": "5.30.7", - "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "tslib": "^2.5.0" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.30.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.30.7.tgz", - "integrity": "sha512-Rg5xwznHWWSy7v2o0cdho6n+xLhK2gntImp0rJroVVFkcYFYQ8C8UJTSuTw/3CnExBmPjycjmUJkxVmjXsld6A==", - "dev": true, + "node_modules/@smithy/chunked-blob-reader-native": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-2.0.1.tgz", + "integrity": "sha512-N2oCZRglhWKm7iMBu7S6wDzXirjAofi7tAd26cxmgibRYOBS4D3hGfmkwCpHdASZzwZDD8rluh0Rcqw1JeZDRw==", "dependencies": { - "@typescript-eslint/scope-manager": "5.30.7", - "@typescript-eslint/types": "5.30.7", - "@typescript-eslint/typescript-estree": "5.30.7", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@smithy/util-base64": "^2.0.1", + "tslib": "^2.5.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.30.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.30.7.tgz", - "integrity": "sha512-7BM1bwvdF1UUvt+b9smhqdc/eniOnCKxQT/kj3oXtj3LqnTWCAM0qHRHfyzCzhEfWX0zrW7KqXXeE4DlchZBKw==", - "dev": true, + "node_modules/@smithy/config-resolver": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.21.tgz", + "integrity": "sha512-rlLIGT+BeqjnA6C2FWumPRJS1UW07iU5ZxDHtFuyam4W65gIaOFMjkB90ofKCIh+0mLVQrQFrl/VLtQT/6FWTA==", "dependencies": { - "@typescript-eslint/types": "5.30.7", - "@typescript-eslint/visitor-keys": "5.30.7" + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=14.0.0" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.30.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.30.7.tgz", - "integrity": "sha512-nD5qAE2aJX/YLyKMvOU5jvJyku4QN5XBVsoTynFrjQZaDgDV6i7QHFiYCx10wvn7hFvfuqIRNBtsgaLe0DbWhw==", - "dev": true, + "node_modules/@smithy/credential-provider-imds": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.4.tgz", + "integrity": "sha512-cwPJN1fa1YOQzhBlTXRavABEYRRchci1X79QRwzaNLySnIMJfztyv1Zkst0iZPLMnpn8+CnHu3wOHS11J5Dr3A==", "dependencies": { - "@typescript-eslint/utils": "5.30.7", - "debug": "^4.3.4", - "tsutils": "^3.21.0" + "@smithy/node-config-provider": "^2.1.8", + "@smithy/property-provider": "^2.0.16", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "tslib": "^2.5.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=14.0.0" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.30.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.7.tgz", - "integrity": "sha512-ocVkETUs82+U+HowkovV6uxf1AnVRKCmDRNUBUUo46/5SQv1owC/EBFkiu4MOHeZqhKz2ktZ3kvJJ1uFqQ8QPg==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node_modules/@smithy/eventstream-codec": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.15.tgz", + "integrity": "sha512-crjvz3j1gGPwA0us6cwS7+5gAn35CTmqu/oIxVbYJo2Qm/sGAye6zGJnMDk3BKhWZw5kcU1G4MxciTkuBpOZPg==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^2.7.0", + "@smithy/util-hex-encoding": "^2.0.0", + "tslib": "^2.5.0" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.30.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.7.tgz", - "integrity": "sha512-tNslqXI1ZdmXXrHER83TJ8OTYl4epUzJC0aj2i4DMDT4iU+UqLT3EJeGQvJ17BMbm31x5scSwo3hPM0nqQ1AEA==", - "dev": true, + "node_modules/@smithy/eventstream-serde-browser": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.0.15.tgz", + "integrity": "sha512-WiFG5N9j3jmS5P0z5Xev6dO0c3lf7EJYC2Ncb0xDnWFvShwXNn741AF71ABr5EcZw8F4rQma0362MMjAwJeZog==", "dependencies": { - "@typescript-eslint/types": "5.30.7", - "@typescript-eslint/visitor-keys": "5.30.7", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "@smithy/eventstream-serde-universal": "^2.0.15", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=14.0.0" } }, - "node_modules/@typescript-eslint/utils": { - "version": "5.30.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.30.7.tgz", - "integrity": "sha512-Z3pHdbFw+ftZiGUnm1GZhkJgVqsDL5CYW2yj+TB2mfXDFOMqtbzQi2dNJIyPqPbx9mv2kUxS1gU+r2gKlKi1rQ==", - "dev": true, + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.0.15.tgz", + "integrity": "sha512-o65d2LRjgCbWYH+VVNlWXtmsI231SO99ZTOL4UuIPa6WTjbSHWtlXvUcJG9libhEKWmEV9DIUiH2IqyPWi7ubA==", "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.30.7", - "@typescript-eslint/types": "5.30.7", - "@typescript-eslint/typescript-estree": "5.30.7", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "node": ">=14.0.0" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.30.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.7.tgz", - "integrity": "sha512-KrRXf8nnjvcpxDFOKej4xkD7657+PClJs5cJVSG7NNoCNnjEdc46juNAQt7AyuWctuCgs6mVRc1xGctEqrjxWw==", - "dev": true, + "node_modules/@smithy/eventstream-serde-node": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.0.15.tgz", + "integrity": "sha512-9OOXiIhHq1VeOG6xdHkn2ZayfMYM3vzdUTV3zhcCnt+tMqA3BJK3XXTJFRR2BV28rtRM778DzqbBTf+hqwQPTg==", "dependencies": { - "@typescript-eslint/types": "5.30.7", - "eslint-visitor-keys": "^3.3.0" + "@smithy/eventstream-serde-universal": "^2.0.15", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=14.0.0" } }, - "node_modules/@vitejs/plugin-vue": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz", - "integrity": "sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==", - "dev": true, - "engines": { - "node": "^14.18.0 || >=16.0.0" + "node_modules/@smithy/eventstream-serde-universal": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.0.15.tgz", + "integrity": "sha512-dP8AQp/pXlWBjvL0TaPBJC3rM0GoYv7O0Uim8d/7UKZ2Wo13bFI3/BhQfY/1DeiP1m23iCHFNFtOQxfQNBB8rQ==", + "dependencies": { + "@smithy/eventstream-codec": "^2.0.15", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, - "peerDependencies": { - "vite": "^3.0.0", - "vue": "^3.2.25" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@volar/language-core": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.0.9.tgz", - "integrity": "sha512-5Fty3slLet6svXiJw2YxhYeo6c7wFdtILrql5bZymYLM+HbiZtJbryW1YnUEKAP7MO9Mbeh+TNH4Z0HFxHgIqw==", - "dev": true, + "node_modules/@smithy/fetch-http-handler": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.3.1.tgz", + "integrity": "sha512-6MNk16fqb8EwcYY8O8WxB3ArFkLZ2XppsSNo1h7SQcFdDDwIumiJeO6wRzm7iB68xvsOQzsdQKbdtTieS3hfSQ==", "dependencies": { - "@volar/source-map": "1.0.9", - "@vue/reactivity": "^3.2.40", - "muggle-string": "^0.1.0" + "@smithy/protocol-http": "^3.0.11", + "@smithy/querystring-builder": "^2.0.15", + "@smithy/types": "^2.7.0", + "@smithy/util-base64": "^2.0.1", + "tslib": "^2.5.0" } }, - "node_modules/@volar/source-map": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.0.9.tgz", - "integrity": "sha512-fazB/vy5ZEJ3yKx4fabJyGNI3CBkdLkfEIRVu6+1P3VixK0Mn+eqyUIkLBrzGYaeFM3GybhCLCvsVdNz0Fu/CQ==", - "dev": true, + "node_modules/@smithy/hash-blob-browser": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-2.0.16.tgz", + "integrity": "sha512-cSYRi05LA7DZDwjB1HL0BP8B56eUNNeLglVH147QTXFyuXJq/7erAIiLRfsyXB8+GfFHkSS5BHbc76a7k/AYPA==", "dependencies": { - "muggle-string": "^0.1.0" + "@smithy/chunked-blob-reader": "^2.0.0", + "@smithy/chunked-blob-reader-native": "^2.0.1", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" } }, - "node_modules/@volar/typescript": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.0.9.tgz", - "integrity": "sha512-dVziu+ShQUWuMukM6bvK2v2O446/gG6l1XkTh2vfkccw1IzjfbiP1TWQoNo1ipTfZOtu5YJGYAx+o5HNrGXWfQ==", - "dev": true, + "node_modules/@smithy/hash-node": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.17.tgz", + "integrity": "sha512-Il6WuBcI1nD+e2DM7tTADMf01wEPGK8PAhz4D+YmDUVaoBqlA+CaH2uDJhiySifmuKBZj748IfygXty81znKhw==", "dependencies": { - "@volar/language-core": "1.0.9" + "@smithy/types": "^2.7.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@volar/vue-language-core": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@volar/vue-language-core/-/vue-language-core-1.0.9.tgz", - "integrity": "sha512-tofNoR8ShPFenHT1YVMuvoXtXWwoQE+fiXVqSmW0dSKZqEDjWQ3YeXSd0a6aqyKaIbvR7kWWGp34WbpQlwf9Ww==", - "dev": true, + "node_modules/@smithy/hash-stream-node": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-2.0.17.tgz", + "integrity": "sha512-ey8DtnATzp1mOXgS7rqMwSmAki6iJA+jgNucKcxRkhMB1rrICfHg+rhmIF50iLPDHUhTcS5pBMOrLzzpZftvNQ==", "dependencies": { - "@volar/language-core": "1.0.9", - "@volar/source-map": "1.0.9", - "@vue/compiler-dom": "^3.2.40", - "@vue/compiler-sfc": "^3.2.40", - "@vue/reactivity": "^3.2.40", - "@vue/shared": "^3.2.40", - "minimatch": "^5.1.0", - "vue-template-compiler": "^2.7.10" + "@smithy/types": "^2.7.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@volar/vue-language-core/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, + "node_modules/@smithy/invalid-dependency": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.15.tgz", + "integrity": "sha512-dlEKBFFwVfzA5QroHlBS94NpgYjXhwN/bFfun+7w3rgxNvVy79SK0w05iGc7UAeC5t+D7gBxrzdnD6hreZnDVQ==", "dependencies": { - "balanced-match": "^1.0.0" + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" } }, - "node_modules/@volar/vue-language-core/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, + "node_modules/@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", "dependencies": { - "brace-expansion": "^2.0.1" + "tslib": "^2.5.0" }, "engines": { - "node": ">=10" + "node": ">=14.0.0" } }, - "node_modules/@volar/vue-typescript": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-1.0.9.tgz", - "integrity": "sha512-ZLe4y9YNbviACa7uAMCilzxA76gbbSlKfjspXBzk6fCobd8QCIig+VyDYcjANIlm2HhgSCX8jYTzhCKlegh4mw==", - "dev": true, + "node_modules/@smithy/md5-js": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-2.0.17.tgz", + "integrity": "sha512-jmISTCnEkOnm2oCNx/rMkvBT/eQh3aA6nktevkzbmn/VYqYEuc5Z2n5sTTqsciMSO01Lvf56wG1A4twDqovYeQ==", "dependencies": { - "@volar/typescript": "1.0.9", - "@volar/vue-language-core": "1.0.9" + "@smithy/types": "^2.7.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" } }, - "node_modules/@vue/compiler-core": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz", - "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==", + "node_modules/@smithy/middleware-content-length": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.17.tgz", + "integrity": "sha512-OyadvMcKC7lFXTNBa8/foEv7jOaqshQZkjWS9coEXPRZnNnihU/Ls+8ZuJwGNCOrN2WxXZFmDWhegbnM4vak8w==", "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.45", - "estree-walker": "^2.0.2", - "source-map": "^0.6.1" + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@vue/compiler-dom": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz", - "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==", + "node_modules/@smithy/middleware-endpoint": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.2.3.tgz", + "integrity": "sha512-nYfxuq0S/xoAjdLbyn1ixeVB6cyH9wYCMtbbOCpcCRYR5u2mMtqUtVjjPAZ/DIdlK3qe0tpB0Q76szFGNuz+kQ==", "dependencies": { - "@vue/compiler-core": "3.2.45", - "@vue/shared": "3.2.45" + "@smithy/middleware-serde": "^2.0.15", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/shared-ini-file-loader": "^2.2.7", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@vue/compiler-sfc": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz", - "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==", - "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.45", - "@vue/compiler-dom": "3.2.45", - "@vue/compiler-ssr": "3.2.45", - "@vue/reactivity-transform": "3.2.45", - "@vue/shared": "3.2.45", - "estree-walker": "^2.0.2", - "magic-string": "^0.25.7", - "postcss": "^8.1.10", - "source-map": "^0.6.1" + "node_modules/@smithy/middleware-retry": { + "version": "2.0.24", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.24.tgz", + "integrity": "sha512-q2SvHTYu96N7lYrn3VSuX3vRpxXHR/Cig6MJpGWxd0BWodUQUWlKvXpWQZA+lTaFJU7tUvpKhRd4p4MU3PbeJg==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.8", + "@smithy/protocol-http": "^3.0.11", + "@smithy/service-error-classification": "^2.0.8", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "@smithy/util-middleware": "^2.0.8", + "@smithy/util-retry": "^2.0.8", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@vue/compiler-ssr": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz", - "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==", + "node_modules/@smithy/middleware-serde": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.15.tgz", + "integrity": "sha512-FOZRFk/zN4AT4wzGuBY+39XWe+ZnCFd0gZtyw3f9Okn2CJPixl9GyWe98TIaljeZdqWkgrzGyPre20AcW2UMHQ==", "dependencies": { - "@vue/compiler-dom": "3.2.45", - "@vue/shared": "3.2.45" + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@vue/devtools-api": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.4.5.tgz", - "integrity": "sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==" - }, - "node_modules/@vue/eslint-config-prettier": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-7.0.0.tgz", - "integrity": "sha512-/CTc6ML3Wta1tCe1gUeO0EYnVXfo3nJXsIhZ8WJr3sov+cGASr6yuiibJTL6lmIBm7GobopToOuB3B6AWyV0Iw==", - "dev": true, + "node_modules/@smithy/middleware-stack": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.9.tgz", + "integrity": "sha512-bCB5dUtGQ5wh7QNL2ELxmDc6g7ih7jWU3Kx6MYH1h4mZbv9xL3WyhKHojRltThCB1arLPyTUFDi+x6fB/oabtA==", "dependencies": { - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-prettier": "^4.0.0" + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, - "peerDependencies": { - "eslint": ">= 7.28.0", - "prettier": ">= 2.0.0" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@vue/eslint-config-typescript": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-11.0.2.tgz", - "integrity": "sha512-EiKud1NqlWmSapBFkeSrE994qpKx7/27uCGnhdqzllYDpQZroyX/O6bwjEpeuyKamvLbsGdO6PMR2faIf+zFnw==", - "dev": true, + "node_modules/@smithy/node-config-provider": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.8.tgz", + "integrity": "sha512-+w26OKakaBUGp+UG+dxYZtFb5fs3tgHg3/QrRrmUZj+rl3cIuw840vFUXX35cVPTUCQIiTqmz7CpVF7+hdINdQ==", "dependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0", - "@typescript-eslint/parser": "^5.0.0", - "vue-eslint-parser": "^9.0.0" + "@smithy/property-provider": "^2.0.16", + "@smithy/shared-ini-file-loader": "^2.2.7", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0", - "eslint-plugin-vue": "^9.0.0", - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=14.0.0" } }, - "node_modules/@vue/reactivity": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.45.tgz", - "integrity": "sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==", + "node_modules/@smithy/node-http-handler": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.2.1.tgz", + "integrity": "sha512-8iAKQrC8+VFHPAT8pg4/j6hlsTQh+NKOWlctJBrYtQa4ExcxX7aSg3vdQ2XLoYwJotFUurg/NLqFCmZaPRrogw==", "dependencies": { - "@vue/shared": "3.2.45" + "@smithy/abort-controller": "^2.0.15", + "@smithy/protocol-http": "^3.0.11", + "@smithy/querystring-builder": "^2.0.15", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@vue/reactivity-transform": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz", - "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==", + "node_modules/@smithy/property-provider": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.16.tgz", + "integrity": "sha512-28Ky0LlOqtEjwg5CdHmwwaDRHcTWfPRzkT6HrhwOSRS2RryAvuDfJrZpM+BMcrdeCyEg1mbcgIMoqTla+rdL8Q==", "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.45", - "@vue/shared": "3.2.45", - "estree-walker": "^2.0.2", - "magic-string": "^0.25.7" + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@vue/runtime-core": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.45.tgz", - "integrity": "sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==", + "node_modules/@smithy/protocol-http": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.11.tgz", + "integrity": "sha512-3ziB8fHuXIRamV/akp/sqiWmNPR6X+9SB8Xxnozzj+Nq7hSpyKdFHd1FLpBkgfGFUTzzcBJQlDZPSyxzmdcx5A==", "dependencies": { - "@vue/reactivity": "3.2.45", - "@vue/shared": "3.2.45" + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@vue/runtime-dom": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz", - "integrity": "sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==", + "node_modules/@smithy/querystring-builder": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.15.tgz", + "integrity": "sha512-e1q85aT6HutvouOdN+dMsN0jcdshp50PSCvxDvo6aIM57LqeXimjfONUEgfqQ4IFpYWAtVixptyIRE5frMp/2A==", "dependencies": { - "@vue/runtime-core": "3.2.45", - "@vue/shared": "3.2.45", - "csstype": "^2.6.8" + "@smithy/types": "^2.7.0", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@vue/server-renderer": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.45.tgz", - "integrity": "sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==", + "node_modules/@smithy/querystring-parser": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.15.tgz", + "integrity": "sha512-jbBvoK3cc81Cj1c1TH1qMYxNQKHrYQ2DoTntN9FBbtUWcGhc+T4FP6kCKYwRLXyU4AajwGIZstvNAmIEgUUNTQ==", "dependencies": { - "@vue/compiler-ssr": "3.2.45", - "@vue/shared": "3.2.45" + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, - "peerDependencies": { - "vue": "3.2.45" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@vue/shared": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz", - "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==" + "node_modules/@smithy/service-error-classification": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.8.tgz", + "integrity": "sha512-jCw9+005im8tsfYvwwSc4TTvd29kXRFkH9peQBg5R/4DD03ieGm6v6Hpv9nIAh98GwgYg1KrztcINC1s4o7/hg==", + "dependencies": { + "@smithy/types": "^2.7.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "node_modules/@vue/tsconfig": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.1.3.tgz", - "integrity": "sha512-kQVsh8yyWPvHpb8gIc9l/HIDiiVUy1amynLNpCy8p+FoCiZXCo6fQos5/097MmnNZc9AtseDsCrfkhqCrJ8Olg==", - "dev": true, - "peerDependencies": { - "@types/node": "*" + "node_modules/@smithy/shared-ini-file-loader": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.7.tgz", + "integrity": "sha512-0Qt5CuiogIuvQIfK+be7oVHcPsayLgfLJGkPlbgdbl0lD28nUKu4p11L+UG3SAEsqc9UsazO+nErPXw7+IgDpQ==", + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "engines": { + "node": ">=14.0.0" } }, - "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" + "node_modules/@smithy/signature-v4": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.17.tgz", + "integrity": "sha512-ru5IUbHUAYgJ5ZqZaBi6PEsMjFT/do0Eu21Qt7b07NuRuPlwAMhlqNRDy/KE9QAF20ygehb+xe9ebmyZ26/BSA==", + "dependencies": { + "@smithy/eventstream-codec": "^2.0.15", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/types": "^2.7.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-middleware": "^2.0.8", + "@smithy/util-uri-escape": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" }, "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": ">=14.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, + "node_modules/@smithy/smithy-client": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.18.tgz", + "integrity": "sha512-7FqdbaJiVaHJDD9IfDhmzhSDbpjyx+ZsfdYuOpDJF09rl8qlIAIlZNoSaflKrQ3cEXZN2YxGPaNWGhbYimyIRQ==", "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" + "@smithy/middleware-stack": "^2.0.9", + "@smithy/types": "^2.7.0", + "@smithy/util-stream": "^2.0.23", + "tslib": "^2.5.0" }, - "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": ">=14.0.0" } }, - "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, + "node_modules/@smithy/types": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.7.0.tgz", + "integrity": "sha512-1OIFyhK+vOkMbu4aN2HZz/MomREkrAC/HqY5mlJMUJfGrPRwijJDTeiN8Rnj9zUaB8ogXAfIOtZrrgqZ4w7Wnw==", "dependencies": { - "color-convert": "^2.0.1" + "tslib": "^2.5.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=14.0.0" } }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, + "node_modules/@smithy/url-parser": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.15.tgz", + "integrity": "sha512-sADUncUj9rNbOTrdDGm4EXlUs0eQ9dyEo+V74PJoULY4jSQxS+9gwEgsPYyiu8PUOv16JC/MpHonOgqP/IEDZA==", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "@smithy/querystring-parser": "^2.0.15", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.1.tgz", + "integrity": "sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">= 8" + "node": ">=14.0.0" } }, - "node_modules/argparse": { + "node_modules/@smithy/util-body-length-browser": { "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 + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.1.tgz", + "integrity": "sha512-NXYp3ttgUlwkaug4bjBzJ5+yIbUbUx8VsSLuHZROQpoik+gRkIBeEG9MPVYfvPNpuXb/puqodeeUXcKFe7BLOQ==", + "dependencies": { + "tslib": "^2.5.0" + } }, - "node_modules/array-union": { + "node_modules/@smithy/util-body-length-node": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", + "dependencies": { + "tslib": "^2.5.0" + }, "engines": { - "node": ">=8" + "node": ">=14.0.0" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/axios": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.0.tgz", - "integrity": "sha512-zT7wZyNYu3N5Bu0wuZ6QccIf93Qk1eV8LOewxgjOZFd2DenOs98cJ7+Y6703d0wkaXGY6/nZd4EweJaHz9uzQw==", - "dev": true, + "node_modules/@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "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/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "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, + "node_modules/@smithy/util-config-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "dependencies": { + "tslib": "^2.5.0" + }, "engines": { - "node": ">=8" + "node": ">=14.0.0" } }, - "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.2.3", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz", - "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], - "peerDependencies": { - "@popperjs/core": "^2.11.6" + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.22.tgz", + "integrity": "sha512-qcF20IHHH96FlktvBRICDXDhLPtpVmtksHmqNGtotb9B0DYWXsC6jWXrkhrrwF7tH26nj+npVTqh9isiFV1gdA==", + "dependencies": { + "@smithy/property-provider": "^2.0.16", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" } }, - "node_modules/bootstrap-icons": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.10.2.tgz", - "integrity": "sha512-PTPYadRn1AMGr+QTSxe4ZCc+Wzv9DGZxbi3lNse/dajqV31n2/wl/7NX78ZpkvFgRNmH4ogdIQPQmxAfhEV6nA==" - }, - "node_modules/bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" - }, - "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, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "2.0.29", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.29.tgz", + "integrity": "sha512-+uG/15VoUh6JV2fdY9CM++vnSuMQ1VKZ6BdnkUM7R++C/vLjnlg+ToiSR1FqKZbMmKBXmsr8c/TsDWMAYvxbxQ==", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@smithy/config-resolver": "^2.0.21", + "@smithy/credential-provider-imds": "^2.1.4", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/property-provider": "^2.0.16", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" } }, - "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, + "node_modules/@smithy/util-endpoints": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.7.tgz", + "integrity": "sha512-Q2gEind3jxoLk6hdKWyESMU7LnXz8aamVwM+VeVjOYzYT1PalGlY/ETa48hv2YpV4+YV604y93YngyzzzQ4IIA==", "dependencies": { - "fill-range": "^7.0.1" + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=8" + "node": ">= 14.0.0" } }, - "node_modules/buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "node_modules/@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, + "node_modules/@smithy/util-middleware": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.8.tgz", + "integrity": "sha512-qkvqQjM8fRGGA8P2ydWylMhenCDP8VlkPn8kiNuFEaFz9xnUKC2irfqsBSJrfrOB9Qt6pQsI58r3zvvumhFMkw==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==", - "dev": true - }, - "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, + "node_modules/@smithy/util-retry": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.8.tgz", + "integrity": "sha512-cQTPnVaVFMjjS6cb44WV2yXtHVyXDC5icKyIbejMarJEApYeJWpBU3LINTxHqp/tyLI+MZOUdosr2mZ3sdziNg==", + "dependencies": { + "@smithy/service-error-classification": "^2.0.8", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, "engines": { - "node": ">=6" + "node": ">= 14.0.0" } }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" + "node_modules/@smithy/util-stream": { + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.23.tgz", + "integrity": "sha512-OJMWq99LAZJUzUwTk+00plyxX3ESktBaGPhqNIEVab+53gLULiWN9B/8bRABLg0K6R6Xg4t80uRdhk3B/LZqMQ==", + "dependencies": { + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/types": "^2.7.0", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "node_modules/@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "tslib": "^2.5.0" }, "engines": { - "node": ">=10" + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.2.tgz", + "integrity": "sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": ">=14.0.0" } }, - "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/" - } - ], + "node_modules/@smithy/util-waiter": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.15.tgz", + "integrity": "sha512-9Y+btzzB7MhLADW7xgD6SjvmoYaRkrb/9SCbNGmNdfO47v38rxb90IGXyDtAK0Shl9bMthTmLgjlfYc+vtz2Qw==", "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" + "@smithy/abort-controller": "^2.0.15", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=14.0.0" } }, - "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==", + "node_modules/@tsconfig/node18": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.2.tgz", + "integrity": "sha512-d6McJeGsuoRlwWZmVIeE8CUA27lu6jLjvv1JzqmpsytOYYbVi1tHZEnwCNVOXnj4pyLvneZlFlpXUK+X9wBWyw==", + "dev": true + }, + "node_modules/@types/bootstrap": { + "version": "5.2.10", + "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.2.10.tgz", + "integrity": "sha512-F2X+cd6551tep0MvVZ6nM8v7XgGN/twpdNDjqS1TUM7YFNEtQYWk+dKAnH+T1gr6QgCoGMPl487xw/9hXooa2g==", "dev": true, "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" + "@popperjs/core": "^2.9.2" } }, - "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==", + "node_modules/@types/dompurify": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz", + "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==", "dev": true, "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "@types/trusted-types": "*" } }, - "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==", + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } + "node_modules/@types/node": { + "version": "16.18.68", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.68.tgz", + "integrity": "sha512-sG3hPIQwJLoewrN7cr0dwEy+yF5nD4D/4FxtQpFciRD/xwUzgD+G05uxZHv5mhfXo4F9Jkp13jjn0CC2q325sg==", + "dev": true }, - "node_modules/commander": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz", - "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==", - "dev": true, - "engines": { - "node": "^12.20.0 || >=14" - } + "node_modules/@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "dev": 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==", + "node_modules/@types/showdown": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/showdown/-/showdown-2.0.6.tgz", + "integrity": "sha512-pTvD/0CIeqe4x23+YJWlX2gArHa8G0J0Oh6GKaVXV7TAeickpkkZiNOgFcFcmLQ5lB/K0qBJL1FtRYltBfbGCQ==", "dev": 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==", + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "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" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "engines": { - "node": ">=4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" - }, - "node_modules/dayjs": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.6.tgz", - "integrity": "sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ==" - }, - "node_modules/de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "dependencies": { - "ms": "2.1.2" + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" }, "engines": { - "node": ">=6.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { - "supports-color": { + "typescript": { "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/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { - "node": ">= 0.4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, "dependencies": { - "path-type": "^4.0.0" + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, "engines": { - "node": ">=6.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "dependencies": { - "is-arrayish": "^0.2.1" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" }, "engines": { - "node": ">= 0.4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">= 0.4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/esbuild": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.10.tgz", - "integrity": "sha512-N7wBhfJ/E5fzn/SpNgX+oW2RLRjwaL8Y0ezqNqhjD6w0H2p0rDuEz2FKZqpqLnO8DCaWumKe8dsC/ljvVSSxng==", + "node_modules/@vitejs/plugin-vue": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.3.4.tgz", + "integrity": "sha512-ciXNIHKPriERBisHFBvnTbfKa6r9SAesOYXeGDzgegcvy9Q4xdScSHAmKbNT0M3O0S9LKhIf5/G+UYG4NnnzYw==", "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, "engines": { - "node": ">=12" + "node": "^14.18.0 || >=16.0.0" }, - "optionalDependencies": { - "@esbuild/android-arm": "0.15.10", - "@esbuild/linux-loong64": "0.15.10", - "esbuild-android-64": "0.15.10", - "esbuild-android-arm64": "0.15.10", - "esbuild-darwin-64": "0.15.10", - "esbuild-darwin-arm64": "0.15.10", - "esbuild-freebsd-64": "0.15.10", - "esbuild-freebsd-arm64": "0.15.10", - "esbuild-linux-32": "0.15.10", - "esbuild-linux-64": "0.15.10", - "esbuild-linux-arm": "0.15.10", - "esbuild-linux-arm64": "0.15.10", - "esbuild-linux-mips64le": "0.15.10", - "esbuild-linux-ppc64le": "0.15.10", - "esbuild-linux-riscv64": "0.15.10", - "esbuild-linux-s390x": "0.15.10", - "esbuild-netbsd-64": "0.15.10", - "esbuild-openbsd-64": "0.15.10", - "esbuild-sunos-64": "0.15.10", - "esbuild-windows-32": "0.15.10", - "esbuild-windows-64": "0.15.10", - "esbuild-windows-arm64": "0.15.10" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz", - "integrity": "sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.2.25" } }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz", - "integrity": "sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==", - "cpu": [ - "arm64" - ], + "node_modules/@volar/language-core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.11.1.tgz", + "integrity": "sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==", "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" + "dependencies": { + "@volar/source-map": "1.11.1" } }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz", - "integrity": "sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==", - "cpu": [ - "x64" - ], + "node_modules/@volar/source-map": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.11.1.tgz", + "integrity": "sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" + "dependencies": { + "muggle-string": "^0.3.1" } }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz", - "integrity": "sha512-M1t5+Kj4IgSbYmunf2BB6EKLkWUq+XlqaFRiGOk8bmBapu9bCDrxjf4kUnWn59Dka3I27EiuHBKd1rSO4osLFQ==", - "cpu": [ - "arm64" - ], + "node_modules/@volar/typescript": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.11.1.tgz", + "integrity": "sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" + "dependencies": { + "@volar/language-core": "1.11.1", + "path-browserify": "^1.0.1" } }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz", - "integrity": "sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" + "node_modules/@vue/compiler-core": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.10.tgz", + "integrity": "sha512-doe0hODR1+i1menPkRzJ5MNR6G+9uiZHIknK3Zn5OcIztu6GGw7u0XUzf3AgB8h/dfsZC9eouzoLo3c3+N/cVA==", + "dependencies": { + "@babel/parser": "^7.23.5", + "@vue/shared": "3.3.10", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" } }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz", - "integrity": "sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } + "node_modules/@vue/compiler-core/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/esbuild-linux-32": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz", - "integrity": "sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "node_modules/@vue/compiler-dom": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.10.tgz", + "integrity": "sha512-NCrqF5fm10GXZIK0GrEAauBqdy+F2LZRt3yNHzrYjpYBuRssQbuPLtSnSNjyR9luHKkWSH8we5LMB3g+4z2HvA==", + "dependencies": { + "@vue/compiler-core": "3.3.10", + "@vue/shared": "3.3.10" } }, - "node_modules/esbuild-linux-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz", - "integrity": "sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "node_modules/@vue/compiler-sfc": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.10.tgz", + "integrity": "sha512-xpcTe7Rw7QefOTRFFTlcfzozccvjM40dT45JtrE3onGm/jBLZ0JhpKu3jkV7rbDFLeeagR/5RlJ2Y9SvyS0lAg==", + "dependencies": { + "@babel/parser": "^7.23.5", + "@vue/compiler-core": "3.3.10", + "@vue/compiler-dom": "3.3.10", + "@vue/compiler-ssr": "3.3.10", + "@vue/reactivity-transform": "3.3.10", + "@vue/shared": "3.3.10", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.5", + "postcss": "^8.4.32", + "source-map-js": "^1.0.2" } }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz", - "integrity": "sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/@vue/compiler-sfc/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/@vue/compiler-sfc/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/esbuild-linux-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz", - "integrity": "sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "node_modules/@vue/compiler-ssr": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.10.tgz", + "integrity": "sha512-12iM4jA4GEbskwXMmPcskK5wImc2ohKm408+o9iox3tfN9qua8xL0THIZtoe9OJHnXP4eOWZpgCAAThEveNlqQ==", + "dependencies": { + "@vue/compiler-dom": "3.3.10", + "@vue/shared": "3.3.10" } }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz", - "integrity": "sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==", - "cpu": [ - "mips64el" - ], + "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/eslint-config-prettier": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-8.0.0.tgz", + "integrity": "sha512-55dPqtC4PM/yBjhAr+yEw6+7KzzdkBuLmnhBrDfp4I48+wy+Giqqj9yUr5T2uD/BkBROjjmqnLZmXRdOx/VtQg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-prettier": "^5.0.0" + }, + "peerDependencies": { + "eslint": ">= 8.0.0", + "prettier": ">= 3.0.0" } }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz", - "integrity": "sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==", - "cpu": [ - "ppc64" - ], + "node_modules/@vue/eslint-config-typescript": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-11.0.3.tgz", + "integrity": "sha512-dkt6W0PX6H/4Xuxg/BlFj5xHvksjpSlVjtkQCpaYJBIEuKj2hOVU7r+TIe+ysCwRYFz/lGqvklntRkCAibsbPw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@typescript-eslint/eslint-plugin": "^5.59.1", + "@typescript-eslint/parser": "^5.59.1", + "vue-eslint-parser": "^9.1.1" + }, "engines": { - "node": ">=12" + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0", + "eslint-plugin-vue": "^9.0.0", + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz", - "integrity": "sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==", - "cpu": [ - "riscv64" - ], + "node_modules/@vue/language-core": { + "version": "1.8.25", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.25.tgz", + "integrity": "sha512-NJk/5DnAZlpvXX8BdWmHI45bWGLViUaS3R/RMrmFSvFMSbJKuEODpM4kR0F0Ofv5SFzCWuNiMhxameWpVdQsnA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "@volar/language-core": "~1.11.1", + "@volar/source-map": "~1.11.1", + "@vue/compiler-dom": "^3.3.0", + "@vue/shared": "^3.3.0", + "computeds": "^0.0.1", + "minimatch": "^9.0.3", + "muggle-string": "^0.3.1", + "path-browserify": "^1.0.1", + "vue-template-compiler": "^2.7.14" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz", - "integrity": "sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==", - "cpu": [ - "s390x" - ], + "node_modules/@vue/language-core/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz", - "integrity": "sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==", - "cpu": [ - "x64" - ], + "node_modules/@vue/language-core/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, - "optional": true, - "os": [ - "netbsd" - ], + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz", - "integrity": "sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" + "node_modules/@vue/reactivity": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.10.tgz", + "integrity": "sha512-H5Z7rOY/JLO+e5a6/FEXaQ1TMuOvY4LDVgT+/+HKubEAgs9qeeZ+NhADSeEtrNQeiKLDuzeKc8v0CUFpB6Pqgw==", + "dependencies": { + "@vue/shared": "3.3.10" } }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz", - "integrity": "sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" + "node_modules/@vue/reactivity-transform": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.10.tgz", + "integrity": "sha512-0xBdk+CKHWT+Gev8oZ63Tc0qFfj935YZx+UAynlutnrDZ4diFCVFMWixn65HzjE3S1iJppWOo6Tt1OzASH7VEg==", + "dependencies": { + "@babel/parser": "^7.23.5", + "@vue/compiler-core": "3.3.10", + "@vue/shared": "3.3.10", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.5" } }, - "node_modules/esbuild-windows-32": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz", - "integrity": "sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], + "node_modules/@vue/reactivity-transform/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/@vue/reactivity-transform/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/esbuild-windows-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz", - "integrity": "sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "node_modules/@vue/runtime-core": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.10.tgz", + "integrity": "sha512-DZ0v31oTN4YHX9JEU5VW1LoIVgFovWgIVb30bWn9DG9a7oA415idcwsRNNajqTx8HQJyOaWfRKoyuP2P2TYIag==", + "dependencies": { + "@vue/reactivity": "3.3.10", + "@vue/shared": "3.3.10" } }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz", - "integrity": "sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "node_modules/@vue/runtime-dom": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.10.tgz", + "integrity": "sha512-c/jKb3ny05KJcYk0j1m7Wbhrxq7mZYr06GhKykDMNRRR9S+/dGT8KpHuNQjv3/8U4JshfkAk6TpecPD3B21Ijw==", + "dependencies": { + "@vue/runtime-core": "3.3.10", + "@vue/shared": "3.3.10", + "csstype": "^3.1.2" } }, - "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" + "node_modules/@vue/server-renderer": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.10.tgz", + "integrity": "sha512-0i6ww3sBV3SKlF3YTjSVqKQ74xialMbjVYGy7cOTi7Imd8ediE7t72SK3qnvhrTAhOvlQhq6Bk6nFPdXxe0sAg==", + "dependencies": { + "@vue/compiler-ssr": "3.3.10", + "@vue/shared": "3.3.10" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "vue": "3.3.10" } }, - "node_modules/eslint": { - "version": "8.28.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.28.0.tgz", - "integrity": "sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ==", + "node_modules/@vue/shared": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.10.tgz", + "integrity": "sha512-2y3Y2J1a3RhFa0WisHvACJR2ncvWiVHcP8t0Inxo+NKz+8RKO4ZV8eZgCxRgQoA6ITfV12L4E6POOL9HOU5nqw==" + }, + "node_modules/@vue/tsconfig": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.4.0.tgz", + "integrity": "sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "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.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "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.15.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "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.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, "bin": { - "eslint": "bin/eslint.js" + "acorn": "bin/acorn" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=0.4.0" } }, - "node_modules/eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "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, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, "peerDependencies": { - "eslint": ">=7.0.0" + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dependencies": { - "prettier-linter-helpers": "^1.0.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "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": ">=12.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } + "node": ">=8" } }, - "node_modules/eslint-plugin-vue": { - "version": "9.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.7.0.tgz", - "integrity": "sha512-DrOO3WZCZEwcLsnd3ohFwqCoipGRSTKTBTnLwdhqAbYZtzWl0o7D+D8ZhlmiZvABKTEl8AFsqH1GHGdybyoQmw==", + "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": { - "eslint-utils": "^3.0.0", - "natural-compare": "^1.4.0", - "nth-check": "^2.0.1", - "postcss-selector-parser": "^6.0.9", - "semver": "^7.3.5", - "vue-eslint-parser": "^9.0.1", - "xml-name-validator": "^4.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": "^14.17.0 || >=16.0.0" + "node": ">=8" }, - "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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==", + "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": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=8.0.0" + "node": ">= 8" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "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/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "node_modules/array-union": { "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-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true }, - "node_modules/espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true, - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "node_modules/axios": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "dev": true, "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "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/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/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/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "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==", + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", "dev": true, "engines": { - "node": ">=4.0" + "node": ">=0.6" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "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": ">=4.0" + "node": ">=8" } }, - "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/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/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" + "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/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-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" }, - "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", "dev": true, "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "big-integer": "^1.6.44" }, "engines": { - "node": ">=8.6.0" + "node": ">= 5.10.0" } }, - "node_modules/fast-glob/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==", + "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": { - "is-glob": "^4.0.1" + "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": ">= 6" + "node": ">=8" } }, - "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/fast-xml-parser": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", - "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", + "node_modules/buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - }, - "funding": { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" } }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", "dev": true, "dependencies": { - "reusify": "^1.0.4" + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dev": true, "dependencies": { - "flat-cache": "^3.0.4" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/filesize": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.0.5.tgz", - "integrity": "sha512-qrzyt8gLh86nsyYiC3ibI5KyIYRCWg2yqIklYrWF4a0qNfekik4OQfn7AoPJG2hRrPMSlH6fET4VEITweZAzjA==", + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "dev": true + }, + "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": ">= 14.0.0" + "node": ">=6" } }, - "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==", + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, + "node_modules/chart.js": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.3.3.tgz", + "integrity": "sha512-aTk7pBw+x6sQYhon/NR3ikfUJuym/LdgpTlgZRe2PaEhjUMKBKyNaFCMVRAyTEWYFNO7qRu7iQVqOw/OqzxZxQ==", "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "@kurkle/color": "^0.3.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "pnpm": ">=7" } }, - "node_modules/flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", - "dev": true + "node_modules/chartjs-plugin-zoom": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/chartjs-plugin-zoom/-/chartjs-plugin-zoom-2.0.1.tgz", + "integrity": "sha512-ogOmLu6e+Q7E1XWOCOz9YwybMslz9qNfGV2a+qjfmqJYpsw5ZMoRHZBUyW+NGhkpQ5PwwPA/+rikHpBZb7PZuA==", + "dependencies": { + "hammerjs": "^2.0.8" + }, + "peerDependencies": { + "chart.js": ">=3.2.0" + } }, - "node_modules/follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "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://github.com/sponsors/RubenVerborgh" + "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": ">=4.0" + "node": ">= 8.10.0" }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "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": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "is-glob": "^4.0.1" }, "engines": { "node": ">= 6" } }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "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": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=12" + "node": ">=7.0.0" } }, - "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==", + "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/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "delayed-stream": "~1.0.0" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">= 0.8" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=16" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "node_modules/computeds": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz", + "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", "dev": true }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "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/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, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "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, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "bin": { + "cssesc": "bin/cssesc" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=4" } }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "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/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "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": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "ms": "2.1.2" }, "engines": { - "node": ">= 0.4" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", "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" + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" }, "engines": { - "node": "*" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", "dev": true, "dependencies": { - "is-glob": "^4.0.3" + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globals": { - "version": "13.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", - "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", "dev": true, "dependencies": { - "type-fest": "^0.20.2" + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" + "path-type": "^4.0.0" }, "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" + "node": ">=8" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "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": { - "function-bind": "^1.1.1" + "esutils": "^2.0.2" }, "engines": { - "node": ">= 0.4.0" + "node": ">=6.0.0" } }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/dompurify": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.6.tgz", + "integrity": "sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w==" }, - "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==", + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "is-arrayish": "^0.2.1" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "node_modules/es-abstract": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.1" + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/es-set-tostringtag": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4012,435 +3360,479 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "node_modules/esbuild": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.8.tgz", + "integrity": "sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==", "dev": true, + "hasInstallScript": true, + "peer": true, "bin": { - "he": "bin/he" + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.19.8", + "@esbuild/android-arm64": "0.19.8", + "@esbuild/android-x64": "0.19.8", + "@esbuild/darwin-arm64": "0.19.8", + "@esbuild/darwin-x64": "0.19.8", + "@esbuild/freebsd-arm64": "0.19.8", + "@esbuild/freebsd-x64": "0.19.8", + "@esbuild/linux-arm": "0.19.8", + "@esbuild/linux-arm64": "0.19.8", + "@esbuild/linux-ia32": "0.19.8", + "@esbuild/linux-loong64": "0.19.8", + "@esbuild/linux-mips64el": "0.19.8", + "@esbuild/linux-ppc64": "0.19.8", + "@esbuild/linux-riscv64": "0.19.8", + "@esbuild/linux-s390x": "0.19.8", + "@esbuild/linux-x64": "0.19.8", + "@esbuild/netbsd-x64": "0.19.8", + "@esbuild/openbsd-x64": "0.19.8", + "@esbuild/sunos-x64": "0.19.8", + "@esbuild/win32-arm64": "0.19.8", + "@esbuild/win32-ia32": "0.19.8", + "@esbuild/win32-x64": "0.19.8" } }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true + "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/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", - "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==", + "node_modules/eslint": { + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", + "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", "dev": true, "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.48.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "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": ">=6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "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" + "url": "https://opencollective.com/eslint" } }, - "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==", + "node_modules/eslint-config-prettier": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "node_modules/eslint-plugin-prettier": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz", + "integrity": "sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" }, "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": 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==", + "node_modules/eslint-plugin-vue": { + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.17.0.tgz", + "integrity": "sha512-r7Bp79pxQk9I5XDP0k2dpUC7Ots3OSWgvGZNu3BxmKK6Zg7NgVtcOB6OCna5Kb9oQwJPl5hq183WD0SY5tZtIQ==", "dev": true, "dependencies": { - "binary-extensions": "^2.0.0" + "@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.3.1", + "xml-name-validator": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "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": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.0.0" } }, - "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "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": ">= 0.4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "node_modules/eslint/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": { - "has": "^1.0.3" + "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": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "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": { - "has-tostringtag": "^1.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">= 0.4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "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": ">=0.10.0" + "node": ">=4.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==", + "node_modules/eslint/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/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": { - "is-extglob": "^2.1.1" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": ">=0.10.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "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, - "engines": { - "node": ">= 0.4" + "dependencies": { + "estraverse": "^5.1.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10" } }, - "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==", + "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": ">=0.12.0" + "node": ">=4.0" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "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": { - "has-tostringtag": "^1.0.0" + "estraverse": "^5.2.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4.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, + "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": ">=8" + "node": ">=4.0" } }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4.0" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "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, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.8.x" } }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">= 0.4" + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "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==" }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true }, - "node_modules/js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "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==", + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { - "argparse": "^2.0.1" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=8.6.0" } }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "node_modules/json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==", + "node_modules/fast-glob/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": { - "@apidevtools/json-schema-ref-parser": "9.0.9" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=10" + "node": ">= 6" } }, - "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==", + "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/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==", + "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/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, + "node_modules/fast-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "funding": [ + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + }, + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], "dependencies": { - "universalify": "^2.0.0" + "strnum": "^1.0.5" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "bin": { + "fxparser": "src/cli/cli.js" } }, - "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==", + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "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": ">= 0.8.0" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "node_modules/filesize": { + "version": "10.0.12", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.0.12.tgz", + "integrity": "sha512-6RS9gDchbn+qWmtV2uSjo5vmKizgfCQeb5jKmqx8HyzA3MoLqqyQxN+QcjkGBJt7FjJ9qFce67Auyya5rRRbpw==", + "engines": { + "node": ">= 10.4.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": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "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==", + "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": { - "p-locate": "^5.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { "node": ">=10" @@ -4449,382 +3841,378 @@ "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": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "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": { - "yallist": "^4.0.0" + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=10" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dependencies": { - "sourcemap-codec": "^1.4.8" - } + "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/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "node": ">=4.0" }, - "engines": { - "node": ">=8.6" + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, - "engines": { - "node": ">= 0.6" + "dependencies": { + "is-callable": "^1.1.3" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "dependencies": { - "mime-db": "1.52.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">= 0.6" + "node": ">= 6" } }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": "*" + "node": ">=14.14" } }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "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/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/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/muggle-string": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.1.0.tgz", - "integrity": "sha512-Tr1knR3d2mKvvWthlk7202rywKbiOm4rVFLsfAaSIhJ6dt9o47W4S+JMtWhd/PW9Wrdew2/S2fSvhz3E2gkfEg==", - "dev": true + "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/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "bin": { - "nanoid": "bin/nanoid.cjs" + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dev": true, - "bin": { - "semver": "bin/semver" + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "bin": { - "npm-run-all": "bin/npm-run-all/index.js", - "run-p": "bin/run-p/index.js", - "run-s": "bin/run-s/index.js" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, "engines": { - "node": ">= 4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm-run-all/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==", + "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": { - "color-convert": "^1.9.0" + "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": ">=4" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm-run-all/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==", + "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": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=4" + "node": ">=10.13.0" } }, - "node_modules/npm-run-all/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==", + "node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-run-all/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 - }, - "node_modules/npm-run-all/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "define-properties": "^1.1.3" }, "engines": { - "node": ">=4.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm-run-all/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, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/npm-run-all/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==", + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-run-all/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, - "engines": { - "node": ">=4" + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm-run-all/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "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/hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==", + "engines": { + "node": ">=0.8.0" } }, - "node_modules/npm-run-all/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, "dependencies": { - "shebang-regex": "^1.0.0" + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" } }, - "node_modules/npm-run-all/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm-run-all/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==", + "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, - "dependencies": { - "has-flag": "^3.0.0" - }, "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-all/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "node": ">=8" } }, - "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==", + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dev": true, "dependencies": { - "boolbase": "^1.0.0" + "get-intrinsic": "^1.2.2" }, "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" + "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4833,400 +4221,395 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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": { - "wrappy": "1" + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/openapi-typescript-codegen": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/openapi-typescript-codegen/-/openapi-typescript-codegen-0.23.0.tgz", - "integrity": "sha512-gOJXy5g3H3HlLpVNN+USrNK2i2KYBmDczk9Xk34u6JorwrGiDJZUj+al4S+i9TXdfUQ/ZaLxE59Xf3wqkxGfqA==", + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, - "dependencies": { - "camelcase": "^6.3.0", - "commander": "^9.3.0", - "fs-extra": "^10.1.0", - "handlebars": "^4.7.7", - "json-schema-ref-parser": "^9.0.9" - }, "bin": { - "openapi": "bin/index.js" + "he": "bin/he" } }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, "engines": { - "node": ">= 0.8.0" + "node": ">=14.18.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==", + "node_modules/idb-keyval": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz", + "integrity": "sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "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, - "dependencies": { - "yocto-queue": "^0.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 4" } }, - "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==", + "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": { - "p-limit": "^3.0.2" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "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==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">=0.8.19" } }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "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": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "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" + "once": "^1.3.0", + "wrappy": "1" } }, - "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==", + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/internal-slot": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "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==", + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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, - "engines": { - "node": ">=8.6" + "dependencies": { + "binary-extensions": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "engines": { + "node": ">=8" } }, - "node_modules/pidtree": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, - "bin": { - "pidtree": "bin/pidtree.js" + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=0.10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pinia": { - "version": "2.0.26", - "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.0.26.tgz", - "integrity": "sha512-tSxZNUcMGxQOvKZRjPKXxd2+/2NZhRF/CoYVE/+K6uE/Z3v1Oi4fcQFpxu5nMB1dCchjXUZ+lz0tBxV5ntwmQQ==", + "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": { - "@vue/devtools-api": "^6.4.5", - "vue-demi": "*" + "hasown": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/posva" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" }, - "peerDependencies": { - "@vue/composition-api": "^1.4.0", - "typescript": ">=4.4.4", - "vue": "^2.6.14 || ^3.2.0" + "engines": { + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - }, - "typescript": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pinia/node_modules/vue-demi": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.5.tgz", - "integrity": "sha512-tO3K2bML3AwiHmVHeKCq6HLef2st4zBXIV5aEkoJl6HZ+gJWxWv2O8wLH8qrA3SX3lDoTDHNghLX1xZg83MXvw==", - "hasInstallScript": true, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" + "is-docker": "cli.js" }, "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss": { - "version": "8.4.19", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", - "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, + "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": "^10 || ^12 || >=14" + "node": ">=0.10.0" } }, - "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "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": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "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==", + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, "engines": { - "node": ">= 0.8.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prettier": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.0.tgz", - "integrity": "sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==", + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, "engines": { - "node": ">=10.13.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "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-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "dependencies": { - "fast-diff": "^1.1.2" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "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": ">=6" + "node": ">=8" } }, - "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/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, "dependencies": { - "pify": "^3.0.0" + "call-bind": "^1.0.2" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, "engines": { - "node": ">= 6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "dependencies": { - "picomatch": "^2.2.1" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=8.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5235,5282 +4618,2427 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "call-bind": "^1.0.2" }, "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==", + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/is-wsl/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, + "bin": { + "is-docker": "cli.js" + }, "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "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-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": { - "glob": "^7.1.3" + "argparse": "^2.0.1" }, "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "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-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-schema-ref-parser": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", + "integrity": "sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==", + "deprecated": "Please switch to @apidevtools/json-schema-ref-parser", "dev": true, - "bin": { - "rollup": "dist/bin/rollup" + "dependencies": { + "@apidevtools/json-schema-ref-parser": "9.0.9" }, "engines": { - "node": ">=10.0.0" + "node": ">=10" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "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/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "graceful-fs": "^4.1.6" } }, - "node_modules/rollup-plugin-inject": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", - "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", + "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": { - "estree-walker": "^0.6.1", - "magic-string": "^0.25.3", - "rollup-pluginutils": "^2.8.1" + "json-buffer": "3.0.1" } }, - "node_modules/rollup-plugin-inject/node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - }, - "node_modules/rollup-plugin-node-polyfills": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", - "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", + "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": { - "rollup-plugin-inject": "^3.0.0" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", "dev": true, "dependencies": { - "estree-walker": "^0.6.1" + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/rollup-pluginutils/node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - }, - "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==", + "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, - "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" + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "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/sass": { - "version": "1.56.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.56.1.tgz", - "integrity": "sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ==", - "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": ">=12.0.0" - } + "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/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, + "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==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, - "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==", + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "dev": true, "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" + "sourcemap-codec": "^1.4.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==", + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 0.10.0" } }, - "node_modules/shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "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/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true - }, - "node_modules/stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" + "node": ">= 8" } }, - "node_modules/string.prototype.padend": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz", - "integrity": "sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==", + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.6" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.6" } }, - "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==", + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "mime-db": "1.52.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" + "node": ">= 0.6" } }, - "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==", + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" - }, - "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==", + "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": { - "has-flag": "^4.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8" + "node": "*" } }, - "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==", + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "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-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" + "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/muggle-string": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz", + "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", + "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": ">=8.0" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "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/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "dependencies": { - "tslib": "^1.8.1" - }, + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "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": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "node": ">=0.10.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==", + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", "dev": true, "dependencies": { - "prelude-ls": "^1.2.1" + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 4" } }, - "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==", + "node_modules/npm-run-all/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, - "engines": { - "node": ">=10" + "dependencies": { + "color-convert": "^1.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4" } }, - "node_modules/typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "devOptional": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "node_modules/npm-run-all/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=4.2.0" + "node": ">=4" } }, - "node_modules/uglify-js": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.16.2.tgz", - "integrity": "sha512-AaQNokTNgExWrkEYA24BTNMSjyqEXPSfhqoS0AxmHkCJ4U+Dyy5AvbGV/sqxuxficEfGGoX3zWw9R7QpLFfEsg==", + "node_modules/npm-run-all/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, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" + "dependencies": { + "color-name": "1.1.3" } }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "node_modules/npm-run-all/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 + }, + "node_modules/npm-run-all/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=4.8" } }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "node_modules/npm-run-all/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, "engines": { - "node": ">= 10.0.0" + "node": ">=0.8.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==", + "node_modules/npm-run-all/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, - "dependencies": { - "punycode": "^2.1.0" + "engines": { + "node": ">=4" } }, - "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==" + "node_modules/npm-run-all/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "node_modules/npm-run-all/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, "bin": { - "uuid": "dist/bin/uuid" + "semver": "bin/semver" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "node_modules/npm-run-all/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/vite": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.4.tgz", - "integrity": "sha512-Z2X6SRAffOUYTa+sLy3NQ7nlHFU100xwanq1WDwqaiFiCe+25zdxP1TfCS5ojPV2oDDcXudHIoPnI1Z/66B7Yw==", + "node_modules/npm-run-all/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/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, "dependencies": { - "esbuild": "^0.15.9", - "postcss": "^8.4.18", - "resolve": "^1.22.1", - "rollup": "^2.79.1" - }, - "bin": { - "vite": "bin/vite.js" + "has-flag": "^3.0.0" }, "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } + "node": ">=4" } }, - "node_modules/vue": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.45.tgz", - "integrity": "sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==", + "node_modules/npm-run-all/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, "dependencies": { - "@vue/compiler-dom": "3.2.45", - "@vue/compiler-sfc": "3.2.45", - "@vue/runtime-dom": "3.2.45", - "@vue/server-renderer": "3.2.45", - "@vue/shared": "3.2.45" + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" } }, - "node_modules/vue-eslint-parser": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.0.3.tgz", - "integrity": "sha512-yL+ZDb+9T0ELG4VIFo/2anAOz8SvBdlqEnQnvJ3M7Scq56DvtjY0VY88bByRZB0D4J0u8olBcfrXTVONXsh4og==", + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "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" + "path-key": "^4.0.0" }, "engines": { - "node": "^14.17.0 || >=16.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" }, - "peerDependencies": { - "eslint": ">=6.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vue-eslint-parser/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "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": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "boolbase": "^1.0.0" }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "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==", + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, "engines": { - "node": ">=4.0" + "node": ">= 0.4" } }, - "node_modules/vue-router": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.6.tgz", - "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==", + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, "dependencies": { - "@vue/devtools-api": "^6.4.5" + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" }, - "funding": { - "url": "https://github.com/sponsors/posva" + "engines": { + "node": ">= 0.4" }, - "peerDependencies": { - "vue": "^3.2.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/vue-template-compiler": { - "version": "2.7.14", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", - "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", + "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": { - "de-indent": "^1.0.2", - "he": "^1.2.0" + "wrappy": "1" } }, - "node_modules/vue-tsc": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.0.9.tgz", - "integrity": "sha512-vRmHD1K6DmBymNhoHjQy/aYKTRQNLGOu2/ESasChG9Vy113K6CdP0NlhR0bzgFJfv2eFB9Ez/9L5kIciUajBxQ==", + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "dependencies": { - "@volar/vue-language-core": "1.0.9", - "@volar/vue-typescript": "1.0.9" + "mimic-fn": "^4.0.0" }, - "bin": { - "vue-tsc": "bin/vue-tsc.js" + "engines": { + "node": ">=12" }, - "peerDependencies": { - "typescript": "*" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vue3-cookies": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/vue3-cookies/-/vue3-cookies-1.0.6.tgz", - "integrity": "sha512-a1UvVD0qIgxyOqjlSOwnLnqAnz8ASltugEv8yX+96i/WGZAN9fEDci7xO4HIWZE1uToUnRq9JnFhvfDCSo45OA==", + "node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, "dependencies": { - "vue": "^3.0.0" + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/openapi-typescript-codegen": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/openapi-typescript-codegen/-/openapi-typescript-codegen-0.25.0.tgz", + "integrity": "sha512-nN/TnIcGbP58qYgwEEy5FrAAjePcYgfMaCe3tsmYyTgI3v4RR9v8os14L+LEWDvV50+CmqiyTzRkKKtJeb6Ybg==", "dev": true, "dependencies": { - "isexe": "^2.0.0" + "camelcase": "^6.3.0", + "commander": "^11.0.0", + "fs-extra": "^11.1.1", + "handlebars": "^4.7.7", + "json-schema-ref-parser": "^9.0.9" }, "bin": { - "node-which": "bin/node-which" + "openapi": "bin/index.js" + } + }, + "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": ">= 8" + "node": ">= 0.8.0" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "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": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "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": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "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/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/xml-name-validator": { + "node_modules/parse-json": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "dev": 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==", + "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": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@apidevtools/json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", - "dev": true, - "requires": { - "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.6", - "call-me-maybe": "^1.0.1", - "js-yaml": "^4.1.0" + "node": ">=8" } }, - "@aws-crypto/crc32": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-2.0.0.tgz", - "integrity": "sha512-TvE1r2CUueyXOuHdEigYjIZVesInd9KN+K/TFFNfkkxRThiNxO6i4ZqqAVMoEjAamZZ1AA8WXJkjCz7YShHPQA==", - "requires": { - "@aws-crypto/util": "^2.0.0", - "@aws-sdk/types": "^3.1.0", - "tslib": "^1.11.1" + "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" } }, - "@aws-crypto/crc32c": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-2.0.0.tgz", - "integrity": "sha512-vF0eMdMHx3O3MoOXUfBZry8Y4ZDtcuskjjKgJz8YfIDjLStxTZrYXk+kZqtl6A0uCmmiN/Eb/JbC/CndTV1MHg==", - "requires": { - "@aws-crypto/util": "^2.0.0", - "@aws-sdk/types": "^3.1.0", - "tslib": "^1.11.1" - } - }, - "@aws-crypto/ie11-detection": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.0.tgz", - "integrity": "sha512-pkVXf/dq6PITJ0jzYZ69VhL8VFOFoPZLZqtU/12SGnzYuJOOGNfF41q9GxdI1yqC8R13Rq3jOLKDFpUJFT5eTA==", - "requires": { - "tslib": "^1.11.1" - } - }, - "@aws-crypto/sha1-browser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-2.0.0.tgz", - "integrity": "sha512-3fIVRjPFY8EG5HWXR+ZJZMdWNRpwbxGzJ9IH9q93FpbgCH8u8GHRi46mZXp3cYD7gealmyqpm3ThZwLKJjWJhA==", - "requires": { - "@aws-crypto/ie11-detection": "^2.0.0", - "@aws-crypto/supports-web-crypto": "^2.0.0", - "@aws-sdk/types": "^3.1.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - } - }, - "@aws-crypto/sha256-browser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz", - "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==", - "requires": { - "@aws-crypto/ie11-detection": "^2.0.0", - "@aws-crypto/sha256-js": "^2.0.0", - "@aws-crypto/supports-web-crypto": "^2.0.0", - "@aws-crypto/util": "^2.0.0", - "@aws-sdk/types": "^3.1.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - } - }, - "@aws-crypto/sha256-js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz", - "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==", - "requires": { - "@aws-crypto/util": "^2.0.0", - "@aws-sdk/types": "^3.1.0", - "tslib": "^1.11.1" + "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" } }, - "@aws-crypto/supports-web-crypto": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.0.tgz", - "integrity": "sha512-Ge7WQ3E0OC7FHYprsZV3h0QIcpdyJLvIeg+uTuHqRYm8D6qCFJoiC+edSzSyFiHtZf+NOQDJ1q46qxjtzIY2nA==", - "requires": { - "tslib": "^1.11.1" - } + "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 }, - "@aws-crypto/util": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.2.tgz", - "integrity": "sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==", - "requires": { - "@aws-sdk/types": "^3.110.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" } }, - "@aws-sdk/abort-controller": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.215.0.tgz", - "integrity": "sha512-HTvL542nawhVqe0oC1AJchdcomEOmPivJEzYUT1LqiG3e8ikxMNa2KWSqqLPeKi2t0A/cfQy7wDUyg9+BZhDSQ==", - "requires": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - } - } + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, - "@aws-sdk/chunked-blob-reader": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-3.188.0.tgz", - "integrity": "sha512-zkPRFZZPL3eH+kH86LDYYXImiClA1/sW60zYOjse9Pgka+eDJlvBN6hcYxwDEKjcwATYiSRR1aVQHcfCinlGXg==", - "requires": { - "tslib": "^2.3.1" + "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" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "@aws-sdk/chunked-blob-reader-native": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.208.0.tgz", - "integrity": "sha512-JeOZ95PW+fJ6bbuqPySYqLqHk1n4+4ueEEraJsiUrPBV0S1ZtyvOGHcnGztKUjr2PYNaiexmpWuvUve9K12HRA==", - "requires": { - "@aws-sdk/util-base64": "3.208.0", - "tslib": "^2.3.1" + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "engines": { + "node": ">=0.10" } }, - "@aws-sdk/client-s3": { - "version": "3.216.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.216.0.tgz", - "integrity": "sha512-zja00+kLB7Kw8X326ueXvCgMJNF5iuTPrFDUgI+JClk1rjXVMa/T1sOLTgZg9W2pbtOO+3GloxwNGVygXNjt8A==", - "requires": { - "@aws-crypto/sha1-browser": "2.0.0", - "@aws-crypto/sha256-browser": "2.0.0", - "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/client-sts": "3.216.0", - "@aws-sdk/config-resolver": "3.215.0", - "@aws-sdk/credential-provider-node": "3.216.0", - "@aws-sdk/eventstream-serde-browser": "3.215.0", - "@aws-sdk/eventstream-serde-config-resolver": "3.215.0", - "@aws-sdk/eventstream-serde-node": "3.215.0", - "@aws-sdk/fetch-http-handler": "3.215.0", - "@aws-sdk/hash-blob-browser": "3.215.0", - "@aws-sdk/hash-node": "3.215.0", - "@aws-sdk/hash-stream-node": "3.215.0", - "@aws-sdk/invalid-dependency": "3.215.0", - "@aws-sdk/md5-js": "3.215.0", - "@aws-sdk/middleware-bucket-endpoint": "3.215.0", - "@aws-sdk/middleware-content-length": "3.215.0", - "@aws-sdk/middleware-endpoint": "3.215.0", - "@aws-sdk/middleware-expect-continue": "3.215.0", - "@aws-sdk/middleware-flexible-checksums": "3.215.0", - "@aws-sdk/middleware-host-header": "3.215.0", - "@aws-sdk/middleware-location-constraint": "3.215.0", - "@aws-sdk/middleware-logger": "3.215.0", - "@aws-sdk/middleware-recursion-detection": "3.215.0", - "@aws-sdk/middleware-retry": "3.215.0", - "@aws-sdk/middleware-sdk-s3": "3.215.0", - "@aws-sdk/middleware-serde": "3.215.0", - "@aws-sdk/middleware-signing": "3.215.0", - "@aws-sdk/middleware-ssec": "3.215.0", - "@aws-sdk/middleware-stack": "3.215.0", - "@aws-sdk/middleware-user-agent": "3.215.0", - "@aws-sdk/node-config-provider": "3.215.0", - "@aws-sdk/node-http-handler": "3.215.0", - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/signature-v4-multi-region": "3.215.0", - "@aws-sdk/smithy-client": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/url-parser": "3.215.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.215.0", - "@aws-sdk/util-defaults-mode-node": "3.215.0", - "@aws-sdk/util-endpoints": "3.216.0", - "@aws-sdk/util-stream-browser": "3.215.0", - "@aws-sdk/util-stream-node": "3.215.0", - "@aws-sdk/util-user-agent-browser": "3.215.0", - "@aws-sdk/util-user-agent-node": "3.215.0", - "@aws-sdk/util-utf8-browser": "3.188.0", - "@aws-sdk/util-utf8-node": "3.208.0", - "@aws-sdk/util-waiter": "3.215.0", - "@aws-sdk/xml-builder": "3.201.0", - "fast-xml-parser": "4.0.11", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - } + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" } }, - "@aws-sdk/client-sso": { - "version": "3.216.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.216.0.tgz", - "integrity": "sha512-9F7JLx9RXEXovg6V4ylqQtpH+sIqQBMIPIrRSGWiQu65rmQQLskRkUka94JsGsBzq1IQwrnqtsuP3Lb0XtwLRA==", - "requires": { - "@aws-crypto/sha256-browser": "2.0.0", - "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.215.0", - "@aws-sdk/fetch-http-handler": "3.215.0", - "@aws-sdk/hash-node": "3.215.0", - "@aws-sdk/invalid-dependency": "3.215.0", - "@aws-sdk/middleware-content-length": "3.215.0", - "@aws-sdk/middleware-endpoint": "3.215.0", - "@aws-sdk/middleware-host-header": "3.215.0", - "@aws-sdk/middleware-logger": "3.215.0", - "@aws-sdk/middleware-recursion-detection": "3.215.0", - "@aws-sdk/middleware-retry": "3.215.0", - "@aws-sdk/middleware-serde": "3.215.0", - "@aws-sdk/middleware-stack": "3.215.0", - "@aws-sdk/middleware-user-agent": "3.215.0", - "@aws-sdk/node-config-provider": "3.215.0", - "@aws-sdk/node-http-handler": "3.215.0", - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/smithy-client": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/url-parser": "3.215.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.215.0", - "@aws-sdk/util-defaults-mode-node": "3.215.0", - "@aws-sdk/util-endpoints": "3.216.0", - "@aws-sdk/util-user-agent-browser": "3.215.0", - "@aws-sdk/util-user-agent-node": "3.215.0", - "@aws-sdk/util-utf8-browser": "3.188.0", - "@aws-sdk/util-utf8-node": "3.208.0", - "tslib": "^2.3.1" - }, + "node_modules/pinia": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.7.tgz", + "integrity": "sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/client-sso-oidc": { - "version": "3.216.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.216.0.tgz", - "integrity": "sha512-O8kmM86BHwiSwyNoIe+iHXuSpUE9PBWl3re8u+/igt/w5W5VmMVz+zQr7gRUDQ1FDgLWNEdAJa0r+JFx3pZdzA==", - "requires": { - "@aws-crypto/sha256-browser": "2.0.0", - "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.215.0", - "@aws-sdk/fetch-http-handler": "3.215.0", - "@aws-sdk/hash-node": "3.215.0", - "@aws-sdk/invalid-dependency": "3.215.0", - "@aws-sdk/middleware-content-length": "3.215.0", - "@aws-sdk/middleware-endpoint": "3.215.0", - "@aws-sdk/middleware-host-header": "3.215.0", - "@aws-sdk/middleware-logger": "3.215.0", - "@aws-sdk/middleware-recursion-detection": "3.215.0", - "@aws-sdk/middleware-retry": "3.215.0", - "@aws-sdk/middleware-serde": "3.215.0", - "@aws-sdk/middleware-stack": "3.215.0", - "@aws-sdk/middleware-user-agent": "3.215.0", - "@aws-sdk/node-config-provider": "3.215.0", - "@aws-sdk/node-http-handler": "3.215.0", - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/smithy-client": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/url-parser": "3.215.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.215.0", - "@aws-sdk/util-defaults-mode-node": "3.215.0", - "@aws-sdk/util-endpoints": "3.216.0", - "@aws-sdk/util-user-agent-browser": "3.215.0", - "@aws-sdk/util-user-agent-node": "3.215.0", - "@aws-sdk/util-utf8-browser": "3.188.0", - "@aws-sdk/util-utf8-node": "3.208.0", - "tslib": "^2.3.1" + "@vue/devtools-api": "^6.5.0", + "vue-demi": ">=0.14.5" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/client-sts": { - "version": "3.216.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.216.0.tgz", - "integrity": "sha512-8rpMZhZXh1kjsAvQ0WNBMDrnP4XneKkBQtt5XcDEmv/GpULt8jOIJnSIJQxt2gkRfd/I9MUC9C3aZNQoSMxa+g==", - "requires": { - "@aws-crypto/sha256-browser": "2.0.0", - "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.215.0", - "@aws-sdk/credential-provider-node": "3.216.0", - "@aws-sdk/fetch-http-handler": "3.215.0", - "@aws-sdk/hash-node": "3.215.0", - "@aws-sdk/invalid-dependency": "3.215.0", - "@aws-sdk/middleware-content-length": "3.215.0", - "@aws-sdk/middleware-endpoint": "3.215.0", - "@aws-sdk/middleware-host-header": "3.215.0", - "@aws-sdk/middleware-logger": "3.215.0", - "@aws-sdk/middleware-recursion-detection": "3.215.0", - "@aws-sdk/middleware-retry": "3.215.0", - "@aws-sdk/middleware-sdk-sts": "3.215.0", - "@aws-sdk/middleware-serde": "3.215.0", - "@aws-sdk/middleware-signing": "3.215.0", - "@aws-sdk/middleware-stack": "3.215.0", - "@aws-sdk/middleware-user-agent": "3.215.0", - "@aws-sdk/node-config-provider": "3.215.0", - "@aws-sdk/node-http-handler": "3.215.0", - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/smithy-client": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/url-parser": "3.215.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.215.0", - "@aws-sdk/util-defaults-mode-node": "3.215.0", - "@aws-sdk/util-endpoints": "3.216.0", - "@aws-sdk/util-user-agent-browser": "3.215.0", - "@aws-sdk/util-user-agent-node": "3.215.0", - "@aws-sdk/util-utf8-browser": "3.188.0", - "@aws-sdk/util-utf8-node": "3.208.0", - "fast-xml-parser": "4.0.11", - "tslib": "^2.3.1" + "funding": { + "url": "https://github.com/sponsors/posva" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/config-resolver": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.215.0.tgz", - "integrity": "sha512-DxX4R+YYLQOtg0qfceKBrjVD4t1mQBG1eb7IVr2QSlckFCX8ztUNymFMuaSEo3938Jyy/NpgfUDpFqPDaSKnng==", - "requires": { - "@aws-sdk/signature-v4": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-config-provider": "3.208.0", - "@aws-sdk/util-middleware": "3.215.0", - "tslib": "^2.3.1" + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.3.0" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true } } }, - "@aws-sdk/credential-provider-env": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.215.0.tgz", - "integrity": "sha512-n5G7I7Pxfsn81+tNsSOzspKp9SYai78oRfImsfFY4JLTcWutv7szMgFUbtEzBfUUINHpOxLiO2Lk5yu5K1C7IQ==", - "requires": { - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "node_modules/pinia/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/credential-provider-imds": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.215.0.tgz", - "integrity": "sha512-/4FUUR6u9gkNfxB6mEwBr0kk0myIkrDcXbAocWN3fPd/t7otzxpx/JqPZXgM6kcVP7M4T/QT75l1E1RRHLWCCQ==", - "requires": { - "@aws-sdk/node-config-provider": "3.215.0", - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/url-parser": "3.215.0", - "tslib": "^2.3.1" + "engines": { + "node": ">=12" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/credential-provider-ini": { - "version": "3.216.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.216.0.tgz", - "integrity": "sha512-tSfrhgRO/l83Ou6WSOE4HauTLbDCOLMo/23Q6oGO8cs/d874J5rE4UM7a9OzE3QdM3eVbdAP7kXUgUS6i71cUw==", - "requires": { - "@aws-sdk/credential-provider-env": "3.215.0", - "@aws-sdk/credential-provider-imds": "3.215.0", - "@aws-sdk/credential-provider-sso": "3.216.0", - "@aws-sdk/credential-provider-web-identity": "3.215.0", - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/shared-ini-file-loader": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "funding": { + "url": "https://github.com/sponsors/antfu" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/credential-provider-node": { - "version": "3.216.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.216.0.tgz", - "integrity": "sha512-Tumt53phB454DTkNB7a1tyCfrkA4JUGHzNLya14VLResGIGW5Re64atahUcO/WS7aTEs5vfAhBXO+p9o4K1rhQ==", - "requires": { - "@aws-sdk/credential-provider-env": "3.215.0", - "@aws-sdk/credential-provider-imds": "3.215.0", - "@aws-sdk/credential-provider-ini": "3.216.0", - "@aws-sdk/credential-provider-process": "3.215.0", - "@aws-sdk/credential-provider-sso": "3.216.0", - "@aws-sdk/credential-provider-web-identity": "3.215.0", - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/shared-ini-file-loader": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true } } }, - "@aws-sdk/credential-provider-process": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.215.0.tgz", - "integrity": "sha512-JNvj4L5B7W8byoFdfn/8Y4scoPiwCi+Ha/fRsFCrdSC7C+snDuxM/oQj33HI8DpKY1cjuigzEnpnxiNWaA09EA==", - "requires": { - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/shared-ini-file-loader": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + "node_modules/postcss": { + "version": "8.4.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", + "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" } - } - }, - "@aws-sdk/credential-provider-sso": { - "version": "3.216.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.216.0.tgz", - "integrity": "sha512-1Cag6AUPU4wkeMnZDJvcXXJgwrlrIxbTcRsresJYBFvs1vGJGcTbjtWV0K6fiBRP66GtvuOL9WzQ/eqRf2J7Ag==", - "requires": { - "@aws-sdk/client-sso": "3.216.0", - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/shared-ini-file-loader": "3.215.0", - "@aws-sdk/token-providers": "3.216.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, + ], "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/credential-provider-web-identity": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.215.0.tgz", - "integrity": "sha512-AWaDDEE3VU1HeLrXvyUrkQ6Wb3PQij5bvvrMil9L0da3b1yrcpoDanQQy7wBFBXcZIVmcmSFe5MMA/nyh2Le4g==", - "requires": { - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "engines": { + "node": "^10 || ^12 || >=14" } }, - "@aws-sdk/eventstream-codec": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-codec/-/eventstream-codec-3.215.0.tgz", - "integrity": "sha512-Uwgkq6ViQnfd1l+qhWPGdzxh+YhD1N6RYL0kEcp1ovsR+rC/0qUsM9VZrSckZn4jB+0ATqIoOXtcUYP4+xrNmg==", - "requires": { - "@aws-crypto/crc32": "2.0.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-hex-encoding": "3.201.0", - "tslib": "^2.3.1" - }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/eventstream-serde-browser": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.215.0.tgz", - "integrity": "sha512-VfTl69/C/cOjm47blgvdBz2pw8//6qkLPvQetfDOgf40JvsjBp9afUDNiKV08ulzoUeVZBosgHs09oZ2VDj09Q==", - "requires": { - "@aws-sdk/eventstream-serde-universal": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "engines": { + "node": ">=4" } }, - "@aws-sdk/eventstream-serde-config-resolver": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.215.0.tgz", - "integrity": "sha512-NrVb8HA0tUsruAj8yVWTaRIfcAB9lsajzksCqS7W917x/esoIRwoeF2zua63Ivro7hLeCjzS2Mws5IhvSl+/tQ==", - "requires": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "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" } }, - "@aws-sdk/eventstream-serde-node": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.215.0.tgz", - "integrity": "sha512-DxABFUIpmFV1NOfwF8FtX+l7kzmMTTJf2BfXvGoYemmBtv9Cc31Qg83ouD8xuNSx9qlbFOgpWaNpzEZ400porA==", - "requires": { - "@aws-sdk/eventstream-serde-universal": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "node_modules/prettier": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/eventstream-serde-universal": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.215.0.tgz", - "integrity": "sha512-8DmY3vVZtXAKzW0wOSC0bN+WF8qNZKaCqe5JCM3WwS1Wu6F6qI7b064VSe5b3d9BbJzeMccOcJeCg3ZU/3nYUQ==", - "requires": { - "@aws-sdk/eventstream-codec": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "engines": { + "node": ">=14" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "@aws-sdk/fetch-http-handler": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.215.0.tgz", - "integrity": "sha512-JfZyrJOE+0ik1PumsIUZd0NfgEx4sZ43VSdPCD9GRhssRWudNsSF1B5fz3xA5v+1y5oQPjXZyaWCzKtnYruiWw==", - "requires": { - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/querystring-builder": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-base64": "3.208.0", - "tslib": "^2.3.1" - }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/hash-blob-browser": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.215.0.tgz", - "integrity": "sha512-plHPFOSEHig0g/ou1H4QW31AyPGzwR0qgUKIEUFf3lWIfBI3BnvA4t24cJ87I204oqENj/+ZSNAj5qeAZfMFXw==", - "requires": { - "@aws-sdk/chunked-blob-reader": "3.188.0", - "@aws-sdk/chunked-blob-reader-native": "3.208.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "fast-diff": "^1.1.2" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "engines": { + "node": ">=6.0.0" } }, - "@aws-sdk/hash-node": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.215.0.tgz", - "integrity": "sha512-MkSRuZvo1RCRmI0VNEmRYCGGD/DkMd9lqnLtOyglMPnSX1mhyD4/DyXmcc3rYa7PsjDRAfykGWJRiMqpoMLjiQ==", - "requires": { - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-buffer-from": "3.208.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true }, - "@aws-sdk/hash-stream-node": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-stream-node/-/hash-stream-node-3.215.0.tgz", - "integrity": "sha512-1VEpiXu0jH7bSRYfEeSrznYq41zpUV4TtStoBXdcEVaOqT4LNQ5k1g1602544UWKUJ7D+E9NCNXpjM6TSMmG4A==", - "requires": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" } }, - "@aws-sdk/invalid-dependency": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.215.0.tgz", - "integrity": "sha512-++bK4BUQe8/CL/YcLZcQB8qPOhiXxhbuhYzfFS7PNVvW1QOLqKRZL/lKs24gzjcOmw7IhAbCybDZwvu2TM4DAg==", - "requires": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + "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" } - } + ] }, - "@aws-sdk/is-array-buffer": { - "version": "3.201.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", - "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", - "requires": { - "tslib": "^2.3.1" - }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/lib-storage": { - "version": "3.216.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.216.0.tgz", - "integrity": "sha512-mRNT3V6/wtpNuWD81TAG6SrM3cj3x3gqJAMRaF5dHJ7qfCeys0U2hIsNmHU0wIJWpfisVaFztfT4MmYh0lLOyA==", - "requires": { - "@aws-sdk/middleware-endpoint": "3.215.0", - "@aws-sdk/smithy-client": "3.215.0", - "buffer": "5.6.0", - "events": "3.3.0", - "stream-browserify": "3.0.0", - "tslib": "^2.3.1" + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - } + "engines": { + "node": ">=4" } }, - "@aws-sdk/md5-js": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/md5-js/-/md5-js-3.215.0.tgz", - "integrity": "sha512-2f5r2raNDG9USKHKRgAW2r1MzCrkemLASlDXASgAuAD3gYGURVi4ZDhI3I1GECY5dPEgGC+3B2rkEb9MfQAaEg==", - "requires": { - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-utf8-browser": "3.188.0", - "@aws-sdk/util-utf8-node": "3.208.0", - "tslib": "^2.3.1" - }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/middleware-bucket-endpoint": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.215.0.tgz", - "integrity": "sha512-zMeYrnHX8S9VFDPH3fryXdPXW1DWeX9URKAkU1oxZLGpBX91CsWzUDjaMhbkDgvwO2oeKgjnZ2vCwcNNKP266w==", - "requires": { - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-arn-parser": "3.208.0", - "@aws-sdk/util-config-provider": "3.208.0", - "tslib": "^2.3.1" + "pify": "^3.0.0" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "engines": { + "node": ">=4" } }, - "@aws-sdk/middleware-content-length": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.215.0.tgz", - "integrity": "sha512-zKJRb6jDLFl9nl/muSFbiQHA4uK3skinuDRcyLbpMvvzhuK/PVodv9QI1+wIUsFdXkaSxAlva1oG4bL8ZFi+sQ==", - "requires": { - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "@aws-sdk/middleware-endpoint": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.215.0.tgz", - "integrity": "sha512-W0QXL5emcN9IXtMbnWT/abLxBFH2tGIfnre2jPNmZ9M7uVFxUwwv5OTUXxNLGNehJHKhiJPwhfQvMy20IDzVcw==", - "requires": { - "@aws-sdk/middleware-serde": "3.215.0", - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/signature-v4": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/url-parser": "3.215.0", - "@aws-sdk/util-config-provider": "3.208.0", - "@aws-sdk/util-middleware": "3.215.0", - "tslib": "^2.3.1" - }, + "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": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" } }, - "@aws-sdk/middleware-expect-continue": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.215.0.tgz", - "integrity": "sha512-X2G7MnBSYPPmLqqd9xDGl2ik9dUsGYcYzulf2Z1HVEGJO6btZJtPfC+IIwuJjsiCWCgbypM1X/oOSxdrmRkUNQ==", - "requires": { - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@aws-sdk/middleware-flexible-checksums": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.215.0.tgz", - "integrity": "sha512-fAFcR+QsrGPCgYssdTYmayoCXDKYzlv0a14jaJtZsacXQNGefXly9D856lri+yG2jxqQ6Sa0FzU4Pm7s3j4mvg==", - "requires": { - "@aws-crypto/crc32": "2.0.0", - "@aws-crypto/crc32c": "2.0.0", - "@aws-sdk/is-array-buffer": "3.201.0", - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" } }, - "@aws-sdk/middleware-host-header": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.215.0.tgz", - "integrity": "sha512-GOqI7VwoENZwn+6tIMrrJ4SipIqL2JCh+BNvORVcy7CQxn1ViKkna7iaCx+QMjpg/kn9cR6kfY0n1FmgZR1w9A==", - "requires": { - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, + "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": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "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" } }, - "@aws-sdk/middleware-location-constraint": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.215.0.tgz", - "integrity": "sha512-taDOIGv2rsAyDEJxSm/nhKS4nsBPUKKCvIpK26E7uGshQZFLtTLTJMp8zGb1IBfUSxRngdWljRmOS5AJUexNbQ==", - "requires": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "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" } }, - "@aws-sdk/middleware-logger": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.215.0.tgz", - "integrity": "sha512-0h4GGF0rV3jnY3jxmcAWsOdqHCYf25s0biSjmgTei+l/5S+geOGrovRPCNep0LLg0i9D8bkZsXISojilETbf+g==", - "requires": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "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" } }, - "@aws-sdk/middleware-recursion-detection": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.215.0.tgz", - "integrity": "sha512-KQ+kiEsaluM4i6opjusUukxY78+UhfR7vzXHDkzZK/GplQ1hY0B+rwVO1eaULmlnmf3FK+Wd6lwrPV7xS2W+EA==", - "requires": { - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, + "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": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "@aws-sdk/middleware-retry": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.215.0.tgz", - "integrity": "sha512-I/dnUPVg2Kp3lW+MywBoPp06EOng8IfuaS9ph4bcJpQKrhNU5ekRgCHH2C4k1A6GcP8uyHxQ5TVV6j+l0QPIsA==", - "requires": { - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/service-error-classification": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-middleware": "3.215.0", - "tslib": "^2.3.1", - "uuid": "^8.3.2" + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "@aws-sdk/middleware-sdk-s3": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.215.0.tgz", - "integrity": "sha512-+SM+xCIFNSFIKM9KyvgIu4Ah5Z/SbHS8mDkinHkY8X/iUryrsKKBs7xnpMAaJCTFkK/8gO6Lhdda1nbvGozhdA==", - "requires": { - "@aws-sdk/middleware-bucket-endpoint": "3.215.0", - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-arn-parser": "3.208.0", - "tslib": "^2.3.1" - }, + "node_modules/rollup-plugin-inject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", + "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", + "dev": true, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "estree-walker": "^0.6.1", + "magic-string": "^0.25.3", + "rollup-pluginutils": "^2.8.1" } }, - "@aws-sdk/middleware-sdk-sts": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.215.0.tgz", - "integrity": "sha512-wJRxoDf+2egbRgochaQL8+zzADx8FM/2W0spKNj8x+t/3iqw70QwxCfuEKW/uFQ3ph6eaIrv7gYc8RRjwhD8rg==", - "requires": { - "@aws-sdk/middleware-signing": "3.215.0", - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/signature-v4": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, + "node_modules/rollup-plugin-node-polyfills": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", + "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "rollup-plugin-inject": "^3.0.0" } }, - "@aws-sdk/middleware-serde": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.215.0.tgz", - "integrity": "sha512-+uhLXdKvvQZcRRFc3UmemSr/YUHA4Jc+1YMjHxc3v8vvfztFJBb0wgBx999myOi8PmkYThlRBQDzXy9UCIhIJw==", - "requires": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "estree-walker": "^0.6.1" } }, - "@aws-sdk/middleware-signing": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.215.0.tgz", - "integrity": "sha512-3BqzYqkmdPeOxjI8DVQE7Bm7J5QIvDy30abglXqrDg6npw6KonKI2Q3FIPFf+oLpZTMStwkoQOnwXHTPrSZ6Tg==", - "requires": { - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/signature-v4": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-middleware": "3.215.0", - "tslib": "^2.3.1" - }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@aws-sdk/middleware-ssec": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.215.0.tgz", - "integrity": "sha512-iIiB2fGneR8iZN2tgQoACq1jQlG50zU49cus/jAAKjy6B7QeKXy5Ld8/+eNnzcjLuBzzeLtER2YWwFLWqUOZpw==", - "requires": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, + "node_modules/run-applescript/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "@aws-sdk/middleware-stack": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.215.0.tgz", - "integrity": "sha512-rdSVL7LxRgjlvoluqwODD4ypBy2k/YVl6FrDplyCMSi8m2WHZG99FzdmR9bpnWK+0DGzYZSMRYx6ynJ9N9PsSw==", - "requires": { - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "node_modules/run-applescript/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" } }, - "@aws-sdk/middleware-user-agent": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.215.0.tgz", - "integrity": "sha512-X6GfoMNoEITTw7rGL/gWs8UZ0cmmmezvKcl+KtHsA642R05OR4mY5G7LdbWAw0bcrwKsuKOGmwUrC9lzGqbWUw==", - "requires": { - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "node_modules/run-applescript/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@aws-sdk/node-config-provider": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.215.0.tgz", - "integrity": "sha512-notckD94QwwxC0GsfpTxB7VH8SREIIlMsUSddqGtpModa0cq/wRb9rqnydZSoznbYpK1ND6h0C9hr/2PNz89zw==", - "requires": { - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/shared-ini-file-loader": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "node_modules/run-applescript/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" } }, - "@aws-sdk/node-http-handler": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.215.0.tgz", - "integrity": "sha512-btKWSR7m0UuWIN3p5MfSIvhqeYik7xri7U6nWuVI5GVzIYjzxEZOMvPAinDLDxL5wipodi0ZvTUNdDJdm7BcGQ==", - "requires": { - "@aws-sdk/abort-controller": "3.215.0", - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/querystring-builder": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, + "node_modules/run-applescript/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "@aws-sdk/property-provider": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.215.0.tgz", - "integrity": "sha512-dDPjMCCopkRURAmOJCMSlpIQ5BGWCpYj0+FIfZ5qWQs24fn1PAkQHecOiBhJO0ZSVuQy3xcIyWsAp1NE5e+7ug==", - "requires": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, + "node_modules/run-applescript/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@aws-sdk/protocol-http": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.215.0.tgz", - "integrity": "sha512-qp6Y6v4S534LAjadiVl9p7ErK7ImphOKq6yhFyQwxko6iITLcz8ib3yU27fs4QJcnNj5ZooqW/YlL/0EikDxCQ==", - "requires": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/querystring-builder": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.215.0.tgz", - "integrity": "sha512-eilk8CqG37BVhQklLif00K2dOJgDzacUi8h3KVQ72ry1V3h345i4HsmaFIxvnz8XtNyDvV8qFAzeYg9n2P9RQA==", - "requires": { - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-uri-escape": "3.201.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "node_modules/run-applescript/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" } }, - "@aws-sdk/querystring-parser": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.215.0.tgz", - "integrity": "sha512-8h/9H8dWM4fZO27UGzo8W5JXln4yJMugPyUl4qFA437gzPgNFN95+oLJWXtHMlfCHC5T/PDKetY9TarMDgBD0Q==", - "requires": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + "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" } - } - }, - "@aws-sdk/s3-request-presigner": { - "version": "3.216.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.216.0.tgz", - "integrity": "sha512-JK7W/F3yFh0Bm585mBBTqYdkGPDelDT8OO6vv/NwzjxHkqfN3MTc1/sGPWd0XqJ4EHnscck+rq4jYHyYcem7mQ==", - "requires": { - "@aws-sdk/middleware-endpoint": "3.215.0", - "@aws-sdk/middleware-sdk-s3": "3.215.0", - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/signature-v4-multi-region": "3.215.0", - "@aws-sdk/smithy-client": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-create-request": "3.215.0", - "@aws-sdk/util-format-url": "3.215.0", - "tslib": "^2.3.1" - }, + ], "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - } + "queue-microtask": "^1.2.2" } }, - "@aws-sdk/service-error-classification": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.215.0.tgz", - "integrity": "sha512-SKBvClGFGzMPsjBBKjneaUazLCNr6bSxe9eFvOr3gCwuwE2jPQwW3VE1mb62howuvm6cLthEDwLQp/FsT1gMsw==" - }, - "@aws-sdk/shared-ini-file-loader": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.215.0.tgz", - "integrity": "sha512-unzQeLOyUiYHr8WxxandHo0OaCj31gx0wpt8dn2cZcHm/MdCqHcHcsQqOVnQsWQrrxY/XZ27cPyMVQeicNKYwQ==", - "requires": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/signature-v4": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.215.0.tgz", - "integrity": "sha512-Rc73uUCi3eJneO25DydLTfJYamXeuKS9YIhNMTKlpvcN1UQAmAnUbAmCuEmqvkYOiGD1i4/kd8kBga708iIikQ==", - "requires": { - "@aws-sdk/is-array-buffer": "3.201.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-hex-encoding": "3.201.0", - "@aws-sdk/util-middleware": "3.215.0", - "@aws-sdk/util-uri-escape": "3.201.0", - "tslib": "^2.3.1" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/signature-v4-multi-region": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.215.0.tgz", - "integrity": "sha512-XOUUNWs6I4vAa+Byj6qL/+DCWA5CjcRyA9sitYy8sNqhLcet8WoYf7vJL2LW1nvdzRb/pGBNWLiQOZ+9sadYeg==", - "requires": { - "@aws-sdk/protocol-http": "3.215.0", - "@aws-sdk/signature-v4": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-arn-parser": "3.208.0", - "tslib": "^2.3.1" + "engines": { + "node": ">=0.4" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@aws-sdk/smithy-client": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.215.0.tgz", - "integrity": "sha512-PiZfCdZkPohzMPrRmJ46TPOf2Tr/dhKYdwQArRnOOIsJABUGXjlzCUE8vysDN35XZYRx5f9hd+/U7kayhniq2w==", - "requires": { - "@aws-sdk/middleware-stack": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } - } + ] }, - "@aws-sdk/token-providers": { - "version": "3.216.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.216.0.tgz", - "integrity": "sha512-cEmOfG7njWl0OA5lR65Sp2SW1i8ZLjf7C95TZ1e6t2Oo5aUFeN3aKBxMOV//1yc+BNzcFBnoHP/f29GhWxUOxA==", - "requires": { - "@aws-sdk/client-sso-oidc": "3.216.0", - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/shared-ini-file-loader": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/types": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.215.0.tgz", - "integrity": "sha512-eRbCVjwzTYd9C5e2mceScJ6D2kYDDEC3PLkYfJa+1wH9iiF2JlbiYozAokyeYBHQ+AjmD93MK58RBoM8iZfH0Q==" - }, - "@aws-sdk/url-parser": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.215.0.tgz", - "integrity": "sha512-r/qIk3TUlV36JvoRjTErFm0LzzgNKLB1YUG8zVZCGAc2TEATi8OVEmsZvi+KfTmsbszulITJVcjZKbHLbGoUzg==", - "requires": { - "@aws-sdk/querystring-parser": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@aws-sdk/util-arn-parser": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.208.0.tgz", - "integrity": "sha512-QV4af+kscova9dv4VuHOgH8wEr/IIYHDGcnyVtkUEqahCejWr1Kuk+SBK0xMwnZY5LSycOtQ8aeqHOn9qOjZtA==", - "requires": { - "tslib": "^2.3.1" - }, + "node_modules/sass": { + "version": "1.66.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.66.1.tgz", + "integrity": "sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/util-base64": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz", - "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==", - "requires": { - "@aws-sdk/util-buffer-from": "3.208.0", - "tslib": "^2.3.1" + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/util-body-length-browser": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", - "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", - "requires": { - "tslib": "^2.3.1" + "bin": { + "sass": "sass.js" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/util-body-length-node": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz", - "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==", - "requires": { - "tslib": "^2.3.1" - }, + "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==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/util-buffer-from": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", - "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", - "requires": { - "@aws-sdk/is-array-buffer": "3.201.0", - "tslib": "^2.3.1" + "lru-cache": "^6.0.0" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/util-config-provider": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", - "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==", - "requires": { - "tslib": "^2.3.1" + "bin": { + "semver": "bin/semver.js" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "engines": { + "node": ">=10" } }, - "@aws-sdk/util-create-request": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-create-request/-/util-create-request-3.215.0.tgz", - "integrity": "sha512-V+f6YYSUHGNWVLQpdTgpbCPgnkXmHtC9uEk/rQjzJAvzAZmqYuPc2hheBSAt7gN6yzLoMeDBmjhZMh79fFZ3UQ==", - "requires": { - "@aws-sdk/middleware-stack": "3.215.0", - "@aws-sdk/smithy-client": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/util-defaults-mode-browser": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.215.0.tgz", - "integrity": "sha512-MiNfZgB0I4dR8CBxH163W7c9KvE38sgCHNPWopMqSX5ezz7cuCPohCU0XsWd4I7K31PvzuqmKgOiKBAZraQJMA==", - "requires": { - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/types": "3.215.0", - "bowser": "^2.11.0", - "tslib": "^2.3.1" + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "engines": { + "node": ">= 0.4" } }, - "@aws-sdk/util-defaults-mode-node": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.215.0.tgz", - "integrity": "sha512-mSp3R8GljQ+4UT3QMOksQk9L0cWbFLvR7bBmAlt4+GobgTjpRfzFjBP3uwrCqFa3BKDUR3FeJq3qwo+xeY1Krg==", - "requires": { - "@aws-sdk/config-resolver": "3.215.0", - "@aws-sdk/credential-provider-imds": "3.215.0", - "@aws-sdk/node-config-provider": "3.215.0", - "@aws-sdk/property-provider": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/util-endpoints": { - "version": "3.216.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.216.0.tgz", - "integrity": "sha512-uHje4H6Qj/z/op8UZoSuvGpEZhz/r+AGY0rCihFo7XjhT4RYVxb2Eb9uHRK/IAeHU4kjHAdpQiWGMSmnT/UacA==", - "requires": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "engines": { + "node": ">= 0.4" } }, - "@aws-sdk/util-format-url": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.215.0.tgz", - "integrity": "sha512-j8X2pIwpSxtS23Za6t36pQjeVe5ouunoMuOj4wdj2uB3Cbf2vvd84J5lF8bUHQA35f5PRqdYtU1KyolQudCXsA==", - "requires": { - "@aws-sdk/querystring-builder": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, + "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": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/util-hex-encoding": { - "version": "3.201.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", - "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", - "requires": { - "tslib": "^2.3.1" + "shebang-regex": "^3.0.0" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "engines": { + "node": ">=8" } }, - "@aws-sdk/util-locate-window": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.55.0.tgz", - "integrity": "sha512-0sPmK2JaJE2BbTcnvybzob/VrFKCXKfN4CUKcvn0yGg/me7Bz+vtzQRB3Xp+YSx+7OtWxzv63wsvHoAnXvgxgg==", - "requires": { - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - } + "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" } }, - "@aws-sdk/util-middleware": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.215.0.tgz", - "integrity": "sha512-DfHGlFlQCr+T/xhjS36HH8JEThDVB5lg5NZ6x4Cibhyeps9YX/4ovLAIx3B19H34sdWhZi7q6LfslCHLRu2+7Q==", - "requires": { - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@aws-sdk/util-stream-browser": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-browser/-/util-stream-browser-3.215.0.tgz", - "integrity": "sha512-UVyCJJ5sCYLVHCW4Lpm8+ae+ISHPHZ/OqAoLbUpehk2RLGP6QhpQOrpJADLXPuB8YuWFMkoLLIVL8VE7mmTPWA==", - "requires": { - "@aws-sdk/fetch-http-handler": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-hex-encoding": "3.201.0", - "@aws-sdk/util-utf8-browser": "3.188.0", - "tslib": "^2.3.1" - }, + "node_modules/showdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/showdown/-/showdown-2.1.0.tgz", + "integrity": "sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/util-stream-node": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-node/-/util-stream-node-3.215.0.tgz", - "integrity": "sha512-7Vyp61P/2dGA9Fzn6uN/KdRd+Z7n8gCGmXBd/dQSrHx3UFIm1TuEmMwROzbWWxPOS6qDWY/dwQgMZH/tq78Llg==", - "requires": { - "@aws-sdk/node-http-handler": "3.215.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-buffer-from": "3.208.0", - "tslib": "^2.3.1" + "commander": "^9.0.0" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/util-uri-escape": { - "version": "3.201.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", - "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", - "requires": { - "tslib": "^2.3.1" + "bin": { + "showdown": "bin/showdown.js" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "funding": { + "type": "individual", + "url": "https://www.paypal.me/tiviesantos" } }, - "@aws-sdk/util-user-agent-browser": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.215.0.tgz", - "integrity": "sha512-uZz6BJWr8sJcA+onveS1lFqnbIXBHwvkyHLgCuuGhAxd5yY6YNLhpJBnhy9Fb8/aSbk6yao3qxlokqw9gthmAw==", - "requires": { - "@aws-sdk/types": "3.215.0", - "bowser": "^2.11.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "node_modules/showdown/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "engines": { + "node": "^12.20.0 || >=14" } }, - "@aws-sdk/util-user-agent-node": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.215.0.tgz", - "integrity": "sha512-4lrdd1oGRwJEwfvgvg1jcJ2O0bwElsvtiqZfTRHN6MNTFUqsKl0xHlgFChQsz3Hfrc1niWtZCmbqQKGdO5ARpw==", - "requires": { - "@aws-sdk/node-config-provider": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@aws-sdk/util-utf8-browser": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz", - "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==", - "requires": { - "tslib": "^2.3.1" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@aws-sdk/util-utf8-node": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.208.0.tgz", - "integrity": "sha512-jKY87Acv0yWBdFxx6bveagy5FYjz+dtV8IPT7ay1E2WPWH1czoIdMAkc8tSInK31T6CRnHWkLZ1qYwCbgRfERQ==", - "requires": { - "@aws-sdk/util-buffer-from": "3.208.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, - "@aws-sdk/util-waiter": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.215.0.tgz", - "integrity": "sha512-RX/EkRcuDjWKP/5K6XOnbq5cPaO9KSJ5Etotn+z5sPGUJ0xmGWEyFyfXKSL51az32tHcNoGAqboBTFDISB0LyA==", - "requires": { - "@aws-sdk/abort-controller": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" } }, - "@aws-sdk/xml-builder": { - "version": "3.201.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.201.0.tgz", - "integrity": "sha512-brRdB1wwMgjWEnOQsv7zSUhIQuh7DEicrfslAqHop4S4FtSI3GQAShpQqgOpMTNFYcpaWKmE/Y1MJmNY7xLCnw==", - "requires": { - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@babel/parser": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", - "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==" - }, - "@esbuild-plugins/node-globals-polyfill": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.1.1.tgz", - "integrity": "sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==", - "dev": true, - "requires": {} - }, - "@esbuild-plugins/node-modules-polyfill": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.1.4.tgz", - "integrity": "sha512-uZbcXi0zbmKC/050p3gJnne5Qdzw8vkXIv+c2BW0Lsc1ji1SkrxbKPUy5Efr0blbTu1SL8w4eyfpnSdPg3G0Qg==", - "dev": true, - "requires": { - "escape-string-regexp": "^4.0.0", - "rollup-plugin-node-polyfills": "^0.2.1" - } - }, - "@esbuild/android-arm": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.10.tgz", - "integrity": "sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz", - "integrity": "sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==", - "dev": true, - "optional": true - }, - "@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.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": ">=0.10.0" } }, - "@humanwhocodes/config-array": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", - "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" + "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" } }, - "@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 - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", "dev": true }, - "@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==", + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "@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==", + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, - "@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==", + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "@popperjs/core": { - "version": "2.11.6", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", - "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" - }, - "@rushstack/eslint-patch": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz", - "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==", + "node_modules/spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", "dev": true }, - "@types/bootstrap": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.2.6.tgz", - "integrity": "sha512-BlAc3YATdasbHoxMoBWODrSF6qwQO/E9X8wVxCCSa6rWjnaZfpkr2N6pUMCY6jj2+wf0muUtLySbvU9etX6YqA==", - "dev": true, - "requires": { - "@popperjs/core": "^2.9.2" + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" } }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/node": { - "version": "16.11.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.45.tgz", - "integrity": "sha512-3rKg/L5x0rofKuuUt5zlXzOnKyIHXmIu5R8A0TuNDMF2062/AOIDBciFIjToLEJ/9F9DzkHNot+BpNsMI1OLdQ==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.30.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.7.tgz", - "integrity": "sha512-l4L6Do+tfeM2OK0GJsU7TUcM/1oN/N25xHm3Jb4z3OiDU4Lj8dIuxX9LpVMS9riSXQs42D1ieX7b85/r16H9Fw==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.30.7", - "@typescript-eslint/type-utils": "5.30.7", - "@typescript-eslint/utils": "5.30.7", - "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" } }, - "@typescript-eslint/parser": { - "version": "5.30.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.30.7.tgz", - "integrity": "sha512-Rg5xwznHWWSy7v2o0cdho6n+xLhK2gntImp0rJroVVFkcYFYQ8C8UJTSuTw/3CnExBmPjycjmUJkxVmjXsld6A==", + "node_modules/string.prototype.padend": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.5.tgz", + "integrity": "sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==", "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.30.7", - "@typescript-eslint/types": "5.30.7", - "@typescript-eslint/typescript-estree": "5.30.7", - "debug": "^4.3.4" + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@typescript-eslint/scope-manager": { - "version": "5.30.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.30.7.tgz", - "integrity": "sha512-7BM1bwvdF1UUvt+b9smhqdc/eniOnCKxQT/kj3oXtj3LqnTWCAM0qHRHfyzCzhEfWX0zrW7KqXXeE4DlchZBKw==", + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, - "requires": { - "@typescript-eslint/types": "5.30.7", - "@typescript-eslint/visitor-keys": "5.30.7" + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@typescript-eslint/type-utils": { - "version": "5.30.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.30.7.tgz", - "integrity": "sha512-nD5qAE2aJX/YLyKMvOU5jvJyku4QN5XBVsoTynFrjQZaDgDV6i7QHFiYCx10wvn7hFvfuqIRNBtsgaLe0DbWhw==", + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, - "requires": { - "@typescript-eslint/utils": "5.30.7", - "debug": "^4.3.4", - "tsutils": "^3.21.0" + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@typescript-eslint/types": { - "version": "5.30.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.7.tgz", - "integrity": "sha512-ocVkETUs82+U+HowkovV6uxf1AnVRKCmDRNUBUUo46/5SQv1owC/EBFkiu4MOHeZqhKz2ktZ3kvJJ1uFqQ8QPg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.30.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.7.tgz", - "integrity": "sha512-tNslqXI1ZdmXXrHER83TJ8OTYl4epUzJC0aj2i4DMDT4iU+UqLT3EJeGQvJ17BMbm31x5scSwo3hPM0nqQ1AEA==", + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, - "requires": { - "@typescript-eslint/types": "5.30.7", - "@typescript-eslint/visitor-keys": "5.30.7", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@typescript-eslint/utils": { - "version": "5.30.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.30.7.tgz", - "integrity": "sha512-Z3pHdbFw+ftZiGUnm1GZhkJgVqsDL5CYW2yj+TB2mfXDFOMqtbzQi2dNJIyPqPbx9mv2kUxS1gU+r2gKlKi1rQ==", + "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, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.30.7", - "@typescript-eslint/types": "5.30.7", - "@typescript-eslint/typescript-estree": "5.30.7", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "@typescript-eslint/visitor-keys": { - "version": "5.30.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.7.tgz", - "integrity": "sha512-KrRXf8nnjvcpxDFOKej4xkD7657+PClJs5cJVSG7NNoCNnjEdc46juNAQt7AyuWctuCgs6mVRc1xGctEqrjxWw==", + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "requires": { - "@typescript-eslint/types": "5.30.7", - "eslint-visitor-keys": "^3.3.0" + "engines": { + "node": ">=4" } }, - "@vitejs/plugin-vue": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz", - "integrity": "sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==", - "dev": true, - "requires": {} - }, - "@volar/language-core": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.0.9.tgz", - "integrity": "sha512-5Fty3slLet6svXiJw2YxhYeo6c7wFdtILrql5bZymYLM+HbiZtJbryW1YnUEKAP7MO9Mbeh+TNH4Z0HFxHgIqw==", + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, - "requires": { - "@volar/source-map": "1.0.9", - "@vue/reactivity": "^3.2.40", - "muggle-string": "^0.1.0" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@volar/source-map": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.0.9.tgz", - "integrity": "sha512-fazB/vy5ZEJ3yKx4fabJyGNI3CBkdLkfEIRVu6+1P3VixK0Mn+eqyUIkLBrzGYaeFM3GybhCLCvsVdNz0Fu/CQ==", + "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, - "requires": { - "muggle-string": "^0.1.0" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@volar/typescript": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.0.9.tgz", - "integrity": "sha512-dVziu+ShQUWuMukM6bvK2v2O446/gG6l1XkTh2vfkccw1IzjfbiP1TWQoNo1ipTfZOtu5YJGYAx+o5HNrGXWfQ==", - "dev": true, - "requires": { - "@volar/language-core": "1.0.9" - } + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" }, - "@volar/vue-language-core": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@volar/vue-language-core/-/vue-language-core-1.0.9.tgz", - "integrity": "sha512-tofNoR8ShPFenHT1YVMuvoXtXWwoQE+fiXVqSmW0dSKZqEDjWQ3YeXSd0a6aqyKaIbvR7kWWGp34WbpQlwf9Ww==", + "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, - "requires": { - "@volar/language-core": "1.0.9", - "@volar/source-map": "1.0.9", - "@vue/compiler-dom": "^3.2.40", - "@vue/compiler-sfc": "^3.2.40", - "@vue/reactivity": "^3.2.40", - "@vue/shared": "^3.2.40", - "minimatch": "^5.1.0", - "vue-template-compiler": "^2.7.10" - }, "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@volar/vue-typescript": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-1.0.9.tgz", - "integrity": "sha512-ZLe4y9YNbviACa7uAMCilzxA76gbbSlKfjspXBzk6fCobd8QCIig+VyDYcjANIlm2HhgSCX8jYTzhCKlegh4mw==", + "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, - "requires": { - "@volar/typescript": "1.0.9", - "@volar/vue-language-core": "1.0.9" - } - }, - "@vue/compiler-core": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz", - "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==", - "requires": { - "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.45", - "estree-walker": "^2.0.2", - "source-map": "^0.6.1" - } - }, - "@vue/compiler-dom": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz", - "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==", - "requires": { - "@vue/compiler-core": "3.2.45", - "@vue/shared": "3.2.45" - } - }, - "@vue/compiler-sfc": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz", - "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==", - "requires": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.45", - "@vue/compiler-dom": "3.2.45", - "@vue/compiler-ssr": "3.2.45", - "@vue/reactivity-transform": "3.2.45", - "@vue/shared": "3.2.45", - "estree-walker": "^2.0.2", - "magic-string": "^0.25.7", - "postcss": "^8.1.10", - "source-map": "^0.6.1" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@vue/compiler-ssr": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz", - "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==", - "requires": { - "@vue/compiler-dom": "3.2.45", - "@vue/shared": "3.2.45" + "node_modules/synckit": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.6.tgz", + "integrity": "sha512-laHF2savN6sMeHCjLRkheIU4wo3Zg9Ln5YOjOo7sZ5dVQW8yF5pPE5SIw1dsPhq3TRp1jisKRCdPhfs/1WMqDA==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.4.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" } }, - "@vue/devtools-api": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.4.5.tgz", - "integrity": "sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==" + "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 }, - "@vue/eslint-config-prettier": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-7.0.0.tgz", - "integrity": "sha512-/CTc6ML3Wta1tCe1gUeO0EYnVXfo3nJXsIhZ8WJr3sov+cGASr6yuiibJTL6lmIBm7GobopToOuB3B6AWyV0Iw==", + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", "dev": true, - "requires": { - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-prettier": "^4.0.0" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@vue/eslint-config-typescript": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-11.0.2.tgz", - "integrity": "sha512-EiKud1NqlWmSapBFkeSrE994qpKx7/27uCGnhdqzllYDpQZroyX/O6bwjEpeuyKamvLbsGdO6PMR2faIf+zFnw==", + "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, - "requires": { - "@typescript-eslint/eslint-plugin": "^5.0.0", - "@typescript-eslint/parser": "^5.0.0", - "vue-eslint-parser": "^9.0.0" - } - }, - "@vue/reactivity": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.45.tgz", - "integrity": "sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==", - "requires": { - "@vue/shared": "3.2.45" + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "@vue/reactivity-transform": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz", - "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==", - "requires": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.45", - "@vue/shared": "3.2.45", - "estree-walker": "^2.0.2", - "magic-string": "^0.25.7" - } + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "@vue/runtime-core": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.45.tgz", - "integrity": "sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==", - "requires": { - "@vue/reactivity": "3.2.45", - "@vue/shared": "3.2.45" - } - }, - "@vue/runtime-dom": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz", - "integrity": "sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==", - "requires": { - "@vue/runtime-core": "3.2.45", - "@vue/shared": "3.2.45", - "csstype": "^2.6.8" - } - }, - "@vue/server-renderer": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.45.tgz", - "integrity": "sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==", - "requires": { - "@vue/compiler-ssr": "3.2.45", - "@vue/shared": "3.2.45" - } - }, - "@vue/shared": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz", - "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==" - }, - "@vue/tsconfig": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.1.3.tgz", - "integrity": "sha512-kQVsh8yyWPvHpb8gIc9l/HIDiiVUy1amynLNpCy8p+FoCiZXCo6fQos5/097MmnNZc9AtseDsCrfkhqCrJ8Olg==", - "dev": true, - "requires": {} - }, - "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true - }, - "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, - "requires": {} - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "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 - }, - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "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 - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "axios": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.0.tgz", - "integrity": "sha512-zT7wZyNYu3N5Bu0wuZ6QccIf93Qk1eV8LOewxgjOZFd2DenOs98cJ7+Y6703d0wkaXGY6/nZd4EweJaHz9uzQw==", - "dev": true, - "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "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 - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "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 - }, - "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 - }, - "bootstrap": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz", - "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==", - "requires": {} - }, - "bootstrap-icons": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.10.2.tgz", - "integrity": "sha512-PTPYadRn1AMGr+QTSxe4ZCc+Wzv9DGZxbi3lNse/dajqV31n2/wl/7NX78ZpkvFgRNmH4ogdIQPQmxAfhEV6nA==" - }, - "bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" - }, - "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, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==", - "dev": true - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.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" - }, - "dependencies": { - "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, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz", - "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "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, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "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 - }, - "csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" - }, - "dayjs": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.6.tgz", - "integrity": "sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ==" - }, - "de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "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 - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "esbuild": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.10.tgz", - "integrity": "sha512-N7wBhfJ/E5fzn/SpNgX+oW2RLRjwaL8Y0ezqNqhjD6w0H2p0rDuEz2FKZqpqLnO8DCaWumKe8dsC/ljvVSSxng==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.15.10", - "@esbuild/linux-loong64": "0.15.10", - "esbuild-android-64": "0.15.10", - "esbuild-android-arm64": "0.15.10", - "esbuild-darwin-64": "0.15.10", - "esbuild-darwin-arm64": "0.15.10", - "esbuild-freebsd-64": "0.15.10", - "esbuild-freebsd-arm64": "0.15.10", - "esbuild-linux-32": "0.15.10", - "esbuild-linux-64": "0.15.10", - "esbuild-linux-arm": "0.15.10", - "esbuild-linux-arm64": "0.15.10", - "esbuild-linux-mips64le": "0.15.10", - "esbuild-linux-ppc64le": "0.15.10", - "esbuild-linux-riscv64": "0.15.10", - "esbuild-linux-s390x": "0.15.10", - "esbuild-netbsd-64": "0.15.10", - "esbuild-openbsd-64": "0.15.10", - "esbuild-sunos-64": "0.15.10", - "esbuild-windows-32": "0.15.10", - "esbuild-windows-64": "0.15.10", - "esbuild-windows-arm64": "0.15.10" - } - }, - "esbuild-android-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz", - "integrity": "sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==", - "dev": true, - "optional": true - }, - "esbuild-android-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz", - "integrity": "sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==", - "dev": true, - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz", - "integrity": "sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==", - "dev": true, - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz", - "integrity": "sha512-M1t5+Kj4IgSbYmunf2BB6EKLkWUq+XlqaFRiGOk8bmBapu9bCDrxjf4kUnWn59Dka3I27EiuHBKd1rSO4osLFQ==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz", - "integrity": "sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz", - "integrity": "sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==", - "dev": true, - "optional": true - }, - "esbuild-linux-32": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz", - "integrity": "sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==", - "dev": true, - "optional": true - }, - "esbuild-linux-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz", - "integrity": "sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz", - "integrity": "sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz", - "integrity": "sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==", - "dev": true, - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz", - "integrity": "sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==", - "dev": true, - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz", - "integrity": "sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-riscv64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz", - "integrity": "sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==", - "dev": true, - "optional": true - }, - "esbuild-linux-s390x": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz", - "integrity": "sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==", - "dev": true, - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz", - "integrity": "sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==", - "dev": true, - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz", - "integrity": "sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==", - "dev": true, - "optional": true - }, - "esbuild-sunos-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz", - "integrity": "sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==", - "dev": true, - "optional": true - }, - "esbuild-windows-32": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz", - "integrity": "sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==", - "dev": true, - "optional": true - }, - "esbuild-windows-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz", - "integrity": "sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==", - "dev": true, - "optional": true - }, - "esbuild-windows-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz", - "integrity": "sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==", - "dev": true, - "optional": true - }, - "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 - }, - "eslint": { - "version": "8.28.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.28.0.tgz", - "integrity": "sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "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.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "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.15.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "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.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "requires": {} - }, - "eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-plugin-vue": { - "version": "9.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.7.0.tgz", - "integrity": "sha512-DrOO3WZCZEwcLsnd3ohFwqCoipGRSTKTBTnLwdhqAbYZtzWl0o7D+D8ZhlmiZvABKTEl8AFsqH1GHGdybyoQmw==", - "dev": true, - "requires": { - "eslint-utils": "^3.0.0", - "natural-compare": "^1.4.0", - "nth-check": "^2.0.1", - "postcss-selector-parser": "^6.0.9", - "semver": "^7.3.5", - "vue-eslint-parser": "^9.0.1", - "xml-name-validator": "^4.0.0" - } - }, - "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, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "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 - } - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "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, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "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==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" - }, - "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 - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "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, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "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 - }, - "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 - }, - "fast-xml-parser": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", - "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", - "requires": { - "strnum": "^1.0.5" - } - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "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, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "filesize": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.0.5.tgz", - "integrity": "sha512-qrzyt8gLh86nsyYiC3ibI5KyIYRCWg2yqIklYrWF4a0qNfekik4OQfn7AoPJG2hRrPMSlH6fET4VEITweZAzjA==" - }, - "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, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "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, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", - "dev": true - }, - "follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", - "dev": true - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "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 - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "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" - } - }, - "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, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", - "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "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 - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", - "dev": true - }, - "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, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "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, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "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, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true - }, - "is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "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, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "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 - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "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 - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", - "dev": true - }, - "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, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==", - "dev": true, - "requires": { - "@apidevtools/json-schema-ref-parser": "9.0.9" - } - }, - "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 - }, - "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 - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "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, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "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, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "yallist": "^4.0.0" - } - }, - "magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "requires": { - "sourcemap-codec": "^1.4.8" - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "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 - }, - "muggle-string": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.1.0.tgz", - "integrity": "sha512-Tr1knR3d2mKvvWthlk7202rywKbiOm4rVFLsfAaSIhJ6dt9o47W4S+JMtWhd/PW9Wrdew2/S2fSvhz3E2gkfEg==", - "dev": true - }, - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "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 - }, - "npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^1.9.0" - } - }, - "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, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "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, - "requires": { - "color-name": "1.1.3" - } - }, - "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 - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "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 - }, - "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 - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "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, - "requires": { - "has-flag": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "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, - "requires": { - "boolbase": "^1.0.0" - } - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "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, - "requires": { - "wrappy": "1" - } - }, - "openapi-typescript-codegen": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/openapi-typescript-codegen/-/openapi-typescript-codegen-0.23.0.tgz", - "integrity": "sha512-gOJXy5g3H3HlLpVNN+USrNK2i2KYBmDczk9Xk34u6JorwrGiDJZUj+al4S+i9TXdfUQ/ZaLxE59Xf3wqkxGfqA==", - "dev": true, - "requires": { - "camelcase": "^6.3.0", - "commander": "^9.3.0", - "fs-extra": "^10.1.0", - "handlebars": "^4.7.7", - "json-schema-ref-parser": "^9.0.9" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "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, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "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==", + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, - "requires": { - "p-limit": "^3.0.2" + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, - "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==", + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "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, - "requires": { - "callsites": "^3.0.0" + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "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, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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 - }, - "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 - }, - "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 - }, - "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 - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { + "node_modules/typed-array-buffer": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pidtree": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true - }, - "pinia": { - "version": "2.0.26", - "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.0.26.tgz", - "integrity": "sha512-tSxZNUcMGxQOvKZRjPKXxd2+/2NZhRF/CoYVE/+K6uE/Z3v1Oi4fcQFpxu5nMB1dCchjXUZ+lz0tBxV5ntwmQQ==", - "requires": { - "@vue/devtools-api": "^6.4.5", - "vue-demi": "*" - }, + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, "dependencies": { - "vue-demi": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.5.tgz", - "integrity": "sha512-tO3K2bML3AwiHmVHeKCq6HLef2st4zBXIV5aEkoJl6HZ+gJWxWv2O8wLH8qrA3SX3lDoTDHNghLX1xZg83MXvw==", - "requires": {} - } - } - }, - "postcss": { - "version": "8.4.19", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", - "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" } }, - "postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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 - }, - "prettier": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.0.tgz", - "integrity": "sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==", - "dev": true - }, - "prettier-linter-helpers": { + "node_modules/typed-array-byte-offset": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", "dev": true, - "requires": { - "fast-diff": "^1.1.2" + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "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 - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, "dependencies": { - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - } + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" } }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, - "requires": { - "picomatch": "^2.2.1" + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" } }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "engines": { + "node": ">= 10.0.0" } }, - "resolve-from": { + "node_modules/untildify": { "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 + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" + "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==" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" } }, - "rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, - "requires": { - "fsevents": "~2.3.2" + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "rollup-plugin-inject": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", - "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", + "node_modules/vite": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.12.tgz", + "integrity": "sha512-KtPlUbWfxzGVul8Nut8Gw2Qe8sBzWY+8QVc5SL8iRFnpnrcoCaNlzO40c1R6hPmcdTwIPEDkq0Y9+27a5tVbdQ==", "dev": true, - "requires": { - "estree-walker": "^0.6.1", - "magic-string": "^0.25.3", - "rollup-pluginutils": "^2.8.1" + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" }, - "dependencies": { - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true } } }, - "rollup-plugin-node-polyfills": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", - "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], "dev": true, - "requires": { - "rollup-plugin-inject": "^3.0.0" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "estree-walker": "^0.6.1" - }, - "dependencies": { - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - } + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "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==", + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "queue-microtask": "^1.2.2" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "sass": { - "version": "1.56.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.56.1.tgz", - "integrity": "sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ==", + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "lru-cache": "^6.0.0" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "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==", + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "shebang-regex": "^3.0.0" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "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 - }, - "shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "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==" - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true - }, - "stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "requires": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "string.prototype.padend": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz", - "integrity": "sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==", + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], "dev": true, - "requires": { - "ansi-regex": "^5.0.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - }, - "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 - }, - "strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" - }, - "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==", + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], "dev": true, - "requires": { - "has-flag": "^4.0.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "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 - }, - "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 - }, - "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==", + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], "dev": true, - "requires": { - "is-number": "^7.0.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "tslib": "^1.8.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "prelude-ls": "^1.2.1" + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" } }, - "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 - }, - "typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "devOptional": true - }, - "uglify-js": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.16.2.tgz", - "integrity": "sha512-AaQNokTNgExWrkEYA24BTNMSjyqEXPSfhqoS0AxmHkCJ4U+Dyy5AvbGV/sqxuxficEfGGoX3zWw9R7QpLFfEsg==", + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" } }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "punycode": "^2.1.0" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "vite": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.4.tgz", - "integrity": "sha512-Z2X6SRAffOUYTa+sLy3NQ7nlHFU100xwanq1WDwqaiFiCe+25zdxP1TfCS5ojPV2oDDcXudHIoPnI1Z/66B7Yw==", + "node_modules/vite/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", "dev": true, - "requires": { - "esbuild": "^0.15.9", - "fsevents": "~2.3.2", - "postcss": "^8.4.18", - "resolve": "^1.22.1", - "rollup": "^2.79.1" + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" } }, - "vue": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.45.tgz", - "integrity": "sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==", - "requires": { - "@vue/compiler-dom": "3.2.45", - "@vue/compiler-sfc": "3.2.45", - "@vue/runtime-dom": "3.2.45", - "@vue/server-renderer": "3.2.45", - "@vue/shared": "3.2.45" + "node_modules/vue": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.10.tgz", + "integrity": "sha512-zg6SIXZdTBwiqCw/1p+m04VyHjLfwtjwz8N57sPaBhEex31ND0RYECVOC1YrRwMRmxFf5T1dabl6SGUbMKKuVw==", + "dependencies": { + "@vue/compiler-dom": "3.3.10", + "@vue/compiler-sfc": "3.3.10", + "@vue/runtime-dom": "3.3.10", + "@vue/server-renderer": "3.3.10", + "@vue/shared": "3.3.10" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "vue-eslint-parser": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.0.3.tgz", - "integrity": "sha512-yL+ZDb+9T0ELG4VIFo/2anAOz8SvBdlqEnQnvJ3M7Scq56DvtjY0VY88bByRZB0D4J0u8olBcfrXTVONXsh4og==", + "node_modules/vue-eslint-parser": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz", + "integrity": "sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==", "dev": true, - "requires": { + "dependencies": { "debug": "^4.3.4", "eslint-scope": "^7.1.1", "eslint-visitor-keys": "^3.3.0", @@ -10519,118 +7047,177 @@ "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": { - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } + "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/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" } }, - "vue-router": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.6.tgz", - "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==", - "requires": { - "@vue/devtools-api": "^6.4.5" + "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" } }, - "vue-template-compiler": { - "version": "2.7.14", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", - "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", + "node_modules/vue-template-compiler": { + "version": "2.7.15", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.15.tgz", + "integrity": "sha512-yQxjxMptBL7UAog00O8sANud99C6wJF+7kgbcwqkvA38vCGF7HWE66w0ZFnS/kX5gSoJr/PQ4/oS3Ne2pW37Og==", "dev": true, - "requires": { + "dependencies": { "de-indent": "^1.0.2", "he": "^1.2.0" } }, - "vue-tsc": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.0.9.tgz", - "integrity": "sha512-vRmHD1K6DmBymNhoHjQy/aYKTRQNLGOu2/ESasChG9Vy113K6CdP0NlhR0bzgFJfv2eFB9Ez/9L5kIciUajBxQ==", + "node_modules/vue-tsc": { + "version": "1.8.25", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.25.tgz", + "integrity": "sha512-lHsRhDc/Y7LINvYhZ3pv4elflFADoEOo67vfClAfF2heVHpHmVquLSjojgCSIwzA4F0Pc4vowT/psXCYcfk+iQ==", "dev": true, - "requires": { - "@volar/vue-language-core": "1.0.9", - "@volar/vue-typescript": "1.0.9" + "dependencies": { + "@volar/typescript": "~1.11.1", + "@vue/language-core": "1.8.25", + "semver": "^7.5.4" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": "*" } }, - "vue3-cookies": { + "node_modules/vue3-cookies": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/vue3-cookies/-/vue3-cookies-1.0.6.tgz", "integrity": "sha512-a1UvVD0qIgxyOqjlSOwnLnqAnz8ASltugEv8yX+96i/WGZAN9fEDci7xO4HIWZE1uToUnRq9JnFhvfDCSo45OA==", - "requires": { + "dependencies": { "vue": "^3.0.0" } }, - "which": { + "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, - "requires": { + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "which-boxed-primitive": { + "node_modules/which-boxed-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, - "requires": { + "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", "is-number-object": "^1.0.4", "is-string": "^1.0.5", "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true + "node_modules/which-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "wordwrap": { + "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true }, - "wrappy": { + "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 }, - "xml-name-validator": { + "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 + "dev": true, + "engines": { + "node": ">=12" + } }, - "yallist": { + "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 + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "yocto-queue": { + "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 + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index d5ef6065270a3d51065d91078a1b829bbc2ff454..2c7bbd8337e0cd7a9423ddcdac50b5c2d64a212e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "proxyapi-ui", - "version": "1.0.0", + "name": "clowm-ui", + "version": "2.0.0", "scripts": { "dev": "vite", "build": "run-p type-check build-only", @@ -8,42 +8,55 @@ "build-only": "vite build", "type-check": "vue-tsc --noEmit", "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore", - "generate-client": "openapi --input http://localhost:9999/api/openapi.json --output src/client --client axios" + "generate-s3-client": "openapi --input http://localhost:9999/api/s3proxy-service/openapi.json --output src/client/s3proxy --client axios", + "generate-auth-client": "openapi --input http://localhost:9999/api/auth-service/openapi.json --output src/client/auth --client axios", + "generate-workflow-client": "openapi --input http://localhost:9999/api/workflow-service/openapi.json --output src/client/workflow --client axios" }, "dependencies": { - "@aws-sdk/client-s3": "^3.216.0", - "@aws-sdk/s3-request-presigner": "^3.216.0", - "@aws-sdk/lib-storage": "^3.216.0", - "@popperjs/core": "^2.11.6", - "bootstrap": "^5.2.3", - "bootstrap-icons": "^1.10.2", - "dayjs": "^1.11.6", - "filesize": "^10.0.5", - "pinia": "^2.0.26", - "vue": "^3.2.45", - "vue-router": "^4.1.6", - "vue3-cookies": "^1.0.6" + "@aws-sdk/client-s3": "^3.440.0", + "@aws-sdk/lib-storage": "^3.440.0", + "@aws-sdk/s3-request-presigner": "^3.440.0", + "@fortawesome/fontawesome-free": "~6.4.2", + "@popperjs/core": "~2.11.8", + "ajv": "~8.12.0", + "bootstrap": "~5.3.1", + "chart.js": "~4.3.3", + "chartjs-plugin-zoom": "~2.0.1", + "dayjs": "~1.11.9", + "dompurify": "~3.0.5", + "filesize": "~10.0.12", + "idb-keyval": "^6.2.1", + "pinia": "~2.1.6", + "semver": "~7.5.4", + "showdown": "~2.1.0", + "vue": "~3.3.4", + "vue-router": "~4.2.4", + "vue3-cookies": "~1.0.6" }, "devDependencies": { - "@esbuild-plugins/node-globals-polyfill": "^0.1.1", - "@esbuild-plugins/node-modules-polyfill": "^0.1.4", - "@rushstack/eslint-patch": "^1.2.0", - "@types/bootstrap": "^5.2.6", - "@types/node": "^16.11.45", - "@vitejs/plugin-vue": "^3.2.0", - "@vue/eslint-config-prettier": "^7.0.0", - "@vue/eslint-config-typescript": "^11.0.2", - "@vue/tsconfig": "^0.1.3", - "axios": "^1.2.0", - "eslint": "^8.28.0", - "eslint-plugin-vue": "^9.7.0", - "npm-run-all": "^4.1.5", - "openapi-typescript-codegen": "^0.23.0", - "prettier": "^2.8.0", - "rollup-plugin-node-polyfills": "^0.2.1", - "sass": "^1.56.1", - "typescript": "~4.7.4", - "vite": "^3.2.4", - "vue-tsc": "^1.0.9" + "@esbuild-plugins/node-globals-polyfill": "~0.2.3", + "@esbuild-plugins/node-modules-polyfill": "~0.2.2", + "@rushstack/eslint-patch": "~1.2.0", + "@tsconfig/node18": "^18.2.1", + "@types/bootstrap": "~5.2.6", + "@types/dompurify": "~3.0.2", + "@types/node": "^16.18.48", + "@types/semver": "~7.5.1", + "@types/showdown": "~2.0.1", + "@vitejs/plugin-vue": "~4.3.4", + "@vue/eslint-config-prettier": "~8.0.0", + "@vue/eslint-config-typescript": "~11.0.3", + "@vue/tsconfig": "~0.4.0", + "axios": "~1.6.0", + "eslint": "~8.48.0", + "eslint-plugin-vue": "~9.17.0", + "npm-run-all": "~4.1.5", + "openapi-typescript-codegen": "^0.25.0", + "prettier": "~3.0.3", + "rollup-plugin-node-polyfills": "~0.2.1", + "sass": "~1.66.1", + "typescript": "~5.1.6", + "vite": "~4.4.9", + "vue-tsc": "~1.8.10" } } diff --git a/public/favicon.ico b/public/favicon.ico index 0561d178dadb78ee5f28f65c07b6110898bed797..9a5ef0b51744c76175432d797fe39e185168aeae 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/src/App.vue b/src/App.vue index 41975a90f162301e85b125c5f6179969cba510a9..a9b94a9a34d38fffe98a9e950256d42049652a10 100644 --- a/src/App.vue +++ b/src/App.vue @@ -2,19 +2,43 @@ import NavbarTop from "@/components/NavbarTop.vue"; import { onBeforeMount } from "vue"; import { useCookies } from "vue3-cookies"; -import { useAuthStore } from "@/stores/auth"; +import { useAuthStore } from "@/stores/users"; import { useRouter } from "vue-router"; -import { OpenAPI } from "@/client"; +import { OpenAPI as S3ProxyOpenAPI } from "@/client/s3proxy"; +import { OpenAPI as AuthOpenAPI } from "@/client/auth"; +import { OpenAPI as WorkflowOpenAPI } from "@/client/workflow"; +import { environment } from "@/environment"; +import FooterBottom from "@/components/FooterBottom.vue"; +import axios from "axios"; const { cookies } = useCookies(); const store = useAuthStore(); const router = useRouter(); onBeforeMount(() => { - OpenAPI.BASE = - import.meta.env.VITE_API_BASE_URL != null - ? import.meta.env.VITE_API_BASE_URL - : "http://localhost:9999/api"; + S3ProxyOpenAPI.BASE = environment.S3PROXY_API_BASE_URL; + AuthOpenAPI.BASE = environment.AUTH_API_BASE_URL; + WorkflowOpenAPI.BASE = environment.WORKFLOW_API_BASE_URL; + axios.interceptors.response.use( + (res) => res, + (err) => { + if ( + (err.response.status === 400 || err.response.status === 403) && + err.response.data.detail?.includes("JWT") + ) { + store.logout(); + cookies.remove("bearer"); + router.push({ + name: "login", + query: { + login_error: + err.response.status === 400 ? "token_invalid" : "token_expired", + }, + }); + } + return Promise.reject(err); + }, + ); store.setToken(cookies.get("bearer")); router.beforeEach(async (to) => { // make sure the user is authenticated @@ -25,6 +49,16 @@ onBeforeMount(() => { ) { // redirect the user to the login page and preserve query params for login error message return { name: "login", query: to.query }; + } else if ( + to.meta.requiresDeveloperRole && + !(store.workflowDev || store.admin) + ) { + return { name: "dashboard" }; + } else if ( + to.meta.requiresReviewerRole && + !(store.workflowReviewer || store.admin) + ) { + return { name: "dashboard" }; } }); }); @@ -32,9 +66,10 @@ onBeforeMount(() => { <template> <NavbarTop /> - <div class="container"> + <div class="container-xxl mt-4 flex-grow-1"> <router-view></router-view> </div> + <FooterBottom /> </template> <style scoped></style> diff --git a/src/assets/base.css b/src/assets/base.css index 71dc55a3cb5a72589496743a327c738ead3e1c83..c797992b2ac10ceba1399cfc918fc09cf7276cf5 100644 --- a/src/assets/base.css +++ b/src/assets/base.css @@ -36,20 +36,6 @@ --section-gap: 160px; } -@media (prefers-color-scheme: dark) { - :root { - --color-background: var(--vt-c-black); - --color-background-soft: var(--vt-c-black-soft); - --color-background-mute: var(--vt-c-black-mute); - - --color-border: var(--vt-c-divider-dark-2); - --color-border-hover: var(--vt-c-divider-dark-1); - - --color-heading: var(--vt-c-text-dark-1); - --color-text: var(--vt-c-text-dark-2); - } -} - *, *::before, *::after { @@ -61,8 +47,6 @@ body { min-height: 100vh; - color: var(--color-text); - background: var(--color-background); transition: color 0.5s, background-color 0.5s; line-height: 1.6; font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, diff --git a/src/assets/env.template.js b/src/assets/env.template.js new file mode 100644 index 0000000000000000000000000000000000000000..c2ddbd6f476a9e787b158e38a695bef8924f79c9 --- /dev/null +++ b/src/assets/env.template.js @@ -0,0 +1,10 @@ +(function (window) { + window["env"] = window["env"] || {}; + + // Environment variables + window["env"]["s3Url"] = "${S3_URL}"; + window["env"]["workflowApiUrl"] = "${WORKFLOW_API_BASE_URL}"; + window["env"]["s3proxyApiUrl"] = "${S3PROXY_API_BASE_URL}"; + window["env"]["authApiUrl"] = "${AUTH_API_BASE_URL}"; + window["env"]["devSystem"] = "${DEV_SYSTEM}"; +})(this); diff --git a/src/assets/images/bibi.png b/src/assets/images/bibi.png new file mode 100644 index 0000000000000000000000000000000000000000..cee554d811f6949fb4987d38e7b94f91cd38cc95 Binary files /dev/null and b/src/assets/images/bibi.png differ diff --git a/src/assets/images/clowm.svg b/src/assets/images/clowm.svg new file mode 100644 index 0000000000000000000000000000000000000000..4b8d5e55f504302fd08f32c1bd004699019e46e6 --- /dev/null +++ b/src/assets/images/clowm.svg @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> + +<svg + width="23.757999mm" + height="23.757999mm" + viewBox="0 0 23.758 23.757998" + version="1.1" + id="svg5126" + xmlns="http://www.w3.org/2000/svg"> + + <g + id="layer1" + transform="translate(-78.650696,-68.730968)"> + <path + style="fill:none;fill-opacity:1;stroke:#4f4f4f;stroke-width:0.851766;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" + d="m 90.554464,80.612424 -8.112762,1.426799" + id="path7807-9-7" + /> + <path + style="fill:none;fill-opacity:1;stroke:#4f4f4f;stroke-width:0.851766;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" + d="m 97.830538,77.453091 -7.276074,3.159333" + id="path7807-9" + /> + <circle + style="fill:#0d6efd;fill-opacity:1;stroke:none;stroke-width:0.283922;stop-color:#000000" + id="path5738-5" + cx="97.868805" + cy="77.424881" + r="2.1244874"/> + <path + style="fill:none;fill-opacity:1;stroke:#4f4f4f;stroke-width:0.851766;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" + d="m 86.98483,73.171742 3.569634,7.440682" + id="path7807" + /> + <path + style="fill:none;stroke:#4f4f4f;stroke-width:0.851766;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" + d="m 82.4106,82.134057 c 1.648883,4.723585 6.971072,7.829186 12.763187,5.358027" + id="path9337" + /> + <circle + style="fill:#0d6efd;fill-opacity:1;stroke:none;stroke-width:0.283922;stop-color:#000000" + id="path5738" + cx="86.98037" + cy="73.195999" + r="2.1244874"/> + <circle + style="fill:#dc3545;fill-opacity:1;stroke:none;stroke-width:0.283922;stroke-opacity:1;stop-color:#000000" + id="path5738-7" + cx="90.529472" + cy="80.609749" + r="3.2386508"/> + <circle + style="fill:#198754;fill-opacity:1;stroke:none;stroke-width:0.283922;stop-color:#000000" + id="path5738-4" + cx="82.418419" + cy="82.049561" + r="1.752311"/> + <circle + style="fill:#198754;fill-opacity:1;stroke:none;stroke-width:0.283922;stop-color:#000000" + id="path5738-4-5" + cx="95.175735" + cy="87.50563" + r="1.752311"/> + <circle + style="fill:none;fill-opacity:1;stroke:#4f4f4f;stroke-width:0.567844;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000" + id="path10954" + cx="90.529472" + cy="80.609749" + r="11.594855"/> + </g> +</svg> diff --git a/src/assets/images/denbi.svg b/src/assets/images/denbi.svg index 9e87849f29b451ab324563b4d6b1fc0c718d4c6d..b8bd43a5b023e249a75ce12209c8d19904d176c6 100644 --- a/src/assets/images/denbi.svg +++ b/src/assets/images/denbi.svg @@ -1,540 +1,112 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="98.794556mm" - height="98.992439mm" - viewBox="0 0 98.794556 98.99244" - version="1.1" - id="svg2615" - inkscape:version="0.92.2 2405546, 2018-03-11" - sodipodi:docname="denbi.svg"> - <defs - id="defs2609"> - <clipPath - clipPathUnits="userSpaceOnUse" - id="clipPath22622-0-7-4-2"> - <path - d="M 0,0 H 841.89 V 595.276 H 0 Z" - id="path22620-9-9-7-9" - inkscape:connector-curvature="0" /> - </clipPath> - <mask - maskUnits="userSpaceOnUse" - x="0" - y="0" - width="1" - height="1" - id="mask22632-9-1-2-3"> - <g - id="g22642-8-9-1-9"> - <g - clip-path="url(#clipPath22630-0-4-8-0)" - id="g22640-0-6-7-0"> - <g - id="g22638-2-3-9-8"> - <g - transform="matrix(131.04001,0,0,131.04001,508.79009,98.838959)" - id="g22636-4-6-5-8"> - <image - width="1" - height="1" - style="image-rendering:optimizeSpeed" - preserveAspectRatio="none" - transform="matrix(1,0,0,-1,0,1)" - xlink:href="data:image/png;base64,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" - id="image22634-9-8-6-5" /> - </g> - </g> - </g> - </g> - </mask> - <clipPath - clipPathUnits="userSpaceOnUse" - id="clipPath22630-0-4-8-0"> - <path - d="M 508.79,229.879 H 639.83 V 98.839 H 508.79 Z" - id="path22628-1-6-9-9" - inkscape:connector-curvature="0" /> - </clipPath> - <clipPath - clipPathUnits="userSpaceOnUse" - id="clipPath22650-2-6-5-6"> - <path - d="m 510.95,227.719 h 126 v -126.36 h -126 z" - id="path22648-0-7-5-3" - inkscape:connector-curvature="0" /> - </clipPath> - <mask - maskUnits="userSpaceOnUse" - x="0" - y="0" - width="1" - height="1" - id="mask22666-0-2-2-8"> - <g - id="g22676-6-7-1-5"> - <g - clip-path="url(#clipPath22664-3-6-6-9)" - id="g22674-3-4-5-6"> - <g - id="g22672-9-1-9-1"> - <g - transform="matrix(132.84001,0,0,133.20001,500.7401,104.72902)" - id="g22670-0-0-9-1"> - <image - width="1" - height="1" - style="image-rendering:optimizeSpeed" - preserveAspectRatio="none" - transform="matrix(1,0,0,-1,0,1)" - xlink:href="data:image/png;base64,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" - id="image22668-8-0-1-5" /> - </g> - </g> - </g> - </g> - </mask> - <clipPath - clipPathUnits="userSpaceOnUse" - id="clipPath22664-3-6-6-9"> - <path - d="m 500.74,237.929 h 132.84 v -133.2 H 500.74 Z" - id="path22662-8-4-2-8" - inkscape:connector-curvature="0" /> - </clipPath> - <clipPath - clipPathUnits="userSpaceOnUse" - id="clipPath22684-7-4-1-4"> - <path - d="M 502.9,235.769 H 631.06 V 107.609 H 502.9 Z" - id="path22682-3-3-0-81" - inkscape:connector-curvature="0" /> - </clipPath> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.35" - inkscape:cx="-538.82989" - inkscape:cy="27.194867" - inkscape:document-units="mm" - inkscape:current-layer="g55323-4" - showgrid="false" - inkscape:window-width="1920" - inkscape:window-height="1019" - inkscape:window-x="0" - inkscape:window-y="0" - inkscape:window-maximized="1" - fit-margin-top="0" - fit-margin-left="0" - fit-margin-right="0" - fit-margin-bottom="0" /> - <metadata - id="metadata2612"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(-94.184455,-57.036206)"> - <g - inkscape:export-ydpi="376.83823" - inkscape:export-xdpi="376.83823" - transform="matrix(9.0110139,0,0,9.0110139,-521.22726,-839.71092)" - id="g55323-4" - style="stroke:none;stroke-width:0.1109753"> - <g - id="g22692-1" - transform="matrix(0.09477835,0,0,-0.09477835,78.653045,104.47736)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 -19.887,-8.434 -1.182,2.786 19.887,8.434 z" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22694-8" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22696-5" - transform="matrix(0.09477835,0,0,-0.09477835,71.391489,106.95995)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 -28.38,29.335 2.175,2.104 28.38,-29.335 z" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22698-9" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22700-7" - transform="matrix(0.09477835,0,0,-0.09477835,73.983601,101.98815)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="M 0,0 -2.504,1.699 9.704,19.686 12.208,17.987 Z" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22702-53" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22704-8" - transform="matrix(0.09477835,0,0,-0.09477835,76.233657,109.07867)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="M 0,0 3.048,40.702 6.066,40.476 3.017,-0.226 Z" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22706-8" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22708-3" - transform="matrix(0.09477835,0,0,-0.09477835,71.390627,109.54218)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="M 0,0 -3.326,30.585 -0.317,30.912 3.008,0.327 Z" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22710-18" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22712-9" - transform="matrix(0.09477835,0,0,-0.09477835,70.92027,106.22977)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="M 0,0 -14.527,38.144 -11.699,39.22 2.828,1.077 Z" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22714-64" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22716-33" - transform="matrix(0.09477835,0,0,-0.09477835,73.447638,109.99767)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 -22.809,33.848 2.51,1.69 L 2.509,1.691 Z" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22718-3" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22720-8" - transform="matrix(0.09477835,0,0,-0.09477835,71.677578,106.69283)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 -30.325,5.185 0.51,2.983 L 0.51,2.983 Z" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22722-60" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22724-4" - transform="matrix(0.09477835,0,0,-0.09477835,69.743596,108.00648)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 -2.022,2.251 16.459,14.782 2.022,-2.251 z" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22726-8" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22728-8" - transform="matrix(0.09477835,0,0,-0.09477835,73.683325,102.20827)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="M 0,0 -26.613,14.834 -25.14,17.478 1.473,2.643 Z" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22730-8" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22732-9" - transform="matrix(0.09477835,0,0,-0.09477835,73.859971,102.0234)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 -2.871,-0.956 -6.866,20.626 2.871,0.956 z" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22734-7" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22736-7" - transform="matrix(0.09477835,0,0,-0.09477835,73.655564,102.36073)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 -1.21,2.774 30.397,13.264 1.21,-2.773 z" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22738-64" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22740-3" - transform="matrix(0.09477835,0,0,-0.09477835,76.901749,104.93084)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 -2.584,1.576 14.568,23.872 2.583,-1.576 z" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22742-0" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22744-3" - transform="matrix(0.09477835,0,0,-0.09477835,78.639473,106.33723)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="M 0,0 -19.143,10.008 -17.741,12.69 1.402,2.682 Z" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22746-0" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22748-9" - transform="matrix(0.09477835,0,0,-0.09477835,77.685236,107.83956)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="M 0,0 -11.205,26.753 -8.413,27.922 2.792,1.169 Z" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22750-25" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22752-4" - transform="matrix(0.09477835,0,0,-0.09477835,74.067432,104.98559)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 -6.052,-0.057 -0.29,30.653 6.052,0.058 z" - style="fill:#7b7979;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22754-0" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22756-5" - transform="matrix(0.09477835,0,0,-0.09477835,71.366023,106.76728)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 -3.108,5.194 27.03,16.173 3.108,-5.194 z" - style="fill:#7b7979;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22758-9" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22760-46" - transform="matrix(0.09477835,0,0,-0.09477835,76.709559,105.37532)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="M 0,0 -31.006,1.058 -30.8,7.108 0.207,6.05 Z" - style="fill:#7b7979;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22762-9" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22772-2" - transform="matrix(0.09477835,0,0,-0.09477835,75.153373,104.70079)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 c 1.675,-8 -3.452,-15.842 -11.451,-17.517 -7.999,-1.675 -15.842,3.451 -17.517,11.451 -1.675,7.999 3.452,15.842 11.451,17.517 C -9.518,13.126 -1.675,7.999 0,0" - style="fill:#ec008c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22774-2" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22776-4" - transform="matrix(0.09477835,0,0,-0.09477835,74.452734,101.93648)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 c 0.854,-4.077 -1.759,-8.074 -5.836,-8.928 -4.077,-0.854 -8.074,1.76 -8.927,5.836 -0.854,4.077 1.759,8.074 5.836,8.928 C -4.851,6.689 -0.854,4.076 0,0" - style="fill:#7b7979;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22778-7" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22780-7" - transform="matrix(0.09477835,0,0,-0.09477835,71.918341,106.37464)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 c 0.854,-4.077 -1.759,-8.073 -5.836,-8.927 -4.077,-0.854 -8.073,1.759 -8.927,5.836 -0.854,4.077 1.759,8.074 5.836,8.927 C -4.85,6.69 -0.854,4.077 0,0" - style="fill:#7b7979;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22782-5" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22784-48" - transform="matrix(0.09477835,0,0,-0.09477835,77.35278,104.956)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 c 0.854,-4.077 -1.759,-8.074 -5.836,-8.927 -4.077,-0.854 -8.074,1.759 -8.927,5.836 -0.854,4.076 1.759,8.073 5.836,8.927 C -4.851,6.689 -0.854,4.077 0,0" - style="fill:#7b7979;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22786-1" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22788-2" - transform="matrix(0.09477835,0,0,-0.09477835,78.677734,102.45883)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 c 0.61,-2.912 -1.256,-5.767 -4.168,-6.377 -2.913,-0.609 -5.767,1.257 -6.377,4.169 -0.61,2.912 1.256,5.767 4.168,6.377 C -3.465,4.778 -0.61,2.912 0,0" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22790-8" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22792-93" - transform="matrix(0.09477835,0,0,-0.09477835,79.149807,106.06643)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 c 0.61,-2.912 -1.257,-5.767 -4.169,-6.377 -2.912,-0.609 -5.767,1.257 -6.376,4.169 -0.61,2.912 1.256,5.767 4.168,6.377 C -3.465,4.779 -0.61,2.912 0,0" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22794-6" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22796-8" - transform="matrix(0.09477835,0,0,-0.09477835,78.353536,107.79556)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 c 0.61,-2.912 -1.256,-5.767 -4.168,-6.377 -2.913,-0.61 -5.767,1.257 -6.377,4.169 -0.61,2.912 1.256,5.767 4.168,6.376 C -3.465,4.778 -0.61,2.912 0,0" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22798-0" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22800-2" - transform="matrix(0.09477835,0,0,-0.09477835,77.136203,100.75546)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 c 0.61,-2.912 -1.256,-5.767 -4.169,-6.377 -2.912,-0.609 -5.766,1.257 -6.376,4.169 -0.61,2.911 1.256,5.766 4.168,6.376 C -3.465,4.778 -0.61,2.912 0,0" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22802-1" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22804-0" - transform="matrix(0.09477835,0,0,-0.09477835,73.549704,99.922771)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 c 0.61,-2.912 -1.257,-5.767 -4.169,-6.377 -2.912,-0.61 -5.767,1.257 -6.376,4.169 -0.61,2.912 1.256,5.767 4.168,6.376 C -3.465,4.778 -0.61,2.912 0,0" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22806-5" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22808-1" - transform="matrix(0.09477835,0,0,-0.09477835,71.73051,100.57238)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 c 0.61,-2.912 -1.256,-5.767 -4.168,-6.377 -2.913,-0.61 -5.767,1.257 -6.377,4.169 -0.61,2.912 1.256,5.767 4.168,6.376 C -3.465,4.778 -0.61,2.912 0,0" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22810-1" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22812-0" - transform="matrix(0.09477835,0,0,-0.09477835,69.378158,105.96222)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 c 0.61,-2.912 -1.256,-5.767 -4.169,-6.377 -2.912,-0.61 -5.767,1.257 -6.376,4.169 -0.61,2.911 1.256,5.767 4.168,6.376 C -3.465,4.778 -0.61,2.912 0,0" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22814-8" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22816-5" - transform="matrix(0.09477835,0,0,-0.09477835,70.22488,107.78177)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 c 0.61,-2.912 -1.257,-5.767 -4.168,-6.377 -2.913,-0.61 -5.768,1.257 -6.377,4.169 -0.61,2.911 1.256,5.767 4.168,6.376 C -3.465,4.778 -0.61,2.912 0,0" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22818-0" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22820-6" - transform="matrix(0.09477835,0,0,-0.09477835,72.008409,109.34911)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 c 0.61,-2.912 -1.257,-5.767 -4.169,-6.377 -2.912,-0.61 -5.767,1.257 -6.376,4.169 -0.61,2.911 1.256,5.767 4.168,6.376 C -3.465,4.778 -0.61,2.912 0,0" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22822-4" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22824-6" - transform="matrix(0.09477835,0,0,-0.09477835,70.043076,102.19979)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 c 0.61,-2.912 -1.257,-5.767 -4.169,-6.377 -2.912,-0.609 -5.766,1.257 -6.376,4.169 -0.61,2.912 1.256,5.767 4.168,6.377 C -3.465,4.778 -0.61,2.912 0,0" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22826-2" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22828-5" - transform="matrix(0.09477835,0,0,-0.09477835,74.132231,109.88718)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 c 0.61,-2.912 -1.257,-5.767 -4.169,-6.377 -2.912,-0.609 -5.767,1.257 -6.376,4.169 -0.61,2.912 1.256,5.767 4.168,6.376 C -3.465,4.778 -0.61,2.912 0,0" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22830-8" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22832-6" - transform="matrix(0.09477835,0,0,-0.09477835,76.870283,109.17076)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 c 0.61,-2.912 -1.257,-5.767 -4.169,-6.377 -2.912,-0.61 -5.767,1.257 -6.376,4.169 -0.61,2.911 1.256,5.767 4.168,6.377 C -3.465,4.778 -0.61,2.912 0,0" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22834-28" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22836-4" - transform="matrix(0.09477835,0,0,-0.09477835,75.549414,100.04888)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 c 0.61,-2.912 -1.256,-5.767 -4.168,-6.377 -2.913,-0.61 -5.767,1.257 -6.377,4.169 -0.61,2.912 1.256,5.767 4.168,6.376 C -3.465,4.778 -0.61,2.912 0,0" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22838-7" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22840-2" - transform="matrix(0.09477835,0,0,-0.09477835,69.30589,103.944)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 c 0.61,-2.912 -1.257,-5.767 -4.169,-6.377 -2.912,-0.609 -5.767,1.257 -6.376,4.169 -0.61,2.912 1.256,5.767 4.168,6.377 C -3.465,4.779 -0.61,2.912 0,0" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22842-4" - inkscape:connector-curvature="0" /> - </g> - <g - id="g22844-0" - transform="matrix(0.09477835,0,0,-0.09477835,79.248311,104.18049)" - style="stroke:none;stroke-width:0.1109753"> - <path - d="m 0,0 c 0.61,-2.912 -1.257,-5.767 -4.168,-6.377 -2.913,-0.609 -5.767,1.257 -6.377,4.169 -0.61,2.912 1.256,5.767 4.168,6.377 C -3.465,4.778 -0.61,2.912 0,0" - style="fill:#bdbcbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1109753" - id="path22846-6" - inkscape:connector-curvature="0" /> - </g> - </g> - </g> -</svg> +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="354.332px" height="91.896px" viewBox="0 0 354.332 91.896" enable-background="new 0 0 354.332 91.896" xml:space="preserve"> +<g> + + <rect x="173.494" y="35.035" transform="matrix(-0.9206 0.3904 -0.3904 -0.9206 361.0044 -1.3185)" fill="#929497" width="14.284" height="2.001"/> + + <rect x="114.788" y="40.095" transform="matrix(-0.6953 -0.7187 0.7187 -0.6953 187.9412 161.8685)" fill="#929497" width="26.989" height="2.001"/> + + <rect x="157.247" y="3.112" transform="matrix(-0.8275 -0.5614 0.5614 -0.8275 283.4174 107.6694)" fill="#929497" width="2" height="14.376"/> + + <rect x="159.245" y="51.891" transform="matrix(0.0747 -0.9972 0.9972 0.0747 107.0886 221.1947)" fill="#929497" width="26.989" height="2.001"/> + + <rect x="126.666" y="58.279" transform="matrix(-0.1081 -0.9941 0.9941 -0.1081 92.6987 201.7243)" fill="#929497" width="20.342" height="2.002"/> + + <rect x="116.294" y="32.427" transform="matrix(-0.3559 -0.9345 0.9345 -0.3559 144.7412 166.6154)" fill="#929497" width="26.99" height="2.001"/> + + <rect x="131.09" y="59.942" transform="matrix(-0.5589 -0.8293 0.8293 -0.5589 174.8526 214.8999)" fill="#929497" width="26.99" height="2.002"/> + + <rect x="118.913" y="45.932" transform="matrix(-0.9857 -0.1686 0.1686 -0.9857 248.4081 114.9596)" fill="#929497" width="20.344" height="2"/> + + <rect x="129.229" y="45.846" transform="matrix(-0.668 -0.7441 0.7441 -0.668 177.6677 185.5815)" fill="#929497" width="2.001" height="14.628"/> + <line fill="none" x1="153.424" y1="17.466" x2="135.828" y2="7.657"/> + + <rect x="134.555" y="11.564" transform="matrix(-0.8735 -0.4869 0.4869 -0.8735 264.8408 93.9552)" fill="#929497" width="20.148" height="2.001"/> + + <rect x="149.957" y="3.362" transform="matrix(-0.9488 0.3158 -0.3158 -0.9488 297.5219 -27.1114)" fill="#929497" width="2.001" height="14.375"/> + + <rect x="161.386" y="3.135" transform="matrix(-0.4002 -0.9164 0.9164 -0.4002 214.4449 168.5603)" fill="#929497" width="2.001" height="21.929"/> + + <rect x="178.35" y="19.679" transform="matrix(-0.8537 -0.5207 0.5207 -0.8537 317.4073 147.0102)" fill="#929497" width="2.003" height="18.492"/> + + <rect x="174.508" y="41.95" transform="matrix(-0.8862 -0.4633 0.4633 -0.8862 322.7289 165.1728)" fill="#929497" width="14.285" height="2.001"/> + + <rect x="168.495" y="47.391" transform="matrix(-0.3864 -0.9223 0.9223 -0.3864 202.2601 231.342)" fill="#929497" width="19.178" height="2.001"/> + + <rect x="151.526" y="17.467" transform="matrix(-1 0.0093 -0.0093 -1 307.304 53.7789)" fill="#58595B" width="4.002" height="20.27"/> + + <rect x="142.682" y="32.667" transform="matrix(-0.5133 -0.8582 0.8582 -0.5133 181.9724 189.3636)" fill="#58595B" width="4.003" height="20.828"/> + + <rect x="153.607" y="36.083" transform="matrix(-0.9994 -0.0341 0.0341 -0.9994 326.3332 81.7381)" fill="#58595B" width="20.515" height="4.002"/> + <path fill="#EB008B" d="M163.193,35.73c1.107,5.291-2.282,10.475-7.57,11.584c-5.29,1.106-10.478-2.283-11.584-7.573 c-1.108-5.29,2.281-10.476,7.57-11.582C156.899,27.05,162.085,30.441,163.193,35.73"/> + <path fill="#58595B" d="M158.305,16.444c0.564,2.696-1.163,5.339-3.858,5.903c-2.695,0.563-5.339-1.163-5.903-3.858 c-0.563-2.696,1.164-5.339,3.859-5.903S157.742,13.748,158.305,16.444"/> + <path fill="#58595B" d="M140.624,47.407c0.562,2.696-1.163,5.339-3.859,5.903c-2.695,0.563-5.338-1.163-5.903-3.858 c-0.562-2.696,1.163-5.338,3.859-5.904C137.417,42.985,140.059,44.711,140.624,47.407"/> + <path fill="#58595B" d="M178.54,37.511c0.562,2.695-1.164,5.339-3.86,5.902c-2.696,0.564-5.338-1.164-5.903-3.858 c-0.562-2.696,1.163-5.339,3.858-5.904C175.332,33.086,177.974,34.815,178.54,37.511"/> + <path fill="#929497" d="M187.782,20.088c0.402,1.926-0.83,3.813-2.756,4.217c-1.926,0.402-3.814-0.831-4.217-2.757 c-0.404-1.926,0.831-3.812,2.756-4.216C185.493,16.93,187.379,18.162,187.782,20.088"/> + <path fill="#929497" d="M191.077,45.257c0.401,1.927-0.832,3.813-2.757,4.218c-1.927,0.402-3.813-0.831-4.218-2.758 c-0.404-1.926,0.832-3.812,2.757-4.216C188.786,42.099,190.672,43.332,191.077,45.257"/> + <path fill="#929497" d="M185.52,57.322c0.402,1.925-0.83,3.812-2.757,4.216c-1.925,0.403-3.813-0.831-4.216-2.756 c-0.403-1.927,0.83-3.812,2.756-4.216S185.118,55.397,185.52,57.322"/> + <path fill="#929497" d="M177.027,8.204c0.403,1.926-0.83,3.813-2.756,4.216c-1.926,0.403-3.813-0.831-4.218-2.756 s0.832-3.812,2.758-4.216C174.736,5.044,176.625,6.28,177.027,8.204"/> + <path fill="#929497" d="M152.005,2.396c0.402,1.925-0.83,3.812-2.756,4.215c-1.926,0.404-3.814-0.831-4.218-2.756 s0.832-3.812,2.757-4.215C149.714-0.764,151.602,0.47,152.005,2.396"/> + <path fill="#929497" d="M139.312,6.927c0.403,1.926-0.83,3.812-2.756,4.216c-1.926,0.402-3.812-0.831-4.218-2.756 c-0.403-1.927,0.832-3.813,2.758-4.218C137.021,3.768,138.911,5.001,139.312,6.927"/> + <path fill="#929497" d="M122.9,44.531c0.403,1.925-0.83,3.814-2.755,4.216c-1.926,0.403-3.813-0.83-4.218-2.755 c-0.403-1.926,0.831-3.812,2.757-4.217C120.61,41.371,122.498,42.606,122.9,44.531"/> + <path fill="#929497" d="M128.809,57.226c0.402,1.925-0.831,3.812-2.757,4.217c-1.926,0.403-3.812-0.832-4.217-2.757 c-0.403-1.927,0.831-3.813,2.757-4.216C126.518,54.066,128.406,55.3,128.809,57.226"/> + <path fill="#929497" d="M141.252,68.16c0.401,1.925-0.831,3.812-2.757,4.216c-1.927,0.404-3.813-0.831-4.219-2.756 c-0.401-1.927,0.832-3.812,2.759-4.216C138.961,65.001,140.849,66.235,141.252,68.16"/> + <path fill="#005AA9" d="M21.96,20.89c10.663,0,14.124,5.959,14.124,5.959h0.193c0,0-0.101-1.25-0.101-2.884v-8.647 c0-1.443-0.769-2.115-2.111-2.115h-3.841V2.824H41.85c4.518,0,6.535,2.017,6.535,6.534v49.296c0,1.347,0.768,2.115,2.117,2.115 h3.742v10.283H43.005c-4.422,0-6.053-2.114-6.053-4.998v-1.824h-0.193c0,0-4.036,7.975-15.279,7.975 C8.218,72.204-0.334,61.732-0.334,46.548C-0.334,30.982,8.985,20.89,21.96,20.89 M36.472,46.451c0-7.589-3.94-15.085-12.112-15.085 c-6.722,0-12.3,5.475-12.3,15.182c0,9.32,4.903,15.373,12.111,15.373C30.512,61.921,36.472,57.313,36.472,46.451"/> + <path fill="#00ADEE" d="M249.093,2.823c-4.611,0-6.534,2.019-6.534,6.534v31.23c0,3.941,0.674,9.611,0.674,9.611h-0.193 c0,0-2.979-5.67-5.672-9.611L211.519,2.823H200.18v55.447c0,1.308-0.739,2.015-2.012,2.055v-0.005h-8.346 c-2.601,4.101-5.873,7.729-9.668,10.732h13.777h4.236h8.064c4.614,0,6.531-1.924,6.531-6.535V33.383c0-3.941-0.667-9.61-0.667-9.61 h0.188c0,0,2.979,5.766,5.672,9.61l25.942,37.67h11.244V15.605c0-1.343,0.769-2.114,2.117-2.114h4.13V2.823H249.093z"/> + <path fill="#00ADEE" d="M274.079,13.49h-6.246V2.823h29.504c12.299,0,21.139,6.344,21.139,17.588c0,7.59-4.129,12.491-8.264,14.605 v0.189c7.402,2.211,10.957,9.13,10.957,16.048c0,13.646-10.859,19.798-23.545,19.798h-17.012c-4.517,0-6.533-1.923-6.533-6.534 V13.49L274.079,13.49z M297.431,30.692c5.284,0,8.265-3.842,8.265-8.743s-2.881-8.458-8.453-8.458h-10.574v17.201H297.431z M288.784,60.386h9.803c6.146,0,9.607-4.134,9.607-9.897c0-5.67-3.555-9.801-9.607-9.801h-11.92v17.583 C286.667,59.616,287.436,60.386,288.784,60.386"/> + <polygon fill="#00ADEE" points="326.752,60.386 334.579,60.386 334.579,13.49 326.752,13.49 326.752,2.823 353.321,2.823 353.321,13.49 346.493,13.49 346.493,60.386 353.321,60.386 353.321,71.053 326.752,71.053 "/> + <path fill="#005AA9" d="M127.028,71.179l-0.187-0.138c-3.789-3.002-7.058-6.625-9.654-10.721H82.255h-0.001h-1.298 c-5.758-0.63-8.17-3.946-9.028-11.658h33.827c0,0,0.287-3.076,0.287-4.516c0-12.976-7.685-23.256-21.714-23.256 c-14.704,0-24.895,10.571-24.895,25.658c0,13.935,7.078,24.649,23.314,24.649c0.803,0,1.58-0.01,2.349-0.021L127.028,71.179 L127.028,71.179z M84.329,30.308c4.998,0,9.032,4.037,9.221,9.897H72.315C73.66,34.056,78.082,30.308,84.329,30.308"/> + <path fill="#231F20" d="M7.279,91.325l-0.497,0.134l-0.467-0.498c-0.275,0.17-0.565,0.296-0.868,0.376 c-0.302,0.082-0.647,0.122-1.04,0.122c-1.076,0-1.888-0.369-2.433-1.107c-0.544-0.737-0.815-1.833-0.815-3.288 c0-0.908,0.147-1.703,0.445-2.39c0.297-0.684,0.728-1.21,1.283-1.578c0.557-0.368,1.213-0.553,1.966-0.553 c0.396,0,0.775,0.021,1.144,0.066c0.364,0.045,0.771,0.122,1.22,0.232v1.756H6.583c-0.115-0.384-0.251-0.684-0.409-0.897 c-0.157-0.215-0.345-0.367-0.564-0.459c-0.219-0.091-0.495-0.137-0.832-0.137c-0.465,0-0.87,0.147-1.221,0.445 c-0.348,0.3-0.618,0.737-0.812,1.318c-0.194,0.581-0.291,1.281-0.291,2.104c0,0.834,0.083,1.547,0.245,2.139 c0.164,0.591,0.407,1.037,0.73,1.337c0.324,0.301,0.722,0.45,1.193,0.45c0.503,0,0.875-0.109,1.117-0.329 c0.241-0.219,0.363-0.556,0.363-1.011v-0.385c0-0.384-0.021-0.659-0.062-0.83c-0.04-0.169-0.11-0.303-0.213-0.396 s-0.271-0.169-0.504-0.229v-0.312h2.577v0.312c-0.152,0.053-0.269,0.11-0.345,0.177c-0.077,0.065-0.136,0.146-0.176,0.246 c-0.041,0.098-0.067,0.218-0.083,0.358c-0.015,0.145-0.021,0.347-0.021,0.61L7.279,91.325L7.279,91.325z"/> + <path fill="#231F20" d="M15.124,82.646v1.928h-0.625c-0.065-0.209-0.131-0.391-0.198-0.548c-0.069-0.159-0.139-0.29-0.211-0.397 c-0.072-0.104-0.152-0.189-0.24-0.255c-0.086-0.062-0.188-0.106-0.308-0.131c-0.12-0.023-0.264-0.034-0.43-0.034h-2.017v3.345 h1.366c0.187,0,0.333-0.026,0.438-0.08c0.107-0.054,0.194-0.145,0.268-0.271c0.067-0.127,0.136-0.327,0.199-0.6h0.601v2.451h-0.601 c-0.061-0.256-0.126-0.447-0.197-0.577c-0.072-0.129-0.158-0.225-0.258-0.278c-0.102-0.055-0.25-0.082-0.45-0.082h-1.366v3.682 h1.985c0.208,0,0.377-0.017,0.508-0.054c0.129-0.036,0.24-0.099,0.334-0.186c0.094-0.088,0.176-0.2,0.249-0.343 c0.072-0.139,0.134-0.284,0.182-0.437c0.05-0.151,0.117-0.371,0.201-0.66h0.632l-0.121,2.238H9.156v-0.312 c0.264-0.069,0.439-0.146,0.528-0.228c0.09-0.084,0.148-0.201,0.177-0.355c0.027-0.151,0.041-0.387,0.041-0.7V84.24 c0-0.293-0.011-0.507-0.031-0.641c-0.021-0.136-0.057-0.238-0.105-0.312c-0.049-0.075-0.114-0.135-0.193-0.18 c-0.082-0.045-0.22-0.095-0.416-0.15v-0.312H15.124z"/> + <path fill="#231F20" d="M18.621,87.573v2.171c0,0.307,0.013,0.528,0.036,0.666c0.021,0.139,0.059,0.243,0.104,0.312 c0.046,0.07,0.11,0.127,0.19,0.173c0.082,0.045,0.22,0.095,0.416,0.15v0.312h-2.694v-0.312c0.264-0.069,0.44-0.146,0.53-0.228 c0.09-0.084,0.146-0.201,0.176-0.355c0.027-0.151,0.041-0.387,0.041-0.7V84.24c0-0.293-0.011-0.507-0.032-0.641 c-0.021-0.136-0.056-0.238-0.104-0.312c-0.049-0.075-0.113-0.135-0.194-0.18s-0.219-0.096-0.415-0.15v-0.312h3.159 c0.996,0,1.741,0.181,2.233,0.542c0.493,0.361,0.74,0.924,0.74,1.686c0,0.584-0.161,1.078-0.48,1.487 c-0.322,0.407-0.805,0.729-1.446,0.958v0.052c0.26,0.105,0.483,0.257,0.667,0.455c0.186,0.197,0.391,0.505,0.616,0.923l0.573,1.047 c0.165,0.308,0.31,0.54,0.43,0.701c0.118,0.162,0.239,0.285,0.361,0.371c0.124,0.084,0.288,0.145,0.492,0.18v0.312h-1.769 c-0.161-0.227-0.314-0.469-0.459-0.729c-0.146-0.259-0.287-0.522-0.429-0.791l-0.562-1.064c-0.171-0.323-0.31-0.562-0.419-0.715 c-0.107-0.153-0.208-0.263-0.299-0.321c-0.092-0.063-0.189-0.106-0.294-0.13c-0.104-0.022-0.26-0.034-0.47-0.034h-0.7V87.573z M18.621,83.232v3.792h0.722c0.37,0,0.67-0.027,0.899-0.081c0.229-0.052,0.442-0.153,0.639-0.303 c0.196-0.148,0.353-0.354,0.47-0.621s0.175-0.594,0.175-0.98c0-0.405-0.068-0.74-0.207-1.008c-0.139-0.269-0.348-0.473-0.628-0.613 c-0.281-0.14-0.659-0.21-1.137-0.21C19.17,83.207,18.858,83.215,18.621,83.232"/> + <path fill="#231F20" d="M33.908,82.957c-0.188,0.048-0.322,0.095-0.405,0.142c-0.083,0.048-0.148,0.104-0.198,0.176 c-0.048,0.069-0.085,0.175-0.107,0.315c-0.023,0.141-0.035,0.357-0.035,0.65v5.522c0,0.283,0.01,0.493,0.028,0.625 c0.021,0.132,0.051,0.234,0.097,0.312c0.044,0.076,0.109,0.142,0.197,0.192c0.088,0.052,0.229,0.103,0.425,0.151v0.312h-2.661 v-0.312c0.242-0.06,0.41-0.127,0.503-0.203c0.095-0.076,0.157-0.188,0.191-0.339s0.053-0.396,0.053-0.739v-2.444 c0-0.645,0.009-1.294,0.028-1.952c0.019-0.656,0.04-1.104,0.065-1.349H31.98l-2.526,6.323h-0.734l-2.349-6.426h-0.107 c0.021,0.259,0.041,0.729,0.061,1.41c0.02,0.682,0.027,1.381,0.027,2.1v2.339c0,0.283,0.01,0.493,0.029,0.625 s0.051,0.234,0.096,0.312c0.045,0.076,0.11,0.142,0.198,0.192c0.087,0.052,0.229,0.103,0.424,0.151v0.312h-2.329v-0.312 c0.264-0.067,0.439-0.144,0.529-0.226c0.09-0.084,0.147-0.201,0.176-0.355c0.027-0.152,0.041-0.387,0.041-0.7V84.24 c0-0.293-0.01-0.508-0.031-0.641c-0.021-0.136-0.057-0.238-0.104-0.312c-0.049-0.075-0.114-0.135-0.195-0.18 c-0.08-0.045-0.219-0.096-0.414-0.15v-0.312h2.277l2.241,6.211l2.463-6.211h2.158v0.312H33.908z"/> + <path fill="#231F20" d="M39.761,91.357v-0.312c0.212-0.042,0.371-0.09,0.475-0.14c0.104-0.052,0.183-0.122,0.233-0.214 s0.076-0.214,0.076-0.367c0-0.145-0.018-0.302-0.051-0.469c-0.034-0.169-0.083-0.356-0.147-0.565l-0.235-0.823h-2.974l-0.218,0.625 c-0.11,0.315-0.184,0.555-0.217,0.716c-0.034,0.162-0.053,0.31-0.053,0.439c0,0.256,0.065,0.443,0.195,0.562 c0.13,0.118,0.329,0.195,0.596,0.234v0.312h-2.725v-0.312c0.239-0.039,0.445-0.176,0.623-0.415 c0.176-0.236,0.348-0.578,0.514-1.021l2.662-7.064h1.008l2.17,7.116c0.103,0.332,0.191,0.586,0.271,0.759 c0.079,0.176,0.174,0.312,0.284,0.409c0.109,0.097,0.262,0.171,0.453,0.217v0.312H39.761z M37.309,87.911h2.668l-1.213-4.116 L37.309,87.911z"/> + <path fill="#231F20" d="M48.722,87.905c0.152,0.256,0.281,0.479,0.386,0.669c0.104,0.192,0.214,0.408,0.323,0.646h0.082 c-0.021-0.26-0.04-0.773-0.058-1.549c-0.018-0.771-0.024-1.468-0.024-2.088V84.24c0-0.293-0.01-0.508-0.025-0.645 c-0.019-0.138-0.049-0.24-0.094-0.312c-0.044-0.072-0.105-0.131-0.185-0.176s-0.217-0.096-0.411-0.15v-0.312h2.297v0.312 c-0.19,0.053-0.327,0.1-0.405,0.142c-0.078,0.043-0.143,0.099-0.189,0.166c-0.05,0.067-0.087,0.17-0.113,0.307 c-0.023,0.137-0.038,0.359-0.038,0.67v7.155H49.47l-3.556-5.962c-0.223-0.369-0.378-0.642-0.474-0.812 c-0.094-0.171-0.18-0.338-0.262-0.504h-0.107c0.029,0.328,0.051,0.921,0.063,1.777c0.012,0.856,0.02,1.712,0.02,2.562v1.305 c0,0.283,0.01,0.493,0.027,0.625c0.021,0.132,0.052,0.234,0.096,0.312c0.047,0.076,0.112,0.142,0.198,0.192 c0.087,0.052,0.229,0.103,0.424,0.151v0.312h-2.328v-0.312c0.265-0.067,0.439-0.144,0.528-0.226 c0.09-0.084,0.147-0.201,0.177-0.355c0.026-0.151,0.041-0.387,0.041-0.7V84.24c0-0.293-0.012-0.507-0.031-0.641 c-0.021-0.136-0.058-0.238-0.105-0.312c-0.048-0.075-0.113-0.135-0.194-0.18s-0.22-0.096-0.414-0.15v-0.312h1.996L48.722,87.905z"/> + <path fill="#231F20" d="M60.498,87.905c0.151,0.256,0.281,0.479,0.387,0.669c0.104,0.192,0.212,0.408,0.322,0.646h0.083 c-0.021-0.26-0.04-0.773-0.059-1.549c-0.017-0.771-0.024-1.468-0.024-2.088V84.24c0-0.293-0.009-0.508-0.025-0.645 c-0.018-0.138-0.048-0.24-0.093-0.312c-0.044-0.072-0.107-0.131-0.187-0.176c-0.078-0.045-0.216-0.096-0.41-0.15v-0.312h2.298 v0.312c-0.192,0.053-0.327,0.1-0.405,0.142c-0.08,0.043-0.143,0.099-0.191,0.166s-0.086,0.17-0.111,0.307s-0.038,0.359-0.038,0.67 v7.155h-0.798l-3.556-5.962c-0.222-0.369-0.379-0.642-0.474-0.812c-0.093-0.171-0.179-0.338-0.261-0.504h-0.108 c0.03,0.328,0.051,0.921,0.064,1.777c0.012,0.856,0.019,1.712,0.019,2.562v1.305c0,0.283,0.01,0.493,0.028,0.625 s0.052,0.234,0.096,0.312c0.045,0.076,0.111,0.142,0.198,0.192c0.087,0.052,0.229,0.103,0.424,0.151v0.312h-2.33v-0.312 c0.266-0.067,0.441-0.144,0.53-0.226c0.09-0.084,0.147-0.201,0.176-0.355c0.027-0.151,0.042-0.387,0.042-0.7V84.24 c0-0.293-0.012-0.507-0.033-0.641c-0.021-0.136-0.056-0.238-0.104-0.312c-0.048-0.075-0.112-0.135-0.193-0.18 c-0.082-0.045-0.219-0.096-0.416-0.15v-0.312h1.999L60.498,87.905z"/> + <path fill="#231F20" d="M70.237,82.646v1.928h-0.626c-0.062-0.209-0.129-0.391-0.196-0.548c-0.069-0.159-0.141-0.29-0.21-0.397 c-0.073-0.104-0.153-0.189-0.24-0.255c-0.087-0.062-0.19-0.106-0.31-0.131c-0.119-0.023-0.262-0.034-0.429-0.034h-2.017v3.345 h1.365c0.188,0,0.334-0.026,0.44-0.08c0.105-0.054,0.193-0.145,0.266-0.271c0.068-0.127,0.137-0.327,0.199-0.6h0.602v2.451H68.48 c-0.06-0.256-0.126-0.447-0.195-0.577c-0.073-0.129-0.16-0.225-0.26-0.278c-0.101-0.055-0.251-0.082-0.45-0.082h-1.365v3.682h1.984 c0.208,0,0.378-0.017,0.509-0.054c0.13-0.036,0.239-0.099,0.335-0.186c0.093-0.088,0.176-0.2,0.248-0.343 c0.071-0.139,0.134-0.284,0.182-0.437c0.05-0.151,0.117-0.371,0.201-0.66H70.3l-0.121,2.239h-5.91v-0.312 c0.265-0.069,0.44-0.146,0.529-0.228c0.091-0.084,0.148-0.201,0.177-0.355c0.026-0.151,0.041-0.387,0.041-0.7v-5.521 c0-0.293-0.012-0.507-0.032-0.641c-0.021-0.136-0.056-0.238-0.104-0.312c-0.048-0.075-0.113-0.135-0.194-0.18 s-0.219-0.096-0.415-0.15v-0.312L70.237,82.646L70.237,82.646z"/> + <path fill="#231F20" d="M71.437,82.646h6.906v2.222h-0.626c-0.094-0.366-0.187-0.655-0.277-0.868 c-0.092-0.213-0.188-0.374-0.291-0.483c-0.102-0.111-0.211-0.19-0.329-0.236c-0.115-0.048-0.292-0.07-0.524-0.07h-0.812v6.536 c0,0.25,0.016,0.45,0.041,0.599c0.028,0.149,0.071,0.268,0.128,0.354c0.06,0.087,0.137,0.155,0.233,0.204s0.251,0.098,0.459,0.146 v0.312h-2.917v-0.312c0.128-0.031,0.241-0.062,0.339-0.097c0.099-0.035,0.179-0.076,0.239-0.126 c0.062-0.049,0.113-0.111,0.153-0.187c0.041-0.077,0.071-0.183,0.096-0.313c0.023-0.132,0.035-0.325,0.035-0.58v-6.536h-0.805 c-0.199,0-0.364,0.02-0.493,0.058c-0.132,0.039-0.251,0.118-0.361,0.239c-0.11,0.12-0.211,0.294-0.303,0.518 c-0.094,0.224-0.179,0.505-0.26,0.846h-0.632L71.437,82.646L71.437,82.646z"/> + <path fill="#231F20" d="M84.77,84.272l-2.042,7.131h-1.035l-1.855-6.933c-0.077-0.288-0.147-0.525-0.211-0.708 c-0.064-0.183-0.127-0.327-0.192-0.432c-0.062-0.104-0.132-0.184-0.206-0.235c-0.075-0.055-0.183-0.1-0.321-0.139v-0.312h2.729 v0.312c-0.263,0.052-0.447,0.128-0.552,0.229c-0.104,0.103-0.155,0.245-0.155,0.429c0,0.148,0.02,0.324,0.057,0.529 c0.039,0.204,0.094,0.437,0.161,0.695l1.281,5.041l2.055-7.236h1.074l1.665,7.245l1.507-4.869c0.184-0.595,0.273-1.016,0.273-1.268 c0-0.257-0.054-0.444-0.163-0.562c-0.107-0.113-0.287-0.192-0.539-0.235v-0.312h2.516v0.312c-0.128,0.043-0.229,0.091-0.307,0.146 c-0.077,0.052-0.15,0.125-0.221,0.216c-0.07,0.092-0.147,0.232-0.229,0.426c-0.084,0.19-0.18,0.448-0.29,0.771l-2.324,6.889h-0.912 L84.77,84.272z"/> + <path fill="#231F20" d="M94.727,91.459c-0.509,0-0.975-0.084-1.393-0.252c-0.42-0.168-0.779-0.429-1.08-0.785 c-0.299-0.354-0.531-0.81-0.695-1.361c-0.163-0.554-0.246-1.215-0.246-1.986c0-0.948,0.146-1.763,0.436-2.443 c0.289-0.681,0.703-1.198,1.241-1.555c0.537-0.354,1.162-0.532,1.874-0.532c0.757,0,1.395,0.168,1.91,0.501 c0.518,0.334,0.906,0.825,1.168,1.475c0.262,0.648,0.394,1.439,0.394,2.371c0,0.996-0.148,1.836-0.447,2.521 c-0.298,0.686-0.718,1.196-1.261,1.538C96.084,91.29,95.452,91.459,94.727,91.459 M92.628,86.896c0,1.307,0.188,2.301,0.57,2.979 c0.382,0.683,0.938,1.021,1.67,1.021c0.463,0,0.856-0.147,1.181-0.443c0.323-0.295,0.565-0.729,0.728-1.297 c0.162-0.571,0.242-1.237,0.242-1.999c0-0.928-0.095-1.696-0.284-2.308c-0.188-0.61-0.446-1.055-0.774-1.331 c-0.327-0.275-0.708-0.415-1.144-0.415c-0.383,0-0.711,0.089-0.983,0.269c-0.276,0.18-0.503,0.434-0.686,0.764 c-0.181,0.329-0.312,0.728-0.395,1.195S92.628,86.322,92.628,86.896"/> + <path fill="#231F20" d="M101.812,87.573v2.171c0,0.307,0.014,0.528,0.035,0.666c0.022,0.139,0.059,0.243,0.105,0.312 c0.046,0.07,0.11,0.127,0.189,0.173c0.082,0.045,0.221,0.095,0.416,0.15v0.312h-2.692v-0.312c0.264-0.069,0.44-0.146,0.529-0.228 c0.09-0.084,0.147-0.201,0.177-0.355c0.026-0.151,0.04-0.387,0.04-0.7V84.24c0-0.293-0.011-0.507-0.031-0.641 c-0.021-0.136-0.057-0.238-0.105-0.312c-0.048-0.075-0.113-0.135-0.192-0.18c-0.082-0.045-0.221-0.096-0.416-0.15v-0.312h3.159 c0.995,0,1.74,0.181,2.233,0.542S106,84.112,106,84.873c0,0.584-0.161,1.078-0.482,1.487c-0.321,0.407-0.804,0.729-1.444,0.958 v0.052c0.259,0.105,0.481,0.257,0.666,0.455c0.187,0.197,0.391,0.505,0.616,0.923l0.573,1.047c0.166,0.308,0.31,0.54,0.429,0.701 c0.119,0.162,0.239,0.285,0.363,0.371c0.123,0.084,0.287,0.145,0.491,0.18v0.312h-1.769c-0.161-0.227-0.314-0.469-0.46-0.729 c-0.145-0.259-0.286-0.522-0.428-0.791l-0.562-1.064c-0.171-0.323-0.311-0.562-0.418-0.715c-0.108-0.153-0.208-0.263-0.301-0.321 c-0.092-0.063-0.188-0.106-0.294-0.13c-0.104-0.022-0.26-0.034-0.47-0.034h-0.7V87.573z M101.812,83.232v3.792h0.722 c0.369,0,0.67-0.027,0.898-0.081c0.23-0.052,0.443-0.153,0.641-0.303c0.194-0.148,0.352-0.354,0.469-0.621s0.176-0.594,0.176-0.98 c0-0.405-0.069-0.74-0.208-1.008c-0.139-0.269-0.348-0.473-0.628-0.613c-0.282-0.14-0.659-0.21-1.137-0.21 C102.361,83.207,102.051,83.215,101.812,83.232"/> + <path fill="#231F20" d="M109.919,86.583h0.189c0.162,0,0.311-0.025,0.444-0.077c0.134-0.05,0.283-0.146,0.449-0.285 c0.166-0.143,0.42-0.402,0.76-0.786c0.409-0.455,0.688-0.786,0.837-0.989c0.188-0.242,0.312-0.446,0.376-0.613 c0.051-0.122,0.077-0.241,0.077-0.356c0-0.17-0.05-0.294-0.146-0.372c-0.099-0.08-0.231-0.127-0.401-0.146v-0.312h2.781v0.312 c-0.136,0.029-0.27,0.082-0.401,0.156s-0.267,0.177-0.405,0.306c-0.138,0.13-0.341,0.346-0.608,0.643l-2.146,2.415l2.324,3.375 c0.248,0.356,0.44,0.605,0.581,0.751c0.141,0.142,0.274,0.246,0.401,0.312c0.128,0.064,0.265,0.109,0.408,0.13v0.312h-2.814v-0.312 c0.158-0.013,0.271-0.042,0.345-0.09c0.072-0.045,0.109-0.116,0.109-0.21c0-0.077-0.024-0.169-0.074-0.276 c-0.048-0.108-0.126-0.239-0.233-0.393l-1.485-2.216c-0.175-0.265-0.303-0.438-0.383-0.523c-0.082-0.086-0.168-0.146-0.263-0.188 c-0.094-0.04-0.219-0.061-0.376-0.061h-0.34v2.674c0,0.283,0.011,0.493,0.029,0.625c0.02,0.132,0.052,0.234,0.096,0.312 c0.046,0.076,0.111,0.142,0.198,0.192c0.088,0.052,0.229,0.103,0.424,0.151v0.312h-2.687v-0.312 c0.264-0.067,0.439-0.144,0.529-0.226c0.089-0.084,0.146-0.201,0.175-0.355c0.028-0.151,0.041-0.387,0.041-0.7V84.24 c0-0.293-0.01-0.507-0.029-0.641c-0.021-0.136-0.059-0.238-0.106-0.312c-0.049-0.075-0.113-0.135-0.194-0.18 c-0.08-0.045-0.22-0.096-0.414-0.15v-0.312h2.687v0.312c-0.188,0.048-0.32,0.095-0.404,0.142c-0.082,0.048-0.148,0.104-0.198,0.176 c-0.049,0.069-0.086,0.175-0.107,0.315c-0.023,0.141-0.036,0.357-0.036,0.65L109.919,86.583z"/> + <path fill="#231F20" d="M124.912,82.646v1.928h-0.625c-0.095-0.289-0.186-0.521-0.272-0.702c-0.087-0.178-0.179-0.313-0.272-0.407 c-0.097-0.096-0.208-0.159-0.335-0.198c-0.129-0.038-0.297-0.058-0.506-0.058h-1.868v3.473h1.313c0.188,0,0.333-0.031,0.44-0.094 c0.105-0.062,0.193-0.166,0.265-0.31c0.069-0.146,0.137-0.369,0.201-0.669h0.6v2.69h-0.6c-0.064-0.287-0.133-0.507-0.205-0.652 c-0.071-0.146-0.157-0.251-0.259-0.312c-0.1-0.062-0.247-0.093-0.442-0.093h-1.313v2.503c0,0.255,0.014,0.459,0.044,0.612 c0.029,0.153,0.079,0.272,0.146,0.363c0.067,0.09,0.159,0.155,0.273,0.2c0.114,0.044,0.258,0.085,0.428,0.126v0.312h-2.833v-0.312 c0.264-0.069,0.439-0.146,0.529-0.228c0.09-0.084,0.146-0.201,0.176-0.355c0.027-0.151,0.042-0.387,0.042-0.7v-5.521 c0-0.293-0.012-0.507-0.033-0.641c-0.021-0.136-0.056-0.238-0.104-0.312c-0.049-0.075-0.113-0.135-0.193-0.18 c-0.082-0.045-0.219-0.096-0.415-0.15v-0.312L124.912,82.646L124.912,82.646z"/> + <path fill="#231F20" d="M129.412,91.459c-0.511,0-0.977-0.084-1.395-0.252c-0.42-0.168-0.78-0.429-1.08-0.785 c-0.299-0.354-0.53-0.81-0.694-1.361c-0.164-0.553-0.246-1.215-0.246-1.986c0-0.948,0.145-1.763,0.435-2.443 c0.289-0.681,0.702-1.198,1.241-1.555c0.538-0.354,1.163-0.532,1.874-0.532c0.757,0,1.394,0.168,1.911,0.501 c0.517,0.334,0.904,0.825,1.169,1.475c0.26,0.648,0.392,1.439,0.392,2.371c0,0.996-0.148,1.836-0.447,2.521 c-0.298,0.686-0.718,1.196-1.26,1.538C130.767,91.29,130.135,91.459,129.412,91.459 M127.311,86.896 c0,1.307,0.189,2.301,0.57,2.979c0.382,0.683,0.938,1.021,1.669,1.021c0.464,0,0.858-0.147,1.181-0.443 c0.324-0.295,0.566-0.729,0.729-1.297c0.162-0.571,0.243-1.237,0.243-1.999c0-0.928-0.097-1.696-0.285-2.308 c-0.189-0.61-0.447-1.055-0.775-1.331c-0.327-0.275-0.708-0.415-1.143-0.415c-0.383,0-0.712,0.089-0.985,0.269 c-0.274,0.18-0.503,0.434-0.684,0.764c-0.182,0.329-0.312,0.728-0.396,1.195C127.353,85.8,127.311,86.322,127.311,86.896"/> + <path fill="#231F20" d="M136.497,87.573v2.171c0,0.307,0.012,0.528,0.035,0.666c0.022,0.139,0.058,0.243,0.104,0.312 c0.047,0.07,0.11,0.127,0.191,0.173c0.081,0.045,0.219,0.095,0.415,0.15v0.312h-2.693v-0.312c0.264-0.069,0.438-0.146,0.528-0.228 c0.091-0.084,0.147-0.201,0.177-0.355c0.027-0.151,0.042-0.387,0.042-0.7V84.24c0-0.293-0.012-0.507-0.033-0.641 c-0.021-0.136-0.056-0.238-0.104-0.312c-0.049-0.075-0.113-0.135-0.193-0.18c-0.082-0.045-0.22-0.096-0.415-0.15v-0.312h3.159 c0.994,0,1.74,0.181,2.233,0.542c0.492,0.361,0.74,0.924,0.74,1.686c0,0.584-0.162,1.078-0.482,1.487 c-0.319,0.407-0.803,0.729-1.445,0.958v0.052c0.26,0.105,0.483,0.257,0.668,0.455c0.185,0.197,0.391,0.505,0.614,0.923l0.574,1.047 c0.165,0.308,0.31,0.54,0.429,0.701c0.119,0.162,0.238,0.285,0.362,0.371c0.124,0.084,0.288,0.145,0.492,0.18v0.312h-1.769 c-0.16-0.227-0.313-0.469-0.459-0.729c-0.146-0.259-0.286-0.522-0.428-0.791l-0.562-1.064c-0.171-0.323-0.31-0.562-0.418-0.715 c-0.109-0.153-0.209-0.263-0.3-0.321c-0.091-0.063-0.188-0.106-0.294-0.13c-0.104-0.022-0.262-0.034-0.471-0.034h-0.698V87.573z M136.497,83.232v3.792h0.721c0.37,0,0.671-0.027,0.899-0.081c0.229-0.052,0.442-0.153,0.639-0.303 c0.196-0.148,0.353-0.354,0.469-0.621c0.119-0.267,0.176-0.594,0.176-0.98c0-0.405-0.068-0.74-0.206-1.008 c-0.14-0.269-0.349-0.473-0.629-0.613c-0.281-0.14-0.659-0.21-1.136-0.21C137.045,83.207,136.733,83.215,136.497,83.232"/> + <path fill="#231F20" d="M145.546,91.357v-0.312c0.265-0.067,0.439-0.144,0.53-0.226c0.09-0.084,0.147-0.201,0.176-0.355 c0.026-0.151,0.041-0.387,0.041-0.7v-5.521c0-0.293-0.01-0.508-0.032-0.641c-0.021-0.136-0.056-0.238-0.104-0.312 c-0.051-0.075-0.115-0.135-0.195-0.18s-0.219-0.096-0.415-0.15v-0.312h3.492c0.676,0,1.221,0.072,1.631,0.216 c0.41,0.146,0.716,0.36,0.916,0.643c0.199,0.283,0.3,0.648,0.3,1.096c0,0.371-0.071,0.691-0.215,0.965 c-0.143,0.271-0.328,0.496-0.56,0.676c-0.229,0.179-0.524,0.343-0.886,0.498v0.057c0.577,0.175,1.018,0.444,1.314,0.809 c0.298,0.361,0.446,0.797,0.446,1.3c0,0.578-0.129,1.05-0.387,1.416s-0.618,0.632-1.081,0.795 c-0.464,0.164-1.025,0.245-1.687,0.245h-3.286V91.357z M148.603,86.552c0.647,0,1.143-0.156,1.484-0.47 c0.343-0.312,0.514-0.767,0.514-1.362c0-0.293-0.048-0.537-0.144-0.73c-0.098-0.193-0.229-0.348-0.396-0.464 c-0.168-0.113-0.366-0.196-0.596-0.245c-0.23-0.05-0.48-0.072-0.747-0.072c-0.163,0-0.375,0.004-0.64,0.013 c-0.265,0.008-0.461,0.018-0.595,0.024v3.308L148.603,86.552L148.603,86.552z M147.486,90.75c0.312,0.03,0.657,0.045,1.041,0.045 c0.559,0,0.991-0.069,1.3-0.21c0.309-0.142,0.529-0.349,0.67-0.622c0.139-0.273,0.207-0.618,0.207-1.03 c0-0.413-0.074-0.754-0.227-1.021c-0.15-0.269-0.384-0.469-0.7-0.601c-0.313-0.132-0.749-0.197-1.302-0.197h-0.989V90.75z"/> + <path fill="#231F20" d="M155.484,89.763c0,0.283,0.012,0.493,0.028,0.625c0.021,0.132,0.051,0.234,0.097,0.312 c0.044,0.076,0.108,0.142,0.196,0.192c0.088,0.052,0.229,0.103,0.426,0.151v0.312h-2.693v-0.312 c0.264-0.067,0.44-0.144,0.529-0.226c0.091-0.084,0.148-0.201,0.177-0.355c0.026-0.151,0.042-0.388,0.042-0.7V84.24 c0-0.293-0.013-0.507-0.033-0.641c-0.021-0.136-0.057-0.238-0.105-0.312c-0.049-0.075-0.112-0.135-0.192-0.18 c-0.082-0.045-0.221-0.096-0.416-0.15v-0.312h2.693v0.312c-0.187,0.048-0.322,0.095-0.404,0.142 c-0.084,0.048-0.15,0.104-0.198,0.176c-0.049,0.069-0.084,0.175-0.108,0.315c-0.021,0.141-0.035,0.357-0.035,0.65v5.522H155.484z"/> + <path fill="#231F20" d="M161.178,91.459c-0.511,0-0.976-0.084-1.395-0.252s-0.779-0.429-1.079-0.785 c-0.301-0.354-0.531-0.81-0.694-1.361c-0.165-0.554-0.247-1.215-0.247-1.986c0-0.948,0.146-1.763,0.436-2.443 c0.288-0.681,0.702-1.198,1.24-1.555c0.539-0.354,1.163-0.532,1.874-0.532c0.757,0,1.395,0.168,1.91,0.501 c0.52,0.334,0.906,0.825,1.169,1.475c0.261,0.648,0.394,1.439,0.394,2.371c0,0.996-0.149,1.836-0.448,2.521 c-0.296,0.686-0.717,1.196-1.259,1.538C162.535,91.29,161.901,91.459,161.178,91.459 M159.078,86.896 c0,1.307,0.189,2.301,0.57,2.979c0.381,0.683,0.938,1.021,1.67,1.021c0.464,0,0.856-0.147,1.181-0.443 c0.324-0.295,0.566-0.729,0.729-1.297c0.161-0.571,0.242-1.237,0.242-1.999c0-0.928-0.095-1.696-0.284-2.308 c-0.188-0.61-0.446-1.055-0.774-1.331c-0.327-0.275-0.709-0.415-1.144-0.415c-0.383,0-0.711,0.089-0.985,0.269 s-0.504,0.434-0.683,0.764c-0.182,0.329-0.312,0.728-0.396,1.195C159.121,85.8,159.078,86.322,159.078,86.896"/> + <path fill="#231F20" d="M168.264,89.763c0,0.283,0.01,0.493,0.027,0.625c0.021,0.132,0.052,0.234,0.097,0.312 c0.045,0.076,0.11,0.142,0.197,0.192c0.088,0.052,0.229,0.103,0.426,0.151v0.312h-2.695v-0.312c0.266-0.067,0.441-0.144,0.53-0.226 c0.091-0.084,0.148-0.201,0.177-0.355c0.027-0.151,0.042-0.388,0.042-0.7V84.24c0-0.293-0.012-0.507-0.033-0.641 c-0.021-0.136-0.056-0.238-0.104-0.312c-0.049-0.075-0.113-0.135-0.193-0.18c-0.082-0.045-0.22-0.096-0.417-0.15v-0.312h2.695 v0.312c-0.188,0.048-0.323,0.095-0.405,0.142c-0.084,0.048-0.148,0.104-0.197,0.176c-0.05,0.069-0.085,0.175-0.108,0.315 s-0.035,0.357-0.035,0.65v5.522H168.264z"/> + <path fill="#231F20" d="M175.68,87.905c0.154,0.256,0.282,0.479,0.386,0.669c0.105,0.192,0.213,0.408,0.324,0.646h0.082 c-0.021-0.26-0.04-0.773-0.059-1.549c-0.018-0.771-0.023-1.468-0.023-2.088V84.24c0-0.293-0.009-0.508-0.025-0.645 c-0.018-0.138-0.049-0.24-0.094-0.312s-0.104-0.131-0.186-0.176c-0.078-0.045-0.216-0.096-0.411-0.15v-0.312h2.299v0.312 c-0.193,0.053-0.327,0.1-0.407,0.142c-0.077,0.043-0.142,0.099-0.188,0.166c-0.051,0.067-0.087,0.17-0.113,0.307 c-0.024,0.137-0.037,0.359-0.037,0.67v7.155h-0.799l-3.555-5.962c-0.223-0.369-0.38-0.642-0.474-0.812 c-0.093-0.171-0.181-0.338-0.262-0.504h-0.107c0.027,0.328,0.051,0.921,0.063,1.777c0.012,0.856,0.018,1.712,0.018,2.562v1.305 c0,0.283,0.011,0.493,0.029,0.625c0.021,0.132,0.051,0.234,0.096,0.312c0.046,0.076,0.111,0.142,0.197,0.192 c0.088,0.052,0.229,0.103,0.425,0.151v0.312h-2.328v-0.312c0.264-0.067,0.438-0.144,0.528-0.226 c0.09-0.084,0.148-0.201,0.176-0.355c0.027-0.151,0.042-0.387,0.042-0.7V84.24c0-0.293-0.012-0.507-0.031-0.641 c-0.021-0.136-0.059-0.238-0.106-0.312c-0.048-0.075-0.113-0.135-0.192-0.18c-0.081-0.045-0.221-0.096-0.415-0.15v-0.312h1.997 L175.68,87.905z"/> + <path fill="#231F20" d="M185.272,82.646v1.928h-0.625c-0.094-0.289-0.186-0.521-0.271-0.702c-0.088-0.178-0.18-0.313-0.273-0.407 c-0.098-0.096-0.209-0.159-0.336-0.198c-0.128-0.038-0.295-0.058-0.504-0.058h-1.87v3.473h1.315c0.187,0,0.334-0.031,0.439-0.094 c0.105-0.062,0.193-0.166,0.266-0.31c0.068-0.146,0.137-0.369,0.199-0.669h0.602v2.69h-0.602c-0.062-0.287-0.132-0.507-0.203-0.652 c-0.072-0.146-0.16-0.251-0.26-0.312c-0.1-0.061-0.246-0.093-0.441-0.093h-1.315v2.503c0,0.255,0.017,0.459,0.045,0.612 s0.078,0.272,0.146,0.363c0.068,0.09,0.16,0.155,0.273,0.2c0.116,0.044,0.26,0.085,0.43,0.126v0.312h-2.836v-0.312 c0.266-0.069,0.441-0.146,0.531-0.228c0.09-0.084,0.148-0.201,0.176-0.355c0.027-0.151,0.041-0.387,0.041-0.7v-5.521 c0-0.293-0.012-0.507-0.031-0.641c-0.021-0.136-0.057-0.238-0.104-0.312c-0.051-0.075-0.114-0.135-0.194-0.18 c-0.082-0.045-0.22-0.096-0.416-0.15v-0.312L185.272,82.646L185.272,82.646z"/> + <path fill="#231F20" d="M189.772,91.459c-0.51,0-0.975-0.084-1.395-0.252s-0.777-0.429-1.078-0.785 c-0.301-0.354-0.531-0.81-0.694-1.361c-0.165-0.554-0.247-1.215-0.247-1.986c0-0.948,0.145-1.763,0.436-2.443 c0.287-0.681,0.703-1.198,1.24-1.555c0.539-0.354,1.162-0.532,1.873-0.532c0.758,0,1.396,0.168,1.912,0.501 c0.518,0.334,0.905,0.825,1.168,1.475c0.262,0.648,0.393,1.439,0.393,2.371c0,0.996-0.149,1.836-0.446,2.521 c-0.299,0.686-0.72,1.196-1.261,1.538C191.129,91.29,190.497,91.459,189.772,91.459 M187.672,86.896 c0,1.307,0.191,2.301,0.572,2.979c0.381,0.683,0.938,1.021,1.67,1.021c0.463,0,0.855-0.147,1.18-0.443 c0.324-0.295,0.566-0.729,0.729-1.297c0.161-0.571,0.242-1.237,0.242-1.999c0-0.928-0.095-1.696-0.283-2.308 c-0.189-0.61-0.447-1.055-0.775-1.331c-0.327-0.275-0.709-0.415-1.143-0.415c-0.384,0-0.713,0.089-0.986,0.269 c-0.275,0.18-0.502,0.434-0.684,0.764c-0.181,0.329-0.312,0.728-0.396,1.195S187.672,86.322,187.672,86.896"/> + <path fill="#231F20" d="M196.857,87.573v2.171c0,0.307,0.013,0.528,0.036,0.666c0.021,0.139,0.057,0.243,0.104,0.312 c0.049,0.07,0.111,0.127,0.191,0.173c0.081,0.045,0.219,0.095,0.415,0.15v0.312h-2.692v-0.312c0.264-0.069,0.439-0.146,0.528-0.228 c0.09-0.084,0.149-0.201,0.177-0.355c0.027-0.151,0.041-0.387,0.041-0.7V84.24c0-0.293-0.011-0.507-0.033-0.641 c-0.02-0.136-0.055-0.238-0.104-0.312c-0.049-0.075-0.113-0.135-0.193-0.18c-0.082-0.045-0.22-0.096-0.416-0.15v-0.312h3.159 c0.996,0,1.741,0.181,2.234,0.542s0.739,0.924,0.739,1.686c0,0.584-0.16,1.078-0.481,1.487c-0.321,0.407-0.803,0.729-1.444,0.958 v0.052c0.258,0.105,0.482,0.257,0.666,0.455c0.187,0.197,0.391,0.505,0.616,0.923l0.575,1.047c0.164,0.308,0.309,0.54,0.428,0.701 c0.117,0.162,0.239,0.285,0.363,0.371c0.123,0.084,0.286,0.145,0.49,0.18v0.312h-1.768c-0.162-0.227-0.314-0.469-0.46-0.729 c-0.146-0.259-0.288-0.522-0.429-0.791l-0.562-1.064c-0.168-0.323-0.309-0.562-0.416-0.715c-0.108-0.153-0.209-0.263-0.302-0.321 c-0.091-0.063-0.188-0.106-0.293-0.13c-0.104-0.022-0.261-0.034-0.47-0.034h-0.7V87.573z M196.857,83.232v3.792h0.722 c0.371,0,0.67-0.027,0.899-0.081c0.229-0.052,0.442-0.153,0.64-0.303c0.194-0.148,0.353-0.354,0.469-0.621 c0.117-0.267,0.176-0.594,0.176-0.98c0-0.405-0.069-0.74-0.207-1.008c-0.139-0.269-0.35-0.473-0.629-0.613 c-0.281-0.14-0.659-0.21-1.137-0.21C197.407,83.207,197.096,83.215,196.857,83.232"/> + <path fill="#231F20" d="M212.144,82.957c-0.187,0.048-0.321,0.095-0.403,0.142c-0.084,0.048-0.148,0.104-0.199,0.176 c-0.049,0.069-0.084,0.175-0.107,0.315c-0.021,0.141-0.035,0.357-0.035,0.65v5.522c0,0.283,0.01,0.493,0.028,0.625 c0.021,0.132,0.051,0.234,0.097,0.312c0.044,0.076,0.109,0.142,0.197,0.192c0.087,0.052,0.229,0.103,0.424,0.151v0.312h-2.661 v-0.312c0.243-0.06,0.411-0.127,0.505-0.203s0.158-0.188,0.19-0.339c0.034-0.15,0.052-0.396,0.052-0.739v-2.444 c0-0.645,0.01-1.294,0.029-1.952c0.02-0.656,0.041-1.104,0.066-1.349h-0.108l-2.527,6.323h-0.733l-2.35-6.426H204.5 c0.021,0.259,0.043,0.729,0.06,1.41c0.021,0.682,0.028,1.381,0.028,2.1v2.339c0,0.283,0.011,0.493,0.029,0.625 c0.02,0.132,0.053,0.234,0.096,0.312c0.046,0.076,0.111,0.142,0.197,0.192c0.088,0.052,0.229,0.103,0.426,0.151v0.312h-2.33v-0.312 c0.264-0.067,0.439-0.144,0.527-0.226c0.092-0.084,0.15-0.201,0.178-0.355c0.027-0.152,0.041-0.387,0.041-0.7V84.24 c0-0.293-0.01-0.508-0.032-0.641c-0.021-0.136-0.056-0.238-0.104-0.312c-0.049-0.075-0.113-0.135-0.193-0.18 s-0.219-0.096-0.416-0.15v-0.312h2.279l2.24,6.211l2.465-6.211h2.155v0.312H212.144z"/> + <path fill="#231F20" d="M217.999,91.357v-0.312c0.211-0.042,0.371-0.09,0.475-0.14c0.104-0.052,0.182-0.122,0.232-0.214 s0.078-0.214,0.078-0.367c0-0.145-0.02-0.302-0.053-0.469c-0.033-0.169-0.083-0.356-0.146-0.565l-0.235-0.823h-2.976l-0.217,0.625 c-0.111,0.315-0.183,0.555-0.219,0.716c-0.031,0.162-0.05,0.31-0.05,0.439c0,0.256,0.065,0.443,0.194,0.562 c0.131,0.118,0.328,0.195,0.597,0.234v0.312h-2.726v-0.312c0.238-0.039,0.445-0.176,0.623-0.415 c0.178-0.236,0.348-0.578,0.514-1.021l2.66-7.064h1.01l2.171,7.116c0.103,0.332,0.192,0.586,0.271,0.759 c0.078,0.176,0.174,0.312,0.285,0.409c0.11,0.098,0.262,0.171,0.451,0.217v0.312H217.999z M215.547,87.911h2.666l-1.211-4.116 L215.547,87.911z"/> + <path fill="#231F20" d="M220.717,82.646h6.904v2.222h-0.625c-0.094-0.366-0.187-0.655-0.277-0.868 c-0.092-0.213-0.188-0.374-0.291-0.483c-0.104-0.111-0.211-0.19-0.328-0.236c-0.116-0.048-0.293-0.07-0.525-0.07h-0.812v6.536 c0,0.25,0.014,0.45,0.042,0.599c0.025,0.149,0.07,0.268,0.127,0.354c0.059,0.087,0.136,0.155,0.234,0.204 c0.097,0.049,0.25,0.098,0.459,0.146v0.312h-2.918v-0.312c0.129-0.031,0.24-0.062,0.34-0.097c0.097-0.035,0.176-0.076,0.238-0.126 c0.062-0.049,0.112-0.111,0.152-0.187c0.04-0.077,0.072-0.183,0.098-0.313c0.022-0.132,0.033-0.325,0.033-0.58v-6.536h-0.804 c-0.2,0-0.366,0.02-0.495,0.058c-0.13,0.039-0.25,0.118-0.359,0.239c-0.111,0.12-0.213,0.294-0.305,0.518 c-0.091,0.224-0.177,0.505-0.259,0.846h-0.632v-2.224H220.717z"/> + <path fill="#231F20" d="M230.763,89.763c0,0.283,0.01,0.493,0.028,0.625c0.02,0.132,0.051,0.234,0.097,0.312 c0.044,0.076,0.108,0.142,0.196,0.192c0.088,0.052,0.229,0.103,0.426,0.151v0.312h-2.694v-0.312c0.265-0.067,0.44-0.144,0.53-0.226 c0.089-0.084,0.148-0.201,0.176-0.355c0.027-0.151,0.041-0.388,0.041-0.7V84.24c0-0.293-0.011-0.507-0.031-0.641 c-0.021-0.136-0.058-0.238-0.105-0.312c-0.049-0.075-0.113-0.135-0.194-0.18s-0.22-0.096-0.415-0.15v-0.312h2.694v0.312 c-0.188,0.048-0.323,0.095-0.405,0.142c-0.084,0.048-0.15,0.104-0.199,0.176c-0.049,0.069-0.084,0.175-0.106,0.315 c-0.024,0.141-0.035,0.357-0.035,0.65v5.522H230.763z"/> + <path fill="#231F20" d="M238.933,82.83v1.769h-0.632c-0.102-0.37-0.232-0.665-0.391-0.885c-0.156-0.22-0.341-0.376-0.549-0.47 c-0.207-0.093-0.459-0.14-0.754-0.14c-0.438,0-0.828,0.146-1.17,0.438c-0.344,0.292-0.613,0.729-0.809,1.314 c-0.196,0.585-0.293,1.293-0.293,2.122c0,0.833,0.08,1.545,0.242,2.135s0.399,1.034,0.715,1.334c0.314,0.301,0.701,0.45,1.162,0.45 c0.348,0,0.633-0.05,0.854-0.149c0.221-0.101,0.408-0.259,0.561-0.477c0.15-0.216,0.293-0.536,0.43-0.957h0.633v1.825 c-0.4,0.105-0.809,0.187-1.229,0.239c-0.42,0.054-0.881,0.079-1.383,0.079c-1.08,0-1.898-0.366-2.451-1.097 c-0.554-0.732-0.828-1.824-0.828-3.274c0-0.912,0.143-1.709,0.43-2.394c0.287-0.688,0.71-1.215,1.268-1.59 c0.559-0.374,1.223-0.562,1.998-0.562c0.387,0,0.744,0.021,1.071,0.062C238.137,82.645,238.511,82.72,238.933,82.83"/> + <path fill="#231F20" d="M240.905,89.372c0.086,0.375,0.2,0.67,0.346,0.889c0.144,0.217,0.332,0.378,0.562,0.48 c0.229,0.104,0.524,0.156,0.886,0.156c0.5,0,0.881-0.129,1.146-0.39c0.267-0.261,0.4-0.639,0.4-1.137 c0-0.317-0.057-0.587-0.168-0.804c-0.109-0.218-0.291-0.422-0.541-0.612c-0.252-0.192-0.636-0.416-1.148-0.672 c-0.498-0.246-0.893-0.488-1.182-0.724c-0.291-0.235-0.506-0.492-0.647-0.771c-0.144-0.274-0.215-0.577-0.215-0.905 c0-0.478,0.112-0.89,0.336-1.239c0.224-0.353,0.551-0.623,0.981-0.814c0.434-0.19,0.928-0.287,1.484-0.287 c0.322,0,0.641,0.018,0.947,0.053c0.309,0.032,0.693,0.108,1.158,0.229v1.723h-0.631c-0.1-0.375-0.222-0.667-0.371-0.874 c-0.148-0.209-0.322-0.354-0.522-0.438c-0.201-0.083-0.46-0.123-0.778-0.123c-0.277,0-0.525,0.051-0.744,0.152 c-0.22,0.103-0.393,0.256-0.521,0.463c-0.129,0.206-0.19,0.452-0.19,0.736c0,0.304,0.055,0.559,0.162,0.768 c0.108,0.207,0.275,0.4,0.508,0.581c0.229,0.178,0.57,0.378,1.021,0.599c0.544,0.272,0.967,0.526,1.267,0.76 c0.301,0.234,0.535,0.5,0.702,0.803c0.169,0.299,0.252,0.648,0.252,1.049c0,0.445-0.069,0.825-0.21,1.134 c-0.141,0.308-0.335,0.56-0.584,0.753s-0.547,0.334-0.895,0.422c-0.346,0.086-0.728,0.13-1.139,0.13 c-0.668,0-1.438-0.112-2.311-0.338v-1.75H240.905z"/> + <path fill="#231F20" d="M251.633,89.763c0,0.283,0.01,0.493,0.027,0.625c0.021,0.132,0.053,0.234,0.098,0.312 c0.044,0.076,0.109,0.142,0.197,0.192c0.086,0.052,0.229,0.103,0.424,0.151v0.312h-2.692v-0.312 c0.265-0.067,0.44-0.144,0.528-0.226c0.09-0.084,0.148-0.201,0.177-0.355c0.028-0.151,0.042-0.388,0.042-0.7V84.24 c0-0.293-0.012-0.507-0.033-0.641c-0.021-0.136-0.057-0.238-0.105-0.312c-0.049-0.075-0.112-0.135-0.192-0.18 c-0.081-0.045-0.219-0.096-0.415-0.15v-0.312h2.693v0.312c-0.188,0.048-0.323,0.095-0.405,0.142 c-0.084,0.048-0.149,0.104-0.198,0.176c-0.049,0.069-0.085,0.175-0.107,0.315c-0.023,0.141-0.035,0.357-0.035,0.65v5.522H251.633z"/> + <path fill="#231F20" d="M259.049,87.905c0.154,0.256,0.281,0.479,0.387,0.669c0.104,0.192,0.212,0.408,0.322,0.646h0.082 c-0.021-0.26-0.039-0.773-0.057-1.549c-0.018-0.771-0.025-1.468-0.025-2.088V84.24c0-0.293-0.008-0.508-0.025-0.645 c-0.018-0.138-0.048-0.24-0.093-0.312c-0.044-0.072-0.106-0.131-0.185-0.176c-0.08-0.045-0.217-0.096-0.412-0.15v-0.312h2.299 v0.312c-0.193,0.053-0.327,0.1-0.405,0.142c-0.08,0.043-0.144,0.099-0.192,0.166s-0.086,0.17-0.111,0.307s-0.037,0.359-0.037,0.67 v7.155h-0.799l-3.555-5.962c-0.222-0.369-0.381-0.642-0.474-0.812c-0.093-0.171-0.181-0.338-0.263-0.504H255.4 c0.029,0.328,0.052,0.921,0.063,1.777s0.018,1.712,0.018,2.562v1.305c0,0.283,0.01,0.493,0.029,0.625s0.052,0.234,0.096,0.312 c0.045,0.076,0.111,0.142,0.197,0.192c0.09,0.052,0.229,0.103,0.425,0.151v0.312h-2.329v-0.312c0.264-0.067,0.441-0.144,0.53-0.226 c0.089-0.084,0.147-0.201,0.176-0.355c0.026-0.151,0.041-0.387,0.041-0.7V84.24c0-0.293-0.011-0.507-0.032-0.641 c-0.021-0.136-0.057-0.238-0.104-0.312c-0.05-0.075-0.113-0.135-0.194-0.18c-0.08-0.045-0.22-0.096-0.415-0.15v-0.312h1.999 L259.049,87.905z"/> + <path fill="#231F20" d="M268.644,82.646v1.928h-0.625c-0.095-0.289-0.185-0.521-0.272-0.702c-0.086-0.178-0.178-0.313-0.272-0.407 c-0.097-0.096-0.208-0.159-0.335-0.198c-0.129-0.038-0.296-0.058-0.506-0.058h-1.869v3.473h1.316c0.186,0,0.332-0.031,0.438-0.094 c0.106-0.062,0.194-0.166,0.265-0.31c0.069-0.146,0.139-0.369,0.2-0.669h0.603v2.69h-0.603c-0.062-0.287-0.132-0.507-0.204-0.652 c-0.07-0.146-0.158-0.251-0.259-0.312s-0.246-0.093-0.44-0.093h-1.316v2.503c0,0.255,0.016,0.459,0.046,0.612 c0.028,0.153,0.078,0.272,0.146,0.363c0.068,0.09,0.16,0.155,0.274,0.2c0.114,0.044,0.256,0.085,0.427,0.126v0.312h-2.834v-0.312 c0.264-0.069,0.44-0.146,0.529-0.228c0.091-0.084,0.148-0.201,0.176-0.355c0.028-0.151,0.042-0.387,0.042-0.7v-5.521 c0-0.293-0.011-0.507-0.032-0.641c-0.021-0.136-0.056-0.238-0.104-0.312c-0.049-0.075-0.115-0.135-0.195-0.18 s-0.219-0.096-0.415-0.15v-0.312L268.644,82.646L268.644,82.646z"/> + <path fill="#231F20" d="M271.782,87.573v2.171c0,0.307,0.012,0.528,0.035,0.666c0.023,0.139,0.059,0.243,0.105,0.312 c0.047,0.07,0.109,0.127,0.191,0.173c0.079,0.045,0.219,0.095,0.414,0.15v0.312h-2.695v-0.312c0.267-0.069,0.441-0.146,0.533-0.228 c0.088-0.084,0.146-0.201,0.176-0.355c0.025-0.151,0.039-0.387,0.039-0.7V84.24c0-0.293-0.01-0.507-0.03-0.641 c-0.021-0.136-0.058-0.238-0.104-0.312c-0.051-0.075-0.115-0.135-0.195-0.18s-0.219-0.096-0.416-0.15v-0.312h3.16 c0.996,0,1.74,0.181,2.234,0.542c0.493,0.361,0.739,0.924,0.739,1.686c0,0.584-0.161,1.078-0.481,1.487 c-0.32,0.407-0.804,0.729-1.445,0.958v0.052c0.261,0.105,0.481,0.257,0.668,0.455c0.186,0.197,0.391,0.505,0.615,0.923l0.574,1.047 c0.165,0.308,0.309,0.54,0.428,0.701c0.119,0.162,0.24,0.285,0.364,0.371c0.122,0.084,0.286,0.145,0.491,0.18v0.312h-1.768 c-0.162-0.227-0.315-0.469-0.461-0.729c-0.146-0.259-0.287-0.522-0.428-0.791l-0.562-1.064c-0.171-0.323-0.31-0.562-0.419-0.715 c-0.108-0.153-0.209-0.263-0.299-0.321c-0.092-0.063-0.19-0.106-0.295-0.13c-0.104-0.022-0.262-0.034-0.469-0.034h-0.701V87.573z M271.782,83.232v3.792h0.723c0.369,0,0.67-0.027,0.898-0.081c0.23-0.052,0.443-0.153,0.639-0.303 c0.195-0.148,0.354-0.354,0.471-0.621s0.175-0.594,0.175-0.98c0-0.405-0.067-0.74-0.208-1.008 c-0.139-0.269-0.348-0.473-0.629-0.613c-0.28-0.14-0.659-0.21-1.135-0.21C272.331,83.207,272.021,83.215,271.782,83.232"/> + <path fill="#231F20" d="M282.265,91.357v-0.312c0.211-0.042,0.368-0.09,0.474-0.14c0.104-0.052,0.184-0.122,0.234-0.214 c0.05-0.092,0.074-0.214,0.074-0.367c0-0.145-0.016-0.302-0.049-0.469c-0.035-0.169-0.084-0.356-0.147-0.565l-0.235-0.823h-2.977 l-0.215,0.625c-0.111,0.315-0.186,0.555-0.219,0.716c-0.033,0.162-0.051,0.31-0.051,0.439c0,0.256,0.064,0.443,0.194,0.562 c0.129,0.118,0.329,0.195,0.597,0.234v0.312h-2.726v-0.312c0.239-0.039,0.444-0.176,0.622-0.415 c0.177-0.236,0.348-0.578,0.514-1.021l2.661-7.064h1.011l2.17,7.116c0.102,0.332,0.191,0.586,0.271,0.759 c0.078,0.176,0.172,0.312,0.283,0.409s0.263,0.171,0.453,0.217v0.312H282.265z M279.811,87.911h2.669l-1.214-4.116L279.811,87.911z "/> + <path fill="#231F20" d="M286.489,89.372c0.086,0.375,0.2,0.67,0.344,0.889c0.146,0.217,0.332,0.378,0.562,0.48 c0.23,0.104,0.525,0.156,0.889,0.156c0.498,0,0.879-0.129,1.146-0.39c0.266-0.261,0.399-0.639,0.399-1.137 c0-0.317-0.058-0.587-0.168-0.804c-0.109-0.218-0.291-0.422-0.543-0.612c-0.25-0.192-0.633-0.416-1.147-0.672 c-0.498-0.246-0.892-0.488-1.181-0.724s-0.506-0.492-0.647-0.771c-0.142-0.274-0.214-0.577-0.214-0.905 c0-0.478,0.111-0.89,0.334-1.239c0.225-0.353,0.552-0.623,0.982-0.814c0.432-0.19,0.928-0.287,1.485-0.287 c0.322,0,0.64,0.018,0.947,0.053c0.309,0.032,0.694,0.108,1.157,0.229v1.723h-0.631c-0.099-0.375-0.223-0.667-0.371-0.874 c-0.148-0.209-0.322-0.354-0.522-0.438s-0.459-0.123-0.778-0.123c-0.277,0-0.523,0.051-0.744,0.152 c-0.219,0.103-0.394,0.256-0.521,0.463c-0.128,0.206-0.19,0.452-0.19,0.736c0,0.304,0.053,0.559,0.164,0.768 c0.106,0.207,0.274,0.4,0.506,0.581c0.229,0.178,0.569,0.378,1.021,0.599c0.546,0.272,0.969,0.526,1.269,0.76 c0.299,0.234,0.533,0.5,0.703,0.803c0.168,0.299,0.25,0.648,0.25,1.049c0,0.445-0.068,0.825-0.209,1.134 c-0.141,0.308-0.336,0.56-0.585,0.753c-0.247,0.193-0.547,0.334-0.894,0.422c-0.348,0.086-0.727,0.13-1.141,0.13 c-0.666,0-1.438-0.112-2.311-0.338v-1.75H286.489z"/> + <path fill="#231F20" d="M291.881,82.646h6.906v2.222h-0.625c-0.095-0.366-0.188-0.655-0.277-0.868 c-0.092-0.213-0.188-0.374-0.291-0.483c-0.102-0.111-0.211-0.19-0.328-0.236c-0.116-0.048-0.292-0.07-0.525-0.07h-0.812v6.536 c0,0.25,0.014,0.45,0.042,0.599c0.025,0.149,0.07,0.268,0.127,0.354c0.059,0.087,0.135,0.155,0.234,0.204 c0.096,0.049,0.25,0.098,0.459,0.146v0.312h-2.918v-0.312c0.127-0.031,0.24-0.062,0.34-0.097c0.096-0.035,0.177-0.076,0.236-0.126 c0.062-0.049,0.114-0.111,0.154-0.187c0.04-0.077,0.072-0.183,0.098-0.313c0.021-0.132,0.033-0.325,0.033-0.58v-6.536h-0.804 c-0.2,0-0.366,0.02-0.495,0.058c-0.13,0.039-0.251,0.118-0.359,0.239c-0.111,0.12-0.213,0.294-0.304,0.518 c-0.092,0.224-0.179,0.505-0.26,0.846h-0.632V82.646L291.881,82.646z"/> + <path fill="#231F20" d="M301.928,87.573v2.171c0,0.307,0.014,0.528,0.035,0.666c0.023,0.139,0.059,0.243,0.105,0.312 c0.047,0.07,0.109,0.127,0.191,0.173c0.08,0.045,0.219,0.095,0.414,0.15v0.312h-2.693v-0.312c0.264-0.069,0.439-0.146,0.529-0.228 c0.09-0.084,0.148-0.201,0.178-0.355c0.025-0.151,0.041-0.387,0.041-0.7V84.24c0-0.293-0.012-0.507-0.033-0.641 c-0.021-0.136-0.057-0.238-0.105-0.312c-0.049-0.075-0.111-0.135-0.193-0.18s-0.219-0.096-0.414-0.15v-0.312h3.158 c0.996,0,1.74,0.181,2.234,0.542s0.74,0.924,0.74,1.686c0,0.584-0.162,1.078-0.482,1.487c-0.32,0.407-0.803,0.729-1.443,0.958 v0.052c0.258,0.105,0.48,0.257,0.666,0.455c0.186,0.197,0.391,0.505,0.613,0.923l0.576,1.047c0.166,0.308,0.309,0.54,0.428,0.701 c0.119,0.162,0.24,0.285,0.363,0.371c0.123,0.084,0.287,0.145,0.492,0.18v0.312h-1.77c-0.16-0.227-0.314-0.469-0.459-0.729 c-0.145-0.259-0.287-0.522-0.428-0.791l-0.562-1.064c-0.17-0.323-0.309-0.562-0.418-0.715c-0.107-0.153-0.207-0.263-0.301-0.321 c-0.092-0.063-0.188-0.106-0.293-0.13c-0.104-0.022-0.262-0.034-0.469-0.034h-0.701V87.573z M301.928,83.232v3.792h0.723 c0.369,0,0.67-0.027,0.898-0.081c0.23-0.052,0.443-0.153,0.641-0.303c0.193-0.148,0.352-0.354,0.469-0.621s0.174-0.594,0.174-0.98 c0-0.405-0.068-0.74-0.207-1.008c-0.139-0.269-0.348-0.473-0.629-0.613c-0.279-0.14-0.66-0.21-1.135-0.21 C302.477,83.207,302.167,83.215,301.928,83.232"/> + <path fill="#231F20" d="M314.215,88.345c0,0.464-0.043,0.863-0.129,1.199c-0.08,0.32-0.201,0.603-0.363,0.85 c-0.148,0.222-0.334,0.41-0.555,0.565c-0.223,0.155-0.488,0.275-0.805,0.366c-0.314,0.089-0.686,0.134-1.109,0.134 c-0.516,0-0.957-0.057-1.326-0.173c-0.365-0.112-0.672-0.302-0.912-0.563s-0.412-0.569-0.52-0.926 c-0.107-0.355-0.16-0.809-0.16-1.355v-4.2c0-0.332-0.01-0.557-0.031-0.673c-0.021-0.117-0.053-0.21-0.094-0.278 c-0.041-0.066-0.1-0.127-0.178-0.176c-0.074-0.049-0.217-0.102-0.426-0.156v-0.312h2.682v0.312 c-0.238,0.061-0.404,0.128-0.498,0.201c-0.094,0.075-0.156,0.187-0.191,0.335c-0.033,0.15-0.051,0.397-0.051,0.747v4.52 c0,0.412,0.043,0.76,0.131,1.039c0.086,0.281,0.209,0.5,0.365,0.654c0.158,0.155,0.346,0.27,0.564,0.34 c0.217,0.069,0.484,0.104,0.811,0.104c0.297,0,0.559-0.052,0.783-0.156c0.227-0.104,0.414-0.264,0.564-0.476 c0.15-0.213,0.256-0.476,0.312-0.785c0.055-0.311,0.08-0.729,0.08-1.251v-3.989c0-0.37-0.018-0.623-0.053-0.76 c-0.037-0.137-0.098-0.24-0.18-0.313c-0.084-0.069-0.254-0.142-0.514-0.21v-0.312h2.547v0.312c-0.246,0.064-0.416,0.135-0.508,0.21 c-0.092,0.077-0.154,0.188-0.189,0.332c-0.031,0.146-0.051,0.393-0.051,0.741v4.104H314.215z"/> + <path fill="#231F20" d="M322.155,82.83v1.769h-0.631c-0.104-0.37-0.234-0.665-0.391-0.885c-0.158-0.22-0.342-0.376-0.551-0.47 c-0.207-0.093-0.459-0.14-0.754-0.14c-0.438,0-0.826,0.146-1.17,0.438c-0.342,0.292-0.611,0.729-0.809,1.314 c-0.195,0.585-0.293,1.293-0.293,2.122c0,0.833,0.08,1.545,0.242,2.135s0.4,1.034,0.715,1.334c0.316,0.301,0.703,0.45,1.162,0.45 c0.35,0,0.635-0.05,0.855-0.149c0.221-0.101,0.408-0.259,0.559-0.477c0.152-0.216,0.295-0.536,0.432-0.957h0.631v1.825 c-0.398,0.105-0.811,0.187-1.229,0.239c-0.42,0.054-0.881,0.079-1.383,0.079c-1.08,0-1.896-0.366-2.451-1.097 c-0.553-0.732-0.828-1.824-0.828-3.274c0-0.912,0.145-1.709,0.432-2.394c0.287-0.688,0.709-1.215,1.266-1.59 c0.557-0.374,1.225-0.562,1.998-0.562c0.387,0,0.744,0.021,1.072,0.062C321.36,82.645,321.733,82.72,322.155,82.83"/> + <path fill="#231F20" d="M323.278,82.646h6.906v2.222h-0.627c-0.094-0.366-0.186-0.655-0.275-0.868 c-0.092-0.213-0.189-0.374-0.291-0.483c-0.104-0.111-0.211-0.19-0.33-0.236c-0.115-0.048-0.291-0.07-0.525-0.07h-0.811v6.536 c0,0.25,0.014,0.45,0.041,0.599c0.027,0.149,0.07,0.268,0.129,0.354c0.057,0.087,0.135,0.155,0.23,0.204 c0.098,0.049,0.252,0.098,0.461,0.146v0.312h-2.918v-0.312c0.127-0.031,0.24-0.062,0.34-0.097c0.098-0.035,0.178-0.076,0.238-0.126 c0.062-0.049,0.111-0.111,0.152-0.187c0.041-0.077,0.074-0.183,0.096-0.313c0.023-0.132,0.035-0.325,0.035-0.58v-6.536h-0.803 c-0.201,0-0.365,0.02-0.494,0.058c-0.131,0.039-0.252,0.118-0.361,0.239c-0.109,0.12-0.213,0.294-0.303,0.518 c-0.092,0.224-0.18,0.505-0.26,0.846h-0.633v-2.224H323.278z"/> + <path fill="#231F20" d="M337.786,88.345c0,0.464-0.043,0.863-0.129,1.199c-0.08,0.32-0.201,0.603-0.361,0.85 c-0.15,0.222-0.336,0.41-0.557,0.565c-0.223,0.155-0.488,0.275-0.805,0.366c-0.314,0.089-0.684,0.134-1.109,0.134 c-0.518,0-0.957-0.057-1.324-0.173c-0.369-0.112-0.674-0.302-0.914-0.563s-0.412-0.569-0.52-0.926 c-0.107-0.354-0.158-0.809-0.158-1.355v-4.2c0-0.332-0.012-0.557-0.033-0.673c-0.02-0.117-0.053-0.21-0.094-0.278 c-0.039-0.066-0.1-0.127-0.176-0.176s-0.219-0.102-0.428-0.156v-0.312h2.684v0.312c-0.24,0.061-0.406,0.128-0.498,0.201 c-0.096,0.075-0.158,0.187-0.193,0.335c-0.033,0.15-0.051,0.397-0.051,0.747v4.52c0,0.412,0.043,0.76,0.131,1.039 c0.088,0.281,0.211,0.5,0.367,0.654c0.158,0.155,0.344,0.27,0.562,0.34c0.217,0.069,0.486,0.104,0.811,0.104 c0.299,0,0.559-0.052,0.785-0.156c0.227-0.104,0.414-0.264,0.564-0.476c0.15-0.213,0.254-0.476,0.311-0.785 c0.055-0.311,0.082-0.729,0.082-1.251v-3.989c0-0.37-0.018-0.623-0.055-0.76c-0.035-0.137-0.096-0.24-0.178-0.313 c-0.084-0.069-0.256-0.142-0.514-0.21v-0.312h2.545v0.312c-0.246,0.064-0.416,0.135-0.508,0.21 c-0.09,0.077-0.152,0.188-0.188,0.332c-0.033,0.146-0.053,0.393-0.053,0.741v4.104H337.786z"/> + <path fill="#231F20" d="M341.793,87.573v2.171c0,0.307,0.012,0.528,0.035,0.666c0.023,0.139,0.059,0.243,0.104,0.312 c0.051,0.07,0.111,0.127,0.191,0.173c0.082,0.045,0.221,0.095,0.416,0.15v0.312h-2.695v-0.312c0.268-0.069,0.441-0.146,0.531-0.228 c0.09-0.084,0.148-0.201,0.176-0.355c0.027-0.151,0.041-0.387,0.041-0.7V84.24c0-0.293-0.01-0.507-0.031-0.641 c-0.021-0.136-0.057-0.238-0.105-0.312c-0.049-0.075-0.113-0.135-0.195-0.18c-0.078-0.045-0.217-0.096-0.414-0.15v-0.312h3.16 c0.996,0,1.74,0.181,2.234,0.542s0.74,0.924,0.74,1.686c0,0.584-0.16,1.078-0.482,1.487c-0.322,0.407-0.805,0.729-1.445,0.958 v0.052c0.26,0.105,0.482,0.257,0.668,0.455c0.186,0.197,0.391,0.505,0.615,0.923l0.574,1.047c0.164,0.308,0.309,0.54,0.428,0.701 c0.119,0.162,0.24,0.285,0.365,0.371c0.121,0.084,0.285,0.145,0.49,0.18v0.312h-1.77c-0.162-0.227-0.312-0.469-0.459-0.729 c-0.146-0.259-0.287-0.522-0.428-0.791l-0.562-1.064c-0.172-0.323-0.311-0.562-0.418-0.715c-0.109-0.153-0.209-0.263-0.301-0.321 c-0.09-0.063-0.189-0.106-0.293-0.13c-0.104-0.022-0.262-0.034-0.469-0.034h-0.701V87.573z M341.793,83.232v3.792h0.723 c0.369,0,0.668-0.027,0.898-0.081c0.229-0.052,0.443-0.153,0.639-0.303c0.195-0.148,0.354-0.354,0.471-0.621 c0.115-0.267,0.174-0.594,0.174-0.98c0-0.405-0.068-0.74-0.207-1.008c-0.139-0.269-0.348-0.473-0.627-0.613 c-0.283-0.14-0.66-0.21-1.139-0.21C342.342,83.207,342.032,83.215,341.793,83.232"/> + <path fill="#231F20" d="M353.932,82.646v1.928h-0.625c-0.062-0.209-0.129-0.391-0.195-0.548c-0.068-0.159-0.139-0.29-0.211-0.397 c-0.072-0.104-0.152-0.189-0.24-0.255c-0.088-0.062-0.189-0.106-0.311-0.131c-0.117-0.023-0.26-0.034-0.428-0.034h-2.016v3.345 h1.365c0.188,0,0.334-0.026,0.439-0.08s0.193-0.145,0.266-0.271c0.068-0.127,0.139-0.327,0.199-0.6h0.602v2.451h-0.602 c-0.059-0.256-0.125-0.447-0.197-0.577c-0.07-0.129-0.156-0.225-0.258-0.278c-0.1-0.055-0.25-0.082-0.449-0.082h-1.365v3.682h1.982 c0.209,0,0.381-0.017,0.51-0.054c0.129-0.036,0.24-0.099,0.334-0.186c0.094-0.088,0.178-0.2,0.25-0.343 c0.07-0.139,0.133-0.284,0.182-0.437c0.049-0.151,0.115-0.371,0.201-0.66h0.631l-0.119,2.239h-5.912v-0.312 c0.266-0.069,0.439-0.146,0.531-0.228c0.088-0.084,0.146-0.201,0.176-0.355c0.025-0.151,0.039-0.387,0.039-0.7v-5.521 c0-0.293-0.01-0.507-0.031-0.641c-0.02-0.136-0.057-0.238-0.104-0.312c-0.051-0.075-0.115-0.135-0.195-0.18 s-0.219-0.096-0.416-0.15v-0.312L353.932,82.646L353.932,82.646z"/> + <path fill="#929497" d="M127.541,18.281c0.402,1.925-0.831,3.812-2.756,4.215c-1.927,0.404-3.814-0.83-4.219-2.755 c-0.402-1.926,0.831-3.812,2.758-4.216C125.25,15.121,127.136,16.356,127.541,18.281"/> + <path fill="#929497" d="M156.069,71.913c0.402,1.926-0.83,3.813-2.757,4.217c-1.926,0.404-3.812-0.83-4.217-2.757 c-0.403-1.925,0.831-3.812,2.757-4.216C153.778,68.754,155.667,69.989,156.069,71.913"/> + <path fill="#929497" d="M175.172,66.916c0.403,1.925-0.83,3.812-2.756,4.216c-1.926,0.404-3.814-0.83-4.218-2.756 c-0.403-1.927,0.832-3.812,2.758-4.217C172.882,63.757,174.769,64.99,175.172,66.916"/> + <path fill="#929497" d="M165.957,3.275c0.402,1.926-0.83,3.812-2.756,4.216c-1.927,0.403-3.813-0.831-4.218-2.756 c-0.402-1.925,0.831-3.813,2.758-4.216C163.667,0.115,165.554,1.349,165.957,3.275"/> + <path fill="#929497" d="M122.396,30.449c0.403,1.926-0.83,3.813-2.756,4.216c-1.926,0.403-3.812-0.831-4.217-2.756 c-0.404-1.926,0.831-3.812,2.757-4.216S121.994,28.524,122.396,30.449"/> + <path fill="#929497" d="M191.763,32.101c0.403,1.925-0.83,3.812-2.755,4.216c-1.928,0.403-3.815-0.83-4.219-2.756 c-0.403-1.927,0.832-3.813,2.758-4.216C189.473,28.941,191.36,30.174,191.763,32.101"/> +</g> +</svg> \ No newline at end of file diff --git a/src/assets/images/dfg.png b/src/assets/images/dfg.png new file mode 100644 index 0000000000000000000000000000000000000000..f19a04f6870bb7bf76f32415a6b2be9d6ad94a7c Binary files /dev/null and b/src/assets/images/dfg.png differ diff --git a/src/assets/images/nfdi.svg b/src/assets/images/nfdi.svg new file mode 100644 index 0000000000000000000000000000000000000000..a950786381cc2d503dec37d82be85c15c3932e56 --- /dev/null +++ b/src/assets/images/nfdi.svg @@ -0,0 +1,9468 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + version="1.1" + id="svg1" + width="411.41913" + height="227.97406" + viewBox="0 0 411.41913 227.97407" + sodipodi:docname="NFDI4Microbiota_official_logo.svg" + inkscape:version="1.2.2 (b0a8486541, 2022-12-01)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs1"> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-404.92481,-511.07052)" + id="path1" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath2"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-396.63181,-488.02361)" + id="path2" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath3"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-340.64751,-488.56461)" + id="path3" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath4"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-422.49021,-513.46062)" + id="path4" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath5"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-331.18261,-464.26531)" + id="path5" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath6"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-370.80861,-469.82641)" + id="path6" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath7"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-370.82911,-509.27661)" + id="path7" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath8"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-410.36911,-492.30581)" + id="path8" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath9"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-348.13771,-458.49581)" + id="path9" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath10"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-426.36231,-505.84251)" + id="path10" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath11"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-420.78811,-522.75072)" + id="path11" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath12"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-381.98051,-475.33321)" + id="path12" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath13"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-332.56251,-456.13931)" + id="path13" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath14"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-398.16701,-522.82932)" + id="path14" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath15"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-356.17291,-504.61441)" + id="path15" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath16"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-427.24221,-520.40641)" + id="path16" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath17"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-393.18751,-481.08371)" + id="path17" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath18"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-387.69531,-520.52412)" + id="path18" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath19"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-347.23731,-494.82001)" + id="path19" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath20"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-418.18651,-498.77511)" + id="path20" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath21"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-353.65141,-458.44401)" + id="path21" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath22"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-331.04691,-486.74731)" + id="path22" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath23"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-376.25101,-514.87621)" + id="path23" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath24"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-361.80081,-465.04361)" + id="path24" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath25"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-325.37701,-475.46501)" + id="path25" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath26"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-400.48631,-484.37811)" + id="path26" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath27"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-322.25881,-470.62571)" + id="path27" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath28"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-427.02931,-503.43132)" + id="path28" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath29"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-336.68951,-492.27511)" + id="path29" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath30"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-364.20511,-506.12521)" + id="path30" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath31"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-375.24901,-466.60371)" + id="path31" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath32"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-410.06841,-531.74191)" + id="path32" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath33"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-415.61431,-492.13931)" + id="path33" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath34"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-390.25391,-526.81371)" + id="path34" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath35"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-415.75881,-531.61401)" + id="path35" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath36"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-330.88571,-458.35661)" + id="path36" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath37"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-325.27731,-480.91961)" + id="path37" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath38"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-387.34281,-475.26241)" + id="path38" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath39"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-352.76461,-500.58471)" + id="path39" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath40"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-404.40531,-531.73501)" + id="path40" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath41"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-426.10551,-523.05102)" + id="path41" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath42"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-325.23241,-464.04751)" + id="path42" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath43"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-378.93361,-521.13451)" + id="path43" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath44"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-358.29301,-455.52851)" + id="path44" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath45"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-398.63871,-480.78781)" + id="path45" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath46"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-342.12401,-497.84151)" + id="path46" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath47"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-367.50881,-464.57341)" + id="path47" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath48"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-370.42681,-514.75461)" + id="path48" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath49"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-409.12991,-483.81321)" + id="path49" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath50"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-420.51171,-528.87762)" + id="path50" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath51"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-429.84961,-515.29512)" + id="path51" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath52"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-341.22751,-449.95721)" + id="path52" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath53"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-344.24611,-450.79851)" + id="path53" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath54"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-431.60551,-506.34781)" + id="path54" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath55"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-381.43551,-469.54851)" + id="path55" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath56"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-358.28521,-506.52411)" + id="path56" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath57"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-398.53421,-531.56511)" + id="path57" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath58"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-424.14841,-498.26241)" + id="path58" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath59"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-329.91311,-489.60131)" + id="path59" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath60"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-322.57131,-487.17211)" + id="path60" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath61"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-333.79591,-453.29901)" + id="path61" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath62"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-387.16701,-525.89421)" + id="path62" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath63"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-420.29301,-489.48941)" + id="path63" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath64"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-429.87601,-520.84302)" + id="path64" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath65"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-392.07031,-472.67301)" + id="path65" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath66"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-347.61231,-503.29362)" + id="path66" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath67"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-373.42771,-520.77021)" + id="path67" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath68"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-362.04981,-458.82881)" + id="path68" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath69"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-353.07031,-452.59151)" + id="path69" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath70"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-335.54491,-495.33911)" + id="path70" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath71"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-431.56251,-500.87571)" + id="path71" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath72"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-401.04001,-478.99141)" + id="path72" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath73"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-324.18461,-455.83221)" + id="path73" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath74"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-318.53611,-472.87711)" + id="path74" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath75"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-375.58791,-463.69261)" + id="path75" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath76"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-319.14161,-469.44601)" + id="path76" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath77"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-362.26461,-515.13931)" + id="path77" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath78"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-415.14551,-486.14911)" + id="path78" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath79"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-424.40431,-531.98701)" + id="path79" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath80"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-329.82911,-450.28441)" + id="path80" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath81"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-392.61431,-531.35172)" + id="path81" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath82"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-409.08791,-534.91381)" + id="path82" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath83"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-352.41701,-506.79271)" + id="path83" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath84"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-432.07321,-525.67692)" + id="path84" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath85"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-384.78521,-469.81761)" + id="path85" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath86"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-319.09081,-480.74921)" + id="path86" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath87"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-415.11621,-536.96502)" + id="path87" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath88"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-319.02541,-463.69651)" + id="path88" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath89"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-398.08501,-474.95041)" + id="path89" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath90"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-379.21091,-526.23991)" + id="path90" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath91"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-403.79491,-537.03882)" + id="path91" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath92"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-358.55081,-452.36151)" + id="path92" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath93"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-341.56251,-503.21991)" + id="path93" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath94"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-369.32911,-518.25072)" + id="path94" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath95"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-423.85251,-490.48021)" + id="path95" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath96"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-324.62601,-491.93331)" + id="path96" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath97"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-369.12991,-456.13301)" + id="path97" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath98"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-408.70211,-478.62661)" + id="path98" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath99"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-418.85841,-537.40201)" + id="path99" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath100"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-430.05961,-497.81761)" + id="path100" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath101"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-329.83201,-495.71891)" + id="path101" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath102"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-380.95801,-463.55191)" + id="path102" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath103"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-356.77251,-514.80781)" + id="path103" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath104"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-340.94141,-444.93671)" + id="path104" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath105"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-435.77341,-514.67551)" + id="path105" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath106"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-318.88381,-486.18871)" + id="path106" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath107"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-397.50781,-535.25262)" + id="path107" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath108"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-347.00881,-446.61301)" + id="path108" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath109"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-386.65141,-531.13152)" + id="path109" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath110"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-346.61041,-507.04272)" + id="path110" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath111"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-437.02831,-506.89521)" + id="path111" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath112"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-324.33791,-452.34251)" + id="path112" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath113"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-418.84771,-486.46841)" + id="path113" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath114"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-392.23631,-469.11441)" + id="path114" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath115"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-335.63481,-446.55981)" + id="path115" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath116"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-437.01561,-518.30931)" + id="path116" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath117"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-429.78911,-530.04121)" + id="path117" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath118"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-318.71581,-457.97091)" + id="path118" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath119"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-375.31541,-525.54612)" + id="path119" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath120"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-436.85641,-501.44262)" + id="path120" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath121"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-334.27541,-503.45622)" + id="path121" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath122"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-352.54101,-446.57731)" + id="path122" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath123"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-363.78221,-452.17061)" + id="path123" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath124"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-403.36821,-474.61931)" + id="path124" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath125"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-426.04691,-536.77171)" + id="path125" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath126"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-363.90231,-519.87621)" + id="path126" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath127"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-374.73141,-456.36691)" + id="path127" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath128"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-413.23141,-480.68081)" + id="path128" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath129"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-312.99021,-474.80981)" + id="path129" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath130"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-311.60061,-469.39371)" + id="path130" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath131"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-329.50001,-445.28341)" + id="path131" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath132"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-392.03121,-536.72721)" + id="path132" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath133"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-386.31251,-463.42251)" + id="path133" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath134"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-352.47461,-514.17891)" + id="path134" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath135"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-431.56151,-491.45971)" + id="path135" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath136"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-311.67771,-480.73751)" + id="path136" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath137"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-435.99711,-525.77562)" + id="path137" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath138"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-380.72851,-531.14571)" + id="path138" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath139"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-324.17091,-497.34341)" + id="path139" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath140"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-317.36231,-491.94891)" + id="path140" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath141"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-408.99801,-542.32981)" + id="path141" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath142"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-340.84571,-507.35811)" + id="path142" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath143"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-414.61721,-542.37231)" + id="path143" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath144"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-312.77541,-463.42301)" + id="path144" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath145"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-425.78611,-485.88401)" + id="path145" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath146"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-357.86431,-446.45381)" + id="path146" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath147"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-396.37701,-469.26431)" + id="path147" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath148"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-408.93651,-474.45091)" + id="path148" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath149"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-403.00291,-541.16961)" + id="path149" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath150"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-437.09081,-497.14231)" + id="path150" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath151"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-369.41801,-525.33321)" + id="path151" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath152"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-369.22561,-452.03141)" + id="path152" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath153"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-419.16211,-542.71261)" + id="path153" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath154"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-318.53811,-452.24921)" + id="path154" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath155"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-329.95211,-502.73461)" + id="path155" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath156"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-420.21971,-479.97671)" + id="path156" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath157"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-380.67191,-457.47481)" + id="path157" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath158"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-323.12401,-446.83661)" + id="path158" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath159"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-358.13281,-519.60271)" + id="path159" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath160"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-312.91801,-485.79361)" + id="path160" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath161"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-431.69731,-536.63352)" + id="path161" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath162"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-442.84671,-514.06321)" + id="path162" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath163"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-385.45611,-537.00901)" + id="path163" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath164"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-391.81451,-463.04511)" + id="path164" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath165"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-396.67191,-542.50902)" + id="path165" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath166"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-436.19531,-531.19651)" + id="path166" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath167"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-442.76461,-508.20141)" + id="path167" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath168"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-346.79391,-514.06611)" + id="path168" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath169"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-311.69731,-458.13401)" + id="path169" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath170"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-373.90431,-531.38251)" + id="path170" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath171"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-442.71781,-519.73212)" + id="path171" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath172"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-425.90331,-542.19792)" + id="path172" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath173"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-317.43261,-497.54171)" + id="path173" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath174"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-414.40721,-474.56171)" + id="path174" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath175"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-403.10251,-468.95481)" + id="path175" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath176"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-363.63571,-525.41181)" + id="path176" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath177"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-442.42381,-501.77071)" + id="path177" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath178"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-436.97751,-491.37371)" + id="path178" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath179"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-373.81641,-452.35711)" + id="path179" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath180"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-431.29001,-485.77851)" + id="path180" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath181"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-335.43071,-508.61742)" + id="path181" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath182"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-306.22361,-474.90791)" + id="path182" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath183"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-324.07911,-502.75851)" + id="path183" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath184"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-352.16891,-518.82492)" + id="path184" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath185"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-312.70211,-491.51531)" + id="path185" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath186"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-386.04881,-457.53191)" + id="path186" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath187"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-441.68361,-497.15991)" + id="path187" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath188"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-329.56841,-508.39962)" + id="path188" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath189"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-369.15921,-530.85961)" + id="path189" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath190"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-340.89551,-514.06171)" + id="path190" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath191"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-380.28811,-535.70622)" + id="path191" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath192"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-391.00781,-542.46801)" + id="path192" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath193"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-317.41021,-446.49531)" + id="path193" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath194"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-442.67581,-525.16771)" + id="path194" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath195"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-312.57521,-452.01241)" + id="path195" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath196"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-408.43751,-468.03781)" + id="path196" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath197"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-436.88771,-536.45571)" + id="path197" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath198"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-306.97461,-469.04751)" + id="path198" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath199"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-306.19141,-480.39281)" + id="path199" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath200"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-413.59961,-548.04801)" + id="path200" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath201"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-408.66501,-547.86151)" + id="path201" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath202"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-425.64061,-480.05881)" + id="path202" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath203"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-396.48831,-463.31951)" + id="path203" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath204"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-368.30081,-446.48111)" + id="path204" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath409"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="matrix(1.3333333,0,0,-1.3333333,-248.5472,307.16667)" + id="path409" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath410"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-260.94091,-502.90741)" + id="path410" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath411"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-260.97271,-508.63891)" + id="path411" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath412"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-261.00391,-514.32291)" + id="path412" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath413"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-261.03521,-519.97581)" + id="path413" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath414"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-261.06591,-525.59742)" + id="path414" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath415"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-266.54791,-491.64911)" + id="path415" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath416"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-266.97121,-497.18961)" + id="path416" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath417"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-267.2695,-502.85661)" + id="path417" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath418"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-267.47361,-508.52412)" + id="path418" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath419"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-267.56791,-514.19262)" + id="path419" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath420"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-267.5674,-519.86101)" + id="path420" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath421"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-267.45751,-525.53052)" + id="path421" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath422"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-267.23731,-531.20091)" + id="path422" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath423"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-266.7979,-537.04461)" + id="path423" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath424"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-266.82811,-542.55582)" + id="path424" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath425"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-272.15331,-480.20181)" + id="path425" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath426"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-272.57761,-485.82151)" + id="path426" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath427"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-273.08011,-491.48751)" + id="path427" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath428"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-273.47271,-497.15401)" + id="path428" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath429"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-273.73971,-502.82101)" + id="path429" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath430"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-273.91261,-508.48902)" + id="path430" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath431"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-273.9907,-514.15692)" + id="path431" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath432"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-273.9907,-519.82591)" + id="path432" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath433"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-273.9121,-525.49482)" + id="path433" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath434"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-273.73881,-531.16471)" + id="path434" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath435"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-273.4399,-536.83512)" + id="path435" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath436"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-273.0151,-542.50651)" + id="path436" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath437"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-272.52831,-548.27172)" + id="path437" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath438"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-277.79101,-474.51821)" + id="path438" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath439"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-278.37211,-480.12081)" + id="path439" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath440"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-278.98441,-485.78581)" + id="path440" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath441"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-279.4243,-491.45231)" + id="path441" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath442"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-279.7231,-497.11931)" + id="path442" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath443"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-279.92721,-502.78731)" + id="path443" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath444"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-280.0366,-508.45531)" + id="path444" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath445"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-280.1152,-514.12321)" + id="path445" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath446"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-280.1152,-519.79221)" + id="path446" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath447"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-280.08351,-525.46062)" + id="path447" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath448"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-279.97311,-531.13062)" + id="path448" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath449"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-279.75291,-536.80051)" + id="path449" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath450"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-279.40671,-542.47092)" + id="path450" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath451"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-278.9038,-548.14231)" + id="path451" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath452"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-278.2285,-553.95621)" + id="path452" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath453"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-283.42771,-468.78681)" + id="path453" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath454"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-283.96191,-474.42111)" + id="path454" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath455"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-284.66941,-480.08611)" + id="path455" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath456"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-285.18751,-485.75161)" + id="path456" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath457"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-285.5332,-491.41861)" + id="path457" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath458"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-285.75291,-497.08611)" + id="path458" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath459"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-285.91021,-502.75411)" + id="path459" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath460"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-286.02001,-508.42212)" + id="path460" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath461"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-286.0825,-514.09051)" + id="path461" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath462"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-286.0981,-519.75901)" + id="path462" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath463"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-286.05081,-525.42792)" + id="path463" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath464"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-285.97171,-531.09741)" + id="path464" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath465"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-285.83011,-536.76732)" + id="path465" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath466"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-285.59421,-542.43721)" + id="path466" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath467"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-285.18511,-548.10762)" + id="path467" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath468"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-284.57181,-553.77951)" + id="path468" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath469"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-283.92771,-559.53091)" + id="path469" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath470"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-289.09771,-468.99141)" + id="path470" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath471"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-290.16501,-474.38691)" + id="path471" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath472"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-290.79351,-480.05241)" + id="path472" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath473"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-291.18651,-485.71891)" + id="path473" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath474"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-291.4531,-491.38591)" + id="path474" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath475"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-291.6733,-497.05341)" + id="path475" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath476"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-291.86131,-502.72141)" + id="path476" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath477"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-292.01811,-525.39522)" + id="path477" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath478"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-291.89211,-531.06511)" + id="path478" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath479"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-291.75001,-536.73462)" + id="path479" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath480"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-291.57711,-542.40402)" + id="path480" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath481"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-291.27831,-548.07391)" + id="path481" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath482"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-290.77491,-553.74531)" + id="path482" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath483"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-290.0518,-559.41861)" + id="path483" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath484"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-294.7339,-463.05581)" + id="path484" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath485"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-295.45651,-468.68911)" + id="path485" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath486"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-296.22661,-474.35371)" + id="path486" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath487"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-296.7451,-480.01971)" + id="path487" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath488"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-297.07471,-485.68621)" + id="path488" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath489"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-297.3418,-491.35371)" + id="path489" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath490"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-297.63871,-536.70181)" + id="path490" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath491"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-297.45021,-542.37181)" + id="path491" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath492"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-297.21391,-548.04121)" + id="path492" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath493"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-296.80521,-553.71211)" + id="path493" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath494"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-296.16061,-559.38492)" + id="path494" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath495"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-295.2964,-565.18381)" + id="path495" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath496"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-300.40331,-463.16621)" + id="path496" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath497"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-301.43951,-468.65591)" + id="path497" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath498"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-302.14651,-474.32101)" + id="path498" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath499"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-302.58691,-479.98751)" + id="path499" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath500"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-302.90041,-485.65451)" + id="path500" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath501"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-303.21481,-491.32151)" + id="path501" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath502"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-303.27541,-542.33952)" + id="path502" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath503"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-303.04001,-548.00901)" + id="path503" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath504"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-302.70901,-553.67991)" + id="path504" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath505"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-302.14361,-559.35171)" + id="path505" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath506"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-301.30961,-565.02511)" + id="path506" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath507"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-306.41701,-462.96011)" + id="path507" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath508"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-307.32811,-468.62371)" + id="path508" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath509"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-307.97271,-474.28881)" + id="path509" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath510"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-308.36521,-479.95531)" + id="path510" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath511"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-308.67971,-485.62231)" + id="path511" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath512"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-309.07031,-542.30781)" + id="path512" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath513"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-308.81841,-547.97721)" + id="path513" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath514"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-308.51951,-553.64761)" + id="path514" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath515"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-308.00001,-559.31952)" + id="path515" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath516"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-307.19921,-564.99291)" + id="path516" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath517"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-312.19531,-462.92841)" + id="path517" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath518"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-313.10641,-468.59201)" + id="path518" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath519"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-309.88381,-474.27851)" + id="path519" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath520"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-309.56931,-479.94891)" + id="path520" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath521"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-314.42681,-485.59101)" + id="path521" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath522"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-314.53421,-547.94601)" + id="path522" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath523"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-314.25101,-553.61592)" + id="path523" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath524"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-313.77931,-559.28781)" + id="path524" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath525"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-312.99321,-564.96061)" + id="path525" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath526"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-312.33301,-570.64911)" + id="path526" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath527"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-316.93651,-462.90201)" + id="path527" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath528"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-316.08691,-468.57541)" + id="path528" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath529"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-315.55271,-474.24731)" + id="path529" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath530"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-315.23831,-479.91771)" + id="path530" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath531"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-314.95511,-485.58811)" + id="path531" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath532"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-328.30471,-533.88691)" + id="path532" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath533"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-315.53421,-547.94011)" + id="path533" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath534"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-315.87991,-553.60711)" + id="path534" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath535"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-316.41411,-559.27311)" + id="path535" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath536"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-317.26271,-564.93721)" + id="path536" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath537"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-318.00201,-570.63351)" + id="path537" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath538"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-322.68361,-462.87031)" + id="path538" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath539"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-321.83401,-468.54361)" + id="path539" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath540"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-321.26861,-474.21551)" + id="path540" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath541"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-320.93851,-479.88641)" + id="path541" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath542"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-320.68651,-485.55631)" + id="path542" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath543"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-320.90431,-542.24241)" + id="path543" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath544"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-321.25001,-547.90891)" + id="path544" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath545"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-321.59571,-553.57591)" + id="path545" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath546"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-322.16111,-559.24191)" + id="path546" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath547"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-323.02541,-564.90552)" + id="path547" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath548"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-323.66991,-570.55491)" + id="path548" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath549"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-328.74411,-462.60131)" + id="path549" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath550"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-327.67581,-468.51141)" + id="path550" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath551"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-327.04691,-474.18381)" + id="path551" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath552"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-326.70121,-479.85471)" + id="path552" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath553"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-326.44921,-485.52461)" + id="path553" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath554"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-326.69821,-542.21061)" + id="path554" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath555"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-326.99711,-547.87711)" + id="path555" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath556"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-327.37401,-553.54362)" + id="path556" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath557"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-327.98631,-559.20972)" + id="path557" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath558"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-328.88281,-564.87321)" + id="path558" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath559"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-334.41311,-462.72721)" + id="path559" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath560"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-333.64261,-468.47871)" + id="path560" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath561"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-332.93551,-474.15161)" + id="path561" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath562"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-332.51071,-479.82241)" + id="path562" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath563"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-332.25881,-485.49241)" + id="path563" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath564"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-332.05471,-491.16231)" + id="path564" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath565"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-332.24121,-536.51142)" + id="path565" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath566"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-332.52441,-542.17842)" + id="path566" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath567"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-332.80661,-547.84542)" + id="path567" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath568"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-333.24711,-553.51141)" + id="path568" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath569"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-333.93851,-559.17691)" + id="path569" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath570"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-334.97461,-564.63541)" + id="path570" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath571"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-339.70511,-468.44551)" + id="path571" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath572"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-338.95021,-474.11831)" + id="path572" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath573"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-338.43071,-479.78971)" + id="path573" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath574"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-338.11621,-485.46011)" + id="path574" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath575"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-337.92771,-491.13011)" + id="path575" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath576"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-337.77051,-496.79951)" + id="path576" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath577"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-337.91021,-530.81172)" + id="path577" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath578"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-338.12991,-536.47921)" + id="path578" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath579"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-338.36621,-542.14621)" + id="path579" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath580"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-338.69531,-547.81272)" + id="path580" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath581"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-339.22951,-553.47871)" + id="path581" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath582"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-340.00001,-559.14321)" + id="path582" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath583"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-340.64361,-564.77701)" + id="path583" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath584"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-345.78121,-468.33321)" + id="path584" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath585"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-345.10551,-474.08421)" + id="path585" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath586"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-344.49221,-479.75651)" + id="path586" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath587"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-344.06741,-485.42741)" + id="path587" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath588"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-343.83201,-491.09741)" + id="path588" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath589"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-343.69041,-496.76731)" + id="path589" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath590"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-343.58011,-502.43622)" + id="path590" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath591"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-343.53221,-508.10521)" + id="path591" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath592"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-343.51661,-513.77412)" + id="path592" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath593"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-343.57911,-519.44262)" + id="path593" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath594"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-343.68951,-525.11052)" + id="path594" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath595"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-343.83011,-530.77902)" + id="path595" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath596"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-344.03421,-536.44651)" + id="path596" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath597"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-344.30181,-542.11351)" + id="path597" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath598"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-344.72561,-547.77951)" + id="path598" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath599"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-345.37011,-553.44451)" + id="path599" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath600"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-346.28031,-558.93621)" + id="path600" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath601"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-351.48051,-473.89231)" + id="path601" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath602"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-350.72661,-479.72241)" + id="path602" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath603"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-350.20801,-485.39371)" + id="path603" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath604"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-349.86131,-491.06411)" + id="path604" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath605"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-349.65721,-496.73411)" + id="path605" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath606"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-349.54691,-502.40352)" + id="path606" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath607"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-349.48441,-508.07241)" + id="path607" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath608"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-349.50001,-513.74091)" + id="path608" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath609"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-349.54691,-519.40941)" + id="path609" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath610"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-349.64061,-525.07782)" + id="path610" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath611"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-349.79791,-530.74581)" + id="path611" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath612"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-350.03321,-536.41332)" + id="path612" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath613"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-350.41021,-542.07981)" + id="path613" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath614"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-350.96001,-547.74531)" + id="path614" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath615"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-351.91701,-553.11001)" + id="path615" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath616"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-357.18071,-479.52951)" + id="path616" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath617"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-356.55271,-485.35861)" + id="path617" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath618"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-356.11231,-491.03001)" + id="path618" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath619"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-355.81251,-496.70041)" + id="path619" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath620"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-355.62401,-502.37031)" + id="path620" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath621"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-355.54591,-508.03921)" + id="path621" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath622"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-355.52931,-513.70771)" + id="path622" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath623"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-355.59181,-519.37621)" + id="path623" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath624"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-355.71781,-525.04411)" + id="path624" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath625"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-355.93751,-530.71212)" + id="path625" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath626"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-356.26761,-536.37912)" + id="path626" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath627"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-356.73831,-542.04511)" + id="path627" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath628"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-357.55471,-547.45771)" + id="path628" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath629"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-362.88091,-485.27701)" + id="path629" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath630"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-362.56641,-490.99431)" + id="path630" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath631"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-362.23631,-496.66471)" + id="path631" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath632"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-362.00001,-502.33512)" + id="path632" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath633"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-361.87401,-508.00411)" + id="path633" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath634"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-361.84281,-513.67302)" + id="path634" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath635"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-361.90531,-519.34152)" + id="path635" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath636"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-362.07811,-525.00901)" + id="path636" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath637"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-362.34471,-530.67691)" + id="path637" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath638"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-362.73731,-536.34342)" + id="path638" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath639"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-363.19241,-541.89912)" + id="path639" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath640"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-368.61231,-496.59831)" + id="path640" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath641"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-368.64261,-502.14132)" + id="path641" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath642"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-368.67291,-507.71551)" + id="path642" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath643"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-368.70411,-513.33711)" + id="path643" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath644"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-368.73541,-519.03681)" + id="path644" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath645"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-368.76761,-524.79951)" + id="path645" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath646"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-368.79881,-530.57832)" + id="path646" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath884"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="matrix(1.3333333,0,0,-1.3333333,-248.5472,307.16667)" + id="path884" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath887"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-283.7773,-480.40301)" + id="path887" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath888"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-283.8091,-486.13641)" + id="path888" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath889"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-283.8403,-491.82201)" + id="path889" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath890"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-283.87161,-497.47671)" + id="path890" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath891"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-283.90231,-503.09982)" + id="path891" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath892"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-289.38571,-469.14131)" + id="path892" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath893"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-289.80961,-474.68381)" + id="path893" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath894"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-290.1079,-480.35221)" + id="path894" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath895"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-290.31201,-486.02171)" + id="path895" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath896"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-290.40621,-491.69161)" + id="path896" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath897"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-290.4058,-497.36201)" + id="path897" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath898"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-290.2954,-503.03292)" + id="path898" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath899"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-290.0752,-508.70481)" + id="path899" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath900"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-289.6357,-514.55052)" + id="path900" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath901"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-289.666,-520.06321)" + id="path901" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath902"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-294.99321,-457.69061)" + id="path902" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath903"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-295.417,-463.31171)" + id="path903" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath904"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-295.91991,-468.97971)" + id="path904" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath905"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-296.31301,-474.64761)" + id="path905" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath906"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-296.5801,-480.31661)" + id="path906" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath907"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-296.7529,-485.98601)" + id="path907" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath908"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-296.83111,-491.65591)" + id="path908" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath909"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-296.83111,-497.32641)" + id="path909" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath910"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-296.75241,-502.99731)" + id="path910" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath911"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-296.57911,-508.66911)" + id="path911" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath912"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-296.2798,-514.34101)" + id="path912" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath913"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-295.85551,-520.01391)" + id="path913" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath914"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-295.36821,-525.78091)" + id="path914" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath915"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-300.63181,-452.00511)" + id="path915" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath916"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-301.21391,-457.60961)" + id="path916" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath917"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-301.82621,-463.27661)" + id="path917" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath918"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-302.26661,-468.94451)" + id="path918" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath919"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-302.56541,-474.61351)" + id="path919" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath920"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-302.76951,-480.28241)" + id="path920" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath921"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-302.87891,-485.95231)" + id="path921" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath922"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-302.95701,-491.62231)" + id="path922" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath923"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-302.95701,-497.29271)" + id="path923" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath924"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-302.92581,-502.96311)" + id="path924" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath925"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-302.81541,-508.63491)" + id="path925" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath926"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-302.59471,-514.30632)" + id="path926" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath927"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-302.24901,-519.97872)" + id="path927" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath928"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-301.74511,-525.65161)" + id="path928" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath929"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-301.07031,-531.46752)" + id="path929" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath930"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-306.27151,-446.27221)" + id="path930" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath931"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-306.80471,-451.90841)" + id="path931" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath932"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-307.51271,-457.57491)" + id="path932" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath933"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-308.03121,-463.24241)" + id="path933" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath934"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-308.37701,-468.91081)" + id="path934" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath935"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-308.59671,-474.58031)" + id="path935" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath936"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-308.75391,-480.24971)" + id="path936" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath937"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-308.86431,-485.91961)" + id="path937" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath938"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-308.92681,-491.58951)" + id="path938" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath939"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-308.94141,-497.25991)" + id="path939" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath940"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-308.89451,-502.93041)" + id="path940" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath941"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-308.81541,-508.60171)" + id="path941" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath942"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-308.67381,-514.27261)" + id="path942" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath943"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-308.43751,-519.94452)" + id="path943" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath944"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-308.02831,-525.61692)" + id="path944" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath945"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-307.41501,-531.29071)" + id="path945" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath946"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-306.77151,-537.04362)" + id="path946" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath947"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-313.00981,-451.87421)" + id="path947" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath948"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-313.63871,-457.54121)" + id="path948" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath949"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-314.03221,-463.20921)" + id="path949" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath950"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-314.29881,-468.87811)" + id="path950" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath951"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-314.51861,-474.54751)" + id="path951" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath952"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-314.70701,-480.21701)" + id="path952" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath953"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-314.86331,-502.89762)" + id="path953" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath954"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-314.73731,-508.56901)" + id="path954" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath955"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-314.59571,-514.24041)" + id="path955" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath956"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-314.42291,-519.91182)" + id="path956" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath957"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-314.12401,-525.58321)" + id="path957" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath958"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-313.62011,-531.25651)" + id="path958" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath959"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-312.89651,-536.93131)" + id="path959" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath960"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-317.58011,-440.53921)" + id="path960" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath961"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-318.30271,-446.17451)" + id="path961" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath962"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-319.07321,-451.84051)" + id="path962" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath963"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-319.59181,-457.50801)" + id="path963" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath964"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-319.92191,-463.17691)" + id="path964" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath965"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-320.18951,-468.84591)" + id="path965" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath966"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-320.48631,-514.20771)" + id="path966" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath967"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-320.29691,-519.87912)" + id="path967" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath968"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-320.06151,-525.55051)" + id="path968" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath969"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-319.65231,-531.22332)" + id="path969" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath970"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-319.00781,-536.89761)" + id="path970" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath971"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-318.14261,-542.69841)" + id="path971" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath972"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-324.28811,-446.14131)" + id="path972" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath973"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-324.99511,-451.80781)" + id="path973" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath974"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-325.43551,-457.47631)" + id="path974" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath975"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-325.75001,-463.14471)" + id="path975" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath976"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-326.06351,-468.81371)" + id="path976" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath977"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-326.12501,-519.84741)" + id="path977" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath978"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-325.88871,-525.51822)" + id="path978" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath979"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-325.55861,-531.19062)" + id="path979" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath980"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-324.99221,-536.86441)" + id="path980" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath981"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-324.15821,-542.53971)" + id="path981" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath982"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-330.17871,-446.10911)" + id="path982" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath983"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-330.82231,-451.77611)" + id="path983" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath984"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-331.21581,-457.44401)" + id="path984" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath985"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-331.53031,-463.11301)" + id="path985" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath986"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-331.92091,-519.81511)" + id="path986" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath987"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-331.66891,-525.48651)" + id="path987" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath988"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-331.37011,-531.15841)" + id="path988" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath989"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-330.85061,-536.83221)" + id="path989" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath990"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-330.04881,-542.50701)" + id="path990" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath991"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-335.95901,-446.07731)" + id="path991" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath992"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-332.73541,-451.76531)" + id="path992" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath993"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-332.41991,-457.43771)" + id="path993" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath994"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-337.27831,-463.08121)" + id="path994" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath995"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-337.38671,-525.45481)" + id="path995" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath996"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-337.10351,-531.12711)" + id="path996" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath997"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-336.63181,-536.80051)" + id="path997" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath998"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-335.84471,-542.47531)" + id="path998" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath999"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-335.18461,-548.16471)" + id="path999" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1000"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-338.93951,-446.06071)" + id="path1000" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1001"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-338.40531,-451.73411)" + id="path1001" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1002"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-338.09081,-457.40641)" + id="path1002" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1003"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-337.80761,-463.07831)" + id="path1003" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1004"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-351.16111,-511.39182)" + id="path1004" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1005"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-338.38671,-525.44941)" + id="path1005" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1006"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-338.73241,-531.11791)" + id="path1006" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1007"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-339.26661,-536.78581)" + id="path1007" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1008"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-340.11621,-542.45181)" + id="path1008" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1009"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-340.85551,-548.14962)" + id="path1009" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1010"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-344.68851,-446.02901)" + id="path1010" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1011"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-344.12301,-451.70281)" + id="path1011" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1012"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-343.79301,-457.37471)" + id="path1012" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1013"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-343.54101,-463.04661)" + id="path1013" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1014"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-343.75881,-519.75021)" + id="path1014" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1015"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-344.10451,-525.41821)" + id="path1015" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1016"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-344.45021,-531.08661)" + id="path1016" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1017"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-345.01561,-536.75412)" + id="path1017" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1018"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-345.87991,-542.41962)" + id="path1018" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1019"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-346.52541,-548.07102)" + id="path1019" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1020"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-350.53221,-445.99681)" + id="path1020" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1021"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-349.90331,-451.67061)" + id="path1021" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1022"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-349.55661,-457.34301)" + id="path1022" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1023"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-349.30571,-463.01481)" + id="path1023" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1024"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-349.55471,-519.71802)" + id="path1024" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1025"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-349.85251,-525.38641)" + id="path1025" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1026"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-350.23051,-531.05491)" + id="path1026" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1027"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-350.84281,-536.72241)" + id="path1027" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1028"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-351.73931,-542.38741)" + id="path1028" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1029"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-357.27151,-440.21061)" + id="path1029" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1030"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-356.50101,-445.96411)" + id="path1030" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1031"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-355.79301,-451.63841)" + id="path1031" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1032"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-355.36911,-457.31121)" + id="path1032" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1033"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-355.11721,-462.98311)" + id="path1033" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1034"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-354.91211,-468.65451)" + id="path1034" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1035"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-355.09961,-514.01731)" + id="path1035" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1036"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-355.38181,-519.68571)" + id="path1036" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1037"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-355.66501,-525.35421)" + id="path1037" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1038"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-356.10451,-531.02221)" + id="path1038" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1039"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-356.79691,-536.68911)" + id="path1039" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1040"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-357.83301,-542.14962)" + id="path1040" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1041"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-361.80961,-451.60521)" + id="path1041" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1042"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-361.29101,-457.27851)" + id="path1042" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1043"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-360.97561,-462.95091)" + id="path1043" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1044"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-360.78711,-468.62231)" + id="path1044" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1045"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-360.62991,-474.29361)" + id="path1045" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1046"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-360.76951,-508.31562)" + id="path1046" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1047"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-360.98931,-513.98461)" + id="path1047" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1048"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-361.22561,-519.65401)" + id="path1048" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1049"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-361.55571,-525.32202)" + id="path1049" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1050"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-362.08981,-530.98941)" + id="path1050" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1051"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-362.85941,-536.65591)" + id="path1051" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1052"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-363.50391,-542.29122)" + id="path1052" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1053"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-367.96781,-451.57151)" + id="path1053" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1054"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-367.35351,-457.24531)" + id="path1054" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1055"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-366.92871,-462.91771)" + id="path1055" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1056"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-366.69341,-468.58951)" + id="path1056" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1057"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-366.55181,-474.26091)" + id="path1057" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1058"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-366.44041,-479.93181)" + id="path1058" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1059"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-366.39361,-485.60271)" + id="path1059" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1060"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-366.37791,-491.27311)" + id="path1060" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1061"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-366.44041,-496.94311)" + id="path1061" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1062"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-366.55081,-502.61301)" + id="path1062" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1063"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-366.69141,-508.28292)" + id="path1063" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1064"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-366.89551,-513.95232)" + id="path1064" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1065"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-367.16311,-519.62131)" + id="path1065" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1066"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-367.58691,-525.28881)" + id="path1066" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1067"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-368.23141,-530.95531)" + id="path1067" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1068"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-369.14261,-536.44842)" + id="path1068" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1069"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-374.34471,-451.37911)" + id="path1069" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1070"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-373.58981,-457.21061)" + id="path1070" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1071"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-373.07131,-462.88401)" + id="path1071" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1072"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-372.72461,-468.55631)" + id="path1072" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1073"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-372.52051,-474.22821)" + id="path1073" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1074"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-372.41021,-479.89911)" + id="path1074" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1075"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-372.34671,-485.56951)" + id="path1075" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1076"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-372.36231,-491.23991)" + id="path1076" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1077"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-372.40921,-496.91031)" + id="path1077" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1078"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-372.50291,-502.57981)" + id="path1078" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1079"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-372.66111,-508.25022)" + id="path1079" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1080"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-372.89651,-513.91911)" + id="path1080" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1081"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-373.27341,-519.58761)" + id="path1081" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1082"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-373.82321,-525.25411)" + id="path1082" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1083"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-374.78121,-530.62081)" + id="path1083" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1084"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-380.04591,-457.01821)" + id="path1084" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1085"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-379.41801,-462.84931)" + id="path1085" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1086"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-378.97661,-468.52221)" + id="path1086" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1087"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-378.67771,-474.19401)" + id="path1087" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1088"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-378.48931,-479.86541)" + id="path1088" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1089"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-378.41021,-485.53631)" + id="path1089" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1090"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-378.39451,-491.20671)" + id="path1090" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1091"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-378.45701,-496.87661)" + id="path1091" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1092"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-378.58201,-502.54662)" + id="path1092" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1093"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-378.80271,-508.21602)" + id="path1093" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1094"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-379.13181,-513.88491)" + id="path1094" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1095"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-379.60351,-519.55242)" + id="path1095" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1096"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-380.41991,-524.96701)" + id="path1096" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1097"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-385.74801,-462.76731)" + id="path1097" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1098"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-385.43361,-468.48651)" + id="path1098" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1099"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-385.10251,-474.15891)" + id="path1099" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1100"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-384.86721,-479.83031)" + id="path1100" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1101"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-384.74121,-485.50161)" + id="path1101" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1102"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-384.70901,-491.17211)" + id="path1102" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1103"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-384.77151,-496.84201)" + id="path1103" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1104"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-384.94531,-502.51141)" + id="path1104" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1105"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-385.21191,-508.18081)" + id="path1105" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1106"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-385.60451,-513.84931)" + id="path1106" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1107"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-386.05961,-519.40692)" + id="path1107" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1108"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-391.48051,-474.09201)" + id="path1108" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1109"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-391.51071,-479.63641)" + id="path1109" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1110"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-391.54201,-485.21211)" + id="path1110" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1111"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-391.57321,-490.83561)" + id="path1111" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1112"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-391.60451,-496.53731)" + id="path1112" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1113"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-391.63571,-502.30191)" + id="path1113" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1114"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="translate(-391.66801,-508.08222)" + id="path1114" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1343"> + <path + d="M 0,841.89 H 595.276 V 0 H 0 Z" + transform="matrix(1.3333333,0,0,-1.3333333,-248.5472,307.16667)" + id="path1343" /> + </clipPath> + </defs> + <sodipodi:namedview + id="namedview1" + pagecolor="#ffffff" + bordercolor="#000000" + borderopacity="0.25" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + inkscape:zoom="1.8919701" + inkscape:cx="111.78823" + inkscape:cy="161.47189" + inkscape:window-width="1920" + inkscape:window-height="1172" + inkscape:window-x="1920" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="layer-MC0" + showgrid="false"> + <inkscape:page + x="0" + y="0" + inkscape:label="1" + id="page1" + width="411.41913" + height="227.97408" + margin="0" + bleed="0" /> + </sodipodi:namedview> + <g + id="layer-MC0" + inkscape:groupmode="layer" + inkscape:label="Ebene 1" + transform="translate(69.504069,453.6988)"> + <g + id="g408" + clip-path="url(#clipPath409)"> + <path + d="M 0,0 C 0.289,-0.232 0.511,-0.726 0.879,-0.078 0.699,0.096 0.531,0.258 0.337,0.447 0.211,0.279 0.11,0.147 0,0 m -22.796,-11.324 c 0.223,-0.185 0.382,-0.317 0.558,-0.463 0.148,0.164 0.26,0.288 0.383,0.423 -0.165,0.168 -0.299,0.306 -0.451,0.461 -0.16,-0.137 -0.29,-0.249 -0.49,-0.421 m -27.073,-22.907 c -0.315,0.437 -0.582,0.653 -0.878,0.055 0.137,-0.142 0.269,-0.282 0.421,-0.439 0.159,0.134 0.29,0.243 0.457,0.384 m 39.531,22.563 c -0.31,0.309 -0.56,0.745 -0.892,0.082 0.158,-0.165 0.317,-0.33 0.494,-0.513 0.141,0.154 0.257,0.279 0.398,0.431 m -23.74,-5.16 c 0.35,-0.342 0.634,-0.662 0.938,-0.029 -0.156,0.167 -0.314,0.336 -0.497,0.532 -0.157,-0.179 -0.284,-0.323 -0.441,-0.503 m 34.006,10.781 c 0.228,-0.25 0.4,-0.437 0.586,-0.64 0.211,0.235 0.38,0.425 0.57,0.637 -0.213,0.178 -0.391,0.327 -0.586,0.49 -0.186,-0.158 -0.347,-0.295 -0.57,-0.487 m -61.817,-28.379 c 0.177,0.185 0.319,0.334 0.471,0.494 -0.209,0.241 -0.376,0.434 -0.58,0.669 -0.201,-0.21 -0.37,-0.386 -0.552,-0.575 0.236,-0.21 0.413,-0.368 0.661,-0.588 m 16.457,11.907 c 0.245,-0.221 0.433,-0.39 0.635,-0.572 0.177,0.183 0.323,0.337 0.487,0.506 -0.207,0.231 -0.387,0.432 -0.588,0.656 -0.197,-0.217 -0.34,-0.376 -0.534,-0.59 m 17.621,0.118 c -0.185,-0.192 -0.333,-0.346 -0.503,-0.523 0.192,-0.228 0.367,-0.435 0.569,-0.676 0.221,0.237 0.391,0.421 0.594,0.639 -0.223,0.19 -0.417,0.355 -0.66,0.56 M -4.786,-0.002 C -5.001,0.239 -5.181,0.44 -5.384,0.668 -5.601,0.423 -5.767,0.236 -5.956,0.022 c 0.248,-0.199 0.458,-0.367 0.665,-0.534 0.18,0.182 0.316,0.319 0.505,0.51 m -12.618,-5.571 c 0.262,-0.218 0.492,-0.407 0.724,-0.599 0.199,0.211 0.347,0.368 0.516,0.547 -0.192,0.252 -0.371,0.485 -0.57,0.746 -0.237,-0.245 -0.418,-0.433 -0.67,-0.694 m -44.325,-34.893 c 0.209,0.247 0.374,0.441 0.55,0.649 -0.254,0.223 -0.463,0.408 -0.7,0.618 -0.203,-0.196 -0.373,-0.36 -0.563,-0.543 0.234,-0.238 0.445,-0.452 0.713,-0.724 m 45.317,23.7 c -0.201,-0.193 -0.387,-0.371 -0.602,-0.577 0.228,-0.259 0.434,-0.494 0.653,-0.745 0.238,0.267 0.439,0.495 0.655,0.737 -0.243,0.202 -0.462,0.383 -0.706,0.585 m -40.515,-11.405 c 0.258,-0.204 0.492,-0.39 0.733,-0.579 0.21,0.209 0.379,0.378 0.577,0.576 -0.223,0.255 -0.428,0.491 -0.647,0.743 -0.238,-0.265 -0.441,-0.493 -0.663,-0.74 m 0.241,-11.646 c 0.249,-0.274 0.472,-0.519 0.707,-0.777 0.245,0.288 0.435,0.513 0.636,0.75 -0.271,0.228 -0.5,0.419 -0.743,0.623 -0.217,-0.216 -0.4,-0.398 -0.6,-0.596 m 52.338,28.021 c -0.284,0.232 -0.529,0.432 -0.806,0.659 -0.2,-0.203 -0.375,-0.381 -0.558,-0.566 0.254,-0.303 0.461,-0.549 0.684,-0.815 0.243,0.258 0.447,0.475 0.68,0.722 m 9.921,11.529 c 0.244,-0.272 0.434,-0.482 0.66,-0.734 0.249,0.234 0.478,0.45 0.719,0.676 C 6.671,-0.08 6.428,0.132 6.17,0.356 5.962,0.139 5.782,-0.049 5.573,-0.267 m -50.989,-33.987 c 0.263,-0.295 0.486,-0.546 0.728,-0.816 0.261,0.287 0.478,0.525 0.718,0.788 -0.275,0.222 -0.52,0.42 -0.784,0.632 -0.223,-0.203 -0.413,-0.377 -0.662,-0.604 m 18.199,22.989 c -0.25,0.285 -0.473,0.538 -0.719,0.818 -0.258,-0.285 -0.486,-0.537 -0.72,-0.796 0.281,-0.224 0.516,-0.413 0.79,-0.631 0.216,0.203 0.418,0.392 0.649,0.609 m -6.151,-18.312 c 0.3,0.319 0.574,0.611 0.864,0.92 -0.325,0.26 -0.609,0.487 -0.895,0.715 -0.246,-0.255 -0.457,-0.475 -0.678,-0.705 0.239,-0.315 0.461,-0.605 0.709,-0.93 m -6.763,12.722 c 0.335,-0.269 0.619,-0.495 0.902,-0.721 0.263,0.269 0.49,0.501 0.718,0.736 -0.26,0.309 -0.495,0.588 -0.751,0.891 -0.295,-0.307 -0.563,-0.587 -0.869,-0.906 m 29.937,16.863 c -0.316,0.376 -0.581,0.694 -0.851,1.014 -0.309,-0.343 -0.608,-0.678 -0.912,-1.017 0.335,-0.269 0.64,-0.513 0.961,-0.772 0.272,0.264 0.521,0.504 0.802,0.775 m -12.722,-22.943 c 0.314,-0.376 0.58,-0.693 0.859,-1.026 0.3,0.339 0.594,0.672 0.887,1.003 -0.333,0.283 -0.63,0.535 -0.943,0.8 -0.275,-0.266 -0.524,-0.507 -0.803,-0.777 m -27.685,-0.324 c 0.266,0.256 0.514,0.495 0.783,0.754 -0.28,0.37 -0.541,0.716 -0.814,1.078 -0.327,-0.361 -0.64,-0.707 -0.955,-1.053 0.347,-0.274 0.653,-0.516 0.986,-0.779 m -17.022,-15.632 c -0.364,-0.305 -0.677,-0.566 -0.999,-0.836 0.373,-0.342 0.707,-0.648 1.049,-0.962 0.277,0.32 0.531,0.614 0.802,0.928 -0.291,0.296 -0.561,0.573 -0.852,0.87 M 1.308,5.62 C 0.998,5.986 0.703,6.334 0.39,6.705 0.097,6.363 -0.195,6.022 -0.49,5.677 -0.169,5.38 0.132,5.103 0.438,4.819 0.732,5.09 1.005,5.341 1.308,5.62 m -50.605,-45.609 c -0.373,0.285 -0.724,0.552 -1.072,0.819 -0.288,-0.275 -0.523,-0.498 -0.754,-0.719 0.3,-0.382 0.577,-0.736 0.858,-1.094 0.34,0.35 0.641,0.659 0.968,0.994 m 27.84,34.374 c -0.334,0.392 -0.625,0.735 -0.914,1.074 -0.344,-0.356 -0.644,-0.667 -0.952,-0.988 0.357,-0.281 0.682,-0.536 1.039,-0.817 0.263,0.232 0.522,0.462 0.827,0.731 m 27.618,0.46 C 5.864,-5.46 5.582,-5.75 5.301,-6.039 5.612,-6.41 5.897,-6.751 6.183,-7.091 c 0.348,0.375 0.669,0.718 0.982,1.055 -0.338,0.297 -0.648,0.569 -1.004,0.881 m -73.737,-29.559 c 0.289,0.297 0.571,0.588 0.84,0.863 -0.323,0.377 -0.603,0.705 -0.882,1.032 -0.365,-0.348 -0.713,-0.68 -1.063,-1.013 0.373,-0.298 0.732,-0.585 1.105,-0.882 M 7.209,5.613 C 6.843,6.003 6.517,6.35 6.178,6.711 5.867,6.343 5.571,5.994 5.274,5.643 5.589,5.361 5.897,5.084 6.219,4.795 6.556,5.073 6.873,5.336 7.209,5.613 m -17.94,-22.056 c -0.318,-0.31 -0.611,-0.596 -0.91,-0.887 0.299,-0.373 0.581,-0.726 0.87,-1.085 0.38,0.373 0.745,0.729 1.116,1.093 -0.368,0.301 -0.703,0.574 -1.076,0.879 m -52.257,-11.745 c 0.376,-0.323 0.73,-0.626 1.073,-0.92 0.328,0.326 0.622,0.617 0.928,0.921 -0.293,0.368 -0.578,0.725 -0.874,1.094 -0.359,-0.349 -0.717,-0.697 -1.127,-1.095 m 30.423,16.93 c -0.344,0.421 -0.675,0.826 -1.003,1.228 -0.346,-0.387 -0.706,-0.791 -1.078,-1.205 0.352,-0.304 0.725,-0.626 1.103,-0.953 0.329,0.313 0.645,0.614 0.978,0.93 m -6.512,-22.057 c -0.348,-0.336 -0.677,-0.653 -0.983,-0.948 0.34,-0.417 0.672,-0.822 0.997,-1.221 0.375,0.407 0.765,0.83 1.152,1.249 -0.375,0.296 -0.752,0.593 -1.166,0.92 m 39.58,22.535 c -0.344,-0.338 -0.683,-0.671 -1.016,-0.998 0.367,-0.443 0.718,-0.867 1.042,-1.26 0.415,0.446 0.812,0.873 1.203,1.294 -0.405,0.318 -0.816,0.64 -1.229,0.964 m -63.375,-34.765 c 0.401,-0.471 0.801,-0.94 1.169,-1.372 0.387,0.462 0.771,0.923 1.16,1.389 -0.388,0.329 -0.78,0.663 -1.178,1 -0.405,-0.358 -0.794,-0.702 -1.151,-1.017 M -5.362,7.141 C -5.807,6.639 -6.236,6.153 -6.656,5.68 c 0.418,-0.328 0.857,-0.673 1.279,-1.005 0.365,0.359 0.704,0.691 1.029,1.01 -0.356,0.512 -0.692,0.993 -1.014,1.456 M -27.72,-30.013 c 0.437,0.482 0.86,0.948 1.272,1.402 -0.426,0.334 -0.866,0.679 -1.288,1.01 -0.378,-0.375 -0.729,-0.721 -1.04,-1.03 0.38,-0.497 0.722,-0.945 1.056,-1.382 m -17.187,14.505 c -0.42,-0.463 -0.854,-0.94 -1.273,-1.401 0.423,-0.331 0.851,-0.665 1.284,-1.005 0.358,0.346 0.714,0.689 1.059,1.022 -0.375,0.485 -0.73,0.945 -1.07,1.384 M -16.688,-1.1 c 0.395,0.371 0.787,0.736 1.155,1.081 -0.391,0.489 -0.764,0.954 -1.1,1.373 l -1.356,-1.356 c 0.4,-0.338 0.831,-0.702 1.301,-1.098 m 30.07,0.821 C 12.91,0.1 12.408,0.503 11.92,0.895 11.56,0.486 11.201,0.081 10.862,-0.304 c 0.38,-0.448 0.739,-0.871 1.058,-1.247 0.507,0.441 0.997,0.867 1.462,1.272 M -17.5,-22.986 c 0.385,-0.512 0.751,-1 1.08,-1.438 0.474,0.462 0.98,0.956 1.468,1.434 -0.442,0.344 -0.935,0.728 -1.42,1.106 -0.362,-0.355 -0.753,-0.736 -1.128,-1.102 m -37.566,0.494 c -0.396,0.48 -0.793,0.962 -1.146,1.389 -0.488,-0.476 -0.99,-0.966 -1.463,-1.427 0.459,-0.36 0.947,-0.741 1.408,-1.101 0.399,0.378 0.794,0.754 1.201,1.139 m -12.402,-24.623 c 0.375,0.493 0.781,1.028 1.183,1.556 -0.422,0.393 -0.867,0.808 -1.285,1.196 -0.442,-0.373 -0.891,-0.754 -1.274,-1.078 0.462,-0.562 0.931,-1.132 1.376,-1.674 m 12.905,1.646 c -0.443,0.35 -0.937,0.74 -1.428,1.128 -0.416,-0.393 -0.845,-0.797 -1.236,-1.166 0.414,-0.526 0.825,-1.047 1.18,-1.499 0.489,0.507 0.986,1.022 1.484,1.537 m 49.406,29.28 c -0.445,-0.4 -0.897,-0.808 -1.293,-1.165 0.439,-0.583 0.875,-1.159 1.243,-1.647 0.473,0.555 0.96,1.126 1.426,1.673 -0.429,0.355 -0.914,0.757 -1.376,1.139 m -38.088,-23.689 c -0.448,0.345 -0.964,0.742 -1.453,1.118 -0.43,-0.417 -0.865,-0.837 -1.233,-1.195 0.43,-0.58 0.849,-1.146 1.2,-1.619 0.483,0.552 0.982,1.12 1.486,1.696 m 13.862,34.237 c 0.449,-0.344 0.965,-0.741 1.454,-1.118 0.43,0.417 0.865,0.838 1.233,1.195 -0.43,0.58 -0.849,1.146 -1.2,1.619 -0.483,-0.551 -0.982,-1.12 -1.487,-1.696 M 11.9,4.28 c 0.576,0.434 1.121,0.846 1.578,1.19 -0.54,0.484 -1.1,0.988 -1.649,1.48 C 11.483,6.546 11.062,6.053 10.643,5.563 11.055,5.143 11.496,4.692 11.9,4.28 m -43.834,-38.468 c -0.461,0.39 -0.988,0.838 -1.478,1.253 -0.466,-0.436 -0.938,-0.877 -1.324,-1.238 0.472,-0.669 0.934,-1.325 1.296,-1.837 0.465,0.563 0.996,1.204 1.506,1.822 m -7.381,25.164 c -0.16,-1.022 -0.8,-1.726 -1.696,-2.129 0.621,-0.473 1.19,-0.906 1.739,-1.325 0.428,0.417 0.877,0.854 1.247,1.212 -0.434,0.754 -0.853,1.482 -1.29,2.242 m -35.656,-30.594 c 0.519,-0.437 1.173,-0.989 1.793,-1.511 0.4,0.442 0.877,0.971 1.3,1.44 -0.455,0.525 -0.92,1.06 -1.302,1.501 -0.633,-0.506 -1.274,-1.017 -1.791,-1.43 m 5.559,11.559 c 0.662,-0.479 1.27,-0.919 1.827,-1.321 0.472,0.432 0.948,0.87 1.336,1.226 -0.455,0.707 -0.899,1.399 -1.335,2.077 -0.206,-0.935 -0.862,-1.607 -1.828,-1.982 m 81.393,20.088 c 0.274,0.98 1.013,1.556 1.866,1.878 -0.679,0.501 -1.314,0.97 -1.906,1.408 -0.422,-0.447 -0.88,-0.932 -1.273,-1.347 0.433,-0.64 0.858,-1.267 1.313,-1.939 m -64.381,-8.86 c 0.63,-0.504 1.254,-1.003 1.846,-1.476 0.456,0.441 0.981,0.949 1.421,1.375 -0.479,0.638 -0.967,1.286 -1.46,1.941 -0.311,-0.897 -0.917,-1.582 -1.807,-1.84 m 58.667,3.074 c 0.191,0.987 0.893,1.634 1.756,2.016 -0.659,0.495 -1.276,0.96 -1.839,1.384 -0.474,-0.455 -0.975,-0.937 -1.396,-1.341 0.476,-0.663 0.967,-1.346 1.479,-2.059 M -12.989,5.719 c 0.661,-0.473 1.329,-0.95 1.972,-1.41 0.435,0.419 0.954,0.919 1.41,1.358 -0.466,0.607 -0.963,1.256 -1.457,1.9 -0.331,-0.911 -0.978,-1.616 -1.925,-1.848 M -23.49,-28.584 c 0.483,-0.649 0.966,-1.297 1.456,-1.957 0.336,0.991 1.01,1.666 1.957,1.897 -0.657,0.464 -1.348,0.951 -2.011,1.419 -0.435,-0.422 -0.953,-0.924 -1.402,-1.359 m -40.787,6.078 c 0.938,-0.285 1.85,-0.61 2.311,-1.509 0.636,0.545 1.241,1.065 1.859,1.594 -1.19,0.722 -1.831,1.783 -1.473,3.25 0.284,1.167 1.082,1.891 2.26,2.073 1.389,0.214 2.4,-0.404 3.096,-1.735 0.503,0.952 1.151,1.672 2.107,1.88 -0.474,0.489 -1.028,0.926 -1.404,1.483 -0.41,0.608 -0.399,1.347 -0.156,2.052 0.37,1.076 1.344,1.773 2.477,1.785 1.238,0.013 2.129,-0.688 2.696,-2.185 0.408,1.313 1.189,2.181 2.532,2.345 1.368,0.167 2.33,-0.499 2.936,-1.549 0.664,0.626 1.322,1.246 1.904,1.793 -0.369,0.414 -0.908,0.896 -1.292,1.479 -0.423,0.645 -0.367,1.398 -0.096,2.116 0.407,1.072 1.514,1.783 2.666,1.723 1.262,-0.066 2.144,-0.855 2.609,-2.43 0.379,1.395 1.138,2.332 2.521,2.539 1.375,0.205 2.402,-0.392 3.058,-1.502 0.596,0.581 1.188,1.158 1.812,1.766 -1.314,0.798 -1.954,2.004 -1.324,3.612 0.427,1.086 1.308,1.671 2.487,1.683 1.354,0.014 2.227,-0.714 2.766,-2.025 0.378,1.137 1.095,1.865 2.082,2.178 -0.489,0.525 -1.066,0.997 -1.446,1.594 -0.423,0.666 -0.35,1.449 -0.018,2.175 0.474,1.034 1.605,1.644 2.727,1.481 1.141,-0.165 2.028,-1.043 2.205,-2.179 0.198,-1.28 -0.424,-2.269 -1.803,-2.919 0.613,-0.452 1.246,-0.921 1.843,-1.361 0.511,0.445 1.064,0.929 1.612,1.408 -1.656,1.564 -1.855,3.33 -0.479,4.59 1.391,1.276 3.19,0.916 4.449,-0.776 0.757,0.619 1.521,1.244 2.232,1.827 -1.518,0.908 -2.057,1.846 -1.725,3.198 0.282,1.153 1.311,1.987 2.502,2.028 1.264,0.043 2.232,-0.703 2.755,-2.182 0.482,1.464 1.395,2.353 2.938,2.343 1.285,-0.009 2.138,-0.726 2.707,-1.982 0.4,1.061 1.138,1.677 2.124,2.057 -1.652,1.131 -2.153,2.165 -1.725,3.469 0.374,1.14 1.445,1.884 2.643,1.835 1.174,-0.048 2.17,-0.855 2.454,-1.988 0.337,-1.346 -0.206,-2.364 -1.744,-3.265 0.361,-0.2 0.751,-0.361 1.074,-0.609 0.327,-0.25 0.585,-0.586 0.836,-0.845 0.555,0.499 1.123,1.009 1.734,1.559 -0.963,0.58 -1.639,1.443 -1.549,2.726 0.056,0.795 0.409,1.435 1.018,1.945 1.179,0.989 2.96,0.761 3.951,-0.51 1.005,-1.291 0.602,-2.956 -1.051,-4.202 0.331,-0.223 0.673,-0.409 0.959,-0.66 0.279,-0.244 0.501,-0.554 0.721,-0.804 0.597,0.488 1.213,0.991 1.814,1.482 -1.579,1.152 -2.036,2.169 -1.543,3.523 0.393,1.079 1.482,1.806 2.638,1.763 1.192,-0.044 2.224,-0.871 2.517,-2.019 0.334,-1.305 -0.209,-2.358 -1.583,-3.194 0.656,-0.598 1.334,-1.216 2.024,-1.845 0.715,1.141 1.806,1.773 3.293,1.368 1.158,-0.315 1.858,-1.137 2.007,-2.316 0.184,-1.461 -0.534,-2.458 -1.949,-3.112 1.377,-0.53 2.066,-1.505 2.235,-2.859 0.004,-0.088 0.008,-0.176 0.011,-0.264 -0.461,-1.585 -0.723,-1.937 -2.018,-2.643 1.25,-0.657 2.039,-1.603 1.908,-3.048 -0.128,-1.418 -0.968,-2.279 -2.211,-2.628 0.505,-0.411 1.096,-0.787 1.547,-1.289 0.492,-0.548 0.591,-1.272 0.453,-2.006 -0.211,-1.128 -1.102,-1.997 -2.229,-2.179 -1.33,-0.214 -2.266,0.376 -3.101,1.956 -0.3,-0.447 -0.542,-0.951 -0.915,-1.323 -0.38,-0.378 -0.89,-0.625 -1.247,-0.864 0.425,-0.389 0.989,-0.797 1.408,-1.322 0.464,-0.58 0.495,-1.313 0.312,-2.032 -0.282,-1.106 -1.248,-1.9 -2.394,-1.985 -1.324,-0.098 -2.205,0.575 -2.925,2.279 -0.352,-1.409 -1.129,-2.355 -2.591,-2.528 -1.338,-0.158 -2.296,0.477 -2.947,1.524 -0.579,-0.583 -1.16,-1.166 -1.757,-1.767 1.185,-0.775 1.753,-1.904 1.263,-3.399 -0.352,-1.075 -1.341,-1.768 -2.465,-1.819 -1.252,-0.055 -2.182,0.601 -2.862,2.069 -0.373,-1.37 -1.328,-2.041 -2.583,-2.369 -0.168,-0.021 -0.336,-0.042 -0.504,-0.064 -0.946,0.309 -1.908,0.592 -2.371,1.529 -0.651,-0.553 -1.245,-1.058 -1.854,-1.576 1.193,-0.727 1.843,-1.804 1.459,-3.297 -0.293,-1.135 -1.077,-1.845 -2.226,-2.026 -1.474,-0.231 -2.508,0.454 -3.174,1.855 -0.523,-1.048 -1.25,-1.742 -2.413,-1.976 1.754,-0.993 2.31,-1.942 2.002,-3.295 -0.261,-1.137 -1.241,-1.972 -2.41,-2.05 -1.288,-0.086 -2.278,0.649 -2.837,2.184 -0.416,-1.309 -1.189,-2.178 -2.525,-2.345 -1.367,-0.171 -2.335,0.483 -2.956,1.561 -0.619,-0.603 -1.234,-1.204 -1.874,-1.827 1.23,-0.785 1.892,-1.96 1.258,-3.547 -0.414,-1.039 -1.267,-1.597 -2.382,-1.633 -1.401,-0.046 -2.268,0.726 -2.8,2.128 -0.478,-1.309 -1.233,-2.2 -2.579,-2.365 -1.359,-0.166 -2.34,0.447 -3.039,1.582 -0.273,-0.343 -0.503,-0.699 -0.799,-0.985 -0.298,-0.289 -0.663,-0.51 -1.048,-0.799 1.378,-0.833 2.01,-2.01 1.44,-3.61 -0.383,-1.071 -1.386,-1.743 -2.519,-1.74 -1.356,0.003 -2.227,0.722 -2.762,2.028 -0.384,-1.151 -1.115,-1.888 -2.27,-2.236 1.647,-1.028 2.178,-2.088 1.766,-3.395 -0.35,-1.11 -1.415,-1.857 -2.583,-1.811 -1.163,0.046 -2.168,0.879 -2.431,2.015 -0.299,1.295 0.289,2.298 1.754,3.094 -0.619,0.473 -1.269,0.972 -1.906,1.459 -0.513,-0.436 -1.105,-0.939 -1.711,-1.455 1.19,-0.745 1.846,-1.843 1.414,-3.357 -0.32,-1.126 -1.124,-1.812 -2.279,-1.964 -1.429,-0.188 -2.418,0.498 -3.082,1.828 -0.59,-1.215 -1.47,-1.966 -2.796,-1.992 -1.307,-0.025 -2.225,0.63 -2.841,1.877 -0.518,-0.933 -1.166,-1.651 -2.253,-1.892 1.689,-1.111 2.177,-2.036 1.806,-3.316 -0.316,-1.085 -1.355,-1.862 -2.485,-1.857 -1.14,0.005 -2.157,0.781 -2.464,1.881 -0.355,1.269 0.143,2.186 1.818,3.274 -1.1,0.362 -1.859,1.046 -2.234,2.221 -0.682,-1.427 -1.698,-2.204 -3.243,-1.991 -1.164,0.16 -1.949,0.879 -2.273,1.983 -0.428,1.461 0.163,2.582 1.342,3.345 -0.583,0.627 -1.145,1.229 -1.72,1.846 -0.794,-1.228 -1.961,-1.798 -3.5,-1.254 -1.068,0.378 -1.731,1.378 -1.755,2.511 -0.027,1.27 0.656,2.178 2.165,2.832 -1.473,0.548 -2.29,1.537 -2.131,3.133 0.115,1.145 0.961,2.067 2.064,2.347 1.285,0.326 2.301,-0.125 3.228,-1.4 0.516,0.568 1.039,1.145 1.505,1.658 -0.477,0.628 -0.975,1.283 -1.383,1.819 -0.415,-0.428 -0.863,-1.03 -1.442,-1.451 -0.616,-0.446 -1.383,-0.433 -2.109,-0.18 -1.165,0.404 -1.875,1.519 -1.767,2.746 0.107,1.214 1.026,2.197 2.233,2.389 1.334,0.212 2.43,-0.509 3.07,-2.069 0.331,1.243 1.074,2.058 2.299,2.44 -1.647,0.9 -2.257,1.94 -1.958,3.276 0.267,1.191 1.291,2.054 2.507,2.111 1.335,0.063 2.337,-0.735 2.87,-2.41 0.34,1.585 1.34,2.333 2.713,2.668 0.162,0.007 0.325,0.015 0.487,0.022" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,291.35253,-374.26067)" + clip-path="url(#clipPath1)" + id="path205" /> + <path + d="m 0,0 c 0.168,0.021 0.336,0.042 0.504,0.064 0.571,-0.349 1.254,-0.596 1.688,-1.07 0.802,-0.873 0.772,-2.137 0.105,-3.071 -0.659,-0.922 -1.89,-1.312 -2.958,-0.936 -1.068,0.376 -1.778,1.438 -1.72,2.575 0.059,1.14 0.847,2.085 1.987,2.377 C -0.266,-0.028 -0.132,-0.02 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,280.2952,-343.53147)" + clip-path="url(#clipPath2)" + id="path206" /> + <path + d="m 0,0 c -0.162,-0.007 -0.324,-0.015 -0.486,-0.022 -0.583,0.332 -1.28,0.555 -1.724,1.02 -0.821,0.858 -0.814,2.108 -0.165,3.061 0.609,0.894 1.757,1.318 2.8,1.035 C 1.494,4.804 2.271,3.83 2.318,2.72 2.367,1.575 1.687,0.579 0.569,0.172 0.383,0.104 0.19,0.057 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,205.64947,-344.2528)" + clip-path="url(#clipPath3)" + id="path207" /> + <path + d="M 0,0 C -0.004,0.088 -0.008,0.176 -0.012,0.264 0.162,1.1 0.427,1.875 1.211,2.364 2.546,3.195 4.161,2.771 4.89,1.381 5.582,0.06 4.979,-1.533 3.559,-2.141 2.235,-2.707 0.67,-1.98 0.177,-0.567 0.111,-0.38 0.059,-0.189 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,314.77307,-377.44747)" + clip-path="url(#clipPath4)" + id="path208" /> + <path + d="m 0,0 c 0.732,-1.25 0.323,-2.785 -0.932,-3.504 -1.23,-0.705 -2.746,-0.304 -3.46,0.917 -0.731,1.25 -0.323,2.785 0.933,3.504 C -2.229,1.622 -0.714,1.22 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,193.0296,-311.85373)" + clip-path="url(#clipPath5)" + id="path209" /> + <path + d="m 0,0 c 0.688,-1.219 0.256,-2.753 -0.971,-3.446 -1.22,-0.688 -2.755,-0.258 -3.446,0.968 -0.688,1.22 -0.256,2.754 0.971,3.446 C -2.227,1.657 -0.691,1.226 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,245.86427,-319.26853)" + clip-path="url(#clipPath6)" + id="path210" /> + <path + d="m 0,0 c 0.69,-1.219 0.261,-2.753 -0.966,-3.447 -1.22,-0.691 -2.755,-0.261 -3.448,0.963 -0.69,1.219 -0.26,2.754 0.967,3.447 C -2.228,1.654 -0.692,1.225 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,245.8916,-371.8688)" + clip-path="url(#clipPath7)" + id="path211" /> + <path + d="M 0,0 C 0.671,-1.186 0.248,-2.737 -0.932,-3.417 -2.133,-4.11 -3.728,-3.666 -4.389,-2.454 -5.043,-1.255 -4.6,0.291 -3.412,0.951 -2.219,1.615 -0.67,1.183 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,298.6116,-349.24107)" + clip-path="url(#clipPath8)" + id="path212" /> + <path + d="M 0,0 C 0.691,-1.203 0.254,-2.78 -0.958,-3.454 -2.149,-4.117 -3.689,-3.691 -4.368,-2.512 -5.06,-1.309 -4.622,0.269 -3.41,0.943 -2.219,1.606 -0.679,1.18 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,215.6364,-304.16107)" + clip-path="url(#clipPath9)" + id="path213" /> + <path + d="M 0,0 C -1.192,-0.664 -2.742,-0.232 -3.412,0.95 -4.096,2.156 -3.639,3.749 -2.424,4.4 -1.22,5.046 0.326,4.594 0.976,3.405 1.63,2.207 1.187,0.661 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,319.93587,-367.29)" + clip-path="url(#clipPath10)" + id="path214" /> + <path + d="M 0,0 C -1.183,-0.664 -2.746,-0.229 -3.405,0.945 -4.068,2.127 -3.633,3.69 -2.457,4.35 -1.274,5.013 0.289,4.58 0.948,3.404 1.611,2.223 1.176,0.66 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,312.5036,-389.83427)" + clip-path="url(#clipPath11)" + id="path215" /> + <path + d="m 0,0 c 0.665,-1.191 0.246,-2.668 -0.944,-3.333 -1.193,-0.666 -2.67,-0.249 -3.334,0.941 -0.665,1.191 -0.247,2.668 0.944,3.334 C -2.143,1.607 -0.665,1.19 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,260.76013,-326.61093)" + clip-path="url(#clipPath12)" + id="path216" /> + <path + d="M 0,0 C -0.677,1.184 -0.276,2.648 0.909,3.326 2.094,4.003 3.559,3.604 4.235,2.42 4.912,1.235 4.513,-0.229 3.327,-0.906 2.142,-1.583 0.678,-1.185 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,194.86947,-301.01907)" + clip-path="url(#clipPath13)" + id="path217" /> + <path + d="m 0,0 c -1.189,-0.671 -2.668,-0.259 -3.338,0.929 -0.67,1.188 -0.257,2.667 0.932,3.337 1.19,0.67 2.669,0.258 3.338,-0.929 C 1.602,2.148 1.188,0.669 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,282.34213,-389.93907)" + clip-path="url(#clipPath14)" + id="path218" /> + <path + d="M 0,0 C 1.187,0.674 2.667,0.267 3.34,-0.919 4.014,-2.107 3.604,-3.585 2.417,-4.259 1.229,-4.933 -0.25,-4.526 -0.923,-3.339 -1.596,-2.152 -1.187,-0.674 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,226.35,-365.65253)" + clip-path="url(#clipPath15)" + id="path219" /> + <path + d="m 0,0 c 0.652,-1.163 0.247,-2.601 -0.921,-3.264 -1.186,-0.674 -2.642,-0.254 -3.304,0.953 -0.639,1.165 -0.213,2.598 0.966,3.252 C -2.096,1.587 -0.658,1.172 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,321.10907,-386.70853)" + clip-path="url(#clipPath16)" + id="path220" /> + <path + d="M 0,0 C 0.671,-1.135 0.274,-2.631 -0.871,-3.286 -1.994,-3.928 -3.455,-3.542 -4.112,-2.43 -4.783,-1.295 -4.387,0.201 -3.241,0.856 -2.119,1.499 -0.658,1.112 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,275.7028,-334.27827)" + clip-path="url(#clipPath17)" + id="path221" /> + <path + d="M 0,0 C 0.657,-1.159 0.244,-2.62 -0.925,-3.273 -2.087,-3.922 -3.546,-3.5 -4.192,-2.328 -4.821,-1.187 -4.415,0.248 -3.279,0.9 -2.121,1.564 -0.658,1.163 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,268.37987,-386.86547)" + clip-path="url(#clipPath18)" + id="path222" /> + <path + d="m 0,0 c -1.106,-0.657 -2.586,-0.284 -3.255,0.821 -0.678,1.121 -0.282,2.64 0.859,3.293 1.12,0.641 2.593,0.247 3.243,-0.866 C 1.495,2.136 1.11,0.659 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,214.43587,-352.59333)" + clip-path="url(#clipPath19)" + id="path223" /> + <path + d="M 0,0 C 1.115,0.637 2.604,0.228 3.227,-0.888 3.854,-2.012 3.433,-3.497 2.313,-4.108 1.202,-4.714 -0.233,-4.319 -0.868,-3.231 -1.514,-2.126 -1.113,-0.636 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,309.0348,-357.8668)" + clip-path="url(#clipPath20)" + id="path224" /> + <path + d="M 0,0 C 0.641,-1.119 0.227,-2.603 -0.898,-3.219 -2.014,-3.83 -3.446,-3.431 -4.073,-2.335 -4.714,-1.216 -4.3,0.268 -3.175,0.884 -2.06,1.495 -0.627,1.096 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,222.988,-304.092)" + clip-path="url(#clipPath21)" + id="path225" /> + <path + d="m 0,0 c 0.651,-1.092 0.291,-2.521 -0.805,-3.188 -1.107,-0.673 -2.58,-0.291 -3.226,0.837 -0.635,1.108 -0.254,2.53 0.849,3.176 C -2.081,1.468 -0.654,1.098 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,192.84867,-341.82973)" + clip-path="url(#clipPath22)" + id="path226" /> + <path + d="m 0,0 c 0.646,-1.127 0.265,-2.513 -0.869,-3.153 -1.13,-0.639 -2.514,-0.248 -3.147,0.889 -0.618,1.11 -0.244,2.467 0.857,3.107 C -2.035,1.498 -0.646,1.127 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,253.1208,-379.33493)" + clip-path="url(#clipPath23)" + id="path227" /> + <path + d="M 0,0 C 1.135,0.615 2.527,0.203 3.142,-0.931 3.757,-2.064 3.343,-3.457 2.208,-4.072 1.073,-4.687 -0.319,-4.274 -0.934,-3.141 -1.548,-2.007 -1.135,-0.615 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,233.85387,-312.89147)" + clip-path="url(#clipPath24)" + id="path228" /> + <path + d="M 0,0 C 0.646,-1.127 0.264,-2.512 -0.869,-3.152 -2,-3.791 -3.384,-3.4 -4.017,-2.263 -4.635,-1.153 -4.261,0.204 -3.16,0.844 -2.035,1.499 -0.646,1.127 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,185.2888,-326.78667)" + clip-path="url(#clipPath25)" + id="path229" /> + <path + d="M 0,0 C -0.631,1.13 -0.227,2.495 0.925,3.122 2.034,3.727 3.378,3.33 4.002,2.213 4.634,1.084 4.229,-0.282 3.078,-0.909 1.968,-1.513 0.624,-1.116 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,285.43453,-338.6708)" + clip-path="url(#clipPath26)" + id="path230" /> + <path + d="M 0,0 C 1.104,0.643 2.465,0.292 3.109,-0.8 3.771,-1.924 3.404,-3.303 2.271,-3.947 1.165,-4.576 -0.189,-4.206 -0.825,-3.102 -1.461,-1.998 -1.1,-0.641 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,181.1312,-320.33427)" + clip-path="url(#clipPath27)" + id="path231" /> + <path + d="M 0,0 C 0.628,-1.103 0.252,-2.466 -0.855,-3.097 -1.959,-3.726 -3.322,-3.35 -3.953,-2.244 -4.581,-1.141 -4.205,0.222 -3.098,0.853 -1.994,1.481 -0.631,1.106 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,320.8252,-364.07507)" + clip-path="url(#clipPath28)" + id="path232" /> + <path + d="M 0,0 C 0.635,-1.091 0.255,-2.486 -0.847,-3.107 -1.922,-3.715 -3.289,-3.344 -3.909,-2.275 -4.544,-1.184 -4.164,0.21 -3.063,0.832 -1.986,1.439 -0.62,1.068 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,200.37213,-349.20013)" + clip-path="url(#clipPath29)" + id="path233" /> + <path + d="M 0,0 C -1.05,-0.612 -2.456,-0.241 -3.069,0.81 -3.682,1.859 -3.31,3.265 -2.257,3.879 -1.207,4.491 0.199,4.12 0.812,3.069 1.425,2.02 1.052,0.614 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,237.0596,-367.66693)" + clip-path="url(#clipPath30)" + id="path234" /> + <path + d="M 0,0 C -1.062,-0.598 -2.464,-0.208 -3.059,0.85 -3.655,1.912 -3.266,3.313 -2.206,3.908 -1.144,4.505 0.258,4.116 0.853,3.058 1.449,1.996 1.059,0.595 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,251.7848,-314.9716)" + clip-path="url(#clipPath31)" + id="path235" /> + <path + d="m 0,0 c 0.609,-1.053 0.218,-2.474 -0.845,-3.06 -1.048,-0.579 -2.418,-0.201 -3.014,0.83 -0.61,1.053 -0.217,2.474 0.844,3.06 C -1.966,1.409 -0.597,1.031 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,298.21067,-401.82253)" + clip-path="url(#clipPath32)" + id="path236" /> + <path + d="m 0,0 c 0.62,-1.058 0.268,-2.384 -0.796,-2.997 -1.064,-0.612 -2.388,-0.252 -2.991,0.816 -0.592,1.046 -0.25,2.336 0.783,2.952 C -1.949,1.4 -0.621,1.059 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,305.6052,-349.01907)" + clip-path="url(#clipPath33)" + id="path237" /> + <path + d="M 0,0 C 1.07,0.599 2.364,0.219 2.955,-0.867 3.525,-1.917 3.152,-3.186 2.098,-3.776 1.027,-4.375 -0.267,-3.996 -0.856,-2.909 -1.428,-1.858 -1.054,-0.59 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,271.79133,-395.2516)" + clip-path="url(#clipPath34)" + id="path238" /> + <path + d="m 0,0 c 0.603,-1.067 0.233,-2.367 -0.842,-2.965 -1.07,-0.596 -2.369,-0.217 -2.96,0.861 -0.574,1.05 -0.213,2.322 0.83,2.92 C -1.907,1.428 -0.604,1.07 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,305.79787,-401.652)" + clip-path="url(#clipPath35)" + id="path239" /> + <path + d="m 0,0 c 0.586,-1.042 0.216,-2.332 -0.838,-2.917 -1.044,-0.58 -2.332,-0.2 -2.912,0.858 -0.559,1.022 -0.194,2.289 0.826,2.872 C -1.881,1.408 -0.591,1.049 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,192.63373,-303.97547)" + clip-path="url(#clipPath36)" + id="path240" /> + <path + d="m 0,0 c 0.594,-1.044 0.238,-2.325 -0.811,-2.922 -1.044,-0.595 -2.326,-0.24 -2.922,0.808 -0.594,1.044 -0.239,2.325 0.81,2.922 C -1.877,1.402 -0.597,1.048 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,185.15587,-334.05947)" + clip-path="url(#clipPath37)" + id="path241" /> + <path + d="m 0,0 c 0.61,-1.038 0.271,-2.334 -0.767,-2.936 -1.04,-0.603 -2.335,-0.255 -2.93,0.787 -0.582,1.018 -0.249,2.293 0.754,2.891 C -1.907,1.359 -0.605,1.031 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,267.90987,-326.51653)" + clip-path="url(#clipPath38)" + id="path242" /> + <path + d="m 0,0 c -1.042,-0.588 -2.333,-0.22 -2.918,0.833 -0.58,1.042 -0.2,2.331 0.857,2.911 1.023,0.561 2.29,0.199 2.873,-0.82 C 1.408,1.883 1.05,0.592 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,221.8056,-360.2796)" + clip-path="url(#clipPath39)" + id="path243" /> + <path + d="m 0,0 c 0.585,-0.976 0.237,-2.318 -0.749,-2.897 -0.986,-0.579 -2.323,-0.223 -2.893,0.77 -0.556,0.97 -0.221,2.263 0.738,2.852 C -1.934,1.319 -0.59,0.984 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,290.65987,-401.81333)" + clip-path="url(#clipPath40)" + id="path244" /> + <path + d="M 0,0 C -1.019,-0.542 -2.35,-0.136 -2.861,0.873 -3.373,1.885 -2.981,3.167 -2,3.689 -0.981,4.231 0.35,3.825 0.86,2.816 1.373,1.804 0.981,0.522 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,319.59347,-390.23467)" + clip-path="url(#clipPath41)" + id="path245" /> + <path + d="M 0,0 C 0.571,-0.975 0.232,-2.262 -0.746,-2.835 -1.722,-3.407 -3.009,-3.07 -3.582,-2.092 -4.153,-1.117 -3.815,0.17 -2.836,0.744 -1.86,1.315 -0.573,0.978 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,185.096,-311.56333)" + clip-path="url(#clipPath42)" + id="path246" /> + <path + d="M 0,0 C 0.991,0.543 2.282,0.179 2.831,-0.797 3.396,-1.802 3.006,-3.139 1.996,-3.666 0.989,-4.19 -0.297,-3.807 -0.821,-2.824 -1.355,-1.826 -0.979,-0.538 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,256.6976,-387.67933)" + clip-path="url(#clipPath43)" + id="path247" /> + <path + d="M 0,0 C -0.999,-0.569 -2.251,-0.221 -2.811,0.781 -3.371,1.783 -3.012,3.033 -2.005,3.585 -1.02,4.125 0.196,3.787 0.76,2.816 1.337,1.825 0.998,0.568 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,229.1768,-300.20467)" + clip-path="url(#clipPath44)" + id="path248" /> + <path + d="m 0,0 c 0.567,-1.009 0.21,-2.238 -0.812,-2.793 -0.992,-0.54 -2.193,-0.191 -2.749,0.797 -0.566,1.009 -0.209,2.238 0.813,2.793 C -1.757,1.336 -0.555,0.988 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,282.97107,-333.88373)" + clip-path="url(#clipPath45)" + id="path249" /> + <path + d="M 0,0 C 0.566,-0.987 0.246,-2.187 -0.737,-2.76 -1.745,-3.347 -2.97,-3.01 -3.537,-1.99 -4.088,-1 -3.746,0.198 -2.754,0.758 -1.765,1.317 -0.566,0.988 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,207.61813,-356.622)" + clip-path="url(#clipPath46)" + id="path250" /> + <path + d="M 0,0 C 0.931,0.55 2.17,0.23 2.721,-0.702 3.27,-1.632 2.949,-2.871 2.017,-3.422 1.086,-3.972 -0.154,-3.652 -0.704,-2.72 -1.254,-1.79 -0.933,-0.551 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,241.46453,-312.26453)" + clip-path="url(#clipPath47)" + id="path251" /> + <path + d="m 0,0 c 0.541,-0.936 0.209,-2.172 -0.728,-2.714 -0.936,-0.542 -2.173,-0.212 -2.714,0.725 -0.541,0.935 -0.21,2.172 0.727,2.714 C -1.778,1.266 -0.542,0.936 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,245.3552,-379.1728)" + clip-path="url(#clipPath48)" + id="path252" /> + <path + d="M 0,0 C -0.933,-0.536 -2.194,-0.185 -2.707,0.754 -3.213,1.679 -2.873,2.893 -1.963,3.416 -1.029,3.952 0.231,3.601 0.745,2.662 1.25,1.736 0.911,0.523 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,296.95933,-337.9176)" + clip-path="url(#clipPath49)" + id="path253" /> + <path + d="M 0,0 C -0.932,-0.538 -2.193,-0.188 -2.709,0.75 -3.216,1.674 -2.878,2.888 -1.969,3.413 -1.037,3.951 0.225,3.602 0.74,2.663 1.247,1.739 0.909,0.525 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,312.13507,-398.00347)" + clip-path="url(#clipPath50)" + id="path254" /> + <path + d="M 0,0 C 0.911,0.534 2.128,0.215 2.664,-0.699 3.197,-1.609 2.877,-2.826 1.963,-3.362 1.052,-3.896 -0.165,-3.577 -0.701,-2.663 -1.235,-1.752 -0.915,-0.536 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,324.5856,-379.89347)" + clip-path="url(#clipPath51)" + id="path255" /> + <path + d="M 0,0 C -0.917,-0.52 -2.136,-0.191 -2.665,0.719 -3.206,1.648 -2.853,2.915 -1.91,3.422 -0.978,3.924 0.237,3.575 0.743,2.659 1.254,1.735 0.914,0.518 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,206.4228,-292.77627)" + clip-path="url(#clipPath52)" + id="path256" /> + <path + d="M 0,0 C -0.507,0.932 -0.176,2.044 0.762,2.562 1.715,3.089 2.85,2.742 3.361,1.766 3.854,0.83 3.504,-0.275 2.556,-0.782 1.621,-1.281 0.512,-0.941 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,210.4476,-293.898)" + clip-path="url(#clipPath53)" + id="path257" /> + <path + d="M 0,0 C -0.929,-0.521 -2.045,-0.21 -2.573,0.717 -3.114,1.665 -2.785,2.806 -1.819,3.33 -0.887,3.835 0.226,3.504 0.742,2.567 1.256,1.637 0.934,0.523 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,326.9268,-367.96373)" + clip-path="url(#clipPath54)" + id="path258" /> + <path + d="m 0,0 c 0.539,-0.923 0.246,-2.044 -0.675,-2.582 -0.924,-0.539 -2.046,-0.247 -2.582,0.673 -0.539,0.923 -0.246,2.044 0.675,2.582 C -1.658,1.212 -0.537,0.92 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,260.03347,-318.898)" + clip-path="url(#clipPath55)" + id="path259" /> + <path + d="M 0,0 C -0.917,-0.529 -2.056,-0.214 -2.573,0.712 -3.074,1.609 -2.766,2.723 -1.871,3.239 -0.955,3.768 0.184,3.453 0.701,2.527 1.202,1.63 0.894,0.516 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,229.1664,-368.1988)" + clip-path="url(#clipPath56)" + id="path260" /> + <path + d="m 0,0 c 0.517,-0.876 0.219,-2.029 -0.659,-2.545 -0.877,-0.518 -2.029,-0.22 -2.546,0.656 -0.517,0.877 -0.218,2.029 0.659,2.546 C -1.669,1.173 -0.517,0.876 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,282.83173,-401.5868)" + clip-path="url(#clipPath57)" + id="path261" /> + <path + d="M 0,0 C 0.888,0.515 2.021,0.221 2.541,-0.661 3.076,-1.567 2.764,-2.726 1.844,-3.24 0.951,-3.74 -0.177,-3.425 -0.685,-2.534 -1.192,-1.644 -0.887,-0.515 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,316.984,-357.1832)" + clip-path="url(#clipPath58)" + id="path262" /> + <path + d="M 0,0 C -0.887,-0.496 -2.046,-0.164 -2.53,0.723 -3.017,1.615 -2.674,2.771 -1.782,3.247 -0.908,3.713 0.213,3.392 0.703,2.536 1.206,1.655 0.884,0.494 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,191.33693,-345.63507)" + clip-path="url(#clipPath59)" + id="path263" /> + <path + d="M 0,0 C 0.847,0.494 1.994,0.197 2.5,-0.647 3.016,-1.507 2.694,-2.699 1.816,-3.186 0.954,-3.663 -0.187,-3.345 -0.672,-2.493 -1.156,-1.639 -0.849,-0.496 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,181.54787,-342.39613)" + clip-path="url(#clipPath60)" + id="path264" /> + <path + d="M 0,0 C 0.882,0.502 2.043,0.179 2.535,-0.706 3.028,-1.592 2.693,-2.751 1.805,-3.234 0.935,-3.707 -0.187,-3.395 -0.685,-2.541 -1.195,-1.666 -0.881,-0.502 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,196.514,-297.232)" + clip-path="url(#clipPath61)" + id="path265" /> + <path + d="m 0,0 c 0.478,-0.861 0.153,-2.005 -0.703,-2.479 -0.861,-0.479 -2.005,-0.155 -2.48,0.7 C -3.66,-0.918 -3.336,0.226 -2.48,0.7 -1.618,1.178 -0.475,0.855 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,267.67547,-394.0256)" + clip-path="url(#clipPath62)" + id="path266" /> + <path + d="M 0,0 C -0.854,-0.487 -2,-0.175 -2.485,0.677 -2.973,1.531 -2.66,2.676 -1.807,3.163 -0.952,3.65 0.193,3.338 0.68,2.486 1.166,1.632 0.854,0.486 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,311.84347,-345.48587)" + clip-path="url(#clipPath63)" + id="path267" /> + <path + d="M 0,0 C 0.843,0.499 1.993,0.201 2.494,-0.646 2.992,-1.489 2.693,-2.639 1.846,-3.14 1.003,-3.639 -0.147,-3.34 -0.648,-2.494 -1.146,-1.651 -0.848,-0.501 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,324.6208,-387.29067)" + clip-path="url(#clipPath64)" + id="path268" /> + <path + d="M 0,0 C -0.846,-0.499 -1.916,-0.234 -2.429,0.601 -2.956,1.459 -2.682,2.562 -1.813,3.074 -0.945,3.586 0.152,3.292 0.647,2.416 1.131,1.561 0.846,0.499 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,274.2132,-323.064)" + clip-path="url(#clipPath65)" + id="path269" /> + <path + d="m 0,0 c 0.497,-0.876 0.186,-1.967 -0.701,-2.45 -0.861,-0.469 -1.921,-0.166 -2.405,0.687 -0.498,0.877 -0.186,1.968 0.701,2.45 C -1.544,1.156 -0.484,0.854 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,214.93587,-363.89147)" + clip-path="url(#clipPath66)" + id="path270" /> + <path + d="M 0,0 C 0.823,0.471 1.885,0.183 2.356,-0.639 2.827,-1.461 2.538,-2.523 1.715,-2.994 0.893,-3.465 -0.17,-3.177 -0.641,-2.355 -1.111,-1.533 -0.822,-0.471 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,249.3564,-387.1936)" + clip-path="url(#clipPath67)" + id="path271" /> + <path + d="M 0,0 C 0.812,0.488 1.881,0.221 2.368,-0.592 2.855,-1.404 2.588,-2.472 1.774,-2.959 0.962,-3.447 -0.106,-3.18 -0.594,-2.368 -1.081,-1.556 -0.813,-0.487 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,234.18587,-304.60507)" + clip-path="url(#clipPath68)" + id="path272" /> + <path + d="m 0,0 c 0.473,-0.819 0.167,-1.91 -0.661,-2.364 -0.808,-0.443 -1.86,-0.149 -2.318,0.647 -0.472,0.819 -0.167,1.91 0.661,2.363 C -1.51,1.089 -0.459,0.796 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,222.2132,-296.28867)" + clip-path="url(#clipPath69)" + id="path273" /> + <path + d="m 0,0 c -0.793,-0.458 -1.861,-0.167 -2.309,0.629 -0.45,0.8 -0.147,1.864 0.654,2.302 C -0.87,3.36 0.151,3.082 0.608,2.314 1.074,1.529 0.794,0.459 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,198.846,-353.28547)" + clip-path="url(#clipPath70)" + id="path274" /> + <path + d="M 0,0 C -0.789,-0.456 -1.864,-0.167 -2.32,0.621 -2.775,1.409 -2.486,2.484 -1.697,2.94 -0.908,3.396 0.167,3.107 0.623,2.319 1.078,1.531 0.789,0.456 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,326.86947,-360.6676)" + clip-path="url(#clipPath71)" + id="path275" /> + <path + d="M 0,0 C -0.446,0.796 -0.147,1.868 0.646,2.313 1.442,2.76 2.515,2.461 2.959,1.669 3.406,0.874 3.106,-0.199 2.313,-0.644 1.518,-1.091 0.444,-0.792 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,286.1728,-331.48853)" + clip-path="url(#clipPath72)" + id="path276" /> + <path + d="M 0,0 C -0.806,-0.461 -1.847,-0.167 -2.289,0.646 -2.721,1.439 -2.437,2.44 -1.653,2.889 -0.848,3.35 0.193,3.056 0.636,2.243 1.067,1.449 0.784,0.448 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,183.69893,-300.6096)" + clip-path="url(#clipPath73)" + id="path277" /> + <path + d="M 0,0 C -0.807,-0.47 -1.773,-0.211 -2.235,0.599 -2.697,1.407 -2.428,2.371 -1.612,2.828 -0.824,3.27 0.117,3.018 0.578,2.242 1.055,1.438 0.805,0.469 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,176.1676,-323.33613)" + clip-path="url(#clipPath74)" + id="path278" /> + <path + d="m 0,0 c 0.457,-0.808 0.177,-1.771 -0.646,-2.219 -0.79,-0.43 -1.727,-0.157 -2.173,0.632 -0.457,0.808 -0.177,1.77 0.645,2.218 C -1.385,1.062 -0.446,0.789 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,252.23667,-311.09013)" + clip-path="url(#clipPath75)" + id="path279" /> + <path + d="m 0,0 c 0.472,-0.804 0.211,-1.771 -0.602,-2.23 -0.786,-0.445 -1.728,-0.192 -2.185,0.586 -0.472,0.804 -0.211,1.772 0.6,2.231 C -1.399,1.031 -0.457,0.778 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,176.97493,-318.76133)" + clip-path="url(#clipPath76)" + id="path280" /> + <path + d="M 0,0 C 0.81,0.451 1.771,0.163 2.213,-0.664 2.637,-1.455 2.354,-2.39 1.56,-2.832 0.75,-3.282 -0.211,-2.994 -0.653,-2.167 -1.077,-1.377 -0.795,-0.442 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,234.47227,-379.68573)" + clip-path="url(#clipPath77)" + id="path281" /> + <path + d="M 0,0 C 0.424,-0.76 0.126,-1.771 -0.641,-2.174 -1.39,-2.568 -2.36,-2.282 -2.77,-1.547 -3.193,-0.786 -2.896,0.224 -2.129,0.627 -1.38,1.021 -0.408,0.735 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,304.98013,-341.03213)" + clip-path="url(#clipPath78)" + id="path282" /> + <path + d="M 0,0 C 0.729,0.418 1.716,0.157 2.144,-0.567 2.582,-1.309 2.297,-2.34 1.54,-2.749 0.799,-3.149 -0.185,-2.867 -0.591,-2.137 -1.001,-1.401 -0.729,-0.418 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,317.3252,-402.14933)" + clip-path="url(#clipPath79)" + id="path283" /> + <path + d="M 0,0 C -0.731,-0.414 -1.717,-0.149 -2.141,0.577 -2.575,1.322 -2.286,2.351 -1.527,2.756 -0.783,3.153 0.199,2.866 0.602,2.134 1.007,1.397 0.729,0.413 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,191.22493,-293.21253)" + clip-path="url(#clipPath80)" + id="path284" /> + <path + d="M 0,0 C 0.423,-0.742 0.143,-1.724 -0.605,-2.126 -1.339,-2.52 -2.277,-2.253 -2.687,-1.535 -3.11,-0.793 -2.83,0.189 -2.081,0.591 -1.349,0.985 -0.41,0.718 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,274.93853,-401.30227)" + clip-path="url(#clipPath81)" + id="path285" /> + <path + d="M 0,0 C -0.727,-0.443 -1.715,-0.188 -2.141,0.551 -2.554,1.269 -2.31,2.213 -1.6,2.646 -0.873,3.089 0.115,2.834 0.541,2.095 0.954,1.377 0.71,0.433 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,296.90333,-406.05173)" + clip-path="url(#clipPath82)" + id="path286" /> + <path + d="M 0,0 C -0.747,-0.417 -1.642,-0.155 -2.053,0.6 -2.461,1.349 -2.189,2.241 -1.429,2.646 -0.699,3.035 0.167,2.781 0.579,2.059 1.002,1.314 0.75,0.418 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,221.34213,-368.55693)" + clip-path="url(#clipPath83)" + id="path287" /> + <path + d="M 0,0 C 0.425,-0.744 0.174,-1.64 -0.577,-2.059 -1.323,-2.476 -2.219,-2.216 -2.63,-1.461 -3.026,-0.735 -2.783,0.133 -2.065,0.552 -1.324,0.985 -0.425,0.745 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,327.5504,-393.73587)" + clip-path="url(#clipPath84)" + id="path288" /> + <path + d="M 0,0 C 0.744,0.428 1.641,0.181 2.062,-0.567 2.48,-1.312 2.223,-2.208 1.47,-2.622 0.743,-3.022 -0.125,-2.783 -0.546,-2.067 -0.981,-1.327 -0.744,-0.428 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,264.49973,-319.2568)" + clip-path="url(#clipPath85)" + id="path289" /> + <path + d="m 0,0 c 0.428,-0.745 0.176,-1.632 -0.58,-2.049 -0.727,-0.4 -1.59,-0.156 -2.004,0.567 -0.428,0.744 -0.177,1.631 0.58,2.048 C -1.277,0.966 -0.415,0.722 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,176.9072,-333.83227)" + clip-path="url(#clipPath86)" + id="path290" /> + <path + d="m 0,0 c 0.437,-0.743 0.198,-1.632 -0.553,-2.056 -0.725,-0.409 -1.59,-0.177 -2.011,0.539 -0.438,0.744 -0.199,1.632 0.553,2.057 C -1.286,0.948 -0.422,0.716 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,304.94107,-408.78667)" + clip-path="url(#clipPath87)" + id="path291" /> + <path + d="M 0,0 C 0.391,-0.663 0.151,-1.582 -0.515,-1.975 -1.178,-2.366 -2.098,-2.127 -2.49,-1.462 -2.881,-0.8 -2.642,0.12 -1.976,0.513 -1.312,0.904 -0.393,0.666 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,176.82,-311.09533)" + clip-path="url(#clipPath88)" + id="path292" /> + <path + d="m 0,0 c 0.376,-0.676 0.116,-1.589 -0.557,-1.963 -0.676,-0.376 -1.59,-0.118 -1.964,0.555 -0.375,0.676 -0.116,1.59 0.557,1.963 C -1.287,0.931 -0.374,0.673 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,282.2328,-326.10053)" + clip-path="url(#clipPath89)" + id="path293" /> + <path + d="M 0,0 C 0.703,0.387 1.626,0.111 1.992,-0.597 2.35,-1.286 2.083,-2.171 1.406,-2.543 0.704,-2.931 -0.219,-2.654 -0.586,-1.947 -0.943,-1.258 -0.677,-0.373 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,257.06733,-394.48653)" + clip-path="url(#clipPath90)" + id="path294" /> + <path + d="m 0,0 c 0.39,-0.662 0.143,-1.583 -0.525,-1.964 -0.671,-0.382 -1.589,-0.125 -1.959,0.547 -0.361,0.653 -0.126,1.53 0.513,1.918 C -1.316,0.899 -0.392,0.664 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,289.846,-408.88507)" + clip-path="url(#clipPath91)" + id="path295" /> + <path + d="m 0,0 c 0.381,-0.67 0.122,-1.588 -0.55,-1.958 -0.677,-0.371 -1.595,-0.103 -1.952,0.572 -0.352,0.662 -0.105,1.534 0.538,1.912 C -1.301,0.915 -0.379,0.668 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,229.52053,-295.982)" + clip-path="url(#clipPath92)" + id="path296" /> + <path + d="m 0,0 c 0.393,-0.66 0.15,-1.582 -0.518,-1.967 -0.667,-0.385 -1.586,-0.132 -1.961,0.538 -0.363,0.652 -0.132,1.53 0.505,1.922 C -1.321,0.894 -0.395,0.662 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,206.86947,-363.7932)" + clip-path="url(#clipPath93)" + id="path297" /> + <path + d="M 0,0 C -0.659,-0.372 -1.453,-0.149 -1.825,0.511 -2.195,1.17 -1.973,1.963 -1.312,2.336 -0.652,2.707 0.141,2.484 0.514,1.824 0.884,1.166 0.661,0.372 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,243.8916,-383.83427)" + clip-path="url(#clipPath94)" + id="path298" /> + <path + d="M 0,0 C -0.356,0.668 -0.116,1.449 0.558,1.816 1.247,2.192 2.052,1.936 2.411,1.224 2.752,0.552 2.493,-0.223 1.81,-0.578 1.139,-0.926 0.36,-0.678 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,316.58947,-346.80693)" + clip-path="url(#clipPath95)" + id="path299" /> + <path + d="M 0,0 C 0.388,-0.66 0.188,-1.45 -0.464,-1.842 -1.145,-2.25 -1.958,-2.036 -2.345,-1.345 -2.718,-0.68 -2.499,0.104 -1.836,0.484 -1.174,0.865 -0.387,0.657 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,184.28747,-348.7444)" + clip-path="url(#clipPath96)" + id="path300" /> + <path + d="M 0,0 C -0.667,-0.367 -1.449,-0.143 -1.825,0.524 -2.212,1.21 -1.969,2.019 -1.265,2.388 -0.595,2.74 0.185,2.495 0.548,1.819 0.907,1.151 0.672,0.371 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,243.626,-301.01067)" + clip-path="url(#clipPath97)" + id="path301" /> + <path + d="M 0,0 C -0.653,-0.356 -1.466,-0.112 -1.815,0.547 -2.163,1.202 -1.907,2.013 -1.244,2.354 -0.607,2.683 0.174,2.447 0.525,1.821 0.89,1.171 0.654,0.357 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,296.38893,-331.00213)" + clip-path="url(#clipPath98)" + id="path302" /> + <path + d="M 0,0 C 0.623,0.342 1.439,0.11 1.788,-0.507 2.15,-1.146 1.896,-2 1.245,-2.334 0.613,-2.659 -0.2,-2.406 -0.531,-1.782 -0.864,-1.155 -0.622,-0.341 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,309.93067,-409.36933)" + clip-path="url(#clipPath99)" + id="path303" /> + <path + d="M 0,0 C 0.604,0.369 1.432,0.173 1.81,-0.429 2.2,-1.049 1.982,-1.912 1.345,-2.277 0.729,-2.631 -0.092,-2.415 -0.453,-1.804 -0.814,-1.194 -0.607,-0.37 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,324.8656,-356.59013)" + clip-path="url(#clipPath100)" + id="path304" /> + <path + d="m 0,0 c -0.597,-0.368 -1.449,-0.15 -1.8,0.46 -0.338,0.588 -0.131,1.397 0.449,1.754 0.597,0.369 1.45,0.15 1.8,-0.46 C 0.787,1.167 0.58,0.358 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,191.2288,-353.79187)" + clip-path="url(#clipPath101)" + id="path305" /> + <path + d="m 0,0 c 0.331,-0.604 0.11,-1.387 -0.488,-1.726 -0.62,-0.353 -1.443,-0.11 -1.765,0.521 -0.314,0.616 -0.073,1.393 0.532,1.714 C -1.111,0.832 -0.33,0.601 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,259.3968,-310.90253)" + clip-path="url(#clipPath102)" + id="path306" /> + <path + d="M 0,0 C 0.607,0.329 1.389,0.104 1.725,-0.495 2.072,-1.117 1.825,-1.937 1.192,-2.256 0.573,-2.568 -0.202,-2.324 -0.52,-1.718 -0.839,-1.106 -0.604,-0.326 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,227.14947,-379.24373)" + clip-path="url(#clipPath103)" + id="path307" /> + <path + d="M 0,0 C -0.611,-0.371 -1.362,-0.185 -1.725,0.428 -2.088,1.042 -1.891,1.791 -1.272,2.146 -0.676,2.489 0.044,2.311 0.406,1.73 0.785,1.125 0.607,0.37 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,206.04133,-286.08227)" + clip-path="url(#clipPath104)" + id="path308" /> + <path + d="M 0,0 C 0.623,0.346 1.365,0.127 1.704,-0.501 2.041,-1.127 1.812,-1.868 1.179,-2.199 0.571,-2.517 -0.14,-2.307 -0.48,-1.71 -0.834,-1.091 -0.625,-0.346 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,332.484,-379.06733)" + clip-path="url(#clipPath105)" + id="path309" /> + <path + d="M 0,0 C 0.359,-0.598 0.188,-1.316 -0.399,-1.679 -1.018,-2.06 -1.761,-1.873 -2.118,-1.246 -2.463,-0.642 -2.273,0.069 -1.674,0.421 -1.072,0.773 -0.357,0.594 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,176.6312,-341.08493)" + clip-path="url(#clipPath106)" + id="path310" /> + <path + d="M 0,0 C -0.554,-0.329 -1.291,-0.146 -1.628,0.404 -1.978,0.975 -1.774,1.745 -1.187,2.07 -0.624,2.383 0.107,2.179 0.428,1.621 0.748,1.062 0.555,0.329 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,281.4632,-406.50347)" + clip-path="url(#clipPath107)" + id="path311" /> + <path + d="M 0,0 C 0.323,-0.591 0.103,-1.321 -0.497,-1.64 -1.092,-1.956 -1.819,-1.726 -2.13,-1.122 -2.426,-0.547 -2.214,0.153 -1.646,0.473 -1.057,0.805 -0.325,0.595 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,214.1312,-288.31733)" + clip-path="url(#clipPath108)" + id="path312" /> + <path + d="M 0,0 C 0.314,-0.562 0.113,-1.293 -0.444,-1.616 -1.024,-1.952 -1.79,-1.731 -2.101,-1.139 -2.398,-0.568 -2.176,0.16 -1.61,0.466 -1.044,0.773 -0.314,0.562 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,266.988,-401.00867)" + clip-path="url(#clipPath109)" + id="path313" /> + <path + d="M 0,0 C -0.554,-0.313 -1.301,-0.107 -1.612,0.445 -1.925,0.998 -1.719,1.744 -1.167,2.057 -0.613,2.37 0.134,2.164 0.445,1.612 0.759,1.059 0.552,0.312 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,213.6,-368.89027)" + clip-path="url(#clipPath110)" + id="path314" /> + <path + d="M 0,0 C -0.582,-0.349 -1.318,-0.16 -1.659,0.425 -2,1.011 -1.801,1.744 -1.21,2.077 -0.644,2.397 0.064,2.217 0.404,1.665 0.759,1.088 0.579,0.346 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,334.1572,-368.6936)" + clip-path="url(#clipPath111)" + id="path315" /> + <path + d="m 0,0 c 0.327,-0.541 0.14,-1.294 -0.405,-1.623 -0.541,-0.327 -1.294,-0.14 -1.623,0.404 -0.327,0.541 -0.139,1.294 0.405,1.623 C -1.081,0.731 -0.328,0.544 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,183.90333,-295.95667)" + clip-path="url(#clipPath112)" + id="path316" /> + <path + d="M 0,0 C 0.591,0.324 1.321,0.103 1.64,-0.496 1.956,-1.09 1.725,-1.817 1.12,-2.128 0.545,-2.425 -0.155,-2.213 -0.475,-1.646 -0.807,-1.057 -0.596,-0.326 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,309.9164,-341.45787)" + clip-path="url(#clipPath113)" + id="path317" /> + <path + d="m 0,0 c 0.301,-0.561 0.078,-1.305 -0.479,-1.603 -0.56,-0.301 -1.304,-0.08 -1.603,0.477 -0.3,0.56 -0.078,1.304 0.478,1.603 C -1.043,0.778 -0.299,0.556 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,274.43453,-318.3192)" + clip-path="url(#clipPath114)" + id="path318" /> + <path + d="M 0,0 C 0.321,-0.542 0.112,-1.312 -0.44,-1.615 -0.974,-1.908 -1.7,-1.711 -2.01,-1.189 -2.332,-0.647 -2.123,0.123 -1.57,0.426 -1.037,0.719 -0.311,0.522 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,198.96587,-288.2464)" + clip-path="url(#clipPath115)" + id="path319" /> + <path + d="M 0,0 C -0.542,-0.3 -1.258,-0.097 -1.557,0.443 -1.856,0.986 -1.652,1.701 -1.111,2 -0.568,2.301 0.146,2.097 0.445,1.557 0.745,1.014 0.541,0.299 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,334.14027,-383.9124)" + clip-path="url(#clipPath116)" + id="path320" /> + <path + d="M 0,0 C -0.311,0.535 -0.147,1.169 0.382,1.486 0.937,1.817 1.598,1.637 1.907,1.07 2.202,0.529 2.021,-0.099 1.479,-0.403 0.942,-0.707 0.31,-0.534 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,324.50493,-399.55493)" + clip-path="url(#clipPath117)" + id="path321" /> + <path + d="m 0,0 c 0.314,-0.556 0.115,-1.234 -0.45,-1.535 -0.539,-0.286 -1.189,-0.096 -1.49,0.437 -0.315,0.556 -0.116,1.234 0.451,1.535 C -0.95,0.723 -0.302,0.533 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,176.4072,-303.4612)" + clip-path="url(#clipPath118)" + id="path322" /> + <path + d="M 0,0 C 0.31,-0.536 0.145,-1.169 -0.386,-1.485 -0.94,-1.816 -1.601,-1.634 -1.91,-1.067 -2.204,-0.526 -2.021,0.103 -1.479,0.406 -0.941,0.708 -0.31,0.535 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,251.87333,-393.56147)" + clip-path="url(#clipPath119)" + id="path323" /> + <path + d="M 0,0 C -0.507,-0.258 -1.166,-0.045 -1.422,0.458 -1.679,0.964 -1.467,1.624 -0.963,1.879 -0.456,2.137 0.203,1.924 0.459,1.421 0.716,0.915 0.503,0.255 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,333.928,-361.42347)" + clip-path="url(#clipPath120)" + id="path324" /> + <path + d="M 0,0 C 0.531,0.291 1.187,0.088 1.463,-0.453 1.726,-0.968 1.531,-1.591 1.021,-1.87 0.489,-2.161 -0.166,-1.958 -0.441,-1.417 -0.704,-0.901 -0.511,-0.279 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,197.15333,-364.10827)" + clip-path="url(#clipPath121)" + id="path325" /> + <path + d="m 0,0 c 0.271,-0.5 0.073,-1.161 -0.426,-1.431 -0.501,-0.27 -1.161,-0.074 -1.43,0.425 -0.27,0.501 -0.074,1.161 0.425,1.43 C -0.93,0.695 -0.269,0.499 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,221.50747,-288.26973)" + clip-path="url(#clipPath122)" + id="path326" /> + <path + d="m 0,0 c 0.314,-0.535 0.144,-1.175 -0.396,-1.483 -0.539,-0.306 -1.178,-0.125 -1.477,0.418 -0.286,0.518 -0.122,1.131 0.384,1.438 C -0.958,0.695 -0.312,0.533 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,236.49573,-295.72747)" + clip-path="url(#clipPath123)" + id="path327" /> + <path + d="M 0,0 C 0.295,-0.529 0.097,-1.186 -0.442,-1.466 -0.957,-1.733 -1.58,-1.545 -1.863,-1.037 -2.158,-0.507 -1.96,0.149 -1.421,0.429 -0.906,0.696 -0.283,0.508 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,289.27707,-325.65907)" + clip-path="url(#clipPath124)" + id="path328" /> + <path + d="M 0,0 C 0.263,-0.477 0.076,-1.121 -0.398,-1.382 -0.876,-1.645 -1.52,-1.459 -1.781,-0.985 -2.043,-0.508 -1.857,0.136 -1.383,0.397 -0.905,0.66 -0.261,0.475 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,319.51533,-408.52893)" + clip-path="url(#clipPath125)" + id="path329" /> + <path + d="M 0,0 C 0.263,-0.477 0.078,-1.121 -0.396,-1.383 -0.874,-1.646 -1.518,-1.462 -1.78,-0.988 -2.043,-0.511 -1.858,0.133 -1.384,0.395 -0.906,0.658 -0.263,0.474 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,236.65587,-386.0016)" + clip-path="url(#clipPath126)" + id="path330" /> + <path + d="M 0,0 C -0.466,-0.279 -1.115,-0.115 -1.395,0.352 -1.674,0.817 -1.509,1.466 -1.042,1.746 -0.577,2.025 0.073,1.861 0.353,1.395 0.632,0.93 0.467,0.28 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,251.09467,-301.32253)" + clip-path="url(#clipPath127)" + id="path331" /> + <path + d="M 0,0 C 0.469,0.274 1.041,0.134 1.328,-0.324 1.63,-0.807 1.481,-1.41 0.99,-1.697 0.499,-1.984 -0.099,-1.816 -0.37,-1.316 -0.629,-0.839 -0.47,-0.274 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,302.428,-333.74107)" + clip-path="url(#clipPath128)" + id="path332" /> + <path + d="M 0,0 C 0.286,-0.476 0.149,-1.031 -0.324,-1.316 -0.8,-1.603 -1.355,-1.466 -1.641,-0.994 -1.927,-0.518 -1.79,0.038 -1.316,0.322 -0.841,0.609 -0.285,0.472 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,168.77307,-325.91307)" + clip-path="url(#clipPath129)" + id="path333" /> + <path + d="M 0,0 C 0.446,0.269 0.997,0.143 1.276,-0.291 1.573,-0.751 1.44,-1.331 0.973,-1.612 0.504,-1.894 -0.071,-1.741 -0.337,-1.264 -0.591,-0.81 -0.446,-0.268 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,166.92027,-318.6916)" + clip-path="url(#clipPath130)" + id="path334" /> + <path + d="M 0,0 C -0.48,-0.28 -1.032,-0.134 -1.311,0.344 -1.59,0.824 -1.443,1.376 -0.965,1.655 -0.485,1.934 0.067,1.788 0.346,1.31 0.624,0.831 0.479,0.279 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,190.78613,-286.54453)" + clip-path="url(#clipPath131)" + id="path335" /> + <path + d="M 0,0 C 0.264,-0.432 0.123,-1.013 -0.309,-1.277 -0.741,-1.541 -1.322,-1.4 -1.586,-0.969 -1.85,-0.537 -1.709,0.044 -1.276,0.309 -0.845,0.572 -0.264,0.432 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,274.16107,-408.4696)" + clip-path="url(#clipPath132)" + id="path336" /> + <path + d="M 0,0 C 0.246,-0.443 0.081,-1.017 -0.361,-1.263 -0.805,-1.509 -1.379,-1.345 -1.625,-0.902 -1.87,-0.459 -1.706,0.115 -1.263,0.361 -0.819,0.606 -0.245,0.442 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,266.53613,-310.73)" + clip-path="url(#clipPath133)" + id="path337" /> + <path + d="M 0,0 C 0.222,-0.447 0.012,-1.043 -0.437,-1.244 -0.871,-1.438 -1.431,-1.243 -1.638,-0.825 -1.859,-0.378 -1.65,0.218 -1.2,0.418 -0.767,0.612 -0.207,0.417 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,221.41893,-378.4052)" + clip-path="url(#clipPath134)" + id="path338" /> + <path + d="m 0,0 c 0.229,-0.418 0.064,-0.986 -0.352,-1.214 -0.419,-0.229 -0.987,-0.065 -1.214,0.351 -0.229,0.418 -0.065,0.986 0.351,1.214 C -0.796,0.58 -0.229,0.416 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,326.86813,-348.11293)" + clip-path="url(#clipPath135)" + id="path339" /> + <path + d="M 0,0 C 0.406,0.245 0.979,0.102 1.227,-0.306 1.472,-0.711 1.328,-1.285 0.92,-1.532 0.514,-1.777 -0.061,-1.634 -0.307,-1.226 -0.552,-0.82 -0.408,-0.247 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,167.02307,-333.81667)" + clip-path="url(#clipPath136)" + id="path340" /> + <path + d="M 0,0 C 0.44,0.233 1.041,0.039 1.254,-0.405 1.459,-0.833 1.276,-1.396 0.861,-1.615 0.421,-1.848 -0.181,-1.654 -0.393,-1.209 -0.598,-0.782 -0.415,-0.22 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,332.78227,-393.86747)" + clip-path="url(#clipPath137)" + id="path341" /> + <path + d="m 0,0 c 0.26,-0.46 0.106,-1.003 -0.34,-1.213 -0.469,-0.219 -0.866,-0.098 -1.136,0.341 -0.257,0.42 -0.092,0.97 0.354,1.18 C -0.652,0.529 -0.27,0.394 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,259.0908,-401.0276)" + clip-path="url(#clipPath138)" + id="path342" /> + <path + d="M 0,0 C 0.222,-0.457 0.149,-0.856 -0.274,-1.155 -0.679,-1.439 -1.225,-1.303 -1.479,-0.879 -1.73,-0.458 -1.592,0.09 -1.152,0.311 -0.689,0.543 -0.302,0.422 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,183.68067,-355.95787)" + clip-path="url(#clipPath139)" + id="path343" /> + <path + d="M 0,0 C 0.467,0.251 1.005,0.088 1.206,-0.363 1.418,-0.835 1.286,-1.23 0.843,-1.491 0.418,-1.742 -0.128,-1.565 -0.33,-1.115 -0.543,-0.641 -0.397,-0.262 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,174.60253,-348.7652)" + clip-path="url(#clipPath140)" + id="path344" /> + <path + d="m 0,0 c 0.248,-0.467 0.081,-1.004 -0.371,-1.204 -0.475,-0.21 -0.868,-0.074 -1.127,0.37 -0.247,0.425 -0.066,0.969 0.385,1.169 C -0.637,0.547 -0.26,0.397 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,296.78347,-415.93973)" + clip-path="url(#clipPath141)" + id="path345" /> + <path + d="M 0,0 C -0.426,-0.213 -0.906,-0.043 -1.115,0.393 -1.319,0.822 -1.145,1.308 -0.698,1.497 -0.238,1.69 0.128,1.551 0.368,1.121 0.601,0.706 0.431,0.215 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,205.91373,-369.3108)" + clip-path="url(#clipPath142)" + id="path346" /> + <path + d="m 0,0 c 0.255,-0.409 0.138,-0.902 -0.274,-1.148 -0.414,-0.248 -0.912,-0.127 -1.14,0.297 -0.236,0.436 -0.148,0.817 0.261,1.1 C -0.757,0.522 -0.252,0.404 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,304.27573,-415.9964)" + clip-path="url(#clipPath143)" + id="path347" /> + <path + d="m 0,0 c 0.181,-0.445 0.104,-0.821 -0.328,-1.079 -0.408,-0.244 -0.925,-0.086 -1.119,0.349 -0.203,0.454 -0.08,0.837 0.36,1.065 C -0.642,0.565 -0.277,0.413 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,168.48667,-310.73067)" + clip-path="url(#clipPath144)" + id="path348" /> + <path + d="m 0,0 c 0.253,-0.411 0.132,-0.902 -0.282,-1.146 -0.416,-0.246 -0.911,-0.121 -1.138,0.305 -0.233,0.437 -0.142,0.818 0.269,1.097 C -0.753,0.527 -0.25,0.407 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,319.1676,-340.67867)" + clip-path="url(#clipPath145)" + id="path349" /> + <path + d="m 0,0 c 0.2,-0.446 0.135,-0.825 -0.288,-1.097 -0.401,-0.257 -0.92,-0.115 -1.129,0.313 -0.218,0.447 -0.109,0.832 0.324,1.075 C -0.654,0.536 -0.287,0.395 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,228.6052,-288.10507)" + clip-path="url(#clipPath146)" + id="path350" /> + <path + d="M 0,0 C 0.425,0.213 0.906,0.043 1.114,-0.393 1.319,-0.822 1.145,-1.308 0.697,-1.497 0.238,-1.691 -0.128,-1.551 -0.368,-1.122 -0.601,-0.706 -0.431,-0.215 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,279.95547,-318.51907)" + clip-path="url(#clipPath147)" + id="path351" /> + <path + d="m 0,0 c -0.146,-0.324 -0.222,-0.715 -0.454,-0.957 -0.28,-0.29 -0.897,-0.093 -1.066,0.286 -0.185,0.416 -0.101,0.854 0.318,1.006 0.301,0.109 0.696,-0.041 1.05,-0.075 C -0.102,0.173 -0.051,0.087 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,296.70147,-325.43453)" + clip-path="url(#clipPath148)" + id="path352" /> + <path + d="M 0,0 C -0.447,-0.19 -0.847,-0.133 -1.09,0.304 -1.331,0.735 -1.213,1.141 -0.779,1.38 -0.375,1.603 0.017,1.497 0.259,1.104 0.521,0.679 0.384,0.303 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,288.79,-414.3928)" + clip-path="url(#clipPath149)" + id="path353" /> + <path + d="m 0,0 c 0.198,-0.446 0.144,-0.846 -0.289,-1.095 -0.429,-0.248 -0.835,-0.134 -1.08,0.295 -0.23,0.402 -0.126,0.795 0.263,1.042 C -0.685,0.51 -0.307,0.376 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,334.24053,-355.68973)" + clip-path="url(#clipPath150)" + id="path354" /> + <path + d="m 0,0 c 0.166,-0.456 0.088,-0.854 -0.361,-1.073 -0.442,-0.216 -0.845,-0.081 -1.06,0.366 -0.197,0.414 -0.076,0.802 0.332,1.022 C -0.65,0.553 -0.281,0.4 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,244.01013,-393.2776)" + clip-path="url(#clipPath151)" + id="path355" /> + <path + d="m 0,0 c 0.166,-0.456 0.088,-0.854 -0.361,-1.073 -0.442,-0.216 -0.845,-0.081 -1.06,0.366 -0.197,0.414 -0.076,0.802 0.332,1.023 C -0.65,0.553 -0.281,0.4 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,243.7536,-295.54187)" + clip-path="url(#clipPath152)" + id="path356" /> + <path + d="m 0,0 c 0.317,-0.151 0.779,-0.228 0.907,-0.477 0.116,-0.224 -0.032,-0.751 -0.245,-0.94 -0.335,-0.3 -0.819,-0.164 -0.984,0.26 -0.11,0.281 0.034,0.66 0.064,0.995 C -0.172,-0.108 -0.086,-0.054 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,310.3356,-416.45013)" + clip-path="url(#clipPath153)" + id="path357" /> + <path + d="m 0,0 c -0.208,-0.534 -0.25,-0.936 -0.473,-1.14 -0.338,-0.308 -0.773,-0.193 -1.021,0.198 -0.248,0.394 -0.159,0.835 0.264,1.007 C -0.951,0.179 -0.57,0.042 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,176.17027,-295.83227)" + clip-path="url(#clipPath154)" + id="path358" /> + <path + d="m 0,0 c -0.171,-0.307 -0.276,-0.763 -0.533,-0.875 -0.232,-0.102 -0.748,0.078 -0.923,0.303 -0.275,0.352 -0.114,0.828 0.323,0.966 0.288,0.09 0.657,-0.077 0.99,-0.128 C -0.095,0.177 -0.048,0.089 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,191.38893,-363.14613)" + clip-path="url(#clipPath155)" + id="path359" /> + <path + d="m 0,0 c -0.147,-0.271 -0.236,-0.687 -0.456,-0.774 -0.232,-0.092 -0.694,0.035 -0.868,0.232 -0.289,0.328 -0.145,0.762 0.269,0.901 0.265,0.09 0.607,-0.048 0.913,-0.085 C -0.095,0.183 -0.048,0.091 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,311.74573,-332.80227)" + clip-path="url(#clipPath156)" + id="path360" /> + <path + d="m 0,0 c -0.172,-0.279 -0.282,-0.649 -0.53,-0.815 -0.369,-0.249 -0.798,-0.065 -0.884,0.353 -0.055,0.264 0.11,0.735 0.32,0.848 0.233,0.126 0.628,-0.05 0.953,-0.094 z" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,259.01533,-302.79973)" + clip-path="url(#clipPath157)" + id="path361" /> + <path + d="m 0,0 c 0.273,-0.143 0.689,-0.228 0.779,-0.446 0.095,-0.231 -0.026,-0.695 -0.221,-0.87 -0.325,-0.292 -0.76,-0.157 -0.906,0.257 -0.091,0.263 0.042,0.605 0.075,0.912 C -0.183,-0.098 -0.091,-0.049 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,182.2848,-288.61547)" + clip-path="url(#clipPath158)" + id="path362" /> + <path + d="m 0,0 c -0.15,-0.291 -0.232,-0.667 -0.467,-0.851 -0.347,-0.273 -0.79,-0.13 -0.908,0.285 -0.073,0.259 0.056,0.739 0.257,0.87 0.222,0.143 0.629,0 0.955,-0.018 C -0.108,0.19 -0.055,0.095 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,228.9632,-385.63693)" + clip-path="url(#clipPath159)" + id="path363" /> + <path + d="m 0,0 c -0.126,-0.281 -0.183,-0.644 -0.395,-0.825 -0.333,-0.286 -0.778,-0.184 -0.912,0.231 -0.08,0.249 0.048,0.711 0.247,0.864 0.187,0.144 0.589,0.007 0.898,-0.006 C -0.108,0.176 -0.054,0.088 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,168.6768,-340.55813)" + clip-path="url(#clipPath160)" + id="path364" /> + <path + d="m 0,0 c -0.219,-0.458 -0.293,-0.889 -0.488,-0.955 -0.25,-0.084 -0.599,0.128 -0.905,0.212 0.1,0.302 0.117,0.71 0.325,0.871 C -0.904,0.254 -0.505,0.075 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,327.0492,-408.34467)" + clip-path="url(#clipPath161)" + id="path365" /> + <path + d="m 0,0 c -0.214,-0.461 -0.283,-0.893 -0.479,-0.961 -0.248,-0.086 -0.599,0.122 -0.906,0.202 0.097,0.303 0.11,0.711 0.316,0.875 C -0.907,0.244 -0.506,0.069 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,341.91507,-378.25093)" + clip-path="url(#clipPath162)" + id="path366" /> + <path + d="m 0,0 c 0.274,-0.147 0.679,-0.233 0.786,-0.46 0.096,-0.201 -0.079,-0.753 -0.24,-0.802 -0.252,-0.077 -0.698,0.055 -0.864,0.259 -0.13,0.16 0.04,0.564 0.076,0.859 C -0.161,-0.096 -0.081,-0.048 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,265.39427,-408.84533)" + clip-path="url(#clipPath163)" + id="path367" /> + <path + d="m 0,0 c -0.141,-0.261 -0.228,-0.669 -0.435,-0.743 -0.22,-0.078 -0.654,0.083 -0.802,0.284 -0.1,0.133 0.062,0.646 0.245,0.752 C -0.784,0.414 -0.423,0.27 -0.129,0.241 -0.086,0.161 -0.043,0.081 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,273.87213,-310.2268)" + clip-path="url(#clipPath164)" + id="path368" /> + <path + d="m 0,0 c 0.269,-0.124 0.681,-0.185 0.768,-0.387 0.091,-0.215 -0.043,-0.659 -0.233,-0.818 -0.129,-0.107 -0.651,0.021 -0.768,0.197 -0.133,0.199 -0.011,0.569 0.001,0.864 C -0.155,-0.096 -0.078,-0.048 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,280.34867,-416.17867)" + clip-path="url(#clipPath165)" + id="path369" /> + <path + d="m 0,0 c 0.27,-0.122 0.683,-0.182 0.771,-0.383 0.093,-0.214 -0.04,-0.659 -0.228,-0.819 -0.129,-0.108 -0.651,0.017 -0.77,0.192 -0.133,0.199 -0.014,0.569 -0.004,0.865 z" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,333.04653,-401.09533)" + clip-path="url(#clipPath166)" + id="path370" /> + <path + d="M 0,0 C -0.132,-0.265 -0.208,-0.675 -0.412,-0.754 -0.631,-0.84 -1.069,-0.691 -1.223,-0.496 -1.326,-0.366 -1.18,0.153 -1,0.264 -0.796,0.391 -0.431,0.258 -0.136,0.237 -0.09,0.158 -0.045,0.079 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,341.8056,-370.4352)" + clip-path="url(#clipPath167)" + id="path371" /> + <path + d="m 0,0 c -0.121,-0.27 -0.179,-0.683 -0.38,-0.772 -0.214,-0.095 -0.659,0.035 -0.82,0.223 -0.109,0.128 0.014,0.652 0.188,0.77 0.199,0.135 0.57,0.017 0.866,0.009 C -0.098,0.154 -0.049,0.077 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,213.84467,-378.2548)" + clip-path="url(#clipPath168)" + id="path372" /> + <path + d="M 0,0 C 0.429,-0.23 0.795,-0.308 0.865,-0.496 0.94,-0.697 0.805,-1.135 0.633,-1.224 0.462,-1.312 0.025,-1.17 -0.095,-0.993 -0.208,-0.826 -0.06,-0.482 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,167.0492,-303.67867)" + clip-path="url(#clipPath169)" + id="path373" /> + <path + d="M 0,0 C 0.442,-0.205 0.812,-0.262 0.894,-0.446 0.98,-0.641 0.794,-0.958 0.728,-1.221 0.463,-1.154 0.097,-1.167 -0.034,-0.998 -0.157,-0.838 -0.03,-0.487 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,249.99187,-401.34333)" + clip-path="url(#clipPath170)" + id="path374" /> + <path + d="m 0,0 c -0.191,-0.447 -0.236,-0.818 -0.418,-0.906 -0.193,-0.093 -0.516,0.084 -0.781,0.143 0.058,0.265 0.035,0.632 0.201,0.768 C -0.843,0.132 -0.487,0.016 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,341.7432,-385.80947)" + clip-path="url(#clipPath171)" + id="path375" /> + <path + d="m 0,0 c -0.222,-0.412 -0.295,-0.755 -0.473,-0.823 -0.188,-0.072 -0.476,0.119 -0.721,0.195 0.076,0.244 0.083,0.589 0.249,0.705 C -0.79,0.185 -0.465,0.051 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,319.32387,-415.76387)" + clip-path="url(#clipPath172)" + id="path376" /> + <path + d="M 0,0 C 0.379,-0.214 0.696,-0.291 0.782,-0.475 0.854,-0.629 0.691,-1.072 0.568,-1.099 0.357,-1.146 0.015,-1.032 -0.115,-0.864 -0.214,-0.737 -0.067,-0.42 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,174.69627,-356.22227)" + clip-path="url(#clipPath173)" + id="path377" /> + <path + d="M 0,0 C -0.186,-0.394 -0.238,-0.716 -0.415,-0.815 -0.564,-0.9 -0.859,-0.726 -1.09,-0.667 -1.025,-0.421 -1.032,-0.1 -0.875,0.044 -0.758,0.152 -0.431,0.033 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,303.99573,-325.58227)" + clip-path="url(#clipPath174)" + id="path378" /> + <path + d="m 0,0 c -0.208,-0.418 -0.271,-0.764 -0.445,-0.837 -0.187,-0.078 -0.604,0.034 -0.693,0.191 -0.09,0.157 0.029,0.573 0.191,0.692 C -0.793,0.16 -0.464,0.036 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,288.9228,-318.1064)" + clip-path="url(#clipPath175)" + id="path379" /> + <path + d="m 0,0 c -0.194,-0.389 -0.255,-0.709 -0.435,-0.805 -0.15,-0.08 -0.6,0.057 -0.633,0.178 -0.058,0.208 0.036,0.556 0.197,0.694 C -0.749,0.173 -0.425,0.044 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,236.3004,-393.3824)" + clip-path="url(#clipPath176)" + id="path380" /> + <path + d="M 0,0 C -0.394,0.186 -0.716,0.237 -0.815,0.414 -0.899,0.563 -0.726,0.858 -0.666,1.088 -0.421,1.025 -0.1,1.031 0.045,0.875 0.153,0.757 0.033,0.43 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,341.3512,-361.86093)" + clip-path="url(#clipPath177)" + id="path381" /> + <path + d="m 0,0 c -0.192,-0.39 -0.25,-0.711 -0.429,-0.808 -0.15,-0.081 -0.601,0.053 -0.635,0.173 -0.06,0.208 0.033,0.555 0.192,0.697 C -0.752,0.167 -0.428,0.042 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,334.08947,-347.99827)" + clip-path="url(#clipPath178)" + id="path382" /> + <path + d="M 0,0 C 0.386,-0.2 0.706,-0.265 0.799,-0.446 0.876,-0.598 0.73,-1.045 0.608,-1.077 0.4,-1.132 0.054,-1.031 -0.083,-0.869 -0.187,-0.747 -0.052,-0.425 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,249.87467,-295.97613)" + clip-path="url(#clipPath179)" + id="path383" /> + <path + d="m 0,0 c -0.201,-0.386 -0.266,-0.706 -0.447,-0.798 -0.152,-0.078 -0.599,0.068 -0.631,0.189 -0.055,0.208 0.046,0.554 0.209,0.692 C -0.747,0.186 -0.425,0.052 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,326.50613,-340.538)" + clip-path="url(#clipPath180)" + id="path384" /> + <path + d="m 0,0 c -0.184,-0.43 -0.227,-0.779 -0.397,-0.862 -0.182,-0.088 -0.486,0.075 -0.737,0.129 0.054,0.251 0.03,0.597 0.185,0.725 C -0.802,0.114 -0.466,0.009 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,198.69373,-370.98987)" + clip-path="url(#clipPath181)" + id="path385" /> + <path + d="M 0,0 C 0.337,-0.207 0.626,-0.288 0.7,-0.46 0.763,-0.606 0.575,-0.858 0.498,-1.063 0.279,-0.98 -0.016,-0.954 -0.134,-0.796 -0.221,-0.679 -0.076,-0.39 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,159.75093,-326.04387)" + clip-path="url(#clipPath182)" + id="path386" /> + <path + d="m 0,0 c -0.19,-0.344 -0.257,-0.637 -0.427,-0.72 -0.141,-0.069 -0.552,0.076 -0.578,0.187 -0.044,0.196 0.054,0.512 0.207,0.637 C -0.687,0.195 -0.39,0.061 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,183.55827,-363.178)" + clip-path="url(#clipPath183)" + id="path387" /> + <path + d="M 0,0 C -0.337,0.118 -0.659,0.138 -0.717,0.272 -0.794,0.454 -0.668,0.722 -0.63,0.953 -0.401,0.898 -0.105,0.909 0.032,0.767 0.133,0.663 0.025,0.358 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,221.01133,-384.59987)" + clip-path="url(#clipPath184)" + id="path388" /> + <path + d="m 0,0 c -0.129,-0.333 -0.161,-0.656 -0.296,-0.707 -0.185,-0.07 -0.449,0.067 -0.679,0.116 0.064,0.226 0.065,0.522 0.212,0.653 C -0.655,0.159 -0.354,0.039 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,168.38893,-348.18707)" + clip-path="url(#clipPath185)" + id="path389" /> + <path + d="m 0,0 c -0.207,-0.337 -0.288,-0.626 -0.461,-0.7 -0.145,-0.063 -0.398,0.124 -0.603,0.201 0.084,0.219 0.11,0.514 0.268,0.632 C -0.679,0.22 -0.39,0.076 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,266.18453,-302.87587)" + clip-path="url(#clipPath186)" + id="path390" /> + <path + d="M 0,0 C 0.272,-0.118 0.544,-0.16 0.571,-0.265 0.614,-0.426 0.488,-0.632 0.435,-0.818 0.265,-0.761 0.023,-0.75 -0.054,-0.633 -0.129,-0.519 -0.034,-0.294 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,340.36427,-355.7132)" + clip-path="url(#clipPath187)" + id="path391" /> + <path + d="m 0,0 c -0.127,-0.27 -0.177,-0.538 -0.283,-0.563 -0.163,-0.038 -0.365,0.092 -0.55,0.151 0.062,0.168 0.08,0.409 0.2,0.484 C -0.519,0.144 -0.296,0.042 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,190.87733,-370.69947)" + clip-path="url(#clipPath188)" + id="path392" /> + <path + d="m 0,0 c -0.135,-0.264 -0.193,-0.53 -0.302,-0.552 -0.163,-0.033 -0.361,0.104 -0.544,0.169 0.068,0.166 0.092,0.407 0.215,0.478 C -0.514,0.163 -0.295,0.053 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,243.66507,-400.64613)" + clip-path="url(#clipPath189)" + id="path393" /> + <path + d="m 0,0 c -0.099,-0.282 -0.121,-0.556 -0.225,-0.591 -0.158,-0.054 -0.371,0.059 -0.561,0.101 0.046,0.173 0.04,0.414 0.152,0.499 C -0.526,0.091 -0.296,0.013 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,205.98013,-378.24893)" + clip-path="url(#clipPath190)" + id="path394" /> + <path + d="M 0,0 C -0.289,0.153 -0.574,0.219 -0.599,0.338 -0.634,0.513 -0.482,0.726 -0.411,0.922 -0.23,0.848 0.029,0.82 0.106,0.687 0.179,0.561 0.06,0.323 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,258.5036,-407.10827)" + clip-path="url(#clipPath191)" + id="path395" /> + <path + d="M 0,0 C 0.306,-0.122 0.598,-0.156 0.634,-0.271 0.687,-0.441 0.559,-0.668 0.508,-0.871 0.322,-0.817 0.062,-0.816 -0.028,-0.693 -0.114,-0.575 -0.023,-0.328 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,272.79653,-416.124)" + clip-path="url(#clipPath192)" + id="path396" /> + <path + d="M 0,0 C 0.277,-0.109 0.55,-0.142 0.581,-0.247 0.629,-0.406 0.509,-0.615 0.46,-0.803 0.289,-0.751 0.049,-0.749 -0.033,-0.633 -0.111,-0.523 -0.024,-0.296 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,174.6664,-288.1604)" + clip-path="url(#clipPath193)" + id="path397" /> + <path + d="m 0,0 c -0.143,-0.296 -0.198,-0.584 -0.315,-0.612 -0.174,-0.042 -0.392,0.1 -0.591,0.164 0.067,0.182 0.086,0.443 0.217,0.524 C -0.565,0.154 -0.325,0.045 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,341.6872,-393.05693)" + clip-path="url(#clipPath194)" + id="path398" /> + <path + d="m 0,0 c -0.11,-0.278 -0.143,-0.551 -0.247,-0.582 -0.16,-0.047 -0.369,0.072 -0.558,0.121 0.053,0.171 0.056,0.411 0.171,0.493 C -0.523,0.11 -0.296,0.023 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,168.21973,-295.51653)" + clip-path="url(#clipPath195)" + id="path399" /> + <path + d="M 0,0 C -0.282,0.093 -0.558,0.111 -0.594,0.214 -0.649,0.371 -0.54,0.586 -0.5,0.777 -0.326,0.734 -0.085,0.744 0.001,0.633 0.085,0.524 0.009,0.293 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,296.03613,-316.88373)" + clip-path="url(#clipPath196)" + id="path400" /> + <path + d="m 0,0 c -0.11,-0.278 -0.143,-0.55 -0.247,-0.582 -0.16,-0.047 -0.369,0.072 -0.557,0.121 0.052,0.171 0.055,0.411 0.17,0.493 C -0.523,0.11 -0.296,0.024 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,333.96973,-408.1076)" + clip-path="url(#clipPath197)" + id="path401" /> + <path + d="m 0,0 c -0.122,-0.306 -0.157,-0.598 -0.272,-0.634 -0.169,-0.054 -0.397,0.074 -0.6,0.125 0.055,0.186 0.056,0.446 0.18,0.536 C -0.575,0.113 -0.328,0.022 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,160.75227,-318.23)" + clip-path="url(#clipPath198)" + id="path402" /> + <path + d="M 0,0 C 0.277,-0.11 0.55,-0.142 0.581,-0.247 0.629,-0.406 0.509,-0.615 0.461,-0.803 0.289,-0.751 0.049,-0.749 -0.033,-0.633 -0.111,-0.523 -0.024,-0.296 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,159.708,-333.35707)" + clip-path="url(#clipPath199)" + id="path403" /> + <path + d="M 0,0 C 0.278,-0.109 0.551,-0.142 0.582,-0.247 0.629,-0.406 0.51,-0.615 0.461,-0.803 0.29,-0.751 0.049,-0.749 -0.032,-0.633 -0.11,-0.523 -0.024,-0.296 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,302.91893,-423.564)" + clip-path="url(#clipPath200)" + id="path404" /> + <path + d="m 0,0 c -0.094,-0.282 -0.112,-0.557 -0.215,-0.594 -0.157,-0.055 -0.372,0.054 -0.562,0.094 0.043,0.173 0.033,0.414 0.144,0.501 C -0.526,0.085 -0.295,0.009 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,296.33947,-423.31533)" + clip-path="url(#clipPath201)" + id="path405" /> + <path + d="m 0,0 c -0.147,-0.293 -0.208,-0.58 -0.326,-0.606 -0.174,-0.04 -0.391,0.106 -0.589,0.174 0.071,0.181 0.094,0.441 0.227,0.521 C -0.564,0.165 -0.325,0.052 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,318.9736,-332.91173)" + clip-path="url(#clipPath202)" + id="path406" /> + <path + d="M 0,0 C 0.278,-0.109 0.551,-0.142 0.582,-0.246 0.629,-0.406 0.51,-0.615 0.461,-0.803 0.29,-0.751 0.049,-0.748 -0.032,-0.633 -0.11,-0.523 -0.024,-0.295 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,280.10387,-310.59267)" + clip-path="url(#clipPath203)" + id="path407" /> + <path + d="M 0,0 C 0.267,-0.131 0.534,-0.185 0.558,-0.292 0.593,-0.456 0.459,-0.656 0.396,-0.84 0.229,-0.775 -0.012,-0.753 -0.085,-0.631 -0.154,-0.516 -0.049,-0.295 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,242.52053,-288.14147)" + clip-path="url(#clipPath204)" + id="path408" /> + </g> + <g + id="g883" + clip-path="url(#clipPath884)"> + <path + d="m 0,0 c -0.009,0 -0.016,-0.007 -0.016,-0.016 0,-0.008 0.007,-0.016 0.016,-0.016 0.009,0 0.016,0.008 0.016,0.016 C 0.016,-0.007 0.009,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,99.374,-363.37653)" + clip-path="url(#clipPath410)" + id="path647" /> + <path + d="m 0,0 c -0.043,0 -0.079,-0.035 -0.079,-0.078 0,-0.044 0.035,-0.079 0.078,-0.079 0.043,0 0.079,0.034 0.079,0.078 C 0.078,-0.036 0.043,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,99.4164,-371.01853)" + clip-path="url(#clipPath411)" + id="path648" /> + <path + d="m 0,0 c -0.052,0 -0.094,-0.042 -0.095,-0.094 0,-0.052 0.042,-0.094 0.094,-0.095 0.052,0 0.095,0.042 0.095,0.094 C 0.094,-0.042 0.052,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,99.458,-378.5972)" + clip-path="url(#clipPath412)" + id="path649" /> + <path + d="m 0,0 c -0.043,0 -0.079,-0.035 -0.079,-0.078 -0.001,-0.043 0.035,-0.079 0.078,-0.079 0.043,0 0.079,0.035 0.079,0.078 C 0.078,-0.036 0.043,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,99.499733,-386.1344)" + clip-path="url(#clipPath413)" + id="path650" /> + <path + d="m 0,0 c -0.017,0 -0.032,-0.014 -0.032,-0.032 0,-0.017 0.014,-0.03 0.032,-0.031 0.017,0 0.031,0.014 0.031,0.031 C 0.031,-0.014 0.018,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,99.540667,-393.62987)" + clip-path="url(#clipPath414)" + id="path651" /> + <path + d="m 0,0 c -0.069,0 -0.126,-0.056 -0.126,-0.125 -0.001,-0.069 0.055,-0.126 0.125,-0.126 0.069,-0.001 0.126,0.055 0.126,0.125 C 0.125,-0.057 0.069,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,106.85,-348.36547)" + clip-path="url(#clipPath415)" + id="path652" /> + <path + d="M 0,0 C 0.001,0.217 -0.174,0.394 -0.391,0.395 -0.608,0.396 -0.785,0.221 -0.786,0.004 -0.787,-0.212 -0.612,-0.39 -0.395,-0.391 -0.178,-0.392 -0.001,-0.217 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,107.4144,-355.7528)" + clip-path="url(#clipPath416)" + id="path653" /> + <path + d="M 0,0 C 0.002,0.365 -0.292,0.662 -0.656,0.664 -1.021,0.666 -1.318,0.372 -1.32,0.007 -1.322,-0.357 -1.028,-0.654 -0.664,-0.656 -0.299,-0.659 -0.002,-0.365 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,107.81213,-363.3088)" + clip-path="url(#clipPath417)" + id="path654" /> + <path + d="M 0,0 C 0.002,0.46 -0.368,0.835 -0.829,0.838 -1.289,0.84 -1.664,0.469 -1.666,0.009 -1.668,-0.451 -1.298,-0.826 -0.837,-0.828 -0.377,-0.831 -0.002,-0.46 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,108.08427,-370.86547)" + clip-path="url(#clipPath418)" + id="path655" /> + <path + d="M 0,0 C 0.003,0.495 -0.396,0.898 -0.891,0.901 -1.386,0.903 -1.789,0.504 -1.792,0.01 -1.794,-0.485 -1.396,-0.888 -0.901,-0.891 -0.406,-0.894 -0.003,-0.495 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,108.21,-378.42347)" + clip-path="url(#clipPath419)" + id="path656" /> + <path + d="M 0,0 C 0.003,0.478 -0.382,0.867 -0.859,0.869 -1.337,0.872 -1.726,0.487 -1.729,0.01 -1.731,-0.468 -1.346,-0.857 -0.869,-0.859 -0.392,-0.862 -0.002,-0.478 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,108.20933,-385.98133)" + clip-path="url(#clipPath420)" + id="path657" /> + <path + d="m 0,0 c 0.002,0.399 -0.32,0.725 -0.719,0.727 -0.4,0.002 -0.725,-0.32 -0.727,-0.719 -0.002,-0.399 0.32,-0.725 0.719,-0.727 C -0.328,-0.721 -0.002,-0.399 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,108.0628,-393.54067)" + clip-path="url(#clipPath421)" + id="path658" /> + <path + d="M 0,0 C 0.001,0.26 -0.208,0.472 -0.469,0.474 -0.729,0.475 -0.942,0.266 -0.943,0.005 -0.945,-0.256 -0.735,-0.468 -0.474,-0.47 -0.214,-0.471 -0.001,-0.261 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,107.7692,-401.1012)" + clip-path="url(#clipPath422)" + id="path659" /> + <path + d="m 0,0 c -0.096,0 -0.173,-0.076 -0.174,-0.172 -0.001,-0.096 0.077,-0.173 0.172,-0.174 0.095,-0.001 0.173,0.076 0.174,0.172 C 0.172,-0.078 0.095,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,107.18333,-408.8928)" + clip-path="url(#clipPath423)" + id="path660" /> + <path + d="m 0,0 c -0.009,0 -0.016,-0.007 -0.016,-0.015 0,-0.009 0.007,-0.016 0.016,-0.016 0.008,0 0.016,0.007 0.016,0.015 C 0.016,-0.007 0.009,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,107.2236,-416.24107)" + clip-path="url(#clipPath424)" + id="path661" /> + <path + d="m 0,0 c -0.026,0 -0.047,-0.021 -0.047,-0.047 0,-0.026 0.021,-0.047 0.047,-0.047 0.025,0 0.047,0.021 0.047,0.047 C 0.047,-0.021 0.026,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,114.32387,-333.1024)" + clip-path="url(#clipPath425)" + id="path662" /> + <path + d="M 0,0 C 0.001,0.217 -0.174,0.394 -0.391,0.395 -0.608,0.396 -0.785,0.221 -0.786,0.004 -0.788,-0.213 -0.612,-0.39 -0.396,-0.391 -0.179,-0.392 -0.001,-0.217 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,114.8896,-340.59533)" + clip-path="url(#clipPath426)" + id="path663" /> + <path + d="M 0,0 C 0.002,0.477 -0.382,0.866 -0.86,0.869 -1.337,0.872 -1.727,0.487 -1.729,0.009 -1.731,-0.468 -1.347,-0.857 -0.869,-0.86 -0.392,-0.862 -0.002,-0.478 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,115.5596,-348.15)" + clip-path="url(#clipPath427)" + id="path664" /> + <path + d="M 0,0 C 0.004,0.677 -0.542,1.229 -1.219,1.233 -1.896,1.236 -2.448,0.69 -2.452,0.013 -2.456,-0.664 -1.91,-1.216 -1.232,-1.219 -0.556,-1.223 -0.003,-0.677 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,116.08307,-355.70533)" + clip-path="url(#clipPath428)" + id="path665" /> + <path + d="M 0,0 C 0.004,0.808 -0.646,1.465 -1.454,1.47 -2.261,1.475 -2.919,0.824 -2.923,0.016 -2.928,-0.791 -2.277,-1.449 -1.47,-1.454 -0.663,-1.458 -0.004,-0.807 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,116.43907,-363.26133)" + clip-path="url(#clipPath429)" + id="path666" /> + <path + d="M 0,0 C 0.005,0.885 -0.709,1.607 -1.595,1.612 -2.48,1.617 -3.202,0.903 -3.207,0.018 -3.211,-0.868 -2.498,-1.59 -1.612,-1.595 -0.727,-1.6 -0.005,-0.886 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,116.6696,-370.81867)" + clip-path="url(#clipPath430)" + id="path667" /> + <path + d="M 0,0 C 0.005,0.912 -0.729,1.655 -1.641,1.66 -2.553,1.665 -3.295,0.93 -3.301,0.019 -3.306,-0.893 -2.571,-1.636 -1.659,-1.642 -0.748,-1.646 -0.005,-0.911 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,116.77373,-378.37587)" + clip-path="url(#clipPath431)" + id="path668" /> + <path + d="M 0,0 C 0.005,0.894 -0.716,1.623 -1.61,1.628 -2.504,1.633 -3.233,0.912 -3.238,0.018 -3.243,-0.876 -2.522,-1.605 -1.628,-1.61 -0.734,-1.615 -0.005,-0.894 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,116.77373,-385.93453)" + clip-path="url(#clipPath432)" + id="path669" /> + <path + d="M 0,0 C 0.004,0.833 -0.667,1.513 -1.501,1.517 -2.334,1.522 -3.014,0.85 -3.018,0.017 -3.023,-0.817 -2.351,-1.496 -1.518,-1.5 -0.684,-1.505 -0.005,-0.833 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,116.66893,-393.49307)" + clip-path="url(#clipPath433)" + id="path670" /> + <path + d="M 0,0 C 0.004,0.721 -0.577,1.308 -1.297,1.312 -2.018,1.316 -2.605,0.735 -2.609,0.015 -2.613,-0.706 -2.032,-1.293 -1.312,-1.297 -0.591,-1.302 -0.004,-0.721 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,116.43787,-401.05293)" + clip-path="url(#clipPath434)" + id="path671" /> + <path + d="M 0,0 C 0.003,0.538 -0.431,0.977 -0.969,0.98 -1.507,0.983 -1.946,0.549 -1.949,0.011 -1.952,-0.528 -1.518,-0.966 -0.98,-0.969 -0.442,-0.972 -0.003,-0.539 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,116.03933,-408.61347)" + clip-path="url(#clipPath435)" + id="path672" /> + <path + d="M 0,0 C 0.002,0.286 -0.229,0.52 -0.516,0.521 -0.802,0.522 -1.036,0.292 -1.037,0.005 -1.039,-0.281 -0.808,-0.515 -0.521,-0.516 -0.235,-0.518 -0.001,-0.287 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,115.47293,-416.17533)" + clip-path="url(#clipPath436)" + id="path673" /> + <path + d="m 0,0 c -0.052,0 -0.095,-0.042 -0.095,-0.094 0,-0.052 0.042,-0.094 0.094,-0.094 0.052,-0.001 0.095,0.041 0.095,0.093 C 0.094,-0.042 0.052,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,114.82387,-423.86227)" + clip-path="url(#clipPath437)" + id="path674" /> + <path + d="m 0,0 c -0.035,0 -0.063,-0.028 -0.063,-0.062 0,-0.036 0.027,-0.064 0.062,-0.064 0.035,0 0.063,0.028 0.063,0.063 C 0.062,-0.029 0.034,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,121.8408,-325.52427)" + clip-path="url(#clipPath438)" + id="path675" /> + <path + d="M 0,0 C 0.001,0.304 -0.244,0.551 -0.547,0.553 -0.851,0.555 -1.099,0.31 -1.101,0.006 -1.102,-0.298 -0.857,-0.545 -0.553,-0.547 -0.25,-0.549 -0.002,-0.304 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,122.6156,-332.9944)" + clip-path="url(#clipPath439)" + id="path676" /> + <path + d="M 0,0 C 0.003,0.625 -0.5,1.135 -1.125,1.138 -1.75,1.142 -2.26,0.638 -2.263,0.013 -2.267,-0.612 -1.763,-1.122 -1.138,-1.125 -0.513,-1.128 -0.003,-0.625 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,123.432,-340.54773)" + clip-path="url(#clipPath440)" + id="path677" /> + <path + d="M 0,0 C 0.005,0.851 -0.681,1.544 -1.532,1.549 -2.382,1.554 -3.076,0.868 -3.081,0.017 -3.085,-0.834 -2.399,-1.527 -1.549,-1.532 -0.698,-1.537 -0.004,-0.851 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,124.01853,-348.10307)" + clip-path="url(#clipPath441)" + id="path678" /> + <path + d="M 0,0 C 0.005,0.999 -0.799,1.812 -1.798,1.817 -2.796,1.823 -3.61,1.019 -3.616,0.02 -3.621,-0.978 -2.816,-1.792 -1.818,-1.798 -0.819,-1.803 -0.005,-0.998 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,124.41693,-355.65907)" + clip-path="url(#clipPath442)" + id="path679" /> + <path + d="M 0,0 C 0.006,1.093 -0.876,1.985 -1.97,1.991 -3.063,1.997 -3.955,1.115 -3.961,0.021 -3.967,-1.072 -3.085,-1.964 -1.992,-1.97 -0.897,-1.976 -0.006,-1.094 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,124.68907,-363.2164)" + clip-path="url(#clipPath443)" + id="path680" /> + <path + d="M 0,0 C 0.006,1.137 -0.91,2.064 -2.047,2.07 -3.185,2.077 -4.112,1.16 -4.118,0.022 -4.124,-1.115 -3.208,-2.042 -2.07,-2.048 -0.933,-2.054 -0.006,-1.138 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,124.83493,-370.77373)" + clip-path="url(#clipPath444)" + id="path681" /> + <path + d="M 0,0 C 0.007,1.164 -0.931,2.112 -2.095,2.118 -3.258,2.125 -4.206,1.187 -4.212,0.023 -4.219,-1.14 -3.281,-2.088 -2.118,-2.095 -0.955,-2.101 -0.006,-1.163 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,124.93973,-378.33093)" + clip-path="url(#clipPath445)" + id="path682" /> + <path + d="M 0,0 C 0.006,1.146 -0.918,2.08 -2.063,2.086 -3.209,2.093 -4.144,1.169 -4.15,0.022 -4.156,-1.124 -3.232,-2.058 -2.086,-2.063 -0.94,-2.07 -0.006,-1.146 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,124.93973,-385.8896)" + clip-path="url(#clipPath446)" + id="path683" /> + <path + d="M 0,0 C 0.006,1.112 -0.89,2.018 -2.001,2.024 -3.112,2.03 -4.018,1.134 -4.024,0.022 -4.03,-1.088 -3.134,-1.995 -2.023,-2 -0.912,-2.007 -0.006,-1.111 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,124.89747,-393.44747)" + clip-path="url(#clipPath447)" + id="path684" /> + <path + d="M 0,0 C 0.006,1.033 -0.827,1.875 -1.86,1.88 -2.893,1.886 -3.735,1.053 -3.741,0.021 -3.747,-1.013 -2.914,-1.854 -1.881,-1.86 -0.848,-1.866 -0.006,-1.034 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,124.75027,-401.00747)" + clip-path="url(#clipPath448)" + id="path685" /> + <path + d="M 0,0 C 0.005,0.894 -0.716,1.623 -1.61,1.627 -2.504,1.632 -3.233,0.912 -3.238,0.018 -3.243,-0.876 -2.522,-1.605 -1.628,-1.61 -0.734,-1.615 -0.005,-0.895 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,124.45667,-408.56733)" + clip-path="url(#clipPath449)" + id="path686" /> + <path + d="M 0,0 C 0.004,0.686 -0.549,1.245 -1.235,1.249 -1.92,1.252 -2.479,0.7 -2.483,0.014 -2.487,-0.672 -1.934,-1.231 -1.249,-1.235 -0.562,-1.239 -0.004,-0.686 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,123.99507,-416.12787)" + clip-path="url(#clipPath450)" + id="path687" /> + <path + d="M 0,0 C 0.002,0.391 -0.313,0.709 -0.704,0.711 -1.094,0.714 -1.413,0.398 -1.415,0.008 -1.417,-0.382 -1.102,-0.701 -0.711,-0.703 -0.321,-0.706 -0.002,-0.39 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,123.32453,-423.68973)" + clip-path="url(#clipPath451)" + id="path688" /> + <path + d="m 0,0 c -0.078,0 -0.142,-0.062 -0.143,-0.141 0,-0.078 0.063,-0.142 0.141,-0.142 0.078,-0.001 0.142,0.063 0.143,0.14 C 0.141,-0.064 0.078,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,122.42413,-431.4416)" + clip-path="url(#clipPath452)" + id="path689" /> + <path + d="M 0,0 C -0.017,0 -0.031,-0.014 -0.031,-0.031 -0.032,-0.048 -0.018,-0.063 0,-0.063 c 0.017,0 0.031,0.014 0.032,0.031 C 0.032,-0.014 0.018,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,129.3564,-317.8824)" + clip-path="url(#clipPath453)" + id="path690" /> + <path + d="M 0,0 C 0.001,0.278 -0.222,0.504 -0.5,0.506 -0.778,0.507 -1.004,0.283 -1.006,0.006 -1.007,-0.272 -0.783,-0.499 -0.506,-0.5 -0.228,-0.502 -0.001,-0.278 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,130.06867,-325.3948)" + clip-path="url(#clipPath454)" + id="path691" /> + <path + d="M 0,0 C 0.003,0.651 -0.521,1.182 -1.173,1.186 -1.824,1.189 -2.354,0.664 -2.358,0.013 -2.362,-0.638 -1.837,-1.169 -1.186,-1.172 -0.535,-1.176 -0.004,-0.651 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,131.012,-332.94813)" + clip-path="url(#clipPath455)" + id="path692" /> + <path + d="M 0,0 C 0.005,0.92 -0.737,1.67 -1.657,1.676 -2.577,1.681 -3.327,0.939 -3.333,0.019 -3.337,-0.902 -2.595,-1.652 -1.675,-1.657 -0.755,-1.662 -0.005,-0.92 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,131.7028,-340.50213)" + clip-path="url(#clipPath456)" + id="path693" /> + <path + d="M 0,0 C 0.006,1.094 -0.875,1.985 -1.97,1.992 -3.063,1.998 -3.955,1.116 -3.961,0.022 -3.967,-1.072 -3.085,-1.963 -1.991,-1.97 -0.897,-1.976 -0.006,-1.094 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,132.16373,-348.05813)" + clip-path="url(#clipPath457)" + id="path694" /> + <path + d="M 0,0 C 0.007,1.198 -0.959,2.174 -2.157,2.181 -3.355,2.188 -4.332,1.222 -4.338,0.024 -4.345,-1.174 -3.379,-2.15 -2.181,-2.157 -0.983,-2.164 -0.006,-1.198 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,132.45667,-355.6148)" + clip-path="url(#clipPath458)" + id="path695" /> + <path + d="M 0,0 C 0.007,1.268 -1.015,2.3 -2.282,2.308 -3.55,2.314 -4.583,1.292 -4.59,0.025 -4.597,-1.242 -3.575,-2.275 -2.308,-2.282 -1.041,-2.29 -0.007,-1.268 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,132.6664,-363.17213)" + clip-path="url(#clipPath459)" + id="path696" /> + <path + d="M 0,0 C 0.007,1.311 -1.05,2.38 -2.361,2.387 -3.671,2.394 -4.74,1.337 -4.747,0.026 -4.754,-1.284 -3.698,-2.353 -2.387,-2.36 -1.076,-2.367 -0.007,-1.311 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,132.8128,-370.72947)" + clip-path="url(#clipPath460)" + id="path697" /> + <path + d="M 0,0 C 0.007,1.328 -1.063,2.411 -2.392,2.418 -3.72,2.425 -4.803,1.354 -4.81,0.026 -4.817,-1.302 -3.747,-2.384 -2.418,-2.392 -1.09,-2.399 -0.007,-1.328 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,132.89613,-378.28733)" + clip-path="url(#clipPath461)" + id="path698" /> + <path + d="M 0,0 C 0.007,1.32 -1.057,2.396 -2.376,2.403 -3.696,2.41 -4.771,1.346 -4.778,0.026 -4.786,-1.293 -3.722,-2.369 -2.402,-2.376 -1.083,-2.383 -0.007,-1.319 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,132.91693,-385.84533)" + clip-path="url(#clipPath462)" + id="path699" /> + <path + d="M 0,0 C 0.007,1.276 -1.022,2.316 -2.298,2.324 -3.574,2.331 -4.614,1.302 -4.622,0.025 -4.628,-1.251 -3.6,-2.291 -2.324,-2.297 -1.047,-2.305 -0.007,-1.276 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,132.85387,-393.40387)" + clip-path="url(#clipPath463)" + id="path700" /> + <path + d="M 0,0 C 0.007,1.215 -0.973,2.206 -2.188,2.213 -3.404,2.22 -4.395,1.24 -4.401,0.024 -4.408,-1.191 -3.428,-2.182 -2.212,-2.188 -0.997,-2.195 -0.006,-1.215 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,132.7484,-400.9632)" + clip-path="url(#clipPath464)" + id="path701" /> + <path + d="M 0,0 C 0.006,1.12 -0.896,2.032 -2.017,2.038 -3.136,2.044 -4.049,1.142 -4.055,0.022 -4.062,-1.098 -3.159,-2.011 -2.039,-2.017 -0.919,-2.023 -0.006,-1.121 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,132.5596,-408.52307)" + clip-path="url(#clipPath465)" + id="path702" /> + <path + d="M 0,0 C 0.005,0.972 -0.778,1.765 -1.751,1.77 -2.723,1.775 -3.516,0.991 -3.521,0.019 -3.526,-0.953 -2.743,-1.746 -1.77,-1.751 -0.798,-1.757 -0.005,-0.973 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,132.24507,-416.08293)" + clip-path="url(#clipPath466)" + id="path703" /> + <path + d="M 0,0 C 0.004,0.729 -0.583,1.324 -1.313,1.328 -2.042,1.332 -2.637,0.744 -2.641,0.015 -2.645,-0.715 -2.057,-1.309 -1.328,-1.313 -0.598,-1.317 -0.004,-0.729 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,131.6996,-423.64347)" + clip-path="url(#clipPath467)" + id="path704" /> + <path + d="M 0,0 C 0.002,0.374 -0.298,0.678 -0.672,0.68 -1.045,0.682 -1.35,0.381 -1.352,0.007 -1.354,-0.365 -1.053,-0.669 -0.679,-0.671 -0.306,-0.674 -0.002,-0.373 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,130.88187,-431.206)" + clip-path="url(#clipPath468)" + id="path705" /> + <path + d="m 0,0 c -0.043,0 -0.079,-0.035 -0.079,-0.078 0,-0.044 0.035,-0.079 0.078,-0.079 0.043,-0.001 0.079,0.034 0.079,0.078 C 0.079,-0.036 0.043,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,130.02307,-438.87453)" + clip-path="url(#clipPath469)" + id="path706" /> + <path + d="M 0,0 C -0.147,0.001 -0.268,-0.118 -0.269,-0.266 -0.27,-0.413 -0.15,-0.534 -0.003,-0.534 0.145,-0.535 0.265,-0.416 0.266,-0.269 0.267,-0.121 0.147,-0.001 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,136.9164,-318.1552)" + clip-path="url(#clipPath470)" + id="path707" /> + <path + d="M 0,0 C 0.003,0.573 -0.458,1.04 -1.032,1.043 -1.605,1.046 -2.072,0.584 -2.075,0.012 -2.078,-0.562 -1.616,-1.028 -1.043,-1.032 -0.47,-1.035 -0.003,-0.573 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,138.33947,-325.3492)" + clip-path="url(#clipPath471)" + id="path708" /> + <path + d="M 0,0 C 0.005,0.903 -0.723,1.639 -1.625,1.644 -2.529,1.648 -3.265,0.921 -3.27,0.018 -3.274,-0.885 -2.546,-1.621 -1.644,-1.626 -0.741,-1.631 -0.005,-0.903 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,139.17747,-332.9032)" + clip-path="url(#clipPath472)" + id="path709" /> + <path + d="M 0,0 C 0.006,1.103 -0.883,2.001 -1.985,2.007 -3.088,2.013 -3.987,1.125 -3.993,0.022 -3.999,-1.081 -3.11,-1.979 -2.007,-1.985 -0.905,-1.992 -0.006,-1.103 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,139.70147,-340.45853)" + clip-path="url(#clipPath473)" + id="path710" /> + <path + d="M 0,0 C 0.007,1.233 -0.987,2.238 -2.22,2.245 -3.453,2.251 -4.457,1.257 -4.464,0.025 -4.471,-1.208 -3.477,-2.213 -2.244,-2.22 -1.011,-2.227 -0.007,-1.232 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,140.05693,-348.01453)" + clip-path="url(#clipPath474)" + id="path711" /> + <path + d="M 0,0 C 0.007,1.337 -1.071,2.427 -2.408,2.434 -3.744,2.441 -4.834,1.364 -4.841,0.027 -4.849,-1.31 -3.771,-2.4 -2.434,-2.407 -1.097,-2.415 -0.007,-1.336 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,140.35053,-355.5712)" + clip-path="url(#clipPath475)" + id="path712" /> + <path + d="M 0,0 C 0.008,1.423 -1.14,2.584 -2.563,2.592 -3.987,2.6 -5.147,1.452 -5.155,0.028 -5.163,-1.396 -4.016,-2.556 -2.592,-2.563 -1.168,-2.571 -0.008,-1.424 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,140.6012,-363.12853)" + clip-path="url(#clipPath476)" + id="path713" /> + <path + d="M 0,0 C 0.008,1.441 -1.154,2.616 -2.595,2.624 -4.036,2.632 -5.211,1.47 -5.219,0.029 -5.227,-1.412 -4.065,-2.587 -2.624,-2.595 -1.183,-2.603 -0.008,-1.441 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,140.81027,-393.36027)" + clip-path="url(#clipPath477)" + id="path714" /> + <path + d="M 0,0 C 0.007,1.354 -1.084,2.458 -2.439,2.465 -3.793,2.473 -4.897,1.381 -4.904,0.027 -4.912,-1.328 -3.82,-2.432 -2.466,-2.439 -1.112,-2.447 -0.008,-1.354 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,140.64227,-400.92013)" + clip-path="url(#clipPath478)" + id="path715" /> + <path + d="M 0,0 C 0.007,1.259 -1.008,2.284 -2.267,2.291 -3.525,2.298 -4.551,1.284 -4.558,0.025 -4.565,-1.234 -3.55,-2.26 -2.292,-2.267 -1.033,-2.274 -0.007,-1.259 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,140.4528,-408.47947)" + clip-path="url(#clipPath479)" + id="path716" /> + <path + d="M 0,0 C 0.006,1.146 -0.917,2.08 -2.063,2.086 -3.209,2.092 -4.144,1.168 -4.15,0.023 -4.156,-1.123 -3.232,-2.057 -2.086,-2.063 -0.94,-2.07 -0.006,-1.146 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,140.22227,-416.03867)" + clip-path="url(#clipPath480)" + id="path717" /> + <path + d="M 0,0 C 0.005,0.964 -0.771,1.75 -1.735,1.755 -2.699,1.76 -3.484,0.983 -3.49,0.019 -3.495,-0.944 -2.718,-1.729 -1.754,-1.734 -0.791,-1.74 -0.005,-0.963 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,139.82387,-423.59853)" + clip-path="url(#clipPath481)" + id="path718" /> + <path + d="M 0,0 C 0.004,0.669 -0.535,1.213 -1.204,1.217 -1.872,1.221 -2.417,0.683 -2.42,0.014 -2.424,-0.655 -1.885,-1.2 -1.217,-1.203 -0.548,-1.207 -0.003,-0.668 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,139.15267,-431.1604)" + clip-path="url(#clipPath482)" + id="path719" /> + <path + d="M 0,0 C 0.001,0.251 -0.202,0.457 -0.453,0.458 -0.705,0.459 -0.91,0.256 -0.912,0.005 -0.913,-0.247 -0.71,-0.452 -0.458,-0.454 -0.207,-0.455 -0.001,-0.251 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,138.18853,-438.7248)" + clip-path="url(#clipPath483)" + id="path720" /> + <path + d="m 0,0 c -0.018,0 -0.032,-0.014 -0.032,-0.031 0,-0.018 0.014,-0.032 0.032,-0.032 0.017,0 0.031,0.014 0.031,0.031 C 0.031,-0.014 0.017,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,144.43133,-310.24107)" + clip-path="url(#clipPath484)" + id="path721" /> + <path + d="M 0,0 C 0.002,0.382 -0.306,0.693 -0.688,0.695 -1.07,0.698 -1.381,0.39 -1.383,0.008 -1.385,-0.375 -1.078,-0.686 -0.695,-0.688 -0.313,-0.69 -0.002,-0.382 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,145.3948,-317.75213)" + clip-path="url(#clipPath485)" + id="path722" /> + <path + d="M 0,0 C 0.004,0.79 -0.633,1.434 -1.422,1.438 -2.212,1.442 -2.856,0.806 -2.861,0.016 -2.865,-0.774 -2.229,-1.418 -1.438,-1.422 -0.648,-1.427 -0.004,-0.79 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,146.4216,-325.30493)" + clip-path="url(#clipPath486)" + id="path723" /> + <path + d="M 0,0 C 0.005,1.059 -0.848,1.922 -1.907,1.928 -2.966,1.934 -3.83,1.08 -3.835,0.021 -3.841,-1.038 -2.987,-1.901 -1.928,-1.907 -0.869,-1.913 -0.006,-1.06 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,147.11293,-332.8596)" + clip-path="url(#clipPath487)" + id="path724" /> + <path + d="M 0,0 C 0.007,1.224 -0.98,2.222 -2.204,2.229 -3.428,2.235 -4.426,1.249 -4.433,0.024 -4.439,-1.2 -3.453,-2.197 -2.229,-2.204 -1.004,-2.211 -0.007,-1.224 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,147.5524,-340.41493)" + clip-path="url(#clipPath488)" + id="path725" /> + <path + d="M 0,0 C 0.008,1.354 -1.084,2.458 -2.438,2.466 -3.793,2.473 -4.896,1.381 -4.904,0.027 -4.912,-1.328 -3.82,-2.431 -2.465,-2.438 -1.111,-2.446 -0.007,-1.354 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,147.90853,-347.9716)" + clip-path="url(#clipPath489)" + id="path726" /> + <path + d="M 0,0 C 0.008,1.38 -1.105,2.505 -2.485,2.513 -3.866,2.521 -4.991,1.408 -4.999,0.028 -5.006,-1.353 -3.893,-2.478 -2.513,-2.486 -1.132,-2.494 -0.007,-1.38 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,148.3044,-408.43573)" + clip-path="url(#clipPath490)" + id="path727" /> + <path + d="M 0,0 C 0.007,1.259 -1.008,2.285 -2.267,2.292 -3.525,2.299 -4.552,1.284 -4.559,0.025 -4.565,-1.234 -3.551,-2.26 -2.292,-2.267 -1.033,-2.274 -0.007,-1.259 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,148.05307,-415.99573)" + clip-path="url(#clipPath491)" + id="path728" /> + <path + d="M 0,0 C 0.006,1.111 -0.89,2.018 -2.001,2.023 -3.112,2.03 -4.018,1.134 -4.024,0.022 -4.03,-1.089 -3.134,-1.995 -2.023,-2.001 -0.912,-2.007 -0.006,-1.111 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,147.738,-423.55493)" + clip-path="url(#clipPath492)" + id="path729" /> + <path + d="M 0,0 C 0.005,0.869 -0.695,1.576 -1.563,1.581 -2.431,1.586 -3.139,0.886 -3.144,0.018 -3.148,-0.85 -2.449,-1.558 -1.581,-1.562 -0.712,-1.567 -0.005,-0.868 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,147.19307,-431.11613)" + clip-path="url(#clipPath493)" + id="path730" /> + <path + d="M 0,0 C 0.002,0.495 -0.396,0.898 -0.891,0.901 -1.386,0.903 -1.79,0.504 -1.792,0.01 -1.795,-0.485 -1.396,-0.888 -0.901,-0.891 -0.406,-0.894 -0.003,-0.495 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,146.3336,-438.67987)" + clip-path="url(#clipPath494)" + id="path731" /> + <path + d="m 0,0 c -0.069,0 -0.126,-0.055 -0.126,-0.125 -0.001,-0.069 0.055,-0.126 0.125,-0.126 0.069,-0.001 0.126,0.055 0.126,0.125 C 0.125,-0.057 0.069,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,145.18133,-446.41173)" + clip-path="url(#clipPath495)" + id="path732" /> + <path + d="m 0,0 c -0.096,0 -0.174,-0.077 -0.174,-0.172 -0.001,-0.096 0.076,-0.174 0.172,-0.174 0.096,-0.001 0.173,0.076 0.174,0.172 C 0.172,-0.079 0.096,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,151.99053,-310.38827)" + clip-path="url(#clipPath496)" + id="path733" /> + <path + d="M 0,0 C 0.003,0.556 -0.445,1.009 -1,1.012 -1.557,1.015 -2.009,0.567 -2.012,0.011 -2.015,-0.544 -1.567,-0.997 -1.012,-1 -0.456,-1.003 -0.003,-0.555 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,153.37213,-317.70787)" + clip-path="url(#clipPath497)" + id="path734" /> + <path + d="M 0,0 C 0.005,0.929 -0.744,1.686 -1.673,1.691 -2.602,1.696 -3.358,0.947 -3.364,0.019 -3.369,-0.91 -2.62,-1.667 -1.691,-1.672 -0.762,-1.678 -0.005,-0.929 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,154.3148,-325.26133)" + clip-path="url(#clipPath498)" + id="path735" /> + <path + d="M 0,0 C 0.006,1.154 -0.925,2.096 -2.079,2.102 -3.234,2.108 -4.175,1.178 -4.182,0.023 -4.188,-1.132 -3.257,-2.073 -2.103,-2.079 -0.948,-2.085 -0.007,-1.155 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,154.902,-332.81667)" + clip-path="url(#clipPath499)" + id="path736" /> + <path + d="m 0,0 c 0.008,1.311 -1.049,2.379 -2.36,2.387 -1.311,0.007 -2.38,-1.05 -2.387,-2.361 -0.007,-1.311 1.05,-2.38 2.36,-2.387 C -1.075,-2.368 -0.007,-1.311 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,155.32,-340.37267)" + clip-path="url(#clipPath500)" + id="path737" /> + <path + d="M 0,0 C 0.008,1.467 -1.175,2.663 -2.642,2.671 -4.109,2.679 -5.305,1.496 -5.313,0.029 -5.321,-1.438 -4.138,-2.634 -2.671,-2.642 -1.204,-2.65 -0.008,-1.467 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,155.7392,-347.92867)" + clip-path="url(#clipPath501)" + id="path738" /> + <path + d="M 0,0 C 0.008,1.345 -1.077,2.442 -2.423,2.45 -3.769,2.457 -4.865,1.372 -4.873,0.027 -4.88,-1.319 -3.795,-2.416 -2.449,-2.423 -1.104,-2.431 -0.007,-1.346 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,155.82,-415.95267)" + clip-path="url(#clipPath502)" + id="path739" /> + <path + d="M 0,0 C 0.006,1.199 -0.96,2.175 -2.157,2.182 -3.355,2.188 -4.332,1.223 -4.339,0.024 -4.345,-1.174 -3.379,-2.15 -2.182,-2.157 -0.983,-2.164 -0.007,-1.198 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,155.50613,-423.512)" + clip-path="url(#clipPath503)" + id="path740" /> + <path + d="M 0,0 C 0.006,0.999 -0.799,1.812 -1.797,1.818 -2.796,1.823 -3.609,1.019 -3.615,0.02 -3.62,-0.978 -2.815,-1.792 -1.817,-1.797 -0.818,-1.803 -0.005,-0.998 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,155.0648,-431.0732)" + clip-path="url(#clipPath504)" + id="path741" /> + <path + d="M 0,0 C 0.003,0.668 -0.535,1.213 -1.204,1.217 -1.872,1.221 -2.417,0.682 -2.421,0.014 -2.425,-0.655 -1.886,-1.2 -1.217,-1.204 -0.549,-1.208 -0.004,-0.668 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,154.31093,-438.6356)" + clip-path="url(#clipPath505)" + id="path742" /> + <path + d="M 0,0 C 0.002,0.191 -0.152,0.347 -0.344,0.348 -0.534,0.349 -0.69,0.195 -0.691,0.004 -0.692,-0.187 -0.538,-0.343 -0.348,-0.344 -0.156,-0.345 -0.001,-0.191 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,153.19893,-446.20013)" + clip-path="url(#clipPath506)" + id="path743" /> + <path + d="M 0,0 C 0.001,0.191 -0.153,0.347 -0.345,0.348 -0.535,0.349 -0.691,0.195 -0.692,0.004 -0.693,-0.187 -0.539,-0.343 -0.349,-0.344 -0.157,-0.345 -0.001,-0.191 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,160.0088,-310.11347)" + clip-path="url(#clipPath507)" + id="path744" /> + <path + d="M 0,0 C 0.004,0.677 -0.542,1.229 -1.22,1.233 -1.896,1.237 -2.448,0.69 -2.452,0.014 -2.456,-0.664 -1.91,-1.216 -1.233,-1.219 -0.556,-1.223 -0.004,-0.677 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,161.2236,-317.66493)" + clip-path="url(#clipPath508)" + id="path745" /> + <path + d="M 0,0 C 0.005,1.016 -0.813,1.844 -1.829,1.849 -2.845,1.855 -3.673,1.036 -3.679,0.021 -3.685,-0.995 -2.865,-1.823 -1.85,-1.829 -0.834,-1.834 -0.006,-1.016 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,162.08307,-325.2184)" + clip-path="url(#clipPath509)" + id="path746" /> + <path + d="M 0,0 C 0.007,1.215 -0.974,2.206 -2.188,2.213 -3.404,2.22 -4.395,1.24 -4.401,0.024 -4.408,-1.191 -3.429,-2.182 -2.213,-2.188 -0.997,-2.195 -0.007,-1.215 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,162.6064,-332.77373)" + clip-path="url(#clipPath510)" + id="path747" /> + <path + d="M 0,0 C 0.008,1.372 -1.099,2.49 -2.471,2.498 -3.842,2.505 -4.96,1.399 -4.968,0.028 -4.976,-1.344 -3.869,-2.462 -2.498,-2.47 -1.126,-2.477 -0.008,-1.372 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,163.02573,-340.32973)" + clip-path="url(#clipPath511)" + id="path748" /> + <path + d="M 0,0 C 0.008,1.415 -1.133,2.568 -2.549,2.576 -3.963,2.583 -5.116,1.443 -5.124,0.028 -5.132,-1.387 -3.991,-2.541 -2.577,-2.548 -1.161,-2.556 -0.008,-1.416 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,163.54653,-415.9104)" + clip-path="url(#clipPath512)" + id="path749" /> + <path + d="M 0,0 C 0.007,1.259 -1.008,2.286 -2.267,2.292 -3.525,2.299 -4.552,1.284 -4.559,0.025 -4.565,-1.233 -3.551,-2.259 -2.292,-2.266 -1.033,-2.273 -0.007,-1.259 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,163.21067,-423.4696)" + clip-path="url(#clipPath513)" + id="path750" /> + <path + d="M 0,0 C 0.006,1.077 -0.862,1.954 -1.938,1.96 -3.016,1.966 -3.893,1.098 -3.898,0.021 -3.904,-1.055 -3.037,-1.932 -1.96,-1.938 -0.884,-1.944 -0.006,-1.076 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,162.81213,-431.03013)" + clip-path="url(#clipPath514)" + id="path751" /> + <path + d="M 0,0 C 0.005,0.772 -0.618,1.403 -1.391,1.407 -2.163,1.411 -2.793,0.788 -2.798,0.016 -2.802,-0.757 -2.179,-1.387 -1.406,-1.391 -0.634,-1.396 -0.004,-0.772 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,162.11947,-438.59267)" + clip-path="url(#clipPath515)" + id="path752" /> + <path + d="M 0,0 C 0.001,0.312 -0.251,0.567 -0.563,0.569 -0.876,0.571 -1.131,0.318 -1.132,0.006 -1.134,-0.307 -0.882,-0.562 -0.569,-0.563 -0.257,-0.565 -0.002,-0.313 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,161.05173,-446.1572)" + clip-path="url(#clipPath516)" + id="path753" /> + <path + d="M 0,0 C 0.001,0.251 -0.202,0.457 -0.453,0.458 -0.705,0.459 -0.911,0.257 -0.912,0.005 -0.913,-0.247 -0.71,-0.452 -0.458,-0.454 -0.207,-0.455 -0.002,-0.252 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,167.7132,-310.0712)" + clip-path="url(#clipPath517)" + id="path754" /> + <path + d="M 0,0 C 0.005,0.738 -0.591,1.339 -1.328,1.343 -2.066,1.348 -2.668,0.752 -2.672,0.015 -2.676,-0.723 -2.081,-1.325 -1.343,-1.329 -0.605,-1.333 -0.004,-0.738 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,168.928,-317.62267)" + clip-path="url(#clipPath518)" + id="path755" /> + <path + d="M 0,0 C -0.006,-1.059 0.849,-1.923 1.907,-1.928 2.967,-1.934 3.83,-1.081 3.836,-0.021 3.842,1.038 2.988,1.901 1.929,1.907 0.869,1.913 0.006,1.059 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,164.6312,-325.20467)" + clip-path="url(#clipPath519)" + id="path756" /> + <path + d="m 0,0 c -0.007,-1.25 1.001,-2.269 2.251,-2.276 1.25,-0.007 2.27,1.001 2.276,2.251 C 4.534,1.225 3.526,2.244 2.276,2.251 1.026,2.258 0.007,1.25 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,164.21187,-332.7652)" + clip-path="url(#clipPath520)" + id="path757" /> + <path + d="M 0,0 C 0.008,1.415 -1.134,2.568 -2.548,2.576 -3.964,2.584 -5.117,1.443 -5.125,0.028 -5.133,-1.387 -3.991,-2.541 -2.576,-2.548 -1.161,-2.556 -0.008,-1.416 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,170.68853,-340.288)" + clip-path="url(#clipPath521)" + id="path758" /> + <path + d="M 0,0 C 0.007,1.285 -1.028,2.332 -2.313,2.339 -3.599,2.346 -4.646,1.311 -4.652,0.025 -4.66,-1.259 -3.624,-2.306 -2.339,-2.313 -1.055,-2.32 -0.007,-1.285 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,170.83173,-423.428)" + clip-path="url(#clipPath522)" + id="path759" /> + <path + d="M 0,0 C 0.006,1.111 -0.89,2.018 -2.001,2.024 -3.112,2.03 -4.018,1.134 -4.023,0.022 -4.03,-1.088 -3.134,-1.995 -2.022,-2 -0.912,-2.007 -0.006,-1.111 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,170.45413,-430.98787)" + clip-path="url(#clipPath523)" + id="path760" /> + <path + d="M 0,0 C 0.005,0.833 -0.668,1.513 -1.501,1.517 -2.335,1.522 -3.014,0.85 -3.019,0.017 -3.022,-0.817 -2.352,-1.496 -1.518,-1.5 -0.685,-1.505 -0.005,-0.833 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,169.8252,-438.5504)" + clip-path="url(#clipPath524)" + id="path761" /> + <path + d="M 0,0 C 0.002,0.382 -0.306,0.693 -0.687,0.696 -1.07,0.698 -1.382,0.39 -1.384,0.008 -1.386,-0.374 -1.077,-0.686 -0.695,-0.687 -0.313,-0.69 -0.003,-0.381 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,168.77707,-446.11413)" + clip-path="url(#clipPath525)" + id="path762" /> + <path + d="m 0,0 c -0.009,0 -0.017,-0.007 -0.017,-0.016 0,-0.009 0.008,-0.016 0.017,-0.016 0.008,0 0.015,0.007 0.015,0.016 C 0.016,-0.008 0.008,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,167.8968,-453.6988)" + clip-path="url(#clipPath526)" + id="path763" /> + <path + d="m 0,0 c -0.002,-0.26 0.208,-0.473 0.469,-0.474 0.26,-0.002 0.472,0.208 0.473,0.469 C 0.944,0.255 0.734,0.468 0.475,0.469 0.213,0.471 0.001,0.26 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,174.0348,-310.036)" + clip-path="url(#clipPath527)" + id="path764" /> + <path + d="M 0,0 C -0.004,-0.747 0.599,-1.355 1.345,-1.359 2.091,-1.363 2.699,-0.761 2.704,-0.015 2.708,0.732 2.106,1.34 1.359,1.344 0.613,1.349 0.004,0.747 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,172.902,-317.60053)" + clip-path="url(#clipPath528)" + id="path765" /> + <path + d="M 0,0 C -0.006,-1.059 0.848,-1.922 1.907,-1.928 2.966,-1.934 3.829,-1.081 3.835,-0.021 3.841,1.038 2.987,1.901 1.929,1.907 0.869,1.913 0.006,1.059 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,172.18973,-325.16307)" + clip-path="url(#clipPath529)" + id="path766" /> + <path + d="m 0,0 c -0.007,-1.25 1.001,-2.269 2.251,-2.276 1.25,-0.007 2.27,1.001 2.276,2.251 C 4.534,1.225 3.525,2.244 2.276,2.251 1.025,2.258 0.007,1.25 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,171.77053,-332.7236)" + clip-path="url(#clipPath530)" + id="path767" /> + <path + d="M 0,0 C -0.008,-1.424 1.14,-2.584 2.563,-2.592 3.987,-2.6 5.147,-1.452 5.155,-0.028 5.163,1.395 4.016,2.556 2.592,2.563 1.168,2.571 0.008,1.424 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,171.39293,-340.28413)" + clip-path="url(#clipPath531)" + id="path768" /> + <path + d="m 0,0 c -0.806,-0.218 -1.461,-0.721 -1.88,-1.42 -0.345,0.647 -0.865,1.178 -1.53,1.492 0.821,0.449 1.386,1.252 1.514,2.22 C -1.754,1.202 -1.021,0.328 0,0 M 5.676,-5.755 C 4.89,-5.961 4.248,-6.444 3.831,-7.12 3.519,-6.518 3.04,-6.034 2.448,-5.703 c 0.642,0.394 1.125,0.979 1.361,1.711 0.3,-0.859 0.99,-1.499 1.867,-1.763 m -0.679,-5.696 c -0.487,-0.237 -0.878,-0.6 -1.195,-1.034 -0.259,0.418 -0.585,0.763 -0.986,1.046 0.413,0.306 0.754,0.678 0.997,1.134 0.291,-0.483 0.687,-0.879 1.184,-1.146 m 6.868,-5.793 c -1.046,-0.073 -1.928,-0.684 -2.375,-1.578 -0.279,0.697 -0.808,1.238 -1.451,1.611 0.649,0.375 1.169,0.928 1.441,1.636 0.415,-0.937 1.317,-1.582 2.385,-1.669 m 0.046,-5.716 c -1.125,-0.048 -2.082,-0.733 -2.492,-1.724 -0.256,0.745 -0.771,1.338 -1.44,1.73 0.662,0.366 1.207,0.91 1.498,1.613 0.447,-0.922 1.354,-1.562 2.434,-1.619 m -6.927,-5.72 c -0.544,-0.271 -0.976,-0.699 -1.278,-1.225 -0.244,0.505 -0.619,0.908 -1.067,1.237 0.44,0.291 0.802,0.659 1.08,1.109 0.328,-0.473 0.739,-0.875 1.265,-1.121 m 0.845,-5.687 c -1.119,-0.196 -1.976,-1.023 -2.215,-2.128 -0.166,0.903 -0.694,1.65 -1.463,2.097 0.668,0.33 1.206,0.861 1.538,1.529 0.444,-0.792 1.211,-1.339 2.14,-1.498 m -12.11,-5.703 c -0.825,-0.385 -1.397,-1.151 -1.575,-2.07 -0.159,0.891 -0.682,1.631 -1.444,2.061 0.632,0.288 1.124,0.78 1.481,1.371 0.368,-0.6 0.879,-1.095 1.538,-1.362 m -14.716,0.112 c 0.725,0.25 1.302,0.75 1.692,1.395 0.352,-0.631 0.864,-1.157 1.525,-1.459 -0.826,-0.441 -1.394,-1.244 -1.525,-2.211 -0.132,1.027 -0.765,1.893 -1.692,2.275 m -5.374,5.707 c 0.564,0.245 1.003,0.67 1.353,1.168 0.3,-0.488 0.696,-0.886 1.187,-1.182 -0.512,-0.345 -0.953,-0.785 -1.201,-1.358 -0.281,0.597 -0.753,1.071 -1.339,1.372 m -6.017,5.811 c 0.706,0.225 1.273,0.69 1.659,1.306 0.294,-0.565 0.735,-1.014 1.275,-1.347 -0.548,-0.357 -1.019,-0.822 -1.279,-1.429 -0.337,0.689 -0.924,1.213 -1.655,1.47 m 0.412,5.706 c 0.533,0.243 0.951,0.65 1.278,1.13 0.26,-0.46 0.612,-0.837 1.041,-1.143 -0.437,-0.313 -0.799,-0.699 -1.054,-1.175 -0.31,0.505 -0.728,0.927 -1.265,1.188 m 0.059,5.743 c 0.524,0.251 0.937,0.655 1.25,1.139 0.249,-0.462 0.594,-0.841 1.014,-1.151 -0.421,-0.298 -0.766,-0.665 -1.026,-1.113 -0.315,0.475 -0.72,0.875 -1.238,1.125 m -0.182,5.72 c 0.645,0.265 1.148,0.766 1.475,1.377 0.253,-0.571 0.686,-1.016 1.195,-1.368 -0.509,-0.319 -0.927,-0.74 -1.219,-1.268 -0.352,0.555 -0.832,1.012 -1.451,1.259 m -0.942,5.714 c 1.295,0.076 2.311,1.038 2.512,2.299 0.129,-0.986 0.697,-1.808 1.532,-2.272 -0.709,-0.34 -1.285,-0.905 -1.612,-1.621 -0.469,0.9 -1.363,1.525 -2.432,1.594 m 5.895,5.691 c 1.326,0.178 2.367,1.26 2.381,2.634 0,-1.136 0.661,-2.098 1.607,-2.587 -0.745,-0.314 -1.331,-0.903 -1.686,-1.626 -0.459,0.859 -1.295,1.449 -2.302,1.579 M -12.098,0.12 c -0.515,-0.265 -0.929,-0.658 -1.257,-1.132 -0.326,0.478 -0.737,0.878 -1.254,1.146 0.546,0.327 1.009,0.778 1.267,1.366 0.25,-0.59 0.706,-1.043 1.244,-1.38 m 4.418,-11.824 c -0.1,0.112 -0.205,0.206 -0.316,0.306 0.124,0.115 0.212,0.253 0.319,0.383 0.117,-0.139 0.234,-0.266 0.37,-0.387 -0.126,-0.102 -0.261,-0.184 -0.373,-0.302 m -0.095,-17.364 c -0.13,0.167 -0.244,0.336 -0.399,0.479 0.139,0.117 0.272,0.227 0.394,0.362 0.134,-0.146 0.293,-0.252 0.448,-0.377 -0.167,-0.141 -0.305,-0.295 -0.443,-0.464 m -11.442,6.518 c 0.078,-0.088 0.149,-0.175 0.235,-0.255 -0.089,-0.085 -0.148,-0.191 -0.229,-0.284 -0.097,0.109 -0.201,0.2 -0.31,0.296 0.1,0.085 0.212,0.148 0.304,0.243 m 0.041,5.737 c 0.071,-0.081 0.12,-0.174 0.197,-0.249 -0.078,-0.073 -0.137,-0.155 -0.208,-0.234 -0.084,0.088 -0.184,0.148 -0.275,0.228 0.099,0.085 0.197,0.16 0.286,0.255 m 0.024,5.931 c 0.122,-0.158 0.225,-0.321 0.371,-0.457 -0.132,-0.113 -0.251,-0.227 -0.366,-0.357 -0.133,0.145 -0.294,0.248 -0.449,0.371 0.164,0.137 0.306,0.28 0.444,0.443 m 11.4,-12.201 c -0.061,0.07 -0.103,0.152 -0.17,0.217 0.065,0.06 0.121,0.119 0.182,0.183 0.065,-0.068 0.148,-0.112 0.219,-0.176 -0.082,-0.074 -0.157,-0.143 -0.231,-0.224 m 0.249,5.958 c -0.067,-0.06 -0.145,-0.101 -0.208,-0.165 -0.052,0.056 -0.097,0.114 -0.151,0.167 0.059,0.058 0.097,0.13 0.153,0.192 0.065,-0.07 0.135,-0.129 0.206,-0.194 M -19.95,-5.58 c 0.332,0.238 0.604,0.522 0.831,0.863 0.204,-0.332 0.442,-0.625 0.742,-0.871 -0.284,-0.204 -0.532,-0.429 -0.75,-0.702 -0.235,0.284 -0.514,0.508 -0.823,0.71 m 0.19,-22.945 c 0.183,0.138 0.367,0.261 0.522,0.43 0.136,-0.161 0.283,-0.299 0.444,-0.436 -0.176,-0.156 -0.307,-0.343 -0.45,-0.53 -0.156,0.199 -0.321,0.374 -0.516,0.536 m 12.838,-5.824 c -0.355,-0.252 -0.646,-0.558 -0.879,-0.926 -0.216,0.367 -0.485,0.681 -0.819,0.945 0.313,0.214 0.585,0.455 0.819,0.752 0.249,-0.31 0.543,-0.556 0.879,-0.771 m 5.414,11.448 c -0.182,-0.143 -0.35,-0.286 -0.503,-0.462 -0.128,0.166 -0.24,0.334 -0.393,0.476 0.146,0.128 0.264,0.272 0.389,0.421 0.151,-0.169 0.328,-0.296 0.507,-0.435 m 0.004,5.742 c -0.171,-0.132 -0.339,-0.252 -0.483,-0.411 -0.121,0.147 -0.232,0.289 -0.372,0.417 0.144,0.132 0.253,0.286 0.376,0.439 0.144,-0.169 0.306,-0.305 0.479,-0.445 m -5.397,11.508 c -0.278,-0.187 -0.533,-0.381 -0.749,-0.634 -0.202,0.249 -0.43,0.451 -0.688,0.641 0.278,0.227 0.498,0.494 0.695,0.795 0.207,-0.31 0.447,-0.575 0.742,-0.802 m -13.624,5.818 c 0.696,0.351 1.213,0.959 1.456,1.713 0.216,-0.737 0.688,-1.335 1.331,-1.729 -0.571,-0.287 -1.023,-0.731 -1.361,-1.269 -0.356,0.549 -0.82,1.02 -1.426,1.285 m -5.563,-5.713 c 0.522,0.283 0.942,0.699 1.229,1.22 0.24,-0.504 0.615,-0.906 1.062,-1.233 -0.435,-0.276 -0.792,-0.628 -1.075,-1.058 -0.321,0.448 -0.718,0.825 -1.216,1.071 m 0.368,-5.736 c 0.324,0.218 0.596,0.476 0.826,0.79 0.195,-0.301 0.407,-0.576 0.678,-0.807 -0.261,-0.204 -0.477,-0.433 -0.677,-0.697 -0.235,0.287 -0.513,0.513 -0.827,0.714 m 0.161,-5.743 c 0.239,0.171 0.454,0.351 0.642,0.575 0.156,-0.212 0.307,-0.416 0.505,-0.591 -0.193,-0.166 -0.346,-0.355 -0.502,-0.555 -0.189,0.223 -0.407,0.399 -0.645,0.571 m -0.058,-5.744 c 0.249,0.173 0.479,0.352 0.678,0.582 0.161,-0.211 0.322,-0.406 0.523,-0.579 -0.212,-0.183 -0.373,-0.397 -0.539,-0.622 -0.193,0.24 -0.413,0.436 -0.662,0.619 m -0.267,-5.732 c 0.347,0.209 0.65,0.457 0.905,0.769 0.212,-0.294 0.451,-0.547 0.738,-0.769 -0.305,-0.247 -0.547,-0.54 -0.757,-0.873 -0.24,0.35 -0.532,0.638 -0.886,0.873 m 5.652,-5.784 c 0.373,0.22 0.694,0.49 0.964,0.825 0.246,-0.327 0.533,-0.594 0.871,-0.826 -0.365,-0.276 -0.662,-0.61 -0.89,-1.009 -0.24,0.407 -0.558,0.742 -0.945,1.01 m 8.079,-5.778 c -0.71,-0.391 -1.217,-1.046 -1.426,-1.851 -0.203,0.814 -0.711,1.483 -1.431,1.876 0.609,0.27 1.08,0.738 1.438,1.292 0.348,-0.561 0.816,-1.034 1.419,-1.317 m 11.286,5.681 c -0.509,-0.288 -0.924,-0.699 -1.201,-1.215 -0.241,0.503 -0.616,0.903 -1.063,1.227 0.434,0.27 0.789,0.615 1.075,1.036 0.317,-0.437 0.704,-0.801 1.189,-1.048 m -0.424,5.736 c -0.289,-0.207 -0.532,-0.445 -0.743,-0.73 -0.183,0.275 -0.374,0.531 -0.623,0.747 0.234,0.185 0.435,0.385 0.621,0.619 0.215,-0.254 0.469,-0.449 0.745,-0.636 m 6.059,5.71 c -0.414,-0.237 -0.753,-0.554 -1.029,-0.942 -0.22,0.368 -0.487,0.685 -0.82,0.952 0.331,0.252 0.601,0.55 0.83,0.898 0.277,-0.372 0.613,-0.677 1.019,-0.908 m 0.003,5.743 c -0.395,-0.224 -0.725,-0.518 -1,-0.878 -0.22,0.341 -0.476,0.636 -0.793,0.888 0.323,0.255 0.582,0.558 0.803,0.906 0.267,-0.374 0.594,-0.681 0.99,-0.916 m -6.049,5.776 c -0.248,-0.17 -0.481,-0.342 -0.679,-0.567 -0.164,0.206 -0.335,0.387 -0.536,0.556 0.222,0.192 0.389,0.419 0.561,0.658 0.19,-0.249 0.404,-0.457 0.654,-0.647 m 0.431,5.732 c -0.419,-0.229 -0.769,-0.533 -1.061,-0.907 -0.255,0.365 -0.56,0.666 -0.926,0.918 0.385,0.291 0.703,0.643 0.937,1.07 0.259,-0.446 0.614,-0.807 1.05,-1.081 m -5.416,5.773 c -0.566,-0.26 -1.01,-0.69 -1.359,-1.201 -0.326,0.51 -0.753,0.931 -1.291,1.216 0.586,0.357 1.053,0.868 1.298,1.52 0.25,-0.666 0.738,-1.19 1.352,-1.535 m -6.869,8.299 c -0.008,-1.388 1.057,-2.497 2.409,-2.636 -1.163,-0.09 -2.158,-0.788 -2.605,-1.812 -0.444,1.044 -1.455,1.767 -2.645,1.841 1.384,0.085 2.494,1.202 2.501,2.609 0.008,1.467 -1.174,2.663 -2.641,2.671 -1.468,0.008 -2.663,-1.174 -2.672,-2.642 -0.008,-1.407 1.09,-2.536 2.473,-2.636 -1.315,-0.068 -2.376,-0.949 -2.748,-2.16 -0.369,1.192 -1.437,2.077 -2.752,2.084 -1.618,0.009 -2.935,-1.293 -2.953,-2.91 0,1.504 -1.211,2.728 -2.716,2.736 -1.511,0.009 -2.743,-1.209 -2.751,-2.719 -0.007,-1.382 1.027,-2.482 2.356,-2.675 -1.384,-0.163 -2.453,-1.213 -2.649,-2.589 -0.195,1.321 -1.28,2.354 -2.656,2.362 -1.519,0.008 -2.758,-1.217 -2.766,-2.736 -0.008,-1.459 1.13,-2.63 2.566,-2.73 -1.567,-0.085 -2.824,-1.348 -2.833,-2.937 -0.007,-1.243 0.749,-2.311 1.828,-2.766 -1.02,-0.394 -1.732,-1.312 -1.917,-2.42 -0.227,1.264 -1.279,2.244 -2.61,2.251 -1.501,0.009 -2.725,-1.202 -2.733,-2.704 -0.009,-1.502 1.202,-2.726 2.704,-2.734 1.331,-0.008 2.392,0.961 2.634,2.222 0.159,-1.026 0.774,-1.888 1.676,-2.333 -0.875,-0.411 -1.488,-1.211 -1.709,-2.176 -0.301,1.184 -1.323,2.081 -2.602,2.089 -1.519,0.008 -2.758,-1.217 -2.766,-2.736 -0.009,-1.519 1.216,-2.758 2.735,-2.766 1.28,-0.007 2.311,0.879 2.626,2.06 0.213,-0.979 0.826,-1.798 1.712,-2.214 -0.939,-0.444 -1.585,-1.341 -1.722,-2.413 -0.178,1.313 -1.253,2.345 -2.617,2.353 -1.493,0.008 -2.71,-1.196 -2.718,-2.689 -0.009,-1.493 1.195,-2.71 2.688,-2.719 1.364,-0.007 2.45,1.013 2.643,2.324 0.142,-1.213 0.948,-2.192 2.075,-2.566 -1.153,-0.392 -1.998,-1.451 -2.005,-2.738 -0.009,-1.623 1.3,-2.946 2.923,-2.955 1.156,-0.006 2.136,0.671 2.621,1.638 0.325,-0.783 0.945,-1.407 1.718,-1.752 -0.971,-0.486 -1.657,-1.458 -1.669,-2.616 0,1.477 -1.191,2.681 -2.67,2.688 -1.485,0.009 -2.694,-1.188 -2.702,-2.672 -0.009,-1.485 1.188,-2.695 2.673,-2.703 1.479,-0.008 2.683,1.181 2.699,2.659 -10e-4,-1.642 1.323,-2.98 2.968,-2.989 1.188,-0.006 2.199,0.695 2.685,1.697 0.352,-0.838 1.056,-1.467 1.916,-1.774 -1.044,-0.417 -1.786,-1.428 -1.793,-2.62 -0.009,-1.572 1.258,-2.853 2.829,-2.861 1.443,-0.009 2.591,1.075 2.785,2.465 0.18,-1.461 1.372,-2.614 2.883,-2.622 1.387,-0.008 2.504,0.957 2.839,2.239 0.32,-1.295 1.435,-2.279 2.83,-2.286 1.464,-0.008 2.633,1.06 2.895,2.45 0.245,-1.34 1.361,-2.38 2.774,-2.387 1.598,-0.009 2.9,1.279 2.908,2.876 0.006,1.156 -0.677,2.139 -1.654,2.609 0.772,0.303 1.386,0.892 1.75,1.633 0.458,-0.876 1.308,-1.478 2.33,-1.609 -1.322,-0.178 -2.362,-1.261 -2.369,-2.633 -0.009,-1.502 1.203,-2.726 2.705,-2.734 1.501,-0.009 2.726,1.202 2.733,2.704 0.008,1.372 -1.019,2.466 -2.339,2.659 1.338,0.157 2.377,1.14 2.632,2.448 0.259,-1.269 1.327,-2.245 2.673,-2.253 1.545,-0.008 2.804,1.238 2.813,2.783 0.008,1.374 -0.996,2.47 -2.301,2.713 1.385,0.22 2.447,1.323 2.557,2.745 0.104,-1.382 1.221,-2.485 2.631,-2.493 1.485,-0.008 2.695,1.188 2.703,2.673 0.008,1.484 -1.189,2.694 -2.673,2.702 -1.41,0.008 -2.54,-1.083 -2.659,-2.463 -0.074,1.104 -0.715,2.035 -1.652,2.513 0.802,0.364 1.409,1.042 1.707,1.88 0.416,-1.036 1.42,-1.771 2.605,-1.778 1.562,-0.009 2.836,1.251 2.844,2.814 0.008,1.516 -1.184,2.737 -2.682,2.818 1.533,0.064 2.768,1.299 2.776,2.85 0.009,1.523 -1.173,2.744 -2.667,2.864 1.478,0.105 2.659,1.299 2.667,2.804 0.009,1.581 -1.264,2.868 -2.845,2.877 -1.164,0.006 -2.16,-0.689 -2.612,-1.684 -0.293,0.785 -0.873,1.412 -1.615,1.783 0.851,0.446 1.438,1.259 1.602,2.241 0.229,-1.273 1.286,-2.26 2.625,-2.268 1.511,-0.008 2.743,1.21 2.751,2.721 0.008,1.51 -1.21,2.741 -2.72,2.75 -1.34,0.007 -2.407,-0.968 -2.651,-2.239 -0.189,1.221 -1.049,2.177 -2.223,2.499 1.187,0.343 2.075,1.39 2.083,2.689 0.008,1.58 -1.266,2.868 -2.846,2.876 C 5.256,-0.191 4.22,-0.989 3.819,-2.096 3.501,-1.07 2.701,-0.302 1.663,-0.009 2.806,0.344 3.652,1.367 3.66,2.626 3.668,4.18 2.416,5.446 0.862,5.455 -0.562,5.463 -1.698,4.393 -1.892,3.021 -2.072,4.5 -3.277,5.667 -4.806,5.675 c -1.28,0.007 -2.36,-0.796 -2.798,-1.922 -0.402,1.105 -1.405,1.888 -2.622,1.996 1.354,0.123 2.43,1.221 2.438,2.609 0.009,1.475 -1.182,2.678 -2.656,2.686 -1.477,0.008 -2.68,-1.181 -2.688,-2.657" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,189.1924,-404.68253)" + clip-path="url(#clipPath532)" + id="path769" /> + <path + d="M 0,0 C -0.007,-1.293 1.035,-2.347 2.329,-2.354 3.622,-2.362 4.677,-1.318 4.684,-0.025 4.691,1.268 3.648,2.322 2.355,2.33 1.062,2.337 0.007,1.294 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,172.16507,-423.42013)" + clip-path="url(#clipPath533)" + id="path770" /> + <path + d="m 0,0 c -0.007,-1.12 0.896,-2.032 2.017,-2.039 1.12,-0.005 2.032,0.897 2.038,2.017 C 4.062,1.098 3.158,2.011 2.039,2.017 0.919,2.023 0.006,1.12 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,172.626,-430.97613)" + clip-path="url(#clipPath534)" + id="path771" /> + <path + d="M 0,0 C -0.005,-0.842 0.674,-1.529 1.517,-1.533 2.358,-1.538 3.045,-0.859 3.05,-0.017 3.054,0.825 2.375,1.512 1.533,1.517 0.691,1.521 0.005,0.842 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,173.33827,-438.5308)" + clip-path="url(#clipPath535)" + id="path772" /> + <path + d="M 0,0 C -0.002,-0.391 0.312,-0.709 0.703,-0.711 1.094,-0.713 1.412,-0.398 1.414,-0.008 1.417,0.383 1.102,0.702 0.711,0.704 0.32,0.706 0.002,0.391 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,174.46973,-446.08293)" + clip-path="url(#clipPath536)" + id="path773" /> + <path + d="m 0,0 c -0.018,0 -0.032,-0.014 -0.032,-0.031 0,-0.018 0.013,-0.032 0.031,-0.032 0.018,0 0.032,0.014 0.032,0.031 C 0.031,-0.014 0.017,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,175.45547,-453.678)" + clip-path="url(#clipPath537)" + id="path774" /> + <path + d="M 0,0 C -0.002,-0.217 0.174,-0.394 0.391,-0.395 0.607,-0.396 0.784,-0.221 0.786,-0.004 0.787,0.213 0.612,0.39 0.396,0.391 0.178,0.392 0.001,0.217 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,181.6976,-309.99373)" + clip-path="url(#clipPath538)" + id="path775" /> + <path + d="M 0,0 C -0.004,-0.703 0.563,-1.276 1.267,-1.28 1.97,-1.284 2.543,-0.717 2.547,-0.014 2.551,0.689 1.983,1.262 1.281,1.266 0.577,1.27 0.004,0.704 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,180.5648,-317.55813)" + clip-path="url(#clipPath539)" + id="path776" /> + <path + d="m 0,0 c -0.006,-1.033 0.827,-1.875 1.86,-1.881 1.033,-0.005 1.875,0.827 1.88,1.86 C 3.746,1.013 2.913,1.854 1.881,1.86 0.848,1.866 0.006,1.033 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,179.81093,-325.12067)" + clip-path="url(#clipPath540)" + id="path777" /> + <path + d="m 0,0 c -0.007,-1.233 0.986,-2.238 2.22,-2.245 1.232,-0.006 2.237,0.987 2.244,2.22 C 4.471,1.208 3.477,2.213 2.244,2.22 1.012,2.227 0.007,1.232 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,179.3708,-332.68187)" + clip-path="url(#clipPath541)" + id="path778" /> + <path + d="M 0,0 C -0.008,-1.389 1.112,-2.521 2.501,-2.529 3.89,-2.537 5.021,-1.417 5.029,-0.028 5.037,1.361 3.918,2.494 2.529,2.501 1.14,2.509 0.008,1.389 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,179.0348,-340.24173)" + clip-path="url(#clipPath542)" + id="path779" /> + <path + d="M 0,0 C -0.008,-1.441 1.154,-2.616 2.595,-2.624 4.036,-2.632 5.211,-1.47 5.219,-0.029 5.227,1.412 4.064,2.587 2.624,2.595 1.183,2.603 0.008,1.441 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,179.3252,-415.8232)" + clip-path="url(#clipPath543)" + id="path780" /> + <path + d="M 0,0 C -0.007,-1.267 1.015,-2.3 2.282,-2.307 3.55,-2.314 4.583,-1.292 4.59,-0.025 4.597,1.243 3.575,2.275 2.308,2.282 1.04,2.29 0.007,1.268 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,179.78613,-423.37853)" + clip-path="url(#clipPath544)" + id="path781" /> + <path + d="m 0,0 c -0.007,-1.094 0.875,-1.985 1.97,-1.992 1.093,-0.006 1.985,0.877 1.991,1.97 C 3.967,1.072 3.085,1.964 1.991,1.97 0.897,1.976 0.006,1.094 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,180.24707,-430.93453)" + clip-path="url(#clipPath545)" + id="path782" /> + <path + d="m 0,0 c -0.005,-0.799 0.64,-1.45 1.438,-1.455 0.799,-0.004 1.45,0.64 1.455,1.439 C 2.896,0.783 2.253,1.433 1.454,1.437 0.655,1.442 0.004,0.798 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,181.00093,-438.4892)" + clip-path="url(#clipPath546)" + id="path783" /> + <path + d="M 0,0 C -0.002,-0.338 0.271,-0.614 0.61,-0.616 0.948,-0.618 1.225,-0.345 1.227,-0.007 1.228,0.332 0.955,0.608 0.616,0.61 0.277,0.611 0.002,0.339 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,182.15333,-446.04067)" + clip-path="url(#clipPath547)" + id="path784" /> + <path + d="M 0,0 C 0.008,0 0.016,0.007 0.016,0.016 0.016,0.024 0.009,0.032 0,0.032 -0.009,0.032 -0.016,0.024 -0.016,0.016 -0.016,0.007 -0.009,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,183.01267,-453.5732)" + clip-path="url(#clipPath548)" + id="path785" /> + <path + d="M 0,0 C 0.13,0 0.236,0.104 0.236,0.234 0.237,0.365 0.133,0.471 0.002,0.472 -0.128,0.472 -0.234,0.367 -0.234,0.237 -0.235,0.107 -0.131,0.001 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,189.77827,-309.63507)" + clip-path="url(#clipPath549)" + id="path786" /> + <path + d="M 0,0 C -0.004,-0.607 0.486,-1.103 1.095,-1.106 1.702,-1.109 2.197,-0.62 2.201,-0.012 2.204,0.596 1.714,1.091 1.106,1.095 0.499,1.098 0.003,0.608 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,188.35387,-317.5152)" + clip-path="url(#clipPath550)" + id="path787" /> + <path + d="m 0,0 c -0.006,-0.972 0.778,-1.765 1.751,-1.77 0.972,-0.005 1.765,0.778 1.77,1.75 C 3.526,0.953 2.742,1.746 1.771,1.751 0.798,1.756 0.005,0.973 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,187.51533,-325.0784)" + clip-path="url(#clipPath551)" + id="path788" /> + <path + d="M 0,0 C -0.007,-1.181 0.945,-2.143 2.126,-2.149 3.307,-2.156 4.269,-1.205 4.275,-0.024 4.281,1.157 3.33,2.119 2.149,2.125 0.969,2.132 0.006,1.181 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,187.0544,-332.6396)" + clip-path="url(#clipPath552)" + id="path789" /> + <path + d="M 0,0 C -0.007,-1.337 1.07,-2.427 2.407,-2.434 3.744,-2.441 4.834,-1.363 4.842,-0.027 4.849,1.31 3.771,2.4 2.435,2.407 1.097,2.415 0.008,1.337 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,186.7184,-340.19947)" + clip-path="url(#clipPath553)" + id="path790" /> + <path + d="M 0,0 C -0.007,-1.372 1.099,-2.49 2.471,-2.497 3.842,-2.505 4.96,-1.399 4.967,-0.027 4.975,1.344 3.869,2.462 2.498,2.469 1.126,2.477 0.008,1.371 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,187.0504,-415.7808)" + clip-path="url(#clipPath554)" + id="path791" /> + <path + d="m 0,0 c -0.007,-1.224 0.979,-2.222 2.204,-2.229 1.224,-0.006 2.222,0.98 2.229,2.205 C 4.439,1.2 3.452,2.198 2.229,2.205 1.004,2.211 0.007,1.225 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,187.44893,-423.33613)" + clip-path="url(#clipPath555)" + id="path792" /> + <path + d="M 0,0 C -0.006,-1.032 0.827,-1.875 1.86,-1.88 2.893,-1.886 3.735,-1.053 3.741,-0.021 3.746,1.013 2.914,1.855 1.881,1.861 0.848,1.867 0.006,1.034 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,187.95147,-430.89147)" + clip-path="url(#clipPath556)" + id="path793" /> + <path + d="M 0,0 C -0.004,-0.712 0.57,-1.292 1.282,-1.296 1.994,-1.3 2.574,-0.727 2.578,-0.014 2.582,0.697 2.008,1.278 1.297,1.282 0.585,1.286 0.004,0.711 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,188.76787,-438.44627)" + clip-path="url(#clipPath557)" + id="path794" /> + <path + d="M 0,0 C -0.002,-0.234 0.187,-0.425 0.422,-0.427 0.656,-0.428 0.848,-0.239 0.849,-0.004 0.85,0.23 0.66,0.421 0.427,0.422 0.192,0.423 0.001,0.234 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,189.9632,-445.9976)" + clip-path="url(#clipPath558)" + id="path795" /> + <path + d="m 0,0 c 0.043,0 0.079,0.035 0.079,0.078 0,0.044 -0.035,0.079 -0.078,0.079 -0.044,0 -0.079,-0.034 -0.079,-0.078 C -0.078,0.036 -0.044,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,197.33693,-309.80293)" + clip-path="url(#clipPath559)" + id="path796" /> + <path + d="M 0,0 C -0.002,-0.443 0.354,-0.803 0.798,-0.806 1.24,-0.808 1.602,-0.452 1.604,-0.009 1.606,0.434 1.249,0.795 0.807,0.797 0.364,0.8 0.003,0.443 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,196.3096,-317.4716)" + clip-path="url(#clipPath560)" + id="path797" /> + <path + d="M 0,0 C -0.005,-0.851 0.681,-1.544 1.532,-1.549 2.383,-1.554 3.076,-0.868 3.081,-0.017 3.086,0.833 2.399,1.527 1.549,1.532 0.698,1.536 0.004,0.851 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,195.3668,-325.03547)" + clip-path="url(#clipPath561)" + id="path798" /> + <path + d="M 0,0 C -0.006,-1.103 0.883,-2.001 1.985,-2.007 3.088,-2.013 3.986,-1.125 3.993,-0.022 3.999,1.081 3.109,1.979 2.008,1.985 0.905,1.991 0.007,1.103 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,194.8004,-332.59653)" + clip-path="url(#clipPath562)" + id="path799" /> + <path + d="M 0,0 C -0.007,-1.258 1.008,-2.285 2.268,-2.292 3.525,-2.298 4.552,-1.284 4.559,-0.025 4.565,1.234 3.551,2.26 2.292,2.267 1.033,2.274 0.008,1.259 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,194.46453,-340.15653)" + clip-path="url(#clipPath563)" + id="path800" /> + <path + d="M 0,0 C -0.008,-1.389 1.112,-2.521 2.501,-2.529 3.89,-2.537 5.022,-1.417 5.029,-0.027 5.037,1.361 3.918,2.494 2.529,2.501 1.14,2.509 0.008,1.389 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,194.1924,-347.7164)" + clip-path="url(#clipPath564)" + id="path801" /> + <path + d="M 0,0 C -0.008,-1.424 1.141,-2.584 2.564,-2.592 3.987,-2.6 5.148,-1.453 5.156,-0.028 5.164,1.395 4.017,2.556 2.593,2.563 1.169,2.571 0.008,1.424 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,194.44107,-408.18187)" + clip-path="url(#clipPath565)" + id="path802" /> + <path + d="M 0,0 C -0.007,-1.285 1.028,-2.332 2.313,-2.339 3.599,-2.346 4.646,-1.311 4.652,-0.025 4.659,1.259 3.624,2.306 2.339,2.313 1.054,2.32 0.007,1.285 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,194.81867,-415.73787)" + clip-path="url(#clipPath566)" + id="path803" /> + <path + d="M 0,0 C -0.006,-1.146 0.918,-2.08 2.063,-2.086 3.21,-2.092 4.144,-1.169 4.149,-0.023 4.156,1.123 3.232,2.057 2.087,2.063 0.94,2.07 0.007,1.146 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,195.19493,-423.29387)" + clip-path="url(#clipPath567)" + id="path804" /> + <path + d="m 0,0 c -0.005,-0.92 0.737,-1.67 1.657,-1.675 0.92,-0.005 1.67,0.737 1.675,1.656 C 3.337,0.902 2.596,1.652 1.676,1.657 0.755,1.662 0.005,0.92 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,195.78227,-430.84853)" + clip-path="url(#clipPath568)" + id="path805" /> + <path + d="M 0,0 C -0.003,-0.556 0.444,-1.009 1,-1.012 1.556,-1.015 2.009,-0.567 2.012,-0.011 2.015,0.544 1.567,0.997 1.012,1 0.456,1.003 0.003,0.555 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,196.70413,-438.40253)" + clip-path="url(#clipPath569)" + id="path806" /> + <path + d="M 0,0 C 0.112,0 0.205,0.09 0.205,0.203 0.206,0.316 0.114,0.408 0.002,0.409 -0.111,0.409 -0.202,0.318 -0.203,0.206 -0.204,0.092 -0.113,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,198.0856,-445.68053)" + clip-path="url(#clipPath570)" + id="path807" /> + <path + d="M 0,0 C -0.002,-0.226 0.181,-0.41 0.406,-0.411 0.632,-0.412 0.815,-0.23 0.816,-0.004 0.818,0.221 0.636,0.405 0.41,0.406 0.185,0.408 0.001,0.226 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,204.39293,-317.42733)" + clip-path="url(#clipPath571)" + id="path808" /> + <path + d="M 0,0 C -0.004,-0.66 0.527,-1.198 1.187,-1.201 1.848,-1.205 2.386,-0.673 2.389,-0.013 2.393,0.646 1.86,1.184 1.201,1.188 0.541,1.191 0.003,0.66 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,203.3864,-324.99107)" + clip-path="url(#clipPath572)" + id="path809" /> + <path + d="M 0,0 C -0.005,-0.963 0.771,-1.749 1.735,-1.754 2.699,-1.76 3.484,-0.983 3.49,-0.019 3.495,0.945 2.719,1.73 1.755,1.735 0.791,1.741 0.006,0.964 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,202.69373,-332.55293)" + clip-path="url(#clipPath573)" + id="path810" /> + <path + d="M 0,0 C -0.006,-1.155 0.925,-2.096 2.079,-2.102 3.233,-2.108 4.175,-1.178 4.182,-0.023 4.187,1.132 3.257,2.073 2.103,2.079 0.947,2.085 0.007,1.155 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,202.2744,-340.11347)" + clip-path="url(#clipPath574)" + id="path811" /> + <path + d="M 0,0 C -0.007,-1.276 1.021,-2.316 2.298,-2.323 3.573,-2.331 4.614,-1.301 4.621,-0.025 4.628,1.25 3.599,2.291 2.323,2.298 1.047,2.305 0.007,1.276 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,202.02307,-347.67347)" + clip-path="url(#clipPath575)" + id="path812" /> + <path + d="M 0,0 C -0.008,-1.38 1.104,-2.505 2.485,-2.513 3.865,-2.521 4.99,-1.408 4.998,-0.027 5.006,1.353 3.893,2.478 2.513,2.486 1.132,2.493 0.007,1.38 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,201.81347,-355.23267)" + clip-path="url(#clipPath576)" + id="path813" /> + <path + d="M 0,0 C -0.008,-1.407 1.126,-2.553 2.532,-2.561 3.939,-2.568 5.085,-1.435 5.093,-0.028 5.101,1.378 3.967,2.524 2.561,2.532 1.154,2.54 0.008,1.406 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,201.99973,-400.58227)" + clip-path="url(#clipPath577)" + id="path814" /> + <path + d="M 0,0 C -0.007,-1.302 1.043,-2.364 2.345,-2.371 3.646,-2.378 4.709,-1.329 4.716,-0.026 4.723,1.275 3.673,2.337 2.371,2.344 1.069,2.352 0.007,1.302 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,202.29267,-408.13893)" + clip-path="url(#clipPath578)" + id="path815" /> + <path + d="M 0,0 C -0.007,-1.189 0.951,-2.159 2.142,-2.166 3.33,-2.172 4.3,-1.213 4.307,-0.023 4.312,1.166 3.354,2.135 2.165,2.142 0.976,2.148 0.007,1.189 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,202.60773,-415.69493)" + clip-path="url(#clipPath579)" + id="path816" /> + <path + d="M 0,0 C -0.006,-1.024 0.82,-1.859 1.845,-1.865 2.869,-1.87 3.704,-1.044 3.71,-0.021 3.715,1.004 2.89,1.839 1.865,1.845 0.841,1.851 0.006,1.025 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,203.04653,-423.25027)" + clip-path="url(#clipPath580)" + id="path817" /> + <path + d="M 0,0 C -0.004,-0.747 0.598,-1.355 1.345,-1.359 2.091,-1.363 2.7,-0.761 2.704,-0.015 2.708,0.731 2.106,1.34 1.359,1.345 0.613,1.349 0.005,0.747 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,203.7588,-430.80493)" + clip-path="url(#clipPath581)" + id="path818" /> + <path + d="M 0,0 C -0.002,-0.338 0.271,-0.614 0.609,-0.616 0.948,-0.618 1.224,-0.345 1.226,-0.007 1.228,0.332 0.955,0.608 0.616,0.61 0.277,0.611 0.001,0.339 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,204.78613,-438.3576)" + clip-path="url(#clipPath582)" + id="path819" /> + <path + d="M 0,0 C 0.018,0 0.031,0.014 0.031,0.031 0.032,0.049 0.018,0.063 0.001,0.063 -0.017,0.063 -0.031,0.049 -0.031,0.032 -0.031,0.014 -0.018,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,205.64427,-445.86933)" + clip-path="url(#clipPath583)" + id="path820" /> + <path + d="M 0,0 C 0.043,0 0.079,0.035 0.079,0.078 0.08,0.122 0.044,0.157 0.001,0.157 -0.043,0.158 -0.078,0.123 -0.078,0.079 -0.078,0.036 -0.043,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,212.4944,-317.2776)" + clip-path="url(#clipPath584)" + id="path821" /> + <path + d="M 0,0 C -0.002,-0.391 0.313,-0.709 0.704,-0.711 1.095,-0.713 1.412,-0.398 1.415,-0.008 1.417,0.383 1.102,0.702 0.712,0.704 0.321,0.706 0.002,0.391 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,211.59347,-324.9456)" + clip-path="url(#clipPath585)" + id="path822" /> + <path + d="M 0,0 C -0.004,-0.747 0.598,-1.355 1.345,-1.359 2.092,-1.363 2.7,-0.761 2.704,-0.015 2.708,0.731 2.106,1.34 1.359,1.344 0.612,1.348 0.005,0.747 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,210.77573,-332.50867)" + clip-path="url(#clipPath586)" + id="path823" /> + <path + d="M 0,0 C -0.005,-0.998 0.8,-1.812 1.798,-1.817 2.797,-1.823 3.61,-1.018 3.616,-0.02 3.621,0.979 2.816,1.792 1.818,1.798 0.819,1.803 0.006,0.999 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,210.20933,-340.06987)" + clip-path="url(#clipPath587)" + id="path824" /> + <path + d="M 0,0 C -0.007,-1.146 0.917,-2.08 2.063,-2.086 3.209,-2.092 4.144,-1.169 4.149,-0.022 4.156,1.123 3.231,2.058 2.086,2.063 0.94,2.07 0.006,1.146 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,209.89547,-347.62987)" + clip-path="url(#clipPath588)" + id="path825" /> + <path + d="m 0,0 c -0.007,-1.242 0.993,-2.253 2.235,-2.26 1.242,-0.007 2.253,0.993 2.26,2.235 C 4.502,1.216 3.501,2.228 2.26,2.235 1.019,2.242 0.007,1.241 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,209.70667,-355.18973)" + clip-path="url(#clipPath589)" + id="path826" /> + <path + d="M 0,0 C -0.008,-1.319 1.056,-2.395 2.376,-2.402 3.695,-2.409 4.771,-1.346 4.778,-0.026 4.785,1.293 3.722,2.369 2.402,2.376 1.082,2.383 0.007,1.32 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,209.5596,-362.74827)" + clip-path="url(#clipPath590)" + id="path827" /> + <path + d="M 0,0 C -0.007,-1.363 1.092,-2.474 2.455,-2.481 3.817,-2.489 4.929,-1.39 4.936,-0.027 4.943,1.336 3.845,2.447 2.481,2.455 1.119,2.462 0.008,1.363 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,209.49573,-370.30693)" + clip-path="url(#clipPath591)" + id="path828" /> + <path + d="M 0,0 C -0.008,-1.389 1.112,-2.521 2.501,-2.529 3.89,-2.537 5.022,-1.417 5.03,-0.028 5.038,1.361 3.918,2.494 2.529,2.501 1.14,2.509 0.008,1.389 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,209.47493,-377.86547)" + clip-path="url(#clipPath592)" + id="path829" /> + <path + d="M 0,0 C -0.008,-1.372 1.099,-2.49 2.47,-2.498 3.842,-2.505 4.96,-1.399 4.968,-0.027 4.975,1.344 3.869,2.462 2.497,2.47 1.126,2.478 0.008,1.372 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,209.55827,-385.42347)" + clip-path="url(#clipPath593)" + id="path830" /> + <path + d="M 0,0 C -0.008,-1.328 1.063,-2.411 2.392,-2.418 3.72,-2.425 4.802,-1.354 4.81,-0.026 4.816,1.302 3.746,2.384 2.418,2.392 1.09,2.399 0.007,1.328 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,209.70547,-392.98067)" + clip-path="url(#clipPath594)" + id="path831" /> + <path + d="M 0,0 C -0.007,-1.268 1.015,-2.301 2.282,-2.308 3.55,-2.315 4.583,-1.293 4.59,-0.025 4.598,1.242 3.575,2.275 2.308,2.282 1.04,2.289 0.007,1.267 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,209.89293,-400.53867)" + clip-path="url(#clipPath595)" + id="path832" /> + <path + d="M 0,0 C -0.006,-1.172 0.938,-2.127 2.11,-2.134 3.282,-2.141 4.238,-1.195 4.244,-0.023 4.251,1.148 3.306,2.104 2.134,2.11 0.962,2.117 0.007,1.171 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,210.16507,-408.09533)" + clip-path="url(#clipPath596)" + id="path833" /> + <path + d="M 0,0 C -0.006,-1.042 0.834,-1.891 1.876,-1.896 2.917,-1.902 3.767,-1.062 3.772,-0.021 3.777,1.021 2.938,1.87 1.896,1.876 0.854,1.881 0.005,1.042 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,210.52187,-415.65133)" + clip-path="url(#clipPath597)" + id="path834" /> + <path + d="M 0,0 C -0.005,-0.825 0.66,-1.497 1.485,-1.501 2.31,-1.506 2.982,-0.841 2.986,-0.017 2.991,0.809 2.326,1.481 1.502,1.485 0.677,1.49 0.004,0.825 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,211.08693,-423.206)" + clip-path="url(#clipPath598)" + id="path835" /> + <path + d="M 0,0 C -0.003,-0.486 0.389,-0.882 0.875,-0.884 1.361,-0.887 1.758,-0.496 1.761,-0.01 1.763,0.477 1.371,0.873 0.885,0.876 0.398,0.878 0.003,0.487 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,211.94627,-430.75933)" + clip-path="url(#clipPath599)" + id="path836" /> + <path + d="M 0,0 C 0.096,-0.001 0.174,0.076 0.174,0.171 0.175,0.267 0.098,0.345 0.002,0.345 -0.094,0.346 -0.171,0.269 -0.172,0.173 -0.172,0.078 -0.095,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,213.15987,-438.0816)" + clip-path="url(#clipPath600)" + id="path837" /> + <path + d="m 0,0 c 0.087,0 0.157,0.069 0.158,0.156 0,0.087 -0.069,0.157 -0.156,0.158 -0.087,0 -0.157,-0.069 -0.158,-0.156 C -0.156,0.071 -0.087,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,220.09347,-324.68973)" + clip-path="url(#clipPath601)" + id="path838" /> + <path + d="M 0,0 C -0.002,-0.435 0.348,-0.788 0.782,-0.791 1.216,-0.793 1.57,-0.443 1.572,-0.009 1.575,0.425 1.225,0.779 0.791,0.781 0.356,0.784 0.003,0.434 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,219.08827,-332.4632)" + clip-path="url(#clipPath602)" + id="path839" /> + <path + d="M 0,0 C -0.004,-0.738 0.591,-1.339 1.329,-1.343 2.066,-1.348 2.668,-0.752 2.672,-0.015 2.676,0.723 2.081,1.325 1.344,1.329 0.605,1.333 0.004,0.738 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,218.3968,-340.02493)" + clip-path="url(#clipPath603)" + id="path840" /> + <path + d="M 0,0 C -0.005,-0.946 0.758,-1.717 1.704,-1.723 2.651,-1.728 3.422,-0.965 3.427,-0.019 3.433,0.928 2.67,1.699 1.724,1.704 0.777,1.709 0.006,0.946 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,217.93453,-347.58547)" + clip-path="url(#clipPath604)" + id="path841" /> + <path + d="m 0,0 c -0.006,-1.077 0.862,-1.954 1.938,-1.96 1.078,-0.006 1.955,0.862 1.96,1.939 C 3.904,1.055 3.037,1.933 1.96,1.938 0.884,1.944 0.006,1.077 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,217.6624,-355.14547)" + clip-path="url(#clipPath605)" + id="path842" /> + <path + d="M 0,0 C -0.006,-1.155 0.925,-2.096 2.079,-2.102 3.233,-2.108 4.175,-1.178 4.182,-0.023 4.187,1.131 3.257,2.073 2.103,2.079 0.948,2.085 0.007,1.154 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,217.51533,-362.70467)" + clip-path="url(#clipPath606)" + id="path843" /> + <path + d="M 0,0 C -0.007,-1.207 0.966,-2.19 2.173,-2.197 3.379,-2.203 4.362,-1.231 4.369,-0.024 4.376,1.183 3.403,2.167 2.196,2.173 0.99,2.18 0.007,1.207 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,217.432,-370.2632)" + clip-path="url(#clipPath607)" + id="path844" /> + <path + d="M 0,0 C -0.007,-1.215 0.973,-2.206 2.188,-2.212 3.403,-2.219 4.394,-1.239 4.4,-0.024 4.407,1.191 3.428,2.182 2.212,2.188 0.997,2.195 0.007,1.216 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,217.4528,-377.8212)" + clip-path="url(#clipPath608)" + id="path845" /> + <path + d="M 0,0 C -0.007,-1.207 0.966,-2.19 2.173,-2.197 3.379,-2.203 4.362,-1.23 4.369,-0.024 4.376,1.183 3.403,2.167 2.196,2.173 0.989,2.18 0.007,1.207 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,217.51533,-385.3792)" + clip-path="url(#clipPath609)" + id="path846" /> + <path + d="M 0,0 C -0.007,-1.172 0.938,-2.127 2.11,-2.133 3.282,-2.14 4.237,-1.195 4.244,-0.023 4.25,1.148 3.306,2.104 2.134,2.11 0.962,2.117 0.006,1.172 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,217.64027,-392.93707)" + clip-path="url(#clipPath610)" + id="path847" /> + <path + d="M 0,0 C -0.006,-1.103 0.883,-2.001 1.985,-2.007 3.088,-2.014 3.986,-1.125 3.992,-0.022 3.998,1.081 3.109,1.979 2.007,1.985 0.904,1.991 0.006,1.103 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,217.85,-400.4944)" + clip-path="url(#clipPath611)" + id="path848" /> + <path + d="M 0,0 C -0.006,-0.99 0.792,-1.797 1.782,-1.802 2.771,-1.808 3.578,-1.01 3.584,-0.02 3.589,0.97 2.791,1.777 1.802,1.782 0.812,1.788 0.006,0.99 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,218.16373,-408.05107)" + clip-path="url(#clipPath612)" + id="path849" /> + <path + d="m 0,0 c -0.004,-0.799 0.64,-1.45 1.438,-1.454 0.799,-0.004 1.45,0.639 1.454,1.438 C 2.896,0.783 2.253,1.434 1.454,1.438 0.655,1.442 0.005,0.799 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,218.6664,-415.6064)" + clip-path="url(#clipPath613)" + id="path850" /> + <path + d="m 0,0 c -0.003,-0.512 0.41,-0.929 0.923,-0.932 0.512,-0.003 0.93,0.41 0.932,0.922 C 1.857,0.502 1.444,0.919 0.933,0.922 0.421,0.925 0.003,0.512 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,219.39947,-423.1604)" + clip-path="url(#clipPath614)" + id="path851" /> + <path + d="M 0,0 C 0.165,0 0.299,0.132 0.3,0.297 0.301,0.462 0.168,0.597 0.003,0.597 -0.161,0.598 -0.296,0.466 -0.297,0.3 -0.298,0.136 -0.165,0.001 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,220.67547,-430.31333)" + clip-path="url(#clipPath615)" + id="path852" /> + <path + d="M 0,0 C 0.087,0 0.157,0.069 0.158,0.156 0.158,0.243 0.089,0.314 0.002,0.314 -0.085,0.315 -0.156,0.245 -0.156,0.158 -0.157,0.071 -0.087,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,227.69373,-332.206)" + clip-path="url(#clipPath616)" + id="path853" /> + <path + d="M 0,0 C -0.002,-0.365 0.292,-0.662 0.656,-0.664 1.021,-0.666 1.318,-0.372 1.32,-0.007 1.322,0.357 1.028,0.655 0.663,0.657 0.299,0.659 0.002,0.365 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,226.8564,-339.97813)" + clip-path="url(#clipPath617)" + id="path854" /> + <path + d="M 0,0 C -0.004,-0.625 0.5,-1.135 1.125,-1.138 1.75,-1.142 2.26,-0.638 2.264,-0.013 2.267,0.612 1.763,1.122 1.138,1.125 0.513,1.129 0.003,0.625 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,226.2692,-347.54)" + clip-path="url(#clipPath618)" + id="path855" /> + <path + d="M 0,0 C -0.004,-0.807 0.647,-1.465 1.454,-1.47 2.262,-1.474 2.92,-0.823 2.925,-0.016 2.929,0.791 2.278,1.449 1.471,1.454 0.663,1.458 0.005,0.807 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,225.86947,-355.10053)" + clip-path="url(#clipPath619)" + id="path856" /> + <path + d="M 0,0 C -0.005,-0.929 0.744,-1.686 1.673,-1.691 2.602,-1.696 3.359,-0.948 3.364,-0.019 3.369,0.91 2.62,1.667 1.691,1.672 0.763,1.677 0.005,0.929 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,225.61813,-362.6604)" + clip-path="url(#clipPath620)" + id="path857" /> + <path + d="M 0,0 C -0.006,-0.99 0.792,-1.796 1.781,-1.802 2.771,-1.807 3.578,-1.009 3.583,-0.02 3.589,0.97 2.791,1.776 1.802,1.782 0.812,1.788 0.005,0.989 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,225.514,-370.21893)" + clip-path="url(#clipPath621)" + id="path858" /> + <path + d="M 0,0 C -0.006,-1.016 0.813,-1.843 1.829,-1.849 2.845,-1.854 3.673,-1.036 3.679,-0.02 3.685,0.996 2.865,1.824 1.85,1.829 0.834,1.835 0.006,1.016 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,225.49187,-377.77693)" + clip-path="url(#clipPath622)" + id="path859" /> + <path + d="M 0,0 C -0.005,-0.998 0.8,-1.812 1.798,-1.817 2.797,-1.823 3.61,-1.018 3.616,-0.02 3.621,0.979 2.816,1.792 1.818,1.798 0.819,1.803 0.006,0.999 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,225.5752,-385.33493)" + clip-path="url(#clipPath623)" + id="path860" /> + <path + d="M 0,0 C -0.006,-0.946 0.758,-1.717 1.704,-1.723 2.65,-1.728 3.421,-0.965 3.427,-0.019 3.432,0.928 2.669,1.699 1.723,1.704 0.776,1.709 0.005,0.947 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,225.7432,-392.89213)" + clip-path="url(#clipPath624)" + id="path861" /> + <path + d="M 0,0 C -0.004,-0.842 0.675,-1.529 1.517,-1.533 2.358,-1.538 3.045,-0.859 3.05,-0.017 3.054,0.825 2.375,1.512 1.533,1.516 0.691,1.521 0.005,0.842 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,226.03613,-400.44947)" + clip-path="url(#clipPath625)" + id="path862" /> + <path + d="M 0,0 C -0.004,-0.677 0.542,-1.229 1.22,-1.233 1.896,-1.237 2.448,-0.691 2.452,-0.014 2.455,0.663 1.91,1.215 1.232,1.219 0.556,1.223 0.004,0.677 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,226.47627,-408.00547)" + clip-path="url(#clipPath626)" + id="path863" /> + <path + d="M 0,0 C -0.002,-0.434 0.348,-0.788 0.782,-0.791 1.216,-0.793 1.57,-0.443 1.572,-0.009 1.575,0.425 1.225,0.779 0.791,0.781 0.356,0.784 0.003,0.434 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,227.10387,-415.56013)" + clip-path="url(#clipPath627)" + id="path864" /> + <path + d="M 0,0 C 0.139,0 0.252,0.111 0.253,0.25 0.254,0.389 0.142,0.502 0.003,0.503 -0.137,0.503 -0.249,0.392 -0.25,0.252 -0.251,0.114 -0.139,0.001 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,228.1924,-422.77693)" + clip-path="url(#clipPath628)" + id="path865" /> + <path + d="M 0,0 C 0.026,0 0.047,0.021 0.048,0.046 0.048,0.073 0.026,0.094 0,0.094 -0.025,0.094 -0.047,0.073 -0.047,0.047 -0.047,0.021 -0.026,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,235.294,-339.86933)" + clip-path="url(#clipPath629)" + id="path866" /> + <path + d="M 0,0 C -0.001,-0.191 0.153,-0.347 0.344,-0.348 0.535,-0.349 0.69,-0.195 0.692,-0.004 0.693,0.187 0.539,0.343 0.348,0.344 0.157,0.345 0.001,0.191 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,234.87467,-347.4924)" + clip-path="url(#clipPath630)" + id="path867" /> + <path + d="M 0,0 C -0.002,-0.391 0.312,-0.709 0.703,-0.711 1.094,-0.713 1.412,-0.398 1.415,-0.008 1.417,0.383 1.102,0.702 0.711,0.704 0.32,0.706 0.002,0.391 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,234.43453,-355.05293)" + clip-path="url(#clipPath631)" + id="path868" /> + <path + d="M 0,0 C -0.003,-0.539 0.431,-0.977 0.97,-0.98 1.508,-0.983 1.946,-0.549 1.949,-0.011 1.952,0.527 1.519,0.966 0.98,0.969 0.441,0.972 0.003,0.538 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,234.11947,-362.61347)" + clip-path="url(#clipPath632)" + id="path869" /> + <path + d="M 0,0 C -0.003,-0.625 0.501,-1.134 1.126,-1.138 1.751,-1.141 2.26,-0.637 2.264,-0.012 2.268,0.613 1.763,1.122 1.138,1.125 0.514,1.129 0.004,0.625 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,233.95147,-370.17213)" + clip-path="url(#clipPath633)" + id="path870" /> + <path + d="M 0,0 C -0.004,-0.66 0.528,-1.197 1.187,-1.201 1.848,-1.205 2.386,-0.673 2.39,-0.013 2.393,0.646 1.86,1.185 1.201,1.188 0.541,1.192 0.003,0.66 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,233.90987,-377.73067)" + clip-path="url(#clipPath634)" + id="path871" /> + <path + d="m 0,0 c -0.004,-0.642 0.515,-1.166 1.156,-1.169 0.643,-0.004 1.167,0.514 1.17,1.156 C 2.33,0.63 1.812,1.153 1.17,1.157 0.527,1.16 0.004,0.643 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,233.9932,-385.28867)" + clip-path="url(#clipPath635)" + id="path872" /> + <path + d="M 0,0 C -0.003,-0.564 0.451,-1.024 1.016,-1.027 1.58,-1.03 2.04,-0.575 2.044,-0.011 2.047,0.553 1.592,1.014 1.027,1.017 0.463,1.02 0.003,0.564 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,234.2236,-392.84533)" + clip-path="url(#clipPath636)" + id="path873" /> + <path + d="m 0,0 c -0.002,-0.435 0.348,-0.788 0.782,-0.791 0.434,-0.002 0.787,0.348 0.79,0.782 C 1.574,0.425 1.225,0.779 0.79,0.781 0.356,0.784 0.002,0.434 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,234.57907,-400.40253)" + clip-path="url(#clipPath637)" + id="path874" /> + <path + d="M 0,0 C -0.001,-0.235 0.188,-0.426 0.423,-0.427 0.657,-0.429 0.848,-0.24 0.85,-0.005 0.851,0.229 0.661,0.421 0.427,0.422 0.192,0.423 0.002,0.234 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,235.10253,-407.95787)" + clip-path="url(#clipPath638)" + id="path875" /> + <path + d="M 0,0 C 0.061,0 0.11,0.049 0.11,0.11 0.111,0.17 0.062,0.22 0.002,0.22 -0.06,0.221 -0.109,0.171 -0.109,0.111 -0.109,0.05 -0.061,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,235.70933,-415.36547)" + clip-path="url(#clipPath639)" + id="path876" /> + <path + d="M 0,0 C 0.018,0 0.031,0.014 0.031,0.031 0.031,0.048 0.018,0.063 0,0.063 -0.018,0.063 -0.031,0.049 -0.032,0.032 -0.032,0.014 -0.018,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,242.93587,-354.9644)" + clip-path="url(#clipPath640)" + id="path877" /> + <path + d="m 0,0 c 0.087,0 0.157,0.069 0.158,0.156 0,0.087 -0.069,0.158 -0.156,0.158 -0.087,0 -0.158,-0.069 -0.158,-0.156 C -0.157,0.071 -0.087,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,242.97627,-362.35507)" + clip-path="url(#clipPath641)" + id="path878" /> + <path + d="M 0,0 C 0.14,-0.001 0.252,0.111 0.253,0.25 0.254,0.389 0.142,0.502 0.003,0.503 -0.136,0.503 -0.249,0.392 -0.249,0.253 -0.25,0.114 -0.139,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,243.01667,-369.78733)" + clip-path="url(#clipPath642)" + id="path879" /> + <path + d="M 0,0 C 0.165,-0.001 0.3,0.132 0.301,0.296 0.302,0.461 0.168,0.596 0.003,0.597 -0.162,0.598 -0.296,0.465 -0.297,0.3 -0.298,0.135 -0.165,0.001 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,243.05827,-377.2828)" + clip-path="url(#clipPath643)" + id="path880" /> + <path + d="M 0,0 C 0.147,0 0.268,0.118 0.269,0.266 0.27,0.414 0.15,0.534 0.003,0.534 -0.145,0.535 -0.265,0.417 -0.266,0.269 -0.267,0.121 -0.147,0.001 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,243.1,-384.8824)" + clip-path="url(#clipPath644)" + id="path881" /> + <path + d="m 0,0 c 0.095,0 0.173,0.077 0.174,0.172 0,0.096 -0.077,0.173 -0.172,0.174 -0.096,0 -0.174,-0.077 -0.174,-0.172 C -0.173,0.079 -0.096,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,243.14293,-392.566)" + clip-path="url(#clipPath645)" + id="path882" /> + <path + d="M 0,0 C 0.035,0 0.063,0.027 0.063,0.062 0.063,0.097 0.035,0.125 0.001,0.125 -0.034,0.126 -0.062,0.098 -0.062,0.063 -0.062,0.028 -0.034,0 0,0" + style="fill:#fddf03;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,243.18453,-400.27107)" + clip-path="url(#clipPath646)" + id="path883" /> + </g> + <g + id="g884" + transform="matrix(1.3333333,0,0,1.3333333,-74.566667,-290.86853)"> + <path + id="path885" + d="M 29.449292,-5.609375e-4 V -39.234936 H 26.086011 V -4.9224359 L 9.8321047,-39.234936 H 4.5938234 V -5.609375e-4 H 8.0742922 V -34.852123 L 24.796948,-5.609375e-4 Z M 55.798902,-21.328686 H 42.439527 V -36.129467 H 57.77937 v -3.105469 H 38.595777 V -5.609375e-4 h 3.84375 V -18.223217 H 55.798902 Z M 69.5948,-5.609375e-4 c 14.378906,0 18.867187,-5.5546874625 18.867187,-19.7812500625 0,-13.628906 -4.21875,-19.453125 -18.867187,-19.453125 H 64.040112 V -5.609375e-4 Z M 67.883862,-3.1060297 V -36.129467 h 2.777344 c 11.015625,0 13.851563,5.390625 13.851563,16.300781 0,12.3398438 -3.480469,16.7226563 -14.167969,16.7226563 z M 101.77449,-36.129467 h 4.00781 v -3.105469 H 94.239331 v 3.105469 h 3.796875 V -3.1060297 H 94.239331 V -5.609375e-4 H 105.7823 V -3.1060297 h -4.00781 z m 12.02636,23.625 11.8711,-21.492188 h 0.10547 v 21.492188 z m 15.55079,-26.730469 h -4.00782 l -15.33984,27.363281 v 2.5664066 h 15.77344 v 9.3046874625 h 3.57422 V -9.3052484 h 4.96875 v -3.1992186 h -4.96875 z M 29.449292,-5.609375e-4 V -39.234936 H 26.086011 V -4.9224359 L 9.8321047,-39.234936 H 4.5938234 V -5.609375e-4 H 8.0742922 V -34.852123 L 24.796948,-5.609375e-4 Z M 55.798902,-21.328686 H 42.439527 V -36.129467 H 57.77937 v -3.105469 H 38.595777 V -5.609375e-4 h 3.84375 V -18.223217 H 55.798902 Z M 69.5948,-5.609375e-4 c 14.378906,0 18.867187,-5.5546874625 18.867187,-19.7812500625 0,-13.628906 -4.21875,-19.453125 -18.867187,-19.453125 H 64.040112 V -5.609375e-4 Z M 67.883862,-3.1060297 V -36.129467 h 2.777344 c 11.015625,0 13.851563,5.390625 13.851563,16.300781 0,12.3398438 -3.480469,16.7226563 -14.167969,16.7226563 z M 101.77449,-36.129467 h 4.00781 v -3.105469 H 94.239331 v 3.105469 h 3.796875 V -3.1060297 H 94.239331 V -5.609375e-4 H 105.7823 V -3.1060297 h -4.00781 z m 12.02636,23.625 11.8711,-21.492188 h 0.10547 v 21.492188 z m 15.55079,-26.730469 h -4.00782 l -15.33984,27.363281 v 2.5664066 h 15.77344 v 9.3046874625 h 3.57422 V -9.3052484 h 4.96875 v -3.1992186 h -4.96875 z m 0,0" + style="fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none" /> + <path + id="path886" + d="m 26.730542,48.213306 6.890625,-29.179687 h 0.269531 v 29.179687 h 7.6875 V 8.9789313 H 29.718823 L 23.039136,39.506275 H 22.875073 L 15.925855,8.9789313 H 3.7969484 V 48.213306 H 11.496167 V 19.033619 h 0.210938 l 7.21875,29.179687 z m 32.81836,-33.726562 h 3.785156 V 8.9789313 h -15.65625 v 5.5078127 h 3.738281 v 28.21875 h -3.785156 v 5.507812 h 15.703125 v -5.507812 h -3.785156 z m 23.200195,27.796875 c -4.171875,0 -6.421875,-3.632813 -6.421875,-13.371094 0,-10.628906 2.777344,-14.050781 6.632812,-14.050781 3.257813,0 5.34375,1.921875 5.34375,8.332031 l 8.074219,-0.585937 c 0,-8.871094 -4.335937,-14.320313 -12.890625,-14.320313 -9.621094,0 -15.820312,6.679688 -15.820312,20.789063 0,13.253906 4.96875,19.78125 14.589843,19.78125 8.34375,0 12.996094,-4.007813 13.746094,-13.582032 l -7.910156,-0.527343 c -0.269531,4.863281 -1.816406,7.535156 -5.34375,7.535156 z m 27.257813,-9.890625 h 3.09375 l 7.00781,15.820312 h 8.8711 l -7.91016,-16.992187 c 5.50781,-2.144531 6.67969,-6.796875 6.67969,-11.121094 0,-6.679687 -3.63282,-11.1210937 -12.83203,-11.1210937 H 101.82722 V 48.213306 h 8.17969 z m 0,-6.363281 V 15.55315 h 3.78516 c 3.85546,0 5.67187,1.605469 5.67187,5.085938 0,4.324218 -2.40234,5.390625 -6.67969,5.390625 z m 36.61523,22.828125 c 10.52344,0 15.55078,-7.382813 15.55078,-20.789063 0,-12.667969 -4.4414,-19.78125 -14.7539,-19.78125 -10.10156,0 -15.98438,7.265625 -15.98438,20.472656 0,12.878907 4.60547,20.097657 15.1875,20.097657 z m 0.25782,-6.527344 c -4.91016,0 -6.78516,-4.21875 -6.78516,-13.839844 0,-9.621094 2.56641,-13.464844 7.00781,-13.464844 4.59375,0 6.51563,3.84375 6.51563,13.253907 0,9.996093 -2.02735,14.050781 -6.73828,14.050781 z m 33.31054,5.882812 c 9.03516,0 14.27344,-3.152343 14.27344,-11.167968 0,-5.402344 -2.83594,-8.71875 -8.76562,-9.246094 v -0.164063 c 3.67968,-0.796875 7.42968,-3.585937 7.42968,-8.929687 0,-6.246094 -3.48047,-9.7265627 -12.41015,-9.7265627 H 168.003 V 48.213306 Z m -4.00781,-6.574218 V 31.478931 h 4.32422 c 3.84375,0 5.77734,1.664063 5.77734,4.980469 0,3.949219 -2.29687,5.179688 -6.79687,5.179688 z m 0,-16.511719 v -9.621094 h 3.57422 c 3.58594,0 5.02734,1.335938 5.02734,4.382813 0,4.113281 -2.88281,5.238281 -6.73828,5.238281 z m 34.1543,-10.640625 h 3.78515 V 8.9789313 h -15.65625 v 5.5078127 h 3.73828 v 28.21875 h -3.78515 v 5.507812 h 15.70312 v -5.507812 h -3.78515 z m 23.30566,34.371094 c 10.52344,0 15.55078,-7.382813 15.55078,-20.789063 0,-12.667969 -4.4414,-19.78125 -14.7539,-19.78125 -10.10157,0 -15.98438,7.265625 -15.98438,20.472656 0,12.878907 4.60547,20.097657 15.1875,20.097657 z m 0.25781,-6.527344 c -4.91015,0 -6.78515,-4.21875 -6.78515,-13.839844 0,-9.621094 2.5664,-13.464844 7.00781,-13.464844 4.59375,0 6.51563,3.84375 6.51563,13.253907 0,9.996093 -2.02735,14.050781 -6.73829,14.050781 z m 25.875,5.882812 h 8.23829 V 15.717213 h 9.66796 V 8.9789313 H 250.0489 v 6.7382817 h 9.72656 z M 286.18953,8.9789313 274.4825,48.213306 h 8.22656 l 2.5664,-9.082031 h 12.08204 l 2.67187,9.082031 h 8.4375 L 296.50203,8.9789313 Z m 9.5039,23.6249997 h -8.87109 l 4.33594,-15.761718 h 0.15234 z m 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" /> + </g> + <g + id="g1342" + clip-path="url(#clipPath1343)"> + <path + d="m 0,0 c -0.009,0 -0.016,-0.007 -0.016,-0.016 0,-0.008 0.007,-0.016 0.016,-0.016 0.008,0 0.016,0.008 0.016,0.016 C 0.016,-0.007 0.009,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,129.82253,-333.37067)" + clip-path="url(#clipPath887)" + id="path1115" /> + <path + d="M 0,0 C -0.044,0 -0.079,-0.035 -0.079,-0.079 -0.08,-0.122 -0.044,-0.157 -0.001,-0.157 0.042,-0.158 0.078,-0.123 0.078,-0.08 0.078,-0.036 0.043,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,129.86493,-341.0152)" + clip-path="url(#clipPath888)" + id="path1116" /> + <path + d="m 0,0 c -0.052,0 -0.095,-0.042 -0.095,-0.094 0,-0.052 0.042,-0.094 0.094,-0.095 0.052,0 0.095,0.042 0.095,0.094 C 0.094,-0.042 0.052,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,129.90653,-348.596)" + clip-path="url(#clipPath889)" + id="path1117" /> + <path + d="m 0,0 c -0.044,0 -0.079,-0.035 -0.079,-0.079 -0.001,-0.043 0.035,-0.078 0.078,-0.078 0.043,0 0.079,0.034 0.079,0.078 C 0.078,-0.036 0.043,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,129.94827,-356.1356)" + clip-path="url(#clipPath890)" + id="path1118" /> + <path + d="m 0,0 c -0.017,0 -0.032,-0.014 -0.032,-0.032 0,-0.017 0.014,-0.03 0.032,-0.031 0.017,0 0.031,0.014 0.031,0.031 C 0.031,-0.014 0.017,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,129.9892,-363.63307)" + clip-path="url(#clipPath891)" + id="path1119" /> + <path + d="m 0,0 c -0.069,0 -0.126,-0.056 -0.126,-0.125 -0.001,-0.07 0.055,-0.126 0.125,-0.126 0.069,-0.001 0.126,0.055 0.126,0.125 C 0.125,-0.057 0.069,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,137.3004,-318.35507)" + clip-path="url(#clipPath892)" + id="path1120" /> + <path + d="M 0,0 C 0.001,0.217 -0.174,0.394 -0.391,0.395 -0.608,0.396 -0.785,0.221 -0.787,0.004 -0.788,-0.213 -0.612,-0.39 -0.396,-0.391 -0.178,-0.393 -0.001,-0.217 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,137.8656,-325.74507)" + clip-path="url(#clipPath893)" + id="path1121" /> + <path + d="M 0,0 C 0.002,0.365 -0.292,0.662 -0.657,0.664 -1.021,0.666 -1.319,0.372 -1.321,0.007 -1.323,-0.357 -1.029,-0.655 -0.664,-0.657 -0.299,-0.659 -0.002,-0.365 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,138.26333,-333.30293)" + clip-path="url(#clipPath894)" + id="path1122" /> + <path + d="M 0,0 C 0.002,0.46 -0.369,0.835 -0.829,0.838 -1.289,0.84 -1.664,0.469 -1.667,0.009 -1.669,-0.451 -1.298,-0.826 -0.838,-0.829 -0.377,-0.831 -0.002,-0.46 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,138.53547,-340.86227)" + clip-path="url(#clipPath895)" + id="path1123" /> + <path + d="M 0,0 C 0.002,0.495 -0.396,0.898 -0.892,0.901 -1.386,0.904 -1.79,0.505 -1.792,0.01 -1.795,-0.485 -1.396,-0.889 -0.901,-0.892 -0.406,-0.894 -0.003,-0.495 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,138.66107,-348.42213)" + clip-path="url(#clipPath896)" + id="path1124" /> + <path + d="M 0,0 C 0.003,0.478 -0.382,0.867 -0.86,0.869 -1.337,0.872 -1.727,0.487 -1.729,0.009 -1.732,-0.468 -1.347,-0.857 -0.869,-0.86 -0.392,-0.863 -0.002,-0.478 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,138.66053,-355.98267)" + clip-path="url(#clipPath897)" + id="path1125" /> + <path + d="m 0,0 c 0.002,0.399 -0.32,0.725 -0.719,0.728 -0.4,0.001 -0.725,-0.321 -0.727,-0.72 -0.002,-0.399 0.32,-0.725 0.719,-0.727 C -0.328,-0.722 -0.002,-0.399 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,138.51333,-363.54387)" + clip-path="url(#clipPath898)" + id="path1126" /> + <path + d="M 0,0 C 0.001,0.261 -0.208,0.473 -0.469,0.474 -0.729,0.476 -0.942,0.266 -0.943,0.005 -0.945,-0.255 -0.735,-0.468 -0.474,-0.469 -0.214,-0.471 -0.001,-0.261 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,138.21973,-371.1064)" + clip-path="url(#clipPath899)" + id="path1127" /> + <path + d="m 0,0 c -0.095,0 -0.173,-0.076 -0.174,-0.172 0,-0.096 0.077,-0.174 0.172,-0.174 0.096,-0.001 0.174,0.076 0.174,0.172 C 0.173,-0.078 0.096,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,137.63373,-378.90067)" + clip-path="url(#clipPath900)" + id="path1128" /> + <path + d="m 0,0 c -0.008,0 -0.016,-0.007 -0.016,-0.015 0,-0.009 0.007,-0.016 0.016,-0.016 0.009,0 0.016,0.007 0.016,0.016 C 0.016,-0.007 0.009,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,137.67413,-386.25093)" + clip-path="url(#clipPath901)" + id="path1129" /> + <path + d="M 0,0 C -0.026,0 -0.047,-0.021 -0.047,-0.047 -0.048,-0.073 -0.026,-0.094 0,-0.094 c 0.025,0 0.046,0.021 0.047,0.047 C 0.047,-0.021 0.026,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,144.77707,-303.08747)" + clip-path="url(#clipPath902)" + id="path1130" /> + <path + d="M 0,0 C 0.001,0.217 -0.174,0.394 -0.391,0.395 -0.608,0.396 -0.785,0.222 -0.786,0.004 -0.787,-0.212 -0.612,-0.39 -0.395,-0.391 -0.178,-0.392 -0.001,-0.217 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,145.34213,-310.58227)" + clip-path="url(#clipPath903)" + id="path1131" /> + <path + d="M 0,0 C 0.003,0.478 -0.382,0.867 -0.86,0.869 -1.337,0.872 -1.727,0.487 -1.729,0.009 -1.732,-0.468 -1.347,-0.857 -0.87,-0.86 -0.392,-0.863 -0.002,-0.478 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,146.01267,-318.1396)" + clip-path="url(#clipPath904)" + id="path1132" /> + <path + d="M 0,0 C 0.004,0.677 -0.542,1.229 -1.22,1.233 -1.897,1.237 -2.449,0.691 -2.453,0.014 -2.457,-0.664 -1.911,-1.216 -1.233,-1.22 -0.556,-1.223 -0.004,-0.677 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,146.5368,-325.6968)" + clip-path="url(#clipPath905)" + id="path1133" /> + <path + d="M 0,0 C 0.004,0.808 -0.647,1.466 -1.454,1.47 -2.262,1.475 -2.92,0.824 -2.924,0.016 -2.929,-0.792 -2.278,-1.45 -1.47,-1.454 -0.663,-1.458 -0.004,-0.808 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,146.89293,-333.25547)" + clip-path="url(#clipPath906)" + id="path1134" /> + <path + d="M 0,0 C 0.005,0.886 -0.709,1.608 -1.595,1.613 -2.481,1.618 -3.203,0.903 -3.208,0.018 -3.212,-0.868 -2.499,-1.59 -1.613,-1.595 -0.727,-1.6 -0.005,-0.886 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,147.12333,-340.81467)" + clip-path="url(#clipPath907)" + id="path1135" /> + <path + d="M 0,0 C 0.005,0.912 -0.73,1.655 -1.642,1.66 -2.554,1.666 -3.297,0.93 -3.302,0.019 -3.307,-0.893 -2.572,-1.637 -1.66,-1.642 -0.748,-1.647 -0.005,-0.912 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,147.2276,-348.37453)" + clip-path="url(#clipPath908)" + id="path1136" /> + <path + d="M 0,0 C 0.005,0.895 -0.716,1.624 -1.611,1.628 -2.505,1.634 -3.234,0.912 -3.239,0.018 -3.244,-0.876 -2.523,-1.605 -1.628,-1.61 -0.734,-1.616 -0.005,-0.894 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,147.2276,-355.9352)" + clip-path="url(#clipPath909)" + id="path1137" /> + <path + d="M 0,0 C 0.004,0.833 -0.667,1.513 -1.501,1.518 -2.335,1.522 -3.015,0.85 -3.02,0.017 -3.024,-0.817 -2.352,-1.497 -1.518,-1.501 -0.685,-1.505 -0.005,-0.833 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,147.12267,-363.4964)" + clip-path="url(#clipPath910)" + id="path1138" /> + <path + d="M 0,0 C 0.004,0.721 -0.577,1.308 -1.298,1.312 -2.019,1.316 -2.606,0.735 -2.61,0.014 -2.614,-0.707 -2.033,-1.294 -1.312,-1.298 -0.592,-1.302 -0.004,-0.721 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,146.8916,-371.0588)" + clip-path="url(#clipPath911)" + id="path1139" /> + <path + d="M 0,0 C 0.003,0.538 -0.431,0.977 -0.969,0.98 -1.508,0.983 -1.946,0.549 -1.949,0.011 -1.953,-0.528 -1.519,-0.966 -0.98,-0.97 -0.441,-0.973 -0.003,-0.539 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,146.49253,-378.62133)" + clip-path="url(#clipPath912)" + id="path1140" /> + <path + d="M 0,0 C 0.001,0.287 -0.23,0.52 -0.516,0.521 -0.803,0.523 -1.037,0.292 -1.038,0.006 -1.04,-0.281 -0.809,-0.515 -0.522,-0.516 -0.235,-0.518 -0.002,-0.287 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,145.9268,-386.1852)" + clip-path="url(#clipPath913)" + id="path1141" /> + <path + d="m 0,0 c -0.052,0 -0.095,-0.042 -0.095,-0.094 0,-0.052 0.042,-0.094 0.094,-0.094 0.052,-0.001 0.095,0.041 0.095,0.093 C 0.094,-0.042 0.052,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,145.27707,-393.87453)" + clip-path="url(#clipPath914)" + id="path1142" /> + <path + d="M 0,0 C -0.034,0 -0.062,-0.028 -0.062,-0.062 -0.063,-0.097 -0.035,-0.125 0,-0.126 c 0.034,0 0.062,0.028 0.062,0.063 C 0.063,-0.028 0.035,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,152.2952,-295.5068)" + clip-path="url(#clipPath915)" + id="path1143" /> + <path + d="M 0,0 C 0.001,0.304 -0.244,0.552 -0.548,0.553 -0.852,0.555 -1.1,0.31 -1.102,0.006 -1.103,-0.298 -0.857,-0.546 -0.554,-0.547 -0.25,-0.549 -0.002,-0.304 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,153.07133,-302.97947)" + clip-path="url(#clipPath916)" + id="path1144" /> + <path + d="m 0,0 c 0.004,0.625 -0.501,1.135 -1.126,1.138 -0.625,0.004 -1.135,-0.5 -1.138,-1.126 -0.004,-0.625 0.5,-1.135 1.126,-1.138 C -0.513,-1.129 -0.003,-0.625 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,153.88773,-310.53547)" + clip-path="url(#clipPath917)" + id="path1145" /> + <path + d="M 0,0 C 0.005,0.851 -0.682,1.544 -1.532,1.549 -2.384,1.554 -3.077,0.868 -3.082,0.017 -3.087,-0.834 -2.4,-1.528 -1.55,-1.533 -0.698,-1.537 -0.005,-0.851 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,154.47493,-318.09267)" + clip-path="url(#clipPath918)" + id="path1146" /> + <path + d="M 0,0 C 0.005,0.999 -0.8,1.812 -1.799,1.818 -2.797,1.823 -3.611,1.019 -3.617,0.02 -3.623,-0.979 -2.817,-1.793 -1.818,-1.798 -0.82,-1.804 -0.006,-0.999 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,154.87333,-325.65133)" + clip-path="url(#clipPath919)" + id="path1147" /> + <path + d="M 0,0 C 0.006,1.094 -0.876,1.986 -1.971,1.992 -3.064,1.998 -3.957,1.116 -3.963,0.022 -3.969,-1.072 -3.087,-1.964 -1.992,-1.97 -0.898,-1.976 -0.007,-1.094 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,155.14547,-333.20987)" + clip-path="url(#clipPath920)" + id="path1148" /> + <path + d="M 0,0 C 0.006,1.138 -0.911,2.065 -2.049,2.071 -3.186,2.078 -4.113,1.16 -4.119,0.023 -4.125,-1.115 -3.209,-2.042 -2.071,-2.048 -0.934,-2.055 -0.006,-1.138 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,155.29133,-340.76973)" + clip-path="url(#clipPath921)" + id="path1149" /> + <path + d="M 0,0 C 0.007,1.164 -0.932,2.112 -2.095,2.119 -3.259,2.125 -4.207,1.187 -4.213,0.023 -4.22,-1.14 -3.282,-2.089 -2.118,-2.095 -0.954,-2.102 -0.006,-1.164 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,155.39547,-348.32973)" + clip-path="url(#clipPath922)" + id="path1150" /> + <path + d="M 0,0 C 0.007,1.146 -0.918,2.081 -2.063,2.087 -3.21,2.093 -4.145,1.169 -4.151,0.023 -4.157,-1.124 -3.233,-2.058 -2.087,-2.064 -0.94,-2.07 -0.006,-1.146 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,155.39547,-355.89027)" + clip-path="url(#clipPath923)" + id="path1151" /> + <path + d="M 0,0 C 0.006,1.112 -0.891,2.018 -2.002,2.024 -3.113,2.03 -4.02,1.134 -4.025,0.022 -4.032,-1.089 -3.136,-1.995 -2.024,-2.001 -0.912,-2.007 -0.007,-1.111 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,155.35387,-363.4508)" + clip-path="url(#clipPath924)" + id="path1152" /> + <path + d="M 0,0 C 0.006,1.033 -0.827,1.875 -1.861,1.881 -2.895,1.887 -3.736,1.053 -3.742,0.021 -3.748,-1.014 -2.915,-1.855 -1.882,-1.861 -0.848,-1.867 -0.006,-1.034 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,155.20667,-371.0132)" + clip-path="url(#clipPath925)" + id="path1153" /> + <path + d="M 0,0 C 0.005,0.895 -0.716,1.623 -1.61,1.628 -2.505,1.633 -3.234,0.912 -3.239,0.018 -3.244,-0.877 -2.522,-1.606 -1.628,-1.611 -0.733,-1.616 -0.005,-0.895 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,154.9124,-378.57507)" + clip-path="url(#clipPath926)" + id="path1154" /> + <path + d="M 0,0 C 0.004,0.686 -0.55,1.245 -1.235,1.249 -1.922,1.252 -2.48,0.7 -2.484,0.014 -2.488,-0.673 -1.936,-1.232 -1.249,-1.236 -0.563,-1.239 -0.004,-0.687 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,154.45147,-386.13827)" + clip-path="url(#clipPath927)" + id="path1155" /> + <path + d="M 0,0 C 0.003,0.391 -0.312,0.709 -0.703,0.712 -1.094,0.714 -1.413,0.399 -1.415,0.008 -1.417,-0.383 -1.102,-0.701 -0.711,-0.704 -0.32,-0.706 -0.002,-0.391 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,153.7796,-393.70213)" + clip-path="url(#clipPath928)" + id="path1156" /> + <path + d="m 0,0 c -0.078,0 -0.143,-0.062 -0.143,-0.141 -0.001,-0.078 0.063,-0.142 0.141,-0.142 0.078,-0.001 0.142,0.062 0.143,0.14 C 0.141,-0.064 0.078,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,152.87987,-401.45667)" + clip-path="url(#clipPath929)" + id="path1157" /> + <path + d="m 0,0 c -0.018,0 -0.032,-0.014 -0.032,-0.031 0,-0.018 0.013,-0.032 0.031,-0.032 0.018,0 0.032,0.014 0.032,0.031 C 0.031,-0.014 0.017,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,159.8148,-287.86293)" + clip-path="url(#clipPath930)" + id="path1158" /> + <path + d="M 0,0 C 0.002,0.278 -0.222,0.504 -0.5,0.506 -0.777,0.507 -1.004,0.283 -1.006,0.005 -1.008,-0.272 -0.783,-0.499 -0.506,-0.5 -0.228,-0.502 -0.001,-0.278 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,160.52573,-295.37787)" + clip-path="url(#clipPath931)" + id="path1159" /> + <path + d="M 0,0 C 0.004,0.651 -0.521,1.182 -1.173,1.186 -1.824,1.189 -2.355,0.664 -2.358,0.013 -2.362,-0.639 -1.837,-1.169 -1.186,-1.173 -0.534,-1.177 -0.004,-0.651 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,161.46973,-302.9332)" + clip-path="url(#clipPath932)" + id="path1160" /> + <path + d="M 0,0 C 0.005,0.92 -0.737,1.671 -1.657,1.676 -2.578,1.681 -3.328,0.939 -3.333,0.019 -3.339,-0.902 -2.597,-1.652 -1.676,-1.658 -0.756,-1.663 -0.005,-0.92 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,162.16107,-310.48987)" + clip-path="url(#clipPath933)" + id="path1161" /> + <path + d="M 0,0 C 0.006,1.094 -0.876,1.986 -1.971,1.992 -3.064,1.998 -3.956,1.116 -3.962,0.022 -3.969,-1.072 -3.086,-1.964 -1.992,-1.97 -0.897,-1.976 -0.006,-1.094 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,162.62213,-318.04773)" + clip-path="url(#clipPath934)" + id="path1162" /> + <path + d="M 0,0 C 0.007,1.198 -0.959,2.175 -2.158,2.182 -3.356,2.188 -4.333,1.222 -4.34,0.024 -4.346,-1.175 -3.38,-2.151 -2.182,-2.158 -0.983,-2.165 -0.007,-1.199 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,162.91507,-325.60707)" + clip-path="url(#clipPath935)" + id="path1163" /> + <path + d="M 0,0 C 0.007,1.268 -1.016,2.301 -2.283,2.308 -3.551,2.315 -4.584,1.293 -4.592,0.025 -4.599,-1.243 -3.576,-2.276 -2.309,-2.283 -1.04,-2.29 -0.007,-1.268 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,163.12467,-333.16627)" + clip-path="url(#clipPath936)" + id="path1164" /> + <path + d="m 0,0 c 0.007,1.311 -1.051,2.38 -2.361,2.387 -1.312,0.008 -2.381,-1.05 -2.388,-2.361 -0.007,-1.311 1.05,-2.38 2.361,-2.387 C -1.076,-2.368 -0.008,-1.311 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,163.27187,-340.72613)" + clip-path="url(#clipPath937)" + id="path1165" /> + <path + d="M 0,0 C 0.007,1.329 -1.064,2.411 -2.393,2.418 -3.722,2.426 -4.805,1.355 -4.812,0.026 -4.819,-1.302 -3.748,-2.385 -2.419,-2.393 -1.091,-2.4 -0.008,-1.329 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,163.3552,-348.286)" + clip-path="url(#clipPath938)" + id="path1166" /> + <path + d="M 0,0 C 0.008,1.32 -1.057,2.396 -2.376,2.403 -3.696,2.411 -4.772,1.346 -4.779,0.026 -4.786,-1.293 -3.723,-2.37 -2.402,-2.377 -1.083,-2.384 -0.007,-1.32 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,163.37467,-355.84653)" + clip-path="url(#clipPath939)" + id="path1167" /> + <path + d="M 0,0 C 0.007,1.277 -1.022,2.317 -2.299,2.324 -3.575,2.331 -4.615,1.302 -4.623,0.025 -4.63,-1.251 -3.601,-2.291 -2.324,-2.298 -1.048,-2.305 -0.007,-1.277 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,163.31213,-363.4072)" + clip-path="url(#clipPath940)" + id="path1168" /> + <path + d="M 0,0 C 0.007,1.215 -0.974,2.207 -2.188,2.213 -3.404,2.22 -4.396,1.24 -4.402,0.024 -4.409,-1.192 -3.429,-2.183 -2.213,-2.189 -0.997,-2.196 -0.007,-1.216 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,163.20667,-370.96893)" + clip-path="url(#clipPath941)" + id="path1169" /> + <path + d="m 0,0 c 0.006,1.12 -0.896,2.033 -2.017,2.039 -1.12,0.006 -2.034,-0.896 -2.04,-2.017 -0.005,-1.12 0.898,-2.033 2.018,-2.04 C -0.919,-2.023 -0.006,-1.12 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,163.01787,-378.53013)" + clip-path="url(#clipPath942)" + id="path1170" /> + <path + d="M 0,0 C 0.006,0.972 -0.778,1.765 -1.751,1.771 -2.724,1.776 -3.517,0.992 -3.521,0.02 -3.527,-0.953 -2.743,-1.746 -1.771,-1.751 -0.798,-1.757 -0.005,-0.973 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,162.7028,-386.09267)" + clip-path="url(#clipPath943)" + id="path1171" /> + <path + d="M 0,0 C 0.005,0.729 -0.583,1.324 -1.312,1.328 -2.042,1.333 -2.637,0.744 -2.641,0.014 -2.646,-0.715 -2.057,-1.31 -1.327,-1.313 -0.598,-1.317 -0.004,-0.729 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,162.1572,-393.65587)" + clip-path="url(#clipPath944)" + id="path1172" /> + <path + d="M 0,0 C 0.002,0.373 -0.299,0.678 -0.672,0.68 -1.046,0.682 -1.35,0.381 -1.352,0.007 -1.354,-0.366 -1.053,-0.67 -0.68,-0.672 -0.306,-0.674 -0.002,-0.373 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,161.33947,-401.22093)" + clip-path="url(#clipPath945)" + id="path1173" /> + <path + d="m 0,0 c -0.044,0 -0.079,-0.035 -0.079,-0.078 -0.001,-0.044 0.034,-0.079 0.078,-0.08 0.043,0 0.078,0.035 0.079,0.079 C 0.078,-0.036 0.043,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,160.48147,-408.89147)" + clip-path="url(#clipPath946)" + id="path1174" /> + <path + d="M 0,0 C 0.004,0.573 -0.458,1.04 -1.031,1.043 -1.604,1.046 -2.072,0.584 -2.075,0.011 -2.078,-0.562 -1.616,-1.029 -1.043,-1.032 -0.47,-1.036 -0.003,-0.573 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,168.7992,-295.33227)" + clip-path="url(#clipPath947)" + id="path1175" /> + <path + d="M 0,0 C 0.005,0.903 -0.723,1.639 -1.626,1.644 -2.529,1.649 -3.266,0.921 -3.271,0.018 -3.275,-0.885 -2.547,-1.622 -1.645,-1.626 -0.741,-1.631 -0.005,-0.903 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,169.63773,-302.88827)" + clip-path="url(#clipPath948)" + id="path1176" /> + <path + d="M 0,0 C 0.006,1.103 -0.884,2.002 -1.986,2.008 -3.089,2.014 -3.988,1.125 -3.994,0.022 -4,-1.081 -3.111,-1.98 -2.009,-1.986 -0.905,-1.992 -0.007,-1.103 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,170.1624,-310.4456)" + clip-path="url(#clipPath949)" + id="path1177" /> + <path + d="M 0,0 C 0.007,1.233 -0.987,2.238 -2.221,2.245 -3.454,2.252 -4.459,1.258 -4.466,0.025 -4.473,-1.208 -3.479,-2.213 -2.245,-2.22 -1.012,-2.227 -0.007,-1.233 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,170.51787,-318.00413)" + clip-path="url(#clipPath950)" + id="path1178" /> + <path + d="M 0,0 C 0.008,1.337 -1.07,2.427 -2.408,2.435 -3.745,2.442 -4.835,1.364 -4.843,0.026 -4.85,-1.311 -3.771,-2.401 -2.435,-2.408 -1.098,-2.416 -0.007,-1.337 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,170.81093,-325.56333)" + clip-path="url(#clipPath951)" + id="path1179" /> + <path + d="M 0,0 C 0.008,1.424 -1.141,2.584 -2.564,2.592 -3.988,2.6 -5.149,1.452 -5.157,0.028 -5.165,-1.396 -4.017,-2.557 -2.593,-2.564 -1.169,-2.572 -0.008,-1.424 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,171.06213,-333.12267)" + clip-path="url(#clipPath952)" + id="path1180" /> + <path + d="M 0,0 C 0.008,1.441 -1.154,2.617 -2.596,2.625 -4.037,2.632 -5.212,1.47 -5.22,0.029 -5.228,-1.413 -4.065,-2.588 -2.624,-2.596 -1.183,-2.604 -0.008,-1.441 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,171.27053,-363.36347)" + clip-path="url(#clipPath953)" + id="path1181" /> + <path + d="M 0,0 C 0.008,1.354 -1.085,2.459 -2.439,2.466 -3.794,2.474 -4.898,1.381 -4.905,0.027 -4.913,-1.328 -3.821,-2.432 -2.466,-2.44 -1.111,-2.447 -0.007,-1.355 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,171.10253,-370.92533)" + clip-path="url(#clipPath954)" + id="path1182" /> + <path + d="M 0,0 C 0.007,1.259 -1.008,2.285 -2.268,2.292 -3.526,2.299 -4.553,1.284 -4.56,0.025 -4.566,-1.234 -3.552,-2.261 -2.292,-2.268 -1.033,-2.275 -0.007,-1.26 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,170.91373,-378.4872)" + clip-path="url(#clipPath955)" + id="path1183" /> + <path + d="M 0,0 C 0.006,1.146 -0.918,2.08 -2.064,2.086 -3.211,2.093 -4.145,1.168 -4.151,0.022 -4.157,-1.124 -3.233,-2.058 -2.087,-2.064 -0.941,-2.071 -0.007,-1.146 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,170.68333,-386.04907)" + clip-path="url(#clipPath956)" + id="path1184" /> + <path + d="M 0,0 C 0.005,0.964 -0.772,1.75 -1.736,1.755 -2.7,1.761 -3.485,0.983 -3.491,0.019 -3.496,-0.944 -2.719,-1.73 -1.755,-1.735 -0.791,-1.74 -0.006,-0.963 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,170.2848,-393.61093)" + clip-path="url(#clipPath957)" + id="path1185" /> + <path + d="M 0,0 C 0.004,0.669 -0.535,1.214 -1.204,1.217 -1.872,1.221 -2.418,0.682 -2.421,0.013 -2.425,-0.655 -1.886,-1.2 -1.217,-1.204 -0.549,-1.208 -0.004,-0.668 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,169.61293,-401.17533)" + clip-path="url(#clipPath958)" + id="path1186" /> + <path + d="M 0,0 C 0.002,0.251 -0.201,0.457 -0.453,0.458 -0.705,0.459 -0.91,0.256 -0.911,0.005 -0.913,-0.247 -0.71,-0.452 -0.458,-0.454 -0.206,-0.455 -0.001,-0.252 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,168.64813,-408.74173)" + clip-path="url(#clipPath959)" + id="path1187" /> + <path + d="m 0,0 c -0.017,0 -0.031,-0.014 -0.031,-0.031 0,-0.017 0.013,-0.031 0.031,-0.032 0.018,0 0.031,0.014 0.031,0.032 C 0.031,-0.014 0.018,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,174.89293,-280.21893)" + clip-path="url(#clipPath960)" + id="path1188" /> + <path + d="M 0,0 C 0.003,0.382 -0.306,0.693 -0.687,0.696 -1.069,0.698 -1.381,0.39 -1.383,0.007 -1.386,-0.375 -1.077,-0.686 -0.695,-0.688 -0.313,-0.69 -0.002,-0.382 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,175.8564,-287.73267)" + clip-path="url(#clipPath961)" + id="path1189" /> + <path + d="M 0,0 C 0.005,0.791 -0.633,1.435 -1.423,1.438 -2.213,1.443 -2.857,0.806 -2.861,0.016 -2.866,-0.774 -2.229,-1.418 -1.438,-1.423 -0.648,-1.427 -0.004,-0.79 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,176.88373,-295.28733)" + clip-path="url(#clipPath962)" + id="path1190" /> + <path + d="M 0,0 C 0.006,1.06 -0.848,1.923 -1.907,1.929 -2.967,1.935 -3.83,1.081 -3.836,0.021 -3.842,-1.038 -2.988,-1.902 -1.929,-1.908 -0.869,-1.914 -0.006,-1.059 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,177.5752,-302.844)" + clip-path="url(#clipPath963)" + id="path1191" /> + <path + d="M 0,0 C 0.007,1.225 -0.98,2.223 -2.205,2.229 -3.429,2.236 -4.427,1.249 -4.434,0.024 -4.44,-1.2 -3.453,-2.198 -2.229,-2.205 -1.005,-2.212 -0.007,-1.225 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,178.01533,-310.40253)" + clip-path="url(#clipPath964)" + id="path1192" /> + <path + d="M 0,0 C 0.007,1.354 -1.085,2.459 -2.439,2.466 -3.794,2.474 -4.898,1.381 -4.906,0.027 -4.913,-1.328 -3.821,-2.432 -2.467,-2.439 -1.112,-2.447 -0.008,-1.355 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,178.37213,-317.9612)" + clip-path="url(#clipPath965)" + id="path1193" /> + <path + d="M 0,0 C 0.008,1.38 -1.105,2.506 -2.486,2.514 -3.867,2.521 -4.992,1.408 -5,0.028 -5.008,-1.354 -3.895,-2.479 -2.514,-2.487 -1.133,-2.494 -0.008,-1.381 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,178.76787,-378.4436)" + clip-path="url(#clipPath966)" + id="path1194" /> + <path + d="M 0,0 C 0.008,1.259 -1.008,2.286 -2.267,2.292 -3.526,2.3 -4.553,1.284 -4.56,0.025 -4.566,-1.234 -3.551,-2.26 -2.292,-2.267 -1.033,-2.274 -0.007,-1.259 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,178.51533,-386.00547)" + clip-path="url(#clipPath967)" + id="path1195" /> + <path + d="M 0,0 C 0.006,1.112 -0.891,2.018 -2.002,2.024 -3.113,2.03 -4.02,1.134 -4.025,0.022 -4.031,-1.089 -3.136,-1.996 -2.024,-2.001 -0.912,-2.008 -0.007,-1.111 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,178.20147,-393.56733)" + clip-path="url(#clipPath968)" + id="path1196" /> + <path + d="M 0,0 C 0.005,0.869 -0.695,1.577 -1.563,1.581 -2.432,1.586 -3.14,0.886 -3.145,0.017 -3.149,-0.851 -2.449,-1.559 -1.581,-1.563 -0.713,-1.568 -0.005,-0.868 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,177.65587,-401.13107)" + clip-path="url(#clipPath969)" + id="path1197" /> + <path + d="M 0,0 C 0.002,0.495 -0.396,0.898 -0.892,0.901 -1.387,0.904 -1.79,0.505 -1.793,0.01 -1.796,-0.485 -1.396,-0.889 -0.901,-0.892 -0.407,-0.894 -0.003,-0.495 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,176.79653,-408.6968)" + clip-path="url(#clipPath970)" + id="path1198" /> + <path + d="m 0,0 c -0.069,0 -0.126,-0.056 -0.126,-0.125 -0.001,-0.07 0.056,-0.126 0.125,-0.127 0.069,0 0.126,0.056 0.127,0.126 C 0.126,-0.057 0.07,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,175.64293,-416.4312)" + clip-path="url(#clipPath971)" + id="path1199" /> + <path + d="M 0,0 C 0.003,0.556 -0.445,1.009 -1.001,1.012 -1.557,1.015 -2.01,0.567 -2.013,0.011 -2.016,-0.544 -1.568,-0.998 -1.012,-1 -0.456,-1.003 -0.003,-0.556 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,183.83693,-287.6884)" + clip-path="url(#clipPath972)" + id="path1200" /> + <path + d="M 0,0 C 0.005,0.929 -0.744,1.687 -1.673,1.692 -2.603,1.697 -3.359,0.948 -3.364,0.019 -3.37,-0.911 -2.621,-1.668 -1.691,-1.673 -0.763,-1.678 -0.005,-0.929 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,184.7796,-295.24373)" + clip-path="url(#clipPath973)" + id="path1201" /> + <path + d="M 0,0 C 0.006,1.155 -0.925,2.096 -2.08,2.103 -3.235,2.109 -4.176,1.178 -4.183,0.023 -4.189,-1.132 -3.258,-2.074 -2.103,-2.08 -0.948,-2.086 -0.007,-1.155 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,185.3668,-302.80173)" + clip-path="url(#clipPath974)" + id="path1202" /> + <path + d="m 0,0 c 0.007,1.311 -1.05,2.38 -2.361,2.387 -1.312,0.008 -2.38,-1.05 -2.388,-2.361 -0.007,-1.311 1.05,-2.38 2.361,-2.387 C -1.076,-2.369 -0.008,-1.311 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,185.78613,-310.3596)" + clip-path="url(#clipPath975)" + id="path1203" /> + <path + d="M 0,0 C 0.009,1.467 -1.175,2.664 -2.643,2.671 -4.109,2.68 -5.307,1.497 -5.314,0.029 -5.322,-1.438 -4.139,-2.635 -2.672,-2.643 -1.204,-2.651 -0.008,-1.468 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,186.20413,-317.91827)" + clip-path="url(#clipPath976)" + id="path1204" /> + <path + d="M 0,0 C 0.007,1.346 -1.078,2.443 -2.424,2.45 -3.77,2.458 -4.867,1.373 -4.875,0.027 -4.882,-1.319 -3.797,-2.417 -2.451,-2.424 -1.104,-2.432 -0.008,-1.346 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,186.28613,-385.9632)" + clip-path="url(#clipPath977)" + id="path1205" /> + <path + d="M 0,0 C 0.007,1.199 -0.96,2.176 -2.158,2.182 -3.356,2.189 -4.333,1.223 -4.34,0.024 -4.347,-1.174 -3.38,-2.151 -2.182,-2.158 -0.983,-2.164 -0.007,-1.198 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,185.97107,-393.52427)" + clip-path="url(#clipPath978)" + id="path1206" /> + <path + d="M 0,0 C 0.005,0.999 -0.8,1.813 -1.799,1.818 -2.797,1.824 -3.611,1.019 -3.617,0.02 -3.622,-0.979 -2.817,-1.792 -1.818,-1.798 -0.819,-1.803 -0.006,-0.998 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,185.53093,-401.08747)" + clip-path="url(#clipPath979)" + id="path1207" /> + <path + d="M 0,0 C 0.004,0.669 -0.535,1.213 -1.204,1.217 -1.873,1.221 -2.418,0.682 -2.422,0.013 -2.425,-0.655 -1.886,-1.2 -1.218,-1.204 -0.549,-1.208 -0.004,-0.668 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,184.77573,-408.65253)" + clip-path="url(#clipPath980)" + id="path1208" /> + <path + d="M 0,0 C 0.001,0.191 -0.152,0.346 -0.344,0.347 -0.535,0.349 -0.69,0.194 -0.691,0.003 -0.692,-0.188 -0.538,-0.343 -0.348,-0.344 -0.156,-0.346 -0.001,-0.191 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,183.66373,-416.2196)" + clip-path="url(#clipPath981)" + id="path1209" /> + <path + d="M 0,0 C 0.003,0.677 -0.543,1.229 -1.221,1.233 -1.897,1.237 -2.449,0.691 -2.453,0.014 -2.457,-0.664 -1.911,-1.216 -1.233,-1.22 -0.557,-1.224 -0.004,-0.677 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,191.69107,-287.64547)" + clip-path="url(#clipPath982)" + id="path1210" /> + <path + d="M 0,0 C 0.006,1.016 -0.812,1.844 -1.829,1.85 -2.845,1.855 -3.674,1.036 -3.679,0.02 -3.685,-0.996 -2.865,-1.824 -1.85,-1.83 -0.833,-1.835 -0.005,-1.016 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,192.5492,-295.20147)" + clip-path="url(#clipPath983)" + id="path1211" /> + <path + d="M 0,0 C 0.007,1.216 -0.974,2.207 -2.189,2.213 -3.405,2.22 -4.396,1.24 -4.402,0.024 -4.409,-1.191 -3.43,-2.182 -2.214,-2.189 -0.998,-2.196 -0.007,-1.215 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,193.07387,-302.75867)" + clip-path="url(#clipPath984)" + id="path1212" /> + <path + d="M 0,0 C 0.008,1.372 -1.099,2.49 -2.471,2.498 -3.843,2.505 -4.962,1.399 -4.969,0.027 -4.977,-1.345 -3.87,-2.463 -2.499,-2.471 -1.126,-2.479 -0.008,-1.372 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,193.4932,-310.31733)" + clip-path="url(#clipPath985)" + id="path1213" /> + <path + d="M 0,0 C 0.008,1.416 -1.134,2.569 -2.549,2.577 -3.964,2.584 -5.118,1.443 -5.126,0.028 -5.134,-1.387 -3.992,-2.541 -2.577,-2.549 -1.161,-2.557 -0.008,-1.416 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,194.014,-385.92013)" + clip-path="url(#clipPath986)" + id="path1214" /> + <path + d="M 0,0 C 0.007,1.26 -1.008,2.286 -2.268,2.293 -3.526,2.3 -4.553,1.285 -4.56,0.025 -4.566,-1.234 -3.552,-2.26 -2.293,-2.267 -1.033,-2.274 -0.007,-1.259 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,193.678,-393.482)" + clip-path="url(#clipPath987)" + id="path1215" /> + <path + d="M 0,0 C 0.006,1.077 -0.862,1.955 -1.939,1.961 -3.016,1.967 -3.894,1.099 -3.899,0.021 -3.905,-1.055 -3.037,-1.933 -1.961,-1.938 -0.884,-1.944 -0.006,-1.076 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,193.2796,-401.04453)" + clip-path="url(#clipPath988)" + id="path1216" /> + <path + d="M 0,0 C 0.005,0.772 -0.618,1.403 -1.392,1.407 -2.164,1.412 -2.794,0.788 -2.799,0.016 -2.803,-0.757 -2.18,-1.388 -1.407,-1.392 -0.634,-1.396 -0.004,-0.773 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,192.58693,-408.6096)" + clip-path="url(#clipPath989)" + id="path1217" /> + <path + d="M 0,0 C 0.002,0.312 -0.25,0.568 -0.563,0.569 -0.875,0.571 -1.13,0.319 -1.132,0.006 -1.134,-0.307 -0.882,-0.562 -0.569,-0.563 -0.257,-0.565 -0.002,-0.313 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,191.51787,-416.176)" + clip-path="url(#clipPath990)" + id="path1218" /> + <path + d="M 0,0 C 0.004,0.738 -0.592,1.34 -1.329,1.344 -2.067,1.348 -2.67,0.752 -2.674,0.015 -2.678,-0.724 -2.082,-1.325 -1.344,-1.329 -0.606,-1.333 -0.004,-0.738 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,199.39813,-287.60307)" + clip-path="url(#clipPath991)" + id="path1219" /> + <path + d="M 0,0 C -0.006,-1.06 0.848,-1.923 1.907,-1.929 2.967,-1.935 3.83,-1.081 3.836,-0.021 3.842,1.038 2.988,1.902 1.929,1.908 0.869,1.914 0.006,1.06 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,195.1,-295.18707)" + clip-path="url(#clipPath992)" + id="path1220" /> + <path + d="m 0,0 c -0.007,-1.25 1.002,-2.27 2.253,-2.277 1.25,-0.007 2.269,1.002 2.276,2.252 C 4.536,1.226 3.527,2.245 2.277,2.251 1.026,2.258 0.007,1.25 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,194.67933,-302.75027)" + clip-path="url(#clipPath993)" + id="path1221" /> + <path + d="M 0,0 C 0.008,1.416 -1.133,2.569 -2.548,2.577 -3.964,2.585 -5.117,1.443 -5.125,0.028 -5.133,-1.387 -3.992,-2.541 -2.576,-2.549 -1.161,-2.557 -0.008,-1.416 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,201.1572,-310.27493)" + clip-path="url(#clipPath994)" + id="path1222" /> + <path + d="M 0,0 C 0.007,1.286 -1.029,2.333 -2.314,2.34 -3.6,2.347 -4.647,1.312 -4.654,0.026 -4.661,-1.259 -3.625,-2.307 -2.34,-2.313 -1.055,-2.321 -0.008,-1.285 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,201.30173,-393.43973)" + clip-path="url(#clipPath995)" + id="path1223" /> + <path + d="M 0,0 C 0.006,1.111 -0.891,2.018 -2.002,2.024 -3.113,2.03 -4.02,1.134 -4.025,0.022 -4.031,-1.089 -3.136,-1.996 -2.023,-2.001 -0.912,-2.008 -0.006,-1.111 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,200.92413,-401.0028)" + clip-path="url(#clipPath996)" + id="path1224" /> + <path + d="M 0,0 C 0.004,0.833 -0.668,1.513 -1.501,1.518 -2.336,1.522 -3.015,0.85 -3.02,0.017 -3.024,-0.817 -2.353,-1.497 -1.518,-1.501 -0.685,-1.506 -0.005,-0.833 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,200.2952,-408.56733)" + clip-path="url(#clipPath997)" + id="path1225" /> + <path + d="M 0,0 C 0.002,0.382 -0.306,0.693 -0.687,0.695 -1.07,0.698 -1.382,0.389 -1.384,0.007 -1.386,-0.375 -1.077,-0.686 -0.695,-0.688 -0.313,-0.69 -0.002,-0.382 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,199.24573,-416.13373)" + clip-path="url(#clipPath998)" + id="path1226" /> + <path + d="m 0,0 c -0.009,0 -0.017,-0.007 -0.017,-0.016 0,-0.008 0.008,-0.015 0.017,-0.015 0.008,0 0.016,0.007 0.016,0.015 C 0.016,-0.007 0.009,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,198.3656,-423.7196)" + clip-path="url(#clipPath999)" + id="path1227" /> + <path + d="M 0,0 C -0.004,-0.747 0.599,-1.355 1.346,-1.359 2.092,-1.364 2.701,-0.762 2.705,-0.015 2.709,0.732 2.107,1.341 1.36,1.345 0.613,1.349 0.005,0.747 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,203.37213,-287.58093)" + clip-path="url(#clipPath1000)" + id="path1228" /> + <path + d="m 0,0 c -0.006,-1.06 0.849,-1.923 1.908,-1.929 1.06,-0.006 1.923,0.848 1.929,1.908 C 3.843,1.039 2.988,1.902 1.929,1.908 0.869,1.914 0.006,1.06 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,202.65987,-295.14547)" + clip-path="url(#clipPath1001)" + id="path1229" /> + <path + d="m 0,0 c -0.007,-1.25 1.001,-2.27 2.252,-2.277 1.25,-0.007 2.269,1.002 2.276,2.252 C 4.535,1.226 3.527,2.245 2.276,2.251 1.026,2.258 0.007,1.25 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,202.24053,-302.70853)" + clip-path="url(#clipPath1002)" + id="path1230" /> + <path + d="m 0,0 c -0.008,-1.424 1.14,-2.585 2.564,-2.593 1.424,-0.008 2.585,1.14 2.593,2.565 C 5.165,1.396 4.017,2.557 2.593,2.564 1.168,2.572 0.008,1.424 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,201.86293,-310.27107)" + clip-path="url(#clipPath1003)" + id="path1231" /> + <path + d="m 0,0 c -0.806,-0.218 -1.462,-0.721 -1.881,-1.421 -0.345,0.647 -0.864,1.179 -1.53,1.494 0.821,0.448 1.386,1.251 1.515,2.219 C -1.755,1.202 -1.022,0.328 0,0 M 5.678,-5.756 C 4.891,-5.963 4.25,-6.446 3.832,-7.122 3.52,-6.52 3.041,-6.036 2.448,-5.705 c 0.643,0.395 1.126,0.98 1.363,1.712 0.299,-0.86 0.989,-1.5 1.867,-1.763 m -0.679,-5.699 c -0.487,-0.236 -0.879,-0.6 -1.196,-1.034 -0.259,0.418 -0.585,0.763 -0.986,1.047 0.412,0.306 0.754,0.678 0.998,1.134 0.29,-0.483 0.686,-0.879 1.184,-1.147 m 6.87,-5.795 c -1.047,-0.072 -1.93,-0.684 -2.376,-1.577 -0.279,0.696 -0.808,1.238 -1.451,1.611 0.648,0.375 1.169,0.928 1.441,1.636 0.414,-0.937 1.318,-1.582 2.386,-1.67 m 0.046,-5.717 c -1.125,-0.048 -2.083,-0.734 -2.493,-1.724 -0.256,0.744 -0.771,1.338 -1.44,1.731 0.662,0.365 1.206,0.909 1.497,1.613 0.448,-0.922 1.355,-1.564 2.436,-1.62 m -6.929,-5.722 c -0.545,-0.27 -0.977,-0.699 -1.279,-1.225 -0.244,0.505 -0.619,0.909 -1.067,1.237 0.44,0.291 0.802,0.659 1.08,1.11 0.328,-0.473 0.74,-0.876 1.266,-1.122 m 0.845,-5.688 c -1.119,-0.196 -1.977,-1.023 -2.216,-2.129 -0.166,0.903 -0.694,1.651 -1.463,2.097 0.668,0.331 1.206,0.863 1.538,1.531 0.445,-0.793 1.211,-1.34 2.141,-1.499 m -12.114,-5.705 c -0.825,-0.385 -1.397,-1.151 -1.575,-2.07 -0.159,0.891 -0.682,1.631 -1.445,2.061 0.632,0.288 1.125,0.78 1.481,1.371 0.369,-0.599 0.88,-1.094 1.539,-1.362 m -14.72,0.112 c 0.725,0.25 1.302,0.75 1.692,1.396 0.352,-0.632 0.864,-1.158 1.526,-1.461 -0.827,-0.44 -1.395,-1.243 -1.525,-2.211 -0.132,1.028 -0.766,1.894 -1.693,2.276 m -5.376,5.709 c 0.565,0.244 1.004,0.67 1.354,1.168 0.299,-0.488 0.696,-0.886 1.186,-1.182 -0.511,-0.346 -0.953,-0.786 -1.2,-1.358 -0.282,0.596 -0.754,1.071 -1.34,1.372 m -6.018,5.813 c 0.706,0.225 1.272,0.689 1.66,1.306 0.293,-0.565 0.734,-1.015 1.274,-1.348 -0.548,-0.356 -1.019,-0.821 -1.279,-1.429 -0.337,0.69 -0.924,1.213 -1.655,1.471 m 0.412,5.707 c 0.533,0.244 0.951,0.65 1.278,1.13 0.26,-0.46 0.611,-0.837 1.041,-1.142 -0.437,-0.314 -0.799,-0.7 -1.054,-1.177 -0.31,0.507 -0.729,0.929 -1.265,1.189 m 0.059,5.745 c 0.524,0.251 0.937,0.655 1.25,1.139 0.249,-0.462 0.594,-0.841 1.014,-1.152 -0.421,-0.298 -0.767,-0.664 -1.025,-1.112 -0.317,0.475 -0.721,0.875 -1.239,1.125 m -0.182,5.722 c 0.645,0.265 1.148,0.766 1.475,1.377 0.253,-0.572 0.687,-1.017 1.196,-1.368 -0.509,-0.319 -0.928,-0.741 -1.22,-1.269 -0.352,0.556 -0.833,1.013 -1.451,1.26 m -0.943,5.715 c 1.296,0.077 2.312,1.039 2.513,2.3 0.129,-0.986 0.698,-1.809 1.532,-2.272 -0.708,-0.341 -1.285,-0.906 -1.612,-1.622 -0.469,0.901 -1.363,1.525 -2.433,1.594 m 5.897,5.693 c 1.326,0.178 2.367,1.26 2.383,2.635 -10e-4,-1.137 0.66,-2.098 1.606,-2.588 -0.745,-0.314 -1.331,-0.903 -1.687,-1.627 -0.458,0.859 -1.294,1.45 -2.302,1.58 m 15.053,-0.013 c -0.516,-0.266 -0.93,-0.659 -1.258,-1.133 -0.326,0.478 -0.738,0.878 -1.254,1.146 0.546,0.327 1.009,0.778 1.267,1.366 0.25,-0.589 0.706,-1.043 1.245,-1.379 m 4.418,-11.829 c -0.099,0.112 -0.204,0.207 -0.315,0.307 0.123,0.114 0.211,0.253 0.319,0.383 0.117,-0.139 0.234,-0.267 0.37,-0.387 -0.127,-0.103 -0.261,-0.185 -0.374,-0.303 m -0.095,-17.369 c -0.129,0.167 -0.243,0.336 -0.398,0.479 0.139,0.118 0.272,0.227 0.394,0.363 0.133,-0.147 0.293,-0.253 0.448,-0.377 -0.167,-0.141 -0.305,-0.296 -0.444,-0.465 m -11.445,6.52 c 0.078,-0.088 0.149,-0.174 0.235,-0.255 -0.089,-0.084 -0.148,-0.19 -0.229,-0.284 -0.096,0.109 -0.2,0.2 -0.309,0.296 0.1,0.086 0.212,0.148 0.303,0.243 m 0.041,5.739 c 0.071,-0.081 0.121,-0.174 0.198,-0.249 -0.078,-0.073 -0.137,-0.155 -0.209,-0.234 -0.083,0.087 -0.184,0.148 -0.275,0.227 0.099,0.086 0.197,0.161 0.286,0.256 m 0.024,5.933 c 0.123,-0.157 0.225,-0.321 0.371,-0.457 -0.132,-0.114 -0.251,-0.228 -0.366,-0.358 -0.133,0.145 -0.294,0.248 -0.449,0.372 0.165,0.137 0.306,0.28 0.444,0.443 M -7.754,-23.09 c -0.061,0.07 -0.103,0.152 -0.17,0.217 0.065,0.06 0.121,0.12 0.181,0.184 0.066,-0.069 0.149,-0.113 0.22,-0.177 -0.081,-0.073 -0.157,-0.144 -0.231,-0.224 m 0.248,5.96 c -0.066,-0.059 -0.144,-0.101 -0.207,-0.165 -0.052,0.056 -0.097,0.114 -0.151,0.167 0.059,0.057 0.097,0.13 0.153,0.192 0.065,-0.071 0.135,-0.129 0.205,-0.194 m -12.45,11.548 c 0.332,0.238 0.604,0.523 0.831,0.864 0.204,-0.333 0.442,-0.625 0.742,-0.872 -0.284,-0.204 -0.532,-0.429 -0.75,-0.702 -0.235,0.284 -0.513,0.508 -0.823,0.71 m 0.19,-22.952 c 0.183,0.138 0.368,0.262 0.522,0.431 0.138,-0.161 0.283,-0.3 0.445,-0.437 -0.176,-0.156 -0.307,-0.342 -0.45,-0.53 -0.157,0.199 -0.322,0.374 -0.517,0.536 m 12.842,-5.825 c -0.355,-0.252 -0.646,-0.558 -0.879,-0.927 -0.217,0.368 -0.485,0.682 -0.819,0.946 0.313,0.214 0.585,0.455 0.819,0.752 0.248,-0.31 0.543,-0.557 0.879,-0.771 m 5.416,11.451 c -0.183,-0.143 -0.351,-0.286 -0.504,-0.462 -0.128,0.166 -0.239,0.334 -0.393,0.476 0.146,0.128 0.264,0.272 0.39,0.421 0.15,-0.169 0.328,-0.296 0.507,-0.435 m 0.004,5.744 c -0.171,-0.132 -0.339,-0.252 -0.484,-0.411 -0.12,0.146 -0.232,0.289 -0.372,0.416 0.145,0.132 0.253,0.287 0.377,0.44 0.144,-0.169 0.306,-0.305 0.479,-0.445 m -5.399,11.511 c -0.278,-0.186 -0.533,-0.381 -0.749,-0.633 -0.202,0.248 -0.431,0.45 -0.688,0.64 0.278,0.227 0.498,0.495 0.695,0.796 0.208,-0.311 0.447,-0.576 0.742,-0.803 m -13.629,5.82 c 0.697,0.351 1.215,0.96 1.457,1.714 0.218,-0.737 0.689,-1.335 1.332,-1.73 -0.57,-0.287 -1.024,-0.731 -1.361,-1.269 -0.357,0.549 -0.821,1.021 -1.428,1.285 m -5.564,-5.714 c 0.522,0.282 0.944,0.699 1.229,1.219 0.24,-0.503 0.616,-0.905 1.063,-1.232 -0.435,-0.277 -0.793,-0.628 -1.076,-1.059 -0.321,0.448 -0.718,0.825 -1.216,1.072 m 0.368,-5.738 c 0.325,0.218 0.596,0.476 0.827,0.79 0.194,-0.302 0.406,-0.576 0.678,-0.808 -0.26,-0.204 -0.477,-0.432 -0.677,-0.697 -0.236,0.288 -0.514,0.514 -0.828,0.715 m 0.163,-5.746 c 0.237,0.172 0.452,0.352 0.64,0.576 0.157,-0.212 0.308,-0.417 0.505,-0.591 -0.192,-0.166 -0.346,-0.355 -0.502,-0.555 -0.187,0.224 -0.407,0.398 -0.643,0.57 m -0.06,-5.745 c 0.249,0.173 0.48,0.352 0.678,0.582 0.161,-0.211 0.322,-0.406 0.523,-0.579 -0.211,-0.183 -0.373,-0.397 -0.539,-0.623 -0.192,0.241 -0.413,0.438 -0.662,0.62 m -0.267,-5.734 c 0.348,0.209 0.65,0.458 0.906,0.77 0.212,-0.295 0.451,-0.547 0.738,-0.769 -0.305,-0.248 -0.547,-0.541 -0.757,-0.874 -0.24,0.35 -0.533,0.638 -0.887,0.873 m 5.653,-5.785 c 0.374,0.22 0.695,0.489 0.966,0.825 0.245,-0.327 0.532,-0.594 0.871,-0.826 -0.366,-0.277 -0.662,-0.61 -0.891,-1.01 -0.24,0.408 -0.558,0.743 -0.946,1.011 m 8.083,-5.78 c -0.711,-0.391 -1.218,-1.047 -1.427,-1.851 -0.203,0.814 -0.712,1.483 -1.432,1.876 0.609,0.27 1.081,0.738 1.439,1.293 0.348,-0.562 0.816,-1.035 1.42,-1.318 m 11.289,5.682 c -0.51,-0.288 -0.924,-0.698 -1.202,-1.214 -0.24,0.502 -0.615,0.902 -1.062,1.227 0.433,0.27 0.788,0.614 1.074,1.036 0.317,-0.436 0.705,-0.802 1.19,-1.049 m -0.424,5.739 c -0.289,-0.207 -0.532,-0.446 -0.744,-0.731 -0.183,0.276 -0.374,0.531 -0.623,0.747 0.235,0.185 0.435,0.386 0.621,0.619 0.215,-0.253 0.47,-0.449 0.746,-0.635 m 6.061,5.711 c -0.415,-0.237 -0.754,-0.554 -1.03,-0.942 -0.22,0.367 -0.487,0.685 -0.82,0.952 0.331,0.252 0.601,0.55 0.83,0.898 0.277,-0.372 0.614,-0.677 1.02,-0.908 m 0.003,5.745 c -0.396,-0.224 -0.726,-0.518 -1.001,-0.879 -0.22,0.342 -0.476,0.637 -0.793,0.889 0.323,0.254 0.582,0.558 0.803,0.906 0.268,-0.374 0.595,-0.68 0.991,-0.916 m -6.052,5.778 c -0.248,-0.171 -0.481,-0.343 -0.678,-0.568 -0.164,0.206 -0.335,0.388 -0.537,0.556 0.222,0.192 0.39,0.42 0.561,0.659 0.191,-0.248 0.405,-0.457 0.654,-0.647 m 0.432,5.733 c -0.42,-0.228 -0.77,-0.533 -1.062,-0.907 -0.255,0.365 -0.56,0.666 -0.926,0.918 0.385,0.291 0.703,0.643 0.937,1.071 0.259,-0.446 0.615,-0.808 1.051,-1.082 m -5.418,5.775 c -0.566,-0.26 -1.01,-0.69 -1.359,-1.201 -0.326,0.51 -0.753,0.931 -1.291,1.216 0.586,0.357 1.053,0.869 1.298,1.52 0.25,-0.666 0.738,-1.19 1.352,-1.535 m -6.871,8.302 c -0.008,-1.389 1.057,-2.498 2.41,-2.637 -1.164,-0.09 -2.159,-0.788 -2.606,-1.813 -0.444,1.044 -1.456,1.768 -2.646,1.842 1.385,0.085 2.495,1.202 2.502,2.61 0.008,1.467 -1.175,2.663 -2.642,2.671 -1.468,0.009 -2.664,-1.174 -2.672,-2.642 -0.008,-1.407 1.089,-2.537 2.473,-2.637 -1.315,-0.068 -2.376,-0.95 -2.748,-2.161 -0.37,1.193 -1.438,2.077 -2.753,2.085 -1.619,0.008 -2.937,-1.294 -2.953,-2.911 0,1.505 -1.212,2.729 -2.718,2.737 -1.512,0.008 -2.743,-1.21 -2.751,-2.721 -0.008,-1.381 1.026,-2.482 2.356,-2.675 -1.384,-0.163 -2.454,-1.213 -2.65,-2.59 -0.195,1.321 -1.28,2.355 -2.657,2.363 -1.52,0.008 -2.758,-1.217 -2.767,-2.736 -0.008,-1.46 1.131,-2.632 2.566,-2.732 -1.566,-0.085 -2.824,-1.348 -2.833,-2.938 -0.006,-1.243 0.749,-2.311 1.829,-2.766 -1.021,-0.395 -1.733,-1.313 -1.917,-2.421 -0.228,1.265 -1.28,2.245 -2.611,2.252 -1.502,0.008 -2.726,-1.203 -2.735,-2.705 -0.008,-1.503 1.203,-2.727 2.705,-2.735 1.331,-0.007 2.393,0.962 2.636,2.223 0.159,-1.027 0.774,-1.89 1.675,-2.334 -0.875,-0.412 -1.488,-1.212 -1.709,-2.177 -0.3,1.184 -1.324,2.082 -2.603,2.089 -1.52,0.009 -2.759,-1.216 -2.767,-2.736 -0.008,-1.52 1.217,-2.758 2.737,-2.767 1.279,-0.007 2.311,0.879 2.626,2.061 0.213,-0.98 0.827,-1.798 1.713,-2.215 -0.939,-0.443 -1.585,-1.341 -1.722,-2.414 -0.179,1.314 -1.254,2.347 -2.618,2.354 -1.494,0.008 -2.711,-1.196 -2.72,-2.69 -0.008,-1.493 1.196,-2.711 2.689,-2.719 1.365,-0.008 2.452,1.013 2.644,2.324 0.143,-1.213 0.948,-2.192 2.076,-2.567 -1.153,-0.392 -1.999,-1.451 -2.006,-2.738 -0.009,-1.624 1.3,-2.948 2.924,-2.956 1.156,-0.007 2.137,0.671 2.622,1.638 0.325,-0.782 0.945,-1.407 1.718,-1.753 -0.971,-0.485 -1.656,-1.458 -1.669,-2.616 0,1.478 -1.191,2.681 -2.671,2.689 -1.485,0.008 -2.695,-1.189 -2.703,-2.673 -0.009,-1.486 1.188,-2.695 2.674,-2.704 1.479,-0.008 2.683,1.182 2.7,2.66 -0.001,-1.643 1.323,-2.981 2.968,-2.99 1.189,-0.006 2.2,0.695 2.686,1.697 0.353,-0.837 1.057,-1.466 1.917,-1.774 -1.044,-0.417 -1.787,-1.428 -1.794,-2.621 -0.007,-1.572 1.259,-2.854 2.83,-2.862 1.444,-0.008 2.592,1.076 2.788,2.466 0.178,-1.462 1.371,-2.615 2.883,-2.623 1.387,-0.007 2.504,0.957 2.839,2.241 0.321,-1.296 1.435,-2.28 2.831,-2.288 1.465,-0.008 2.633,1.061 2.896,2.451 0.245,-1.341 1.361,-2.38 2.775,-2.388 1.598,-0.009 2.9,1.28 2.908,2.877 0.007,1.156 -0.677,2.141 -1.654,2.609 0.772,0.304 1.387,0.893 1.75,1.634 0.459,-0.875 1.309,-1.478 2.331,-1.609 -1.322,-0.179 -2.362,-1.261 -2.37,-2.634 -0.008,-1.502 1.203,-2.727 2.706,-2.735 1.502,-0.008 2.727,1.203 2.735,2.705 0.007,1.373 -1.02,2.467 -2.34,2.66 1.337,0.157 2.377,1.14 2.632,2.449 0.26,-1.27 1.327,-2.246 2.674,-2.253 1.545,-0.009 2.805,1.237 2.814,2.783 0.007,1.374 -0.996,2.471 -2.302,2.714 1.385,0.22 2.448,1.323 2.558,2.745 0.104,-1.383 1.221,-2.486 2.632,-2.493 1.485,-0.009 2.696,1.188 2.703,2.673 0.008,1.485 -1.189,2.696 -2.673,2.704 -1.411,0.007 -2.54,-1.083 -2.661,-2.465 -0.073,1.105 -0.714,2.036 -1.652,2.514 0.803,0.365 1.41,1.043 1.708,1.881 0.416,-1.036 1.42,-1.772 2.606,-1.779 1.562,-0.008 2.837,1.252 2.845,2.815 0.008,1.516 -1.185,2.738 -2.683,2.819 1.533,0.064 2.768,1.3 2.777,2.851 0.009,1.523 -1.174,2.745 -2.668,2.865 1.478,0.105 2.659,1.299 2.668,2.805 0.009,1.581 -1.266,2.869 -2.846,2.878 -1.164,0.006 -2.161,-0.689 -2.613,-1.684 -0.293,0.785 -0.873,1.411 -1.616,1.783 0.851,0.446 1.439,1.259 1.603,2.241 0.229,-1.273 1.287,-2.261 2.626,-2.268 1.511,-0.008 2.744,1.21 2.751,2.721 0.009,1.511 -1.21,2.743 -2.72,2.751 -1.34,0.007 -2.409,-0.968 -2.652,-2.239 -0.189,1.221 -1.05,2.177 -2.223,2.499 1.187,0.343 2.075,1.391 2.083,2.69 0.007,1.58 -1.266,2.869 -2.846,2.877 C 5.257,-0.191 4.221,-0.989 3.82,-2.096 3.502,-1.071 2.702,-0.302 1.664,-0.009 2.807,0.344 3.654,1.367 3.661,2.627 3.67,4.181 2.416,5.448 0.862,5.457 -0.562,5.464 -1.698,4.395 -1.893,3.022 -2.072,4.501 -3.278,5.668 -4.807,5.676 -6.088,5.684 -7.168,4.881 -7.605,3.755 c -0.403,1.104 -1.407,1.887 -2.624,1.995 1.355,0.124 2.431,1.222 2.439,2.61 0.008,1.476 -1.182,2.68 -2.657,2.687 -1.477,0.009 -2.681,-1.181 -2.689,-2.657" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,219.6676,-374.68907)" + clip-path="url(#clipPath1004)" + id="path1232" /> + <path + d="M 0,0 C -0.007,-1.293 1.036,-2.348 2.33,-2.355 3.624,-2.362 4.679,-1.319 4.686,-0.026 4.692,1.269 3.649,2.323 2.356,2.33 1.062,2.337 0.008,1.294 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,202.63507,-393.43253)" + clip-path="url(#clipPath1005)" + id="path1233" /> + <path + d="m 0,0 c -0.006,-1.12 0.897,-2.033 2.018,-2.039 1.12,-0.006 2.033,0.897 2.039,2.017 C 4.062,1.098 3.16,2.012 2.04,2.018 0.919,2.024 0.006,1.121 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,203.096,-400.99053)" + clip-path="url(#clipPath1006)" + id="path1234" /> + <path + d="M 0,0 C -0.005,-0.842 0.675,-1.529 1.518,-1.534 2.359,-1.539 3.046,-0.859 3.051,-0.017 3.056,0.825 2.376,1.512 1.534,1.517 0.691,1.521 0.005,0.842 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,203.80827,-408.54773)" + clip-path="url(#clipPath1007)" + id="path1235" /> + <path + d="M 0,0 C -0.002,-0.391 0.312,-0.709 0.703,-0.712 1.094,-0.714 1.412,-0.399 1.414,-0.008 1.417,0.383 1.102,0.701 0.711,0.704 0.32,0.706 0.002,0.391 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,204.94107,-416.1024)" + clip-path="url(#clipPath1008)" + id="path1236" /> + <path + d="m 0,0 c -0.019,0 -0.032,-0.014 -0.032,-0.031 0,-0.018 0.013,-0.032 0.031,-0.032 0.018,0 0.032,0.014 0.032,0.031 C 0.031,-0.014 0.017,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,205.9268,-423.69947)" + clip-path="url(#clipPath1009)" + id="path1237" /> + <path + d="m 0,0 c -0.004,-0.704 0.563,-1.277 1.268,-1.28 0.703,-0.004 1.276,0.563 1.28,1.266 C 2.552,0.689 1.984,1.263 1.281,1.267 0.578,1.271 0.004,0.704 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,211.03747,-287.53867)" + clip-path="url(#clipPath1010)" + id="path1238" /> + <path + d="m 0,0 c -0.006,-1.034 0.827,-1.876 1.86,-1.881 1.034,-0.006 1.876,0.827 1.882,1.86 C 3.747,1.013 2.914,1.855 1.881,1.86 0.848,1.866 0.006,1.033 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,210.28347,-295.10373)" + clip-path="url(#clipPath1011)" + id="path1239" /> + <path + d="M 0,0 C -0.007,-1.233 0.987,-2.238 2.22,-2.245 3.453,-2.251 4.458,-1.257 4.465,-0.024 4.472,1.209 3.478,2.214 2.244,2.221 1.012,2.228 0.007,1.233 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,209.84347,-302.66627)" + clip-path="url(#clipPath1012)" + id="path1240" /> + <path + d="M 0,0 C -0.008,-1.389 1.112,-2.522 2.502,-2.53 3.891,-2.537 5.023,-1.417 5.031,-0.027 5.038,1.362 3.919,2.495 2.529,2.502 1.14,2.51 0.008,1.39 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,209.50747,-310.2288)" + clip-path="url(#clipPath1013)" + id="path1241" /> + <path + d="M 0,0 C -0.008,-1.442 1.154,-2.617 2.596,-2.625 4.037,-2.633 5.212,-1.471 5.22,-0.029 5.228,1.412 4.065,2.587 2.624,2.595 1.183,2.603 0.008,1.441 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,209.79787,-385.8336)" + clip-path="url(#clipPath1014)" + id="path1242" /> + <path + d="M 0,0 C -0.007,-1.268 1.015,-2.301 2.283,-2.308 3.551,-2.315 4.584,-1.293 4.591,-0.025 4.598,1.243 3.576,2.276 2.309,2.283 1.04,2.29 0.007,1.268 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,210.2588,-393.39093)" + clip-path="url(#clipPath1015)" + id="path1243" /> + <path + d="m 0,0 c -0.007,-1.094 0.876,-1.986 1.971,-1.992 1.093,-0.006 1.985,0.876 1.991,1.97 C 3.968,1.073 3.086,1.964 1.992,1.971 0.897,1.977 0.006,1.094 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,210.71973,-400.9488)" + clip-path="url(#clipPath1016)" + id="path1244" /> + <path + d="m 0,0 c -0.004,-0.799 0.64,-1.45 1.439,-1.455 0.799,-0.004 1.45,0.64 1.455,1.439 C 2.897,0.783 2.254,1.434 1.455,1.438 0.655,1.443 0.005,0.799 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,211.4736,-408.50547)" + clip-path="url(#clipPath1017)" + id="path1245" /> + <path + d="m 0,0 c -0.002,-0.338 0.271,-0.614 0.61,-0.616 0.339,-0.002 0.616,0.271 0.617,0.61 C 1.229,0.332 0.956,0.608 0.617,0.61 0.278,0.612 0.002,0.339 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,212.626,-416.05947)" + clip-path="url(#clipPath1018)" + id="path1246" /> + <path + d="M 0,0 C 0.008,0 0.015,0.007 0.015,0.016 0.015,0.024 0.008,0.031 0,0.031 -0.009,0.032 -0.016,0.024 -0.016,0.016 -0.017,0.007 -0.009,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,213.48667,-423.59467)" + clip-path="url(#clipPath1019)" + id="path1247" /> + <path + d="M 0,0 C -0.004,-0.607 0.486,-1.104 1.095,-1.107 1.702,-1.11 2.198,-0.62 2.201,-0.012 2.205,0.596 1.715,1.091 1.106,1.095 0.499,1.098 0.003,0.608 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,218.82907,-287.49573)" + clip-path="url(#clipPath1020)" + id="path1248" /> + <path + d="m 0,0 c -0.006,-0.973 0.778,-1.765 1.751,-1.771 0.973,-0.005 1.766,0.779 1.77,1.752 C 3.527,0.954 2.743,1.746 1.771,1.751 0.798,1.757 0.005,0.973 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,217.99053,-295.0608)" + clip-path="url(#clipPath1021)" + id="path1249" /> + <path + d="m 0,0 c -0.006,-1.181 0.946,-2.144 2.127,-2.15 1.181,-0.006 2.144,0.945 2.15,2.127 C 4.283,1.158 3.331,2.12 2.15,2.126 0.97,2.133 0.007,1.181 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,217.52827,-302.624)" + clip-path="url(#clipPath1022)" + id="path1250" /> + <path + d="M 0,0 C -0.008,-1.337 1.07,-2.427 2.408,-2.435 3.745,-2.442 4.835,-1.364 4.843,-0.026 4.85,1.311 3.771,2.401 2.435,2.408 1.097,2.416 0.007,1.337 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,217.19373,-310.1864)" + clip-path="url(#clipPath1023)" + id="path1251" /> + <path + d="m 0,0 c -0.008,-1.372 1.099,-2.49 2.471,-2.498 1.372,-0.007 2.49,1.099 2.497,2.471 C 4.976,1.344 3.87,2.463 2.498,2.47 1.126,2.478 0.008,1.372 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,217.52573,-385.79067)" + clip-path="url(#clipPath1024)" + id="path1252" /> + <path + d="M 0,0 C -0.007,-1.225 0.98,-2.223 2.206,-2.229 3.43,-2.236 4.428,-1.249 4.435,-0.024 4.441,1.2 3.454,2.198 2.23,2.205 1.005,2.212 0.007,1.225 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,217.9228,-393.34853)" + clip-path="url(#clipPath1025)" + id="path1253" /> + <path + d="m 0,0 c -0.006,-1.033 0.827,-1.875 1.86,-1.881 1.034,-0.006 1.876,0.827 1.882,1.86 C 3.747,1.013 2.914,1.855 1.882,1.861 0.848,1.867 0.006,1.034 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,218.4268,-400.90653)" + clip-path="url(#clipPath1026)" + id="path1254" /> + <path + d="M 0,0 C -0.004,-0.712 0.57,-1.292 1.283,-1.296 1.995,-1.3 2.575,-0.727 2.579,-0.015 2.583,0.697 2.009,1.278 1.297,1.282 0.585,1.286 0.004,0.711 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,219.2432,-408.4632)" + clip-path="url(#clipPath1027)" + id="path1255" /> + <path + d="M 0,0 C -0.001,-0.234 0.187,-0.425 0.423,-0.427 0.656,-0.428 0.848,-0.239 0.85,-0.004 0.851,0.23 0.661,0.421 0.427,0.422 0.192,0.424 0.001,0.235 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,220.43853,-416.01653)" + clip-path="url(#clipPath1028)" + id="path1256" /> + <path + d="M 0,0 C 0.043,0 0.079,0.035 0.079,0.078 0.079,0.122 0.044,0.157 0.001,0.157 -0.043,0.158 -0.078,0.123 -0.078,0.079 -0.078,0.036 -0.043,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,227.8148,-279.7808)" + clip-path="url(#clipPath1029)" + id="path1257" /> + <path + d="M 0,0 C -0.002,-0.443 0.354,-0.804 0.798,-0.806 1.24,-0.809 1.602,-0.452 1.604,-0.009 1.606,0.434 1.249,0.795 0.807,0.797 0.363,0.8 0.003,0.443 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,226.78747,-287.45213)" + clip-path="url(#clipPath1030)" + id="path1258" /> + <path + d="M 0,0 C -0.005,-0.851 0.682,-1.544 1.533,-1.549 2.384,-1.554 3.078,-0.868 3.082,-0.017 3.087,0.834 2.4,1.528 1.55,1.532 0.699,1.537 0.005,0.851 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,225.84347,-295.01787)" + clip-path="url(#clipPath1031)" + id="path1259" /> + <path + d="M 0,0 C -0.006,-1.103 0.883,-2.002 1.985,-2.008 3.088,-2.014 3.987,-1.125 3.993,-0.022 3.999,1.081 3.11,1.98 2.008,1.986 0.904,1.992 0.006,1.103 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,225.27827,-302.5816)" + clip-path="url(#clipPath1032)" + id="path1260" /> + <path + d="M 0,0 C -0.007,-1.259 1.008,-2.286 2.268,-2.292 3.526,-2.299 4.553,-1.284 4.56,-0.025 4.566,1.234 3.552,2.26 2.292,2.267 1.033,2.274 0.007,1.259 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,224.9424,-310.14413)" + clip-path="url(#clipPath1033)" + id="path1261" /> + <path + d="m 0,0 c -0.008,-1.389 1.112,-2.522 2.502,-2.53 1.39,-0.007 2.521,1.113 2.529,2.502 C 5.039,1.362 3.919,2.494 2.53,2.502 1.141,2.509 0.008,1.39 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,224.66893,-317.706)" + clip-path="url(#clipPath1034)" + id="path1262" /> + <path + d="m 0,0 c -0.008,-1.425 1.141,-2.585 2.564,-2.593 1.424,-0.008 2.585,1.14 2.593,2.565 C 5.165,1.396 4.017,2.556 2.593,2.564 1.169,2.572 0.008,1.424 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,224.91893,-378.18973)" + clip-path="url(#clipPath1035)" + id="path1263" /> + <path + d="M 0,0 C -0.007,-1.285 1.029,-2.333 2.314,-2.34 3.6,-2.347 4.647,-1.311 4.654,-0.025 4.661,1.26 3.625,2.307 2.34,2.314 1.055,2.321 0.008,1.285 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,225.2952,-385.7476)" + clip-path="url(#clipPath1036)" + id="path1264" /> + <path + d="M 0,0 C -0.007,-1.146 0.918,-2.08 2.064,-2.086 3.21,-2.093 4.145,-1.169 4.15,-0.023 4.157,1.124 3.233,2.058 2.087,2.064 0.94,2.071 0.006,1.146 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,225.6728,-393.3056)" + clip-path="url(#clipPath1037)" + id="path1265" /> + <path + d="m 0,0 c -0.005,-0.92 0.737,-1.67 1.658,-1.675 0.92,-0.006 1.671,0.737 1.676,1.657 C 3.339,0.902 2.597,1.653 1.677,1.658 0.756,1.663 0.006,0.921 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,226.2588,-400.86293)" + clip-path="url(#clipPath1038)" + id="path1266" /> + <path + d="M 0,0 C -0.004,-0.556 0.444,-1.009 1.001,-1.012 1.557,-1.015 2.009,-0.567 2.012,-0.011 2.016,0.545 1.567,0.998 1.012,1 0.456,1.004 0.003,0.556 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,227.182,-408.4188)" + clip-path="url(#clipPath1039)" + id="path1267" /> + <path + d="m 0,0 c 0.112,0 0.205,0.09 0.206,0.203 0,0.113 -0.091,0.205 -0.204,0.206 -0.112,0 -0.204,-0.091 -0.205,-0.203 C -0.204,0.092 -0.113,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,228.56347,-415.69947)" + clip-path="url(#clipPath1040)" + id="path1268" /> + <path + d="M 0,0 C -0.004,-0.66 0.528,-1.198 1.188,-1.202 1.849,-1.205 2.387,-0.673 2.391,-0.013 2.394,0.647 1.861,1.185 1.202,1.188 0.541,1.192 0.004,0.66 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,233.8656,-294.9736)" + clip-path="url(#clipPath1041)" + id="path1269" /> + <path + d="M 0,0 C -0.006,-0.964 0.771,-1.75 1.735,-1.755 2.699,-1.76 3.484,-0.983 3.49,-0.019 3.495,0.945 2.719,1.73 1.755,1.736 0.791,1.741 0.005,0.964 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,233.17413,-302.538)" + clip-path="url(#clipPath1042)" + id="path1270" /> + <path + d="m 0,0 c -0.006,-1.155 0.925,-2.097 2.08,-2.103 1.155,-0.006 2.097,0.925 2.103,2.08 C 4.189,1.131 3.258,2.073 2.104,2.08 0.948,2.086 0.007,1.155 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,232.7536,-310.1012)" + clip-path="url(#clipPath1043)" + id="path1271" /> + <path + d="M 0,0 C -0.007,-1.276 1.021,-2.317 2.299,-2.324 3.575,-2.331 4.616,-1.302 4.623,-0.025 4.63,1.251 3.601,2.292 2.324,2.298 1.047,2.306 0.007,1.276 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,232.50227,-317.66307)" + clip-path="url(#clipPath1044)" + id="path1272" /> + <path + d="M 0,0 C -0.008,-1.381 1.105,-2.506 2.486,-2.514 3.866,-2.521 4.992,-1.409 5,-0.028 5.008,1.353 3.894,2.479 2.514,2.486 1.133,2.494 0.007,1.38 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,232.29267,-325.2248)" + clip-path="url(#clipPath1045)" + id="path1273" /> + <path + d="M 0,0 C -0.008,-1.408 1.127,-2.554 2.533,-2.562 3.94,-2.569 5.087,-1.436 5.095,-0.028 5.103,1.378 3.969,2.525 2.562,2.533 1.154,2.541 0.008,1.406 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,232.4788,-370.58747)" + clip-path="url(#clipPath1046)" + id="path1274" /> + <path + d="M 0,0 C -0.007,-1.303 1.043,-2.364 2.346,-2.372 3.648,-2.379 4.71,-1.329 4.718,-0.026 4.725,1.276 3.674,2.338 2.372,2.345 1.069,2.353 0.008,1.302 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,232.77187,-378.14613)" + clip-path="url(#clipPath1047)" + id="path1275" /> + <path + d="m 0,0 c -0.007,-1.19 0.952,-2.16 2.142,-2.167 1.19,-0.006 2.16,0.953 2.166,2.143 C 4.314,1.166 3.355,2.135 2.166,2.142 0.976,2.148 0.007,1.189 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,233.08693,-385.70533)" + clip-path="url(#clipPath1048)" + id="path1276" /> + <path + d="M 0,0 C -0.006,-1.025 0.82,-1.86 1.845,-1.865 2.869,-1.871 3.704,-1.045 3.71,-0.021 3.716,1.004 2.89,1.839 1.865,1.845 0.841,1.851 0.005,1.025 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,233.52707,-393.26267)" + clip-path="url(#clipPath1049)" + id="path1277" /> + <path + d="M 0,0 C -0.004,-0.747 0.598,-1.355 1.345,-1.359 2.091,-1.363 2.7,-0.762 2.704,-0.015 2.708,0.732 2.106,1.341 1.359,1.345 0.612,1.349 0.004,0.747 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,234.2392,-400.8192)" + clip-path="url(#clipPath1050)" + id="path1278" /> + <path + d="m 0,0 c -0.002,-0.339 0.271,-0.615 0.61,-0.617 0.339,-0.001 0.615,0.271 0.617,0.61 C 1.229,0.332 0.956,0.608 0.617,0.61 0.278,0.611 0.002,0.339 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,235.26533,-408.37453)" + clip-path="url(#clipPath1051)" + id="path1279" /> + <path + d="m 0,0 c 0.018,0 0.031,0.014 0.031,0.031 0,0.018 -0.013,0.032 -0.03,0.032 -0.018,0 -0.032,-0.014 -0.032,-0.031 C -0.031,0.014 -0.018,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,236.12467,-415.88827)" + clip-path="url(#clipPath1052)" + id="path1280" /> + <path + d="M 0,0 C -0.003,-0.391 0.312,-0.709 0.703,-0.711 1.094,-0.714 1.412,-0.399 1.414,-0.008 1.416,0.383 1.102,0.701 0.711,0.704 0.32,0.706 0.002,0.391 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,242.07653,-294.92867)" + clip-path="url(#clipPath1053)" + id="path1281" /> + <path + d="m 0,0 c -0.004,-0.747 0.599,-1.355 1.345,-1.36 0.747,-0.004 1.356,0.598 1.36,1.345 C 2.709,0.731 2.107,1.34 1.36,1.345 0.613,1.349 0.005,0.747 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,241.25747,-302.49373)" + clip-path="url(#clipPath1054)" + id="path1282" /> + <path + d="m 0,0 c -0.005,-0.999 0.8,-1.812 1.799,-1.818 0.999,-0.006 1.812,0.8 1.818,1.798 C 3.622,0.979 2.817,1.793 1.818,1.798 0.82,1.804 0.006,0.999 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,240.69107,-310.05693)" + clip-path="url(#clipPath1055)" + id="path1283" /> + <path + d="M 0,0 C -0.007,-1.146 0.917,-2.081 2.063,-2.087 3.21,-2.093 4.145,-1.169 4.15,-0.023 4.157,1.124 3.232,2.058 2.087,2.064 0.94,2.07 0.006,1.146 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,240.37733,-317.61933)" + clip-path="url(#clipPath1056)" + id="path1284" /> + <path + d="M 0,0 C -0.007,-1.242 0.994,-2.254 2.235,-2.261 3.478,-2.268 4.489,-1.267 4.496,-0.025 4.503,1.217 3.502,2.229 2.261,2.236 1.019,2.243 0.007,1.242 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,240.18853,-325.1812)" + clip-path="url(#clipPath1057)" + id="path1285" /> + <path + d="M 0,0 C -0.007,-1.32 1.058,-2.396 2.378,-2.403 3.697,-2.41 4.773,-1.346 4.78,-0.026 4.788,1.293 3.724,2.369 2.404,2.376 1.084,2.384 0.008,1.32 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,240.04,-332.7424)" + clip-path="url(#clipPath1058)" + id="path1286" /> + <path + d="M 0,0 C -0.007,-1.364 1.092,-2.475 2.455,-2.482 3.818,-2.49 4.93,-1.391 4.937,-0.027 4.945,1.336 3.846,2.447 2.482,2.455 1.119,2.462 0.008,1.363 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,239.9776,-340.3036)" + clip-path="url(#clipPath1059)" + id="path1287" /> + <path + d="M 0,0 C -0.008,-1.39 1.112,-2.522 2.502,-2.53 3.891,-2.538 5.023,-1.417 5.031,-0.028 5.039,1.361 3.919,2.494 2.529,2.502 1.14,2.509 0.008,1.389 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,239.95667,-347.86413)" + clip-path="url(#clipPath1060)" + id="path1288" /> + <path + d="m 0,0 c -0.008,-1.372 1.099,-2.49 2.471,-2.498 1.372,-0.007 2.49,1.099 2.498,2.471 C 4.977,1.345 3.87,2.463 2.498,2.471 1.126,2.478 0.008,1.372 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,240.04,-355.42413)" + clip-path="url(#clipPath1061)" + id="path1289" /> + <path + d="M 0,0 C -0.008,-1.329 1.063,-2.412 2.392,-2.419 3.721,-2.426 4.804,-1.355 4.811,-0.027 4.818,1.302 3.747,2.385 2.419,2.392 1.09,2.399 0.007,1.329 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,240.1872,-362.984)" + clip-path="url(#clipPath1062)" + id="path1290" /> + <path + d="M 0,0 C -0.007,-1.269 1.016,-2.301 2.283,-2.309 3.551,-2.315 4.585,-1.293 4.592,-0.025 4.599,1.242 3.576,2.275 2.309,2.283 1.041,2.29 0.007,1.268 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,240.37467,-370.54387)" + clip-path="url(#clipPath1063)" + id="path1291" /> + <path + d="M 0,0 C -0.006,-1.172 0.938,-2.128 2.111,-2.135 3.283,-2.141 4.239,-1.196 4.246,-0.023 4.252,1.148 3.307,2.104 2.135,2.11 0.962,2.117 0.007,1.172 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,240.6468,-378.10307)" + clip-path="url(#clipPath1064)" + id="path1292" /> + <path + d="M 0,0 C -0.006,-1.042 0.834,-1.892 1.876,-1.897 2.918,-1.903 3.768,-1.063 3.773,-0.021 3.779,1.021 2.938,1.87 1.897,1.876 0.854,1.882 0.006,1.042 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,241.0036,-385.66173)" + clip-path="url(#clipPath1065)" + id="path1293" /> + <path + d="M 0,0 C -0.005,-0.825 0.661,-1.498 1.485,-1.502 2.311,-1.506 2.983,-0.841 2.987,-0.017 2.992,0.809 2.327,1.481 1.502,1.486 0.678,1.49 0.005,0.825 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,241.56867,-393.2184)" + clip-path="url(#clipPath1066)" + id="path1294" /> + <path + d="M 0,0 C -0.002,-0.486 0.39,-0.882 0.876,-0.885 1.362,-0.887 1.759,-0.496 1.762,-0.009 1.764,0.477 1.372,0.874 0.886,0.876 0.399,0.879 0.003,0.487 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,242.428,-400.77373)" + clip-path="url(#clipPath1067)" + id="path1295" /> + <path + d="m 0,0 c 0.096,0 0.173,0.077 0.174,0.172 0,0.096 -0.076,0.173 -0.172,0.174 -0.096,0 -0.174,-0.076 -0.174,-0.172 C -0.173,0.079 -0.096,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,243.64293,-408.09787)" + clip-path="url(#clipPath1068)" + id="path1296" /> + <path + d="M 0,0 C 0.086,0 0.157,0.069 0.157,0.156 0.158,0.243 0.088,0.314 0.001,0.314 -0.086,0.315 -0.156,0.245 -0.156,0.158 -0.157,0.071 -0.088,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,250.57907,-294.67213)" + clip-path="url(#clipPath1069)" + id="path1297" /> + <path + d="M 0,0 C -0.002,-0.434 0.348,-0.788 0.782,-0.791 1.217,-0.793 1.57,-0.443 1.573,-0.008 1.575,0.426 1.225,0.779 0.791,0.782 0.356,0.784 0.003,0.435 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,249.57253,-302.44747)" + clip-path="url(#clipPath1070)" + id="path1298" /> + <path + d="m 0,0 c -0.004,-0.738 0.591,-1.34 1.329,-1.344 0.738,-0.004 1.34,0.591 1.344,1.329 C 2.677,0.724 2.082,1.325 1.344,1.329 0.605,1.333 0.004,0.738 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,248.8812,-310.012)" + clip-path="url(#clipPath1071)" + id="path1299" /> + <path + d="M 0,0 C -0.005,-0.946 0.758,-1.718 1.705,-1.723 2.651,-1.729 3.423,-0.965 3.428,-0.019 3.434,0.928 2.671,1.699 1.724,1.705 0.777,1.709 0.005,0.946 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,248.41893,-317.57507)" + clip-path="url(#clipPath1072)" + id="path1300" /> + <path + d="m 0,0 c -0.006,-1.077 0.862,-1.955 1.938,-1.961 1.078,-0.006 1.956,0.862 1.961,1.94 C 3.905,1.055 3.037,1.933 1.96,1.938 0.884,1.944 0.006,1.077 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,248.1468,-325.1376)" + clip-path="url(#clipPath1073)" + id="path1301" /> + <path + d="m 0,0 c -0.007,-1.155 0.925,-2.096 2.08,-2.103 1.154,-0.006 2.096,0.925 2.103,2.08 C 4.188,1.132 3.258,2.073 2.103,2.08 0.948,2.086 0.006,1.155 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,247.99973,-332.6988)" + clip-path="url(#clipPath1074)" + id="path1302" /> + <path + d="m 0,0 c -0.006,-1.207 0.967,-2.19 2.174,-2.197 1.207,-0.007 2.19,0.966 2.197,2.173 C 4.378,1.183 3.405,2.167 2.198,2.174 0.991,2.181 0.007,1.208 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,247.91507,-340.25933)" + clip-path="url(#clipPath1075)" + id="path1303" /> + <path + d="M 0,0 C -0.007,-1.215 0.974,-2.207 2.189,-2.213 3.405,-2.22 4.396,-1.24 4.402,-0.024 4.409,1.192 3.429,2.183 2.214,2.189 0.998,2.196 0.007,1.216 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,247.93587,-347.81987)" + clip-path="url(#clipPath1076)" + id="path1304" /> + <path + d="m 0,0 c -0.006,-1.208 0.967,-2.191 2.174,-2.198 1.207,-0.006 2.19,0.967 2.197,2.174 C 4.378,1.183 3.405,2.167 2.198,2.173 0.99,2.18 0.007,1.207 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,247.9984,-355.3804)" + clip-path="url(#clipPath1077)" + id="path1305" /> + <path + d="M 0,0 C -0.006,-1.172 0.939,-2.127 2.111,-2.134 3.284,-2.14 4.239,-1.195 4.246,-0.023 4.252,1.149 3.308,2.105 2.135,2.111 0.963,2.118 0.007,1.173 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,248.12333,-362.93973)" + clip-path="url(#clipPath1078)" + id="path1306" /> + <path + d="M 0,0 C -0.007,-1.103 0.883,-2.002 1.985,-2.008 3.088,-2.015 3.987,-1.125 3.993,-0.022 3.999,1.08 3.11,1.979 2.008,1.985 0.904,1.991 0.006,1.102 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,248.33427,-370.50027)" + clip-path="url(#clipPath1079)" + id="path1307" /> + <path + d="M 0,0 C -0.006,-0.99 0.792,-1.797 1.782,-1.803 2.772,-1.808 3.579,-1.01 3.585,-0.02 3.59,0.97 2.792,1.777 1.802,1.783 0.812,1.788 0.005,0.99 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,248.64813,-378.0588)" + clip-path="url(#clipPath1080)" + id="path1308" /> + <path + d="m 0,0 c -0.004,-0.799 0.64,-1.451 1.438,-1.455 0.799,-0.004 1.451,0.64 1.455,1.439 C 2.897,0.783 2.253,1.434 1.454,1.438 0.655,1.442 0.005,0.799 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,249.15067,-385.6168)" + clip-path="url(#clipPath1081)" + id="path1309" /> + <path + d="m 0,0 c -0.003,-0.512 0.411,-0.929 0.923,-0.932 0.512,-0.003 0.93,0.41 0.932,0.922 C 1.858,0.502 1.445,0.92 0.933,0.923 0.421,0.926 0.003,0.513 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,249.88373,-393.17213)" + clip-path="url(#clipPath1082)" + id="path1310" /> + <path + d="M 0,0 C 0.164,0 0.299,0.132 0.3,0.297 0.301,0.462 0.168,0.597 0.003,0.598 -0.162,0.599 -0.297,0.466 -0.298,0.3 -0.299,0.136 -0.165,0.001 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,251.16107,-400.32773)" + clip-path="url(#clipPath1083)" + id="path1311" /> + <path + d="M 0,0 C 0.087,0 0.158,0.069 0.158,0.156 0.159,0.243 0.089,0.313 0.002,0.314 -0.085,0.314 -0.156,0.245 -0.156,0.158 -0.157,0.071 -0.087,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,258.18067,-302.19093)" + clip-path="url(#clipPath1084)" + id="path1312" /> + <path + d="M 0,0 C -0.003,-0.365 0.292,-0.662 0.656,-0.664 1.021,-0.667 1.318,-0.372 1.32,-0.007 1.322,0.357 1.028,0.655 0.663,0.657 0.299,0.659 0.002,0.364 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,257.34347,-309.96573)" + clip-path="url(#clipPath1085)" + id="path1313" /> + <path + d="M 0,0 C -0.003,-0.625 0.501,-1.135 1.126,-1.139 1.751,-1.142 2.261,-0.638 2.265,-0.013 2.268,0.612 1.764,1.122 1.139,1.125 0.514,1.129 0.004,0.625 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,256.75493,-317.5296)" + clip-path="url(#clipPath1086)" + id="path1314" /> + <path + d="M 0,0 C -0.004,-0.808 0.646,-1.466 1.454,-1.47 2.263,-1.475 2.921,-0.824 2.925,-0.016 2.93,0.792 2.278,1.45 1.471,1.454 0.663,1.458 0.005,0.808 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,256.3564,-325.092)" + clip-path="url(#clipPath1087)" + id="path1315" /> + <path + d="m 0,0 c -0.006,-0.929 0.744,-1.687 1.673,-1.691 0.93,-0.006 1.686,0.743 1.692,1.672 C 3.37,0.911 2.621,1.668 1.691,1.673 0.763,1.678 0.005,0.929 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,256.1052,-332.65387)" + clip-path="url(#clipPath1088)" + id="path1316" /> + <path + d="M 0,0 C -0.005,-0.99 0.793,-1.797 1.783,-1.802 2.772,-1.808 3.58,-1.01 3.585,-0.02 3.591,0.97 2.792,1.777 1.803,1.783 0.812,1.788 0.006,0.99 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,255.99973,-340.21507)" + clip-path="url(#clipPath1089)" + id="path1317" /> + <path + d="m 0,0 c -0.006,-1.016 0.813,-1.844 1.829,-1.85 1.017,-0.005 1.845,0.813 1.85,1.83 C 3.685,0.996 2.866,1.824 1.85,1.83 0.834,1.835 0.005,1.016 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,255.9788,-347.7756)" + clip-path="url(#clipPath1090)" + id="path1318" /> + <path + d="M 0,0 C -0.006,-0.999 0.8,-1.812 1.798,-1.818 2.797,-1.823 3.611,-1.019 3.616,-0.02 3.622,0.979 2.816,1.793 1.818,1.798 0.819,1.804 0.006,0.999 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,256.06213,-355.33547)" + clip-path="url(#clipPath1091)" + id="path1319" /> + <path + d="M 0,0 C -0.005,-0.946 0.758,-1.718 1.705,-1.723 2.651,-1.729 3.423,-0.965 3.428,-0.019 3.434,0.928 2.671,1.699 1.724,1.705 0.777,1.71 0.006,0.947 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,256.2288,-362.89547)" + clip-path="url(#clipPath1092)" + id="path1320" /> + <path + d="M 0,0 C -0.005,-0.842 0.675,-1.529 1.517,-1.534 2.359,-1.539 3.045,-0.859 3.05,-0.017 3.055,0.825 2.376,1.512 1.533,1.517 0.691,1.521 0.005,0.842 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,256.52307,-370.45467)" + clip-path="url(#clipPath1093)" + id="path1321" /> + <path + d="M 0,0 C -0.003,-0.678 0.543,-1.23 1.221,-1.233 1.897,-1.237 2.449,-0.691 2.453,-0.014 2.457,0.663 1.911,1.215 1.233,1.219 0.557,1.223 0.004,0.677 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,256.96187,-378.0132)" + clip-path="url(#clipPath1094)" + id="path1322" /> + <path + d="M 0,0 C -0.002,-0.434 0.348,-0.788 0.782,-0.791 1.217,-0.793 1.57,-0.443 1.573,-0.009 1.575,0.425 1.226,0.779 0.791,0.782 0.356,0.784 0.003,0.434 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,257.5908,-385.56987)" + clip-path="url(#clipPath1095)" + id="path1323" /> + <path + d="M 0,0 C 0.139,-0.001 0.252,0.111 0.253,0.25 0.254,0.389 0.142,0.502 0.003,0.502 -0.136,0.503 -0.249,0.392 -0.25,0.252 -0.251,0.114 -0.139,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,258.67933,-392.78933)" + clip-path="url(#clipPath1096)" + id="path1324" /> + <path + d="M 0,0 C 0.025,0 0.047,0.021 0.047,0.047 0.048,0.073 0.026,0.094 0,0.094 -0.025,0.094 -0.047,0.073 -0.047,0.047 -0.048,0.021 -0.026,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,265.78347,-309.8564)" + clip-path="url(#clipPath1097)" + id="path1325" /> + <path + d="M 0,0 C -0.001,-0.191 0.153,-0.347 0.344,-0.348 0.535,-0.349 0.69,-0.195 0.691,-0.004 0.693,0.187 0.538,0.343 0.348,0.344 0.156,0.345 0.001,0.191 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,265.36427,-317.482)" + clip-path="url(#clipPath1098)" + id="path1326" /> + <path + d="M 0,0 C -0.002,-0.391 0.313,-0.709 0.704,-0.712 1.095,-0.714 1.413,-0.399 1.416,-0.008 1.418,0.383 1.103,0.701 0.712,0.704 0.321,0.706 0.003,0.391 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,264.9228,-325.0452)" + clip-path="url(#clipPath1099)" + id="path1327" /> + <path + d="m 0,0 c -0.003,-0.538 0.431,-0.977 0.969,-0.98 0.539,-0.003 0.977,0.431 0.98,0.969 C 1.952,0.528 1.519,0.967 0.979,0.97 0.441,0.973 0.003,0.539 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,264.60907,-332.60707)" + clip-path="url(#clipPath1100)" + id="path1328" /> + <path + d="M 0,0 C -0.004,-0.625 0.5,-1.135 1.126,-1.139 1.751,-1.142 2.261,-0.638 2.264,-0.013 2.268,0.612 1.763,1.122 1.138,1.125 0.513,1.129 0.003,0.625 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,264.44107,-340.1688)" + clip-path="url(#clipPath1101)" + id="path1329" /> + <path + d="M 0,0 C -0.004,-0.66 0.528,-1.198 1.188,-1.201 1.849,-1.205 2.387,-0.673 2.391,-0.013 2.394,0.646 1.861,1.185 1.202,1.188 0.542,1.192 0.004,0.66 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,264.39813,-347.72947)" + clip-path="url(#clipPath1102)" + id="path1330" /> + <path + d="m 0,0 c -0.003,-0.642 0.516,-1.167 1.157,-1.17 0.644,-0.003 1.167,0.515 1.17,1.157 C 2.331,0.63 1.813,1.154 1.17,1.157 0.528,1.161 0.004,0.643 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,264.48147,-355.28933)" + clip-path="url(#clipPath1103)" + id="path1331" /> + <path + d="M 0,0 C -0.004,-0.564 0.451,-1.024 1.016,-1.027 1.58,-1.03 2.041,-0.576 2.044,-0.011 2.047,0.553 1.592,1.014 1.027,1.017 0.463,1.02 0.003,0.564 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,264.7132,-362.84853)" + clip-path="url(#clipPath1104)" + id="path1332" /> + <path + d="M 0,0 C -0.003,-0.435 0.348,-0.788 0.781,-0.791 1.216,-0.793 1.569,-0.443 1.572,-0.009 1.574,0.425 1.225,0.779 0.79,0.782 0.356,0.784 0.002,0.434 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,265.06867,-370.40773)" + clip-path="url(#clipPath1105)" + id="path1333" /> + <path + d="M 0,0 C -0.001,-0.235 0.187,-0.426 0.422,-0.428 0.657,-0.429 0.848,-0.24 0.85,-0.005 0.851,0.229 0.661,0.42 0.427,0.422 0.192,0.423 0.002,0.234 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,265.59213,-377.96573)" + clip-path="url(#clipPath1106)" + id="path1334" /> + <path + d="M 0,0 C 0.061,0 0.11,0.049 0.11,0.109 0.111,0.17 0.062,0.22 0.001,0.22 -0.06,0.22 -0.109,0.171 -0.109,0.111 -0.109,0.05 -0.061,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,266.19893,-385.37587)" + clip-path="url(#clipPath1107)" + id="path1335" /> + <path + d="M 0,0 C 0.018,0 0.031,0.014 0.032,0.031 0.032,0.049 0.018,0.063 0,0.063 -0.017,0.063 -0.031,0.049 -0.031,0.032 -0.031,0.014 -0.017,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,273.4268,-324.956)" + clip-path="url(#clipPath1108)" + id="path1336" /> + <path + d="m 0,0 c 0.088,0 0.158,0.069 0.159,0.157 0,0.086 -0.07,0.157 -0.157,0.157 C -0.085,0.315 -0.155,0.245 -0.156,0.158 -0.156,0.071 -0.086,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,273.46707,-332.34853)" + clip-path="url(#clipPath1109)" + id="path1337" /> + <path + d="M 0,0 C 0.139,0 0.252,0.111 0.253,0.25 0.254,0.39 0.142,0.503 0.003,0.503 -0.137,0.504 -0.249,0.392 -0.25,0.253 -0.251,0.114 -0.14,0.001 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,273.5088,-339.7828)" + clip-path="url(#clipPath1110)" + id="path1338" /> + <path + d="M 0,0 C 0.164,-0.001 0.299,0.132 0.3,0.297 0.301,0.462 0.168,0.597 0.003,0.598 -0.162,0.598 -0.297,0.465 -0.298,0.3 -0.299,0.135 -0.165,0.001 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,273.5504,-347.2808)" + clip-path="url(#clipPath1111)" + id="path1339" /> + <path + d="M 0,0 C 0.147,0 0.268,0.118 0.269,0.266 0.27,0.414 0.15,0.534 0.003,0.535 -0.145,0.535 -0.266,0.417 -0.267,0.269 -0.267,0.121 -0.147,0.001 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,273.59213,-354.88307)" + clip-path="url(#clipPath1112)" + id="path1340" /> + <path + d="M 0,0 C 0.096,0 0.174,0.076 0.174,0.172 0.175,0.267 0.098,0.345 0.002,0.346 -0.094,0.346 -0.171,0.269 -0.172,0.174 -0.172,0.078 -0.096,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,273.63373,-362.5692)" + clip-path="url(#clipPath1113)" + id="path1341" /> + <path + d="M 0,0 C 0.034,0 0.063,0.027 0.063,0.062 0.063,0.097 0.035,0.125 0.001,0.125 -0.034,0.126 -0.062,0.098 -0.062,0.063 -0.062,0.028 -0.035,0 0,0" + style="fill:#fab20b;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.3333333,0,0,-1.3333333,273.6768,-370.27627)" + clip-path="url(#clipPath1114)" + id="path1342" /> + </g> + </g> +</svg> diff --git a/src/assets/images/unibi.svg b/src/assets/images/unibi.svg new file mode 100644 index 0000000000000000000000000000000000000000..32f3e75a0f670d89b0464542074e5609c490a0f6 --- /dev/null +++ b/src/assets/images/unibi.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 713.24 170.14"><title>Element 4</title><path d="M262.07,72.19c0,7.85-4.85,13.13-12.08,13.13S237.82,80,237.82,72.19V36.51H227.33V72.8a22.5,22.5,0,0,0,5.84,15.58C237.27,92.73,243.09,95,250,95c15.6,0,22.58-11.16,22.58-22.23V36.51h-10.5Z" fill="#1d1d1b"/><polygon points="327.15 94.95 329.56 94.95 329.56 36.51 319.16 36.51 319.16 71.65 287.39 35.51 287.27 35.37 284.85 35.37 284.85 93.9 295.43 93.9 295.43 58.93 327.03 94.81 327.15 94.95" fill="#1d1d1b"/><rect x="342.48" y="36.51" width="10.49" height="57.39" fill="#1d1d1b"/><polygon points="399.47 36.51 386.48 71.82 373.23 36.51 361.97 36.51 384.72 94.77 387.54 94.77 410.47 36.51 399.47 36.51" fill="#1d1d1b"/><polygon points="454.31 84.63 429.96 84.63 429.96 69.19 452.92 69.19 452.92 60.26 429.96 60.26 429.96 45.95 454.31 45.95 454.31 36.51 419.46 36.51 419.46 93.9 454.31 93.9 454.31 84.63" fill="#1d1d1b"/><path d="M494.47,93.9h12.45L488.34,70c9.58-1.43,15.28-7.64,15.28-16.72,0-10.48-7.36-16.73-19.69-16.73H466.07V93.9h10.49V70.67l17.79,23.07ZM482.79,62.36h-6.23v-17h6.93c6.05,0,9.81,3.25,9.81,8.5C493.3,59.26,489.47,62.36,482.79,62.36Z" fill="#1d1d1b"/><path d="M533.75,85.59c-5.61,0-10.79-3.61-15.55-7.51l-.34-.28-5.25,7.64.27.24c6.9,6.15,13.74,9.27,20.34,9.27C544.48,95,552,88.22,552,78.21c0-8.91-7.1-13.49-12.44-16.16L533,58.73c-5.58-2.84-7.38-4.77-7.38-7.94,0-4,3.84-6.14,7.63-6.14s7.84,1.73,12.15,5.15l.34.27,5-7.3-.27-.23c-4.16-3.5-9.43-7.08-17.11-7.08-11.17,0-18.39,6.26-18.39,15.94s7.76,14.22,13.59,16.87L534.17,71c4.5,2.29,7.29,4.43,7.29,8C541.46,83.12,538.58,85.59,533.75,85.59Z" fill="#1d1d1b"/><rect x="561.68" y="36.51" width="10.49" height="57.39" fill="#1d1d1b"/><polygon points="599.38 93.9 609.78 93.9 609.78 45.95 625.93 45.95 625.93 36.51 583.14 36.51 583.14 45.95 599.38 45.95 599.38 93.9" fill="#1d1d1b"/><path d="M638.54,30.94a6.69,6.69,0,1,0-6.69-6.69A6.55,6.55,0,0,0,638.54,30.94Z" fill="#1d1d1b"/><path d="M657.57,30.94a6.62,6.62,0,0,0,6.69-6.69,6.7,6.7,0,0,0-6.69-6.69,6.61,6.61,0,0,0-6.69,6.69A6.55,6.55,0,0,0,657.57,30.94Z" fill="#1d1d1b"/><path d="M649.46,35.63h-2.9L622.66,93.9h10.83l4-10.31H658.7l4.19,10.31h10.82l-24.15-58Zm5.77,39.21H640.88L648,56.77Z" fill="#1d1d1b"/><polygon points="670.44 36.35 670.44 45.8 686.68 45.8 686.68 93.74 697.09 93.74 697.09 45.8 713.24 45.8 713.24 36.35 670.44 36.35" fill="#1d1d1b"/><path d="M257.28,140.57a14.44,14.44,0,0,0,7.34-12.45c0-9.64-7.64-15.39-20.43-15.39H227.33V170h18.34c13.18,0,21-6.3,21-16.86C266.71,147.36,263.21,142.72,257.28,140.57ZM237.8,137V121.46h6.74c5.62,0,9.7,3.13,9.7,7.44,0,3.93-2.55,8.14-9.7,8.14Zm8.39,24.47H237.8V145.25H247c5.73,0,9.43,3.05,9.43,7.78C256.41,158.42,252.69,161.51,246.19,161.51Z" fill="#1d1d1b"/><rect x="275.86" y="112.73" width="10.47" height="57.25" fill="#1d1d1b"/><polygon points="298.26 169.99 333.02 169.99 333.02 160.73 308.73 160.73 308.73 145.33 331.63 145.33 331.63 136.43 308.73 136.43 308.73 122.16 333.02 122.16 333.02 112.73 298.26 112.73 298.26 169.99" fill="#1d1d1b"/><polygon points="353.26 112.73 342.79 112.73 342.79 169.99 377.64 169.99 377.64 160.29 353.26 160.29 353.26 112.73" fill="#1d1d1b"/><polygon points="388.03 169.99 422.8 169.99 422.8 160.73 398.5 160.73 398.5 145.33 421.4 145.33 421.4 136.43 398.5 136.43 398.5 122.16 422.8 122.16 422.8 112.73 388.03 112.73 388.03 169.99" fill="#1d1d1b"/><polygon points="434.68 169.99 445.15 169.99 445.15 146.9 466.22 146.9 466.22 138.25 445.15 138.25 445.15 122.34 467.79 122.34 467.79 112.73 434.68 112.73 434.68 169.99" fill="#1d1d1b"/><polygon points="478.72 169.99 513.49 169.99 513.49 160.73 489.19 160.73 489.19 145.33 512.1 145.33 512.1 136.43 489.19 136.43 489.19 122.16 513.49 122.16 513.49 112.73 478.72 112.73 478.72 169.99" fill="#1d1d1b"/><polygon points="535.32 112.73 524.85 112.73 524.85 169.99 559.7 169.99 559.7 160.29 535.32 160.29 535.32 112.73" fill="#1d1d1b"/><path d="M589.67,112.73H571.33V170h17.91c23.17,0,31.4-15.6,31.4-29C620.64,124.36,607.9,112.73,589.67,112.73ZM609.73,141c0,12.7-7.31,20-20.06,20H581.8V121.9h8.13C599.79,121.9,609.73,127.81,609.73,141Z" fill="#1d1d1b"/><polygon points="133.58 36.46 133.58 0 0 0 0 170.14 170.08 170.14 170.08 36.46 133.58 36.46" fill="#1d1d1b"/></svg> \ No newline at end of file diff --git a/src/assets/main.css b/src/assets/main.css index a78c1e6441961749ba7ae2a72e26b699008f73de..24f661e1ba5b45e145150f636947b284828c9656 100644 --- a/src/assets/main.css +++ b/src/assets/main.css @@ -1,10 +1,34 @@ @import "base.css"; -body { - padding-top: 4rem; - max-height: 100vh; - background: #181818; + +.fs-0 { + font-size: 3.5rem; } .top-toast { top: 4rem; } + +.w-fit { + width: fit-content; +} + +.cursor-pointer { + cursor: pointer; +} + +pre { + backdrop-filter: brightness(0.9); + padding: .5rem; + color: var(--bs-code-color); + width: fit-content; + min-width: 50%; +} + +.hover-shadow { + transition: transform 0.2s ease-out; +} +.hover-shadow:hover { + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; + transform: translateY(-2px); + backdrop-filter: brightness(0.95); +} diff --git a/src/client/core/ApiError.ts b/src/client/auth/core/ApiError.ts similarity index 92% rename from src/client/core/ApiError.ts rename to src/client/auth/core/ApiError.ts index 99d792996765118614adf6a232bc8766b95710e9..d6b8fcc3ad0b6b2bdf1aa4df97ec598e64995648 100644 --- a/src/client/core/ApiError.ts +++ b/src/client/auth/core/ApiError.ts @@ -1,3 +1,4 @@ +/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/src/client/core/ApiRequestOptions.ts b/src/client/auth/core/ApiRequestOptions.ts similarity index 90% rename from src/client/core/ApiRequestOptions.ts rename to src/client/auth/core/ApiRequestOptions.ts index c7b77538c5ce6aa48f141541392121fbcafc4821..c19adcc94dc5f015865368d6d64751de5c243aa3 100644 --- a/src/client/core/ApiRequestOptions.ts +++ b/src/client/auth/core/ApiRequestOptions.ts @@ -1,3 +1,4 @@ +/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/src/client/core/ApiResult.ts b/src/client/auth/core/ApiResult.ts similarity index 78% rename from src/client/core/ApiResult.ts rename to src/client/auth/core/ApiResult.ts index b095dc7708af2aa405a6dc7ad08f423334bc7f24..ad8fef2bc334c2aedf5c043896fd394229453ff0 100644 --- a/src/client/core/ApiResult.ts +++ b/src/client/auth/core/ApiResult.ts @@ -1,3 +1,4 @@ +/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/src/client/core/CancelablePromise.ts b/src/client/auth/core/CancelablePromise.ts similarity index 55% rename from src/client/core/CancelablePromise.ts rename to src/client/auth/core/CancelablePromise.ts index 26ad303915af161f170cc144a5e7684be3053778..55fef8517238d2dab7478598eefca72e657b9fb5 100644 --- a/src/client/core/CancelablePromise.ts +++ b/src/client/auth/core/CancelablePromise.ts @@ -1,3 +1,4 @@ +/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ @@ -22,15 +23,13 @@ export interface OnCancel { } export class CancelablePromise<T> implements Promise<T> { - readonly [Symbol.toStringTag]!: string; - - private _isResolved: boolean; - private _isRejected: boolean; - private _isCancelled: boolean; - private readonly _cancelHandlers: (() => void)[]; - private readonly _promise: Promise<T>; - private _resolve?: (value: T | PromiseLike<T>) => void; - private _reject?: (reason?: any) => void; + #isResolved: boolean; + #isRejected: boolean; + #isCancelled: boolean; + readonly #cancelHandlers: (() => void)[]; + readonly #promise: Promise<T>; + #resolve?: (value: T | PromiseLike<T>) => void; + #reject?: (reason?: any) => void; constructor( executor: ( @@ -39,78 +38,82 @@ export class CancelablePromise<T> implements Promise<T> { onCancel: OnCancel ) => void ) { - this._isResolved = false; - this._isRejected = false; - this._isCancelled = false; - this._cancelHandlers = []; - this._promise = new Promise<T>((resolve, reject) => { - this._resolve = resolve; - this._reject = reject; + this.#isResolved = false; + this.#isRejected = false; + this.#isCancelled = false; + this.#cancelHandlers = []; + this.#promise = new Promise<T>((resolve, reject) => { + this.#resolve = resolve; + this.#reject = reject; const onResolve = (value: T | PromiseLike<T>): void => { - if (this._isResolved || this._isRejected || this._isCancelled) { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { return; } - this._isResolved = true; - this._resolve?.(value); + this.#isResolved = true; + this.#resolve?.(value); }; const onReject = (reason?: any): void => { - if (this._isResolved || this._isRejected || this._isCancelled) { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { return; } - this._isRejected = true; - this._reject?.(reason); + this.#isRejected = true; + this.#reject?.(reason); }; const onCancel = (cancelHandler: () => void): void => { - if (this._isResolved || this._isRejected || this._isCancelled) { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { return; } - this._cancelHandlers.push(cancelHandler); + this.#cancelHandlers.push(cancelHandler); }; Object.defineProperty(onCancel, 'isResolved', { - get: (): boolean => this._isResolved, + get: (): boolean => this.#isResolved, }); Object.defineProperty(onCancel, 'isRejected', { - get: (): boolean => this._isRejected, + get: (): boolean => this.#isRejected, }); Object.defineProperty(onCancel, 'isCancelled', { - get: (): boolean => this._isCancelled, + get: (): boolean => this.#isCancelled, }); return executor(onResolve, onReject, onCancel as OnCancel); }); } + get [Symbol.toStringTag]() { + return "Cancellable Promise"; + } + public then<TResult1 = T, TResult2 = never>( onFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null, onRejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null ): Promise<TResult1 | TResult2> { - return this._promise.then(onFulfilled, onRejected); + return this.#promise.then(onFulfilled, onRejected); } public catch<TResult = never>( onRejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null ): Promise<T | TResult> { - return this._promise.catch(onRejected); + return this.#promise.catch(onRejected); } public finally(onFinally?: (() => void) | null): Promise<T> { - return this._promise.finally(onFinally); + return this.#promise.finally(onFinally); } public cancel(): void { - if (this._isResolved || this._isRejected || this._isCancelled) { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { return; } - this._isCancelled = true; - if (this._cancelHandlers.length) { + this.#isCancelled = true; + if (this.#cancelHandlers.length) { try { - for (const cancelHandler of this._cancelHandlers) { + for (const cancelHandler of this.#cancelHandlers) { cancelHandler(); } } catch (error) { @@ -118,11 +121,11 @@ export class CancelablePromise<T> implements Promise<T> { return; } } - this._cancelHandlers.length = 0; - this._reject?.(new CancelError('Request aborted')); + this.#cancelHandlers.length = 0; + this.#reject?.(new CancelError('Request aborted')); } public get isCancelled(): boolean { - return this._isCancelled; + return this.#isCancelled; } } diff --git a/src/client/core/OpenAPI.ts b/src/client/auth/core/OpenAPI.ts similarity index 63% rename from src/client/core/OpenAPI.ts rename to src/client/auth/core/OpenAPI.ts index d4685b40c43ec9045eb8008e86d7d595b6828c85..9484fb91af3169d50a2a4fee46d01bed59b08907 100644 --- a/src/client/core/OpenAPI.ts +++ b/src/client/auth/core/OpenAPI.ts @@ -1,3 +1,4 @@ +/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ @@ -11,15 +12,15 @@ export type OpenAPIConfig = { VERSION: string; WITH_CREDENTIALS: boolean; CREDENTIALS: 'include' | 'omit' | 'same-origin'; - TOKEN?: string | Resolver<string>; - USERNAME?: string | Resolver<string>; - PASSWORD?: string | Resolver<string>; - HEADERS?: Headers | Resolver<Headers>; - ENCODE_PATH?: (path: string) => string; + TOKEN?: string | Resolver<string> | undefined; + USERNAME?: string | Resolver<string> | undefined; + PASSWORD?: string | Resolver<string> | undefined; + HEADERS?: Headers | Resolver<Headers> | undefined; + ENCODE_PATH?: ((path: string) => string) | undefined; }; export const OpenAPI: OpenAPIConfig = { - BASE: '/api', + BASE: '/api/auth-service', VERSION: '1.0.0', WITH_CREDENTIALS: false, CREDENTIALS: 'include', diff --git a/src/client/core/request.ts b/src/client/auth/core/request.ts similarity index 78% rename from src/client/core/request.ts rename to src/client/auth/core/request.ts index 2b5375ab44ec20863646a5debca820b42c2b7500..1142d43219797c94e09f35ba83a9f5441892ddd2 100644 --- a/src/client/core/request.ts +++ b/src/client/auth/core/request.ts @@ -1,8 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ import axios from 'axios'; -import type { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios'; +import type { AxiosError, AxiosRequestConfig, AxiosResponse, AxiosInstance } from 'axios'; import FormData from 'form-data'; import { ApiError } from './ApiError'; @@ -12,19 +13,19 @@ import { CancelablePromise } from './CancelablePromise'; import type { OnCancel } from './CancelablePromise'; import type { OpenAPIConfig } from './OpenAPI'; -const isDefined = <T>(value: T | null | undefined): value is Exclude<T, null | undefined> => { +export const isDefined = <T>(value: T | null | undefined): value is Exclude<T, null | undefined> => { return value !== undefined && value !== null; }; -const isString = (value: any): value is string => { +export const isString = (value: any): value is string => { return typeof value === 'string'; }; -const isStringWithValue = (value: any): value is string => { +export const isStringWithValue = (value: any): value is string => { return isString(value) && value !== ''; }; -const isBlob = (value: any): value is Blob => { +export const isBlob = (value: any): value is Blob => { return ( typeof value === 'object' && typeof value.type === 'string' && @@ -37,15 +38,15 @@ const isBlob = (value: any): value is Blob => { ); }; -const isFormData = (value: any): value is FormData => { +export const isFormData = (value: any): value is FormData => { return value instanceof FormData; }; -const isSuccess = (status: number): boolean => { +export const isSuccess = (status: number): boolean => { return status >= 200 && status < 300; }; -const base64 = (str: string): string => { +export const base64 = (str: string): string => { try { return btoa(str); } catch (err) { @@ -54,7 +55,7 @@ const base64 = (str: string): string => { } }; -const getQueryString = (params: Record<string, any>): string => { +export const getQueryString = (params: Record<string, any>): string => { const qs: string[] = []; const append = (key: string, value: any) => { @@ -107,7 +108,7 @@ const getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => { return url; }; -const getFormData = (options: ApiRequestOptions): FormData | undefined => { +export const getFormData = (options: ApiRequestOptions): FormData | undefined => { if (options.formData) { const formData = new FormData(); @@ -136,14 +137,14 @@ const getFormData = (options: ApiRequestOptions): FormData | undefined => { type Resolver<T> = (options: ApiRequestOptions) => Promise<T>; -const resolve = async <T>(options: ApiRequestOptions, resolver?: T | Resolver<T>): Promise<T | undefined> => { +export const resolve = async <T>(options: ApiRequestOptions, resolver?: T | Resolver<T>): Promise<T | undefined> => { if (typeof resolver === 'function') { return (resolver as Resolver<T>)(options); } return resolver; }; -const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions, formData?: FormData): Promise<Record<string, string>> => { +export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions, formData?: FormData): Promise<Record<string, string>> => { const token = await resolve(options, config.TOKEN); const username = await resolve(options, config.USERNAME); const password = await resolve(options, config.PASSWORD); @@ -186,21 +187,22 @@ const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions, for return headers; }; -const getRequestBody = (options: ApiRequestOptions): any => { +export const getRequestBody = (options: ApiRequestOptions): any => { if (options.body) { return options.body; } return undefined; }; -const sendRequest = async <T>( +export const sendRequest = async <T>( config: OpenAPIConfig, options: ApiRequestOptions, url: string, body: any, formData: FormData | undefined, headers: Record<string, string>, - onCancel: OnCancel + onCancel: OnCancel, + axiosClient: AxiosInstance ): Promise<AxiosResponse<T>> => { const source = axios.CancelToken.source(); @@ -216,7 +218,7 @@ const sendRequest = async <T>( onCancel(() => source.cancel('The user aborted a request.')); try { - return await axios.request(requestConfig); + return await axiosClient.request(requestConfig); } catch (error) { const axiosError = error as AxiosError<T>; if (axiosError.response) { @@ -226,7 +228,7 @@ const sendRequest = async <T>( } }; -const getResponseHeader = (response: AxiosResponse<any>, responseHeader?: string): string | undefined => { +export const getResponseHeader = (response: AxiosResponse<any>, responseHeader?: string): string | undefined => { if (responseHeader) { const content = response.headers[responseHeader]; if (isString(content)) { @@ -236,14 +238,14 @@ const getResponseHeader = (response: AxiosResponse<any>, responseHeader?: string return undefined; }; -const getResponseBody = (response: AxiosResponse<any>): any => { +export const getResponseBody = (response: AxiosResponse<any>): any => { if (response.status !== 204) { return response.data; } return undefined; }; -const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => { +export const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => { const errors: Record<number, string> = { 400: 'Bad Request', 401: 'Unauthorized', @@ -261,7 +263,19 @@ const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => } if (!result.ok) { - throw new ApiError(options, result, 'Generic Error'); + const errorStatus = result.status ?? 'unknown'; + const errorStatusText = result.statusText ?? 'unknown'; + const errorBody = (() => { + try { + return JSON.stringify(result.body, null, 2); + } catch (e) { + return undefined; + } + })(); + + throw new ApiError(options, result, + `Generic Error: status: ${errorStatus}; status text: ${errorStatusText}; body: ${errorBody}` + ); } }; @@ -269,10 +283,11 @@ const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => * Request method * @param config The OpenAPI configuration object * @param options The request options from the service + * @param axiosClient The axios client instance to use * @returns CancelablePromise<T> * @throws ApiError */ -export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise<T> => { +export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions, axiosClient: AxiosInstance = axios): CancelablePromise<T> => { return new CancelablePromise(async (resolve, reject, onCancel) => { try { const url = getUrl(config, options); @@ -281,7 +296,7 @@ export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions): C const headers = await getHeaders(config, options, formData); if (!onCancel.isCancelled) { - const response = await sendRequest<T>(config, options, url, body, formData, headers, onCancel); + const response = await sendRequest<T>(config, options, url, body, formData, headers, onCancel, axiosClient); const responseBody = getResponseBody(response); const responseHeader = getResponseHeader(response, options.responseHeader); diff --git a/src/client/auth/index.ts b/src/client/auth/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..69ffa49395db64976f8d79f2dfbedcb90dc7fc5a --- /dev/null +++ b/src/client/auth/index.ts @@ -0,0 +1,17 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export { ApiError } from './core/ApiError'; +export { CancelablePromise, CancelError } from './core/CancelablePromise'; +export { OpenAPI } from './core/OpenAPI'; +export type { OpenAPIConfig } from './core/OpenAPI'; + +export type { ErrorDetail } from './models/ErrorDetail'; +export type { HTTPValidationError } from './models/HTTPValidationError'; +export { RoleEnum } from './models/RoleEnum'; +export type { User } from './models/User'; +export type { ValidationError } from './models/ValidationError'; + +export { AuthService } from './services/AuthService'; +export { UserService } from './services/UserService'; diff --git a/src/client/models/ErrorDetail.ts b/src/client/auth/models/ErrorDetail.ts similarity index 78% rename from src/client/models/ErrorDetail.ts rename to src/client/auth/models/ErrorDetail.ts index b01e5aa28734c901620e98f8795e9528004d1513..eba50ab9335b70df9b29cada4c54cf9ffaad10a4 100644 --- a/src/client/models/ErrorDetail.ts +++ b/src/client/auth/models/ErrorDetail.ts @@ -1,3 +1,4 @@ +/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/src/client/models/HTTPValidationError.ts b/src/client/auth/models/HTTPValidationError.ts similarity index 76% rename from src/client/models/HTTPValidationError.ts rename to src/client/auth/models/HTTPValidationError.ts index a8c21354123500873c7548194a36421eb8316c78..c0bcc87cf7f3222638466bc2e5753ca1accf01f7 100644 --- a/src/client/models/HTTPValidationError.ts +++ b/src/client/auth/models/HTTPValidationError.ts @@ -1,3 +1,4 @@ +/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/src/client/auth/models/RoleEnum.ts b/src/client/auth/models/RoleEnum.ts new file mode 100644 index 0000000000000000000000000000000000000000..c38121aa528efe32ad2db1868fe05ca559006f4b --- /dev/null +++ b/src/client/auth/models/RoleEnum.ts @@ -0,0 +1,15 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +/** + * Enumeration for the Roles in the CloWM Services. + */ +export enum RoleEnum { + ADMINISTRATOR = 'administrator', + USER = 'user', + REVIEWER = 'reviewer', + DEVELOPER = 'developer', + FOREIGN_USER = 'foreign_user', +} diff --git a/src/client/models/User.ts b/src/client/auth/models/User.ts similarity index 57% rename from src/client/models/User.ts rename to src/client/auth/models/User.ts index 0af7691e6489e47f4e623a0b7bc84848bacd6dfe..8804790e499d6f84af8e66835bdfc8f9a1a269ff 100644 --- a/src/client/models/User.ts +++ b/src/client/auth/models/User.ts @@ -1,7 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import type { RoleEnum } from './RoleEnum'; + /** * Schema for a user. */ @@ -14,5 +17,9 @@ export type User = { * Full Name of the user */ display_name: string; + /** + * Roles of the user + */ + roles?: (Array<RoleEnum> | null); }; diff --git a/src/client/models/ValidationError.ts b/src/client/auth/models/ValidationError.ts similarity index 73% rename from src/client/models/ValidationError.ts rename to src/client/auth/models/ValidationError.ts index 16dc86a6807d9ad1f7e9d06638d4bd002682dc42..18997ec72f4103731f38d915508522ba23ba8506 100644 --- a/src/client/models/ValidationError.ts +++ b/src/client/auth/models/ValidationError.ts @@ -1,3 +1,4 @@ +/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/src/client/services/AuthService.ts b/src/client/auth/services/AuthService.ts similarity index 63% rename from src/client/services/AuthService.ts rename to src/client/auth/services/AuthService.ts index 0a4680da8ea0e3d7b2a02aca271961c34c424ec3..0472d3962a5f73dac257fe6de7e4c74cfe56f987 100644 --- a/src/client/services/AuthService.ts +++ b/src/client/auth/services/AuthService.ts @@ -1,3 +1,4 @@ +/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ @@ -8,10 +9,26 @@ import { request as __request } from '../core/request'; export class AuthService { /** - * Life Science Login Callback + * Redirect to LifeScience OIDC Login + * Redirect route to OIDC provider to kickstart the login process. + * @returns void + * @throws ApiError + */ + public static authLogin(): CancelablePromise<void> { + return __request(OpenAPI, { + method: 'GET', + url: '/auth/login', + errors: { + 302: `Successful Response`, + }, + }); + } + + /** + * LifeScience Login Callback * Callback for the Life Science Identity Provider. * - * To start the login process visit the route [login route](/api/auth/login/) + * Visit the route login route to start the login process. * * If the user is already known to the system, then a JWT token will be created and sent via the 'set-cookie' header. * The key for this Cookie is 'bearer'. @@ -19,7 +36,6 @@ export class AuthService { * If the user is new, he will be created and then a JWT token is issued. * * This JWT has to be sent to all authorized endpoints via the HTTPBearer scheme. - * * @returns void * @throws ApiError */ diff --git a/src/client/auth/services/UserService.ts b/src/client/auth/services/UserService.ts new file mode 100644 index 0000000000000000000000000000000000000000..ae578426600f01927ec075bafe3d68b849366327 --- /dev/null +++ b/src/client/auth/services/UserService.ts @@ -0,0 +1,97 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { RoleEnum } from '../models/RoleEnum'; +import type { User } from '../models/User'; + +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; + +export class UserService { + + /** + * Get the logged in user + * Return the user associated with the used JWT. + * Permission 'user:read' required. + * @returns User Successful Response + * @throws ApiError + */ + public static userGetLoggedInUser(): CancelablePromise<User> { + return __request(OpenAPI, { + method: 'GET', + url: '/users/me', + errors: { + 400: `Error decoding JWT Token`, + 403: `Not Authorized`, + 404: `Entity not Found`, + }, + }); + } + + /** + * List users and search by their name + * Return the users that have a specific substring in their name. + * Permission 'user:read_any' required, except when 'name_substring' as only query parameter is set. + * Then permission 'user:search' required. + * @param nameSubstring Filter users by a substring in their name. Permission 'search' required + * @param filterRoles Filter users by their role. If multiple are selected, they are concatenating by an OR Expresssion. Permission 'read_any' required + * @param includeRoles Flag whether to include the roles of the users in the response. If True, permission 'read_any' required. + * @returns User Successful Response + * @throws ApiError + */ + public static userListUsers( + nameSubstring?: (string | null), + filterRoles?: (Array<RoleEnum> | null), + includeRoles: boolean = false, + ): CancelablePromise<Array<User>> { + return __request(OpenAPI, { + method: 'GET', + url: '/users', + query: { + 'name_substring': nameSubstring, + 'filter_roles': filterRoles, + 'include_roles': includeRoles, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not Authorized`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Get a user by its uid + * Return the user with the specific uid. A user can only view himself. + * Permission 'user:read' required + * @param uid UID of a user + * @param includeRoles Flag whether to include the roles of the users in the response. If True, permission 'read_any' required. + * @returns User Successful Response + * @throws ApiError + */ + public static userGetUser( + uid: string, + includeRoles: boolean = false, + ): CancelablePromise<User> { + return __request(OpenAPI, { + method: 'GET', + url: '/users/{uid}', + path: { + 'uid': uid, + }, + query: { + 'include_roles': includeRoles, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not Authorized`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + +} diff --git a/src/client/models/BucketPermissionIn.ts b/src/client/models/BucketPermissionIn.ts deleted file mode 100644 index eeedae9e518ba46543d75e50456a95ba2393c158..0000000000000000000000000000000000000000 --- a/src/client/models/BucketPermissionIn.ts +++ /dev/null @@ -1,36 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { PermissionEnum } from './PermissionEnum'; - -/** - * Schema for the parameters of a bucket permission. - */ -export type BucketPermissionIn = { - /** - * Start date of permission - */ - from_timestamp?: string; - /** - * End date of permission - */ - to_timestamp?: string; - /** - * Prefix of subfolder - */ - file_prefix?: string; - /** - * Permission - */ - permission?: (PermissionEnum | string); - /** - * UID of the grantee - */ - uid: string; - /** - * Name of Bucket - */ - bucket_name: string; -}; - diff --git a/src/client/models/BucketPermissionParameters.ts b/src/client/models/BucketPermissionParameters.ts deleted file mode 100644 index 6fb78dd8d4861faddaef3191fd8b3c91bc690dd2..0000000000000000000000000000000000000000 --- a/src/client/models/BucketPermissionParameters.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { PermissionEnum } from './PermissionEnum'; - -/** - * Schema for the parameters of a bucket permission. - */ -export type BucketPermissionParameters = { - /** - * Start date of permission - */ - from_timestamp?: string; - /** - * End date of permission - */ - to_timestamp?: string; - /** - * Prefix of subfolder - */ - file_prefix?: string; - /** - * Permission - */ - permission?: (PermissionEnum | string); -}; - diff --git a/src/client/models/S3ObjectMetaInformation.ts b/src/client/models/S3ObjectMetaInformation.ts deleted file mode 100644 index ed92a733014053f1c91d4ac7f4067271fb8b6904..0000000000000000000000000000000000000000 --- a/src/client/models/S3ObjectMetaInformation.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -/** - * Schema for the meta-information about a S3 object. - */ -export type S3ObjectMetaInformation = { - /** - * Key of the Object in the S3 store - */ - key: string; - /** - * Name of the Bucket in which the object is - */ - bucket: string; - /** - * MIME type of the object - */ - content_type: string; - /** - * Size of the object in Bytes - */ - size: number; - /** - * Last time the object was modified - */ - last_modified: string; -}; - diff --git a/src/client/s3proxy/core/ApiError.ts b/src/client/s3proxy/core/ApiError.ts new file mode 100644 index 0000000000000000000000000000000000000000..d6b8fcc3ad0b6b2bdf1aa4df97ec598e64995648 --- /dev/null +++ b/src/client/s3proxy/core/ApiError.ts @@ -0,0 +1,25 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiResult } from './ApiResult'; + +export class ApiError extends Error { + public readonly url: string; + public readonly status: number; + public readonly statusText: string; + public readonly body: any; + public readonly request: ApiRequestOptions; + + constructor(request: ApiRequestOptions, response: ApiResult, message: string) { + super(message); + + this.name = 'ApiError'; + this.url = response.url; + this.status = response.status; + this.statusText = response.statusText; + this.body = response.body; + this.request = request; + } +} diff --git a/src/client/s3proxy/core/ApiRequestOptions.ts b/src/client/s3proxy/core/ApiRequestOptions.ts new file mode 100644 index 0000000000000000000000000000000000000000..c19adcc94dc5f015865368d6d64751de5c243aa3 --- /dev/null +++ b/src/client/s3proxy/core/ApiRequestOptions.ts @@ -0,0 +1,17 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type ApiRequestOptions = { + readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH'; + readonly url: string; + readonly path?: Record<string, any>; + readonly cookies?: Record<string, any>; + readonly headers?: Record<string, any>; + readonly query?: Record<string, any>; + readonly formData?: Record<string, any>; + readonly body?: any; + readonly mediaType?: string; + readonly responseHeader?: string; + readonly errors?: Record<number, string>; +}; diff --git a/src/client/s3proxy/core/ApiResult.ts b/src/client/s3proxy/core/ApiResult.ts new file mode 100644 index 0000000000000000000000000000000000000000..ad8fef2bc334c2aedf5c043896fd394229453ff0 --- /dev/null +++ b/src/client/s3proxy/core/ApiResult.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type ApiResult = { + readonly url: string; + readonly ok: boolean; + readonly status: number; + readonly statusText: string; + readonly body: any; +}; diff --git a/src/client/s3proxy/core/CancelablePromise.ts b/src/client/s3proxy/core/CancelablePromise.ts new file mode 100644 index 0000000000000000000000000000000000000000..55fef8517238d2dab7478598eefca72e657b9fb5 --- /dev/null +++ b/src/client/s3proxy/core/CancelablePromise.ts @@ -0,0 +1,131 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export class CancelError extends Error { + + constructor(message: string) { + super(message); + this.name = 'CancelError'; + } + + public get isCancelled(): boolean { + return true; + } +} + +export interface OnCancel { + readonly isResolved: boolean; + readonly isRejected: boolean; + readonly isCancelled: boolean; + + (cancelHandler: () => void): void; +} + +export class CancelablePromise<T> implements Promise<T> { + #isResolved: boolean; + #isRejected: boolean; + #isCancelled: boolean; + readonly #cancelHandlers: (() => void)[]; + readonly #promise: Promise<T>; + #resolve?: (value: T | PromiseLike<T>) => void; + #reject?: (reason?: any) => void; + + constructor( + executor: ( + resolve: (value: T | PromiseLike<T>) => void, + reject: (reason?: any) => void, + onCancel: OnCancel + ) => void + ) { + this.#isResolved = false; + this.#isRejected = false; + this.#isCancelled = false; + this.#cancelHandlers = []; + this.#promise = new Promise<T>((resolve, reject) => { + this.#resolve = resolve; + this.#reject = reject; + + const onResolve = (value: T | PromiseLike<T>): void => { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#isResolved = true; + this.#resolve?.(value); + }; + + const onReject = (reason?: any): void => { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#isRejected = true; + this.#reject?.(reason); + }; + + const onCancel = (cancelHandler: () => void): void => { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#cancelHandlers.push(cancelHandler); + }; + + Object.defineProperty(onCancel, 'isResolved', { + get: (): boolean => this.#isResolved, + }); + + Object.defineProperty(onCancel, 'isRejected', { + get: (): boolean => this.#isRejected, + }); + + Object.defineProperty(onCancel, 'isCancelled', { + get: (): boolean => this.#isCancelled, + }); + + return executor(onResolve, onReject, onCancel as OnCancel); + }); + } + + get [Symbol.toStringTag]() { + return "Cancellable Promise"; + } + + public then<TResult1 = T, TResult2 = never>( + onFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null, + onRejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null + ): Promise<TResult1 | TResult2> { + return this.#promise.then(onFulfilled, onRejected); + } + + public catch<TResult = never>( + onRejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null + ): Promise<T | TResult> { + return this.#promise.catch(onRejected); + } + + public finally(onFinally?: (() => void) | null): Promise<T> { + return this.#promise.finally(onFinally); + } + + public cancel(): void { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#isCancelled = true; + if (this.#cancelHandlers.length) { + try { + for (const cancelHandler of this.#cancelHandlers) { + cancelHandler(); + } + } catch (error) { + console.warn('Cancellation threw an error', error); + return; + } + } + this.#cancelHandlers.length = 0; + this.#reject?.(new CancelError('Request aborted')); + } + + public get isCancelled(): boolean { + return this.#isCancelled; + } +} diff --git a/src/client/s3proxy/core/OpenAPI.ts b/src/client/s3proxy/core/OpenAPI.ts new file mode 100644 index 0000000000000000000000000000000000000000..f18fb9aeed82d0fd92b854566f9b61b5d519e1ca --- /dev/null +++ b/src/client/s3proxy/core/OpenAPI.ts @@ -0,0 +1,32 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ApiRequestOptions } from './ApiRequestOptions'; + +type Resolver<T> = (options: ApiRequestOptions) => Promise<T>; +type Headers = Record<string, string>; + +export type OpenAPIConfig = { + BASE: string; + VERSION: string; + WITH_CREDENTIALS: boolean; + CREDENTIALS: 'include' | 'omit' | 'same-origin'; + TOKEN?: string | Resolver<string> | undefined; + USERNAME?: string | Resolver<string> | undefined; + PASSWORD?: string | Resolver<string> | undefined; + HEADERS?: Headers | Resolver<Headers> | undefined; + ENCODE_PATH?: ((path: string) => string) | undefined; +}; + +export const OpenAPI: OpenAPIConfig = { + BASE: '/api/s3proxy-service', + VERSION: '2.0.0', + WITH_CREDENTIALS: false, + CREDENTIALS: 'include', + TOKEN: undefined, + USERNAME: undefined, + PASSWORD: undefined, + HEADERS: undefined, + ENCODE_PATH: undefined, +}; diff --git a/src/client/s3proxy/core/request.ts b/src/client/s3proxy/core/request.ts new file mode 100644 index 0000000000000000000000000000000000000000..1142d43219797c94e09f35ba83a9f5441892ddd2 --- /dev/null +++ b/src/client/s3proxy/core/request.ts @@ -0,0 +1,319 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import axios from 'axios'; +import type { AxiosError, AxiosRequestConfig, AxiosResponse, AxiosInstance } from 'axios'; +import FormData from 'form-data'; + +import { ApiError } from './ApiError'; +import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiResult } from './ApiResult'; +import { CancelablePromise } from './CancelablePromise'; +import type { OnCancel } from './CancelablePromise'; +import type { OpenAPIConfig } from './OpenAPI'; + +export const isDefined = <T>(value: T | null | undefined): value is Exclude<T, null | undefined> => { + return value !== undefined && value !== null; +}; + +export const isString = (value: any): value is string => { + return typeof value === 'string'; +}; + +export const isStringWithValue = (value: any): value is string => { + return isString(value) && value !== ''; +}; + +export const isBlob = (value: any): value is Blob => { + return ( + typeof value === 'object' && + typeof value.type === 'string' && + typeof value.stream === 'function' && + typeof value.arrayBuffer === 'function' && + typeof value.constructor === 'function' && + typeof value.constructor.name === 'string' && + /^(Blob|File)$/.test(value.constructor.name) && + /^(Blob|File)$/.test(value[Symbol.toStringTag]) + ); +}; + +export const isFormData = (value: any): value is FormData => { + return value instanceof FormData; +}; + +export const isSuccess = (status: number): boolean => { + return status >= 200 && status < 300; +}; + +export const base64 = (str: string): string => { + try { + return btoa(str); + } catch (err) { + // @ts-ignore + return Buffer.from(str).toString('base64'); + } +}; + +export const getQueryString = (params: Record<string, any>): string => { + const qs: string[] = []; + + const append = (key: string, value: any) => { + qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`); + }; + + const process = (key: string, value: any) => { + if (isDefined(value)) { + if (Array.isArray(value)) { + value.forEach(v => { + process(key, v); + }); + } else if (typeof value === 'object') { + Object.entries(value).forEach(([k, v]) => { + process(`${key}[${k}]`, v); + }); + } else { + append(key, value); + } + } + }; + + Object.entries(params).forEach(([key, value]) => { + process(key, value); + }); + + if (qs.length > 0) { + return `?${qs.join('&')}`; + } + + return ''; +}; + +const getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => { + const encoder = config.ENCODE_PATH || encodeURI; + + const path = options.url + .replace('{api-version}', config.VERSION) + .replace(/{(.*?)}/g, (substring: string, group: string) => { + if (options.path?.hasOwnProperty(group)) { + return encoder(String(options.path[group])); + } + return substring; + }); + + const url = `${config.BASE}${path}`; + if (options.query) { + return `${url}${getQueryString(options.query)}`; + } + return url; +}; + +export const getFormData = (options: ApiRequestOptions): FormData | undefined => { + if (options.formData) { + const formData = new FormData(); + + const process = (key: string, value: any) => { + if (isString(value) || isBlob(value)) { + formData.append(key, value); + } else { + formData.append(key, JSON.stringify(value)); + } + }; + + Object.entries(options.formData) + .filter(([_, value]) => isDefined(value)) + .forEach(([key, value]) => { + if (Array.isArray(value)) { + value.forEach(v => process(key, v)); + } else { + process(key, value); + } + }); + + return formData; + } + return undefined; +}; + +type Resolver<T> = (options: ApiRequestOptions) => Promise<T>; + +export const resolve = async <T>(options: ApiRequestOptions, resolver?: T | Resolver<T>): Promise<T | undefined> => { + if (typeof resolver === 'function') { + return (resolver as Resolver<T>)(options); + } + return resolver; +}; + +export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions, formData?: FormData): Promise<Record<string, string>> => { + const token = await resolve(options, config.TOKEN); + const username = await resolve(options, config.USERNAME); + const password = await resolve(options, config.PASSWORD); + const additionalHeaders = await resolve(options, config.HEADERS); + const formHeaders = typeof formData?.getHeaders === 'function' && formData?.getHeaders() || {} + + const headers = Object.entries({ + Accept: 'application/json', + ...additionalHeaders, + ...options.headers, + ...formHeaders, + }) + .filter(([_, value]) => isDefined(value)) + .reduce((headers, [key, value]) => ({ + ...headers, + [key]: String(value), + }), {} as Record<string, string>); + + if (isStringWithValue(token)) { + headers['Authorization'] = `Bearer ${token}`; + } + + if (isStringWithValue(username) && isStringWithValue(password)) { + const credentials = base64(`${username}:${password}`); + headers['Authorization'] = `Basic ${credentials}`; + } + + if (options.body) { + if (options.mediaType) { + headers['Content-Type'] = options.mediaType; + } else if (isBlob(options.body)) { + headers['Content-Type'] = options.body.type || 'application/octet-stream'; + } else if (isString(options.body)) { + headers['Content-Type'] = 'text/plain'; + } else if (!isFormData(options.body)) { + headers['Content-Type'] = 'application/json'; + } + } + + return headers; +}; + +export const getRequestBody = (options: ApiRequestOptions): any => { + if (options.body) { + return options.body; + } + return undefined; +}; + +export const sendRequest = async <T>( + config: OpenAPIConfig, + options: ApiRequestOptions, + url: string, + body: any, + formData: FormData | undefined, + headers: Record<string, string>, + onCancel: OnCancel, + axiosClient: AxiosInstance +): Promise<AxiosResponse<T>> => { + const source = axios.CancelToken.source(); + + const requestConfig: AxiosRequestConfig = { + url, + headers, + data: body ?? formData, + method: options.method, + withCredentials: config.WITH_CREDENTIALS, + cancelToken: source.token, + }; + + onCancel(() => source.cancel('The user aborted a request.')); + + try { + return await axiosClient.request(requestConfig); + } catch (error) { + const axiosError = error as AxiosError<T>; + if (axiosError.response) { + return axiosError.response; + } + throw error; + } +}; + +export const getResponseHeader = (response: AxiosResponse<any>, responseHeader?: string): string | undefined => { + if (responseHeader) { + const content = response.headers[responseHeader]; + if (isString(content)) { + return content; + } + } + return undefined; +}; + +export const getResponseBody = (response: AxiosResponse<any>): any => { + if (response.status !== 204) { + return response.data; + } + return undefined; +}; + +export const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => { + const errors: Record<number, string> = { + 400: 'Bad Request', + 401: 'Unauthorized', + 403: 'Forbidden', + 404: 'Not Found', + 500: 'Internal Server Error', + 502: 'Bad Gateway', + 503: 'Service Unavailable', + ...options.errors, + } + + const error = errors[result.status]; + if (error) { + throw new ApiError(options, result, error); + } + + if (!result.ok) { + const errorStatus = result.status ?? 'unknown'; + const errorStatusText = result.statusText ?? 'unknown'; + const errorBody = (() => { + try { + return JSON.stringify(result.body, null, 2); + } catch (e) { + return undefined; + } + })(); + + throw new ApiError(options, result, + `Generic Error: status: ${errorStatus}; status text: ${errorStatusText}; body: ${errorBody}` + ); + } +}; + +/** + * Request method + * @param config The OpenAPI configuration object + * @param options The request options from the service + * @param axiosClient The axios client instance to use + * @returns CancelablePromise<T> + * @throws ApiError + */ +export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions, axiosClient: AxiosInstance = axios): CancelablePromise<T> => { + return new CancelablePromise(async (resolve, reject, onCancel) => { + try { + const url = getUrl(config, options); + const formData = getFormData(options); + const body = getRequestBody(options); + const headers = await getHeaders(config, options, formData); + + if (!onCancel.isCancelled) { + const response = await sendRequest<T>(config, options, url, body, formData, headers, onCancel, axiosClient); + const responseBody = getResponseBody(response); + const responseHeader = getResponseHeader(response, options.responseHeader); + + const result: ApiResult = { + url, + ok: isSuccess(response.status), + status: response.status, + statusText: response.statusText, + body: responseHeader ?? responseBody, + }; + + catchErrorCodes(options, result); + + resolve(result.body); + } + } catch (error) { + reject(error); + } + }); +}; diff --git a/src/client/index.ts b/src/client/s3proxy/index.ts similarity index 62% rename from src/client/index.ts rename to src/client/s3proxy/index.ts index 39654c3a51fa08ded67ea208344e53329322644c..fed4296d819361403d19656310823c02f50ab841 100644 --- a/src/client/index.ts +++ b/src/client/s3proxy/index.ts @@ -1,3 +1,4 @@ +/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ @@ -11,18 +12,15 @@ export type { BucketOut } from './models/BucketOut'; export type { BucketPermissionIn } from './models/BucketPermissionIn'; export type { BucketPermissionOut } from './models/BucketPermissionOut'; export type { BucketPermissionParameters } from './models/BucketPermissionParameters'; +export { BucketType } from './models/BucketType'; +export { Constraint } from './models/Constraint'; export type { ErrorDetail } from './models/ErrorDetail'; export type { HTTPValidationError } from './models/HTTPValidationError'; -export { PermissionEnum } from './models/PermissionEnum'; +export { Permission } from './models/Permission'; +export { PermissionStatus } from './models/PermissionStatus'; export type { S3Key } from './models/S3Key'; -export type { S3ObjectMetaInformation } from './models/S3ObjectMetaInformation'; -export type { User } from './models/User'; export type { ValidationError } from './models/ValidationError'; -export { AuthService } from './services/AuthService'; export { BucketService } from './services/BucketService'; -export { BucketPermissionsService } from './services/BucketPermissionsService'; -export { KeyService } from './services/KeyService'; -export { MiscellaneousService } from './services/MiscellaneousService'; -export { ObjectService } from './services/ObjectService'; -export { UserService } from './services/UserService'; +export { BucketPermissionService } from './services/BucketPermissionService'; +export { S3KeyService } from './services/S3KeyService'; diff --git a/src/client/models/BucketIn.ts b/src/client/s3proxy/models/BucketIn.ts similarity index 81% rename from src/client/models/BucketIn.ts rename to src/client/s3proxy/models/BucketIn.ts index 530031e6c9db2eed482ac3b2a05f512112fdcb3e..96ff7b44981b9551e21fd5562e8d82caeb080043 100644 --- a/src/client/models/BucketIn.ts +++ b/src/client/s3proxy/models/BucketIn.ts @@ -1,3 +1,4 @@ +/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/src/client/models/BucketOut.ts b/src/client/s3proxy/models/BucketOut.ts similarity index 64% rename from src/client/models/BucketOut.ts rename to src/client/s3proxy/models/BucketOut.ts index 92b94263533abcd054a3a6cdadbd30b2750515dd..5b38801ea29b9a411113b9b5c2343d33c6f1ef15 100644 --- a/src/client/models/BucketOut.ts +++ b/src/client/s3proxy/models/BucketOut.ts @@ -1,7 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import type { Constraint } from './Constraint'; + /** * Schema for answering a request with a bucket. */ @@ -15,9 +18,9 @@ export type BucketOut = { */ description: string; /** - * Time when the bucket was created + * Time when the bucket was created as UNIX timestamp */ - created_at: string; + created_at: number; /** * UID of the owner */ @@ -30,5 +33,9 @@ export type BucketOut = { * Total size of objects in this bucket in bytes */ size: number; + /** + * Constraint for the owner of the bucket + */ + owner_constraint?: (Constraint | null); }; diff --git a/src/client/s3proxy/models/BucketPermissionIn.ts b/src/client/s3proxy/models/BucketPermissionIn.ts new file mode 100644 index 0000000000000000000000000000000000000000..06bd223c69ce58189c1699343b1018187a8942c1 --- /dev/null +++ b/src/client/s3proxy/models/BucketPermissionIn.ts @@ -0,0 +1,34 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { Permission } from './Permission'; + +export type BucketPermissionIn = { + /** + * Start date of permission as UNIX timestamp + */ + from_timestamp?: (number | null); + /** + * End date of permission as UNIX timestamp + */ + to_timestamp?: (number | null); + /** + * Prefix of subfolder + */ + file_prefix?: (string | null); + /** + * Permission + */ + permission?: (Permission | string); + /** + * UID of the grantee + */ + uid: string; + /** + * Name of Bucket + */ + bucket_name: string; +}; + diff --git a/src/client/models/BucketPermissionOut.ts b/src/client/s3proxy/models/BucketPermissionOut.ts similarity index 56% rename from src/client/models/BucketPermissionOut.ts rename to src/client/s3proxy/models/BucketPermissionOut.ts index 484f22fba902b94c6323fa90ca6db10e5dec31da..38ac0254a4332ab86e098af5767e16cd022d0d80 100644 --- a/src/client/models/BucketPermissionOut.ts +++ b/src/client/s3proxy/models/BucketPermissionOut.ts @@ -1,29 +1,30 @@ +/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { PermissionEnum } from './PermissionEnum'; +import type { Permission } from './Permission'; /** * Schema for the bucket permissions. */ export type BucketPermissionOut = { /** - * Start date of permission + * Start date of permission as UNIX timestamp */ - from_timestamp?: string; + from_timestamp?: (number | null); /** - * End date of permission + * End date of permission as UNIX timestamp */ - to_timestamp?: string; + to_timestamp?: (number | null); /** * Prefix of subfolder */ - file_prefix?: string; + file_prefix?: (string | null); /** * Permission */ - permission?: (PermissionEnum | string); + permission?: (Permission | string); /** * UID of the grantee */ diff --git a/src/client/s3proxy/models/BucketPermissionParameters.ts b/src/client/s3proxy/models/BucketPermissionParameters.ts new file mode 100644 index 0000000000000000000000000000000000000000..4d8ef97bf2f6c6f51fbb3a1c4f2937fba8a0aefb --- /dev/null +++ b/src/client/s3proxy/models/BucketPermissionParameters.ts @@ -0,0 +1,29 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { Permission } from './Permission'; + +/** + * Schema for the parameters of a bucket permission. + */ +export type BucketPermissionParameters = { + /** + * Start date of permission as UNIX timestamp + */ + from_timestamp?: (number | null); + /** + * End date of permission as UNIX timestamp + */ + to_timestamp?: (number | null); + /** + * Prefix of subfolder + */ + file_prefix?: (string | null); + /** + * Permission + */ + permission?: (Permission | string); +}; + diff --git a/src/client/s3proxy/models/BucketType.ts b/src/client/s3proxy/models/BucketType.ts new file mode 100644 index 0000000000000000000000000000000000000000..b096c70b0b7234bc57dd1ecc2223bd41aa3e0d08 --- /dev/null +++ b/src/client/s3proxy/models/BucketType.ts @@ -0,0 +1,17 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +/** + * Enumeration for the type of buckets to fetch from the DB + * + * OWN: Only fetch buckets that the user owns + * PERMISSION: Only fetch foreign buckets that the user has access to + * ALL: Fetch all buckets that the user has access to + */ +export enum BucketType { + OWN = 'OWN', + ALL = 'ALL', + PERMISSION = 'PERMISSION', +} diff --git a/src/client/s3proxy/models/Constraint.ts b/src/client/s3proxy/models/Constraint.ts new file mode 100644 index 0000000000000000000000000000000000000000..afa995a983b5e08b66d55b8dfa4243553351d3a7 --- /dev/null +++ b/src/client/s3proxy/models/Constraint.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +/** + * Enumeration for the possible permission on a bucket. + */ +export enum Constraint { + READ = 'READ', + WRITE = 'WRITE', +} diff --git a/src/client/s3proxy/models/ErrorDetail.ts b/src/client/s3proxy/models/ErrorDetail.ts new file mode 100644 index 0000000000000000000000000000000000000000..eba50ab9335b70df9b29cada4c54cf9ffaad10a4 --- /dev/null +++ b/src/client/s3proxy/models/ErrorDetail.ts @@ -0,0 +1,15 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +/** + * Schema for a error due to a rejected request. + */ +export type ErrorDetail = { + /** + * Detail about the occurred error + */ + detail: string; +}; + diff --git a/src/client/s3proxy/models/HTTPValidationError.ts b/src/client/s3proxy/models/HTTPValidationError.ts new file mode 100644 index 0000000000000000000000000000000000000000..c0bcc87cf7f3222638466bc2e5753ca1accf01f7 --- /dev/null +++ b/src/client/s3proxy/models/HTTPValidationError.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ValidationError } from './ValidationError'; + +export type HTTPValidationError = { + detail?: Array<ValidationError>; +}; + diff --git a/src/client/models/PermissionEnum.ts b/src/client/s3proxy/models/Permission.ts similarity index 69% rename from src/client/models/PermissionEnum.ts rename to src/client/s3proxy/models/Permission.ts index ae0d72869da4a2291f3362cae30e2376b46af3f9..00592a496a01e178e7192ba3bd76c51b29a3a138 100644 --- a/src/client/models/PermissionEnum.ts +++ b/src/client/s3proxy/models/Permission.ts @@ -1,3 +1,4 @@ +/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ @@ -5,7 +6,7 @@ /** * Enumeration for the possible permission on a bucket. */ -export enum PermissionEnum { +export enum Permission { READ = 'READ', WRITE = 'WRITE', READWRITE = 'READWRITE', diff --git a/src/client/s3proxy/models/PermissionStatus.ts b/src/client/s3proxy/models/PermissionStatus.ts new file mode 100644 index 0000000000000000000000000000000000000000..d51e0928ec89e662e033c833ceacd5bd6c66bc74 --- /dev/null +++ b/src/client/s3proxy/models/PermissionStatus.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +/** + * Status of a bucket permission. Can be either `ACTIVE` or `INACTIVE`. A permission can only get `INACTIVE` if the + * permission itself has a time limit and the current time is not in the timespan. + */ +export enum PermissionStatus { + ACTIVE = 'ACTIVE', + INACTIVE = 'INACTIVE', +} diff --git a/src/client/models/S3Key.ts b/src/client/s3proxy/models/S3Key.ts similarity index 85% rename from src/client/models/S3Key.ts rename to src/client/s3proxy/models/S3Key.ts index 5a1aa255ea54281fb45ae5a32d09d459ef1bac29..cc9f01a57583423aeaad174dc68c8e96c16706a9 100644 --- a/src/client/models/S3Key.ts +++ b/src/client/s3proxy/models/S3Key.ts @@ -1,3 +1,4 @@ +/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/src/client/s3proxy/models/ValidationError.ts b/src/client/s3proxy/models/ValidationError.ts new file mode 100644 index 0000000000000000000000000000000000000000..18997ec72f4103731f38d915508522ba23ba8506 --- /dev/null +++ b/src/client/s3proxy/models/ValidationError.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type ValidationError = { + loc: Array<(string | number)>; + msg: string; + type: string; +}; + diff --git a/src/client/services/BucketPermissionsService.ts b/src/client/s3proxy/services/BucketPermissionService.ts similarity index 70% rename from src/client/services/BucketPermissionsService.ts rename to src/client/s3proxy/services/BucketPermissionService.ts index 1450d0ece96e706f5fc3a7d21b39e69a6152a24d..3b55d1bc1c6674483f24e3471fd5ae07d4cfa189 100644 --- a/src/client/services/BucketPermissionsService.ts +++ b/src/client/s3proxy/services/BucketPermissionService.ts @@ -1,15 +1,18 @@ +/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ import type { BucketPermissionIn } from '../models/BucketPermissionIn'; import type { BucketPermissionOut } from '../models/BucketPermissionOut'; import type { BucketPermissionParameters } from '../models/BucketPermissionParameters'; +import type { Permission } from '../models/Permission'; +import type { PermissionStatus } from '../models/PermissionStatus'; import type { CancelablePromise } from '../core/CancelablePromise'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; -export class BucketPermissionsService { +export class BucketPermissionService { /** * Get permission for bucket and user combination. @@ -17,12 +20,14 @@ export class BucketPermissionsService { * * The owner of the bucket and the grantee of the permission can view it. * + * Permission "bucket_permission:read" required if current user is the target or owner of the bucket permission, + * otherwise "bucket_permission:read_any" required. * @param bucketName Name of bucket * @param uid UID of a user * @returns BucketPermissionOut Successful Response * @throws ApiError */ - public static bucketPermissionsGetPermissionForBucket( + public static bucketPermissionGetPermissionForBucket( bucketName: string, uid: string, ): CancelablePromise<BucketPermissionOut> { @@ -43,29 +48,29 @@ export class BucketPermissionsService { } /** - * Update a bucket permission - * Update a permission for a bucket and user. + * Delete a bucket permission + * Delete the bucket permissions for the specific combination of bucket and user. * - * @param uid UID of a user + * The owner of the bucket and the grantee of the permission can delete it. + * + * Permission "bucket_permission:delete" required if current user is the target or owner of the bucket permission, + * otherwise "bucket_permission:delete_any" required. * @param bucketName Name of bucket - * @param requestBody - * @returns BucketPermissionOut Successful Response + * @param uid UID of a user + * @returns void * @throws ApiError */ - public static bucketPermissionsUpdatePermission( - uid: string, + public static bucketPermissionDeletePermission( bucketName: string, - requestBody: BucketPermissionParameters, - ): CancelablePromise<BucketPermissionOut> { + uid: string, + ): CancelablePromise<void> { return __request(OpenAPI, { - method: 'PUT', + method: 'DELETE', url: '/permissions/bucket/{bucket_name}/user/{uid}', path: { - 'uid': uid, 'bucket_name': bucketName, + 'uid': uid, }, - body: requestBody, - mediaType: 'application/json', errors: { 400: `Error decoding JWT Token`, 403: `Not authenticated`, @@ -76,27 +81,31 @@ export class BucketPermissionsService { } /** - * Delete a bucket permission - * Delete the bucket permissions for the specific combination of bucket and user. - * - * The owner of the bucket and the grantee of the permission can delete it. + * Update a bucket permission + * Update a permission for a bucket and user. * + * Permission "bucket_permission:read" required if current user is the target the bucket permission, + * otherwise "bucket_permission:update" required. * @param bucketName Name of bucket * @param uid UID of a user - * @returns void + * @param requestBody + * @returns BucketPermissionOut Successful Response * @throws ApiError */ - public static bucketPermissionsDeletePermissionForBucket( + public static bucketPermissionUpdatePermission( bucketName: string, uid: string, - ): CancelablePromise<void> { + requestBody: BucketPermissionParameters, + ): CancelablePromise<BucketPermissionOut> { return __request(OpenAPI, { - method: 'DELETE', + method: 'PUT', url: '/permissions/bucket/{bucket_name}/user/{uid}', path: { 'bucket_name': bucketName, 'uid': uid, }, + body: requestBody, + mediaType: 'application/json', errors: { 400: `Error decoding JWT Token`, 403: `Not authenticated`, @@ -110,12 +119,18 @@ export class BucketPermissionsService { * Get all permissions for a bucket. * List all the bucket permissions for the given bucket. * + * Permission "bucket_permission:read" required if current user is owner of the bucket, + * otherwise "bucket_permission:read_any" required. * @param bucketName Name of bucket + * @param permissionTypes Type of Bucket Permissions to fetch + * @param permissionStatus Status of Bucket Permissions to fetch * @returns BucketPermissionOut Successful Response * @throws ApiError */ - public static bucketPermissionsListPermissionsPerBucket( + public static bucketPermissionListPermissionsPerBucket( bucketName: string, + permissionTypes?: (Array<Permission> | null), + permissionStatus?: (PermissionStatus | null), ): CancelablePromise<Array<BucketPermissionOut>> { return __request(OpenAPI, { method: 'GET', @@ -123,6 +138,10 @@ export class BucketPermissionsService { path: { 'bucket_name': bucketName, }, + query: { + 'permission_types': permissionTypes, + 'permission_status': permissionStatus, + }, errors: { 400: `Error decoding JWT Token`, 403: `Not authenticated`, @@ -136,12 +155,18 @@ export class BucketPermissionsService { * Get all permissions for a user. * List all the bucket permissions for the given user. * + * Permission "bucket_permission:read" required if current user is the target the bucket permission, + * otherwise "bucket_permission:read_any" required. * @param uid UID of a user + * @param permissionTypes Type of Bucket Permissions to fetch + * @param permissionStatus Status of Bucket Permissions to fetch * @returns BucketPermissionOut Successful Response * @throws ApiError */ - public static bucketPermissionsListPermissionsPerUser( + public static bucketPermissionListPermissionsPerUser( uid: string, + permissionTypes?: (Array<Permission> | null), + permissionStatus?: (PermissionStatus | null), ): CancelablePromise<Array<BucketPermissionOut>> { return __request(OpenAPI, { method: 'GET', @@ -149,6 +174,10 @@ export class BucketPermissionsService { path: { 'uid': uid, }, + query: { + 'permission_types': permissionTypes, + 'permission_status': permissionStatus, + }, errors: { 400: `Error decoding JWT Token`, 403: `Not authenticated`, @@ -162,16 +191,17 @@ export class BucketPermissionsService { * Create a permission. * Create a permission for a bucket and user. * + * Permission "bucket_permission:create" required. * @param requestBody * @returns BucketPermissionOut Successful Response * @throws ApiError */ - public static bucketPermissionsCreatePermission( + public static bucketPermissionCreatePermission( requestBody: BucketPermissionIn, ): CancelablePromise<BucketPermissionOut> { return __request(OpenAPI, { method: 'POST', - url: '/permissions/', + url: '/permissions', body: requestBody, mediaType: 'application/json', errors: { diff --git a/src/client/services/BucketService.ts b/src/client/s3proxy/services/BucketService.ts similarity index 60% rename from src/client/services/BucketService.ts rename to src/client/s3proxy/services/BucketService.ts index d0b4457b9d0f110dcf92600a17780e821b60538c..d51b66804563285d8e72e555076407af7ee381d9 100644 --- a/src/client/services/BucketService.ts +++ b/src/client/s3proxy/services/BucketService.ts @@ -1,9 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ import type { BucketIn } from '../models/BucketIn'; import type { BucketOut } from '../models/BucketOut'; -import type { S3ObjectMetaInformation } from '../models/S3ObjectMetaInformation'; +import type { BucketType } from '../models/BucketType'; import type { CancelablePromise } from '../core/CancelablePromise'; import { OpenAPI } from '../core/OpenAPI'; @@ -13,19 +14,30 @@ export class BucketService { /** * List buckets of user - * List the buckets of the current user where the user has READ permissions for. + * List all the buckets in the system or of the desired user where the user has READ permissions for. * + * Permission "bucket:read" required. + * @param user UID of the user for whom to fetch the buckets for. Permission 'bucket:read_any' required if current user is not the target. + * @param bucketType Type of the bucket to get. Ignored when `user` parameter not set * @returns BucketOut Successful Response * @throws ApiError */ - public static bucketListBuckets(): CancelablePromise<Array<BucketOut>> { + public static bucketListBuckets( + user?: (string | null), + bucketType?: BucketType, + ): CancelablePromise<Array<BucketOut>> { return __request(OpenAPI, { method: 'GET', - url: '/buckets/', + url: '/buckets', + query: { + 'user': user, + 'bucket_type': bucketType, + }, errors: { 400: `Error decoding JWT Token`, 403: `Not authenticated`, 404: `Entity not Found`, + 422: `Validation Error`, }, }); } @@ -35,8 +47,10 @@ export class BucketService { * Create a bucket for the current user. * * The name of the bucket has some constraints. - * For more information see the [Ceph documentation](https://docs.ceph.com/en/quincy/radosgw/s3/bucketops/#constraints) + * For more information see the + * [Ceph documentation](https://docs.ceph.com/en/quincy/radosgw/s3/bucketops/#constraints) * + * Permission "bucket:create" required. * @param requestBody * @returns BucketOut Successful Response * @throws ApiError @@ -46,7 +60,7 @@ export class BucketService { ): CancelablePromise<BucketOut> { return __request(OpenAPI, { method: 'POST', - url: '/buckets/', + url: '/buckets', body: requestBody, mediaType: 'application/json', errors: { @@ -62,6 +76,8 @@ export class BucketService { * Get a bucket by its name * Get a bucket by its name if the current user has READ permissions for the bucket. * + * Permission "bucket:read" required if the current user is the owner of the bucket, + * otherwise "bucket:read_any" required. * @param bucketName Name of bucket * @returns BucketOut Successful Response * @throws ApiError @@ -88,6 +104,8 @@ export class BucketService { * Delete a bucket * Delete a bucket by its name. Only the owner of the bucket can delete the bucket. * + * Permission "bucket:delete" required if the current user is the owner of the bucket, + * otherwise "bucket:delete_any" required. * @param bucketName Name of bucket * @param forceDelete Delete even non-empty bucket * @returns void @@ -115,59 +133,4 @@ export class BucketService { }); } - /** - * Get the metadata of the objects in the bucket - * Get the metadata of the objects in the bucket. - * - * @param bucketName Name of bucket - * @returns S3ObjectMetaInformation Successful Response - * @throws ApiError - */ - public static objectGetBucketObjects( - bucketName: string, - ): CancelablePromise<Array<S3ObjectMetaInformation>> { - return __request(OpenAPI, { - method: 'GET', - url: '/buckets/{bucket_name}/objects', - path: { - 'bucket_name': bucketName, - }, - errors: { - 400: `Error decoding JWT Token`, - 403: `Not authenticated`, - 404: `Entity not Found`, - 422: `Validation Error`, - }, - }); - } - - /** - * Get the metadata about a specific object - * Get the metadata of a specific object in a bucket. - * - * @param objectPath - * @param bucketName Name of bucket - * @returns S3ObjectMetaInformation Successful Response - * @throws ApiError - */ - public static objectGetBucketObject( - objectPath: string, - bucketName: string, - ): CancelablePromise<S3ObjectMetaInformation> { - return __request(OpenAPI, { - method: 'GET', - url: '/buckets/{bucket_name}/objects/{object_path}', - path: { - 'object_path': objectPath, - 'bucket_name': bucketName, - }, - errors: { - 400: `Error decoding JWT Token`, - 403: `Not authenticated`, - 404: `Entity not Found`, - 422: `Validation Error`, - }, - }); - } - } diff --git a/src/client/services/KeyService.ts b/src/client/s3proxy/services/S3KeyService.ts similarity index 86% rename from src/client/services/KeyService.ts rename to src/client/s3proxy/services/S3KeyService.ts index 26e68c0300da2bbd1a25b544ba4a4666854bec33..c8e048bdc22fbbd683259c5850045063938a7aee 100644 --- a/src/client/services/KeyService.ts +++ b/src/client/s3proxy/services/S3KeyService.ts @@ -1,3 +1,4 @@ +/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ @@ -7,17 +8,18 @@ import type { CancelablePromise } from '../core/CancelablePromise'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; -export class KeyService { +export class S3KeyService { /** * Get the S3 Access keys from a user * Get all the S3 Access keys for a specific user. * + * Permission "s3_key:list" required. * @param uid UID of a user * @returns S3Key Successful Response * @throws ApiError */ - public static keyGetUserKeys( + public static s3KeyGetUserKeys( uid: string, ): CancelablePromise<Array<S3Key>> { return __request(OpenAPI, { @@ -39,11 +41,12 @@ export class KeyService { * Create a Access key for a user * Create a S3 Access key for a specific user. * + * Permission "s3_key:create" required. * @param uid UID of a user * @returns S3Key Successful Response * @throws ApiError */ - public static keyCreateUserKey( + public static s3KeyCreateUserKey( uid: string, ): CancelablePromise<S3Key> { return __request(OpenAPI, { @@ -65,12 +68,13 @@ export class KeyService { * Get a specific S3 Access key from a user * Get a specific S3 Access Key for a specific user. * + * Permission "s3_key:read" required. * @param accessId ID of the S3 access key * @param uid UID of a user * @returns S3Key Successful Response * @throws ApiError */ - public static keyGetUserKey( + public static s3KeyGetUserKey( accessId: string, uid: string, ): CancelablePromise<S3Key> { @@ -94,12 +98,13 @@ export class KeyService { * Delete a specific S3 Access key from a user * Delete a specific S3 Access key for a specific user. * + * Permission "s3_key:delete" required if the current user is the target, otherwise "s3_key:delete_any" required. * @param accessId ID of the S3 access key * @param uid UID of a user * @returns void * @throws ApiError */ - public static keyDeleteUserKey( + public static s3KeyDeleteUserKey( accessId: string, uid: string, ): CancelablePromise<void> { diff --git a/src/client/services/MiscellaneousService.ts b/src/client/services/MiscellaneousService.ts deleted file mode 100644 index b8b0fc0229ea08bc8e78cf9f78ee2dd06ad1051a..0000000000000000000000000000000000000000 --- a/src/client/services/MiscellaneousService.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class MiscellaneousService { - - /** - * Health Check - * Check the health of the service. - * - * @returns any Service Health is OK - * @throws ApiError - */ - public static miscellaneousHealthCheck(): CancelablePromise<any> { - return __request(OpenAPI, { - method: 'GET', - url: '/health', - errors: { - 500: `Service Health is not OK`, - }, - }); - } - -} diff --git a/src/client/services/ObjectService.ts b/src/client/services/ObjectService.ts deleted file mode 100644 index 84598b91af3530fd612d76dca2a9233150711b6b..0000000000000000000000000000000000000000 --- a/src/client/services/ObjectService.ts +++ /dev/null @@ -1,67 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { S3ObjectMetaInformation } from '../models/S3ObjectMetaInformation'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class ObjectService { - - /** - * Get the metadata of the objects in the bucket - * Get the metadata of the objects in the bucket. - * - * @param bucketName Name of bucket - * @returns S3ObjectMetaInformation Successful Response - * @throws ApiError - */ - public static objectGetBucketObjects( - bucketName: string, - ): CancelablePromise<Array<S3ObjectMetaInformation>> { - return __request(OpenAPI, { - method: 'GET', - url: '/buckets/{bucket_name}/objects', - path: { - 'bucket_name': bucketName, - }, - errors: { - 400: `Error decoding JWT Token`, - 403: `Not authenticated`, - 404: `Entity not Found`, - 422: `Validation Error`, - }, - }); - } - - /** - * Get the metadata about a specific object - * Get the metadata of a specific object in a bucket. - * - * @param objectPath - * @param bucketName Name of bucket - * @returns S3ObjectMetaInformation Successful Response - * @throws ApiError - */ - public static objectGetBucketObject( - objectPath: string, - bucketName: string, - ): CancelablePromise<S3ObjectMetaInformation> { - return __request(OpenAPI, { - method: 'GET', - url: '/buckets/{bucket_name}/objects/{object_path}', - path: { - 'object_path': objectPath, - 'bucket_name': bucketName, - }, - errors: { - 400: `Error decoding JWT Token`, - 403: `Not authenticated`, - 404: `Entity not Found`, - 422: `Validation Error`, - }, - }); - } - -} diff --git a/src/client/services/UserService.ts b/src/client/services/UserService.ts deleted file mode 100644 index a30dde25b66c58ddfce2fbe002865411a38ac594..0000000000000000000000000000000000000000 --- a/src/client/services/UserService.ts +++ /dev/null @@ -1,194 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { S3Key } from '../models/S3Key'; -import type { User } from '../models/User'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class UserService { - - /** - * Get the logged in user - * Return the user associated with the used JWT. - * - * @returns User Successful Response - * @throws ApiError - */ - public static userGetLoggedInUser(): CancelablePromise<User> { - return __request(OpenAPI, { - method: 'GET', - url: '/users/me', - errors: { - 400: `Error decoding JWT Token`, - 403: `Not authenticated`, - 404: `Entity not Found`, - }, - }); - } - - /** - * Search for users by their name - * Return the users that have a specific substring in their name. - * - * @param nameLike - * @returns User Successful Response - * @throws ApiError - */ - public static userSearchUsers( - nameLike: string, - ): CancelablePromise<Array<User>> { - return __request(OpenAPI, { - method: 'GET', - url: '/users/', - query: { - 'name_like': nameLike, - }, - errors: { - 400: `Error decoding JWT Token`, - 403: `Not authenticated`, - 404: `Entity not Found`, - 422: `Validation Error`, - }, - }); - } - - /** - * Get a user by its uid - * Return the user with the specific uid. A user can only view himself. - * - * @param uid UID of a user - * @returns User Successful Response - * @throws ApiError - */ - public static userGetUser( - uid: string, - ): CancelablePromise<User> { - return __request(OpenAPI, { - method: 'GET', - url: '/users/{uid}', - path: { - 'uid': uid, - }, - errors: { - 400: `Error decoding JWT Token`, - 403: `Not authenticated`, - 404: `Entity not Found`, - 422: `Validation Error`, - }, - }); - } - - /** - * Get the S3 Access keys from a user - * Get all the S3 Access keys for a specific user. - * - * @param uid UID of a user - * @returns S3Key Successful Response - * @throws ApiError - */ - public static keyGetUserKeys( - uid: string, - ): CancelablePromise<Array<S3Key>> { - return __request(OpenAPI, { - method: 'GET', - url: '/users/{uid}/keys', - path: { - 'uid': uid, - }, - errors: { - 400: `Error decoding JWT Token`, - 403: `Not authenticated`, - 404: `Entity not Found`, - 422: `Validation Error`, - }, - }); - } - - /** - * Create a Access key for a user - * Create a S3 Access key for a specific user. - * - * @param uid UID of a user - * @returns S3Key Successful Response - * @throws ApiError - */ - public static keyCreateUserKey( - uid: string, - ): CancelablePromise<S3Key> { - return __request(OpenAPI, { - method: 'POST', - url: '/users/{uid}/keys', - path: { - 'uid': uid, - }, - errors: { - 400: `Error decoding JWT Token`, - 403: `Not authenticated`, - 404: `Entity not Found`, - 422: `Validation Error`, - }, - }); - } - - /** - * Get a specific S3 Access key from a user - * Get a specific S3 Access Key for a specific user. - * - * @param accessId ID of the S3 access key - * @param uid UID of a user - * @returns S3Key Successful Response - * @throws ApiError - */ - public static keyGetUserKey( - accessId: string, - uid: string, - ): CancelablePromise<S3Key> { - return __request(OpenAPI, { - method: 'GET', - url: '/users/{uid}/keys/{access_id}', - path: { - 'access_id': accessId, - 'uid': uid, - }, - errors: { - 400: `Error decoding JWT Token`, - 403: `Not authenticated`, - 404: `Entity not Found`, - 422: `Validation Error`, - }, - }); - } - - /** - * Delete a specific S3 Access key from a user - * Delete a specific S3 Access key for a specific user. - * - * @param accessId ID of the S3 access key - * @param uid UID of a user - * @returns void - * @throws ApiError - */ - public static keyDeleteUserKey( - accessId: string, - uid: string, - ): CancelablePromise<void> { - return __request(OpenAPI, { - method: 'DELETE', - url: '/users/{uid}/keys/{access_id}', - path: { - 'access_id': accessId, - 'uid': uid, - }, - errors: { - 400: `Error decoding JWT Token`, - 403: `Not authenticated`, - 404: `Entity not Found`, - 422: `Validation Error`, - }, - }); - } - -} diff --git a/src/client/workflow/core/ApiError.ts b/src/client/workflow/core/ApiError.ts new file mode 100644 index 0000000000000000000000000000000000000000..d6b8fcc3ad0b6b2bdf1aa4df97ec598e64995648 --- /dev/null +++ b/src/client/workflow/core/ApiError.ts @@ -0,0 +1,25 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiResult } from './ApiResult'; + +export class ApiError extends Error { + public readonly url: string; + public readonly status: number; + public readonly statusText: string; + public readonly body: any; + public readonly request: ApiRequestOptions; + + constructor(request: ApiRequestOptions, response: ApiResult, message: string) { + super(message); + + this.name = 'ApiError'; + this.url = response.url; + this.status = response.status; + this.statusText = response.statusText; + this.body = response.body; + this.request = request; + } +} diff --git a/src/client/workflow/core/ApiRequestOptions.ts b/src/client/workflow/core/ApiRequestOptions.ts new file mode 100644 index 0000000000000000000000000000000000000000..c19adcc94dc5f015865368d6d64751de5c243aa3 --- /dev/null +++ b/src/client/workflow/core/ApiRequestOptions.ts @@ -0,0 +1,17 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type ApiRequestOptions = { + readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH'; + readonly url: string; + readonly path?: Record<string, any>; + readonly cookies?: Record<string, any>; + readonly headers?: Record<string, any>; + readonly query?: Record<string, any>; + readonly formData?: Record<string, any>; + readonly body?: any; + readonly mediaType?: string; + readonly responseHeader?: string; + readonly errors?: Record<number, string>; +}; diff --git a/src/client/workflow/core/ApiResult.ts b/src/client/workflow/core/ApiResult.ts new file mode 100644 index 0000000000000000000000000000000000000000..ad8fef2bc334c2aedf5c043896fd394229453ff0 --- /dev/null +++ b/src/client/workflow/core/ApiResult.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type ApiResult = { + readonly url: string; + readonly ok: boolean; + readonly status: number; + readonly statusText: string; + readonly body: any; +}; diff --git a/src/client/workflow/core/CancelablePromise.ts b/src/client/workflow/core/CancelablePromise.ts new file mode 100644 index 0000000000000000000000000000000000000000..55fef8517238d2dab7478598eefca72e657b9fb5 --- /dev/null +++ b/src/client/workflow/core/CancelablePromise.ts @@ -0,0 +1,131 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export class CancelError extends Error { + + constructor(message: string) { + super(message); + this.name = 'CancelError'; + } + + public get isCancelled(): boolean { + return true; + } +} + +export interface OnCancel { + readonly isResolved: boolean; + readonly isRejected: boolean; + readonly isCancelled: boolean; + + (cancelHandler: () => void): void; +} + +export class CancelablePromise<T> implements Promise<T> { + #isResolved: boolean; + #isRejected: boolean; + #isCancelled: boolean; + readonly #cancelHandlers: (() => void)[]; + readonly #promise: Promise<T>; + #resolve?: (value: T | PromiseLike<T>) => void; + #reject?: (reason?: any) => void; + + constructor( + executor: ( + resolve: (value: T | PromiseLike<T>) => void, + reject: (reason?: any) => void, + onCancel: OnCancel + ) => void + ) { + this.#isResolved = false; + this.#isRejected = false; + this.#isCancelled = false; + this.#cancelHandlers = []; + this.#promise = new Promise<T>((resolve, reject) => { + this.#resolve = resolve; + this.#reject = reject; + + const onResolve = (value: T | PromiseLike<T>): void => { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#isResolved = true; + this.#resolve?.(value); + }; + + const onReject = (reason?: any): void => { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#isRejected = true; + this.#reject?.(reason); + }; + + const onCancel = (cancelHandler: () => void): void => { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#cancelHandlers.push(cancelHandler); + }; + + Object.defineProperty(onCancel, 'isResolved', { + get: (): boolean => this.#isResolved, + }); + + Object.defineProperty(onCancel, 'isRejected', { + get: (): boolean => this.#isRejected, + }); + + Object.defineProperty(onCancel, 'isCancelled', { + get: (): boolean => this.#isCancelled, + }); + + return executor(onResolve, onReject, onCancel as OnCancel); + }); + } + + get [Symbol.toStringTag]() { + return "Cancellable Promise"; + } + + public then<TResult1 = T, TResult2 = never>( + onFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null, + onRejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null + ): Promise<TResult1 | TResult2> { + return this.#promise.then(onFulfilled, onRejected); + } + + public catch<TResult = never>( + onRejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null + ): Promise<T | TResult> { + return this.#promise.catch(onRejected); + } + + public finally(onFinally?: (() => void) | null): Promise<T> { + return this.#promise.finally(onFinally); + } + + public cancel(): void { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#isCancelled = true; + if (this.#cancelHandlers.length) { + try { + for (const cancelHandler of this.#cancelHandlers) { + cancelHandler(); + } + } catch (error) { + console.warn('Cancellation threw an error', error); + return; + } + } + this.#cancelHandlers.length = 0; + this.#reject?.(new CancelError('Request aborted')); + } + + public get isCancelled(): boolean { + return this.#isCancelled; + } +} diff --git a/src/client/workflow/core/OpenAPI.ts b/src/client/workflow/core/OpenAPI.ts new file mode 100644 index 0000000000000000000000000000000000000000..af264be25a464af3a2b3dcc57232c87766ac0180 --- /dev/null +++ b/src/client/workflow/core/OpenAPI.ts @@ -0,0 +1,32 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ApiRequestOptions } from './ApiRequestOptions'; + +type Resolver<T> = (options: ApiRequestOptions) => Promise<T>; +type Headers = Record<string, string>; + +export type OpenAPIConfig = { + BASE: string; + VERSION: string; + WITH_CREDENTIALS: boolean; + CREDENTIALS: 'include' | 'omit' | 'same-origin'; + TOKEN?: string | Resolver<string> | undefined; + USERNAME?: string | Resolver<string> | undefined; + PASSWORD?: string | Resolver<string> | undefined; + HEADERS?: Headers | Resolver<Headers> | undefined; + ENCODE_PATH?: ((path: string) => string) | undefined; +}; + +export const OpenAPI: OpenAPIConfig = { + BASE: '/api/workflow-service', + VERSION: '1.0.0', + WITH_CREDENTIALS: false, + CREDENTIALS: 'include', + TOKEN: undefined, + USERNAME: undefined, + PASSWORD: undefined, + HEADERS: undefined, + ENCODE_PATH: undefined, +}; diff --git a/src/client/workflow/core/request.ts b/src/client/workflow/core/request.ts new file mode 100644 index 0000000000000000000000000000000000000000..1142d43219797c94e09f35ba83a9f5441892ddd2 --- /dev/null +++ b/src/client/workflow/core/request.ts @@ -0,0 +1,319 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import axios from 'axios'; +import type { AxiosError, AxiosRequestConfig, AxiosResponse, AxiosInstance } from 'axios'; +import FormData from 'form-data'; + +import { ApiError } from './ApiError'; +import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiResult } from './ApiResult'; +import { CancelablePromise } from './CancelablePromise'; +import type { OnCancel } from './CancelablePromise'; +import type { OpenAPIConfig } from './OpenAPI'; + +export const isDefined = <T>(value: T | null | undefined): value is Exclude<T, null | undefined> => { + return value !== undefined && value !== null; +}; + +export const isString = (value: any): value is string => { + return typeof value === 'string'; +}; + +export const isStringWithValue = (value: any): value is string => { + return isString(value) && value !== ''; +}; + +export const isBlob = (value: any): value is Blob => { + return ( + typeof value === 'object' && + typeof value.type === 'string' && + typeof value.stream === 'function' && + typeof value.arrayBuffer === 'function' && + typeof value.constructor === 'function' && + typeof value.constructor.name === 'string' && + /^(Blob|File)$/.test(value.constructor.name) && + /^(Blob|File)$/.test(value[Symbol.toStringTag]) + ); +}; + +export const isFormData = (value: any): value is FormData => { + return value instanceof FormData; +}; + +export const isSuccess = (status: number): boolean => { + return status >= 200 && status < 300; +}; + +export const base64 = (str: string): string => { + try { + return btoa(str); + } catch (err) { + // @ts-ignore + return Buffer.from(str).toString('base64'); + } +}; + +export const getQueryString = (params: Record<string, any>): string => { + const qs: string[] = []; + + const append = (key: string, value: any) => { + qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`); + }; + + const process = (key: string, value: any) => { + if (isDefined(value)) { + if (Array.isArray(value)) { + value.forEach(v => { + process(key, v); + }); + } else if (typeof value === 'object') { + Object.entries(value).forEach(([k, v]) => { + process(`${key}[${k}]`, v); + }); + } else { + append(key, value); + } + } + }; + + Object.entries(params).forEach(([key, value]) => { + process(key, value); + }); + + if (qs.length > 0) { + return `?${qs.join('&')}`; + } + + return ''; +}; + +const getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => { + const encoder = config.ENCODE_PATH || encodeURI; + + const path = options.url + .replace('{api-version}', config.VERSION) + .replace(/{(.*?)}/g, (substring: string, group: string) => { + if (options.path?.hasOwnProperty(group)) { + return encoder(String(options.path[group])); + } + return substring; + }); + + const url = `${config.BASE}${path}`; + if (options.query) { + return `${url}${getQueryString(options.query)}`; + } + return url; +}; + +export const getFormData = (options: ApiRequestOptions): FormData | undefined => { + if (options.formData) { + const formData = new FormData(); + + const process = (key: string, value: any) => { + if (isString(value) || isBlob(value)) { + formData.append(key, value); + } else { + formData.append(key, JSON.stringify(value)); + } + }; + + Object.entries(options.formData) + .filter(([_, value]) => isDefined(value)) + .forEach(([key, value]) => { + if (Array.isArray(value)) { + value.forEach(v => process(key, v)); + } else { + process(key, value); + } + }); + + return formData; + } + return undefined; +}; + +type Resolver<T> = (options: ApiRequestOptions) => Promise<T>; + +export const resolve = async <T>(options: ApiRequestOptions, resolver?: T | Resolver<T>): Promise<T | undefined> => { + if (typeof resolver === 'function') { + return (resolver as Resolver<T>)(options); + } + return resolver; +}; + +export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions, formData?: FormData): Promise<Record<string, string>> => { + const token = await resolve(options, config.TOKEN); + const username = await resolve(options, config.USERNAME); + const password = await resolve(options, config.PASSWORD); + const additionalHeaders = await resolve(options, config.HEADERS); + const formHeaders = typeof formData?.getHeaders === 'function' && formData?.getHeaders() || {} + + const headers = Object.entries({ + Accept: 'application/json', + ...additionalHeaders, + ...options.headers, + ...formHeaders, + }) + .filter(([_, value]) => isDefined(value)) + .reduce((headers, [key, value]) => ({ + ...headers, + [key]: String(value), + }), {} as Record<string, string>); + + if (isStringWithValue(token)) { + headers['Authorization'] = `Bearer ${token}`; + } + + if (isStringWithValue(username) && isStringWithValue(password)) { + const credentials = base64(`${username}:${password}`); + headers['Authorization'] = `Basic ${credentials}`; + } + + if (options.body) { + if (options.mediaType) { + headers['Content-Type'] = options.mediaType; + } else if (isBlob(options.body)) { + headers['Content-Type'] = options.body.type || 'application/octet-stream'; + } else if (isString(options.body)) { + headers['Content-Type'] = 'text/plain'; + } else if (!isFormData(options.body)) { + headers['Content-Type'] = 'application/json'; + } + } + + return headers; +}; + +export const getRequestBody = (options: ApiRequestOptions): any => { + if (options.body) { + return options.body; + } + return undefined; +}; + +export const sendRequest = async <T>( + config: OpenAPIConfig, + options: ApiRequestOptions, + url: string, + body: any, + formData: FormData | undefined, + headers: Record<string, string>, + onCancel: OnCancel, + axiosClient: AxiosInstance +): Promise<AxiosResponse<T>> => { + const source = axios.CancelToken.source(); + + const requestConfig: AxiosRequestConfig = { + url, + headers, + data: body ?? formData, + method: options.method, + withCredentials: config.WITH_CREDENTIALS, + cancelToken: source.token, + }; + + onCancel(() => source.cancel('The user aborted a request.')); + + try { + return await axiosClient.request(requestConfig); + } catch (error) { + const axiosError = error as AxiosError<T>; + if (axiosError.response) { + return axiosError.response; + } + throw error; + } +}; + +export const getResponseHeader = (response: AxiosResponse<any>, responseHeader?: string): string | undefined => { + if (responseHeader) { + const content = response.headers[responseHeader]; + if (isString(content)) { + return content; + } + } + return undefined; +}; + +export const getResponseBody = (response: AxiosResponse<any>): any => { + if (response.status !== 204) { + return response.data; + } + return undefined; +}; + +export const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => { + const errors: Record<number, string> = { + 400: 'Bad Request', + 401: 'Unauthorized', + 403: 'Forbidden', + 404: 'Not Found', + 500: 'Internal Server Error', + 502: 'Bad Gateway', + 503: 'Service Unavailable', + ...options.errors, + } + + const error = errors[result.status]; + if (error) { + throw new ApiError(options, result, error); + } + + if (!result.ok) { + const errorStatus = result.status ?? 'unknown'; + const errorStatusText = result.statusText ?? 'unknown'; + const errorBody = (() => { + try { + return JSON.stringify(result.body, null, 2); + } catch (e) { + return undefined; + } + })(); + + throw new ApiError(options, result, + `Generic Error: status: ${errorStatus}; status text: ${errorStatusText}; body: ${errorBody}` + ); + } +}; + +/** + * Request method + * @param config The OpenAPI configuration object + * @param options The request options from the service + * @param axiosClient The axios client instance to use + * @returns CancelablePromise<T> + * @throws ApiError + */ +export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions, axiosClient: AxiosInstance = axios): CancelablePromise<T> => { + return new CancelablePromise(async (resolve, reject, onCancel) => { + try { + const url = getUrl(config, options); + const formData = getFormData(options); + const body = getRequestBody(options); + const headers = await getHeaders(config, options, formData); + + if (!onCancel.isCancelled) { + const response = await sendRequest<T>(config, options, url, body, formData, headers, onCancel, axiosClient); + const responseBody = getResponseBody(response); + const responseHeader = getResponseHeader(response, options.responseHeader); + + const result: ApiResult = { + url, + ok: isSuccess(response.status), + status: response.status, + statusText: response.statusText, + body: responseHeader ?? responseBody, + }; + + catchErrorCodes(options, result); + + resolve(result.body); + } + } catch (error) { + reject(error); + } + }); +}; diff --git a/src/client/workflow/index.ts b/src/client/workflow/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..6d265a31eea81f607b44b43bb9597752591803a5 --- /dev/null +++ b/src/client/workflow/index.ts @@ -0,0 +1,37 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export { ApiError } from './core/ApiError'; +export { CancelablePromise, CancelError } from './core/CancelablePromise'; +export { OpenAPI } from './core/OpenAPI'; +export type { OpenAPIConfig } from './core/OpenAPI'; + +export type { AnonymizedWorkflowExecution } from './models/AnonymizedWorkflowExecution'; +export type { Body_Workflow_Version_upload_workflow_version_icon } from './models/Body_Workflow_Version_upload_workflow_version_icon'; +export type { DevWorkflowExecutionIn } from './models/DevWorkflowExecutionIn'; +export { DocumentationEnum } from './models/DocumentationEnum'; +export type { ErrorDetail } from './models/ErrorDetail'; +export type { HTTPValidationError } from './models/HTTPValidationError'; +export type { IconUpdateOut } from './models/IconUpdateOut'; +export { Status } from './models/Status'; +export type { ValidationError } from './models/ValidationError'; +export type { WorkflowCredentialsIn } from './models/WorkflowCredentialsIn'; +export type { WorkflowCredentialsOut } from './models/WorkflowCredentialsOut'; +export type { WorkflowExecutionIn } from './models/WorkflowExecutionIn'; +export type { WorkflowExecutionOut } from './models/WorkflowExecutionOut'; +export { WorkflowExecutionStatus } from './models/WorkflowExecutionStatus'; +export type { WorkflowIn } from './models/WorkflowIn'; +export type { WorkflowModeIn } from './models/WorkflowModeIn'; +export type { WorkflowModeOut } from './models/WorkflowModeOut'; +export type { WorkflowOut } from './models/WorkflowOut'; +export type { WorkflowStatistic } from './models/WorkflowStatistic'; +export type { WorkflowUpdate } from './models/WorkflowUpdate'; +export type { WorkflowVersion } from './models/WorkflowVersion'; +export type { WorkflowVersionStatus } from './models/WorkflowVersionStatus'; + +export { WorkflowService } from './services/WorkflowService'; +export { WorkflowCredentialsService } from './services/WorkflowCredentialsService'; +export { WorkflowExecutionService } from './services/WorkflowExecutionService'; +export { WorkflowModeService } from './services/WorkflowModeService'; +export { WorkflowVersionService } from './services/WorkflowVersionService'; diff --git a/src/client/workflow/models/AnonymizedWorkflowExecution.ts b/src/client/workflow/models/AnonymizedWorkflowExecution.ts new file mode 100644 index 0000000000000000000000000000000000000000..eb4085fe63360b4b3018cf3e85a097f9679422ed --- /dev/null +++ b/src/client/workflow/models/AnonymizedWorkflowExecution.ts @@ -0,0 +1,42 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { WorkflowExecutionStatus } from './WorkflowExecutionStatus'; + +export type AnonymizedWorkflowExecution = { + /** + * ID of the workflow execution + */ + workflow_execution_id: string; + /** + * Anonymized user ID of the user who ran the workflow execution + */ + pseudo_uid: string; + /** + * ID of the workflow mode this workflow execution ran in + */ + workflow_mode_id?: (string | null); + /** + * Hash of the git commit + */ + git_commit_hash: string; + /** + * Day of the workflow execution + */ + started_at: string; + /** + * ID of the workflow + */ + workflow_id: string; + /** + * ID of developer of the workflow + */ + developer_id: string; + /** + * End status of the workflow execution + */ + status: WorkflowExecutionStatus; +}; + diff --git a/src/client/workflow/models/Body_Workflow_Version_upload_workflow_version_icon.ts b/src/client/workflow/models/Body_Workflow_Version_upload_workflow_version_icon.ts new file mode 100644 index 0000000000000000000000000000000000000000..208b0c24d5b34514fe1156aafeddabd72645a53c --- /dev/null +++ b/src/client/workflow/models/Body_Workflow_Version_upload_workflow_version_icon.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type Body_Workflow_Version_upload_workflow_version_icon = { + /** + * Optional Icon for the Workflow. + */ + icon: Blob; +}; + diff --git a/src/client/workflow/models/DevWorkflowExecutionIn.ts b/src/client/workflow/models/DevWorkflowExecutionIn.ts new file mode 100644 index 0000000000000000000000000000000000000000..e8c8a5268a58669f45acee40630ad7d6c1d9c21a --- /dev/null +++ b/src/client/workflow/models/DevWorkflowExecutionIn.ts @@ -0,0 +1,42 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { WorkflowModeIn } from './WorkflowModeIn'; + +export type DevWorkflowExecutionIn = { + /** + * Parameters for this workflow + */ + parameters: Record<string, any>; + /** + * S3 Path where to save logs and reports. If None, nothing will be uploaded. + */ + logs_s3_path?: (string | null); + /** + * S3 Path where to save provenance information. If None, nothing will be uploaded. + */ + provenance_s3_path?: (string | null); + /** + * S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded. + */ + debug_s3_path?: (string | null); + /** + * Hash of the git commit + */ + git_commit_hash: string; + /** + * URL to the Git repository belonging to this workflow + */ + repository_url: string; + /** + * Token to access the content git repository + */ + token?: (string | null); + /** + * Mode of the workflow with an alternative entrypoint + */ + mode?: (WorkflowModeIn | null); +}; + diff --git a/src/client/workflow/models/DocumentationEnum.ts b/src/client/workflow/models/DocumentationEnum.ts new file mode 100644 index 0000000000000000000000000000000000000000..1ae04856a01b1b0b6dfe8c550ec97720aaeb4cd6 --- /dev/null +++ b/src/client/workflow/models/DocumentationEnum.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export enum DocumentationEnum { + USAGE = 'usage', + INPUT = 'input', + OUTPUT = 'output', + CHANGELOG = 'changelog', + PARAMETER_SCHEMA = 'parameter_schema', +} diff --git a/src/client/workflow/models/ErrorDetail.ts b/src/client/workflow/models/ErrorDetail.ts new file mode 100644 index 0000000000000000000000000000000000000000..eba50ab9335b70df9b29cada4c54cf9ffaad10a4 --- /dev/null +++ b/src/client/workflow/models/ErrorDetail.ts @@ -0,0 +1,15 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +/** + * Schema for a error due to a rejected request. + */ +export type ErrorDetail = { + /** + * Detail about the occurred error + */ + detail: string; +}; + diff --git a/src/client/workflow/models/HTTPValidationError.ts b/src/client/workflow/models/HTTPValidationError.ts new file mode 100644 index 0000000000000000000000000000000000000000..c0bcc87cf7f3222638466bc2e5753ca1accf01f7 --- /dev/null +++ b/src/client/workflow/models/HTTPValidationError.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ValidationError } from './ValidationError'; + +export type HTTPValidationError = { + detail?: Array<ValidationError>; +}; + diff --git a/src/client/workflow/models/IconUpdateOut.ts b/src/client/workflow/models/IconUpdateOut.ts new file mode 100644 index 0000000000000000000000000000000000000000..0499796ef14433d99fae156f3508df5ed0db9984 --- /dev/null +++ b/src/client/workflow/models/IconUpdateOut.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type IconUpdateOut = { + /** + * URL to the uploaded icon + */ + icon_url: string; +}; + diff --git a/src/client/workflow/models/Status.ts b/src/client/workflow/models/Status.ts new file mode 100644 index 0000000000000000000000000000000000000000..8da66ea5e286d86b0f4d9d1c3b7bac8167d769ab --- /dev/null +++ b/src/client/workflow/models/Status.ts @@ -0,0 +1,14 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +/** + * Enumeration for the possible status of a workflow version. + */ +export enum Status { + CREATED = 'CREATED', + DENIED = 'DENIED', + PUBLISHED = 'PUBLISHED', + DEPRECATED = 'DEPRECATED', +} diff --git a/src/client/workflow/models/ValidationError.ts b/src/client/workflow/models/ValidationError.ts new file mode 100644 index 0000000000000000000000000000000000000000..18997ec72f4103731f38d915508522ba23ba8506 --- /dev/null +++ b/src/client/workflow/models/ValidationError.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type ValidationError = { + loc: Array<(string | number)>; + msg: string; + type: string; +}; + diff --git a/src/client/workflow/models/WorkflowCredentialsIn.ts b/src/client/workflow/models/WorkflowCredentialsIn.ts new file mode 100644 index 0000000000000000000000000000000000000000..37723a3e3a9384f04e6d52ecd6ac4f302d6ac304 --- /dev/null +++ b/src/client/workflow/models/WorkflowCredentialsIn.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type WorkflowCredentialsIn = { + /** + * Token to access the content git repository + */ + token: string; +}; + diff --git a/src/client/workflow/models/WorkflowCredentialsOut.ts b/src/client/workflow/models/WorkflowCredentialsOut.ts new file mode 100644 index 0000000000000000000000000000000000000000..8a447b4228303bd6e0204694408a131b9a15b0d2 --- /dev/null +++ b/src/client/workflow/models/WorkflowCredentialsOut.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type WorkflowCredentialsOut = { + /** + * Token to access the content git repository + */ + token?: (string | null); +}; + diff --git a/src/client/workflow/models/WorkflowExecutionIn.ts b/src/client/workflow/models/WorkflowExecutionIn.ts new file mode 100644 index 0000000000000000000000000000000000000000..3532aa80d246e34c0974e847894e043dfbc6b02d --- /dev/null +++ b/src/client/workflow/models/WorkflowExecutionIn.ts @@ -0,0 +1,36 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type WorkflowExecutionIn = { + /** + * Parameters for this workflow + */ + parameters: Record<string, any>; + /** + * S3 Path where to save logs and reports. If None, nothing will be uploaded. + */ + logs_s3_path?: (string | null); + /** + * S3 Path where to save provenance information. If None, nothing will be uploaded. + */ + provenance_s3_path?: (string | null); + /** + * S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded. + */ + debug_s3_path?: (string | null); + /** + * Workflow version git commit hash + */ + workflow_version_id: string; + /** + * Optional notes for this workflow execution + */ + notes?: (string | null); + /** + * ID of the workflow mode this workflow execution runs in + */ + mode?: (string | null); +}; + diff --git a/src/client/workflow/models/WorkflowExecutionOut.ts b/src/client/workflow/models/WorkflowExecutionOut.ts new file mode 100644 index 0000000000000000000000000000000000000000..a804c6ade04581facc1d0543e3fcc60a3a030803 --- /dev/null +++ b/src/client/workflow/models/WorkflowExecutionOut.ts @@ -0,0 +1,58 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { WorkflowExecutionStatus } from './WorkflowExecutionStatus'; + +export type WorkflowExecutionOut = { + /** + * Workflow version git commit hash + */ + workflow_version_id?: (string | null); + /** + * Optional notes for this workflow execution + */ + notes?: (string | null); + /** + * ID of the workflow mode this workflow execution runs in + */ + mode?: (string | null); + /** + * ID of the workflow execution + */ + execution_id: string; + /** + * UID of user who started the workflow + */ + user_id: string; + /** + * Start time of the workflow execution as UNIX timestamp + */ + start_time: number; + /** + * End time of the workflow execution as UNIX timestamp + */ + end_time?: (number | null); + /** + * Status of the workflow execution + */ + status: WorkflowExecutionStatus; + /** + * Id of the workflow + */ + workflow_id?: (string | null); + /** + * S3 Path where logs and reports are saved. + */ + logs_s3_path?: (string | null); + /** + * S3 Path where provenance information is saved. + */ + provenance_s3_path?: (string | null); + /** + * S3 Path where debug information from Nextflow is saved. + */ + debug_s3_path?: (string | null); +}; + diff --git a/src/client/workflow/models/WorkflowExecutionStatus.ts b/src/client/workflow/models/WorkflowExecutionStatus.ts new file mode 100644 index 0000000000000000000000000000000000000000..dee8c8fea4f0bbb84f2b8aaf69f626989e1639a6 --- /dev/null +++ b/src/client/workflow/models/WorkflowExecutionStatus.ts @@ -0,0 +1,16 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +/** + * Enumeration for the status on a workflow execution. + */ +export enum WorkflowExecutionStatus { + PENDING = 'PENDING', + SCHEDULED = 'SCHEDULED', + RUNNING = 'RUNNING', + CANCELED = 'CANCELED', + SUCCESS = 'SUCCESS', + ERROR = 'ERROR', +} diff --git a/src/client/workflow/models/WorkflowIn.ts b/src/client/workflow/models/WorkflowIn.ts new file mode 100644 index 0000000000000000000000000000000000000000..9367556e9ffa26da9b64044efbd577d24dc145f7 --- /dev/null +++ b/src/client/workflow/models/WorkflowIn.ts @@ -0,0 +1,38 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { WorkflowModeIn } from './WorkflowModeIn'; + +export type WorkflowIn = { + /** + * Short descriptive name of the workflow + */ + name: string; + /** + * Short description of the workflow + */ + short_description: string; + /** + * URL to the Git repository belonging to this workflow + */ + repository_url: string; + /** + * Hash of the git commit + */ + git_commit_hash: string; + /** + * Initial version of the Workflow. Should follow semantic versioning + */ + initial_version?: string; + /** + * Token to access the content git repository + */ + token?: (string | null); + /** + * List of modes with alternative entrypoint the new workflow has + */ + modes?: Array<WorkflowModeIn>; +}; + diff --git a/src/client/workflow/models/WorkflowModeIn.ts b/src/client/workflow/models/WorkflowModeIn.ts new file mode 100644 index 0000000000000000000000000000000000000000..a50b038c1abd7c60352b1526e164c652aa99e7df --- /dev/null +++ b/src/client/workflow/models/WorkflowModeIn.ts @@ -0,0 +1,20 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type WorkflowModeIn = { + /** + * Path to the alternative parameter schema + */ + schema_path: string; + /** + * Name of the process the workflow should start with. Argument to the parameter '-entry' + */ + entrypoint: string; + /** + * Name of the workflow mode + */ + name: string; +}; + diff --git a/src/client/workflow/models/WorkflowModeOut.ts b/src/client/workflow/models/WorkflowModeOut.ts new file mode 100644 index 0000000000000000000000000000000000000000..1d52e08bd2580b58af3b5204a6e6ebc1fa2d6ee8 --- /dev/null +++ b/src/client/workflow/models/WorkflowModeOut.ts @@ -0,0 +1,24 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type WorkflowModeOut = { + /** + * Path to the alternative parameter schema + */ + schema_path: string; + /** + * Name of the process the workflow should start with. Argument to the parameter '-entry' + */ + entrypoint: string; + /** + * Name of the workflow mode + */ + name: string; + /** + * ID of the workflow mode + */ + mode_id: string; +}; + diff --git a/src/client/workflow/models/WorkflowOut.ts b/src/client/workflow/models/WorkflowOut.ts new file mode 100644 index 0000000000000000000000000000000000000000..a3d055f5a99d8683b29183cfe42cf01b9903ad28 --- /dev/null +++ b/src/client/workflow/models/WorkflowOut.ts @@ -0,0 +1,38 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { WorkflowVersion } from './WorkflowVersion'; + +export type WorkflowOut = { + /** + * Short descriptive name of the workflow + */ + name: string; + /** + * Short description of the workflow + */ + short_description: string; + /** + * URL to the Git repository belonging to this workflow + */ + repository_url: string; + /** + * ID of the workflow + */ + workflow_id: string; + /** + * Versions of the workflow + */ + versions: Array<WorkflowVersion>; + /** + * ID of developer of the workflow + */ + developer_id: string; + /** + * Flag if the workflow is hosted in a private git repository + */ + private?: boolean; +}; + diff --git a/src/client/workflow/models/WorkflowStatistic.ts b/src/client/workflow/models/WorkflowStatistic.ts new file mode 100644 index 0000000000000000000000000000000000000000..4b7fbade791196f814a52cee40e8cca117ea8102 --- /dev/null +++ b/src/client/workflow/models/WorkflowStatistic.ts @@ -0,0 +1,16 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type WorkflowStatistic = { + /** + * Day of the datapoint + */ + day: string; + /** + * Number of started workflows on that day + */ + count: number; +}; + diff --git a/src/client/workflow/models/WorkflowUpdate.ts b/src/client/workflow/models/WorkflowUpdate.ts new file mode 100644 index 0000000000000000000000000000000000000000..6aa6f1874344aff94967d05ddd3958cd86726d71 --- /dev/null +++ b/src/client/workflow/models/WorkflowUpdate.ts @@ -0,0 +1,26 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { WorkflowModeIn } from './WorkflowModeIn'; + +export type WorkflowUpdate = { + /** + * Version of the Workflow. Should follow semantic versioning + */ + version: string; + /** + * Hash of the git commit + */ + git_commit_hash: string; + /** + * Add modes to the new workflow version + */ + append_modes?: Array<WorkflowModeIn>; + /** + * Delete modes for the new workflow version. + */ + delete_modes?: Array<string>; +}; + diff --git a/src/client/workflow/models/WorkflowVersion.ts b/src/client/workflow/models/WorkflowVersion.ts new file mode 100644 index 0000000000000000000000000000000000000000..26b656fb2a8edb63630ab92736f2f6c6b592a656 --- /dev/null +++ b/src/client/workflow/models/WorkflowVersion.ts @@ -0,0 +1,38 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { Status } from './Status'; + +export type WorkflowVersion = { + /** + * Status of the workflow version + */ + status: Status; + /** + * ID of the corresponding workflow + */ + workflow_id: string; + /** + * Version of the Workflow. Should follow semantic versioning + */ + version: string; + /** + * Hash of the git commit + */ + git_commit_hash: string; + /** + * URL of the icon for this workflow version + */ + icon_url?: (string | null); + /** + * Timestamp when the version was created as UNIX timestamp + */ + created_at: number; + /** + * Optional modes his workflow version has + */ + modes?: Array<string>; +}; + diff --git a/src/client/workflow/models/WorkflowVersionStatus.ts b/src/client/workflow/models/WorkflowVersionStatus.ts new file mode 100644 index 0000000000000000000000000000000000000000..0c66d1dd6b28229891c5c7d5ceed3eefab291c4e --- /dev/null +++ b/src/client/workflow/models/WorkflowVersionStatus.ts @@ -0,0 +1,14 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { Status } from './Status'; + +export type WorkflowVersionStatus = { + /** + * Status of the workflow version + */ + status: Status; +}; + diff --git a/src/client/workflow/services/WorkflowCredentialsService.ts b/src/client/workflow/services/WorkflowCredentialsService.ts new file mode 100644 index 0000000000000000000000000000000000000000..1f9f891efb06fa6cd1b4304e817b59ef954d6cd7 --- /dev/null +++ b/src/client/workflow/services/WorkflowCredentialsService.ts @@ -0,0 +1,99 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { WorkflowCredentialsIn } from '../models/WorkflowCredentialsIn'; +import type { WorkflowCredentialsOut } from '../models/WorkflowCredentialsOut'; + +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; + +export class WorkflowCredentialsService { + + /** + * Get the credentials of a workflow + * Get the credentials for the repository of a workflow. Only the developer of a workflow can do this. + * + * Permission "workflow:update" required. + * @param wid ID of a workflow + * @returns WorkflowCredentialsOut Successful Response + * @throws ApiError + */ + public static workflowCredentialsGetWorkflowCredentials( + wid: string, + ): CancelablePromise<WorkflowCredentialsOut> { + return __request(OpenAPI, { + method: 'GET', + url: '/workflows/{wid}/credentials', + path: { + 'wid': wid, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Update the credentials of a workflow + * Update the credentials for the repository of a workflow. + * + * Permission "workflow:update" required. + * @param wid ID of a workflow + * @param requestBody + * @returns any Successful Response + * @throws ApiError + */ + public static workflowCredentialsUpdateWorkflowCredentials( + wid: string, + requestBody: WorkflowCredentialsIn, + ): CancelablePromise<any> { + return __request(OpenAPI, { + method: 'PUT', + url: '/workflows/{wid}/credentials', + path: { + 'wid': wid, + }, + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Delete the credentials of a workflow + * Delete the credentials for the repository of a workflow. + * + * Permission "workflow:delete" required. + * @param wid ID of a workflow + * @returns void + * @throws ApiError + */ + public static workflowCredentialsDeleteWorkflowCredentials( + wid: string, + ): CancelablePromise<void> { + return __request(OpenAPI, { + method: 'DELETE', + url: '/workflows/{wid}/credentials', + path: { + 'wid': wid, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + +} diff --git a/src/client/workflow/services/WorkflowExecutionService.ts b/src/client/workflow/services/WorkflowExecutionService.ts new file mode 100644 index 0000000000000000000000000000000000000000..199ba7b7ac8000a30397d7136a0cc7bec8056c1d --- /dev/null +++ b/src/client/workflow/services/WorkflowExecutionService.ts @@ -0,0 +1,219 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { DevWorkflowExecutionIn } from '../models/DevWorkflowExecutionIn'; +import type { WorkflowExecutionIn } from '../models/WorkflowExecutionIn'; +import type { WorkflowExecutionOut } from '../models/WorkflowExecutionOut'; +import type { WorkflowExecutionStatus } from '../models/WorkflowExecutionStatus'; + +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; + +export class WorkflowExecutionService { + + /** + * Start a new workflow execution + * Start a new workflow execution. Workflow versions wit status `DEPRECATED` or `DENIED` can't be started. + * + * Permission "workflow_execution:start" required if workflow versions status is `PUBLISHED`, + * otherwise "workflow_execution:start_unpublished" required. + * @param requestBody + * @returns WorkflowExecutionOut Successful Response + * @throws ApiError + */ + public static workflowExecutionStartWorkflow( + requestBody: WorkflowExecutionIn, + ): CancelablePromise<WorkflowExecutionOut> { + return __request(OpenAPI, { + method: 'POST', + url: '/workflow_executions', + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Get all workflow executions + * Get all workflow executions. + * + * Permission "workflow_execution:list" required, if 'user_id' is the same as the current user, + * otherwise "workflow_execution:list_all" required. + * @param userId Filter for workflow executions by a user. If none, Permission 'workflow_execution:read_any' required. + * @param executionStatus Filter for status of workflow execution + * @param workflowVersionId Filter for workflow version + * @returns WorkflowExecutionOut Successful Response + * @throws ApiError + */ + public static workflowExecutionListWorkflowExecutions( + userId?: (string | null), + executionStatus?: (Array<WorkflowExecutionStatus> | null), + workflowVersionId?: (string | null), + ): CancelablePromise<Array<WorkflowExecutionOut>> { + return __request(OpenAPI, { + method: 'GET', + url: '/workflow_executions', + query: { + 'user_id': userId, + 'execution_status': executionStatus, + 'workflow_version_id': workflowVersionId, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Start a workflow execution with arbitrary git repository + * Start a new workflow execution from an arbitrary git repository. + * + * Permission "workflow:create" required. + * + * For private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed. + * + * For private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed. + * @param requestBody + * @returns WorkflowExecutionOut Successful Response + * @throws ApiError + */ + public static workflowExecutionStartArbitraryWorkflow( + requestBody: DevWorkflowExecutionIn, + ): CancelablePromise<WorkflowExecutionOut> { + return __request(OpenAPI, { + method: 'POST', + url: '/workflow_executions/arbitrary', + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Get a workflow execution + * Get a specific workflow execution. + * + * Permission "workflow_execution:read" required if the current user started the workflow execution, + * otherwise "workflow_execution:read_any" required. + * @param eid ID of a workflow execution. + * @returns WorkflowExecutionOut Successful Response + * @throws ApiError + */ + public static workflowExecutionGetWorkflowExecution( + eid: string, + ): CancelablePromise<WorkflowExecutionOut> { + return __request(OpenAPI, { + method: 'GET', + url: '/workflow_executions/{eid}', + path: { + 'eid': eid, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Delete a workflow execution + * Delete a specific workflow execution. + * + * Permission "workflow_execution:delete" required if the current user started the workflow execution, + * otherwise "workflow_execution:delete_any" required. + * @param eid ID of a workflow execution. + * @returns void + * @throws ApiError + */ + public static workflowExecutionDeleteWorkflowExecution( + eid: string, + ): CancelablePromise<void> { + return __request(OpenAPI, { + method: 'DELETE', + url: '/workflow_executions/{eid}', + path: { + 'eid': eid, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Get the parameters of a workflow execution + * Get the parameters of a specific workflow execution. + * + * Permission "workflow_execution:read" required if the current user started the workflow execution, + * otherwise "workflow_execution:read_any" required. + * @param eid ID of a workflow execution. + * @returns any Successful Response + * @throws ApiError + */ + public static workflowExecutionGetWorkflowExecutionParams( + eid: string, + ): CancelablePromise<Record<string, any>> { + return __request(OpenAPI, { + method: 'GET', + url: '/workflow_executions/{eid}/params', + path: { + 'eid': eid, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Cancel a workflow execution + * Cancel a running workflow execution. + * + * Permission "workflow_execution:cancel" required if the current user started the workflow execution, + * otherwise "workflow_execution:cancel_any" required. + * @param eid ID of a workflow execution. + * @returns void + * @throws ApiError + */ + public static workflowExecutionCancelWorkflowExecution( + eid: string, + ): CancelablePromise<void> { + return __request(OpenAPI, { + method: 'POST', + url: '/workflow_executions/{eid}/cancel', + path: { + 'eid': eid, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + +} diff --git a/src/client/workflow/services/WorkflowModeService.ts b/src/client/workflow/services/WorkflowModeService.ts new file mode 100644 index 0000000000000000000000000000000000000000..f5e1926c3ffbe233d8fe9027c91683a71fd23f94 --- /dev/null +++ b/src/client/workflow/services/WorkflowModeService.ts @@ -0,0 +1,40 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { WorkflowModeOut } from '../models/WorkflowModeOut'; + +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; + +export class WorkflowModeService { + + /** + * Get workflow mode + * Get a workflow mode + * + * Permission 'workflow:read' required + * @param modeId ID of a workflow mode + * @returns WorkflowModeOut Successful Response + * @throws ApiError + */ + public static workflowModeGetWorkflowMode( + modeId: string, + ): CancelablePromise<WorkflowModeOut> { + return __request(OpenAPI, { + method: 'GET', + url: '/workflow_modes/{mode_id}', + path: { + 'mode_id': modeId, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + +} diff --git a/src/client/workflow/services/WorkflowService.ts b/src/client/workflow/services/WorkflowService.ts new file mode 100644 index 0000000000000000000000000000000000000000..b173a102fe754904bcd8acfb703ef02616a7d5e5 --- /dev/null +++ b/src/client/workflow/services/WorkflowService.ts @@ -0,0 +1,471 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { AnonymizedWorkflowExecution } from '../models/AnonymizedWorkflowExecution'; +import type { Body_Workflow_Version_upload_workflow_version_icon } from '../models/Body_Workflow_Version_upload_workflow_version_icon'; +import type { DocumentationEnum } from '../models/DocumentationEnum'; +import type { IconUpdateOut } from '../models/IconUpdateOut'; +import type { Status } from '../models/Status'; +import type { WorkflowIn } from '../models/WorkflowIn'; +import type { WorkflowOut } from '../models/WorkflowOut'; +import type { WorkflowStatistic } from '../models/WorkflowStatistic'; +import type { WorkflowUpdate } from '../models/WorkflowUpdate'; +import type { WorkflowVersion } from '../models/WorkflowVersion'; +import type { WorkflowVersionStatus } from '../models/WorkflowVersionStatus'; + +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; + +export class WorkflowService { + + /** + * List workflows + * List all workflows. + * + * Permission "workflow:list" required. + * @param nameSubstring Filter workflows by a substring in their name. + * @param versionStatus Which versions of the workflow to include in the response. Permission 'workflow:list_filter required', unless 'developer_id' is provided and current user is developer, then only permission 'workflow:list' required. Default PUBLISHED and DEPRECATED. + * @param developerId Filter for workflow by developer. If current user is the same as developer ID, permission 'workflow:list' required, otherwise 'workflow:list_filter'. + * @returns WorkflowOut Successful Response + * @throws ApiError + */ + public static workflowListWorkflows( + nameSubstring?: (string | null), + versionStatus?: (Array<Status> | null), + developerId?: (string | null), + ): CancelablePromise<Array<WorkflowOut>> { + return __request(OpenAPI, { + method: 'GET', + url: '/workflows', + query: { + 'name_substring': nameSubstring, + 'version_status': versionStatus, + 'developer_id': developerId, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Create a new workflow + * Create a new workflow. + * + * Permission "workflow:create" required. + * + * For private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed. + * + * For private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed. + * @param requestBody + * @returns WorkflowOut Successful Response + * @throws ApiError + */ + public static workflowCreateWorkflow( + requestBody: WorkflowIn, + ): CancelablePromise<WorkflowOut> { + return __request(OpenAPI, { + method: 'POST', + url: '/workflows', + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Get anonymized workflow execution + * Get the workflow executions with meta information and anonymized user IDs. + * + * Permission "workflow:read_statistics" required if the `developer_id` is the same as the uid of the current user, + * other "workflow:read_statistics_any". + * @param developerId Filter by the developer of the workflows + * @param workflowId Filter by workflow IDs + * @param start Filter by workflow executions after this date + * @param end Filter by workflow executions before this date + * @returns AnonymizedWorkflowExecution Successful Response + * @throws ApiError + */ + public static workflowGetDeveloperWorkflowStatistics( + developerId?: (string | null), + workflowId?: (Array<string> | null), + start?: (string | null), + end?: (string | null), + ): CancelablePromise<Array<AnonymizedWorkflowExecution>> { + return __request(OpenAPI, { + method: 'GET', + url: '/workflows/developer_statistics', + query: { + 'developer_id': developerId, + 'workflow_id': workflowId, + 'start': start, + 'end': end, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Get a workflow + * Get a specific workflow. + * + * Permission "workflow:read" required. + * @param wid ID of a workflow + * @param versionStatus Which versions of the workflow to include in the response. Permission 'workflow:read_any' required if you are not the developer of this workflow. Default PUBLISHED and DEPRECATED + * @returns WorkflowOut Successful Response + * @throws ApiError + */ + public static workflowGetWorkflow( + wid: string, + versionStatus?: (Array<Status> | null), + ): CancelablePromise<WorkflowOut> { + return __request(OpenAPI, { + method: 'GET', + url: '/workflows/{wid}', + path: { + 'wid': wid, + }, + query: { + 'version_status': versionStatus, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Delete a workflow + * Delete a workflow. + * + * Permission "workflow:delete" required. + * @param wid ID of a workflow + * @returns void + * @throws ApiError + */ + public static workflowDeleteWorkflow( + wid: string, + ): CancelablePromise<void> { + return __request(OpenAPI, { + method: 'DELETE', + url: '/workflows/{wid}', + path: { + 'wid': wid, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Get statistics for a workflow + * Get the number of started workflow per day. + * + * Permission "workflow:read" required. + * @param wid ID of a workflow + * @returns WorkflowStatistic Successful Response + * @throws ApiError + */ + public static workflowGetWorkflowStatistics( + wid: string, + ): CancelablePromise<Array<WorkflowStatistic>> { + return __request(OpenAPI, { + method: 'GET', + url: '/workflows/{wid}/statistics', + path: { + 'wid': wid, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Update a workflow + * Create a new workflow version. + * + * Permission "workflow:update" required. + * @param wid ID of a workflow + * @param requestBody + * @returns WorkflowVersion Successful Response + * @throws ApiError + */ + public static workflowUpdateWorkflow( + wid: string, + requestBody: WorkflowUpdate, + ): CancelablePromise<WorkflowVersion> { + return __request(OpenAPI, { + method: 'POST', + url: '/workflows/{wid}/update', + path: { + 'wid': wid, + }, + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Get all versions of a workflow + * List all versions of a Workflow. + * + * Permission "workflow:list" required. + * @param wid ID of a workflow + * @param versionStatus Which versions of the workflow to include in the response. Permission 'workflow:list_filter' required if you are not the developer of this workflow. Default PUBLISHED and DEPRECATED + * @returns WorkflowVersion Successful Response + * @throws ApiError + */ + public static workflowVersionListWorkflowVersion( + wid: string, + versionStatus?: (Array<Status> | null), + ): CancelablePromise<Array<WorkflowVersion>> { + return __request(OpenAPI, { + method: 'GET', + url: '/workflows/{wid}/versions', + path: { + 'wid': wid, + }, + query: { + 'version_status': versionStatus, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Get a workflow version + * Get a specific version of a workflow. + * + * Permission "workflow:read" required if the version is public or you are the developer of the workflow, + * otherwise "workflow:read_any" + * @param gitCommitHash Git commit git_commit_hash of specific version or 'latest'. + * @param wid ID of a workflow + * @returns WorkflowVersion Successful Response + * @throws ApiError + */ + public static workflowVersionGetWorkflowVersion( + gitCommitHash: string, + wid: string, + ): CancelablePromise<WorkflowVersion> { + return __request(OpenAPI, { + method: 'GET', + url: '/workflows/{wid}/versions/{git_commit_hash}', + path: { + 'git_commit_hash': gitCommitHash, + 'wid': wid, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Update status of workflow version + * Update the status of a workflow version. + * + * Permission "workflow:update_status" + * @param gitCommitHash Git commit git_commit_hash of specific version. + * @param wid ID of a workflow + * @param requestBody + * @returns WorkflowVersion Successful Response + * @throws ApiError + */ + public static workflowVersionUpdateWorkflowVersionStatus( + gitCommitHash: string, + wid: string, + requestBody: WorkflowVersionStatus, + ): CancelablePromise<WorkflowVersion> { + return __request(OpenAPI, { + method: 'PATCH', + url: '/workflows/{wid}/versions/{git_commit_hash}/status', + path: { + 'git_commit_hash': gitCommitHash, + 'wid': wid, + }, + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Deprecate a workflow version + * Deprecate a workflow version. + * + * Permission "workflow:update" required if you are the developer of the workflow, + * otherwise "workflow:read_status" + * @param wid ID of a workflow + * @param gitCommitHash Git commit git_commit_hash of specific version. + * @returns WorkflowVersion Successful Response + * @throws ApiError + */ + public static workflowVersionDeprecateWorkflowVersion( + wid: string, + gitCommitHash: string, + ): CancelablePromise<WorkflowVersion> { + return __request(OpenAPI, { + method: 'POST', + url: '/workflows/{wid}/versions/{git_commit_hash}/deprecate', + path: { + 'wid': wid, + 'git_commit_hash': gitCommitHash, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Fetch documentation for a workflow version + * Get the documentation for a specific workflow version. + * Streams the response directly from the right git repository. + * + * Permission "workflow:read" required. + * @param wid ID of a workflow + * @param gitCommitHash Git commit git_commit_hash of specific version. + * @param document Specify which type of documentation the client wants to fetch + * @param modeId Workflow Mode + * @returns any Successful Response + * @throws ApiError + */ + public static workflowVersionDownloadWorkflowDocumentation( + wid: string, + gitCommitHash: string, + document?: DocumentationEnum, + modeId?: (string | null), + ): CancelablePromise<any> { + return __request(OpenAPI, { + method: 'GET', + url: '/workflows/{wid}/versions/{git_commit_hash}/documentation', + path: { + 'wid': wid, + 'git_commit_hash': gitCommitHash, + }, + query: { + 'document': document, + 'mode_id': modeId, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Upload icon for workflow version + * Upload an icon for the workflow version and returns the new icon URL. + * + * Permission "workflow:update" required. + * @param wid ID of a workflow + * @param gitCommitHash Git commit git_commit_hash of specific version. + * @param formData + * @returns IconUpdateOut Successful Response + * @throws ApiError + */ + public static workflowVersionUploadWorkflowVersionIcon( + wid: string, + gitCommitHash: string, + formData: Body_Workflow_Version_upload_workflow_version_icon, + ): CancelablePromise<IconUpdateOut> { + return __request(OpenAPI, { + method: 'POST', + url: '/workflows/{wid}/versions/{git_commit_hash}/icon', + path: { + 'wid': wid, + 'git_commit_hash': gitCommitHash, + }, + formData: formData, + mediaType: 'multipart/form-data', + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Delete icon of workflow version + * Delete the icon of the workflow version. + * + * Permission "workflow:update" required. + * @param wid ID of a workflow + * @param gitCommitHash Git commit git_commit_hash of specific version. + * @returns void + * @throws ApiError + */ + public static workflowVersionDeleteWorkflowVersionIcon( + wid: string, + gitCommitHash: string, + ): CancelablePromise<void> { + return __request(OpenAPI, { + method: 'DELETE', + url: '/workflows/{wid}/versions/{git_commit_hash}/icon', + path: { + 'wid': wid, + 'git_commit_hash': gitCommitHash, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + +} diff --git a/src/client/workflow/services/WorkflowVersionService.ts b/src/client/workflow/services/WorkflowVersionService.ts new file mode 100644 index 0000000000000000000000000000000000000000..9553b053cc3ee6f33dd087620f8ad227758324ef --- /dev/null +++ b/src/client/workflow/services/WorkflowVersionService.ts @@ -0,0 +1,249 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { Body_Workflow_Version_upload_workflow_version_icon } from '../models/Body_Workflow_Version_upload_workflow_version_icon'; +import type { DocumentationEnum } from '../models/DocumentationEnum'; +import type { IconUpdateOut } from '../models/IconUpdateOut'; +import type { Status } from '../models/Status'; +import type { WorkflowVersion } from '../models/WorkflowVersion'; +import type { WorkflowVersionStatus } from '../models/WorkflowVersionStatus'; + +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; + +export class WorkflowVersionService { + + /** + * Get all versions of a workflow + * List all versions of a Workflow. + * + * Permission "workflow:list" required. + * @param wid ID of a workflow + * @param versionStatus Which versions of the workflow to include in the response. Permission 'workflow:list_filter' required if you are not the developer of this workflow. Default PUBLISHED and DEPRECATED + * @returns WorkflowVersion Successful Response + * @throws ApiError + */ + public static workflowVersionListWorkflowVersion( + wid: string, + versionStatus?: (Array<Status> | null), + ): CancelablePromise<Array<WorkflowVersion>> { + return __request(OpenAPI, { + method: 'GET', + url: '/workflows/{wid}/versions', + path: { + 'wid': wid, + }, + query: { + 'version_status': versionStatus, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Get a workflow version + * Get a specific version of a workflow. + * + * Permission "workflow:read" required if the version is public or you are the developer of the workflow, + * otherwise "workflow:read_any" + * @param gitCommitHash Git commit git_commit_hash of specific version or 'latest'. + * @param wid ID of a workflow + * @returns WorkflowVersion Successful Response + * @throws ApiError + */ + public static workflowVersionGetWorkflowVersion( + gitCommitHash: string, + wid: string, + ): CancelablePromise<WorkflowVersion> { + return __request(OpenAPI, { + method: 'GET', + url: '/workflows/{wid}/versions/{git_commit_hash}', + path: { + 'git_commit_hash': gitCommitHash, + 'wid': wid, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Update status of workflow version + * Update the status of a workflow version. + * + * Permission "workflow:update_status" + * @param gitCommitHash Git commit git_commit_hash of specific version. + * @param wid ID of a workflow + * @param requestBody + * @returns WorkflowVersion Successful Response + * @throws ApiError + */ + public static workflowVersionUpdateWorkflowVersionStatus( + gitCommitHash: string, + wid: string, + requestBody: WorkflowVersionStatus, + ): CancelablePromise<WorkflowVersion> { + return __request(OpenAPI, { + method: 'PATCH', + url: '/workflows/{wid}/versions/{git_commit_hash}/status', + path: { + 'git_commit_hash': gitCommitHash, + 'wid': wid, + }, + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Deprecate a workflow version + * Deprecate a workflow version. + * + * Permission "workflow:update" required if you are the developer of the workflow, + * otherwise "workflow:read_status" + * @param wid ID of a workflow + * @param gitCommitHash Git commit git_commit_hash of specific version. + * @returns WorkflowVersion Successful Response + * @throws ApiError + */ + public static workflowVersionDeprecateWorkflowVersion( + wid: string, + gitCommitHash: string, + ): CancelablePromise<WorkflowVersion> { + return __request(OpenAPI, { + method: 'POST', + url: '/workflows/{wid}/versions/{git_commit_hash}/deprecate', + path: { + 'wid': wid, + 'git_commit_hash': gitCommitHash, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Fetch documentation for a workflow version + * Get the documentation for a specific workflow version. + * Streams the response directly from the right git repository. + * + * Permission "workflow:read" required. + * @param wid ID of a workflow + * @param gitCommitHash Git commit git_commit_hash of specific version. + * @param document Specify which type of documentation the client wants to fetch + * @param modeId Workflow Mode + * @returns any Successful Response + * @throws ApiError + */ + public static workflowVersionDownloadWorkflowDocumentation( + wid: string, + gitCommitHash: string, + document?: DocumentationEnum, + modeId?: (string | null), + ): CancelablePromise<any> { + return __request(OpenAPI, { + method: 'GET', + url: '/workflows/{wid}/versions/{git_commit_hash}/documentation', + path: { + 'wid': wid, + 'git_commit_hash': gitCommitHash, + }, + query: { + 'document': document, + 'mode_id': modeId, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Upload icon for workflow version + * Upload an icon for the workflow version and returns the new icon URL. + * + * Permission "workflow:update" required. + * @param wid ID of a workflow + * @param gitCommitHash Git commit git_commit_hash of specific version. + * @param formData + * @returns IconUpdateOut Successful Response + * @throws ApiError + */ + public static workflowVersionUploadWorkflowVersionIcon( + wid: string, + gitCommitHash: string, + formData: Body_Workflow_Version_upload_workflow_version_icon, + ): CancelablePromise<IconUpdateOut> { + return __request(OpenAPI, { + method: 'POST', + url: '/workflows/{wid}/versions/{git_commit_hash}/icon', + path: { + 'wid': wid, + 'git_commit_hash': gitCommitHash, + }, + formData: formData, + mediaType: 'multipart/form-data', + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + + /** + * Delete icon of workflow version + * Delete the icon of the workflow version. + * + * Permission "workflow:update" required. + * @param wid ID of a workflow + * @param gitCommitHash Git commit git_commit_hash of specific version. + * @returns void + * @throws ApiError + */ + public static workflowVersionDeleteWorkflowVersionIcon( + wid: string, + gitCommitHash: string, + ): CancelablePromise<void> { + return __request(OpenAPI, { + method: 'DELETE', + url: '/workflows/{wid}/versions/{git_commit_hash}/icon', + path: { + 'wid': wid, + 'git_commit_hash': gitCommitHash, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + +} diff --git a/src/components/BootstrapIcon.vue b/src/components/BootstrapIcon.vue deleted file mode 100644 index 2722a662489ea097d2d2e5883f3a6c38bd4aec4a..0000000000000000000000000000000000000000 --- a/src/components/BootstrapIcon.vue +++ /dev/null @@ -1,23 +0,0 @@ -<template> - <svg - class="bi bi-bootstrap-fill" - :width="props.width" - :height="props.height" - :fill="props.fill" - > - <use v-bind:xlink:href="iconPath + '#' + props.icon" /> - </svg> -</template> - -<script setup lang="ts"> -import iconPath from "bootstrap-icons/bootstrap-icons.svg"; - -const props = defineProps({ - icon: { type: String, required: true }, - width: { type: Number, default: 24, required: false }, - height: { type: Number, default: 24, required: false }, - fill: { type: String, default: "black", required: false }, -}); -</script> - -<style scoped></style> diff --git a/src/components/BucketListItem.vue b/src/components/BucketListItem.vue deleted file mode 100644 index 86ca530cdd58f5ed1fbba8c8ef7b4a020c7ad3f1..0000000000000000000000000000000000000000 --- a/src/components/BucketListItem.vue +++ /dev/null @@ -1,157 +0,0 @@ -<script setup lang="ts"> -import type { BucketOut, BucketPermissionOut } from "@/client"; -import BootstrapIcon from "@/components/BootstrapIcon.vue"; -import PermissionModal from "@/components/Modals/PermissionModal.vue"; -import BucketDetailModal from "@/components/Modals/BucketDetailModal.vue"; -import dayjs from "dayjs"; -import { filesize } from "filesize"; -import { onMounted } from "vue"; -import { Tooltip } from "bootstrap"; - -const props = defineProps<{ - active: boolean; - bucket: BucketOut; - loading: boolean; - permission: BucketPermissionOut | undefined; -}>(); - -const randomIDSuffix = Math.random().toString(16).substr(2, 8); - -const emit = defineEmits<{ - (e: "delete-bucket", bucketName: string): void; - (e: "permission-deleted", bucketName: string): void; -}>(); - -onMounted(() => { - if (!props.loading) { - new Tooltip("#tooltip-" + randomIDSuffix); - } -}); -</script> - -<template> - <permission-modal - v-if="props.permission != null && props.active" - :modalID="'view-permission-modal' + randomIDSuffix" - :bucket-name="props.bucket.name" - :sub-folders="{ subFolders: {}, files: [] }" - :edit-user-permission="props.permission" - :readonly="true" - :editable="false" - :deletable="true" - :back-modal-id="undefined" - @permission-deleted="(perm) => emit('permission-deleted', perm.bucket_name)" - /> - <bucket-detail-modal - v-if="props.active" - :modalID="'view-bucket-details-modal' + randomIDSuffix" - :bucket="props.bucket" - :edit-user-permission="props.permission" - /> - <div class="mt-2 mb-2"> - <div - v-if="loading" - class="list-group-item list-group-item-action text-nowrap rounded" - > - <span class="placeholder w-75"></span> - </div> - <div v-else> - <router-link - class="list-group-item list-group-item-action text-nowrap d-flex justify-content-between align-items-center" - :class="{ - active: props.active, - rounded: !props.active, - 'rounded-top': props.active, - }" - :aria-current="props.active" - :to="{ - name: 'bucket', - params: { bucketName: bucket.name, subFolders: [] }, - }" - > - {{ bucket.name }} - <div> - <bootstrap-icon - v-if="props.active && props.permission == null" - icon="trash-fill" - class="delete-icon me-2" - :width="16" - :height="16" - fill="currentColor" - @click="emit('delete-bucket', bucket.name)" - /> - <bootstrap-icon - class="info-icon" - data-bs-toggle="modal" - :data-bs-target="'#view-bucket-details-modal' + randomIDSuffix" - v-if="props.active" - icon="info-circle-fill" - :width="16" - :height="16" - fill="currentColor" - /> - </div> - </router-link> - <div - :hidden="!props.active" - class="ps-2 pe-2 rounded-bottom bg-light text-bg-light border border-3 border-top-0 border-primary" - > - <div v-if="props.permission != null" class="ms-1 pt-1 text-info"> - Foreign Bucket - </div> - <table class="table table-sm table-borderless mb-0"> - <tbody> - <tr v-if="props.permission != null"> - <th scope="row" class="fw-bold">Permission</th> - <td> - <a - href="#" - data-bs-toggle="modal" - :data-bs-target="'#view-permission-modal' + randomIDSuffix" - >View</a - > - </td> - </tr> - <tr> - <th scope="row" class="fw-bold">Created:</th> - <td> - <span - :id="'tooltip-' + randomIDSuffix" - data-bs-toggle="tooltip" - :data-bs-title=" - dayjs(bucket.created_at).format('DD.MM.YYYY HH:mm:ss') - " - > - {{ dayjs(bucket.created_at).fromNow() }} - </span> - </td> - </tr> - <tr> - <th scope="row" class="fw-bold">Objects:</th> - <td>{{ bucket.num_objects }}</td> - </tr> - <tr> - <th scope="row" class="fw-bold">Size:</th> - <td>{{ filesize(bucket.size) }}</td> - </tr> - </tbody> - </table> - </div> - </div> - </div> -</template> - -<style scoped> -.delete-icon { - color: white; -} -.delete-icon:hover { - color: var(--bs-danger); -} -.info-icon { - color: white; -} -.info-icon:hover { - color: var(--bs-info); -} -</style> diff --git a/src/components/CopyToClipboardIcon.vue b/src/components/CopyToClipboardIcon.vue new file mode 100644 index 0000000000000000000000000000000000000000..9d28cbaac691f1c1a6f8098a4e48396144561203 --- /dev/null +++ b/src/components/CopyToClipboardIcon.vue @@ -0,0 +1,88 @@ +<script setup lang="ts"> +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import { onMounted } from "vue"; +import { Toast, Tooltip } from "bootstrap"; + +const props = defineProps<{ + text: string; +}>(); + +let successToast: Toast | null = null; +let failToast: Toast | null = null; +const randomIDSuffix = Math.random().toString(16).substring(2, 8); + +function copyToClipboard() { + if (!navigator.clipboard) { + failToast?.show(); + } + navigator.clipboard + .writeText(props.text) + .then(() => { + successToast?.show(); + }) + .catch(() => { + failToast?.show(); + }); +} + +onMounted(() => { + new Tooltip("#tooltip-" + randomIDSuffix); + successToast = new Toast("#successToast-" + randomIDSuffix); + failToast = new Toast("#failToast-" + randomIDSuffix); +}); +</script> + +<template> + <div class="toast-container position-fixed top-toast end-0 p-3"> + <div + role="alert" + aria-live="assertive" + aria-atomic="true" + class="toast text-bg-success align-items-center border-0" + data-bs-autohide="true" + :id="'successToast-' + randomIDSuffix" + > + <div class="d-flex"> + <div class="toast-body">Successfully copied to clipboard</div> + <button + type="button" + class="btn-close btn-close-white me-2 m-auto" + data-bs-dismiss="toast" + aria-label="Close" + ></button> + </div> + </div> + <div + role="alert" + aria-live="assertive" + aria-atomic="true" + class="toast text-bg-danger align-items-center border-0" + data-bs-autohide="true" + :id="'failToast-' + randomIDSuffix" + > + <div class="d-flex"> + <div class="toast-body">Can't copy to clipboard</div> + <button + type="button" + class="btn-close btn-close-white me-2 m-auto" + data-bs-dismiss="toast" + aria-label="Close" + ></button> + </div> + </div> + </div> + <span + class="hover-info cursor-pointer" + data-bs-toggle="tooltip" + data-bs-title="Copy to Clipboard" + :id="'tooltip-' + randomIDSuffix" + > + <font-awesome-icon icon="fa-solid fa-clipboard" @click="copyToClipboard" /> + </span> +</template> + +<style scoped> +.hover-info:hover { + color: var(--bs-info) !important; +} +</style> diff --git a/src/components/FontAwesomeIcon.vue b/src/components/FontAwesomeIcon.vue new file mode 100644 index 0000000000000000000000000000000000000000..97b3d09bf4f86298c168a006acdb444726a4bb1e --- /dev/null +++ b/src/components/FontAwesomeIcon.vue @@ -0,0 +1,18 @@ +<template> + <span + class="align-middle" + :class="icon" + :style="{ + color: props.fill, + }" + ></span> +</template> + +<script setup lang="ts"> +const props = defineProps({ + icon: { type: String, required: true }, + fill: { type: String, default: "currentColor", required: false }, +}); +</script> + +<style scoped></style> diff --git a/src/components/FooterBottom.vue b/src/components/FooterBottom.vue new file mode 100644 index 0000000000000000000000000000000000000000..3936b2324a59d85ebecb985872e36dbb956bcd83 --- /dev/null +++ b/src/components/FooterBottom.vue @@ -0,0 +1,17 @@ +<script setup lang="ts"></script> + +<template> + <footer + class="navbar navbar-expand-lg bd-navbar w-100 border-top border-secondary mt-auto p-2" + > + <nav + class="container-xxl bd-gutter flex-wrap flex-lg-nowrap text-light" + ></nav> + </footer> +</template> + +<style scoped> +footer { + background: rgb(255, 177, 45); +} +</style> diff --git a/src/components/MarkdownRenderer.vue b/src/components/MarkdownRenderer.vue new file mode 100644 index 0000000000000000000000000000000000000000..1833b695aaad4dd7adb0e7968c22d9d6f0e78782 --- /dev/null +++ b/src/components/MarkdownRenderer.vue @@ -0,0 +1,25 @@ +<script setup lang="ts"> +import showdown from "showdown"; +import DOMPurify from "dompurify"; +import { computed } from "vue"; + +const props = defineProps<{ + markdown: string; +}>(); + +const converter = new showdown.Converter({ + tables: true, + ghCodeBLocks: false, +}); +converter.setFlavor("github"); +const outputHtml = computed(() => { + const dirtyHTML = converter.makeHtml(props.markdown); + return DOMPurify.sanitize(dirtyHTML); +}); +</script> + +<template> + <div v-html="outputHtml"></div> +</template> + +<style></style> diff --git a/src/components/Modals/ObjectDetailModal.vue b/src/components/Modals/ObjectDetailModal.vue deleted file mode 100644 index 733a4653972a9dbacfbace89601d301860ad0e45..0000000000000000000000000000000000000000 --- a/src/components/Modals/ObjectDetailModal.vue +++ /dev/null @@ -1,69 +0,0 @@ -<script setup lang="ts"> -import BootstrapModal from "@/components/Modals/BootstrapModal.vue"; -import type { S3ObjectMetaInformation } from "@/client"; -import dayjs from "dayjs"; -import { filesize } from "filesize"; - -const props = defineProps<{ - modalID: string; - s3Object: S3ObjectMetaInformation; -}>(); -</script> - -<template> - <bootstrap-modal - :modalID="modalID" - :static-backdrop="false" - modal-label="Object Detail Modal" - > - <template v-slot:header> - <h4>Object Details</h4> - </template> - <template v-slot:body> - <div class="container-fluid"> - <table class="table table-hover table-sm table-borderless"> - <tbody> - <tr> - <th scope="row" class="col-4">Bucket</th> - <td class="col-8">{{ props.s3Object.bucket }}</td> - </tr> - <tr> - <th scope="row">Name</th> - <td>{{ props.s3Object.key }}</td> - </tr> - <tr> - <th scope="row">Content Type</th> - <td>{{ props.s3Object.content_type }}</td> - </tr> - <tr> - <th scope="row">Timestamp</th> - <td> - {{ - dayjs(props.s3Object.last_modified).format( - "YYYY-MM-DD HH:mm:ss" - ) - }} - </td> - </tr> - <tr> - <th scope="row">Size</th> - <td>{{ filesize(props.s3Object.size) }}</td> - </tr> - </tbody> - </table> - </div> - </template> - <template v-slot:footer> - <button type="button" class="btn btn-secondary" data-bs-dismiss="modal"> - Close - </button> - </template> - </bootstrap-modal> -</template> - -<style scoped> -th { - font-weight: bold; - text-align: end; -} -</style> diff --git a/src/components/Modals/PermissionListModal.vue b/src/components/Modals/PermissionListModal.vue deleted file mode 100644 index 42bdcd9b58a2e79ee9f76024ce9c11f995912473..0000000000000000000000000000000000000000 --- a/src/components/Modals/PermissionListModal.vue +++ /dev/null @@ -1,171 +0,0 @@ -<script setup lang="ts"> -import type { - BucketPermissionIn, - BucketPermissionOut, - S3ObjectMetaInformation, -} from "@/client"; -import { reactive } from "vue"; -import { BucketPermissionsService } from "@/client"; -import { onBeforeMount, watch } from "vue"; -import BootstrapModal from "@/components/Modals/BootstrapModal.vue"; -import PermissionModal from "@/components/Modals/PermissionModal.vue"; -// Types -// ----------------------------------------------------------------------------- -interface S3ObjectWithFolder extends S3ObjectMetaInformation { - folder: string[]; - pseudoFileName: string; -} - -type FolderTree = { - subFolders: Record<string, FolderTree>; - files: S3ObjectWithFolder[]; -}; - -// Props -// ----------------------------------------------------------------------------- -const props = defineProps<{ - bucketName: string; - subFolders: FolderTree; - modalID: string; - addPermission: undefined | BucketPermissionOut; -}>(); - -// Reactive State -// ----------------------------------------------------------------------------- -const state = reactive({ - permissions: [], - loading: true, - currentPermission: { - bucket_name: "bucketname", - uid: "uid", - permission: "READ", - grantee_display_name: "display_name", - }, -} as { - permissions: BucketPermissionOut[]; - loading: boolean; - currentPermission: BucketPermissionOut; -}); - -const randomIDSuffix = Math.random().toString(16).substr(2, 8); - -// Watchers -// ----------------------------------------------------------------------------- -watch( - () => props.bucketName, - (newBucketName) => { - updateBucketPermissions(newBucketName); - } -); - -watch( - () => props.addPermission, - (newBucketPermission) => { - if (newBucketPermission !== undefined) { - state.permissions.push(newBucketPermission); - } - } -); - -// Function -// ----------------------------------------------------------------------------- -function updateBucketPermissions(bucketName: string) { - state.loading = true; - BucketPermissionsService.bucketPermissionsListPermissionsPerBucket(bucketName) - .then((permissions) => { - state.permissions = permissions; - }) - .catch((err) => { - console.error(err); - }) - .finally(() => { - state.loading = false; - }); -} - -function permissionDeleted(bucketPermission: BucketPermissionIn) { - state.permissions = state.permissions.filter( - (perm) => perm.uid != bucketPermission.uid - ); -} - -function permissionCreated(bucketPermission: BucketPermissionOut) { - state.permissions.push(bucketPermission); -} - -function permissionEdited(bucketPermission: BucketPermissionOut) { - const index = state.permissions.findIndex( - (perm) => perm.uid == bucketPermission.uid - ); - state.permissions[index] = bucketPermission; -} - -// Lifecycle Hooks -// ----------------------------------------------------------------------------- -onBeforeMount(() => { - updateBucketPermissions(props.bucketName); -}); -</script> - -<template> - <permission-modal - :deletable="true" - :editable="true" - :readonly="true" - :edit-user-permission="state.currentPermission" - :bucket-name="state.currentPermission.bucket_name" - :sub-folders="props.subFolders" - :back-modal-id="props.modalID" - :modalID="'permission-list-edit-modal' + randomIDSuffix" - @permission-deleted="permissionDeleted" - @permission-created="permissionCreated" - @permission-edited="permissionEdited" - /> - <bootstrap-modal - :modalID="props.modalID" - :static-backdrop="true" - modal-label="Permission List Modal" - > - <template v-slot:header> Bucket Permissions </template> - <template v-slot:body> - <ul v-if="state.loading" class="list-group"> - <li - class="list-group-item list-group-item-action placeholder-wave" - v-for="n in 5" - :key="n" - > - <span class="placeholder col-2 bg-info"></span> - <span class="placeholder col-8 offset-1"></span> - </li> - </ul> - <div v-else> - <div class="list-group" v-if="state.permissions.length > 0"> - <button - type="button" - class="list-group-item list-group-item-action text-truncate" - v-for="permission in state.permissions" - :key="permission.uid" - @click="state.currentPermission = permission" - data-bs-toggle="modal" - :data-bs-target="'#permission-list-edit-modal' + randomIDSuffix" - > - <div class="row"> - <span class="text-info col-2">{{ permission.permission }}</span> - <span class="col-9"> {{ permission.grantee_display_name }}</span> - </div> - </button> - </div> - <div v-else> - <h3 class="text-center">No Bucket Permissions for this bucket yet</h3> - </div> - </div> - </template> - <template v-slot:footer> - <button type="button" class="btn btn-secondary" data-bs-dismiss="modal"> - Close - </button> - </template> - </bootstrap-modal> -</template> - -<style scoped></style> diff --git a/src/components/NavbarTop.vue b/src/components/NavbarTop.vue index 3cfd1ec3d574cbb5f289903c1e5282fafeffb3a1..c3bb9a44c8437cf3c8c845f3cae3b00b5e478bd3 100644 --- a/src/components/NavbarTop.vue +++ b/src/components/NavbarTop.vue @@ -1,36 +1,32 @@ <script setup lang="ts"> -import BootstrapIcon from "@/components/BootstrapIcon.vue"; -import { reactive, onBeforeUnmount, onMounted } from "vue"; -import { MiscellaneousService } from "@/client"; -import { useAuthStore } from "@/stores/auth"; -import { useRoute, useRouter } from "vue-router"; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import { useAuthStore } from "@/stores/users"; +import { useRoute } from "vue-router"; import { useCookies } from "vue3-cookies"; -import { watch, ref } from "vue"; +import { watch, ref, computed } from "vue"; +import BootstrapModal from "@/components/modals/BootstrapModal.vue"; +import { OpenAPI as S3ProxyOpenAPI } from "@/client/s3proxy"; +import { OpenAPI as AuthOpenAPI } from "@/client/auth"; +import { OpenAPI as WorkflowOpenAPI } from "@/client/workflow"; +import CopyToClipboardIcon from "@/components/CopyToClipboardIcon.vue"; +import dayjs from "dayjs"; -const router = useRouter(); const store = useAuthStore(); const { cookies } = useCookies(); const route = useRoute(); -const api_connection = reactive({ connected: true, timer: null }); -let timer: ReturnType<typeof setInterval> | undefined = undefined; -function checkApiHealth() { - MiscellaneousService.miscellaneousHealthCheck() - .then(() => { - api_connection.connected = true; - }) - .catch(() => { - api_connection.connected = false; - }); -} - function logout() { store.logout(); cookies.remove("bearer"); - router.push({ name: "login" }); } const activeRoute = ref(""); +const objectStorageActive = computed<boolean>( + () => activeRoute.value == "buckets" || activeRoute.value == "s3_keys", +); +const workflowActive = computed<boolean>( + () => activeRoute.value == "workflows", +); watch( () => route.name, @@ -38,86 +34,123 @@ watch( if (typeof to === "string") { if (to.startsWith("bucket")) { activeRoute.value = "buckets"; - } else if (to.startsWith("s3_keys")) { - activeRoute.value = "s3_keys"; + } else if (to.startsWith("workflow")) { + activeRoute.value = "workflows"; } else { - activeRoute.value = ""; + activeRoute.value = to; } } else { activeRoute.value = ""; } - } + }, ); - -onMounted(() => { - checkApiHealth(); - timer = setInterval(checkApiHealth, 20000); -}); -onBeforeUnmount(() => { - clearInterval(timer); -}); </script> <template> - <nav class="navbar navbar-dark fixed-top navbar-expand-lg bg-dark"> - <div class="container-fluid text-light"> - <router-link class="navbar-brand ms-3" to="/"> + <header + class="navbar navbar-expand-lg bd-navbar sticky-top border-bottom border-secondary" + > + <nav class="container-xxl bd-gutter flex-wrap flex-lg-nowrap text-light"> + <router-link + class="navbar-brand ms-3 text-white d-flex align-items-center" + to="/" + > <img - src="/src/assets/images/denbi.svg" - alt="" - width="24" - height="24" + src="/src/assets/images/clowm.svg" + alt="CloWM Icon" + width="32" + height="32" class="d-inline-block align-text-top me-2" /> - S3 Proxy + CloWM </router-link> - <button - class="navbar-toggler" - type="button" - data-bs-toggle="collapse" - data-bs-target="#navbarNavAltMarkup" - aria-controls="navbarNavAltMarkup" - aria-expanded="false" - aria-label="Toggle navigation" - v-if="store.authenticated && store.user != null" - > - <span class="navbar-toggler-icon"></span> - </button> - <div - class="collapse navbar-collapse" - id="navbarNavAltMarkup" - v-if="store.authenticated && store.user != null" - > - <div class="navbar-nav"> - <router-link - class="nav-link" - :aria-current="activeRoute === 'buckets' ? 'page' : null" - :to="{ name: 'buckets' }" - :class="{ active: activeRoute === 'buckets' }" - > - Buckets - </router-link> - <router-link - class="nav-link" - :to="{ name: 's3_keys' }" - :aria-current="activeRoute === 's3_keys' ? 'page' : null" - :class="{ active: activeRoute === 's3_keys' }" - > - S3 Keys - </router-link> - </div> - </div> - <span - v-if="!api_connection.connected" - class="navbar-text text-bg-danger p-1" - > - Backend not reachable - </span> - <div - class="dropdown d-flex me-3" - v-if="store.authenticated && store.user != null" - > + <div class="d-flex me-auto w-fit" v-if="store.authenticated"> + <ul class="navbar-nav"> + <li class="nav-item dropdown"> + <a + class="nav-link dropdown-toggle" + id="" + :class="{ 'text-black': objectStorageActive }" + href="#" + role="button" + data-bs-toggle="dropdown" + aria-expanded="false" + data-bs-auto-close="true" + > + Files + </a> + <ul + class="dropdown-menu shadow m-0" + aria-labelledby="objectStoreDropdown" + > + <li> + <router-link class="dropdown-item" :to="{ name: 'buckets' }" + >My Data Buckets + </router-link> + </li> + <li> + <router-link class="dropdown-item" :to="{ name: 's3_keys' }" + >S3 Bucket Keys + </router-link> + </li> + </ul> + </li> + <li class="nav-item dropdown"> + <a + class="nav-link dropdown-toggle" + :class="{ 'text-black': workflowActive }" + id="workflowDropdown" + href="#" + role="button" + data-bs-toggle="dropdown" + aria-expanded="false" + data-bs-auto-close="true" + > + Workflows + </a> + <ul + class="dropdown-menu shadow m-0" + aria-labelledby="workflowDropdown" + > + <li> + <router-link class="dropdown-item" :to="{ name: 'workflows' }" + >Available Workflows + </router-link> + </li> + <li> + <router-link + class="dropdown-item" + :to="{ name: 'workflow-executions' }" + >My Workflow Executions + </router-link> + </li> + <li + v-if=" + store.workflowDev || store.workflowReviewer || store.admin + " + > + <hr class="dropdown-divider" /> + </li> + <li v-if="store.workflowDev || store.admin"> + <router-link + class="dropdown-item" + :to="{ name: 'workflows-developer' }" + >My Workflows + </router-link> + </li> + <li v-if="store.workflowReviewer || store.admin"> + <router-link + class="dropdown-item" + :to="{ name: 'workflows-reviewer' }" + >Reviews + </router-link> + </li> + </ul> + </li> + </ul> + </div> + <div class="dropdown" v-if="store.authenticated && store.user != null"> <a href="#" class="d-flex align-items-center text-white text-decoration-none dropdown-toggle-split" @@ -126,24 +159,130 @@ onBeforeUnmount(() => { aria-expanded="false" > <strong class="me-2">{{ store.user.display_name }}</strong> - <bootstrap-icon icon="person-circle" fill="white" /> + <font-awesome-icon icon="fa-solid fa-circle-user" class="fs-5" /> </a> <ul - class="dropdown-menu dropdown-menu-dark text-small shadow" + class="dropdown-menu text-small shadow" aria-labelledby="dropdownUser1" > - <li><hr class="dropdown-divider" /></li> <li> - <a class="dropdown-item pseudo-link" @click="logout">Sign out</a> + <a + href="#" + class="dropdown-item" + data-bs-toggle="modal" + data-bs-target="#advancedUsageModal" + >Advanced Usage</a + > + </li> + <li> + <hr class="dropdown-divider" /> + </li> + <li><h6 class="dropdown-header">Roles</h6></li> + <li + v-for="role in store.roles" + :key="role" + class="dropdown-item text-capitalize disabled" + > + {{ role }} + </li> + <li> + <hr class="dropdown-divider" /> + </li> + <li> + <router-link + :to="{ name: 'login' }" + class="dropdown-item" + @click="logout" + > + Sign out + </router-link> </li> </ul> </div> - </div> - </nav> + </nav> + </header> + <bootstrap-modal + static-backdrop + modal-i-d="advancedUsageModal" + modal-label="Advanced Usage Modal" + v-if="store.authenticated" + > + <template v-slot:header> + <h3>Advanced Usage</h3> + </template> + <template v-slot:body> + <table class="table table-borderless table-sm"> + <tbody> + <tr> + <td class="text-end">Auth Service:</td> + <td> + <a :href="AuthOpenAPI.BASE + '/docs'" target="_blank"> + <font-awesome-icon + class="me-1" + icon="fa-solid fa-arrow-up-right-from-square" + /> + {{ AuthOpenAPI.BASE }}</a + > + </td> + </tr> + <tr> + <td class="text-end">S3Proxy Service:</td> + <td> + <a :href="S3ProxyOpenAPI.BASE + '/docs'" target="_blank"> + <font-awesome-icon + class="me-1" + icon="fa-solid fa-arrow-up-right-from-square" + /> + {{ S3ProxyOpenAPI.BASE }}</a + > + </td> + </tr> + <tr> + <td class="text-end">Workflow Service:</td> + <td> + <a :href="WorkflowOpenAPI.BASE + '/docs'" target="_blank"> + <font-awesome-icon + class="me-1" + icon="fa-solid fa-arrow-up-right-from-square" + /> + {{ WorkflowOpenAPI.BASE }}</a + > + </td> + </tr> + </tbody> + </table> + <div class="mt-4"> + <label for="clowm-jwt" class="form-label" + >JWT for Services (expires at + {{ + dayjs.unix(store.decodedToken!.exp).format("DD.MM.YYYY HH:mm") + }})</label + > + <div class="input-group"> + <input + type="text" + readonly + class="form-control text-truncate" + id="clowm-jwt" + :value="store.token" + aria-describedby="clowm-jwt-copy" + /> + <span class="input-group-text" id="clowm-jwt-copy" + ><copy-to-clipboard-icon :text="store.token ?? ''" + /></span> + </div> + </div> + </template> + <template v-slot:footer> + <button type="button" class="btn btn-secondary" data-bs-dismiss="modal"> + Close + </button> + </template> + </bootstrap-modal> </template> <style scoped> -.pseudo-link { - cursor: pointer; +header { + background: rgb(255, 177, 45); } </style> diff --git a/src/components/S3KeyView.vue b/src/components/S3KeyView.vue deleted file mode 100644 index 9d42d5d0c3e2194fb16fe075210456cbc8bc43c3..0000000000000000000000000000000000000000 --- a/src/components/S3KeyView.vue +++ /dev/null @@ -1,94 +0,0 @@ -<script setup lang="ts"> -import type { S3Key } from "@/client"; -import type { Ref } from "vue"; -import { ref, watch } from "vue"; -import BootstrapIcon from "@/components/BootstrapIcon.vue"; -import DeleteModal from "@/components/Modals/DeleteModal.vue"; - -const props = defineProps<{ - s3key: S3Key; - deletable: boolean; - loading: boolean; -}>(); - -const emit = defineEmits<{ - (e: "delete-key", accessKey: string): void; -}>(); - -watch( - () => props.s3key.access_key, - () => { - visibleSecret.value = false; - } -); - -const visibleSecret: Ref<boolean> = ref(false); - -function deleteKeyTrigger() { - if (props.deletable) { - emit("delete-key", props.s3key.access_key); - } -} -</script> - -<template> - <DeleteModal - modalID="delete-key-modal" - :object-name-delete="props.s3key.access_key" - :back-modal-id="undefined" - @confirm-delete="deleteKeyTrigger" - /> - <h3>Access Key:</h3> - <div v-if="props.loading" class="placeholder-glow"> - <span class="placeholder col-5 mt-3 mb-2 fs-4"></span><br /> - </div> - <input - v-else - class="form-control-plaintext text-white fs-4" - type="text" - :value="props.s3key.access_key" - aria-label="S3 Access Key" - readonly - /> - <div class="d-flex align-items-center"> - <span class="fs-3">Secret Key:</span> - <button - class="btn btn-outline-secondary ms-3" - :class="{ active: visibleSecret }" - data-bs-toggle="button" - :disabled="props.loading" - @click="visibleSecret = !visibleSecret" - > - <bootstrap-icon - :width="18" - :height="18" - fill="white" - :icon="visibleSecret ? 'eye' : 'eye-slash'" - /> - </button> - </div> - <div v-if="props.loading" class="placeholder-glow"> - <span class="placeholder col-7 mt-3 mb-4 fs-4"></span><br /> - </div> - <input - v-else - id="s3-secret-key" - class="form-control-plaintext text-white fs-4 mb-3" - :type="visibleSecret ? 'text' : 'password'" - :value="props.s3key.secret_key" - aria-label="S3 Access Key" - aria-describedby="s3-secret-key" - readonly - /> - <button - type="button" - class="btn btn-danger fs-5" - :disabled="!props.deletable || props.loading" - data-bs-toggle="modal" - data-bs-target="#delete-key-modal" - > - Delete - </button> -</template> - -<style scoped></style> diff --git a/src/components/Modals/BootstrapModal.vue b/src/components/modals/BootstrapModal.vue similarity index 95% rename from src/components/Modals/BootstrapModal.vue rename to src/components/modals/BootstrapModal.vue index ed4eb2ad902442451ad76dd3325621bb098c5028..4e6fd34d52d553fe70460bc048f0d9461572f383 100644 --- a/src/components/Modals/BootstrapModal.vue +++ b/src/components/modals/BootstrapModal.vue @@ -16,8 +16,8 @@ defineProps<{ :data-bs-backdrop="staticBackdrop ? 'static' : null" > <div - class="modal-dialog modal-dialog-centered modal-dialog-scrollable text-dark" - style="min-width: 35%" + class="modal-dialog modal-dialog-centered modal-dialog-scrollable" + style="min-width: 30%" > <div class="modal-content"> <div class="modal-header"> diff --git a/src/components/Modals/DeleteModal.vue b/src/components/modals/DeleteModal.vue similarity index 83% rename from src/components/Modals/DeleteModal.vue rename to src/components/modals/DeleteModal.vue index 00dbff6fa32c8691fd18371dc532e61479b3793c..b51c55f02d5f6c357fc758f0d5311cc453eaa30c 100644 --- a/src/components/Modals/DeleteModal.vue +++ b/src/components/modals/DeleteModal.vue @@ -1,22 +1,21 @@ <script setup lang="ts"> import { onMounted, ref } from "vue"; -import type { Ref } from "vue"; import { Modal } from "bootstrap"; -import BootstrapModal from "@/components/Modals/BootstrapModal.vue"; +import BootstrapModal from "@/components/modals/BootstrapModal.vue"; const props = defineProps<{ modalID: string; - objectNameDelete: string; - backModalId: string | undefined; + objectNameDelete?: string; + backModalId?: string; }>(); -const confirmDelete: Ref<boolean> = ref(false); +const confirmDelete = ref<boolean>(false); const emit = defineEmits<{ (e: "confirm-delete"): void; }>(); let deleteModal: Modal | null = null; -const randomIDSuffix = Math.random().toString(16).substr(2, 8); +const randomIDSuffix = Math.random().toString(16).substring(2, 8); function modalClosed() { confirmDelete.value = false; @@ -44,7 +43,9 @@ onMounted(() => { <template v-slot:body> <p> Are you sure you want to delete - <strong>{{ props.objectNameDelete }}</strong> + <strong v-if="props.objectNameDelete">{{ + props.objectNameDelete + }}</strong> </p> <div class="form-check"> <input @@ -63,7 +64,7 @@ onMounted(() => { </template> <template v-slot:footer> <button - v-if="backModalId !== undefined" + v-if="backModalId" type="button" class="btn btn-secondary" :data-bs-target="'#' + props.backModalId" diff --git a/src/components/Modals/SearchUserModal.vue b/src/components/modals/SearchUserModal.vue similarity index 77% rename from src/components/Modals/SearchUserModal.vue rename to src/components/modals/SearchUserModal.vue index 14b5db0b4f62d17e985a32d145e13c1d8e6069b6..85f24c3167c77a967f8288b128ef081f0499e235 100644 --- a/src/components/Modals/SearchUserModal.vue +++ b/src/components/modals/SearchUserModal.vue @@ -1,31 +1,31 @@ <script setup lang="ts"> import { reactive, watch } from "vue"; -import BootstrapModal from "@/components/Modals/BootstrapModal.vue"; -import BootstrapIcon from "@/components/BootstrapIcon.vue"; -import { UserService } from "@/client"; -import type { User } from "@/client"; -import { useAuthStore } from "@/stores/auth"; +import BootstrapModal from "@/components/modals/BootstrapModal.vue"; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import { UserService } from "@/client/auth"; +import type { User } from "@/client/auth"; +import { useAuthStore } from "@/stores/users"; const props = defineProps<{ modalID: string; - backModalId: string | undefined; + backModalId?: string; }>(); -const randomIDSuffix = Math.random().toString(16).substr(2, 8); +const randomIDSuffix = Math.random().toString(16).substring(2, 8); const store = useAuthStore(); -const formState = reactive({ - searchString: "", - potentialUsers: [], - lastSearchTimerId: null, - error: false, - loading: false, -} as { +const formState = reactive<{ searchString: string; potentialUsers: User[]; lastSearchTimerId: ReturnType<typeof setTimeout> | null; error: boolean; loading: boolean; +}>({ + searchString: "", + potentialUsers: [], + lastSearchTimerId: null, + error: false, + loading: false, }); watch( @@ -41,7 +41,7 @@ watch( formState.loading = false; formState.potentialUsers = []; } - } + }, ); const emit = defineEmits<{ @@ -55,11 +55,16 @@ function modalClosed() { function searchUser(name: string) { formState.error = false; - UserService.userSearchUsers(name) + UserService.userListUsers(name) .then((userSuggestions) => { formState.potentialUsers = userSuggestions.filter( - (user) => store.user?.uid != user.uid + (user) => store.currentUID != user.uid, ); + const uidToName: Record<string, string> = {}; + for (const user of userSuggestions) { + uidToName[user.uid] = user.display_name; + } + store.addUidToNameMapping(uidToName); }) .catch((err) => { formState.error = true; @@ -82,7 +87,7 @@ function searchUser(name: string) { <template v-slot:body> <div class="input-group mt-2 mb-4"> <span class="input-group-text" id="objects-search-wrapping" - ><bootstrap-icon icon="search" :width="16" :height="16" + ><font-awesome-icon icon="fa-solid fa-magnifying-glass" /></span> <input class="form-control" @@ -97,13 +102,10 @@ function searchUser(name: string) { </div> </div> <div v-else-if="formState.error" class="text-center fs-2"> - <bootstrap-icon - icon="x-lg" + <font-awesome-icon + icon="fa-solid fa-x" class="mb-2" - :width="56" - :height="56" - style="color: var(--bs-danger)" - fill="currentColor" + style="color: var(--bs-danger); font-size: 4em" /><br /> <span class="text-danger" >There seems to be an error<br />Try again later</span @@ -123,13 +125,10 @@ function searchUser(name: string) { </button> </div> <div v-else class="text-center fs-2"> - <bootstrap-icon - icon="search" + <font-awesome-icon + icon="fa-solid fa-magnifying-glass" class="mb-2" - :width="56" - :height="56" - style="color: var(--bs-secondary)" - fill="currentColor" + style="color: var(--bs-secondary); font-size: 4em" /><br /> <span v-if="formState.searchString.length > 2" >Could not find any Users</span @@ -139,7 +138,7 @@ function searchUser(name: string) { </template> <template v-slot:footer> <button - v-if="backModalId !== undefined" + v-if="backModalId" type="button" class="btn btn-secondary" :data-bs-target="'#' + props.backModalId" diff --git a/src/components/object-storage/BucketListItem.vue b/src/components/object-storage/BucketListItem.vue new file mode 100644 index 0000000000000000000000000000000000000000..a1db0ae77fa2f80099523ab93c1dc26b94ccb542 --- /dev/null +++ b/src/components/object-storage/BucketListItem.vue @@ -0,0 +1,239 @@ +<script setup lang="ts"> +import type { BucketOut, BucketPermissionOut } from "@/client/s3proxy"; +import { Constraint } from "@/client/s3proxy"; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import PermissionModal from "@/components/object-storage/modals/PermissionModal.vue"; +import BucketDetailModal from "@/components/object-storage/modals/BucketDetailModal.vue"; +import dayjs from "dayjs"; +import { filesize } from "filesize"; +import { computed, onMounted } from "vue"; +import { Tooltip } from "bootstrap"; +import { useBucketStore } from "@/stores/buckets"; +import { useRouter } from "vue-router"; +import { useAuthStore } from "@/stores/users"; +import type { FolderTree } from "@/types/PseudoFolder"; + +const props = defineProps<{ + active: boolean; + bucket: BucketOut; + loading: boolean; + deletable: boolean; +}>(); + +const randomIDSuffix = Math.random().toString(16).substring(2, 8); +const permissionRepository = useBucketStore(); +const userRepository = useAuthStore(); +const router = useRouter(); + +const permission = computed<BucketPermissionOut | undefined>( + () => permissionRepository.ownPermissions[props.bucket.name], +); +const subFolder = computed<FolderTree>(() => { + const subFolders: Record<string, FolderTree> = {}; + if (permission.value?.file_prefix != null) { + subFolders[permission.value.file_prefix] = { subFolders: {}, files: [] }; + } + return { subFolders: subFolders, files: [] }; +}); + +const emit = defineEmits<{ + (e: "delete-bucket", bucketName: string): void; +}>(); + +function permissionDeleted() { + router.push({ name: "buckets" }); +} + +onMounted(() => { + if (!props.loading) { + new Tooltip("#tooltip-" + randomIDSuffix); + new Tooltip("#ownBucketIcon-" + randomIDSuffix); + new Tooltip("#sharedBucketIcon-" + randomIDSuffix); + } +}); +</script> + +<template> + <permission-modal + v-if="permission != undefined && props.active" + :modalID="'view-permission-modal' + randomIDSuffix" + :bucket-name="props.bucket.name" + :sub-folders="subFolder" + :edit-user-permission="permission" + :readonly="true" + :editable="false" + :deletable="true" + :back-modal-id="undefined" + @permission-deleted="permissionDeleted" + /> + <bucket-detail-modal + v-if="props.active" + :modalID="'view-bucket-details-modal' + randomIDSuffix" + :bucket="props.bucket" + :edit-user-permission="permission" + /> + <div class="mt-2 mb-2"> + <div + v-if="loading" + class="list-group-item list-group-item-action text-nowrap rounded" + > + <span class="placeholder w-75"></span> + </div> + <template v-else> + <router-link + class="list-group-item list-group-item-action d-flex justify-content-between align-items-center" + :class="{ + active: props.active, + 'hover-shadow': !props.active, + rounded: !props.active, + 'rounded-top': props.active, + }" + :aria-current="props.active" + :to="{ + name: 'bucket', + params: { bucketName: bucket.name, subFolders: [] }, + }" + > + <span class="text-truncate flex-grow-3"> + <template v-if="bucket.owner_constraint === Constraint.READ" + >download-bucket</template + > + <template v-else-if="bucket.owner_constraint === Constraint.WRITE" + >upload-bucket</template + > + <template v-else>{{ bucket.name }}</template> + </span> + <div class="text-nowrap"> + <font-awesome-icon + :hidden="bucket.owner !== userRepository.currentUID" + :id="'ownBucketIcon-' + randomIDSuffix" + icon="fa-solid fa-user" + :class="{ + 'me-2': + props.active || + permission || + ( + permissionRepository.bucketPermissionsMapping[bucket.name] ?? + [] + ).length > 0, + }" + data-bs-toogle="tooltip" + data-bs-title="Own Bucket" + /> + <font-awesome-icon + :hidden=" + !permission && + (permissionRepository.bucketPermissionsMapping[bucket.name] ?? []) + .length === 0 + " + :id="'sharedBucketIcon-' + randomIDSuffix" + icon="fa-solid fa-users" + :class="{ 'me-2': props.active }" + data-bs-toogle="tooltip" + data-bs-title="Shared Bucket" + /> + <font-awesome-icon + v-if="props.active && !permission && props.deletable" + icon="fa-solid fa-trash" + class="delete-icon me-2" + @click="emit('delete-bucket', bucket.name)" + /> + <font-awesome-icon + class="info-icon" + data-bs-toggle="modal" + :data-bs-target="'#view-bucket-details-modal' + randomIDSuffix" + v-if="props.active" + icon="fa-solid fa-circle-info" + /> + </div> + </router-link> + <div + :hidden="!props.active" + class="px-2 rounded-bottom border shadow-sm border-3 border-top-0 border-primary" + > + <div v-if="permission" class="ms-1 pt-1 text-info">Foreign Bucket</div> + <table class="table table-sm table-borderless mb-0"> + <tbody> + <tr v-if="permission"> + <th scope="row" class="fw-bold">Permission:</th> + <td> + <a + href="#" + data-bs-toggle="modal" + :data-bs-target="'#view-permission-modal' + randomIDSuffix" + >Show</a + > + </td> + </tr> + <tr v-if="permission"> + <th scope="row" class="fw-bold">Owner:</th> + <td class="text-truncate"> + {{ userRepository.userMapping[bucket.owner] }} + </td> + </tr> + <tr + v-if=" + ( + permissionRepository.bucketPermissionsMapping[bucket.name] ?? + [] + ).length > 0 + " + > + <th scope="row" class="fw-bold">Permissions:</th> + <td> + <a + href="#" + data-bs-toggle="modal" + data-bs-target="#permission-list-modal" + >Show</a + > + </td> + </tr> + <tr> + <th scope="row" class="fw-bold">Created:</th> + <td> + <span + :id="'tooltip-' + randomIDSuffix" + data-bs-toggle="tooltip" + :data-bs-title=" + dayjs.unix(bucket.created_at).format('DD.MM.YYYY HH:mm:ss') + " + > + {{ dayjs.unix(bucket.created_at).fromNow() }} + </span> + </td> + </tr> + <tr> + <th scope="row" class="fw-bold">Objects:</th> + <td>{{ bucket.num_objects }}</td> + </tr> + <tr> + <th scope="row" class="fw-bold">Size:</th> + <td> + {{ filesize(bucket.size, { base: 2, standard: "jedec" }) }} + </td> + </tr> + </tbody> + </table> + </div> + </template> + </div> +</template> + +<style scoped> +.delete-icon { + color: white; +} + +.delete-icon:hover { + color: var(--bs-danger) !important; +} + +.info-icon { + color: white; +} + +.info-icon:hover { + color: var(--bs-info) !important; +} +</style> diff --git a/src/components/Modals/BucketDetailModal.vue b/src/components/object-storage/modals/BucketDetailModal.vue similarity index 74% rename from src/components/Modals/BucketDetailModal.vue rename to src/components/object-storage/modals/BucketDetailModal.vue index 6d0a510569ffc513611629ca89d29855436dba90..09788df9d94e1e290c501bc98cc7e53aadbf1bd5 100644 --- a/src/components/Modals/BucketDetailModal.vue +++ b/src/components/object-storage/modals/BucketDetailModal.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> -import BootstrapModal from "@/components/Modals/BootstrapModal.vue"; -import type { BucketOut } from "@/client"; +import BootstrapModal from "@/components/modals/BootstrapModal.vue"; +import type { BucketOut } from "@/client/s3proxy"; import dayjs from "dayjs"; import { filesize } from "filesize"; @@ -27,14 +27,16 @@ const props = defineProps<{ <table class="table table-hover table-sm table-borderless"> <tbody> <tr> - <th scope="row" class="col-2">Name</th> - <td class="col-10">{{ props.bucket.name }}</td> + <th scope="row" class="col-3">Name</th> + <td class="col-9">{{ props.bucket.name }}</td> </tr> <tr> <th scope="row">Creation date</th> <td> {{ - dayjs(props.bucket.created_at).format("YYYY-MM-DD HH:mm:ss") + dayjs + .unix(props.bucket.created_at) + .format("YYYY-MM-DD HH:mm:ss") }} </td> </tr> @@ -44,7 +46,11 @@ const props = defineProps<{ </tr> <tr> <th scope="row">Size</th> - <td>{{ filesize(props.bucket.size) }}</td> + <td> + {{ + filesize(props.bucket.size, { base: 2, standard: "jedec" }) + }} + </td> </tr> <tr> <th scope="row">Description</th> diff --git a/src/components/Modals/CopyObjectModal.vue b/src/components/object-storage/modals/CopyObjectModal.vue similarity index 78% rename from src/components/Modals/CopyObjectModal.vue rename to src/components/object-storage/modals/CopyObjectModal.vue index b4c72a29e865a259515a5b2584cc6189217d4f55..0687aaa6a9ceee3c848e94eac1a588108848a6fb 100644 --- a/src/components/Modals/CopyObjectModal.vue +++ b/src/components/object-storage/modals/CopyObjectModal.vue @@ -1,63 +1,56 @@ <script setup lang="ts"> -import type { S3Client } from "@aws-sdk/client-s3"; -import { CopyObjectCommand } from "@aws-sdk/client-s3"; -import BootstrapModal from "@/components/Modals/BootstrapModal.vue"; -import type { BucketOut } from "@/client"; +import BootstrapModal from "@/components/modals/BootstrapModal.vue"; import { Modal, Toast } from "bootstrap"; import { onMounted, reactive, watch } from "vue"; -import type { S3ObjectMetaInformation } from "@/client"; -import dayjs from "dayjs"; +import type { _Object as S3Object } from "@aws-sdk/client-s3"; +import { useBucketStore } from "@/stores/buckets"; +import { useS3ObjectStore } from "@/stores/s3objects"; + +const objectRepository = useS3ObjectStore(); const props = defineProps<{ modalID: string; - sourceObject: S3ObjectMetaInformation; - s3Client: S3Client; - availableBuckets: BucketOut[]; + srcObject: S3Object; + srcBucket: string; }>(); -const formState = reactive({ - destKey: "", - destBucket: "", - uploading: false, -} as { +const formState = reactive<{ destKey: string; destBucket: string; uploading: boolean; +}>({ + destKey: "", + destBucket: "", + uploading: false, }); +const bucketRepository = useBucketStore(); -const emit = defineEmits<{ - (e: "object-copied", object: S3ObjectMetaInformation): void; -}>(); - -const randomIDSuffix = Math.random().toString(16).substr(2, 8); +const randomIDSuffix = Math.random().toString(16).substring(2, 8); let copyModal: Modal | null = null; let successToast: Toast | null = null; let errorToast: Toast | null = null; -function getFileName(key: string): string { +function getFileName(key?: string): string { + if (key == undefined) { + return ""; + } const splittedKey = key.split("/"); return splittedKey[splittedKey.length - 1]; } function copyObject() { - const command = new CopyObjectCommand({ - Bucket: formState.destBucket, - CopySource: encodeURI( - `/${props.sourceObject.bucket}/${props.sourceObject.key}` - ), - Key: formState.destKey, - }); + if (props.srcObject.Key == undefined) { + return; + } formState.uploading = true; - props.s3Client - .send(command) + objectRepository + .copyObject( + props.srcBucket, + props.srcObject, + formState.destBucket, + formState.destKey, + ) .then(() => { - emit("object-copied", { - key: formState.destKey, - bucket: formState.destBucket, - size: props.sourceObject.size, - last_modified: dayjs().toISOString(), - content_type: props.sourceObject.content_type, - }); copyModal?.hide(); successToast?.show(); formState.destBucket = ""; @@ -76,10 +69,10 @@ function modalClosed() { } watch( - () => props.sourceObject.key, + () => props.srcObject.Key, (newKey) => { - formState.destKey = newKey; - } + formState.destKey = newKey ?? ""; + }, ); onMounted(() => { @@ -140,7 +133,7 @@ onMounted(() => { v-on="{ 'hidden.bs.modal': modalClosed }" > <template v-slot:header> - <h4>Copy file {{ getFileName(props.sourceObject.key) }}</h4> + <h4>Copy file {{ getFileName(props.srcObject.Key) }}</h4> </template> <template v-slot:body> <div class="container-fluid"> @@ -165,7 +158,7 @@ onMounted(() => { > <option disabled selected>Select one...</option> <option - v-for="bucket in props.availableBuckets" + v-for="bucket in bucketRepository.writableBuckets" :key="bucket.name" :value="bucket.name" > @@ -187,7 +180,7 @@ onMounted(() => { </div> </form> <div class="col-5"> - You can copy objects. You have to create destination container prior + You can copy objects. You have to create destination buckets prior to copy.<br /> You can specify folder by using '/' at destination object field. For example, if you want to copy object under the folder named diff --git a/src/components/Modals/CreateBucketModal.vue b/src/components/object-storage/modals/CreateBucketModal.vue similarity index 65% rename from src/components/Modals/CreateBucketModal.vue rename to src/components/object-storage/modals/CreateBucketModal.vue index 2e9dec8d66ebca90909dbf14bc5d66e0ff40848d..ae030960e3ab025834d85ba26ef3f56a17d297a4 100644 --- a/src/components/Modals/CreateBucketModal.vue +++ b/src/components/object-storage/modals/CreateBucketModal.vue @@ -1,22 +1,27 @@ <script setup lang="ts"> -import { BucketService } from "@/client"; -import type { BucketIn } from "@/client"; -import { reactive, onMounted } from "vue"; -import BootstrapModal from "@/components/Modals/BootstrapModal.vue"; +import type { BucketIn } from "@/client/s3proxy"; +import { reactive, onMounted, ref } from "vue"; +import BootstrapModal from "@/components/modals/BootstrapModal.vue"; import { useRouter } from "vue-router"; import { Modal } from "bootstrap"; +import { useBucketStore } from "@/stores/buckets"; const router = useRouter(); -const emit = defineEmits(["bucketCreated"]); -const bucket = reactive({ name: "", description: "" } as BucketIn); -const formState = reactive({ - validated: false, - bucketNameTaken: false, - loading: false, -} as { +const bucketRepository = useBucketStore(); + +const bucketCreateForm = ref<HTMLFormElement | undefined>(undefined); +const bucketNameElement = ref<HTMLInputElement | undefined>(undefined); + +const bucket = reactive<BucketIn>({ name: "", description: "" }); + +const formState = reactive<{ validated: boolean; bucketNameTaken: boolean; loading: boolean; +}>({ + validated: false, + bucketNameTaken: false, + loading: false, }); const props = defineProps<{ @@ -32,15 +37,15 @@ onMounted(() => { function createBucket() { formState.validated = true; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const form = document.getElementById("bucketCreateForm")! as HTMLFormElement; formState.bucketNameTaken = false; bucket.description = bucket.description.trim(); bucket.name = bucket.name.trim(); - if (form.checkValidity()) { + bucketNameElement.value?.setCustomValidity(""); + if (bucketCreateForm.value?.checkValidity()) { formState.loading = true; - BucketService.bucketCreateBucket(bucket) + bucketRepository + .createBucket(bucket) .then((createdBucket) => { - emit("bucketCreated", createdBucket); createBucketModal?.hide(); bucket.name = ""; bucket.description = ""; @@ -57,6 +62,9 @@ function createBucket() { error.body["detail"] === "Bucket name is already taken" ) { formState.bucketNameTaken = true; + bucketNameElement.value?.setCustomValidity( + "Bucket name is already taken", + ); } }) .finally(() => { @@ -68,6 +76,7 @@ function createBucket() { function modalClosed() { formState.validated = false; formState.bucketNameTaken = false; + bucketNameElement.value?.setCustomValidity(""); } </script> @@ -78,12 +87,12 @@ function modalClosed() { modal-label="Create Bucket Modal" v-on="{ 'hidden.bs.modal': modalClosed }" > - <template v-slot:header> Create new Bucket </template> + <template v-slot:header> Create new S3 Bucket</template> <template v-slot:body> <form id="bucketCreateForm" :class="{ 'was-validated': formState.validated }" - novalidate + ref="bucketCreateForm" > <div class="mb-3"> <label for="bucketNameInput" class="form-label">Bucket Name</label> @@ -95,31 +104,43 @@ function modalClosed() { required minlength="3" maxlength="63" - pattern="(?!(^((2(5[0-5]|[0-4]\d)|[01]?\d{1,2})\.){3}(2(5[0-5]|[0-4]\d)|[01]?\d{1,2})$))^[a-z\d][a-z\d.-]{1,61}[a-z\d]$" + pattern="(?!(^(\d+\.){3}\d+$))^([a-z0-9](?:[a-z0-9\-]*[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9\-]*[a-z0-9])?$" v-model="bucket.name" + ref="bucketNameElement" /> <div class="invalid-feedback"> - Requirements - <ul> - <li>At least 3 Characters long</li> - <li>Lowercase</li> - <li>Only [a-z][0-9].-</li> - <li>No IP address</li> - </ul> + <div v-if="formState.bucketNameTaken"> + Bucket name already taken. + </div> + <div> + Requirements + <ul> + <li>At least 3 Characters long</li> + <li>Unique in CloWM</li> + <li> + Only lowercase letters, numbers, single periods (.) and + hyphen (-) + </li> + <li>Start and end with letter or number</li> + <li> + A letter or number must be before and after a period (.) + </li> + </ul> + </div> </div> </div> </div> <div class="mb-3"> <label for="bucketDescriptionInput" class="form-label"> - Description {{ bucket.description.length }} / 126 + Description </label> <div class="input-group"> <textarea class="form-control" id="bucketDescriptionInput" required - rows="5" - minlength="126" + rows="3" + minlength="32" maxlength="65536" v-model="bucket.description" placeholder="Describe the purpose of the bucket" @@ -127,15 +148,12 @@ function modalClosed() { <div class="invalid-feedback"> Requirements <ul> - <li>At least 126 Characters long</li> + <li>At least 32 Characters long</li> </ul> </div> </div> </div> </form> - <div v-if="formState.bucketNameTaken" class="text-danger"> - Bucket name already taken. - </div> </template> <template v-slot:footer> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal"> diff --git a/src/components/Modals/CreateFolderModal.vue b/src/components/object-storage/modals/CreateFolderModal.vue similarity index 80% rename from src/components/Modals/CreateFolderModal.vue rename to src/components/object-storage/modals/CreateFolderModal.vue index bf473259f5f3865b27ddc3064852a71e09e6f8eb..cd26d2c2a94ff03d6abe9a68e0f2fb5e623a081a 100644 --- a/src/components/Modals/CreateFolderModal.vue +++ b/src/components/object-storage/modals/CreateFolderModal.vue @@ -1,65 +1,53 @@ <script setup lang="ts"> -import type { S3Client } from "@aws-sdk/client-s3"; -import { PutObjectCommand } from "@aws-sdk/client-s3"; -import BootstrapModal from "@/components/Modals/BootstrapModal.vue"; +import BootstrapModal from "@/components/modals/BootstrapModal.vue"; import { computed, onMounted, reactive } from "vue"; -import type { ComputedRef } from "vue"; -import type { S3ObjectMetaInformation } from "@/client"; -import dayjs from "dayjs"; + import { Modal, Toast } from "bootstrap"; +import { useS3ObjectStore } from "@/stores/s3objects"; + +const objectRepository = useS3ObjectStore(); const props = defineProps<{ modalID: string; bucketName: string; keyPrefix: string; - s3Client: S3Client; }>(); -const randomIDSuffix = Math.random().toString(16).substr(2, 8); +const randomIDSuffix = Math.random().toString(16).substring(2, 8); let uploadModal: Modal | null = null; let successToast: Toast | null = null; let errorToast: Toast | null = null; -const currentFolders: ComputedRef<string[]> = computed(() => - props.keyPrefix.split("/") -); - -const emit = defineEmits<{ - (e: "folder-created", object: S3ObjectMetaInformation): void; -}>(); +const currentFolders = computed<string[]>(() => props.keyPrefix.split("/")); -const formState = reactive({ - folderName: "", - uploading: false, -} as { +const formState = reactive<{ folderName: string; uploading: boolean; +}>({ + folderName: "", + uploading: false, }); function uploadFolder() { const key = - (props.keyPrefix.length > 0 + props.keyPrefix.length > 0 ? props.keyPrefix + "/" + formState.folderName - : formState.folderName) + "/.s3keep"; - const command = new PutObjectCommand({ - Bucket: props.bucketName, - Body: "", - ContentType: "text/plain", - Key: key, - }); + : formState.folderName; + const reversedKey = key + .replace(/(\/)\1+/g, "/") + .split("") + .reverse(); + const firstLetterIndex = reversedKey.findIndex((char) => char !== "/"); + if (firstLetterIndex < 0) { + return; + } + const realKey = reversedKey.slice(firstLetterIndex).reverse().join("") + "/"; formState.uploading = true; - props.s3Client - .send(command) + objectRepository + .createFolder(props.bucketName, realKey) .then(() => { uploadModal?.hide(); successToast?.show(); - emit("folder-created", { - key: key, - bucket: props.bucketName, - size: 0, - last_modified: dayjs().toISOString(), - content_type: "text/plain", - }); formState.folderName = ""; }) .catch((e) => { diff --git a/src/components/object-storage/modals/ObjectDetailModal.vue b/src/components/object-storage/modals/ObjectDetailModal.vue new file mode 100644 index 0000000000000000000000000000000000000000..08f5280a86aac2400e20909bae8723377ac92916 --- /dev/null +++ b/src/components/object-storage/modals/ObjectDetailModal.vue @@ -0,0 +1,148 @@ +<script setup lang="ts"> +import BootstrapModal from "@/components/modals/BootstrapModal.vue"; +import dayjs from "dayjs"; +import { filesize } from "filesize"; +import { computed, onMounted, watch, reactive } from "vue"; +import { useS3ObjectStore } from "@/stores/s3objects"; + +const objectRepository = useS3ObjectStore(); + +const props = defineProps<{ + modalID: string; + objectKey: string | undefined; + bucket: string; +}>(); + +const detailState = reactive<{ + loading: boolean; + error: boolean; +}>({ + loading: true, + error: false, +}); + +const metaIdentifier = computed<string>(() => { + return props.bucket + "/" + props.objectKey; +}); + +watch(props, (newProps) => { + detailState.loading = true; + if (newProps.objectKey) { + fetchMetaInfo(newProps.bucket, newProps.objectKey); + } +}); + +function fetchMetaInfo(bucket: string, key: string) { + detailState.loading = true; + detailState.error = false; + objectRepository + .fetchS3ObjectMeta(bucket, key, () => { + detailState.loading = false; + }) + .catch(() => { + detailState.error = true; + }); +} + +onMounted(() => { + if (props.objectKey) { + fetchMetaInfo(props.bucket, props.objectKey); + } +}); +</script> + +<template> + <bootstrap-modal + :modalID="modalID" + :static-backdrop="false" + modal-label="Object Detail Modal" + > + <template v-slot:header> + <h4>File Details</h4> + </template> + <template v-slot:body> + <div class="container-fluid"> + <table class="table table-hover table-sm table-borderless"> + <tbody> + <tr> + <th scope="row" class="col-4">Bucket</th> + <td class="col-8">{{ props.bucket }}</td> + </tr> + <tr> + <th scope="row">Name</th> + <td>{{ props.objectKey }}</td> + </tr> + <tr> + <th scope="row">Size</th> + <td v-if="detailState.error">N/A</td> + <td v-else-if="detailState.loading" class="placeholder-glow"> + <span class="placeholder col-2"></span> + </td> + <td v-else> + {{ + filesize( + objectRepository.objectMetaMapping[metaIdentifier] + .ContentLength ?? 0, + { + base: 2, + standard: "jedec", + }, + ) + }} + </td> + </tr> + <tr> + <th scope="row">Timestamp</th> + <td v-if="detailState.error">N/A</td> + <td v-else-if="detailState.loading" class="placeholder-glow"> + <span class="placeholder col-6"></span> + </td> + <td v-else> + {{ + dayjs( + objectRepository.objectMetaMapping[metaIdentifier] + .LastModified, + ).format("YYYY-MM-DD HH:mm:ss") + }} + </td> + </tr> + <tr> + <th scope="row">Content Type</th> + <td v-if="detailState.error">N/A</td> + <td v-else-if="detailState.loading" class="placeholder-glow"> + <span class="placeholder col-5"></span> + </td> + <td v-else> + {{ + objectRepository.objectMetaMapping[metaIdentifier].ContentType + }} + </td> + </tr> + <tr> + <th scope="row">ETag</th> + <td v-if="detailState.error">N/A</td> + <td v-else-if="detailState.loading" class="placeholder-glow"> + <span class="placeholder col-10"></span> + </td> + <td v-else> + {{ objectRepository.objectMetaMapping[metaIdentifier].ETag }} + </td> + </tr> + </tbody> + </table> + </div> + </template> + <template v-slot:footer> + <button type="button" class="btn btn-secondary" data-bs-dismiss="modal"> + Close + </button> + </template> + </bootstrap-modal> +</template> + +<style scoped> +th { + font-weight: bold; + text-align: end; +} +</style> diff --git a/src/components/object-storage/modals/PermissionListModal.vue b/src/components/object-storage/modals/PermissionListModal.vue new file mode 100644 index 0000000000000000000000000000000000000000..1d5c4d020a74e2bf737026c03ad5610cb095b41e --- /dev/null +++ b/src/components/object-storage/modals/PermissionListModal.vue @@ -0,0 +1,120 @@ +<script setup lang="ts"> +import type { BucketPermissionOut } from "@/client/s3proxy"; +import type { FolderTree } from "@/types/PseudoFolder"; +import { reactive } from "vue"; +import { onBeforeMount, watch } from "vue"; +import BootstrapModal from "@/components/modals/BootstrapModal.vue"; +import PermissionModal from "@/components/object-storage/modals/PermissionModal.vue"; +import { useBucketStore } from "@/stores/buckets"; + +const bucketRepository = useBucketStore(); +// Props +// ----------------------------------------------------------------------------- +const props = defineProps<{ + bucketName: string; + subFolders: FolderTree; + modalID: string; +}>(); + +// Reactive State +// ----------------------------------------------------------------------------- +const state = reactive<{ + currentPermission: BucketPermissionOut; +}>({ + currentPermission: { + bucket_name: "bucketname", + uid: "uid", + permission: "READ", + grantee_display_name: "display_name", + from_timestamp: null, + to_timestamp: null, + file_prefix: null, + }, +}); + +const randomIDSuffix = Math.random().toString(16).substring(2, 8); + +// Watchers +// ----------------------------------------------------------------------------- +watch( + () => props.bucketName, + (newBucketName) => { + updateBucketPermissions(newBucketName); + }, +); + +// Function +// ----------------------------------------------------------------------------- +function updateBucketPermissions(bucketName: string) { + bucketRepository.fetchBucketPermissions(bucketName); +} + +// Lifecycle Hooks +// ----------------------------------------------------------------------------- +onBeforeMount(() => { + updateBucketPermissions(props.bucketName); +}); +</script> + +<template> + <permission-modal + :deletable="true" + :editable="true" + :readonly="true" + :edit-user-permission="state.currentPermission" + :bucket-name="state.currentPermission.bucket_name" + :sub-folders="props.subFolders" + :back-modal-id="props.modalID" + :modalID="'permission-list-edit-modal' + randomIDSuffix" + /> + <bootstrap-modal + :modalID="props.modalID" + :static-backdrop="true" + modal-label="Permission List Modal" + > + <template v-slot:header> + Bucket Permissions for Bucket <i>{{ props.bucketName }}</i> + </template> + <template v-slot:body> + <div> + <div + class="list-group" + v-if=" + bucketRepository.getBucketPermissions(props.bucketName).length > 0 + " + > + <button + type="button" + class="list-group-item list-group-item-action text-truncate" + v-for="permission in bucketRepository.getBucketPermissions( + props.bucketName, + )" + :key="permission.uid" + @click="state.currentPermission = permission" + data-bs-toggle="modal" + :data-bs-target="'#permission-list-edit-modal' + randomIDSuffix" + > + <div class="row"> + <span class="text-info col-2 text-start">{{ + permission.permission + }}</span> + <span class="col-9 text-center"> + {{ permission.grantee_display_name }}</span + > + </div> + </button> + </div> + <div v-else> + <h3 class="text-center">No Bucket Permissions for this bucket yet</h3> + </div> + </div> + </template> + <template v-slot:footer> + <button type="button" class="btn btn-secondary" data-bs-dismiss="modal"> + Close + </button> + </template> + </bootstrap-modal> +</template> + +<style scoped></style> diff --git a/src/components/Modals/PermissionModal.vue b/src/components/object-storage/modals/PermissionModal.vue similarity index 71% rename from src/components/Modals/PermissionModal.vue rename to src/components/object-storage/modals/PermissionModal.vue index 305469ec506076b84eeb1c759bf6ad66706be8ea..60ad031740571fd138c8cb918a68137d4bf94259 100644 --- a/src/components/Modals/PermissionModal.vue +++ b/src/components/object-storage/modals/PermissionModal.vue @@ -1,33 +1,21 @@ <script setup lang="ts"> import { onMounted, reactive, watch, ref, computed } from "vue"; -import BootstrapModal from "@/components/Modals/BootstrapModal.vue"; -import DeleteModal from "@/components/Modals/DeleteModal.vue"; -import SearchUserModal from "@/components/Modals/SearchUserModal.vue"; +import BootstrapModal from "@/components/modals/BootstrapModal.vue"; +import DeleteModal from "@/components/modals/DeleteModal.vue"; +import SearchUserModal from "@/components/modals/SearchUserModal.vue"; import { Modal } from "bootstrap"; import dayjs from "dayjs"; import type { BucketPermissionOut, BucketPermissionIn, - S3ObjectMetaInformation, BucketPermissionParameters, - User, -} from "@/client"; -import type { ComputedRef, Ref } from "vue"; -import { PermissionEnum, BucketPermissionsService } from "@/client"; +} from "@/client/s3proxy"; +import type { User } from "@/client/auth"; +import type { FolderTree } from "@/types/PseudoFolder"; +import { Permission } from "@/client/s3proxy"; import { Toast } from "bootstrap"; -import BootstrapIcon from "@/components/BootstrapIcon.vue"; - -// Types -// ----------------------------------------------------------------------------- -interface S3ObjectWithFolder extends S3ObjectMetaInformation { - folder: string[]; - pseudoFileName: string; -} - -type FolderTree = { - subFolders: Record<string, FolderTree>; - files: S3ObjectWithFolder[]; -}; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import { useBucketStore } from "@/stores/buckets"; // Props // ----------------------------------------------------------------------------- @@ -35,55 +23,61 @@ const props = defineProps<{ modalID: string; bucketName: string; subFolders: FolderTree; - editUserPermission: BucketPermissionOut | undefined; + editUserPermission?: BucketPermissionOut; readonly: boolean; editable: boolean; deletable: boolean; - backModalId: string | undefined; + backModalId?: string; }>(); +const bucketRepository = useBucketStore(); + +const emit = defineEmits<{ (e: "permission-deleted"): void }>(); // Variables // ----------------------------------------------------------------------------- -const randomIDSuffix = Math.random().toString(16).substr(2, 8); +const randomIDSuffix = Math.random().toString(16).substring(2, 8); let permissionModal: Modal | null = null; let successToast: Toast | null = null; // Reactive State // ----------------------------------------------------------------------------- -const formState = reactive({ - loading: false, - grantee_name: "", - error: false, - readonly: props.readonly, -} as { +// eslint-disable-next-line vue/no-setup-props-destructure +const formState = reactive<{ loading: boolean; grantee_name: string; error: boolean; readonly: boolean; +}>({ + loading: false, + grantee_name: "", + error: false, + readonly: props.readonly, }); -const permission = reactive({ +// eslint-disable-next-line vue/no-setup-props-destructure +const permission = reactive<BucketPermissionIn>({ from_timestamp: undefined, to_timestamp: undefined, file_prefix: undefined, permission: undefined, uid: "", bucket_name: props.bucketName, -} as BucketPermissionIn); +}); -const permissionDeleted: Ref<boolean> = ref(false); +const permissionDeleted = ref<boolean>(false); +const permissionForm = ref<HTMLFormElement | undefined>(undefined); // Computes Properties // ----------------------------------------------------------------------------- -const editPermission: ComputedRef<boolean> = computed( - () => props.editUserPermission != undefined +const editPermission = computed<boolean>( + () => props.editUserPermission != undefined, ); -const possibleSubFolders: ComputedRef<string[]> = computed(() => - findSubFolders(props.subFolders, []) +const possibleSubFolders = computed<string[]>(() => + findSubFolders(props.subFolders, []), ); -const permissionUserReadonly: ComputedRef<boolean> = computed(() => { +const permissionUserReadonly = computed<boolean>(() => { return formState.readonly || editPermission.value; }); @@ -92,24 +86,16 @@ const permissionUserReadonly: ComputedRef<boolean> = computed(() => { watch( () => props.bucketName, (newBucketName) => { - updatePermission(); + updateLocalPermission(); permission.bucket_name = newBucketName; - } + }, ); watch( () => props.editUserPermission, - () => updatePermission() + () => updateLocalPermission(), ); -// Events -// ----------------------------------------------------------------------------- -const emit = defineEmits<{ - (e: "permission-deleted", permission: BucketPermissionIn): void; - (e: "permission-created", permission: BucketPermissionOut): void; - (e: "permission-edited", permission: BucketPermissionOut): void; -}>(); - // Functions // ----------------------------------------------------------------------------- /** @@ -119,7 +105,7 @@ function modalClosed() { formState.readonly = props.readonly; formState.error = false; if (editPermission.value) { - updatePermission(); + updateLocalPermission(); } } @@ -134,27 +120,21 @@ function toastHidden() { * Check if an input should be visible based on its state * @param input Input which visibility should be determined. */ -function inputVisible(input: string | undefined): boolean { +function inputVisible(input?: number | string | null): boolean { return !formState.readonly || input != undefined; } /** * Update the form content */ -function updatePermission() { +function updateLocalPermission() { if (props.editUserPermission != undefined) { permission.bucket_name = props.editUserPermission.bucket_name; permission.file_prefix = props.editUserPermission.file_prefix; permission.uid = props.editUserPermission.uid; formState.grantee_name = props.editUserPermission.grantee_display_name; - permission.from_timestamp = - props.editUserPermission.from_timestamp != null - ? dayjs(props.editUserPermission.from_timestamp).format("YYYY-MM-DD") - : undefined; - permission.to_timestamp = - props.editUserPermission.to_timestamp != null - ? dayjs(props.editUserPermission.to_timestamp).format("YYYY-MM-DD") - : undefined; + permission.from_timestamp = props.editUserPermission.from_timestamp; + permission.to_timestamp = props.editUserPermission.to_timestamp; permission.permission = props.editUserPermission.permission; } else { permission.file_prefix = undefined; @@ -173,20 +153,20 @@ function updatePermission() { */ function findSubFolders( currentFolder: FolderTree, - parentFolders: string[] + parentFolders: string[], ): string[] { const arr: string[] = []; for (const subFolder of Object.keys(currentFolder.subFolders)) { const subFolderString = (parentFolders.length > 0 ? parentFolders.join("/") + "/" : "") + subFolder + - "/"; + (subFolder.endsWith("/") ? "" : "/"); arr.push( subFolderString, ...findSubFolders( currentFolder.subFolders[subFolder], - subFolderString.slice(0, subFolderString.length - 1).split("/") - ) + subFolderString.slice(0, subFolderString.length - 1).split("/"), + ), ); } return arr; @@ -197,49 +177,25 @@ function findSubFolders( */ function formSubmit() { formState.error = false; - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const form = document.getElementById( - "permissionCreateEditForm" + randomIDSuffix - )! as HTMLFormElement; - if (form.checkValidity()) { - const tempPermission: BucketPermissionIn = permission; - if (permission.from_timestamp != null) { - tempPermission.from_timestamp = - permission.from_timestamp.length > 0 - ? dayjs(permission.from_timestamp).toISOString() - : undefined; - } - if (permission.to_timestamp != null) { - tempPermission.to_timestamp = - permission.to_timestamp.length > 0 - ? dayjs(permission.to_timestamp).toISOString() - : undefined; - } + if (permissionForm.value?.checkValidity()) { formState.loading = true; const serverAnswerPromise = editPermission.value - ? BucketPermissionsService.bucketPermissionsUpdatePermission( - permission.uid, + ? bucketRepository.updateBucketPermission( permission.bucket_name, + permission.uid, { - to_timestamp: tempPermission.to_timestamp, - from_timestamp: tempPermission.from_timestamp, - permission: tempPermission.permission, - file_prefix: tempPermission.file_prefix, - } as BucketPermissionParameters + to_timestamp: permission.to_timestamp, + from_timestamp: permission.from_timestamp, + permission: permission.permission, + file_prefix: permission.file_prefix, + } as BucketPermissionParameters, ) - : BucketPermissionsService.bucketPermissionsCreatePermission( - tempPermission - ); + : bucketRepository.createBucketPermission(permission); serverAnswerPromise - .then((permission) => { - if (editPermission.value) { - emit("permission-edited", permission); - } else { - emit("permission-created", permission); - } + .then(() => { permissionModal?.hide(); successToast?.show(); - updatePermission(); + updateLocalPermission(); }) .catch(() => { formState.error = true; @@ -258,15 +214,13 @@ function formSubmit() { function confirmedDeletePermission(bucketName: string, uid: string) { if (!formState.loading) { formState.loading = true; - BucketPermissionsService.bucketPermissionsDeletePermissionForBucket( - bucketName, - uid - ) + bucketRepository + .deleteBucketPermission(bucketName, uid) .then(() => { permissionDeleted.value = true; + emit("permission-deleted"); permissionModal?.hide(); successToast?.show(); - emit("permission-deleted", permission); }) .catch(() => { formState.error = true; @@ -281,13 +235,26 @@ function updateUser(user: User) { permission.uid = user.uid; formState.grantee_name = user.display_name; } + // Lifecycle Hooks // ----------------------------------------------------------------------------- onMounted(() => { permissionModal = new Modal("#" + props.modalID); successToast = new Toast("#" + "toast-" + randomIDSuffix); - updatePermission(); + updateLocalPermission(); }); + +function fromTimestampChanged(target?: HTMLInputElement | null) { + permission.from_timestamp = target?.value + ? dayjs(target?.value).unix() + : undefined; +} + +function toTimestampChanged(target?: HTMLInputElement | null) { + permission.to_timestamp = target?.value + ? dayjs(target?.value).unix() + : undefined; +} </script> <template> @@ -343,26 +310,20 @@ onMounted(() => { <template v-slot:header v-else-if="props.editUserPermission !== undefined" >Edit Permission </template> - <template v-slot:header v-else> Create new Permission </template> + <template v-slot:header v-else> Create new Bucket Permission</template> <template v-slot:extra-button> - <bootstrap-icon + <font-awesome-icon v-if="props.deletable" - icon="trash-fill" - :height="15" - :width="15" - fill="currentColor" - class="me-2" + icon="fa-solid fa-trash" + class="me-2 cursor-pointer" :class="{ 'delete-icon': !formState.loading }" data-bs-toggle="modal" :data-bs-target="'#delete-permission-modal' + randomIDSuffix" /> - <bootstrap-icon + <font-awesome-icon v-if="formState.readonly && props.editable" - icon="pencil-fill" - :height="15" - :width="15" - fill="currentColor" - class="pseudo-link" + icon="fa-solid fa-pen" + class="pseudo-link cursor-pointer" @click="formState.readonly = false" /> </template> @@ -370,6 +331,7 @@ onMounted(() => { <form @submit.prevent="formSubmit" :id="'permissionCreateEditForm' + randomIDSuffix" + ref="permissionForm" > <div class="mb-3 row"> <label for="bucketNameInput" class="col-2 col-form-label" @@ -413,20 +375,15 @@ onMounted(() => { data-bs-toggle="modal" :data-bs-target="'#search-user-modal' + randomIDSuffix" > - <bootstrap-icon - icon="search" - :height="13" - :width="13" - fill="white" - /> + <font-awesome-icon icon="fa-solid fa-magnifying-glass" /> </button> </div> </div> <div class="mb-3 row"> - <label for="permissionTypeInput" class="col-2 col-form-label"> - Type<span v-if="!formState.readonly">*</span> + <label for="permissionTypeInput" class="col-3 col-form-label"> + Permission Type<span v-if="!formState.readonly">*</span> </label> - <div class="col-10"> + <div class="col-9"> <select class="form-select text-lowercase" id="permissionTypeInput" @@ -435,7 +392,7 @@ onMounted(() => { v-model="permission.permission" > <option disabled selected>Select one...</option> - <option v-for="perm in PermissionEnum" :key="perm" :value="perm"> + <option v-for="perm in Permission" :key="perm" :value="perm"> {{ perm.toLowerCase() }} </option> </select> @@ -456,7 +413,15 @@ onMounted(() => { id="permissionDateFromInput" :readonly="formState.readonly" :min="dayjs().format('YYYY-MM-DD')" - v-model="permission.from_timestamp" + :value=" + permission.from_timestamp + ? dayjs.unix(permission.from_timestamp).format('YYYY-MM-DD') + : undefined + " + @input=" + (event) => + fromTimestampChanged(event.target as HTMLInputElement) + " /> </div> <label @@ -470,16 +435,24 @@ onMounted(() => { <input type="date" class="form-control" - id="permissionToFromInput" + id="permissionDateToInput" :readonly="formState.readonly" - v-model="permission.to_timestamp" :min=" permission.from_timestamp != null - ? dayjs(permission.from_timestamp) + ? dayjs + .unix(permission.from_timestamp) .add(1, 'day') .format('YYYY-MM-DD') : dayjs().add(1, 'day').format('YYYY-MM-DD') " + :value=" + permission.to_timestamp + ? dayjs.unix(permission.to_timestamp).format('YYYY-MM-DD') + : undefined + " + @input=" + (event) => toTimestampChanged(event.target as HTMLInputElement) + " /> </div> </div> @@ -520,14 +493,9 @@ onMounted(() => { type="button" class="btn btn-outline-danger btn-sm float-end" @click="permission.file_prefix = undefined" - :disabled="permission.file_prefix === undefined" + :hidden="permission.file_prefix == undefined" > - <bootstrap-icon - icon="x-lg" - :height="14" - :width="14" - fill="currentColor" - /> + <font-awesome-icon icon="fa-solid fa-x" /> </button> </div> </div> @@ -575,18 +543,18 @@ onMounted(() => { <style scoped> .pseudo-link { - cursor: pointer; color: var(--bs-secondary); } + .pseudo-link:hover { - color: var(--bs-primary); + color: var(--bs-link-hover-color); } .delete-icon { - color: var(--bs-secondary); - cursor: pointer; + color: var(--bs-secondary) !important; } + .delete-icon:hover { - color: var(--bs-danger); + color: var(--bs-danger) !important; } </style> diff --git a/src/components/Modals/UploadObjectModal.vue b/src/components/object-storage/modals/UploadObjectModal.vue similarity index 71% rename from src/components/Modals/UploadObjectModal.vue rename to src/components/object-storage/modals/UploadObjectModal.vue index c8af82e3e1937924dcd947c8c32de133a6ff7054..adafe9a20af1735e997005d1737f9b3dc2edaa1b 100644 --- a/src/components/Modals/UploadObjectModal.vue +++ b/src/components/object-storage/modals/UploadObjectModal.vue @@ -1,40 +1,33 @@ <script setup lang="ts"> -import type { S3Client } from "@aws-sdk/client-s3"; -import { Upload } from "@aws-sdk/lib-storage"; -import BootstrapModal from "@/components/Modals/BootstrapModal.vue"; -import { computed, onMounted, reactive, watch } from "vue"; -import type { ComputedRef } from "vue"; -import type { S3ObjectMetaInformation } from "@/client"; -import dayjs from "dayjs"; -import { filesize } from "filesize"; +import BootstrapModal from "@/components/modals/BootstrapModal.vue"; +import { computed, onMounted, reactive, ref, watch } from "vue"; import { Modal, Toast } from "bootstrap"; +import { partial } from "filesize"; +import { useS3ObjectStore } from "@/stores/s3objects"; + +const fsize = partial({ base: 2, standard: "jedec" }); +const objectRepository = useS3ObjectStore(); const props = defineProps<{ modalID: string; bucketName: string; keyPrefix: string; - s3Client: S3Client; - editObjectFileName: string | undefined; + editObjectFileName?: string; }>(); -const randomIDSuffix = Math.random().toString(16).substr(2, 8); +const randomIDSuffix = Math.random().toString(16).substring(2, 8); +const objectFileInput = ref<HTMLInputElement | undefined>(undefined); let uploadModal: Modal | null = null; let successToast: Toast | null = null; let errorToast: Toast | null = null; -const currentFolders: ComputedRef<string[]> = computed(() => - props.keyPrefix.split("/") -); - -const emit = defineEmits<{ - (e: "object-created", object: S3ObjectMetaInformation): void; -}>(); +const currentFolders = computed<string[]>(() => props.keyPrefix.split("/")); watch( () => props.editObjectFileName, (nextFileName) => { formState.key = nextFileName ?? ""; - } + }, ); const formState = reactive({ @@ -51,68 +44,52 @@ const formState = reactive({ uploadTotal: number; }); -const uploadProgress: ComputedRef<number> = computed(() => - Math.round((100 * formState.uploadDone) / formState.uploadTotal) +const uploadProgress = computed<number>(() => + Math.round((100 * formState.uploadDone) / formState.uploadTotal), ); -const editObject: ComputedRef<boolean> = computed( - () => props.editObjectFileName !== undefined +const editObject = computed<boolean>( + () => props.editObjectFileName !== undefined, ); -async function uploadObject() { +function uploadObject() { const key = props.keyPrefix.length > 0 ? props.keyPrefix + "/" + formState.key : formState.key; - try { - formState.uploadDone = 0; - formState.uploading = true; - const parallelUploads3 = new Upload({ - client: props.s3Client, - params: { - Bucket: props.bucketName, - Body: formState.file, - ContentType: formState.file.type, - Key: key, - }, - queueSize: 4, // optional concurrency configuration - partSize: 1024 * 1024 * 5, // optional size of each part, in bytes, at least 5MB - leavePartsOnError: false, // optional manually handle dropped parts - }); - - parallelUploads3.on("httpUploadProgress", (progress) => { + formState.uploadDone = 0; + formState.uploading = true; + objectRepository + .uploadObjectFile(props.bucketName, key, formState.file, (progress) => { if (progress.loaded != null && progress.total != null) { formState.uploadDone = progress.loaded; formState.uploadTotal = progress.total; } + }) + .then(() => { + uploadModal?.hide(); + successToast?.show(); + formState.key = ""; + if (objectFileInput.value != undefined) { + objectFileInput.value.value = ""; + } + }) + .catch((e) => { + console.error(e); + errorToast?.show(); + }) + .finally(() => { + formState.uploading = false; }); - await parallelUploads3.done(); - uploadModal?.hide(); - successToast?.show(); - emit("object-created", { - key: key, - bucket: props.bucketName, - size: formState.file?.size ?? 0, - last_modified: dayjs().toISOString(), - content_type: formState.file?.type ?? "text/plain", - }); - formState.key = ""; - ( - document.getElementById("objectFile" + randomIDSuffix) as HTMLInputElement - ).value = ""; - } catch (e) { - console.error(e); - errorToast?.show(); - } finally { - formState.uploading = false; - } } -// eslint-disable-next-line -function fileChange(event: any) { - formState.file = event.target.files[0]; - if (!editObject.value) { - formState.key = formState.file.name; +function fileChange() { + if (objectFileInput.value != undefined) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + formState.file = objectFileInput.value.files![0]; + if (!editObject.value) { + formState.key = formState.file.name; + } } } @@ -212,6 +189,7 @@ onMounted(() => { class="form-control" type="file" :id="'objectFile' + randomIDSuffix" + ref="objectFileInput" required @change="fileChange" /> @@ -257,8 +235,8 @@ onMounted(() => { </div> </div> <span v-if="formState.uploadDone > 0"> - {{ filesize(formState.uploadDone) }} / - {{ filesize(formState.uploadTotal) }} + {{ fsize(formState.uploadDone) }} / + {{ fsize(formState.uploadTotal) }} </span> </div> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal"> diff --git a/src/components/parameter-schema/ParameterSchemaDescriptionComponent.vue b/src/components/parameter-schema/ParameterSchemaDescriptionComponent.vue new file mode 100644 index 0000000000000000000000000000000000000000..2ad76fb820645d7f25c4fb498fee237c7d3b1227 --- /dev/null +++ b/src/components/parameter-schema/ParameterSchemaDescriptionComponent.vue @@ -0,0 +1,101 @@ +<script setup lang="ts"> +import { computed, ref } from "vue"; +import ParameterGroupDescription from "@/components/parameter-schema/description-mode/ParameterGroupDescription.vue"; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; + +const props = defineProps({ + schema: { + type: Object, + required: true, + }, +}); + +type ParameterGroup = { + group: string; + title: string; + icon?: string; +}; + +const showHidden = ref<boolean>(false); + +const navParameterGroups = computed<ParameterGroup[]>(() => { + let groups = Object.keys(parameterGroups.value).map((group) => { + return { + group: group, + title: parameterGroups.value[group]["title"], + icon: parameterGroups.value[group]["fa_icon"], + }; + }); + if (!showHidden.value) { + groups = groups.filter( + // filter all groups that have only hidden parameters + (group) => + Object.keys(parameterGroups.value[group.group]["properties"]).filter( + (key) => + !parameterGroups.value[group.group]["properties"][key]["hidden"], + ).length > 0, + ); + } + return groups; +}); + +const parameterGroups = computed<Record<string, never>>( + () => props.schema["definitions"], +); +</script> + +<template> + <div class="row px-2 mb-5 align-items-start"> + <div class="col-9"> + <div v-for="(group, groupName) in parameterGroups" :key="groupName"> + <parameter-group-description + :parameter-group="group" + :parameter-group-name="groupName" + :show-hidden="showHidden" + /> + </div> + </div> + <div + class="col-3 sticky-top" + style="top: 70px !important; max-height: calc(100vh - 150px)" + > + <nav class="h-100 rounded-1 border"> + <nav class="nav"> + <ul class="ps-0"> + <li + class="nav-link" + v-for="group in navParameterGroups" + :key="group.group" + > + <a :href="'#' + group.group"> + <font-awesome-icon + :icon="group.icon" + v-if="group.icon" + class="me-2" + /> + {{ group.title }}</a + > + </li> + </ul> + <div class="mx-auto mb-3"> + <input + type="checkbox" + class="btn-check ms-1" + id="btn-check-outlined" + v-model="showHidden" + autocomplete="off" + /> + <label class="btn btn-outline-primary" for="btn-check-outlined"> + <font-awesome-icon + :icon="showHidden ? 'fa-solid fa-eye' : 'fa-solid fa-eye-slash'" + /> + Show hidden Parameters + </label> + </div> + </nav> + </nav> + </div> + </div> +</template> + +<style scoped></style> diff --git a/src/components/parameter-schema/ParameterSchemaFormComponent.vue b/src/components/parameter-schema/ParameterSchemaFormComponent.vue new file mode 100644 index 0000000000000000000000000000000000000000..7546e8bbb109e223955dd0c548f8ca097799c33d --- /dev/null +++ b/src/components/parameter-schema/ParameterSchemaFormComponent.vue @@ -0,0 +1,429 @@ +<script setup lang="ts"> +import { computed, ref, reactive, watch, onMounted } from "vue"; +import ParameterGroupForm from "@/components/parameter-schema/form-mode/ParameterGroupForm.vue"; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import Ajv from "ajv"; +import type { ValidateFunction } from "ajv"; +import ParameterStringInput from "@/components/parameter-schema/form-mode/ParameterStringInput.vue"; +import { Toast } from "bootstrap"; +import { useBucketStore } from "@/stores/buckets"; +import { useS3KeyStore } from "@/stores/s3keys"; + +const bucketRepository = useBucketStore(); +const s3KeyRepository = useS3KeyStore(); + +// Props +// ============================================================================= +const props = defineProps({ + schema: { + type: Object, + }, + loading: { + type: Boolean, + }, + allowNotes: { + type: Boolean, + }, +}); + +const emit = defineEmits<{ + ( + e: "start-workflow", + // eslint-disable-next-line @typescript-eslint/no-explicit-any + parameters: Record<string, any>, + notes?: string, + logs_s3_path?: string, + debug_s3_path?: string, + provenance_s3_path?: string, + ): void; +}>(); + +// Bootstrap Elements +// ============================================================================= +let errorToast: Toast | null = null; + +// Types +// ============================================================================= +type ParameterGroup = { + group: string; + title: string; + icon?: string; +}; + +// JSON Schema package +// ============================================================================= +const schemaCompiler = new Ajv({ + strict: false, +}); + +let validateSchema: ValidateFunction; + +// Reactive State +// ============================================================================= +const launchForm = ref<HTMLFormElement | null>(null); + +const formState = reactive<{ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + formInput: Record<string, any>; + validated: boolean; + pipelineNotes: string; + logs_s3_path?: string; + debug_s3_path?: string; + provenance_s3_path?: string; + errorType?: string; + showHidden: boolean; +}>({ + formInput: {}, + validated: false, + pipelineNotes: "", + logs_s3_path: undefined, + debug_s3_path: undefined, + provenance_s3_path: undefined, + errorType: undefined, + showHidden: false, +}); + +// Computed Properties +// ============================================================================= +const parameterGroups = computed<Record<string, never>>( + () => props.schema?.["definitions"], +); + +// Create a list with the names of all parameter groups +const navParameterGroups = computed<ParameterGroup[]>(() => { + let groups = Object.keys(parameterGroups.value).map((group) => { + return { + group: group, + title: parameterGroups.value[group]["title"], + icon: parameterGroups.value[group]["fa_icon"], + }; + }); + if (!formState.showHidden) { + groups = groups.filter( + // filter all groups that have only hidden parameters + (group) => + Object.keys(parameterGroups.value[group.group]["properties"]).filter( + (key) => + !parameterGroups.value[group.group]["properties"][key]["hidden"], + ).length > 0, + ); + } + return groups; +}); + +// Watchers +// ============================================================================= +watch( + () => props.schema, + (newValue) => { + if (newValue) { + updateSchema(newValue); + } + }, +); + +// Functions +// ============================================================================= +/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/ban-ts-comment, @typescript-eslint/no-unused-vars */ +function updateSchema(schema: Record<string, any>) { + validateSchema = schemaCompiler.compile(schema); + const b = Object.keys(schema["definitions"]).map((groupName) => [ + groupName, + Object.fromEntries( + Object.entries(schema["definitions"][groupName]["properties"]).map( + ([parameterName, parameter]) => [ + parameterName, + // @ts-ignore + parameter["default"], + ], + ), + ), + ]); + formState.formInput = Object.fromEntries(b); +} + +/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/ban-ts-comment, @typescript-eslint/no-unused-vars */ +function startWorkflow() { + errorToast?.hide(); + formState.validated = true; + formState.errorType = undefined; + if (launchForm.value?.checkValidity()) { + const realInput: Record<string, any> = Object.values( + formState.formInput, + ).reduce((acc, val) => { + return { ...acc, ...val }; + }); + const schemaValid = validateSchema(realInput); + + if (!schemaValid) { + console.error(validateSchema.errors); + errorToast?.show(); + } else { + emit( + "start-workflow", + realInput, + formState.pipelineNotes, + formState.logs_s3_path, + formState.debug_s3_path, + formState.provenance_s3_path, + ); + } + } else { + formState.errorType = "form"; + errorToast?.show(); + } +} + +// Lifecycle Events +// ============================================================================= +onMounted(() => { + if (props.schema) updateSchema(props.schema); + bucketRepository.fetchBuckets(); + bucketRepository.fetchOwnPermissions(); + s3KeyRepository.fetchS3Keys(); + errorToast = new Toast("#workflowExecutionErrorToast"); +}); +</script> + +<template> + <div class="toast-container position-fixed top-toast end-0 p-3"> + <div + role="alert" + aria-live="assertive" + aria-atomic="true" + class="toast text-bg-danger align-items-center border-0" + data-bs-autohide="true" + id="workflowExecutionErrorToast" + > + <div class="d-flex p-2 justify-content-between align-items-center"> + <div class="toast-body"> + <template v-if="formState.errorType === 'form'"> + Some inputs are not valid. + </template> + <template v-else> + There was an error with starting the workflow execution. Look in the + console for more information. + </template> + </div> + <button + type="button" + class="btn-close btn-close-white" + data-bs-dismiss="toast" + aria-label="Close" + ></button> + </div> + </div> + </div> + <div class="row mb-5 align-items-start"> + <form + v-if="props.schema" + class="col-9" + id="launchWorkflowForm" + ref="launchForm" + :class="{ 'was-validated': formState.validated }" + @submit.prevent="startWorkflow" + novalidate + > + <template v-for="(group, groupName) in parameterGroups" :key="groupName"> + <parameter-group-form + :modelValue="formState.formInput[groupName]" + @update:model-value=" + (newValue) => (formState.formInput[groupName] = newValue) + " + v-if="formState.formInput[groupName]" + :parameter-group-name="groupName" + :parameter-group="group" + :showHidden="formState.showHidden" + /> + </template> + <div class="card mb-3"> + <h2 class="card-header" id="pipelineGeneralOptions"> + <font-awesome-icon icon="fa-solid fa-gear" class="me-2" /> + Pipeline Options + </h2> + <div class="card-body"> + <h5 class="card-title"> + General Options about the pipeline execution + </h5> + <template v-if="props.allowNotes"> + <div class="input-group"> + <span class="input-group-text" id="pipelineNotes"> + <font-awesome-icon + class="me-2" + icon="fa-solid fa-sticky-note" + /> + <code>--notes</code> + </span> + <textarea + class="form-control" + rows="1" + v-model="formState.pipelineNotes" + /> + </div> + <label class="mb-3" for="pipelineNotes" + >Personal notes about the pipeline execution</label + > + </template> + <div class="input-group"> + <span class="input-group-text" id="logsS3Path"> + <font-awesome-icon class="me-2" icon="fa-solid fa-folder" /> + <code>--logs_s3_path</code> + </span> + <parameter-string-input + parameter-name="logs_s3_path" + v-model="formState.logs_s3_path" + :parameter="{ + format: 'directory-path', + type: 'string', + }" + /> + </div> + <label class="mb-3" for="logsS3Path"> + Directory in bucket where to save Nextflow log and reports + </label> + <div class="input-group"> + <span class="input-group-text" id="provenanceS3Path"> + <font-awesome-icon class="me-2" icon="fa-solid fa-folder" /> + <code>--provenance_s3_path</code> + </span> + <parameter-string-input + parameter-name="provenance_s3_path" + v-model="formState.provenance_s3_path" + :parameter="{ + format: 'directory-path', + type: 'string', + }" + /> + </div> + <label class="mb-3" for="provenanceS3Path"> + Directory in bucket where to save provenance information about the + workflow execution + </label> + <div class="input-group"> + <span class="input-group-text" id="debugS3Path"> + <font-awesome-icon class="me-2" icon="fa-solid fa-folder" /> + <code>--debug_s3_path</code> + </span> + <parameter-string-input + parameter-name="debug_s3_path" + v-model="formState.debug_s3_path" + :parameter="{ + format: 'directory-path', + type: 'string', + }" + /> + </div> + <label class="mb-3" for="debugS3Path"> + Directory in bucket where to save debug information about the + workflow execution + </label> + </div> + </div> + </form> + <!-- Loading card --> + <div v-else class="col-9"> + <div class="card mb-3"> + <h2 class="card-header placeholder-glow"> + <span class="placeholder col-6"></span> + </h2> + <div class="card-body"> + <h5 class="card-title placeholder-glow"> + <span class="placeholder col-5"> </span> + </h5> + <template v-for="n in 4" :key="n"> + <div class="placeholder-glow fs-5"> + <span class="placeholder w-100"> </span> + </div> + <div class="mb-3 placeholder-glow"> + <span class="placeholder col-3"> </span> + </div> + </template> + </div> + </div> + </div> + <div + class="col-3 sticky-top border shadow-sm rounded-1 px-0" + style="top: 70px !important; max-height: calc(100vh - 150px)" + > + <div class="d-flex pt-2"> + <button + type="submit" + form="launchWorkflowForm" + class="btn btn-success w-50 mx-2" + :disabled="props.loading || !props.schema" + > + <font-awesome-icon icon="fa-solid fa-rocket" class="me-2" /> + Launch + </button> + <router-link + role="button" + class="btn btn-success w-50 mx-2" + target="_blank" + :to="{ name: 'buckets' }" + > + <font-awesome-icon icon="fa-solid fa-upload" class="me-2" /> + Upload files + </router-link> + </div> + <nav class="h-100"> + <nav v-if="props.schema" class="nav"> + <ul class="ps-0"> + <li + class="nav-link" + v-for="group in navParameterGroups" + :key="group.group" + > + <a :href="'#' + group.group"> + <font-awesome-icon + :icon="group.icon" + v-if="group.icon" + class="me-2" + /> + {{ group.title }}</a + > + </li> + <li class="nav-link"> + <a href="#pipelineGeneralOptions"> + <font-awesome-icon icon="fa-solid fa-gear" class="me-2" /> + General Pipeline Options + </a> + </li> + </ul> + <div class="mx-auto mb-3"> + <input + type="checkbox" + class="btn-check ms-1" + id="btn-check-outlined" + v-model="formState.showHidden" + autocomplete="off" + /> + <label class="btn btn-outline-primary" for="btn-check-outlined"> + <font-awesome-icon + :icon=" + formState.showHidden + ? 'fa-solid fa-eye' + : 'fa-solid fa-eye-slash' + " + /> + Show hidden Parameters + </label> + </div> + </nav> + <!-- Loading nav links --> + <div v-else class="placeholder-glow ps-3 pt-3"> + <span + v-for="n in 5" + :key="n" + class="placeholder col-8 mt-2 mb-3" + ></span> + </div> + </nav> + </div> + </div> +</template> + +<style scoped> +div.card-body { + backdrop-filter: brightness(1.2); +} +</style> diff --git a/src/components/parameter-schema/description-mode/ParameterDescription.vue b/src/components/parameter-schema/description-mode/ParameterDescription.vue new file mode 100644 index 0000000000000000000000000000000000000000..5769d9372eeace54a7c2c11394c6f750e0b65c52 --- /dev/null +++ b/src/components/parameter-schema/description-mode/ParameterDescription.vue @@ -0,0 +1,141 @@ +<script setup lang="ts"> +import { computed } from "vue"; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import MarkdownRenderer from "@/components/MarkdownRenderer.vue"; + +const props = defineProps({ + parameter: { + type: Object, + required: true, + validator(value: Record<string, never>) { + return ["boolean", "array", "number", "string"].includes(value["type"]); + }, + }, + required: Boolean, + parameterName: { + type: String, + required: true, + }, + showHidden: { + type: Boolean, + default: false, + }, +}); + +const randomIDSuffix = Math.random().toString(16).substring(2, 8); + +const helpText = computed<string | undefined>( + () => props.parameter["help_text"], +); +const parameterType = computed<string>(() => props.parameter["type"]); +const icon = computed<string | undefined>(() => props.parameter["fa_icon"]); +const description = computed<string>(() => props.parameter["description"]); +const defaultValue = computed<string | undefined>( + () => props.parameter["default"]?.toString(), +); +const enumValues = computed<string[] | undefined>( + () => props.parameter["enum"]?.map((val: string) => val.toString()), +); +const hidden = computed<boolean>(() => props.parameter["hidden"] ?? false); +const parameterPattern = computed<string | undefined>( + () => props.parameter["pattern"], +); + +const showRightColum = computed<boolean>( + () => + helpText.value != undefined || + props.required || + defaultValue.value != undefined, +); +</script> + +<template> + <div + class="row border-top border-bottom border-secondary align-items-start py-2" + v-if="showHidden || !hidden" + > + <div class="fs-6 col-3"> + <font-awesome-icon :icon="icon" v-if="icon" class="me-2" /> + <code class="border rounded p-1" :id="props.parameterName" + >--{{ props.parameterName }}</code + > + <br /> + <span>type: '{{ parameterType }}'</span> + </div> + <div + :class="{ 'col-7': showRightColum, 'col-9': !showRightColum }" + class="flex-fill" + > + <markdown-renderer :markdown="description" /> + </div> + <div + class="col-auto d-flex flex-column align-items-end flex-fill" + v-if="showRightColum" + > + <button + class="btn btn-info btn-sm my-1" + type="button" + data-bs-toggle="collapse" + :data-bs-target="'#helpCollapse' + randomIDSuffix" + aria-expanded="false" + :aria-controls="'helpCollapse' + randomIDSuffix" + v-if="helpText" + > + <font-awesome-icon icon="fa-solid fa-circle-info" /> + Help + </button> + <div v-if="enumValues" class="dropdown w-fit my-1"> + <a + class="rounded-1 p-1 dropdown-toggle text-reset text-decoration-none border" + href="#" + role="button" + data-bs-toggle="dropdown" + aria-expanded="false" + > + Options: + <span v-if="defaultValue" + ><code>{{ defaultValue }}</code> (default)</span + > + </a> + <ul class="dropdown-menu shadow" v-if="enumValues"> + <li v-for="val in enumValues" :key="val" class="px-2"> + {{ val }} <span v-if="val === defaultValue">(default)</span> + </li> + </ul> + </div> + <span v-else-if="defaultValue" class="rounded-1 py-0 px-1 my-1" + >default: <code>{{ defaultValue }}</code></span + > + + <span + v-if="props.required" + class="bg-warning rounded-1 px-1 py-0 text-white" + >required</span + > + </div> + <div class="collapse" :id="'helpCollapse' + randomIDSuffix" v-if="helpText"> + <div class="p-2 pb-0 border rounded m-2 flex-shrink-1"> + <markdown-renderer class="helpTextCode" :markdown="helpText" /> + <span v-if="parameterPattern" class="mb-2" + >Pattern: <code>{{ parameterPattern }}</code></span + > + </div> + </div> + </div> +</template> + +<style scoped> +code { + color: var(--bs-code-color) !important; +} + +li:hover { + background: var(--bs-secondary); +} +a:hover { + filter: brightness(1.2); +} +code.border { + backdrop-filter: brightness(0.95); +} +</style> diff --git a/src/components/parameter-schema/description-mode/ParameterGroupDescription.vue b/src/components/parameter-schema/description-mode/ParameterGroupDescription.vue new file mode 100644 index 0000000000000000000000000000000000000000..c229f8f51ab8d615af6ee06670886ed8074fcd45 --- /dev/null +++ b/src/components/parameter-schema/description-mode/ParameterGroupDescription.vue @@ -0,0 +1,65 @@ +<script setup lang="ts"> +import { computed } from "vue"; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import ParameterDescription from "@/components/parameter-schema/description-mode/ParameterDescription.vue"; + +const props = defineProps({ + parameterGroup: { + type: Object, + required: true, + validator(value: Record<string, never>) { + return "object" === value["type"]; + }, + }, + parameterGroupName: { + type: String, + required: true, + }, + showHidden: { + type: Boolean, + default: false, + }, +}); + +const title = computed<string>(() => props.parameterGroup["title"]); +const icon = computed<string>(() => props.parameterGroup["fa_icon"]); +const description = computed<string>(() => props.parameterGroup["description"]); + +const groupHidden = computed<boolean>(() => + Object.keys(parameters.value).reduce( + (acc: boolean, val: string) => acc && parameters.value[val]["hidden"], + true, + ), +); + +const parameters = computed<Record<string, never>>( + () => props.parameterGroup["properties"], +); +</script> + +<template> + <div class="mb-5" v-if="props.showHidden || !groupHidden"> + <div class="row"> + <h2 :id="props.parameterGroupName"> + <font-awesome-icon :icon="icon" class="me-3" v-if="icon" />{{ title }} + </h2> + <h4>{{ description }}</h4> + </div> + <template + v-for="(parameter, parameterName) in parameters" + :key="parameterName" + > + <parameter-description + v-if="parameter['type'] !== 'object'" + :parameter-name="parameterName" + :parameter="parameter" + :required=" + props.parameterGroup['required']?.includes(parameterName) ?? false + " + :show-hidden="showHidden" + /> + </template> + </div> +</template> + +<style scoped></style> diff --git a/src/components/parameter-schema/form-mode/ParameterBooleanInput.vue b/src/components/parameter-schema/form-mode/ParameterBooleanInput.vue new file mode 100644 index 0000000000000000000000000000000000000000..a3db905214f3d271a513b256fcf681c91516d878 --- /dev/null +++ b/src/components/parameter-schema/form-mode/ParameterBooleanInput.vue @@ -0,0 +1,73 @@ +<script setup lang="ts"> +import { computed } from "vue"; + +const props = defineProps({ + parameter: { + type: Object, + required: true, + validator(value: Record<string, never>) { + return "number" === value["type"]; + }, + }, + required: Boolean, + parameterName: { + type: String, + required: true, + }, + modelValue: { + type: Boolean, + }, + helpId: { + type: String, + }, +}); + +const randomIDSuffix = Math.random().toString(16).substring(2, 8); + +const helpTextPresent = computed<boolean>(() => props.parameter["help_text"]); +const defaultValue = computed<boolean>( + () => props.parameter["default"] ?? false, +); + +const emit = defineEmits<{ + (e: "update:modelValue", value: boolean): void; +}>(); +</script> + +<template> + <div + class="flex-fill mb-0 text-bg-light fs-6 ps-4 d-flex align-items-center justify-content-start border" + :class="{ 'rounded-end': !helpTextPresent }" + > + <div class="form-check form-check-inline"> + <label class="form-check-label" :for="'trueOption' + randomIDSuffix" + >True</label + > + <input + class="form-check-input" + type="radio" + :name="'inlineRadioOptions' + randomIDSuffix" + :id="'trueOption' + randomIDSuffix" + :value="true" + :checked="defaultValue" + @input="emit('update:modelValue', true)" + /> + </div> + <div class="form-check form-check-inline"> + <input + class="form-check-input" + type="radio" + :name="'inlineRadioOptions' + randomIDSuffix" + :id="'falseOption' + randomIDSuffix" + :value="false" + @input="emit('update:modelValue', false)" + :checked="!defaultValue" + /> + <label class="form-check-label" :for="'falseOption' + randomIDSuffix" + >False</label + > + </div> + </div> +</template> + +<style scoped></style> diff --git a/src/components/parameter-schema/form-mode/ParameterEnumInput.vue b/src/components/parameter-schema/form-mode/ParameterEnumInput.vue new file mode 100644 index 0000000000000000000000000000000000000000..a2e20d7c16c872493b4b16e126bacd2889afab3c --- /dev/null +++ b/src/components/parameter-schema/form-mode/ParameterEnumInput.vue @@ -0,0 +1,59 @@ +<script setup lang="ts"> +import { computed, ref } from "vue"; + +const props = defineProps({ + parameter: { + type: Object, + required: true, + validator(value: Record<string, never>) { + return "string" === value["type"] && value["enum"]; + }, + }, + required: Boolean, + parameterName: { + type: String, + required: true, + }, + modelValue: { + type: String, + }, + helpId: { + type: String, + }, +}); + +const defaultValue = computed<string>(() => props.parameter["default"]); + +const possibleValues = computed<string[]>(() => props.parameter["enum"]); + +const enumSelection = ref<HTMLSelectElement | undefined>(undefined); + +const emit = defineEmits<{ + (e: "update:modelValue", value: string | undefined): void; +}>(); + +function updateValue() { + emit("update:modelValue", enumSelection.value?.value); +} +</script> + +<template> + <select + ref="enumSelection" + :value="props.modelValue" + @input="updateValue" + class="form-select" + :required="required" + :aria-describedby="props.helpId" + > + <option + v-for="val in possibleValues" + :key="val" + :selected="defaultValue === val" + > + {{ val }} + </option> + </select> +</template> + +<style scoped></style> diff --git a/src/components/parameter-schema/form-mode/ParameterGroupForm.vue b/src/components/parameter-schema/form-mode/ParameterGroupForm.vue new file mode 100644 index 0000000000000000000000000000000000000000..e66ef66d0dfdaaa8468d303dd18325a22e7fafe5 --- /dev/null +++ b/src/components/parameter-schema/form-mode/ParameterGroupForm.vue @@ -0,0 +1,192 @@ +<script setup lang="ts"> +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import { computed, watch } from "vue"; +import ParameterNumberInput from "@/components/parameter-schema/form-mode/ParameterNumberInput.vue"; +import MarkdownRenderer from "@/components/MarkdownRenderer.vue"; +import ParameterBooleanInput from "@/components/parameter-schema/form-mode/ParameterBooleanInput.vue"; +import ParameterEnumInput from "@/components/parameter-schema/form-mode/ParameterEnumInput.vue"; +import ParameterStringInput from "@/components/parameter-schema/form-mode/ParameterStringInput.vue"; + +const props = defineProps({ + parameterGroup: { + type: Object, + required: true, + validator(value: Record<string, never>) { + return "object" === value["type"]; + }, + }, + parameterGroupName: { + type: String, + required: true, + }, + modelValue: { + type: Object, + required: true, + }, + showHidden: { + type: Boolean, + default: false, + }, +}); +const title = computed<string>(() => props.parameterGroup["title"]); +const icon = computed<string>(() => props.parameterGroup["fa_icon"]); +const description = computed<string>(() => props.parameterGroup["description"]); +const groupHidden = computed<boolean>(() => + Object.keys(parameters.value).reduce( + (acc: boolean, val: string) => acc && parameters.value[val]["hidden"], + true, + ), +); +const parameters = computed<Record<string, never>>( + () => props.parameterGroup["properties"], +); + +const formInput = computed(() => props.modelValue); +const emit = defineEmits<{ + ( + e: "update:modelValue", + value: Record<string, number | string | boolean | undefined>, + ): void; +}>(); + +function parameterRequired( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + parameterGroup: Record<string, any>, + parameterName: string, +): boolean { + return ( + parameterGroup["required"]?.includes(parameterName) || // parameter is required + parameterGroup["dependentRequired"]?.[parameterName] // parameter is required when another parameter is set + ?.map((param: string) => formInput.value[param]) + ?.reduce((acc: boolean, val: string) => acc || val, false) + ); +} + +watch( + formInput, + (newVal) => { + //console.log("Group", props.parameterGroupName, newVal); + emit("update:modelValue", newVal); + }, + { + deep: true, + }, +); +</script> + +<template> + <div class="card mb-3" :hidden="!showHidden && groupHidden"> + <h2 class="card-header" :id="props.parameterGroupName"> + <font-awesome-icon :icon="icon" class="me-2" v-if="icon" /> + {{ title }} + </h2> + <div class="card-body"> + <h5 class="card-title" v-if="description">{{ description }}</h5> + <template + v-for="(parameter, parameterName) in parameters" + :key="parameterName" + > + <div :hidden="!showHidden && parameter['hidden']"> + <div class="input-group"> + <span class="input-group-text" :id="parameterName + '-help'"> + <font-awesome-icon + class="me-2" + :icon="parameter['fa_icon']" + v-if="parameter['fa_icon']" + /> + <code>--{{ parameterName }}</code> + </span> + <parameter-number-input + v-if=" + parameter['type'] === 'number' || + parameter['type'] === 'integer' + " + :parameter-name="parameterName" + :parameter="parameter" + :help-id="parameterName + '-help'" + :required="parameterRequired(parameterGroup, parameterName)" + :model-value="formInput[parameterName]" + @update:model-value=" + (newValue) => (formInput[parameterName] = newValue) + " + /> + <parameter-boolean-input + v-else-if="parameter['type'] === 'boolean'" + :parameter-name="parameterName" + :parameter="parameter" + :help-id="parameterName + '-help'" + :model-value="formInput[parameterName]" + @update:model-value=" + (newValue) => (formInput[parameterName] = newValue) + " + /> + <template v-else-if="parameter['type'] === 'string'"> + <parameter-enum-input + v-if="parameter['enum']" + :parameter-name="parameterName" + :parameter="parameter" + :model-value="formInput[parameterName]" + :required="parameterRequired(parameterGroup, parameterName)" + @update:model-value=" + (newValue) => (formInput[parameterName] = newValue) + " + /> + <parameter-string-input + v-else + :parameter-name="parameterName" + :parameter="parameter" + :model-value="formInput[parameterName]" + :required="parameterRequired(parameterGroup, parameterName)" + @update:model-value=" + (newValue) => (formInput[parameterName] = newValue) + " + /> + </template> + <span + class="input-group-text cursor-pointer px-2" + v-if="parameter['help_text']" + data-bs-toggle="collapse" + :data-bs-target="'#helpCollapse' + parameterName" + aria-expanded="false" + :aria-controls="'helpCollapse' + parameterName" + > + <font-awesome-icon + class="cursor-pointer" + icon="fa-solid fa-circle-question" + /> + </span> + </div> + <label v-if="parameter['description']"> + <markdown-renderer :markdown="parameter['description']" /> + </label> + <div + class="collapse" + :id="'helpCollapse' + parameterName" + v-if="parameter['help_text']" + > + <div class="p-2 pb-0 mx-2 mb-2 mt-1 flex-shrink-1 border rounded"> + <markdown-renderer + class="helpTextCode" + :markdown="parameter['help_text']" + /> + <p v-if="parameter['pattern']"> + Pattern: <code>{{ parameter["pattern"] }}</code> + </p> + </div> + </div> + </div> + </template> + </div> + </div> +</template> + +<style scoped> +div.card-body { + backdrop-filter: brightness(1.2); +} + +span.cursor-pointer:hover { + color: var(--bs-info); + background: var(--bs-light); +} +</style> diff --git a/src/components/parameter-schema/form-mode/ParameterNumberInput.vue b/src/components/parameter-schema/form-mode/ParameterNumberInput.vue new file mode 100644 index 0000000000000000000000000000000000000000..42af376d9bfd24ea8e08e40613d9205abccb1caf --- /dev/null +++ b/src/components/parameter-schema/form-mode/ParameterNumberInput.vue @@ -0,0 +1,50 @@ +<script setup lang="ts"> +import { ref } from "vue"; +const props = defineProps({ + parameter: { + type: Object, + required: true, + validator(value: Record<string, never>) { + return "number" === value["type"] || "integer" === value["type"]; + }, + }, + required: Boolean, + parameterName: { + type: String, + required: true, + }, + modelValue: { + type: Number, + }, + helpId: { + type: String, + }, +}); + +const emit = defineEmits<{ + (e: "update:modelValue", value: number | undefined): void; +}>(); + +const numberInput = ref<HTMLInputElement | undefined>(undefined); + +function updateValue() { + emit("update:modelValue", Number(numberInput.value?.value)); +} +</script> + +<template> + <input + class="form-control" + type="number" + ref="numberInput" + :max="props.parameter['maximum']" + :min="props.parameter['minimum']" + :step="props.parameter['type'] === 'integer' ? 1 : 0.01" + :value="props.modelValue" + :required="props.required" + :aria-describedby="props.helpId" + @input="updateValue" + /> +</template> + +<style scoped></style> diff --git a/src/components/parameter-schema/form-mode/ParameterStringInput.vue b/src/components/parameter-schema/form-mode/ParameterStringInput.vue new file mode 100644 index 0000000000000000000000000000000000000000..0ba406b7f1eb838040cd2b60dc2101f1652bebb9 --- /dev/null +++ b/src/components/parameter-schema/form-mode/ParameterStringInput.vue @@ -0,0 +1,189 @@ +<script setup lang="ts"> +import { computed, watch, ref, onMounted, reactive } from "vue"; +import { useBucketStore } from "@/stores/buckets"; +import { useS3ObjectStore } from "@/stores/s3objects"; + +const bucketRepository = useBucketStore(); +const s3objectRepository = useS3ObjectStore(); + +const props = defineProps({ + parameter: { + type: Object, + required: true, + validator(value: Record<string, never>) { + return "string" === value["type"] && value["enum"]; + }, + }, + required: Boolean, + parameterName: { + type: String, + required: true, + }, + modelValue: { + type: String, + }, + helpId: { + type: String, + }, +}); + +const randomIDSuffix = Math.random().toString(16).substring(2, 8); + +const defaultValue = computed<string>(() => props.parameter["default"]); + +const s3Path = reactive<{ + bucket: string | undefined; + key: string | undefined; +}>({ + bucket: undefined, + key: undefined, +}); + +watch(defaultValue, (newVal, oldVal) => { + if (newVal != oldVal && newVal != undefined) { + emit("update:modelValue", newVal); + } +}); + +watch(s3Path, () => { + if (format.value) { + updateValue(); + } +}); + +watch( + () => s3Path.bucket, + (newVal, oldVal) => { + if (newVal !== oldVal) { + updateKeysInBucket(newVal); + } + }, +); + +const pattern = computed<string>(() => props.parameter["pattern"]); + +const emit = defineEmits<{ + (e: "update:modelValue", value: string | undefined): void; +}>(); + +const stringInput = ref<HTMLInputElement | undefined>(undefined); + +const format = computed<string | undefined>(() => props.parameter["format"]); + +const filesInBucket = computed<string[]>(() => + (s3objectRepository.objectMapping[s3Path.bucket ?? ""] ?? []) + .filter((obj) => !obj.Key?.endsWith("/")) + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + .map((obj) => obj.Key!), +); + +const foldersInBucket = computed<string[]>(() => + (s3objectRepository.objectMapping[s3Path.bucket ?? ""] ?? []) + .filter((obj) => obj.Key != undefined) + .map((obj) => { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const parts = obj.Key!.split("/"); + return parts + .slice(0, parts.length - 1) + .map((part, index) => + parts.slice(0, index + 1).reduce((acc, val) => `${acc}/${val}`), + ); + }) + .flat() + .filter((val, index, array) => array.indexOf(val) === index), +); + +const filesAndFoldersInBucket = computed<string[]>(() => + filesInBucket.value.concat(foldersInBucket.value), +); + +const keyDataList = computed<string[]>(() => { + switch (format.value) { + case "file-path": + return filesInBucket.value; + case "directory-path": + return foldersInBucket.value; + case "path": + return filesAndFoldersInBucket.value; + default: + return []; + } +}); + +function updateValue() { + if (format.value) { + emit( + "update:modelValue", + !s3Path.bucket && s3Path.key + ? undefined + : `s3://${s3Path.bucket}${s3Path.key ? "/" + s3Path.key : ""}`, + ); + } else { + emit( + "update:modelValue", + stringInput.value?.value ? stringInput.value?.value : undefined, + ); + } +} + +const helpTextPresent = computed<boolean>(() => props.parameter["help_text"]); + +function updateKeysInBucket(bucketName?: string) { + if (bucketName != null) { + s3objectRepository.fetchS3Objects( + bucketName, + bucketRepository.ownPermissions[bucketName]?.file_prefix ?? undefined, + ); + } +} + +onMounted(() => { + if (format.value) { + s3Path.key = defaultValue.value; + } +}); +</script> + +<template> + <template v-if="format"> + <select + class="form-select" + :required="props.required" + v-model="s3Path.bucket" + > + <option selected disabled value="">Please select a bucket</option> + <option + v-for="bucket in bucketRepository.ownBucketsAndFullPermissions" + :key="bucket" + :value="bucket" + > + {{ bucket }} + </option> + </select> + <input + class="form-control" + :class="{ 'rounded-end': !helpTextPresent }" + :list="'datalistOptions2' + randomIDSuffix" + placeholder="Type to search in bucket..." + :required="props.required && format === 'file-path'" + v-model="s3Path.key" + :pattern="pattern" + /> + <datalist :id="'datalistOptions2' + randomIDSuffix"> + <option v-for="obj in keyDataList" :value="obj" :key="obj" /> + </datalist> + </template> + <input + v-else + ref="stringInput" + class="form-control" + type="text" + :value="props.modelValue" + :required="props.required" + :aria-describedby="props.helpId" + :pattern="pattern" + @input="updateValue" + /> +</template> + +<style scoped></style> diff --git a/src/components/transitions/CardTransitionGroup.vue b/src/components/transitions/CardTransitionGroup.vue new file mode 100644 index 0000000000000000000000000000000000000000..677b5fac67f0363950f3774b8162db4e42f261d1 --- /dev/null +++ b/src/components/transitions/CardTransitionGroup.vue @@ -0,0 +1,31 @@ +<script setup lang="ts"> +defineProps({ + tag: { type: String, required: false, default: "div" }, +}); +</script> + +<template> + <transition-group name="card" :tag="tag"> + <slot></slot> + </transition-group> +</template> + +<style> +.card-move, /* apply transition to moving elements */ +.card-enter-active, +.card-leave-active { + transition: all 0.5s ease; +} + +.card-enter-from, +.card-leave-to { + opacity: 0; + transform: scale(0); +} + +/* ensure leaving items are taken out of layout flow so that moving + animations can be calculated correctly. */ +.card-leave-active { + position: absolute; +} +</style> diff --git a/src/components/transitions/ListTransitionGroup.vue b/src/components/transitions/ListTransitionGroup.vue new file mode 100644 index 0000000000000000000000000000000000000000..59f342d62396e5ad6f15e1adeb0cca58299d1f56 --- /dev/null +++ b/src/components/transitions/ListTransitionGroup.vue @@ -0,0 +1,31 @@ +<script setup lang="ts"> +defineProps({ + tag: { type: String, required: false, default: "div" }, +}); +</script> + +<template> + <transition-group name="list" :tag="tag"> + <slot></slot> + </transition-group> +</template> + +<style> +.list-move, /* apply transition to moving elements */ +.list-enter-active, +.list-leave-active { + transition: all 0.3s ease; +} + +.list-enter-from, +.list-leave-to { + transform: rotateX(90deg); + transform-origin: center top; +} + +/* ensure leaving items are taken out of layout flow so that moving + animations can be calculated correctly. */ +.list-leave-active { + position: absolute; +} +</style> diff --git a/src/components/transitions/WorkflowModeTransitionGroup.vue b/src/components/transitions/WorkflowModeTransitionGroup.vue new file mode 100644 index 0000000000000000000000000000000000000000..13d5944c31065e17b099cae95787750e4d284ccb --- /dev/null +++ b/src/components/transitions/WorkflowModeTransitionGroup.vue @@ -0,0 +1,31 @@ +<script setup lang="ts"></script> + +<template> + <transition-group name="modelist" tag="div"> + <slot></slot> + </transition-group> +</template> + +<style> +.modelist-move, /* apply transition to moving elements */ +.modelist-enter-active, +.modelist-leave-active { + transition: all 0.5s ease; +} + +.modelist-enter-from { + opacity: 0; + transform: translateX(50%); +} + +.modelist-leave-to { + opacity: 0; + transform: translateX(-50%); +} + +/* ensure leaving items are taken out of layout flow so that moving + animations can be calculated correctly. */ +.modelist-leave-active { + position: absolute; +} +</style> diff --git a/src/components/workflows/WorkflowCard.vue b/src/components/workflows/WorkflowCard.vue new file mode 100644 index 0000000000000000000000000000000000000000..96d5323025690e6f149dbe85b27fba88d34ae197 --- /dev/null +++ b/src/components/workflows/WorkflowCard.vue @@ -0,0 +1,127 @@ +<script setup lang="ts"> +import type { WorkflowOut, WorkflowVersion } from "@/client/workflow"; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import dayjs from "dayjs"; +import { onMounted, ref, computed } from "vue"; +import { Tooltip } from "bootstrap"; +import { latestVersion as calculateLatestVersion } from "@/utils/Workflow"; + +const props = defineProps<{ + workflow: WorkflowOut; + loading: boolean; +}>(); + +const randomIDSuffix: string = Math.random().toString(16).substring(2, 8); +const truncateDescription = ref<boolean>(true); +const latestVersion = computed<WorkflowVersion | undefined>(() => + calculateLatestVersion(props.workflow.versions), +); + +onMounted(() => { + if (!props.loading) { + new Tooltip("#creationDate-" + randomIDSuffix); + } +}); +</script> + +<template> + <div class="card-hover border border-secondary card m-2"> + <div class="card-body"> + <div + class="card-title fs-3 d-flex justify-content-between align-items-center" + > + <div v-if="props.loading" class="placeholder-glow"> + <span class="placeholder col-6"></span> + </div> + <router-link + v-else + class="text-truncate" + :to="{ + name: 'workflow-version', + params: { + workflowId: workflow.workflow_id, + versionId: latestVersion?.git_commit_hash, + }, + query: { + workflowModeId: latestVersion?.modes?.[0] ?? undefined, + }, + }" + >{{ props.workflow.name }} + </router-link> + + <img + v-if="latestVersion?.icon_url != null" + :src="latestVersion.icon_url" + class="img-fluid float-end icon" + /> + </div> + <p class="card-text" :class="{ 'text-truncate': truncateDescription }"> + <span v-if="props.loading" class="placeholder-glow" + ><span class="placeholder col-12"></span + ></span> + <span + v-else + @click="truncateDescription = false" + :class="{ + 'cursor-pointer': truncateDescription, + }" + >{{ props.workflow.short_description }}</span + > + </p> + <div class="d-flex justify-content-between mb-0"> + <div v-if="props.loading" class="placeholder-glow w-50"> + <span class="placeholder placeholder-lg w-50 bg-success"></span> + </div> + <router-link + v-else + :to="{ + name: 'workflow-version', + params: { + workflowId: workflow.workflow_id, + versionId: latestVersion?.git_commit_hash, + }, + query: { + workflowModeId: latestVersion?.modes?.[0] ?? undefined, + }, + }" + class="btn btn-outline-success" + role="button" + > + <font-awesome-icon class="fs-5" icon="fa-solid fa-tag" /> + {{ latestVersion?.version }} + </router-link> + <div v-if="props.loading" class="placeholder-glow w-25"> + <span class="placeholder w-100 bg-secondary"></span> + </div> + <span + v-else-if="latestVersion" + :id="'creationDate-' + randomIDSuffix" + data-bs-toggle="tooltip" + class="align-self-end text-secondary" + :data-bs-title=" + dayjs.unix(latestVersion?.created_at).format('DD.MM.YYYY HH:mm:ss') + " + > + Last Update: {{ dayjs.unix(latestVersion?.created_at).fromNow() }} + </span> + </div> + </div> + </div> +</template> + +<style scoped> +.card-hover { + transition: transform 0.3s ease-out; + width: 48%; +} + +.card-hover:hover { + transform: translate(0, -5px); + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; +} + +.icon { + max-height: 32px; + max-width: 32px; +} +</style> diff --git a/src/components/workflows/WorkflowDocumentationTabs.vue b/src/components/workflows/WorkflowDocumentationTabs.vue new file mode 100644 index 0000000000000000000000000000000000000000..3fda291fab44159c7d03e553c828d9bb4d512fb2 --- /dev/null +++ b/src/components/workflows/WorkflowDocumentationTabs.vue @@ -0,0 +1,137 @@ +<script setup lang="ts"> +import { computed } from "vue"; +import MarkdownRenderer from "@/components/MarkdownRenderer.vue"; +import ParameterSchemaDescriptionComponent from "@/components/parameter-schema/ParameterSchemaDescriptionComponent.vue"; +import { useRoute } from "vue-router"; + +const route = useRoute(); + +const props = defineProps<{ + loading: boolean; + descriptionMarkdown?: string; + changelogMarkdown?: string; + usageMarkdown?: string; + outputMarkdown?: string; + parameterSchema?: Record<string, never>; +}>(); + +const activeTab = computed<string>( + () => (route.query["tab"] as string) ?? "description", +); +</script> + +<template> + <ul class="nav justify-content-evenly nav-tabs fs-5"> + <li class="nav-item"> + <router-link + class="nav-link" + aria-current="page" + :to="{ query: { ...route.query, tab: 'description' } }" + :class="{ + active: activeTab === 'description', + disabled: !props.descriptionMarkdown, + }" + >Description + </router-link> + </li> + <li class="nav-item"> + <router-link + class="nav-link" + :to="{ query: { ...route.query, tab: 'usage' } }" + :class="{ + active: activeTab === 'usage', + disabled: !props.usageMarkdown, + }" + >Usage + </router-link> + </li> + <li class="nav-item"> + <router-link + class="nav-link" + :to="{ query: { ...route.query, tab: 'parameters' } }" + :class="{ + active: activeTab === 'parameters', + disabled: !props.parameterSchema, + }" + >Parameters + </router-link> + </li> + <li class="nav-item"> + <router-link + class="nav-link" + :to="{ query: { ...route.query, tab: 'output' } }" + :class="{ + active: activeTab === 'output', + disabled: !props.outputMarkdown, + }" + >Output + </router-link> + </li> + <li class="nav-item"> + <router-link + class="nav-link" + :to="{ query: { ...route.query, tab: 'changes' } }" + :class="{ + active: activeTab === 'changes', + disabled: !props.changelogMarkdown, + }" + >Releases + </router-link> + </li> + </ul> + <div v-if="props.loading" class="pt-3 border border-top-0 px-2"> + <p class="placeholder-glow mt-2 mb-4"> + <span class="placeholder col-7 fs-1"></span> + </p> + <p + v-for="n in 8" + :key="n" + class="placeholder-glow row ms-1" + :class="'my-' + Math.floor(Math.random() * 6)" + > + <span + class="placeholder" + :class="'col-' + Math.floor(Math.random() * 9 + 2)" + ></span> + </p> + </div> + <div v-else class="px-2 pt-3 border border-top-0"> + <div v-if="activeTab === 'description'"> + <markdown-renderer + v-if="props.descriptionMarkdown" + :markdown="props.descriptionMarkdown" + /> + <h4 v-else class="text-center mt-5">Description is not available</h4> + </div> + <template v-else-if="activeTab === 'parameters'"> + <parameter-schema-description-component + v-if="props.parameterSchema" + :schema="props.parameterSchema" + /> + <h4 v-else class="text-center mt-5">Parameters are not available</h4> + </template> + <div v-else-if="activeTab === 'changes'"> + <markdown-renderer + v-if="props.changelogMarkdown" + :markdown="props.changelogMarkdown" + /> + <h4 v-else class="text-center mt-5">Changelog is not available</h4> + </div> + <div v-else-if="activeTab === 'output'"> + <markdown-renderer + v-if="props.outputMarkdown" + :markdown="props.outputMarkdown" + /> + <h4 v-else class="text-center mt-5">Output is not available</h4> + </div> + <div v-else-if="activeTab === 'usage'"> + <markdown-renderer + v-if="props.usageMarkdown" + :markdown="props.usageMarkdown" + /> + <h4 v-else class="text-center mt-5">Usage is not available</h4> + </div> + </div> +</template> + +<style scoped></style> diff --git a/src/components/workflows/WorkflowStatisticsChart.vue b/src/components/workflows/WorkflowStatisticsChart.vue new file mode 100644 index 0000000000000000000000000000000000000000..ee4711cfc8829daa8390973a303b1af6aaf1da07 --- /dev/null +++ b/src/components/workflows/WorkflowStatisticsChart.vue @@ -0,0 +1,300 @@ +<script setup lang="ts"> +import { + Chart, + BarElement, + BarController, + LinearScale, + TimeSeriesScale, + Tooltip, + LineController, + LineElement, + PointElement, +} from "chart.js"; +import "@/utils/DayjsAdapter"; +import type { Element as ChartElement, Point, ChartItem } from "chart.js"; +import { onMounted, ref, watch, computed } from "vue"; +import type { WorkflowStatistic } from "@/client/workflow"; +import dayjs from "dayjs"; + +const canvas = ref<ChartItem | undefined>(undefined); + +let chart: Chart | undefined; + +const props = defineProps<{ + stats: WorkflowStatistic[]; +}>(); + +const disableZoomReset = ref<boolean>(true); + +// register all relevant elements to enable tree shaking +Chart.register( + BarElement, + BarController, + LinearScale, + Tooltip, + TimeSeriesScale, + LineController, + LineElement, + PointElement, +); + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +Tooltip.positioners.top = (elements: ChartElement[], eventPosition: Point) => { + return { + x: eventPosition.x, + y: 0, + }; +}; + +function updateData(chart: Chart, newStats: WorkflowStatistic[]) { + // override old labels in the chart + chart.data.labels = newStats.map((stat) => stat.day); + // override old count per day in the chart + chart.data.datasets[0].data = newStats.map((stat) => stat.count); + // override old cumulative sum in the chart + chart.data.datasets[1].data = newStats.map( + ( + (sum) => (value) => + (sum += value.count) + )(0), + ); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + chart.options.scales.x.time.unit = + newStats.length > 0 + ? xAxisLabelUnit(newStats[0].day, dayjs().toISOString()) + : "week"; + // render new chart + chart.update(); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + chart.options.animation = true; // enable animations for zoom +} + +function resetZoom() { + if (chart) { + chart.resetZoom(); + } +} + +function xAxisLabelUnit(max: number | string, min: number | string): string { + return dayjs(min).diff(dayjs(max), "week") < 12 ? "week" : "month"; +} + +// pad or trim stats to one year +const paddedStats = computed<WorkflowStatistic[]>(() => { + // select first day in statistics: last year, first day of statistics or last month + let statsIndex = 0; + let firstDay = dayjs().subtract(1, "month"); + if (props.stats.length > 0) { + const firstStatDay = dayjs(props.stats[0].day); + if (firstStatDay.isSameOrBefore(firstDay, "day")) { + firstDay = firstStatDay; + } + const lastYear = dayjs().subtract(1, "year"); + if (firstDay.isSameOrBefore(lastYear, "day")) { + firstDay = lastYear; + // Find index in stats list where the stat is from a day after the same day last year + statsIndex = props.stats.findIndex((stat) => + lastYear.isSameOrBefore(dayjs(stat.day), "day"), + ); + } + } else { + statsIndex = 1; + } + const timespan = dayjs().diff(firstDay, "day") + 1; + // Pad or trim workflow statistics + return Array.from({ length: timespan }, (e, i) => { + let count = 0; + const day = dayjs() + .subtract(timespan - i, "day") + .format("YYYY-MM-DD"); + if ( + statsIndex < props.stats.length && + props.stats[statsIndex].day === day + ) { + count = props.stats[statsIndex].count; + statsIndex++; + } + return { + day: day, + count: count, + }; + }); +}); + +watch(paddedStats, (newStats) => { + if (chart) { + updateData(chart, newStats); + } +}); + +onMounted(() => { + if (canvas.value) { + chart = new Chart(canvas.value, { + type: "bar", + data: { + labels: [], // Days as lables + datasets: [ + { + // Workflow count per day + label: "Workflow Count", + data: [], + type: "bar", + yAxisID: "y1", + }, + { + // Cumulative Workflow count over the year + label: "Cumulative Workflow Usage", + data: [], + type: "line", + yAxisID: "y2", + cubicInterpolationMode: "monotone", + tension: 0.4, + pointStyle: false, + }, + ], + }, + options: { + animation: false, // disable animations + maintainAspectRatio: false, // fill all given space + responsive: true, // fill all given space + scales: { + // left scale for count per day + y1: { + position: "left", + grid: { + display: false, // disable grid + }, + ticks: { + precision: 0, // round ticks to zero decimal places + }, + // title options + title: { + color: "gray", + display: true, + text: "per Day", + }, + }, + y2: { + // right scale for cumulative count + position: "right", + grid: { + display: false, // disable grid + }, + ticks: { + precision: 0, // round ticks to zero decimal places + }, + // title options + title: { + color: "gray", + display: true, + text: "Cumulative", + }, + }, + x: { + // x scale as time-series + type: "timeseries", + time: { + // options for timescale + unit: "month", // display unit + parser: "YYYY-MM-DD", // format of the data to parse from + tooltipFormat: "MMM DD, YYYY", // format of date in tooltip + }, + ticks: { + align: "start", // align ticks labels + }, + grid: { + display: false, // disable grid + }, + }, + }, + plugins: { + zoom: { + pan: { + enabled: true, // enable panning + modifierKey: "ctrl", // press ctrl key to enable panning + mode: "x", // pan only in x direction + }, + zoom: { + drag: { + enabled: true, // enable zoom + }, + mode: "x", // zoom only in x direction + onZoomComplete: (tempChart: { chart: Chart }) => { + // update x axis label scale depending on zoom level + if (tempChart.chart.options.scales?.x) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + tempChart.chart.options.scales.x.time.unit = xAxisLabelUnit( + tempChart.chart.scales.x.min, + tempChart.chart.scales.x.max, + ); + tempChart.chart.update(); + disableZoomReset.value = !tempChart.chart.isZoomedOrPanned(); + } + }, + }, + limits: { + // limit for zooming in x direction + x: { + minRange: 2419200000, // minimum range one month in milliseconds 1000*60*60*24*7*4 + min: "original", // min x value from original scale + max: "original", // max x value from original scale + }, + y2: { + min: "original", // min y value from original scale + max: "original", // max y value from original scale + }, + }, + }, + tooltip: { + enabled: true, // enable tooltips + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + position: "top", // position tooltip on top of canvas + mode: "index", + intersect: false, + backgroundColor: "rgba(108, 117, 125, 0.9)", // greyish background color + yAlign: "bottom", // Position of the tooltip caret in the Y direction + }, + }, + }, + }); + if (paddedStats.value.length > 0) { + updateData(chart, paddedStats.value); + } + } +}); +</script> + +<template> + <div class="w-100 row"> + <h5 class="mx-auto w-fit">Workflow Usage Statistics</h5> + </div> + <div class="d-flex align-items-center mb-4"> + <div + class="d-flex flex-column justify-content-evenly align-items-center me-2 pb-2" + style="height: 150px" + > + <div> + {{ dayjs(paddedStats[0].day).format("MMM YYYY") }} - + {{ dayjs().format("MMM YYYY") }} + </div> + <button + type="button" + class="btn btn-outline-secondary me-2" + @click="resetZoom" + :disabled="disableZoomReset" + > + Reset Zoom + </button> + </div> + <div style="max-height: 200px" class="flex-fill"> + <canvas ref="canvas"></canvas> + </div> + </div> +</template> + +<style scoped></style> diff --git a/src/components/workflows/WorkflowWithVersionsCard.vue b/src/components/workflows/WorkflowWithVersionsCard.vue new file mode 100644 index 0000000000000000000000000000000000000000..d27d855bc536c91fb40317fdafa283ec144f4639 --- /dev/null +++ b/src/components/workflows/WorkflowWithVersionsCard.vue @@ -0,0 +1,348 @@ +<script setup lang="ts"> +import type { + AnonymizedWorkflowExecution, + WorkflowOut, + WorkflowVersion, +} from "@/client/workflow"; +import { Status, WorkflowExecutionStatus } from "@/client/workflow"; +import { computed, onMounted, ref, watch } from "vue"; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import dayjs from "dayjs"; +import { sortedVersions } from "@/utils/Workflow"; +import { Tooltip } from "bootstrap"; +import { useWorkflowExecutionStore } from "@/stores/workflowExecutions"; + +const workflowExecutionRepository = useWorkflowExecutionStore(); +const props = defineProps<{ + workflow: WorkflowOut; + loading: boolean; +}>(); +const truncateDescription = ref<boolean>(true); +const randomIDSuffix: string = Math.random().toString(16).substring(2, 8); + +const emit = defineEmits<{ + (e: "workflow-update-click", workflow: WorkflowOut): void; + (e: "workflow-delete-click", workflow: WorkflowOut): void; + (e: "workflow-update-credentials-click", workflow: WorkflowOut): void; + (e: "workflow-update-icon-click", version: WorkflowVersion): void; +}>(); + +watch( + () => props.loading, + (loading) => { + if (!loading && props.workflow.private) { + new Tooltip(`#tooltip-${randomIDSuffix}`); + } + }, +); + +const workflowExecutions = computed<AnonymizedWorkflowExecution[]>(() => + workflowExecutionRepository.anonymizedExecutions.filter( + (execution) => execution.workflow_id == props.workflow.workflow_id, + ), +); + +const executionsByVersion = computed< + Record<string, AnonymizedWorkflowExecution[]> +>(() => { + const mapping: Record<string, AnonymizedWorkflowExecution[]> = {}; + for (const version of props.workflow.versions) { + mapping[version.git_commit_hash] = []; + } + for (const execution of workflowExecutions.value) { + mapping[execution.git_commit_hash].push(execution); + } + return mapping; +}); + +const statusToIconMapping: Record<string, string> = { + PUBLISHED: "fa-solid fa-circle-check", + DENIED: "fa-solid fa-x", + CREATED: "fa-solid fa-circle-pause", + DEPRECATED: "fa-solid fa-box-archive", +}; + +function successfulExecutions( + executions: AnonymizedWorkflowExecution[], +): number { + return executions.filter( + (execution) => execution.status === WorkflowExecutionStatus.SUCCESS, + ).length; +} + +function unsuccessfulExecutions( + executions: AnonymizedWorkflowExecution[], +): number { + return executions.filter( + (execution) => execution.status !== WorkflowExecutionStatus.SUCCESS, + ).length; +} + +function uniqueUsers(executions: AnonymizedWorkflowExecution[]): number { + return executions.filter( + // filter unique UIDs + (execution, index, array) => + array.findIndex((val) => val.pseudo_uid === execution.pseudo_uid) === + index, + ).length; +} + +onMounted(() => { + if (!props.loading) { + if (props.workflow.private) { + new Tooltip(`#tooltip-${randomIDSuffix}`); + } + document + .querySelector("#workflow-card-" + randomIDSuffix) + ?.querySelectorAll('[data-bs-toggle="tooltip"]') + .forEach((tooltipTriggerEl) => + Tooltip.getOrCreateInstance(tooltipTriggerEl), + ); + } +}); +</script> + +<template> + <div + :id="'workflow-card-' + randomIDSuffix" + class="card-hover border border-secondary card m-2" + > + <div class="card-body"> + <div + class="card-title fs-3 d-flex justify-content-between align-items-center" + > + <div v-if="props.loading" class="placeholder-glow w-100"> + <span class="placeholder col-6"></span> + </div> + <div v-else class="text-truncate"> + <font-awesome-icon + v-if="props.workflow.private" + icon="fa-solid fa-lock" + class="fs-5 me-2 tooltip-private-repository" + :id="'tooltip-' + randomIDSuffix" + data-bs-toggle="tooltip" + data-bs-title="Private Git Repository" + /> + <span>{{ props.workflow.name }}</span> + </div> + <div> + <button + type="button" + class="btn btn-outline-info me-2" + @click="emit('workflow-update-credentials-click', props.workflow)" + :class="{ disabled: props.loading }" + data-bs-toggle="modal" + data-bs-target="#updateWorkflowCredentialsModal" + > + <font-awesome-icon icon="fa-solid fa-key" /> + </button> + <button + type="button" + class="btn btn-outline-danger me-2" + @click="emit('workflow-delete-click', props.workflow)" + :class="{ disabled: props.loading }" + data-bs-toggle="modal" + data-bs-target="#deleteWorkflowModal" + > + <font-awesome-icon icon="fa-solid fa-trash" /> + </button> + <button + type="button" + class="btn btn-success" + :class="{ disabled: props.loading }" + @click="emit('workflow-update-click', props.workflow)" + data-bs-toggle="modal" + data-bs-target="#updateWorkflowModal" + > + Update + </button> + </div> + </div> + <p class="card-text" :class="{ 'text-truncate': truncateDescription }"> + <span v-if="props.loading" class="placeholder-glow" + ><span class="placeholder col-12"></span + ></span> + <span + v-else + @click="truncateDescription = false" + :class="{ + 'cursor-pointer': truncateDescription, + }" + >{{ props.workflow.short_description }}</span + > + </p> + <div> + <div v-if="props.loading" class="row placeholder-glow p-3"> + <span class="placeholder col-md-1"></span> + <span class="placeholder col-md-2 offset-md-1 bg-success"></span> + <span class="placeholder col-md-2 offset-md-3"></span> + <span class="placeholder col-md-1 offset-md-1 bg-primary"></span> + </div> + <div v-else> + <table class="table table-sm table-hover"> + <thead> + <tr> + <th scope="col">Version</th> + <th scope="col">Status</th> + <th scope="col">Updated at</th> + <th scope="col" class="text-align-center">Usage</th> + <th scope="col" class="text-align-center">Icon</th> + <th scope="col">Link</th> + </tr> + </thead> + <tbody class="table-group-divider"> + <tr + v-for="version in sortedVersions(props.workflow.versions)" + :key="version.git_commit_hash" + > + <th scope="row" class="fw-bold">{{ version.version }}</th> + <td + :class="{ + 'text-success': version.status === Status.PUBLISHED, + 'text-danger': version.status === Status.DENIED, + 'text-secondary': version.status === Status.CREATED, + 'text-warning': version.status === Status.DEPRECATED, + }" + > + <font-awesome-icon + :icon="statusToIconMapping[version.status]" + /> + {{ version.status }} + </td> + <td> + {{ dayjs.unix(version.created_at).format("DD MMM YYYY") }} + </td> + <td class="text-align-center"> + <span + class="text-success me-1" + data-bs-toggle="tooltip" + data-bs-title="Successful Workflow Executions" + > + {{ + successfulExecutions( + executionsByVersion[version.git_commit_hash], + ) + }} + <font-awesome-icon icon="fa-solid fa-circle-check" /> + </span> + <span + class="text-danger me-1" + data-bs-toggle="tooltip" + data-bs-title="Unsuccessful Workflow Executions" + > + {{ + unsuccessfulExecutions( + executionsByVersion[version.git_commit_hash], + ) + }} + <font-awesome-icon icon="fa-solid fa-x" /> + </span> + <span data-bs-toggle="tooltip" data-bs-title="Unique Users"> + {{ + uniqueUsers(executionsByVersion[version.git_commit_hash]) + }} + <font-awesome-icon icon="fa-solid fa-user" /> + </span> + </td> + <td class="text-align-center"> + <img + v-if="version.icon_url != null" + :src="version.icon_url" + alt="Workflow Version Icon" + @click="emit('workflow-update-icon-click', version)" + class="cursor-pointer" + data-bs-toggle="modal" + data-bs-target="#updateWorkflowVersionIconModal" + /> + <font-awesome-icon + v-else + icon="fa-solid fa-circle-plus" + class="add-icon-hover cursor-pointer" + @click="emit('workflow-update-icon-click', version)" + data-bs-toggle="modal" + data-bs-target="#updateWorkflowVersionIconModal" + /> + </td> + <td> + <router-link + class="w-fit mx-0" + :to="{ + name: 'workflow-version', + params: { + workflowId: props.workflow.workflow_id, + versionId: version.git_commit_hash, + }, + query: { + workflowModeId: version.modes?.[0] ?? undefined, + developerView: 'true', + }, + }" + >View + </router-link> + </td> + </tr> + <tr> + <th scope="row" class="fw-bold">Overall</th> + <td colspan="2"></td> + <td class="text-align-center"> + <span + class="text-success me-1" + data-bs-toggle="tooltip" + data-bs-title="Successful Workflow Executions" + > + {{ successfulExecutions(workflowExecutions) }} + <font-awesome-icon icon="fa-solid fa-circle-check" /> + </span> + <span + class="text-danger me-1" + data-bs-toggle="tooltip" + data-bs-title="Unsuccessful Workflow Executions" + > + {{ unsuccessfulExecutions(workflowExecutions) }} + <font-awesome-icon icon="fa-solid fa-x" /> + </span> + <span data-bs-toggle="tooltip" data-bs-title="Unique Users"> + {{ uniqueUsers(workflowExecutions) }} + <font-awesome-icon icon="fa-solid fa-user" /> + </span> + </td> + <td colspan="2"></td> + </tr> + </tbody> + </table> + </div> + </div> + </div> + </div> +</template> + +<style scoped> +.card-hover { + transition: transform 0.3s ease-out; +} + +@media (min-width: 992px) { + .card-hover { + transition: transform 0.3s ease-out; + width: 48%; + } +} + +.card-hover:hover { + transform: translate(0, -5px); + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; +} + +td > img { + max-width: 1em; + max-height: 1em; +} + +.add-icon-hover:hover { + color: var(--bs-success) !important; +} + +.text-align-center { + text-align: center; +} +</style> diff --git a/src/components/workflows/modals/ArbitraryWorkflowModal.vue b/src/components/workflows/modals/ArbitraryWorkflowModal.vue new file mode 100644 index 0000000000000000000000000000000000000000..65fce9d4fdd315b462ea2d30d1efef49c07a3238 --- /dev/null +++ b/src/components/workflows/modals/ArbitraryWorkflowModal.vue @@ -0,0 +1,431 @@ +<script setup lang="ts"> +import BootstrapModal from "@/components/modals/BootstrapModal.vue"; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import { computed, onMounted, reactive, ref, watch } from "vue"; +import { useRouter } from "vue-router"; +import { + GitRepository, + requiredRepositoryFiles, + determineGitIcon, +} from "@/utils/GitRepository"; +import { Collapse, Modal } from "bootstrap"; +import { useWorkflowStore } from "@/stores/workflows"; +import type { WorkflowModeOut } from "@/client/workflow"; + +const props = defineProps<{ + modalID: string; +}>(); + +let createWorkflowModal: Modal | null = null; +let privateRepositoryCollapse: Collapse | null = null; +let tokenHelpCollapse: Collapse | null = null; +let workflowModeCollapse: Collapse | null = null; +const arbitraryWorkflowForm = ref<HTMLFormElement | undefined>(undefined); +const workflowRepositoryElement = ref<HTMLInputElement | undefined>(undefined); + +const router = useRouter(); +const workflowStore = useWorkflowStore(); + +const workflow = reactive<{ + repository_url: string; + git_commit_hash: string; +}>({ + repository_url: "", + git_commit_hash: "", +}); + +const repositoryCredentials = reactive<{ + token: string; + privateRepo: boolean; +}>({ + token: "", + privateRepo: false, +}); + +const workflowMode = reactive<{ + mode: WorkflowModeOut; + modeEnabled: boolean; +}>({ + mode: { + entrypoint: "", + schema_path: "", + name: "", + mode_id: crypto.randomUUID(), + }, + modeEnabled: false, +}); + +const formState = reactive<{ + loading: boolean; + checkRepoLoading: boolean; + validated: boolean; + allowUpload: boolean; + missingFiles: string[]; + unsupportedRepository: boolean; +}>({ + validated: false, + allowUpload: false, + loading: false, + checkRepoLoading: false, + missingFiles: [], + unsupportedRepository: false, +}); + +watch( + () => repositoryCredentials.privateRepo, + (show) => { + if (show) { + privateRepositoryCollapse?.show(); + } else { + privateRepositoryCollapse?.hide(); + tokenHelpCollapse?.hide(); + } + }, +); + +watch( + () => workflowMode.modeEnabled, + (show) => { + if (show) { + workflowModeCollapse?.show(); + } else { + workflowModeCollapse?.hide(); + } + }, +); + +function modalClosed() { + formState.validated = false; + tokenHelpCollapse?.hide(); +} + +function viewWorkflow() { + createWorkflowModal?.hide(); + workflowStore + .setArbitraryWorkflow({ + ...workflow, + name: "", + short_description: "", + modes: workflowMode.modeEnabled ? [{ ...workflowMode.mode }] : [], + token: + repositoryCredentials.token.length > 0 + ? repositoryCredentials.token + : undefined, + }) + .then((wid) => { + router.push({ + name: "arbitrary-workflow", + query: { + wid: wid, + }, + }); + }); +} + +function checkRepository() { + formState.validated = true; + if (arbitraryWorkflowForm.value?.checkValidity() && !formState.allowUpload) { + formState.unsupportedRepository = false; + formState.missingFiles = []; + workflowRepositoryElement.value?.setCustomValidity(""); + try { + const repo = GitRepository.buildRepository( + workflow.repository_url, + workflow.git_commit_hash, + repositoryCredentials.privateRepo + ? repositoryCredentials.token + : undefined, + ); + repo + .checkFilesExist( + requiredRepositoryFiles( + workflowMode.modeEnabled ? [workflowMode.mode] : [], + ), + true, + ) + .then(() => { + formState.allowUpload = true; + }) + .catch((e: Error) => { + formState.missingFiles = e.message.split(","); + // Allow execution of the workflow if main.nf and parameter schema are not missing + if ( + formState.missingFiles.findIndex( + (file) => file === "main.nf" || file === "nextflow_schema.json", + ) < 0 + ) { + formState.allowUpload = true; + } + }); + } catch (e) { + formState.unsupportedRepository = true; + workflowRepositoryElement.value?.setCustomValidity( + "Repository is not supported", + ); + } + } +} + +const gitIcon = computed<string>(() => + determineGitIcon(workflow.repository_url), +); + +onMounted(() => { + createWorkflowModal = new Modal("#" + props.modalID); + privateRepositoryCollapse = new Collapse("#privateRepositoryCollapse", { + toggle: false, + }); + workflowModeCollapse = new Collapse("#workflowModeCollapse", { + toggle: false, + }); + tokenHelpCollapse = new Collapse("#tokenHelpCollapse", { + toggle: false, + }); +}); +</script> + +<template> + <bootstrap-modal + :modalID="modalID" + :static-backdrop="false" + modal-label="Create Workflow Modal" + v-on="{ 'hidden.bs.modal': modalClosed }" + > + <template v-slot:header>Start arbitrary Workflow</template> + <template v-slot:body> + <form + id="arbitraryWorkflowForm" + :class="{ 'was-validated': formState.validated }" + ref="arbitraryWorkflowForm" + > + <div class="mb-3"> + <label for="arbitraryWorkflowRepositoryInput" class="form-label" + >Git Repository URL</label + > + <div class="input-group"> + <div class="input-group-text"> + <font-awesome-icon :icon="gitIcon" /> + </div> + <input + type="url" + class="form-control" + id="arbitraryWorkflowRepositoryInput" + placeholder="https://..." + required + ref="workflowRepositoryElement" + v-model="workflow.repository_url" + @change="formState.allowUpload = false" + aria-describedby="gitRepoProviderHelp" + /> + </div> + <div id="gitRepoProviderHelp" class="form-text"> + We support Github and GitLab Repositories + </div> + <div class="text-danger"> + <div v-if="formState.unsupportedRepository"> + Repository is not supported + </div> + </div> + </div> + <div class="mb-3"> + <label for="workflowGitCommitInput" class="form-label" + >Git Commit Hash</label + > + <div class="input-group"> + <div class="input-group-text"> + <font-awesome-icon icon="fa-solid fa-code-commit" /> + </div> + <input + type="text" + class="form-control text-lowercase" + id="workflowGitCommitInput" + placeholder="ba8bcd9..." + required + ref="workflowGitCommitHashElement" + maxlength="40" + minlength="40" + pattern="[0-9a-f]{40}" + v-model="workflow.git_commit_hash" + @change="formState.allowUpload = false" + /> + </div> + </div> + <div v-if="formState.missingFiles.length > 0" class="text-danger"> + The following files are missing in the repository + <ul> + <li v-for="file in formState.missingFiles" :key="file"> + {{ file }} + </li> + </ul> + </div> + <div class="mb-3"> + <div class="form-check fs-5"> + <input + class="form-check-input" + type="checkbox" + v-model="repositoryCredentials.privateRepo" + id="privateRepositoryCheckbox" + @change="formState.allowUpload = false" + aria-controls="#privateRepositoryCollapse" + /> + <label class="form-check-label" for="privateRepositoryCheckbox"> + Enable Private Git Repository + </label> + </div> + <div class="collapse" id="privateRepositoryCollapse"> + <label for="arbitraryRepositoryTokenInput" class="form-label" + >Token</label + > + <div class="input-group"> + <div class="input-group-text"> + <font-awesome-icon icon="fa-solid fa-key" /> + </div> + <input + type="password" + class="form-control" + id="arbitraryRepositoryTokenInput" + v-model="repositoryCredentials.token" + @change="formState.allowUpload = false" + :required="repositoryCredentials.privateRepo" + aria-controls="#tokenHelpCollapse" + /> + <div + class="input-group-text cursor-pointer hover-info" + @click="tokenHelpCollapse?.toggle()" + > + <font-awesome-icon icon="fa-solid fa-circle-question" /> + </div> + </div> + <div class="collapse" id="tokenHelpCollapse"> + <div class="card card-body mt-3"> + <h5>GitHub</h5> + <p> + For private GitHub repositories, CloWM needs a Personal Access + Token (classic) with the scope <code>repo</code>.<br /> + Read this + <a + target="_blank" + href="https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-personal-access-token-classic" + >Tutorial</a + > + on how to create such a token. + </p> + <h5>GitLab</h5> + <p> + For private GitLab repositories, CloWM needs a Project Access + Token with the <code>read_api</code> scope and at least + <code>Reporter</code> role.<br /> + Read this + <a + target="_blank" + href="https://docs.gitlab.com/ee/user/project/settings/project_access_tokens.html#create-a-project-access-token" + >Tutorial</a + > + on how to create such a token. + </p> + </div> + </div> + </div> + </div> + <div class="mb-3"> + <div class="form-check fs-5"> + <input + class="form-check-input" + type="checkbox" + v-model="workflowMode.modeEnabled" + id="workflowModeCheckbox" + @change="formState.allowUpload = false" + aria-controls="#workflowModeCollapse" + /> + <label class="form-check-label" for="workflowModeCheckbox"> + Enable Workflow Mode + </label> + </div> + <div class="collapse" id="workflowModeCollapse"> + <div class="row"> + <div class="col-6 mb-2"> + <label for="arbitraryModeEntryInput" class="form-label" + >Entrypoint</label + > + <div class="input-group"> + <div class="input-group-text"> + <font-awesome-icon icon="fa-solid fa-tag" /> + </div> + <input + type="text" + class="form-control" + id="arbitraryModeEntryInput" + maxlength="128" + v-model="workflowMode.mode.entrypoint" + :required="workflowMode.modeEnabled" + @change="formState.allowUpload = false" + /> + </div> + </div> + <div class="col-6"> + <label for="modeSchemaInput-" class="form-label" + >Schema File</label + > + <div class="input-group"> + <div class="input-group-text"> + <font-awesome-icon icon="fa-solid fa-file-code" /> + </div> + <input + type="text" + class="form-control" + id="modeSchemaInput-" + maxlength="128" + pattern=".*\.json$" + v-model="workflowMode.mode.schema_path" + :required="workflowMode.modeEnabled" + @change="formState.allowUpload = false" + /> + </div> + </div> + </div> + </div> + </div> + </form> + </template> + <template v-slot:footer> + <button + type="button" + class="btn btn-info me-auto" + @click="checkRepository" + :disabled="formState.allowUpload" + > + <span + v-if="formState.checkRepoLoading" + class="spinner-border spinner-border-sm" + role="status" + aria-hidden="true" + ></span> + Check Repository + </button> + <button type="button" class="btn btn-secondary" data-bs-dismiss="modal"> + Close + </button> + <button + type="submit" + form="workflowCreateForm" + class="btn btn-primary" + :disabled="formState.loading || !formState.allowUpload" + @click.prevent="viewWorkflow" + > + <span + v-if="formState.loading" + class="spinner-border spinner-border-sm" + role="status" + aria-hidden="true" + ></span> + View + </button> + </template> + </bootstrap-modal> +</template> + +<style scoped> +.hover-info:hover { + color: var(--bs-info) !important; +} +</style> diff --git a/src/components/workflows/modals/CreateWorkflowModal.vue b/src/components/workflows/modals/CreateWorkflowModal.vue new file mode 100644 index 0000000000000000000000000000000000000000..86bd5862fcfe811428259c97758a9fb9ca299ee7 --- /dev/null +++ b/src/components/workflows/modals/CreateWorkflowModal.vue @@ -0,0 +1,707 @@ +<script setup lang="ts"> +import { computed, onMounted, reactive, ref, watch } from "vue"; +import { Modal, Toast, Collapse, Tooltip } from "bootstrap"; +import type { + WorkflowIn, + WorkflowOut, + WorkflowModeOut, +} from "@/client/workflow"; +import BootstrapModal from "@/components/modals/BootstrapModal.vue"; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import { ApiError } from "@/client/workflow"; +import { + GitRepository, + requiredRepositoryFiles, + determineGitIcon, +} from "@/utils/GitRepository"; +import { valid } from "semver"; +import WorkflowModeTransitionGroup from "@/components/transitions/WorkflowModeTransitionGroup.vue"; +import { useWorkflowStore } from "@/stores/workflows"; + +const workflowRepository = useWorkflowStore(); +// Emitted Events +// ============================================================================= +const emit = defineEmits<{ + (e: "workflow-created", workflow: WorkflowOut): void; +}>(); + +// Props +// ============================================================================= +const props = defineProps<{ + modalID: string; +}>(); + +// Bootstrap Elements +// ============================================================================= +let createWorkflowModal: Modal | null = null; +let successToast: Toast | null = null; +let privateRepositoryCollapse: Collapse | null = null; +let tokenHelpCollapse: Collapse | null = null; +let workflowModesCollapse: Collapse | null = null; + +// HTML Form Elements +// ============================================================================= +const workflowCreateForm = ref<HTMLFormElement | undefined>(undefined); +const workflowVersionElement = ref<HTMLInputElement | undefined>(undefined); +const workflowGitCommitHashElement = ref<HTMLInputElement | undefined>( + undefined, +); +const workflowNameElement = ref<HTMLInputElement | undefined>(undefined); +const workflowRepositoryElement = ref<HTMLInputElement | undefined>(undefined); + +// Constants +// ============================================================================= +const randomIDSuffix = Math.random().toString(16).substring(2, 8); + +// Reactive State +// ============================================================================= +const workflow = reactive<WorkflowIn>({ + name: "", + short_description: "", + repository_url: "", + git_commit_hash: "", + initial_version: undefined, + token: undefined, + modes: [], +}); + +const formState = reactive<{ + loading: boolean; + checkRepoLoading: boolean; + validated: boolean; + allowUpload: boolean; + missingFiles: string[]; + unsupportedRepository: boolean; +}>({ + validated: false, + allowUpload: false, + loading: false, + checkRepoLoading: false, + missingFiles: [], + unsupportedRepository: false, +}); + +const repositoryCredentials = reactive<{ + token: string; + privateRepo: boolean; +}>({ + token: "", + privateRepo: false, +}); + +const workflowModes = reactive<{ + hasModes: boolean; + modes: WorkflowModeOut[]; +}>({ + hasModes: false, + modes: [ + { + mode_id: crypto.randomUUID(), + name: "", + schema_path: "", + entrypoint: "", + }, + ], +}); + +// Computed Properties +// ============================================================================= +const gitIcon = computed<string>(() => + determineGitIcon(workflow.repository_url), +); + +watch( + () => repositoryCredentials.privateRepo, + (show) => { + if (show) { + privateRepositoryCollapse?.show(); + } else { + privateRepositoryCollapse?.hide(); + tokenHelpCollapse?.hide(); + } + }, +); + +watch( + () => workflowModes.hasModes, + (show) => { + if (show) { + workflowModesCollapse?.show(); + } else { + workflowModesCollapse?.hide(); + } + }, +); + +// Functions +// ============================================================================= +function modalClosed() { + formState.validated = false; + formState.allowUpload = false; + formState.missingFiles = []; + formState.unsupportedRepository = false; + workflowGitCommitHashElement.value?.setCustomValidity(""); + workflowRepositoryElement.value?.setCustomValidity(""); + workflowNameElement.value?.setCustomValidity(""); + tokenHelpCollapse?.hide(); +} + +/** + * Create a workflow in the backend. + */ +function createWorkflow() { + formState.validated = true; + workflow.name = workflow.name.trim(); + workflow.short_description = workflow.short_description.trim(); + workflow.initial_version = workflow.initial_version?.trim(); + if (workflowCreateForm.value?.checkValidity() && formState.allowUpload) { + formState.loading = true; + workflowNameElement.value?.setCustomValidity(""); + workflowGitCommitHashElement.value?.setCustomValidity(""); + if ( + repositoryCredentials.privateRepo && + repositoryCredentials.token.length > 0 + ) { + workflow.token = repositoryCredentials.token; + } + if (workflowModes.hasModes) { + workflow.modes = workflowModes.modes.map((mode) => { + return { + name: mode.name, + schema_path: mode.schema_path, + entrypoint: mode.entrypoint, + }; + }); + } + workflowRepository + .createWorkflow(workflow) + .then((w) => { + emit("workflow-created", w); + successToast?.show(); + createWorkflowModal?.hide(); + resetForm(); + }) + .catch((error: ApiError) => { + const errorText = error.body["detail"]; + if (errorText.startsWith("Workflow with name")) { + workflowNameElement.value?.setCustomValidity("Name is already taken"); + } else if (errorText.startsWith("Workflow with git_commit_hash")) { + workflowGitCommitHashElement.value?.setCustomValidity( + "Git commit is already used by a workflow", + ); + } + }) + .finally(() => { + formState.loading = false; + }); + } +} + +/** + * Reset the form to an empty state. + */ +function resetForm() { + modalClosed(); + workflow.name = ""; + workflow.short_description = ""; + workflow.repository_url = ""; + workflow.git_commit_hash = ""; + workflow.initial_version = undefined; + workflow.token = undefined; + workflow.modes = []; + workflowModes.modes = [ + { + mode_id: crypto.randomUUID(), + name: "", + schema_path: "", + entrypoint: "", + }, + ]; + workflowModes.hasModes = false; + repositoryCredentials.privateRepo = false; + repositoryCredentials.token = ""; + privateRepositoryCollapse?.hide(); +} + +/** + * Check the workflow repository for the necessary files. + */ +function checkRepository() { + formState.validated = true; + workflowRepositoryElement.value?.setCustomValidity(""); + workflowGitCommitHashElement.value?.setCustomValidity(""); + if (workflowCreateForm.value?.checkValidity() && !formState.allowUpload) { + formState.unsupportedRepository = false; + formState.missingFiles = []; + try { + const repo = GitRepository.buildRepository( + workflow.repository_url, + workflow.git_commit_hash, + repositoryCredentials.privateRepo + ? repositoryCredentials.token + : undefined, + ); + const requiredFiles = requiredRepositoryFiles( + workflowModes.hasModes ? workflowModes.modes : [], + ); + repo + .checkFilesExist(requiredFiles, true) + .then(() => { + formState.allowUpload = true; + }) + .catch((e: Error) => { + formState.missingFiles = e.message.split(","); + workflowGitCommitHashElement.value?.setCustomValidity( + "Files are missing in the repository", + ); + }); + } catch (e) { + formState.unsupportedRepository = true; + workflowRepositoryElement.value?.setCustomValidity( + "Repository is not supported", + ); + } + } +} + +/** + * Check if the version is a valid semantic version + */ +function checkVersionValidity() { + if (valid(workflow.initial_version) == null) { + workflowVersionElement.value?.setCustomValidity( + "Please use semantic versioning", + ); + } else { + workflowVersionElement.value?.setCustomValidity(""); + } +} + +function addMode() { + if (workflowModes.modes.length < 11) { + workflowModes.modes.push({ + mode_id: crypto.randomUUID(), + name: "", + schema_path: "", + entrypoint: "", + }); + } +} + +function removeMode(index: number) { + if ( + workflowModes.modes.length > 1 && + index > -1 && + index < (workflowModes.modes.length ?? 0) + ) { + workflowModes.modes.splice(index, 1); + } +} + +// Lifecycle Events +// ============================================================================= +onMounted(() => { + createWorkflowModal = new Modal("#" + props.modalID); + successToast = new Toast("#successToast-" + randomIDSuffix); + privateRepositoryCollapse = new Collapse("#privateRepositoryCollapse", { + toggle: false, + }); + tokenHelpCollapse = new Collapse("#tokenHelpCollapse", { + toggle: false, + }); + workflowModesCollapse = new Collapse("#workflowModesCollapse", { + toggle: false, + }); + new Tooltip("#tooltip-version-" + randomIDSuffix); + new Tooltip("#tooltip-commit-" + randomIDSuffix); + new Tooltip("#tooltip-url-" + randomIDSuffix); +}); +</script> + +<template> + <div class="toast-container position-fixed top-toast end-0 p-3"> + <div + role="alert" + aria-live="assertive" + aria-atomic="true" + class="toast text-bg-success align-items-center border-0" + data-bs-autohide="true" + :id="'successToast-' + randomIDSuffix" + > + <div class="d-flex"> + <div class="toast-body">Successfully created Workflow</div> + <button + type="button" + class="btn-close btn-close-white me-2 m-auto" + data-bs-dismiss="toast" + aria-label="Close" + ></button> + </div> + </div> + </div> + <bootstrap-modal + :modalID="modalID" + :static-backdrop="true" + modal-label="Create Workflow Modal" + v-on="{ 'hidden.bs.modal': modalClosed }" + > + <template v-slot:header> Create new Workflow</template> + <template v-slot:body> + <form + id="workflowCreateForm" + :class="{ 'was-validated': formState.validated }" + ref="workflowCreateForm" + > + <div class="mb-3"> + <label for="workflowNameInput" class="form-label" + >Workflow Name</label + > + <input + type="text" + class="form-control" + id="workflowNameInput" + placeholder="Short descriptive name" + required + ref="workflowNameElement" + minlength="3" + maxlength="64" + v-model="workflow.name" + /> + </div> + <div class="mb-3"> + <label for="workflowDescriptionInput" class="form-label"> + Short Description {{ workflow.short_description.length }} / 64 + </label> + <div class="input-group"> + <textarea + class="form-control" + id="workflowDescriptionInput" + required + rows="3" + minlength="64" + maxlength="256" + v-model="workflow.short_description" + placeholder="Describe the purpose of the workflow in a few words." + ></textarea> + <div class="invalid-feedback"> + Description needs to be at least 64 characters long. + </div> + </div> + </div> + <div class="mb-3"> + <label for="createWorkflowRepositoryInput" class="form-label" + >Git Repository URL</label + > + <div class="input-group"> + <div class="input-group-text"> + <font-awesome-icon :icon="gitIcon" /> + </div> + <input + type="url" + class="form-control" + id="createWorkflowRepositoryInput" + placeholder="https://..." + required + ref="workflowRepositoryElement" + v-model="workflow.repository_url" + @change="formState.allowUpload = false" + aria-describedby="gitRepoProviderHelp" + /> + <div + class="input-group-text hover-info" + :id="'tooltip-url-' + randomIDSuffix" + data-bs-toggle="tooltip" + data-bs-title="The URL of the git repository containing the workflow" + > + <font-awesome-icon icon="fa-solid fa-circle-question" /> + </div> + </div> + <div id="gitRepoProviderHelp" class="form-text"> + We support GitHub and GitLab Repositories + </div> + <div class="text-danger"> + <div v-if="formState.unsupportedRepository"> + Repository is not supported + </div> + </div> + </div> + <div class="row mb-3"> + <div class="col-8"> + <label for="workflowGitCommitInput" class="form-label" + >Git Commit Hash</label + > + <div class="input-group"> + <div class="input-group-text"> + <font-awesome-icon icon="fa-solid fa-code-commit" /> + </div> + <input + type="text" + class="form-control text-lowercase" + id="workflowGitCommitInput" + placeholder="ba8bcd9..." + required + ref="workflowGitCommitHashElement" + maxlength="40" + pattern="[0-9a-f]{40}" + v-model="workflow.git_commit_hash" + @change="formState.allowUpload = false" + /> + <div + class="input-group-text hover-info" + :id="'tooltip-commit-' + randomIDSuffix" + data-bs-toggle="tooltip" + data-bs-title="Hash of the Git commit used for the initial version" + > + <font-awesome-icon icon="fa-solid fa-circle-question" /> + </div> + </div> + <div v-if="formState.missingFiles.length > 0" class="text-danger"> + The following files are missing in the repository + <ul> + <li v-for="file in formState.missingFiles" :key="file"> + {{ file }} + </li> + </ul> + </div> + </div> + <div class="col-4"> + <label for="createWorkflowVersionInput" class="form-label" + >Initial Version</label + > + <div class="input-group"> + <div class="input-group-text"> + <font-awesome-icon icon="fa-solid fa-tag" /> + </div> + <input + type="text" + class="form-control" + id="createWorkflowVersionInput" + placeholder="v1.0.0" + maxlength="10" + ref="workflowVersionElement" + @change="checkVersionValidity" + v-model="workflow.initial_version" + /> + <div + class="input-group-text hover-info" + :id="'tooltip-version-' + randomIDSuffix" + data-bs-toggle="tooltip" + data-bs-title="Should follow semantic versioning" + > + <font-awesome-icon icon="fa-solid fa-circle-question" /> + </div> + </div> + </div> + </div> + <div class="mb-3"> + <div class="form-check fs-5"> + <input + class="form-check-input" + type="checkbox" + v-model="repositoryCredentials.privateRepo" + id="privateRepositoryCheckbox" + @change="formState.allowUpload = false" + aria-controls="#privateRepositoryCollapse" + /> + <label class="form-check-label" for="privateRepositoryCheckbox"> + Enable private Git Repository + </label> + </div> + <div class="collapse" id="privateRepositoryCollapse"> + <label for="createRepositoryTokenInput" class="form-label" + >Token</label + > + <div class="input-group"> + <div class="input-group-text"> + <font-awesome-icon icon="fa-solid fa-key" /> + </div> + <input + type="password" + class="form-control" + id="createRepositoryTokenInput" + v-model="repositoryCredentials.token" + @change="formState.allowUpload = false" + :required="repositoryCredentials.privateRepo" + aria-controls="#tokenHelpCollapse" + /> + <div + class="input-group-text cursor-pointer hover-info" + @click="tokenHelpCollapse?.toggle()" + > + <font-awesome-icon icon="fa-solid fa-circle-question" /> + </div> + </div> + <div class="collapse" id="tokenHelpCollapse"> + <div class="card card-body mt-3"> + <h5>GitHub</h5> + <p> + For private GitHub repositories, CloWM needs a Personal Access + Token (classic) with the scope <code>repo</code>.<br /> + Read this + <a + target="_blank" + href="https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-personal-access-token-classic" + >Tutorial</a + > + on how to create such a token. + </p> + <h5>GitLab</h5> + <p> + For private GitLab repositories, CloWM needs a Project Access + Token with the <code>read_api</code> scope and at least + <code>Reporter</code> role.<br /> + Read this + <a + target="_blank" + href="https://docs.gitlab.com/ee/user/project/settings/project_access_tokens.html#create-a-project-access-token" + >Tutorial</a + > + on how to create such a token. + </p> + <p> + Select a distant expiration date for both providers to ensure + that there won't be any problems in the short future. + </p> + </div> + </div> + </div> + </div> + <div class="mb-3"> + <div class="form-check fs-5"> + <input + class="form-check-input" + type="checkbox" + v-model="workflowModes.hasModes" + id="workflowModesCheckbox" + @change="formState.allowUpload = false" + aria-controls="#workflowModesCollapse" + /> + <label class="form-check-label" for="workflowModesCheckbox"> + Enable Workflow Modes + </label> + <button + v-if="workflowModes.hasModes" + class="btn btn-primary float-end" + @click="addMode" + :disabled="workflow.modes!.length >= 10" + > + Add Mode + </button> + </div> + </div> + <div class="collapse" id="workflowModesCollapse"> + <WorkflowModeTransitionGroup> + <div + v-for="(mode, index) in workflowModes.modes" + :key="mode.mode_id" + class="row mb-3" + > + <h6> + <font-awesome-icon + icon="fa-solid fa-minus" + class="text-danger me-1 fs-6 cursor-pointer" + @click="removeMode(index)" + /> + Mode {{ index + 1 }} + </h6> + <div class="col-6"> + <label :for="'modeNameInput-' + index" class="form-label" + >Name</label + > + <div class="input-group"> + <div class="input-group-text"> + <font-awesome-icon icon="fa-solid fa-tag" /> + </div> + <input + type="text" + class="form-control" + :id="'modeNameInput-' + index" + maxlength="128" + v-model="mode.name" + :required="workflowModes.hasModes" + /> + </div> + </div> + <div class="col-6 mb-2"> + <label :for="'modeEntryInput-' + index" class="form-label" + >Entrypoint</label + > + <div class="input-group"> + <div class="input-group-text"> + <font-awesome-icon icon="fa-solid fa-turn-down" /> + </div> + <input + type="text" + class="form-control" + :id="'modeEntryInput-' + index" + maxlength="128" + v-model="mode.entrypoint" + :required="workflowModes.hasModes" + /> + </div> + </div> + <label :for="'modeSchemaInput-' + index" class="form-label" + >Schema File</label + > + <div class="input-group"> + <div class="input-group-text"> + <font-awesome-icon icon="fa-solid fa-file-code" /> + </div> + <input + type="text" + class="form-control" + :id="'modeSchemaInput-' + index" + maxlength="128" + pattern=".*\.json$" + v-model="mode.schema_path" + @change="formState.allowUpload = false" + :required="workflowModes.hasModes" + /> + </div> + </div> + </WorkflowModeTransitionGroup> + </div> + </form> + </template> + <template v-slot:footer> + <button + type="button" + class="btn btn-info me-auto" + @click="checkRepository" + :disabled="formState.allowUpload" + > + <span + v-if="formState.checkRepoLoading" + class="spinner-border spinner-border-sm" + role="status" + aria-hidden="true" + ></span> + Check Repository + </button> + <button type="button" class="btn btn-secondary" data-bs-dismiss="modal"> + Close + </button> + <button + type="submit" + form="workflowCreateForm" + class="btn btn-primary" + :disabled="formState.loading || !formState.allowUpload" + @click.prevent="createWorkflow" + > + <span + v-if="formState.loading" + class="spinner-border spinner-border-sm" + role="status" + aria-hidden="true" + ></span> + Save + </button> + </template> + </bootstrap-modal> +</template> + +<style scoped> +.hover-info:hover { + color: var(--bs-info) !important; +} +</style> diff --git a/src/components/workflows/modals/ParameterModal.vue b/src/components/workflows/modals/ParameterModal.vue new file mode 100644 index 0000000000000000000000000000000000000000..576746b44668556bf079f70a015d88b9bd1315c1 --- /dev/null +++ b/src/components/workflows/modals/ParameterModal.vue @@ -0,0 +1,290 @@ +<script setup lang="ts"> +import BootstrapModal from "@/components/modals/BootstrapModal.vue"; +import { computed, onMounted, reactive, watch } from "vue"; +import { useWorkflowExecutionStore } from "@/stores/workflowExecutions"; +import type { RouteParamsRaw } from "vue-router"; +import { Modal } from "bootstrap"; +import { useRouter } from "vue-router"; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import { useWorkflowStore } from "@/stores/workflows"; +import type { WorkflowExecutionOut } from "@/client/workflow"; + +const workflowRepository = useWorkflowStore(); +const executionRepository = useWorkflowExecutionStore(); +const router = useRouter(); + +let parameterModal: Modal | null = null; + +const props = defineProps<{ + modalID: string; + executionId?: string; +}>(); + +const parameterState = reactive<{ + loading: boolean; + error: boolean; +}>({ + loading: false, + error: false, +}); + +const execution = computed<WorkflowExecutionOut | undefined>(() => { + if (props.executionId == undefined) { + return undefined; + } + return executionRepository.executionMapping[props.executionId] ?? undefined; +}); + +const logs_s3_path = computed<string | undefined>( + () => execution.value?.logs_s3_path ?? undefined, +); +const debug_s3_path = computed<string | undefined>( + () => execution.value?.debug_s3_path ?? undefined, +); +const provenance_s3_path = computed<string | undefined>( + () => execution.value?.provenance_s3_path ?? undefined, +); + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const parameters = computed<Record<string, any> | undefined>(() => { + if (props.executionId == undefined) { + return undefined; + } + return executionRepository.parameters[props.executionId] ?? undefined; +}); + +const parameterDownloadUrl = computed<string | undefined>(() => { + if (parameters.value == undefined) { + return undefined; + } + const blob = new Blob([JSON.stringify(parameters.value, undefined, 2)], { + type: "application/json", + }); + return URL.createObjectURL(blob); +}); + +const workflowName = computed<string>(() => { + if (props.executionId) { + const execution = executionRepository.executionMapping[props.executionId]; + if ( + execution?.workflow_id != undefined && + execution?.workflow_version_id != undefined + ) { + return ( + workflowRepository.getName(execution.workflow_id) + + "@" + + workflowRepository.getName(execution.workflow_version_id) + ); + } + } + return ""; +}); + +function fetchWorkflowExecutionParameters(executionId?: string) { + parameterState.error = false; + if (executionId != undefined) { + parameterState.loading = true; + executionRepository + .fetchExecutionParameters(executionId) + .catch(() => { + parameterState.error = true; + }) + .finally(() => { + parameterState.loading = false; + }); + } +} + +function handleBucketLinkClick(s3String: string) { + parameterModal?.hide(); + router.push({ + name: "bucket", + params: getS3LinkParameters(s3String), + }); +} + +function getS3LinkParameters(s3String: string): RouteParamsRaw { + const pathComponents = s3String.slice(5).split("/"); + const s3File = + pathComponents.length > 1 && + pathComponents[pathComponents.length - 1].includes("."); + return { + bucketName: pathComponents[0], + subFolders: pathComponents.slice(1, s3File ? -1 : undefined), + }; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function isBucketLink(value: any): boolean { + if (typeof value === "string") { + return value.startsWith("s3://"); + } + return false; +} + +watch( + () => props.executionId, + (newId, oldId) => { + if (newId != oldId) { + fetchWorkflowExecutionParameters(newId); + } + }, +); + +onMounted(() => { + fetchWorkflowExecutionParameters(props.executionId); + parameterModal = Modal.getOrCreateInstance("#" + props.modalID); +}); +</script> + +<template> + <bootstrap-modal + :modalID="modalID" + :static-backdrop="false" + modal-label="Workflow Execution Parameters Modal" + > + <template v-slot:header + >Workflow Execution Parameters + <b> + {{ workflowName }} + </b> + </template> + <template v-slot:body> + <div v-if="parameterState.error" class="text-center fs-4 mt-5"> + <font-awesome-icon + icon="fa-solid fa-magnifying-glass" + class="mb-3 fs-0" + style="color: var(--bs-secondary)" + /> + <p> + Workflow Execution <i>{{ props.executionId }}</i> not found + </p> + </div> + <table v-else-if="props.executionId" class="table table-hover"> + <caption class="placeholder-glow"> + <span v-if="parameterState.loading" class="placeholder col-1"></span> + <template v-else> + {{ + Object.keys(executionRepository.parameters[props.executionId]) + .length + }} + </template> + Parameters + </caption> + <tbody> + <template v-if="parameterState.loading"> + <tr v-for="n in 6" :key="n"> + <th scope="row" style="width: 20%" class="placeholder-glow"> + <div class="placeholder col-12"></div> + </th> + <td class="placeholder-glow"> + <div class="placeholder col-8"></div> + </td> + </tr> + </template> + <template v-else> + <tr + v-if="logs_s3_path" + :class="{ + 'border-bottom-thick': !debug_s3_path && !provenance_s3_path, + }" + > + <th scope="row" style="width: 10%" class="text-end"> + <b>logs</b> + </th> + <td> + <router-link + :to="{ + name: 'bucket', + params: getS3LinkParameters(logs_s3_path), + }" + @click.prevent="handleBucketLinkClick(logs_s3_path)" + >{{ logs_s3_path }} + </router-link> + </td> + </tr> + <tr + v-if="provenance_s3_path" + :class="{ + 'border-bottom-thick': !debug_s3_path, + }" + > + <th scope="row" style="width: 10%" class="text-end"> + <b>provenance</b> + </th> + <td> + <router-link + :to="{ + name: 'bucket', + params: getS3LinkParameters(provenance_s3_path), + }" + @click.prevent="handleBucketLinkClick(provenance_s3_path)" + >{{ provenance_s3_path }} + </router-link> + </td> + </tr> + <tr v-if="debug_s3_path" class="border-bottom-thick"> + <th scope="row" style="width: 10%" class="text-end"> + <b>debug</b> + </th> + <td> + <router-link + :to="{ + name: 'bucket', + params: getS3LinkParameters(debug_s3_path), + }" + @click.prevent="handleBucketLinkClick(debug_s3_path)" + >{{ debug_s3_path }} + </router-link> + </td> + </tr> + <tr v-for="(value, name) in parameters" :key="name"> + <th scope="row" style="width: 10%" class="text-end"> + <b>{{ name }}</b> + </th> + <td> + <router-link + v-if="isBucketLink(value)" + :to="{ + name: 'bucket', + params: getS3LinkParameters(value), + }" + @click.prevent="handleBucketLinkClick(value)" + >{{ value }} + </router-link> + <template v-else>{{ value }}</template> + </td> + </tr> + </template> + </tbody> + </table> + </template> + <template v-slot:footer> + <a + class="btn btn-primary" + role="button" + :class="{ + disabled: parameterState.loading || parameterState.error, + }" + :href="parameterDownloadUrl" + :download=" + 'parameters-' + props.executionId?.replace(/-/g, '') + '.json' + " + :tabindex="parameterState.loading || parameterState.error ? -1 : 0" + :aria-disabled="parameterState.loading || parameterState.error" + > + <font-awesome-icon icon="fa-solid fa-download" class="me-1" /> + Parameters</a + > + <button type="button" class="btn btn-secondary" data-bs-dismiss="modal"> + Close + </button> + </template> + </bootstrap-modal> +</template> + +<style scoped> +.border-bottom-thick { + border-bottom: 3px var(--bs-border-style) var(--bs-border-color) !important; +} +</style> diff --git a/src/components/workflows/modals/UpdateWorkflowCredentialsModal.vue b/src/components/workflows/modals/UpdateWorkflowCredentialsModal.vue new file mode 100644 index 0000000000000000000000000000000000000000..43f057f9103cf72bdc387ce8b0896f64542786c9 --- /dev/null +++ b/src/components/workflows/modals/UpdateWorkflowCredentialsModal.vue @@ -0,0 +1,271 @@ +<script setup lang="ts"> +import BootstrapModal from "@/components/modals/BootstrapModal.vue"; +import type { WorkflowCredentialsIn, WorkflowOut } from "@/client/workflow"; +import { onMounted, ref, reactive } from "vue"; +import { Modal, Toast } from "bootstrap"; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import DeleteModal from "@/components/modals/DeleteModal.vue"; +import { GitRepository } from "@/utils/GitRepository"; +import { useWorkflowStore } from "@/stores/workflows"; + +const workflowRepository = useWorkflowStore(); +// Constants +// ============================================================================= +const randomIDSuffix = Math.random().toString(16).substring(2, 8); + +// Bootstrap Elements +// ============================================================================= +let updateCredentialsModal: Modal | null = null; +let successToast: Toast | null = null; + +// Form Elements +// ============================================================================= +const credentialsUpdateForm = ref<HTMLFormElement | undefined>(undefined); +const credentialsInputElement = ref<HTMLInputElement | undefined>(undefined); + +// Props +// ============================================================================= +const props = defineProps<{ + modalID: string; + workflow: WorkflowOut; +}>(); + +// Reactive State +// ============================================================================= +const credentials = reactive<WorkflowCredentialsIn>({ + token: "", +}); + +const formState = reactive<{ + loading: boolean; + validated: boolean; + updateCredentials: boolean; + error: boolean; +}>({ + loading: false, + validated: false, + updateCredentials: true, + error: false, +}); + +// Functions +// ============================================================================= +function resetForm() { + credentials.token = ""; +} + +function modalClosed() { + formState.validated = false; + credentialsInputElement.value?.setCustomValidity(""); + formState.error = false; + resetForm(); +} + +function updateCredentials() { + formState.validated = true; + formState.error = false; + credentialsInputElement.value?.setCustomValidity(""); + if (credentialsUpdateForm.value?.checkValidity()) { + const repo = GitRepository.buildRepository( + props.workflow.repository_url, + props.workflow.versions[0].git_commit_hash, + credentials.token, + ); + repo.checkFileExist("main.nf").then((result: boolean) => { + if (result) { + workflowRepository + .updateWorkflowCredentials(props.workflow.workflow_id, credentials) + .then(() => { + formState.updateCredentials = true; + successToast?.show(); + updateCredentialsModal?.hide(); + }) + .catch((error) => { + console.error(error); + }) + .finally(() => { + formState.loading = false; + }); + } else { + formState.error = true; + credentialsInputElement.value?.setCustomValidity( + "Can't access repository.", + ); + formState.loading = false; + } + }); + formState.loading = true; + } +} + +function deleteCredentials() { + formState.loading = true; + workflowRepository + .deleteWorkflowCredentials(props.workflow.workflow_id) + .then(() => { + formState.updateCredentials = false; + successToast?.show(); + updateCredentialsModal?.hide(); + }) + .catch((error) => { + console.error(error); + }) + .finally(() => { + formState.loading = false; + }); +} + +// Lifecycle Events +// ============================================================================= +onMounted(() => { + updateCredentialsModal = new Modal("#" + props.modalID); + successToast = new Toast("#successToast-" + randomIDSuffix); +}); +</script> + +<template> + <DeleteModal + v-if="props.workflow.private" + :modalID="'delete-credentials-modal' + randomIDSuffix" + :object-name-delete="'credentials for workflow ' + props.workflow.name" + :back-modal-id="modalID" + @confirm-delete="deleteCredentials()" + /> + <div class="toast-container position-fixed top-toast end-0 p-3"> + <div + role="alert" + aria-live="assertive" + aria-atomic="true" + class="toast text-bg-success align-items-center border-0" + data-bs-autohide="true" + :id="'successToast-' + randomIDSuffix" + > + <div class="d-flex"> + <div v-if="formState.updateCredentials" class="toast-body"> + Successfully updated credentials + </div> + <div v-else class="toast-body">Successfully deleted credentials</div> + <button + type="button" + class="btn-close btn-close-white me-2 m-auto" + data-bs-dismiss="toast" + aria-label="Close" + ></button> + </div> + </div> + </div> + <bootstrap-modal + :modalID="modalID" + :static-backdrop="true" + modal-label="Update Workflow Version Icon Modal" + v-on="{ 'hidden.bs.modal': modalClosed }" + > + <template v-slot:header> + Update git repository credentials for Workflow + <span class="fw-bold">{{ props.workflow.name }}</span> + </template> + <template v-slot:extra-button v-if="props.workflow.private"> + <button + class="btn delete-icon" + data-bs-toggle="modal" + :data-bs-target="'#delete-credentials-modal' + randomIDSuffix" + > + <font-awesome-icon icon="fa-solid fa-trash" /> + </button> + </template> + <template v-slot:body> + <form + ref="credentialsUpdateForm" + id="credentialsUpdateForm" + :class="{ 'was-validated': formState.validated }" + > + <label for="workflowCredentialsInput" class="form-label" + >New Token</label + > + <div class="input-group"> + <div class="input-group-text"> + <font-awesome-icon icon="fa-solid fa-key" /> + </div> + <input + type="password" + ref="credentialsInputElement" + class="form-control" + id="workflowCredentialsInput" + aria-describedby="iconHelp" + required + v-model="credentials.token" + /> + </div> + <div v-if="formState.error" class="text-danger"> + Can't access the repository. + </div> + <div class="card card-body mt-3"> + <h5>GitHub</h5> + <p> + For private GitHub repositories, CloWM needs a Personal Access Token + (classic) with the scope <code>repo</code>.<br /> + Read this + <a + target="_blank" + href="https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-personal-access-token-classic" + >Tutorial</a + > + on how to create such a token. + </p> + <h5>GitLab</h5> + <p> + For private GitLab repositories, CloWM needs a Project Access Token + with the <code>read_api</code> scope and at least + <code>Reporter</code> role.<br /> + Read this + <a + target="_blank" + href="https://docs.gitlab.com/ee/user/project/settings/project_access_tokens.html#create-a-project-access-token" + >Tutorial</a + > + on how to create such a token. + </p> + <p> + Select a distant expiration date for both providers to ensure that + there won't be any problems in the short future. + </p> + </div> + </form> + </template> + <template v-slot:footer> + <button type="button" class="btn btn-secondary" data-bs-dismiss="modal"> + Close + </button> + <button + type="submit" + form="credentialsUpdateForm" + class="btn btn-primary" + :disabled="formState.loading" + @click.prevent="updateCredentials" + > + <span + v-if="formState.loading" + class="spinner-border spinner-border-sm" + role="status" + aria-hidden="true" + ></span> + Save + </button> + </template> + </bootstrap-modal> +</template> + +<style scoped> +img { + max-height: 64px; + max-width: 64px; +} + +.delete-icon { + color: var(--bs-secondary) !important; +} + +.delete-icon:hover { + color: var(--bs-danger) !important; +} +</style> diff --git a/src/components/workflows/modals/UpdateWorkflowModal.vue b/src/components/workflows/modals/UpdateWorkflowModal.vue new file mode 100644 index 0000000000000000000000000000000000000000..1b393686f6bdd81ebcdf4ce82d6e975fcac7eaa4 --- /dev/null +++ b/src/components/workflows/modals/UpdateWorkflowModal.vue @@ -0,0 +1,681 @@ +<script setup lang="ts"> +import { computed, onMounted, reactive, ref, watch } from "vue"; +import { Collapse, Modal, Toast } from "bootstrap"; +import type { + WorkflowUpdate, + WorkflowOut, + WorkflowModeIn, + WorkflowModeOut, + WorkflowVersion, + ApiError, +} from "@/client/workflow"; +import BootstrapModal from "@/components/modals/BootstrapModal.vue"; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import { WorkflowCredentialsService } from "@/client/workflow"; +import { + GitRepository, + requiredRepositoryFiles, + determineGitIcon, +} from "@/utils/GitRepository"; +import { valid, lte, inc } from "semver"; +import { latestVersion as calculateLatestVersion } from "@/utils/Workflow"; +import WorkflowModeTransitionGroup from "@/components/transitions/WorkflowModeTransitionGroup.vue"; +import { useWorkflowStore } from "@/stores/workflows"; + +const workflowRepository = useWorkflowStore(); +// Bootstrap Elements +// ============================================================================= +let updateWorkflowModal: Modal | null = null; +let successToast: Toast | null = null; +let workflowModesCollapse: Collapse | null = null; + +// Form Elements +// ============================================================================= +const workflowUpdateForm = ref<HTMLFormElement | undefined>(undefined); +const workflowIconInputElement = ref<HTMLInputElement | undefined>(undefined); +const workflowVersionElement = ref<HTMLInputElement | undefined>(undefined); +const workflowGitCommitHashElement = ref<HTMLInputElement | undefined>( + undefined, +); +const workflowIconElement = ref<HTMLImageElement | undefined>(undefined); + +// Constants +// ============================================================================= +const randomIDSuffix = Math.random().toString(16).substring(2, 8); + +// Props +// ============================================================================= +const props = defineProps<{ + modalID: string; + workflow: WorkflowOut; +}>(); + +// Reactive State +// ============================================================================= +const workflowUpdate = reactive<WorkflowUpdate>({ + version: "", + git_commit_hash: "", + delete_modes: [], + append_modes: [], +}); + +const workflowModes = reactive<{ + deleteModes: string[]; + addModes: WorkflowModeOut[]; +}>({ + deleteModes: [], + addModes: [], +}); + +const formState = reactive<{ + validated: boolean; + missingFiles: string[]; + loading: boolean; + checkRepoLoading: boolean; + allowUpload: boolean; + loadCredentials: boolean; + workflowToken?: string; + modesEnabled: boolean; +}>({ + loading: false, + checkRepoLoading: false, + allowUpload: false, + validated: false, + missingFiles: [], + loadCredentials: false, + workflowToken: undefined, + modesEnabled: false, +}); + +watch( + () => props.workflow, + () => { + resetForm(); + formState.modesEnabled = (latestVersion.value.modes ?? []).length > 0; + if (props.workflow.private) { + formState.loadCredentials = true; + WorkflowCredentialsService.workflowCredentialsGetWorkflowCredentials( + props.workflow.workflow_id, + ) + .then((credentials) => { + formState.workflowToken = credentials.token ?? undefined; + }) + .catch(() => { + formState.workflowToken = undefined; + }) + .finally(() => { + formState.loadCredentials = false; + }); + } else { + formState.workflowToken = undefined; + } + }, +); + +watch( + () => formState.modesEnabled, + (show) => { + if (show) { + workflowModesCollapse?.show(); + if ( + (latestVersion.value.modes?.length ?? 0) + + workflowModes.addModes.length === + 0 + ) { + addMode(); + } + } else { + workflowModesCollapse?.hide(); + } + }, +); + +// Computed Properties +// ============================================================================= +const latestVersion = computed<WorkflowVersion>(() => { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return calculateLatestVersion(props.workflow.versions)!; +}); +const gitIcon = computed<string>(() => + determineGitIcon(props.workflow.repository_url), +); + +const showIcon = computed<boolean>( + () => latestVersion.value.icon_url != undefined, +); + +// Functions +// ============================================================================= +function modalClosed() { + formState.validated = false; + formState.missingFiles = []; + formState.allowUpload = false; + workflowGitCommitHashElement.value?.setCustomValidity(""); +} + +function checkVersionValidity() { + if (valid(workflowUpdate.version) == null) { + workflowVersionElement.value?.setCustomValidity( + "Please use semantic versioning", + ); + } else if (lte(workflowUpdate.version, latestVersion.value.version)) { + workflowVersionElement.value?.setCustomValidity( + "The new version must be greater than previous version", + ); + } else { + workflowVersionElement.value?.setCustomValidity(""); + } +} + +function checkRepository() { + formState.validated = true; + workflowGitCommitHashElement.value?.setCustomValidity(""); + if (workflowUpdateForm.value?.checkValidity() && !formState.allowUpload) { + formState.missingFiles = []; + const repo = GitRepository.buildRepository( + props.workflow.repository_url, + workflowUpdate.git_commit_hash, + formState.workflowToken, + ); + const oldModes = + (latestVersion.value.modes ?? []) + .filter((mode_id) => !workflowModes.deleteModes.includes(mode_id)) // filter all old modes that should be deleted + .map((mode_id) => workflowRepository.modeMapping[mode_id]) // map mode id to mode object + .filter((mode) => mode != undefined) ?? []; // filter all mode objects that are undefined + const newModes = formState.modesEnabled ? workflowModes.addModes : []; + repo + .checkFilesExist( + requiredRepositoryFiles([...oldModes, ...newModes]), + true, + ) + .then(() => { + formState.allowUpload = true; + }) + .catch((e: Error) => { + formState.missingFiles = e.message.split(","); + workflowGitCommitHashElement.value?.setCustomValidity( + "Files are missing in the repository", + ); + }); + } +} + +function resetForm() { + modalClosed(); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + workflowIconElement.value!.src = latestVersion.value.icon_url ?? ""; + workflowUpdate.version = ""; + workflowUpdate.git_commit_hash = ""; + workflowUpdate.delete_modes = []; + workflowUpdate.append_modes = []; + workflowModes.addModes = []; + workflowModes.deleteModes = []; + if (workflowIconInputElement.value != undefined) { + workflowIconInputElement.value.value = ""; + } +} + +function updateWorkflow() { + formState.validated = true; + workflowUpdate.version = workflowUpdate.version.trim(); + if (workflowUpdateForm.value?.checkValidity() && formState.allowUpload) { + formState.loading = true; + workflowGitCommitHashElement.value?.setCustomValidity(""); + if (formState.modesEnabled) { + workflowUpdate.append_modes = workflowModes.addModes.map((mode) => { + return { + schema_path: mode.schema_path, + entrypoint: mode.entrypoint, + name: mode.name, + } as WorkflowModeIn; + }); + workflowUpdate.delete_modes = workflowModes.deleteModes; + } + workflowRepository + .updateWorkflow(props.workflow.workflow_id, workflowUpdate) + .then(() => { + successToast?.show(); + updateWorkflowModal?.hide(); + resetForm(); + }) + .catch((error: ApiError) => { + const errorText = error.body["detail"]; + if (errorText.startsWith("Workflow with git_commit_hash")) { + workflowGitCommitHashElement.value?.setCustomValidity( + "Git commit is already used by a workflow", + ); + } + workflowUpdate.delete_modes = []; + workflowUpdate.append_modes = []; + }) + .finally(() => { + formState.loading = false; + }); + } +} + +function addMode() { + workflowModes.addModes.push({ + mode_id: crypto.randomUUID(), + name: "", + schema_path: "", + entrypoint: "", + }); + formState.allowUpload = false; +} + +function addOldMode(mode_id: string) { + if ( + (latestVersion.value.modes?.length ?? 0) + + workflowModes.addModes.length - + workflowModes.deleteModes.length < + 10 + ) { + workflowModes.deleteModes = workflowModes.deleteModes.filter( + (mode) => mode != mode_id, + ); + formState.allowUpload = false; + } +} + +function removeNewMode(mode_id: string) { + if ( + (latestVersion.value.modes?.length ?? 0) + workflowModes.addModes.length > + 1 + ) { + workflowModes.addModes = workflowModes.addModes.filter( + (mode) => mode.mode_id != mode_id, + ); + formState.allowUpload = false; + } +} + +function removeOldMode(mode_id: string) { + workflowModes.deleteModes.push(mode_id); + formState.allowUpload = false; +} + +// Lifecycle Events +// ============================================================================= +onMounted(() => { + updateWorkflowModal = new Modal("#" + props.modalID); + successToast = new Toast("#successToast-" + randomIDSuffix); + workflowModesCollapse = new Collapse("#updateWorkflowModesCollapse", { + toggle: false, + }); +}); +</script> + +<template> + <div class="toast-container position-fixed top-toast end-0 p-3"> + <div + role="alert" + aria-live="assertive" + aria-atomic="true" + class="toast text-bg-success align-items-center border-0" + data-bs-autohide="true" + :id="'successToast-' + randomIDSuffix" + > + <div class="d-flex"> + <div class="toast-body">Successfully updated Workflow</div> + <button + type="button" + class="btn-close btn-close-white me-2 m-auto" + data-bs-dismiss="toast" + aria-label="Close" + ></button> + </div> + </div> + </div> + <bootstrap-modal + :modalID="modalID" + :static-backdrop="true" + modal-label="Update Workflow Modal" + v-on="{ 'hidden.bs.modal': modalClosed }" + > + <template v-slot:header> + Update Workflow + <span class="fw-bold">{{ props.workflow.name }}</span> + </template> + <template v-slot:body> + <form + id="workflowUpdateForm" + :class="{ 'was-validated': formState.validated }" + ref="workflowUpdateForm" + > + <div class="mb-3"> + <span class="me-3">Git Repository URL:</span> + <font-awesome-icon :icon="gitIcon" /> + <a + class="ms-2" + :href="props.workflow.repository_url" + target="_blank" + >{{ props.workflow.repository_url }}</a + > + <font-awesome-icon + v-if="props.workflow.private" + class="ms-2" + icon="fa-solid fa-lock" + /> + <img + :src="latestVersion.icon_url ?? undefined" + ref="workflowIconElement" + class="float-end" + :hidden="!showIcon" + alt="Workflow Icon" + /> + </div> + <div class="row mb-3"> + <div class="col-8"> + <label for="updateWorkflowGitCommitInput" class="form-label" + >Git Commit Hash</label + > + <div class="input-group"> + <div class="input-group-text"> + <font-awesome-icon icon="fa-solid fa-code-commit" /> + </div> + <input + type="text" + class="form-control text-lowercase" + id="updateWorkflowGitCommitInput" + placeholder="ba8bcd9..." + required + ref="workflowGitCommitHashElement" + maxlength="40" + pattern="[0-9a-f]{40}" + v-model="workflowUpdate.git_commit_hash" + @change="formState.allowUpload = false" + /> + </div> + <div v-if="formState.missingFiles.length > 0" class="text-danger"> + The following files are missing in the repository + <ul> + <li v-for="file in formState.missingFiles" :key="file"> + {{ file }} + </li> + </ul> + </div> + </div> + <div class="col-4"> + <label for="updateWorkflowVersionInput" class="form-label" + >Version</label + > + <div class="input-group"> + <div class="input-group-text"> + <font-awesome-icon icon="fa-solid fa-tag" /> + </div> + <input + type="text" + class="form-control" + id="updateWorkflowVersionInput" + :placeholder="inc(latestVersion.version, 'patch') ?? undefined" + maxlength="10" + required + ref="workflowVersionElement" + @change="checkVersionValidity" + v-model="workflowUpdate.version" + aria-describedby="updateVersionHelp" + /> + </div> + <div id="updateVersionHelp" class="form-text"> + Previous Version: {{ latestVersion.version }} + </div> + </div> + </div> + <div class="mb-3"> + <div class="form-check fs-5"> + <input + class="form-check-input" + type="checkbox" + v-model="formState.modesEnabled" + id="updateWorkflowModesCheckbox" + @change="formState.allowUpload = false" + aria-controls="#updateWorkflowModesCollapse" + :disabled="latestVersion.modes && latestVersion.modes.length > 0" + /> + <label class="form-check-label" for="updateWorkflowModesCheckbox"> + Enable Workflow Modes + </label> + <button + v-if="formState.modesEnabled" + class="btn btn-primary float-end" + @click="addMode" + :disabled=" + (latestVersion.modes?.length ?? 0) + + workflowModes.addModes.length - + workflowModes.deleteModes.length >= + 10 + " + > + Add Mode + </button> + </div> + </div> + <div class="collapse" id="updateWorkflowModesCollapse"> + <WorkflowModeTransitionGroup> + <div + v-for="(mode_id, index) in latestVersion.modes" + :key="mode_id" + class="row mb-3" + > + <template v-if="workflowRepository.modeMapping[mode_id]"> + <h6> + <font-awesome-icon + v-if="workflowModes.deleteModes.includes(mode_id)" + icon="fa-solid fa-plus" + class="text-success me-1 fs-6 cursor-pointer" + @click="addOldMode(mode_id)" + /> + <font-awesome-icon + v-else + icon="fa-solid fa-minus" + class="text-danger me-1 fs-6 cursor-pointer" + @click="removeOldMode(mode_id)" + /> + <span + :class="{ + 'opacity-75': workflowModes.deleteModes.includes(mode_id), + }" + >Previous Mode {{ index + 1 }}</span + > + </h6> + <div class="col-6"> + <label + :for="'modeNameInput-' + mode_id" + class="form-label" + :class="{ + 'opacity-75': workflowModes.deleteModes.includes(mode_id), + }" + >Name</label + > + <div class="input-group"> + <div class="input-group-text"> + <font-awesome-icon icon="fa-solid fa-tag" /> + </div> + <input + type="text" + class="form-control" + :id="'modeNameInput-' + mode_id" + maxlength="128" + readonly + :disabled="workflowModes.deleteModes.includes(mode_id)" + :value="workflowRepository.modeMapping[mode_id].name" + :required=" + formState.modesEnabled && + !workflowModes.deleteModes.includes(mode_id) + " + /> + </div> + </div> + <div class="col-6 mb-2"> + <label + :for="'modeEntryInput-' + mode_id" + class="form-label" + :class="{ + 'opacity-75': workflowModes.deleteModes.includes(mode_id), + }" + >Entrypoint</label + > + <div class="input-group"> + <div class="input-group-text"> + <font-awesome-icon icon="fa-solid fa-turn-down" /> + </div> + <input + type="text" + class="form-control" + :id="'modeEntryInput-' + mode_id" + readonly + :disabled="workflowModes.deleteModes.includes(mode_id)" + :value=" + workflowRepository.modeMapping[mode_id].entrypoint + " + :required=" + formState.modesEnabled && + !workflowModes.deleteModes.includes(mode_id) + " + /> + </div> + </div> + <label + :for="'modeSchemaInput-' + index" + class="form-label" + :class="{ + 'opacity-75': workflowModes.deleteModes.includes(mode_id), + }" + >Schema File</label + > + <div class="input-group"> + <div class="input-group-text"> + <font-awesome-icon icon="fa-solid fa-file-code" /> + </div> + <input + type="text" + class="form-control" + :id="'modeSchemaInput-' + mode_id" + readonly + :disabled="workflowModes.deleteModes.includes(mode_id)" + :value="workflowRepository.modeMapping[mode_id].schema_path" + :required=" + formState.modesEnabled && + !workflowModes.deleteModes.includes(mode_id) + " + /> + </div> + </template> + </div> + + <div + v-for="(mode, index) in workflowModes.addModes" + :key="mode.mode_id" + class="row mb-3" + > + <h6> + <font-awesome-icon + icon="fa-solid fa-minus" + class="text-danger me-1 fs-6 cursor-pointer" + @click="removeNewMode(mode.mode_id)" + /> + New Mode {{ (latestVersion.modes?.length ?? 0) + index + 1 }} + </h6> + <div class="col-6"> + <label :for="'modeNameInput-' + index" class="form-label" + >Name</label + > + <div class="input-group"> + <div class="input-group-text"> + <font-awesome-icon icon="fa-solid fa-tag" /> + </div> + <input + type="text" + class="form-control" + :id="'modeNameInput-' + index" + maxlength="128" + v-model="mode.name" + :required="formState.modesEnabled" + /> + </div> + </div> + <div class="col-6 mb-2"> + <label :for="'modeEntryInput-' + index" class="form-label" + >Entrypoint</label + > + <div class="input-group"> + <div class="input-group-text"> + <font-awesome-icon icon="fa-solid fa-turn-down" /> + </div> + <input + type="text" + class="form-control" + :id="'modeEntryInput-' + index" + maxlength="128" + v-model="mode.entrypoint" + :required="formState.modesEnabled" + /> + </div> + </div> + <label :for="'modeSchemaInput-' + index" class="form-label" + >Schema File</label + > + <div class="input-group"> + <div class="input-group-text"> + <font-awesome-icon icon="fa-solid fa-file-code" /> + </div> + <input + type="text" + class="form-control" + :id="'modeSchemaInput-' + index" + maxlength="128" + pattern=".*\.json$" + v-model="mode.schema_path" + @change="formState.allowUpload = false" + :required="formState.modesEnabled" + /> + </div> + </div> + </WorkflowModeTransitionGroup> + </div> + </form> + </template> + <template v-slot:footer> + <button + type="button" + class="btn btn-info me-auto" + @click="checkRepository" + :disabled="formState.allowUpload || formState.loadCredentials" + > + <span + v-if="formState.checkRepoLoading" + class="spinner-border spinner-border-sm" + role="status" + aria-hidden="true" + ></span> + Check Repository + </button> + <button type="button" class="btn btn-secondary" data-bs-dismiss="modal"> + Close + </button> + <button + type="submit" + form="workflowUpdateForm" + class="btn btn-primary" + :disabled="formState.loading || !formState.allowUpload" + @click.prevent="updateWorkflow" + > + <span + v-if="formState.loading" + class="spinner-border spinner-border-sm" + role="status" + aria-hidden="true" + ></span> + Save + </button> + </template> + </bootstrap-modal> +</template> + +<style scoped> +img { + max-height: 32px; + max-width: 32px; +} +</style> diff --git a/src/components/workflows/modals/UpdateWorkflowVersionIconModal.vue b/src/components/workflows/modals/UpdateWorkflowVersionIconModal.vue new file mode 100644 index 0000000000000000000000000000000000000000..ef529298b5b71f8f3fdb059a7d05801201b1c7a1 --- /dev/null +++ b/src/components/workflows/modals/UpdateWorkflowVersionIconModal.vue @@ -0,0 +1,253 @@ +<script setup lang="ts"> +import BootstrapModal from "@/components/modals/BootstrapModal.vue"; +import type { WorkflowVersion } from "@/client/workflow"; +import { onMounted, ref, reactive, computed } from "vue"; +import { Modal, Toast } from "bootstrap"; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import DeleteModal from "@/components/modals/DeleteModal.vue"; +import { useWorkflowStore } from "@/stores/workflows"; + +const workflowRepository = useWorkflowStore(); +// Constants +// ============================================================================= +const randomIDSuffix = Math.random().toString(16).substring(2, 8); + +// Bootstrap Elements +// ============================================================================= +let updateIconModal: Modal | null = null; +let successToast: Toast | null = null; + +// Form Elements +// ============================================================================= +const iconUpdateForm = ref<HTMLFormElement | undefined>(undefined); +const iconElement = ref<HTMLImageElement | undefined>(undefined); +const iconInputElement = ref<HTMLInputElement | undefined>(undefined); + +// Props +// ============================================================================= +const props = defineProps<{ + modalID: string; + version: WorkflowVersion; + workflowName?: string; +}>(); + +// Reactive State +// ============================================================================= +const iconUpdate = reactive<{ + icon: Blob | null; +}>({ + icon: null, +}); + +const formState = reactive<{ + loading: boolean; + validated: boolean; + uploadIcon: boolean; +}>({ + loading: false, + validated: false, + uploadIcon: true, +}); + +// Computed Properties +// ============================================================================= +const showIcon = computed<boolean>( + () => props.version.icon_url != undefined || iconUpdate.icon != undefined, +); + +// Functions +// ============================================================================= +function resetForm() { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + iconElement.value!.src = props.version.icon_url ?? ""; + if (iconInputElement.value != undefined) { + iconInputElement.value.value = ""; + } +} + +function modalClosed() { + formState.validated = false; + resetForm(); +} + +function iconChanged() { + iconUpdate.icon = iconInputElement.value?.files?.[0].slice() ?? null; + if (iconUpdate.icon != null) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + iconElement.value!.src = URL.createObjectURL(iconUpdate.icon.slice()); + } else { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + iconElement.value!.src = props.version.icon_url ?? ""; + } +} + +function updateIcon() { + formState.validated = true; + if (iconUpdateForm.value?.checkValidity() && iconUpdate.icon != null) { + formState.loading = true; + workflowRepository + .updateVersionIcon( + props.version.workflow_id, + props.version.git_commit_hash, + { + icon: iconUpdate.icon, + }, + ) + .then(() => { + formState.uploadIcon = true; + successToast?.show(); + updateIconModal?.hide(); + }) + .catch((error) => { + console.error(error); + }) + .finally(() => { + formState.loading = false; + }); + } +} + +function deleteIcon() { + formState.loading = true; + workflowRepository + .deleteVersionIcon(props.version.workflow_id, props.version.git_commit_hash) + .then(() => { + formState.uploadIcon = false; + successToast?.show(); + updateIconModal?.hide(); + }) + .catch((error) => { + console.error(error); + }) + .finally(() => { + formState.loading = false; + }); +} + +// Lifecycle Events +// ============================================================================= +onMounted(() => { + updateIconModal = new Modal("#" + props.modalID); + successToast = new Toast("#successToast-" + randomIDSuffix); +}); +</script> + +<template> + <DeleteModal + v-if="props.version.icon_url" + :modalID="'delete-icon-modal' + randomIDSuffix" + :object-name-delete="'icon for workflow ' + props.workflowName" + :back-modal-id="modalID" + @confirm-delete="deleteIcon()" + /> + <div class="toast-container position-fixed top-toast end-0 p-3"> + <div + role="alert" + aria-live="assertive" + aria-atomic="true" + class="toast text-bg-success align-items-center border-0" + data-bs-autohide="true" + :id="'successToast-' + randomIDSuffix" + > + <div class="d-flex"> + <div v-if="formState.uploadIcon" class="toast-body"> + Successfully uploaded icon + </div> + <div v-else class="toast-body">Successfully deleted icon</div> + <button + type="button" + class="btn-close btn-close-white me-2 m-auto" + data-bs-dismiss="toast" + aria-label="Close" + ></button> + </div> + </div> + </div> + <bootstrap-modal + :modalID="modalID" + :static-backdrop="true" + modal-label="Update Workflow Version IconModal" + v-on="{ 'hidden.bs.modal': modalClosed }" + > + <template v-slot:header> + Update Icon Workflow + <span class="fw-bold" + >{{ props.workflowName }}@{{ props.version.version }}</span + > + </template> + <template v-slot:extra-button v-if="props.version.icon_url"> + <button + class="btn delete-icon" + data-bs-toggle="modal" + :data-bs-target="'#delete-icon-modal' + randomIDSuffix" + > + <font-awesome-icon icon="fa-solid fa-trash" /> + </button> + </template> + <template v-slot:body> + <form + ref="iconUpdateForm" + id="iconUpdateForm" + :class="{ 'was-validated': formState.validated }" + > + <div class="row"> + <div class="col-10"> + <label for="workflowIconInput" class="form-label">New Icon</label> + <input + type="file" + ref="iconInputElement" + accept="image/*" + class="form-control" + id="workflowIconInput" + @change="iconChanged" + aria-describedby="iconHelp" + required + /> + </div> + <div class="col-2"> + <img + :src="props.version.icon_url ?? undefined" + ref="iconElement" + :hidden="!showIcon" + /> + </div> + </div> + </form> + </template> + <template v-slot:footer> + <button type="button" class="btn btn-secondary" data-bs-dismiss="modal"> + Close + </button> + <button + type="submit" + form="iconUpdateForm" + class="btn btn-primary" + :disabled="formState.loading" + @click.prevent="updateIcon" + > + <span + v-if="formState.loading" + class="spinner-border spinner-border-sm" + role="status" + aria-hidden="true" + ></span> + Save + </button> + </template> + </bootstrap-modal> +</template> + +<style scoped> +img { + max-height: 64px; + max-width: 64px; +} + +.delete-icon { + color: var(--bs-secondary) !important; +} + +.delete-icon:hover { + color: var(--bs-danger) !important; +} +</style> diff --git a/src/environment.ts b/src/environment.ts new file mode 100644 index 0000000000000000000000000000000000000000..cb756b7e77d18de3fe8208de0e8670b87e123a66 --- /dev/null +++ b/src/environment.ts @@ -0,0 +1,18 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-ignore +const windowEnv: Record<string, string> = window["env"]; +export const environment: env = { + S3_URL: windowEnv["s3Url"], + S3PROXY_API_BASE_URL: windowEnv["s3proxyApiUrl"], + AUTH_API_BASE_URL: windowEnv["authApiUrl"], + WORKFLOW_API_BASE_URL: windowEnv["workflowApiUrl"], + DEV_SYSTEM: windowEnv["devSystem"].toLowerCase() === "true", +}; + +type env = { + S3_URL: string; + S3PROXY_API_BASE_URL: string; + AUTH_API_BASE_URL: string; + WORKFLOW_API_BASE_URL: string; + DEV_SYSTEM: boolean; +}; diff --git a/src/main.ts b/src/main.ts index 91485f9e4fffb5aaa11190db62f295f3c9a2d0e5..ca92ccf7aa938bbb83a06bd93767a5ab4c2cd442 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3,17 +3,38 @@ import { createPinia } from "pinia"; import App from "./App.vue"; import router from "./router"; +import { Chart, Colors } from "chart.js"; +import zoomPlugin from "chartjs-plugin-zoom"; + +Chart.register(zoomPlugin, Colors); import dayjs from "dayjs"; import relativeTime from "dayjs/plugin/relativeTime"; // import plugin +import isSameOrBefore from "dayjs/plugin/isSameOrBefore"; import "dayjs/locale/en-gb"; +import utc from "dayjs/plugin/utc"; +import timezone from "dayjs/plugin/timezone"; dayjs.extend(relativeTime); // use plugin +dayjs.extend(isSameOrBefore); +dayjs.extend(utc); +dayjs.extend(timezone); +dayjs.tz.setDefault(dayjs.tz.guess()); import "bootstrap/dist/css/bootstrap.css"; +import "@fortawesome/fontawesome-free/css/fontawesome.css"; +import "@fortawesome/fontawesome-free/css/solid.css"; +import "@fortawesome/fontawesome-free/css/brands.css"; import "./assets/main.css"; +import { globalCookiesConfig } from "vue3-cookies"; + +globalCookiesConfig({ + expireTimes: "8d", + domain: window.location.hostname, +}); + const app = createApp(App); app.use(createPinia()); diff --git a/src/router/index.ts b/src/router/index.ts index 187869497a62e4bb8ff84338708d2beca0711ef2..3f43bacab4caa4623ac235782926875e579273c3 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -14,11 +14,14 @@ const router = createRouter({ path: "object-storage/buckets", name: "buckets", component: () => import("../views/object-storage/BucketsView.vue"), + props: (route) => ({ + bucketName: route.params.bucketName ?? undefined, + }), children: [ { path: ":bucketName/:subFolders*", name: "bucket", - component: () => import("../components/BucketView.vue"), + component: () => import("../views/object-storage/BucketView.vue"), props: true, }, ], @@ -28,6 +31,81 @@ const router = createRouter({ name: "s3_keys", component: () => import("../views/object-storage/S3KeysView.vue"), }, + { + path: "workflow-executions", + name: "workflow-executions", + component: () => + import("../views/workflows/ListWorkflowExecutionsView.vue"), + }, + { + path: "workflows", + name: "workflows", + component: () => import("../views/workflows/ListWorkflowsView.vue"), + }, + { + path: "developer/workflows", + name: "workflows-developer", + component: () => import("../views/workflows/MyWorkflowsView.vue"), + meta: { + requiresDeveloperRole: true, + }, + }, + { + path: "reviewer/workflows", + name: "workflows-reviewer", + component: () => import("../views/workflows/ReviewWorkflowsView.vue"), + meta: { + requiresReviewerRole: true, + }, + }, + { + path: "workflows/arbitrary", + name: "arbitrary-workflow", + component: () => + import("../views/workflows/ArbitraryWorkflowView.vue"), + meta: { + requiresDeveloperRole: true, + }, + props: (route) => ({ + wid: route.query.wid, + }), + }, + { + path: "workflows/:workflowId", + name: "workflow", + component: () => import("../views/workflows/WorkflowView.vue"), + props: (route) => ({ + versionId: route.params.versionId ?? undefined, + workflowId: route.params.workflowId, + workflowModeId: route.query.workflowModeId ?? undefined, + developerView: route.query.developerView == "true" ?? false, + }), + children: [ + { + path: "version/:versionId", + name: "workflow-version", + component: () => + import("../views/workflows/WorkflowVersionView.vue"), + props: (route) => ({ + versionId: route.params.versionId, + workflowId: route.params.workflowId, + activeTab: route.query.tab ?? "description", + workflowModeId: route.query.workflowModeId ?? undefined, + }), + }, + { + path: "version/:versionId/start", + name: "workflow-start", + component: () => + import("../views/workflows/StartWorkflowView.vue"), + props: (route) => ({ + versionId: route.params.versionId, + workflowId: route.params.workflowId, + workflowModeId: route.query.workflowModeId ?? undefined, + }), + }, + ], + }, ], }, { @@ -37,7 +115,9 @@ const router = createRouter({ }, { path: "/", - redirect: { name: "buckets" }, + redirect: { + name: "buckets", + }, }, { path: "/:pathMatch(.*)", @@ -45,5 +125,4 @@ const router = createRouter({ }, ], }); - export default router; diff --git a/src/stores/auth.ts b/src/stores/auth.ts deleted file mode 100644 index debb687a59e17b6bd62db1ad2c1581c42b77e9c3..0000000000000000000000000000000000000000 --- a/src/stores/auth.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { defineStore } from "pinia"; -import type { S3Key, User } from "@/client"; -import { KeyService, UserService } from "@/client"; -import { OpenAPI } from "@/client"; - -export type RootState = { - token: string | null; - user: User | null; - s3key: S3Key | null; -}; - -export const useAuthStore = defineStore({ - id: "auth", - state: () => - ({ - token: null, - user: null, - s3key: null, - } as RootState), - getters: { - authenticated: (state) => state.token != null, - }, - actions: { - setToken(token: string | null) { - if (token != null) { - OpenAPI.TOKEN = token; - this.token = token; - UserService.userGetLoggedInUser() - .then((user) => { - this.updateUser(user); - }) - .catch(() => { - this.token = null; - }); - } else { - this.token = null; - this.user = null; - } - }, - setS3Key(key: S3Key | null) { - this.s3key = key; - }, - updateUser(user: User) { - this.user = user; - KeyService.keyGetUserKeys(user.uid) - .then((keys) => { - if (keys.length > 0) { - this.setS3Key(keys[0]); - } else { - this.setS3Key(null); - } - }) - .catch(() => { - this.setS3Key(null); - }); - }, - logout() { - this.setToken(null); - }, - }, -}); diff --git a/src/stores/buckets.ts b/src/stores/buckets.ts new file mode 100644 index 0000000000000000000000000000000000000000..7bc17d501ac3fe7bc471846f1266d5b3bdb249a6 --- /dev/null +++ b/src/stores/buckets.ts @@ -0,0 +1,271 @@ +import { defineStore } from "pinia"; +import { + BucketPermissionService, + BucketService, + Constraint, + Permission, +} from "@/client/s3proxy"; +import type { + BucketOut, + BucketIn, + BucketPermissionOut, + BucketPermissionIn, + BucketPermissionParameters, +} from "@/client/s3proxy"; +import { useAuthStore } from "@/stores/users"; + +export const useBucketStore = defineStore({ + id: "buckets", + state: () => + ({ + bucketMapping: {}, + ownPermissions: {}, + bucketPermissionsMapping: {}, + }) as { + bucketMapping: Record<string, BucketOut>; + ownPermissions: Record<string, BucketPermissionOut>; + bucketPermissionsMapping: Record<string, BucketPermissionOut[]>; + }, + getters: { + buckets(): BucketOut[] { + const tempList = Object.values(this.bucketMapping); + tempList.sort((bucketA, bucketB) => { + if (bucketA.owner_constraint) { + return -1; + } + if (bucketB.owner_constraint) { + return 1; + } + return bucketA.name > bucketB.name ? 1 : -1; + }); + return tempList; + }, + ownBucketsAndFullPermissions(): string[] { + const authStore = useAuthStore(); + const names = this.buckets + .filter((bucket) => bucket.owner === authStore.currentUID) + .map((bucket) => bucket.name) + .concat( + Object.values(this.ownPermissions) + .filter((perm) => perm.permission === Permission.READWRITE) + .map((perm) => perm.bucket_name), + ); + names.sort(); + return names; + }, + getBucketPermissions(): (bucketName: string) => BucketPermissionOut[] { + return (bucketName) => this.bucketPermissionsMapping[bucketName] ?? []; + }, + permissionFeatureAllowed(): (bucketName: string) => boolean { + return (bucketName) => { + // If a permission for the bucket exist, then false + if (this.ownPermissions[bucketName] != undefined) { + return false; + } + // If the bucket doesn't exist, then false + if (this.bucketMapping[bucketName] == undefined) { + return false; + } + // If there is a constraint on the bucket, then false otherwise true + return this.bucketMapping[bucketName].owner_constraint == null; + }; + }, + writableBuckets(): BucketOut[] { + return this.buckets.filter((bucket) => { + if (this.ownPermissions[bucket.name] != undefined) { + return this.ownPermissions[bucket.name].permission !== "READ"; + } + // If the user owns the bucket, check the bucket constraint + return ( + bucket.owner_constraint == null || + bucket.owner_constraint == Constraint.WRITE + ); + }); + }, + writableBucket(): (bucketName: string) => boolean { + return (bucketName) => { + // If this is a foreign bucket, check that the user has write permission + if (this.ownPermissions[bucketName] != undefined) { + return this.ownPermissions[bucketName].permission !== "READ"; + } + // If the user owns the bucket, check the bucket constraint + if (this.bucketMapping[bucketName] != undefined) { + return ( + this.bucketMapping[bucketName].owner_constraint == null || + this.bucketMapping[bucketName].owner_constraint == Constraint.WRITE + ); + } + return false; + }; + }, + readableBucket(): (bucketName: string) => boolean { + return (bucketName) => { + // If this is a foreign bucket, check that the user has read permission + if (this.ownPermissions[bucketName] != undefined) { + return this.ownPermissions[bucketName].permission !== "WRITE"; + } + // If the user owns the bucket, check the bucket constraint + if (this.bucketMapping[bucketName] != null) { + return ( + this.bucketMapping[bucketName].owner_constraint == null || + this.bucketMapping[bucketName].owner_constraint == Constraint.READ + ); + } + return false; + }; + }, + }, + actions: { + fetchOwnPermissions( + onFinally?: () => void, + ): Promise<BucketPermissionOut[]> { + const authStore = useAuthStore(); + if (Object.keys(this.ownPermissions).length > 0) { + onFinally?.(); + } + return BucketPermissionService.bucketPermissionListPermissionsPerUser( + authStore.currentUID, + ) + .then((permissions) => { + const new_permissions: Record<string, BucketPermissionOut> = {}; + for (const perm of permissions) { + new_permissions[perm.bucket_name] = perm; + } + this.ownPermissions = new_permissions; + return permissions; + }) + .finally(onFinally); + }, + deleteOwnPermission(bucketName: string) { + delete this.ownPermissions[bucketName]; + delete this.bucketMapping[bucketName]; + }, + fetchBuckets(onFinally?: () => void): Promise<BucketOut[]> { + if (this.buckets.length > 0) { + onFinally?.(); + } + const userStore = useAuthStore(); + return BucketService.bucketListBuckets(userStore.currentUID) + .then((buckets) => { + for (const bucket of buckets) { + this.bucketMapping[bucket.name] = bucket; + } + const userRepository = useAuthStore(); + userRepository.fetchUsernames( + buckets + .map((bucket) => bucket.owner) + .filter((owner) => owner != userRepository.currentUID), + ); + return buckets; + }) + .finally(onFinally); + }, + fetchBucket( + bucketName: string, + onFinally?: () => void, + ): Promise<BucketOut> { + if (this.bucketMapping[bucketName] != undefined) { + onFinally?.(); + } + return BucketService.bucketGetBucket(bucketName) + .then((bucket) => { + this.bucketMapping[bucket.name] = bucket; + return bucket; + }) + .finally(onFinally); + }, + deleteBucket(bucketName: string): Promise<void> { + return BucketService.bucketDeleteBucket(bucketName, true).then(() => { + delete this.bucketMapping[bucketName]; + }); + }, + createBucket(bucket: BucketIn): Promise<BucketOut> { + return BucketService.bucketCreateBucket(bucket).then((createdBucket) => { + this.bucketMapping[createdBucket.name] = createdBucket; + return createdBucket; + }); + }, + fetchBucketPermissions( + bucketName: string, + onFinally?: () => void, + ): Promise<BucketPermissionOut[]> { + const authStore = useAuthStore(); + if (authStore.foreignUser) { + return Promise.resolve([]).finally(onFinally); + } + if (this.bucketPermissionsMapping[bucketName] != undefined) { + onFinally?.(); + } + return BucketPermissionService.bucketPermissionListPermissionsPerBucket( + bucketName, + ) + .then((permissions) => { + this.bucketPermissionsMapping[bucketName] = permissions; + return permissions; + }) + .finally(onFinally); + }, + deleteBucketPermission(bucketName: string, uid: string): Promise<void> { + return BucketPermissionService.bucketPermissionDeletePermission( + bucketName, + uid, + ).then(() => { + const userRepository = useAuthStore(); + if (uid == userRepository.currentUID) { + this.deleteOwnPermission(bucketName); + } + if (this.bucketPermissionsMapping[bucketName] == undefined) { + this.fetchBucketPermissions(bucketName); + } else { + this.bucketPermissionsMapping[bucketName] = + this.bucketPermissionsMapping[bucketName].filter( + (permission) => permission.uid != uid, + ); + } + }); + }, + createBucketPermission( + permissionIn: BucketPermissionIn, + ): Promise<BucketPermissionOut> { + return BucketPermissionService.bucketPermissionCreatePermission( + permissionIn, + ).then((permission) => { + if ( + this.bucketPermissionsMapping[permission.bucket_name] == undefined + ) { + this.fetchBucketPermissions(permission.bucket_name); + } else { + this.bucketPermissionsMapping[permission.bucket_name].push( + permission, + ); + } + return permission; + }); + }, + updateBucketPermission( + bucketName: string, + uid: string, + permissionParams: BucketPermissionParameters, + ): Promise<BucketPermissionOut> { + return BucketPermissionService.bucketPermissionUpdatePermission( + bucketName, + uid, + permissionParams, + ).then((permissionOut) => { + if (this.bucketPermissionsMapping[bucketName] == undefined) { + this.fetchBucketPermissions(bucketName); + } else { + const index = this.bucketPermissionsMapping[bucketName].findIndex( + (permission) => (permission.uid = uid), + ); + if (index > -1) { + this.bucketPermissionsMapping[bucketName][index] = permissionOut; + } else { + this.bucketPermissionsMapping[bucketName].push(permissionOut); + } + } + return permissionOut; + }); + }, + }, +}); diff --git a/src/stores/s3keys.ts b/src/stores/s3keys.ts new file mode 100644 index 0000000000000000000000000000000000000000..915426f43a5128a7912be1ce316397d144c1a70b --- /dev/null +++ b/src/stores/s3keys.ts @@ -0,0 +1,63 @@ +import { defineStore } from "pinia"; +import { useAuthStore } from "@/stores/users"; +import type { S3Key } from "@/client/s3proxy"; +import { S3KeyService } from "@/client/s3proxy"; +import { useS3ObjectStore } from "@/stores/s3objects"; + +export const useS3KeyStore = defineStore({ + id: "s3keys", + state: () => + ({ + keyMapping: {}, + }) as { + keyMapping: Record<string, S3Key>; + }, + getters: { + keys(): S3Key[] { + const tempList = Object.values(this.keyMapping); + tempList.sort((keyA, keyB) => + keyA.access_key > keyB.access_key ? 1 : -1, + ); + return tempList; + }, + }, + actions: { + fetchS3Keys(onFinally?: () => void): Promise<S3Key[]> { + if (this.keys.length > 0) { + onFinally?.(); + } + return S3KeyService.s3KeyGetUserKeys(useAuthStore().currentUID) + .then((keys) => { + const s3ObjectRepository = useS3ObjectStore(); + s3ObjectRepository.updateS3Client(keys[0]); + const newMapping: Record<string, S3Key> = {}; + for (const key of keys) { + newMapping[key.access_key] = key; + } + this.keyMapping = newMapping; + return keys; + }) + .finally(onFinally); + }, + deleteS3Key(access_id: string): Promise<void> { + const userRepository = useAuthStore(); + return S3KeyService.s3KeyDeleteUserKey( + access_id, + userRepository.currentUID, + ).then(() => { + const s3ObjectRepository = useS3ObjectStore(); + delete this.keyMapping[access_id]; + s3ObjectRepository.updateS3Client(this.keys[0]); + }); + }, + createS3Key(): Promise<S3Key> { + const userRepository = useAuthStore(); + return S3KeyService.s3KeyCreateUserKey(userRepository.currentUID).then( + (key) => { + this.keyMapping[key.access_key] = key; + return key; + }, + ); + }, + }, +}); diff --git a/src/stores/s3objects.ts b/src/stores/s3objects.ts new file mode 100644 index 0000000000000000000000000000000000000000..ab6889076b69551a521fb5476d810ce20df9fc01 --- /dev/null +++ b/src/stores/s3objects.ts @@ -0,0 +1,249 @@ +import { defineStore } from "pinia"; +import type { _Object as S3Object, HeadObjectOutput } from "@aws-sdk/client-s3"; +import { + CopyObjectCommand, + GetObjectCommand, + HeadObjectCommand, + PutObjectCommand, + S3Client, +} from "@aws-sdk/client-s3"; +import { + paginateListObjectsV2, + DeleteObjectCommand, + DeleteObjectsCommand, +} from "@aws-sdk/client-s3"; +import { environment } from "@/environment"; +import type { S3Key } from "@/client/s3proxy"; +import { useBucketStore } from "@/stores/buckets"; +import { getSignedUrl } from "@aws-sdk/s3-request-presigner"; +import dayjs from "dayjs"; +import { Upload } from "@aws-sdk/lib-storage"; +import type { Progress } from "@aws-sdk/lib-storage"; + +export const useS3ObjectStore = defineStore({ + id: "s3objects", + state: () => + ({ + objectMapping: {}, + objectMetaMapping: {}, + client: new S3Client({ + region: "us-east-1", + endpoint: environment.S3_URL, + forcePathStyle: true, + credentials: { + accessKeyId: "", + secretAccessKey: "", + }, + }), + }) as { + objectMapping: Record<string, S3Object[]>; + objectMetaMapping: Record<string, HeadObjectOutput>; + client: S3Client; + }, + getters: { + getPresignedUrl(): (bucketName: string, key: string) => Promise<string> { + return (bucketName, key) => { + const keySplit = key.split("/"); + const command = new GetObjectCommand({ + Bucket: bucketName, + Key: key, + ResponseContentDisposition: `attachment; filename=${ + keySplit[keySplit.length - 1] + }`, + }); + return getSignedUrl(this.client, command, { + expiresIn: 30, + }); + }; + }, + }, + actions: { + _pushObject(bucketName: string, newObj: S3Object) { + if (this.objectMapping[bucketName] == undefined) { + this.fetchS3Objects(bucketName); + } else { + const objIndex = this.objectMapping[bucketName].findIndex( + (obj) => obj.Key === newObj.Key, + ); + if (objIndex > -1) { + this.objectMapping[bucketName][objIndex] = newObj; + } else { + this.objectMapping[bucketName].push(newObj); + } + } + }, + updateS3Client(s3Key: S3Key) { + this.client = new S3Client({ + region: "us-east-1", + endpoint: environment.S3_URL, + forcePathStyle: true, + credentials: { + accessKeyId: s3Key.access_key, + secretAccessKey: s3Key.secret_key, + }, + }); + }, + async fetchS3Objects( + bucketName: string, + prefix?: string, + onFinally?: () => void, + ): Promise<S3Object[]> { + if (this.objectMapping[bucketName] != undefined) { + onFinally?.(); + } + const pag = paginateListObjectsV2( + { client: this.client }, + { Bucket: bucketName, Prefix: prefix }, + ); + const objs: S3Object[] = []; + try { + for await (const page of pag) { + objs.push(...(page.Contents ?? [])); + } + this.objectMapping[bucketName] = objs; + } finally { + onFinally?.(); + } + return objs; + }, + fetchS3ObjectMeta( + bucketName: string, + key: string, + onFinally?: () => void, + ): Promise<HeadObjectOutput> { + const identifier = bucketName + "/" + key; + if (this.objectMetaMapping[identifier]) { + onFinally?.(); + } + const command = new HeadObjectCommand({ + Bucket: bucketName, + Key: key, + }); + return this.client + .send(command) + .then((resp) => { + this.objectMetaMapping[identifier] = resp; + return resp; + }) + .finally(onFinally); + }, + deleteObject(bucketName: string, key: string): Promise<void> { + const command = new DeleteObjectCommand({ + Bucket: bucketName, + Key: key, + }); + return this.client + .send(command) + .then(() => { + const bucketRepository = useBucketStore(); + bucketRepository.fetchBucket(bucketName); + if (this.objectMapping[bucketName] == undefined) { + this.fetchS3Objects(bucketName); + } else { + this.objectMapping[bucketName] = this.objectMapping[ + bucketName + ].filter((obj) => obj.Key !== key); + } + }) + .catch((err) => { + console.error(err); + }); + }, + deleteObjectsWithPrefix(bucketName: string, prefix: string): Promise<void> { + if (this.objectMapping[bucketName] == undefined) { + return Promise.resolve(); + } + const command = new DeleteObjectsCommand({ + Bucket: bucketName, + Delete: { + Objects: this.objectMapping[bucketName] + .filter((obj) => obj.Key?.startsWith(prefix)) + .map((obj) => { + return { Key: obj.Key }; + }), + }, + }); + return this.client.send(command).then(() => { + const bucketRepository = useBucketStore(); + bucketRepository.fetchBucket(bucketName); + if (this.objectMapping[bucketName] == undefined) { + this.fetchS3Objects(bucketName); + } else { + this.objectMapping[bucketName] = this.objectMapping[ + bucketName + ].filter((obj) => !obj.Key?.startsWith(prefix)); + } + }); + }, + copyObject( + srcBucket: string, + srcObject: S3Object, + destBucket: string, + destKey: string, + ): Promise<S3Object> { + if (srcObject.Key == undefined) { + return Promise.resolve({}); + } + const command = new CopyObjectCommand({ + Bucket: destBucket, + CopySource: encodeURI(`/${srcBucket}/${srcObject.Key}`), + Key: destKey, + }); + return this.client.send(command).then(() => { + const newObj = { + Key: destKey, + Size: srcObject.Size, + LastModified: dayjs().toDate(), + }; + this._pushObject(destBucket, newObj); + return newObj; + }); + }, + async uploadObjectFile( + bucketName: string, + key: string, + file: File, + onProgress?: (progress: Progress) => void, + ): Promise<S3Object> { + const parallelUploads3 = new Upload({ + client: this.client, + params: { + Bucket: bucketName, + Body: file, + ContentType: file.type, + Key: key, + }, + queueSize: 4, // optional concurrency configuration + leavePartsOnError: false, // optional manually handle dropped parts + }); + if (onProgress != undefined) { + parallelUploads3.on("httpUploadProgress", onProgress); + } + await parallelUploads3.done(); + const newObj = { + Key: key, + Size: file.size ?? 0, + LastModified: dayjs().toDate(), + }; + this._pushObject(bucketName, newObj); + return newObj; + }, + createFolder(bucketName: string, key: string): Promise<S3Object> { + const command = new PutObjectCommand({ + Bucket: bucketName, + Body: "", + ContentType: "text/plain", + Key: key, + }); + return this.client.send(command).then(() => { + const newObj = { + Key: key, + Size: 0, + LastModified: dayjs().toDate(), + }; + this._pushObject(bucketName, newObj); + return newObj; + }); + }, + }, +}); diff --git a/src/stores/users.ts b/src/stores/users.ts new file mode 100644 index 0000000000000000000000000000000000000000..37497e582784ef6f0fdebcdb2ce205aeb561dc10 --- /dev/null +++ b/src/stores/users.ts @@ -0,0 +1,164 @@ +import { defineStore } from "pinia"; +import type { User } from "@/client/auth"; +import { UserService, RoleEnum } from "@/client/auth"; +import { OpenAPI as S3ProxyOpenAPI } from "@/client/s3proxy"; +import { OpenAPI as AuthOpenAPI } from "@/client/auth"; +import { OpenAPI as WorkflowOpenAPI } from "@/client/workflow"; +import { useWorkflowExecutionStore } from "@/stores/workflowExecutions"; +import { useBucketStore } from "@/stores/buckets"; +import { useWorkflowStore } from "@/stores/workflows"; +import { useS3KeyStore } from "@/stores/s3keys"; +import { useS3ObjectStore } from "@/stores/s3objects"; +import { clear as dbclear } from "idb-keyval"; + +type DecodedToken = { + exp: number; + iss: string; + roles: RoleEnum[]; + sub: string; +}; + +export type RootState = { + token: string | null; + decodedToken: DecodedToken | null; + user: User | null; + userMapping: Record<string, string>; +}; + +function parseJwt(token: string): DecodedToken { + const base64Url = token.split(".")[1]; + const base64 = base64Url.replace(/-/g, "+").replace(/_/g, "/"); + const jsonPayload = decodeURIComponent( + window + .atob(base64) + .split("") + .map(function (c) { + return "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2); + }) + .join(""), + ); + + return JSON.parse(jsonPayload) as DecodedToken; +} + +export const useAuthStore = defineStore({ + id: "auth", + state: () => + ({ + token: null, + decodedToken: null, + user: null, + userMapping: {}, + }) as RootState, + getters: { + roles(): string[] { + return ( + this.user?.roles?.map((role) => role.toString()) ?? + this.decodedToken?.["roles"] ?? + [] + ); + }, + authenticated: (state) => state.token != null, + currentUID(): string { + return this.decodedToken?.["sub"] ?? ""; + }, + foreignUser: (state) => + state.user?.roles?.includes(RoleEnum.FOREIGN_USER) ?? + state.decodedToken?.roles.includes(RoleEnum.FOREIGN_USER) ?? + true, + normalUser: (state) => + state.user?.roles?.includes(RoleEnum.USER) ?? + state.decodedToken?.roles.includes(RoleEnum.USER) ?? + false, + workflowReviewer: (state) => + state.user?.roles?.includes(RoleEnum.REVIEWER) ?? + state.decodedToken?.roles.includes(RoleEnum.REVIEWER) ?? + false, + workflowDev: (state) => + state.user?.roles?.includes(RoleEnum.DEVELOPER) ?? + state.decodedToken?.roles.includes(RoleEnum.DEVELOPER) ?? + false, + admin: (state) => + state.user?.roles?.includes(RoleEnum.ADMINISTRATOR) ?? + state.decodedToken?.roles.includes(RoleEnum.ADMINISTRATOR) ?? + false, + }, + actions: { + setToken(token: string | null) { + if (token != null) { + this.token = token; + this.decodedToken = parseJwt(token); + S3ProxyOpenAPI.TOKEN = token; + AuthOpenAPI.TOKEN = token; + WorkflowOpenAPI.TOKEN = token; + UserService.userGetLoggedInUser() + .then((user) => { + this.updateUser(user); + }) + .catch(() => { + this.token = null; + }); + } else { + this.logout(); + } + }, + updateUser(user: User) { + this.user = user; + }, + logout() { + this.$reset(); + localStorage.clear(); + dbclear(); + useWorkflowExecutionStore().$reset(); + useBucketStore().$reset(); + useWorkflowStore().$reset(); + useS3KeyStore().$reset(); + useS3ObjectStore().$reset(); + }, + async addUidToNameMapping(mapping: Record<string, string>): Promise<void> { + for (const uid of Object.keys(mapping)) { + this.userMapping[uid] = mapping[uid]; + localStorage.setItem(uid, mapping[uid]); + } + }, + async fetchUsernames(uids: string[]): Promise<string[]> { + const filteredIds = uids + .filter((uid) => !this.userMapping[uid]) // filter already present UIDs + .filter( + // filter unique UIDs + (modeId, index, array) => + array.findIndex((val) => val === modeId) === index, + ); + // If all uids are already in the store, then return them + if (filteredIds.length === 0) { + return uids.map((uid) => this.userMapping[uid]); + } + const missingIds: string[] = []; + const storedNames = filteredIds.map((uid) => localStorage.getItem(uid)); + + for (const index in storedNames) { + // if uid was not cached, mark it to fetch it from backend + if (storedNames[index] == null) { + missingIds.push(filteredIds[index]); + } else { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + this.userMapping[filteredIds[index]] = storedNames[index]!; + } + } + // If all uids could be resolved from cache, return them + if (missingIds.length === 0) { + return uids.map((uid) => this.userMapping[uid]); + } + // fetch missing users from backend + const fetchedUsers = await Promise.all( + missingIds.map((uid) => UserService.userGetUser(uid)), + ); + // Put users in store + for (const user of fetchedUsers) { + this.userMapping[user.uid] = user.display_name; + localStorage.setItem(user.uid, user.display_name); + } + return uids.map((uid) => this.userMapping[uid]); + }, + }, +}); diff --git a/src/stores/workflowExecutions.ts b/src/stores/workflowExecutions.ts new file mode 100644 index 0000000000000000000000000000000000000000..9633272e7dac04c2705022eea3cc81a7368638d3 --- /dev/null +++ b/src/stores/workflowExecutions.ts @@ -0,0 +1,152 @@ +import { defineStore } from "pinia"; +import type { + AnonymizedWorkflowExecution, + DevWorkflowExecutionIn, + WorkflowExecutionIn, + WorkflowExecutionOut, +} from "@/client/workflow"; +import { + WorkflowExecutionService, + WorkflowExecutionStatus, + WorkflowService, +} from "@/client/workflow"; +import { useAuthStore } from "@/stores/users"; +import dayjs from "dayjs"; +import { set, get } from "idb-keyval"; + +export const useWorkflowExecutionStore = defineStore({ + id: "workflow-executions", + state: () => + ({ + executionMapping: {}, + anonymizedExecutions: [], + parameters: {}, + }) as { + executionMapping: Record<string, WorkflowExecutionOut>; + anonymizedExecutions: AnonymizedWorkflowExecution[]; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + parameters: Record<string, Record<string, any>>; + }, + getters: { + executions(): WorkflowExecutionOut[] { + return Object.values(this.executionMapping); + }, + }, + actions: { + fetchExecutionsForDevStatistics( + onFinally?: () => void, + ): Promise<AnonymizedWorkflowExecution[]> { + if (this.anonymizedExecutions.length > 0) { + onFinally?.(); + } + const userStore = useAuthStore(); + return WorkflowService.workflowGetDeveloperWorkflowStatistics( + userStore.currentUID, + ) + .then((executions) => { + this.anonymizedExecutions = executions; + return executions; + }) + .finally(onFinally); + }, + fetchExecutions(onFinally?: () => void): Promise<WorkflowExecutionOut[]> { + if (Object.keys(this.executionMapping).length > 0) { + onFinally?.(); + } + const userStore = useAuthStore(); + return WorkflowExecutionService.workflowExecutionListWorkflowExecutions( + userStore.currentUID, + ) + .then((executions) => { + const newMapping: Record<string, WorkflowExecutionOut> = {}; + for (const execution of executions) { + newMapping[execution.execution_id] = execution; + } + this.executionMapping = newMapping; + return executions; + }) + .finally(onFinally); + }, + fetchExecution( + executionId: string, + onFinally?: () => void, + ): Promise<WorkflowExecutionOut> { + if (this.executionMapping[executionId] != undefined) { + onFinally?.(); + } + return WorkflowExecutionService.workflowExecutionGetWorkflowExecution( + executionId, + ) + .then((execution) => { + this.executionMapping[execution.execution_id] = execution; + return execution; + }) + .finally(onFinally); + }, + fetchExecutionParameters( + executionId: string, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ): Promise<Record<string, any>> { + if (Object.keys(this.parameters).includes(executionId)) { + return Promise.resolve(this.parameters[executionId]); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return get<Record<string, any>>(executionId) + .then((parameters) => { + if (parameters != undefined) { + return parameters; + } + return WorkflowExecutionService.workflowExecutionGetWorkflowExecutionParams( + executionId, + ).then((parameters) => { + set(executionId, parameters); + return parameters; + }); + }) + .then((parameters) => { + this.parameters[executionId] = parameters; + return parameters; + }); + }, + deleteExecution(executionId: string): Promise<void> { + return WorkflowExecutionService.workflowExecutionDeleteWorkflowExecution( + executionId, + ).then(() => { + delete this.executionMapping[executionId]; + }); + }, + cancelExecution(executionId: string): Promise<void> { + return WorkflowExecutionService.workflowExecutionCancelWorkflowExecution( + executionId, + ).then(() => { + if (this.executionMapping[executionId] == undefined) { + this.fetchExecution(executionId); + } else { + this.executionMapping[executionId].status = + WorkflowExecutionStatus.CANCELED; + this.executionMapping[executionId].end_time = dayjs().unix(); + } + }); + }, + startExecution( + executionIn: WorkflowExecutionIn, + ): Promise<WorkflowExecutionOut> { + return WorkflowExecutionService.workflowExecutionStartWorkflow( + executionIn, + ).then((execution) => { + this.executionMapping[execution.execution_id] = execution; + return execution; + }); + }, + startDevExecution( + executionIn: DevWorkflowExecutionIn, + ): Promise<WorkflowExecutionOut> { + return WorkflowExecutionService.workflowExecutionStartArbitraryWorkflow( + executionIn, + ).then((execution) => { + this.executionMapping[execution.execution_id] = execution; + return execution; + }); + }, + }, +}); diff --git a/src/stores/workflows.ts b/src/stores/workflows.ts new file mode 100644 index 0000000000000000000000000000000000000000..6c7e04b3e2ba72d49ffed420cd41953e2a6e3b81 --- /dev/null +++ b/src/stores/workflows.ts @@ -0,0 +1,468 @@ +import { defineStore } from "pinia"; +import type { + Body_Workflow_Version_upload_workflow_version_icon, + IconUpdateOut, + WorkflowCredentialsIn, + WorkflowIn, + WorkflowModeOut, + WorkflowOut, + WorkflowUpdate, + WorkflowVersion, +} from "@/client/workflow"; +import { + Status, + WorkflowCredentialsService, + WorkflowModeService, + WorkflowService, + WorkflowVersionService, +} from "@/client/workflow"; +import { useAuthStore } from "@/stores/users"; +import { set, get } from "idb-keyval"; + +export const useWorkflowStore = defineStore({ + id: "workflows", + state: () => + ({ + workflowMapping: {}, + nameMapping: {}, + comprehensiveWorkflowMapping: {}, + modeMapping: {}, + modeNameMapping: {}, + }) as { + workflowMapping: Record<string, WorkflowOut>; + nameMapping: Record<string, string>; + comprehensiveWorkflowMapping: Record<string, WorkflowOut>; + modeMapping: Record<string, WorkflowModeOut>; + }, + getters: { + workflows(): WorkflowOut[] { + return Object.values(this.workflowMapping); + }, + ownWorkflows(): WorkflowOut[] { + const authStore = useAuthStore(); + return Object.values(this.comprehensiveWorkflowMapping).filter( + (workflow) => workflow.developer_id === authStore.currentUID, + ); + }, + reviewableWorkflows(): WorkflowOut[] { + return Object.values(this.comprehensiveWorkflowMapping).filter( + (workflow) => + workflow.versions.filter( + (version) => version.status === Status.CREATED, + ).length > 0, + ); + }, + versionMapping(): Record<string, WorkflowVersion> { + const mapping: Record<string, WorkflowVersion> = {}; + for (const workflow of this.workflows) { + for (const version of workflow.versions) { + mapping[version.git_commit_hash] = version; + } + } + return mapping; + }, + getName(): (objectID: string) => string | undefined { + return (objectID) => + this.nameMapping[objectID] ?? localStorage.getItem(objectID); + }, + getArbitraryWorkflow(): (wid: string) => Promise<WorkflowIn | undefined> { + return (wid: string) => get(wid); + }, + }, + actions: { + __addNameToMapping(key: string, value: string) { + this.nameMapping[key] = value; + localStorage.setItem(key, value); + }, + fetchWorkflows(onFinally?: () => void): Promise<WorkflowOut[]> { + if (Object.keys(this.workflowMapping).length > 0) { + onFinally?.(); + } + return WorkflowService.workflowListWorkflows() + .then((workflows) => { + for (const workflow of workflows) { + this.workflowMapping[workflow.workflow_id] = workflow; + this.__addNameToMapping(workflow.workflow_id, workflow.name); + for (const version of workflow.versions) { + this.__addNameToMapping(version.git_commit_hash, version.version); + } + } + this.fetchWorkflowModes( + workflows + .map((workflow) => workflow.versions ?? []) + .flat() + .map((version) => version.modes ?? []) + .flat(), + ); + return workflows; + }) + .finally(onFinally); + }, + fetchOwnWorkflows(onFinally?: () => void): Promise<WorkflowOut[]> { + const authStore = useAuthStore(); + if (this.ownWorkflows.length > 0) { + onFinally?.(); + } + return WorkflowService.workflowListWorkflows( + undefined, + Object.values(Status), + authStore.currentUID, + ) + .then((workflows) => { + for (const workflow of workflows) { + this.comprehensiveWorkflowMapping[workflow.workflow_id] = workflow; + this.__addNameToMapping(workflow.workflow_id, workflow.name); + for (const version of workflow.versions) { + this.__addNameToMapping(version.git_commit_hash, version.version); + } + } + this.fetchWorkflowModes( + workflows + .map((workflow) => workflow.versions ?? []) + .flat() + .map((version) => version.modes ?? []) + .flat(), + ); + return workflows; + }) + .finally(onFinally); + }, + fetchReviewableWorkflows(onFinally?: () => void): Promise<WorkflowOut[]> { + if (this.reviewableWorkflows.length > 0) { + onFinally?.(); + } + return WorkflowService.workflowListWorkflows(undefined, [Status.CREATED]) + .then((workflows) => { + for (const workflow of workflows) { + this.__addNameToMapping(workflow.workflow_id, workflow.name); + for (const version of workflow.versions) { + this.__addNameToMapping(version.git_commit_hash, version.version); + } + if ( + this.comprehensiveWorkflowMapping[workflow.workflow_id] != + undefined + ) { + // merge cached workflow versions and fetched workflow versions + for (const version of workflow.versions) { + // if version is not present, push version into versions list + if ( + this.comprehensiveWorkflowMapping[ + workflow.workflow_id + ].versions.findIndex( + (workflowVersion) => + workflowVersion.git_commit_hash === + version.git_commit_hash, + ) < 0 + ) { + this.comprehensiveWorkflowMapping[ + workflow.workflow_id + ].versions.push(version); + } + } + } else { + this.comprehensiveWorkflowMapping[workflow.workflow_id] = + workflow; + } + } + return workflows; + }) + .finally(onFinally); + }, + fetchWorkflow( + workflow_id: string, + comprehensive = false, + onFinally?: () => void, + ): Promise<WorkflowOut> { + if ( + comprehensive && + this.comprehensiveWorkflowMapping[workflow_id] != undefined + ) { + onFinally?.(); + } + if (!comprehensive && this.workflowMapping[workflow_id] != undefined) { + onFinally?.(); + } + return WorkflowService.workflowGetWorkflow( + workflow_id, + comprehensive ? Object.values(Status) : undefined, + ) + .then((workflow) => { + this.__addNameToMapping(workflow.workflow_id, workflow.name); + for (const version of workflow.versions) { + this.__addNameToMapping(version.git_commit_hash, version.version); + } + if (comprehensive) { + this.comprehensiveWorkflowMapping[workflow_id] = workflow; + } else { + this.workflowMapping[workflow_id] = workflow; + } + this.fetchWorkflowModes( + workflow.versions.map((version) => version.modes ?? []).flat(), + ); + return workflow; + }) + .finally(onFinally); + }, + fetchWorkflowModes(modeIds?: string[]): Promise<WorkflowModeOut[]> { + if (modeIds == undefined) { + return Promise.resolve([]); + } + const filteredIds = modeIds + .filter((modeId) => !this.modeMapping[modeId]) // filter null modes and already present modes + .filter( + // filter unique workflow versions + (modeId, index, array) => + array.findIndex((val) => val === modeId) === index, + ); + return Promise.all( + filteredIds.map((modeId) => + WorkflowModeService.workflowModeGetWorkflowMode(modeId), + ), + ).then((modes) => { + for (const mode of modes) { + this.__addNameToMapping(mode.mode_id, mode.name); + this.modeMapping[mode.mode_id] = mode; + } + return modes; + }); + }, + async setArbitraryWorkflow(workflow: WorkflowIn) { + const wid = crypto.randomUUID(); + await set(wid, workflow); + return wid; + }, + deprecateWorkflowVersion( + workflow_id: string, + version_id: string, + ): Promise<WorkflowVersion> { + return WorkflowVersionService.workflowVersionDeprecateWorkflowVersion( + workflow_id, + version_id, + ).then((version) => { + // Update version in workflowMapping + if (this.workflowMapping[workflow_id] == undefined) { + this.fetchWorkflow(workflow_id, false); + } else { + const versionIndex1 = this.workflowMapping[ + workflow_id + ].versions.findIndex( + (version) => version.git_commit_hash == version_id, + ); + if (versionIndex1 > -1) { + this.workflowMapping[workflow_id].versions[versionIndex1] = version; + } else { + this.workflowMapping[workflow_id].versions.push(version); + } + } + + // Update version in comprehensiveWorkflowMapping + if (this.comprehensiveWorkflowMapping[workflow_id] == undefined) { + this.fetchWorkflow(workflow_id, true); + } else { + const versionIndex2 = this.comprehensiveWorkflowMapping[ + workflow_id + ].versions.findIndex( + (version) => version.git_commit_hash == version_id, + ); + if (versionIndex2 > -1) { + this.comprehensiveWorkflowMapping[workflow_id].versions[ + versionIndex2 + ] = version; + } else { + this.comprehensiveWorkflowMapping[workflow_id].versions.push( + version, + ); + } + } + return version; + }); + }, + updateWorkflow( + workflow_id: string, + version: WorkflowUpdate, + ): Promise<WorkflowVersion> { + return WorkflowService.workflowUpdateWorkflow(workflow_id, version).then( + (updatedVersion) => { + this.__addNameToMapping( + updatedVersion.git_commit_hash, + updatedVersion.version, + ); + if (this.comprehensiveWorkflowMapping[workflow_id] == undefined) { + this.fetchWorkflow(workflow_id, true); + } else { + this.comprehensiveWorkflowMapping[workflow_id].versions.push( + updatedVersion, + ); + } + return updatedVersion; + }, + ); + }, + deleteWorkflow(workflow_id: string): Promise<void> { + return WorkflowService.workflowDeleteWorkflow(workflow_id).then(() => { + delete this.nameMapping[workflow_id]; + localStorage.removeItem(workflow_id); + delete this.workflowMapping[workflow_id]; + delete this.comprehensiveWorkflowMapping[workflow_id]; + }); + }, + createWorkflow(workflow: WorkflowIn): Promise<WorkflowOut> { + return WorkflowService.workflowCreateWorkflow(workflow).then( + (workflowOut) => { + this.comprehensiveWorkflowMapping[workflowOut.workflow_id] = + workflowOut; + this.__addNameToMapping(workflowOut.workflow_id, workflowOut.name); + this.__addNameToMapping( + workflow.git_commit_hash, + workflowOut.versions[0].version, + ); + return workflowOut; + }, + ); + }, + updateWorkflowCredentials( + workflow_id: string, + credentials: WorkflowCredentialsIn, + ): Promise<void> { + return WorkflowCredentialsService.workflowCredentialsUpdateWorkflowCredentials( + workflow_id, + credentials, + ).then(() => { + if (this.workflowMapping[workflow_id] == undefined) { + this.fetchWorkflow(workflow_id, false); + } else { + this.workflowMapping[workflow_id].private = true; + } + if (this.comprehensiveWorkflowMapping[workflow_id] == undefined) { + this.fetchWorkflow(workflow_id, true); + } else { + this.comprehensiveWorkflowMapping[workflow_id].private = true; + } + }); + }, + deleteWorkflowCredentials(workflow_id: string): Promise<void> { + return WorkflowCredentialsService.workflowCredentialsDeleteWorkflowCredentials( + workflow_id, + ).then(() => { + if (this.workflowMapping[workflow_id] == undefined) { + this.fetchWorkflow(workflow_id, false); + } else { + this.workflowMapping[workflow_id].private = false; + } + if (this.comprehensiveWorkflowMapping[workflow_id] == undefined) { + this.fetchWorkflow(workflow_id, true); + } else { + this.comprehensiveWorkflowMapping[workflow_id].private = false; + } + }); + }, + updateVersionIcon( + workflow_id: string, + version_id: string, + icon: Body_Workflow_Version_upload_workflow_version_icon, + ): Promise<IconUpdateOut> { + return WorkflowVersionService.workflowVersionUploadWorkflowVersionIcon( + workflow_id, + version_id, + icon, + ).then((response) => { + // Update version in workflowMapping + if (this.workflowMapping[workflow_id] == undefined) { + this.fetchWorkflow(workflow_id, false); + } else { + const versionIndex1 = this.workflowMapping[ + workflow_id + ].versions.findIndex( + (version) => version.git_commit_hash == version_id, + ); + if (versionIndex1 > -1) { + this.workflowMapping[workflow_id].versions[versionIndex1].icon_url = + response.icon_url; + } + } + + // Update version in comprehensiveWorkflowMapping + if (this.comprehensiveWorkflowMapping[workflow_id] == undefined) { + this.fetchWorkflow(workflow_id, true); + } else { + const versionIndex2 = this.comprehensiveWorkflowMapping[ + workflow_id + ].versions.findIndex( + (version) => version.git_commit_hash == version_id, + ); + if (versionIndex2 > -1) { + setTimeout(() => { + this.comprehensiveWorkflowMapping[workflow_id].versions[ + versionIndex2 + ].icon_url = response.icon_url; + }, 500); + } + } + return response; + }); + }, + deleteVersionIcon(workflow_id: string, version_id: string): Promise<void> { + return WorkflowVersionService.workflowVersionDeleteWorkflowVersionIcon( + workflow_id, + version_id, + ).then(() => { + // Update version in workflowMapping + if (this.workflowMapping[workflow_id] == undefined) { + this.fetchWorkflow(workflow_id, false); + } else { + const versionIndex1 = this.workflowMapping[ + workflow_id + ].versions.findIndex( + (version) => version.git_commit_hash == version_id, + ); + if (versionIndex1 > -1) { + this.workflowMapping[workflow_id].versions[versionIndex1].icon_url = + null; + } + } + + // Update version in comprehensiveWorkflowMapping + if (this.comprehensiveWorkflowMapping[workflow_id] == undefined) { + this.fetchWorkflow(workflow_id, true); + } else { + const versionIndex2 = this.comprehensiveWorkflowMapping[ + workflow_id + ].versions.findIndex( + (version) => version.git_commit_hash == version_id, + ); + if (versionIndex2 > -1) { + this.comprehensiveWorkflowMapping[workflow_id].versions[ + versionIndex2 + ].icon_url = null; + } + } + }); + }, + updateVersionStatus( + workflow_id: string, + version_id: string, + status: Status, + ): Promise<void> { + return WorkflowVersionService.workflowVersionUpdateWorkflowVersionStatus( + version_id, + workflow_id, + { status: status }, + ).then(() => { + if (this.comprehensiveWorkflowMapping[workflow_id] == undefined) { + this.fetchWorkflow(workflow_id, true); + } else { + const versionIndex = this.comprehensiveWorkflowMapping[ + workflow_id + ].versions.findIndex( + (version) => version.git_commit_hash == version_id, + ); + if (versionIndex > -1) { + this.comprehensiveWorkflowMapping[workflow_id].versions[ + versionIndex + ].status = status; + } + } + }); + }, + }, +}); diff --git a/src/types/PseudoFolder.ts b/src/types/PseudoFolder.ts new file mode 100644 index 0000000000000000000000000000000000000000..c65e1f950c9a0825fae56ef479820bb9bff2ee4c --- /dev/null +++ b/src/types/PseudoFolder.ts @@ -0,0 +1,19 @@ +import type { _Object as S3Object } from "@aws-sdk/client-s3"; + +export interface S3ObjectWithFolder extends S3Object { + folder: string[]; + pseudoFileName: string; +} + +export type S3PseudoFolder = { + Size: number; + parentFolder: string[]; + LastModified: Date; + name: string; + Key: string; +}; + +export type FolderTree = { + subFolders: Record<string, FolderTree>; + files: S3ObjectWithFolder[]; +}; diff --git a/src/utils/BackoffStrategy.ts b/src/utils/BackoffStrategy.ts new file mode 100644 index 0000000000000000000000000000000000000000..c10ad0a314f7f651c828a85cdccd20d4882e5c78 --- /dev/null +++ b/src/utils/BackoffStrategy.ts @@ -0,0 +1,70 @@ +abstract class BackoffStrategy { + protected currentVal: number; + protected iteration: number; + protected reachedMax: boolean; + protected maxValue: number; + + constructor(maxValue?: number) { + this.currentVal = 0; + this.iteration = 0; + this.reachedMax = false; + this.maxValue = maxValue ?? 300; + } + + protected abstract computeNextValue(): number; + + public reset() { + this.iteration = 0; + this.currentVal = 0; + this.reachedMax = false; + } + + public *generator(): Generator<number> { + while (true) { + this.iteration++; + if (this.reachedMax) { + yield this.maxValue; + } else { + this.currentVal = this.computeNextValue(); + if (0 < this.maxValue && this.maxValue < this.currentVal) { + this.reachedMax = true; + yield this.maxValue; + } else { + yield this.currentVal; + } + } + } + } +} + +export class ExponentialBackoff extends BackoffStrategy { + protected computeNextValue(): number { + return 2 << (this.iteration - 1); + } +} + +export class NoBackoff extends BackoffStrategy { + private readonly constantValue: number; + + constructor(constantValue?: number) { + super(); + this.constantValue = constantValue ?? 30; + } + + protected computeNextValue(): number { + return this.constantValue; + } +} + +export class LinearBackoff extends BackoffStrategy { + private readonly backoff: number; + + constructor(backoff?: number) { + super(); + this.backoff = backoff ?? 5; + } + + protected computeNextValue(): number { + return this.currentVal + this.backoff; + } +} diff --git a/src/utils/DayjsAdapter.ts b/src/utils/DayjsAdapter.ts new file mode 100644 index 0000000000000000000000000000000000000000..fbfd8bf6edcce583a130170cb4697b0313275240 --- /dev/null +++ b/src/utils/DayjsAdapter.ts @@ -0,0 +1,99 @@ +import { _adapters } from "chart.js"; + +import dayjs from "dayjs"; +import type { QUnitType } from "dayjs"; + +import type { TimeUnit } from "chart.js"; + +// Needed to handle the custom parsing +import CustomParseFormat from "dayjs/plugin/customParseFormat.js"; + +// Needed to handle quarter format +import AdvancedFormat from "dayjs/plugin/advancedFormat.js"; + +// Needed to handle adding/subtracting quarter +import QuarterOfYear from "dayjs/plugin/quarterOfYear.js"; + +// Needed to handle localization format +import LocalizedFormat from "dayjs/plugin/localizedFormat.js"; + +import isoWeek from "dayjs/plugin/isoWeek.js"; + +dayjs.extend(AdvancedFormat); + +dayjs.extend(QuarterOfYear); + +dayjs.extend(LocalizedFormat); + +dayjs.extend(CustomParseFormat); + +dayjs.extend(isoWeek); + +const FORMATS = { + datetime: "MMM D, YYYY, h:mm:ss a", + millisecond: "h:mm:ss.SSS a", + second: "h:mm:ss a", + minute: "h:mm a", + hour: "hA", + day: "MMM D", + week: "ll", + month: "MMM YYYY", + quarter: "[Q]Q - YYYY", + year: "YYYY", +}; + +_adapters._date.override({ + //_id: 'dayjs', //DEBUG, + formats: () => FORMATS, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + parse: function (value: any, format?: TimeUnit) { + const valueType = typeof value; + + if (value === null || valueType === "undefined") { + return null; + } + + if (valueType === "string" && typeof format === "string") { + return dayjs(value, format).isValid() + ? dayjs(value, format).valueOf() + : null; + } else if (!(value instanceof dayjs)) { + return dayjs(value).isValid() ? dayjs(value).valueOf() : null; + } + return null; + }, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + format: function (time: any, format: TimeUnit): string { + return dayjs(time).format(format); + }, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + add: function (time: any, amount: number, unit: QUnitType & TimeUnit) { + return dayjs(time).add(amount, unit).valueOf(); + }, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + diff: function (max: any, min: any, unit: TimeUnit) { + return dayjs(max).diff(dayjs(min), unit); + }, + startOf: function ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + time: any, + unit: (TimeUnit & QUnitType) | "isoWeek", + weekday?: number, + ) { + if (unit === "isoWeek") { + // Ensure that weekday has a valid format + //const formattedWeekday + + const validatedWeekday: number = + typeof weekday === "number" && weekday > 0 && weekday < 7 ? weekday : 1; + + return dayjs(time).isoWeekday(validatedWeekday).startOf("day").valueOf(); + } + + return dayjs(time).startOf(unit).valueOf(); + }, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + endOf: function (time: any, unit: TimeUnit & QUnitType) { + return dayjs(time).endOf(unit).valueOf(); + }, +}); diff --git a/src/utils/GitRepository.ts b/src/utils/GitRepository.ts new file mode 100644 index 0000000000000000000000000000000000000000..505a42296de7bd29d7c7248bf397fcec24aecbd2 --- /dev/null +++ b/src/utils/GitRepository.ts @@ -0,0 +1,196 @@ +import axios from "axios"; +import type { AxiosInstance, AxiosBasicCredentials } from "axios"; +import type { WorkflowModeOut, WorkflowModeIn } from "@/client/workflow"; + +export function requiredRepositoryFiles( + modes?: WorkflowModeIn[] | WorkflowModeOut[], +): string[] { + const list = [ + "main.nf", + "CHANGELOG.md", + "README.md", + "docs/usage.md", + "docs/output.md", + ]; + if (modes && modes.length > 0) { + list.push(...modes.map((mode) => mode.schema_path)); + } else { + list.push("nextflow_schema.json"); + } + return list; +} + +export function determineGitIcon(repo_url?: string): string { + let gitProvider = "git-alt"; + if (repo_url != null) { + if (repo_url.includes("github")) { + gitProvider = "github"; + } else if (repo_url.includes("gitlab")) { + gitProvider = "gitlab"; + } else if (repo_url.includes("bitbucket")) { + gitProvider = "bitbucket"; + } + } + return "fa-brands fa-".concat(gitProvider); +} + +export abstract class GitRepository { + protected repo: URL; + protected gitCommitHash: string; + protected token?: string; + protected httpClient: AxiosInstance; + + protected constructor( + repoUrl: string, + gitCommitHash: string, + token?: string, + ) { + this.repo = new URL(repoUrl); + this.gitCommitHash = gitCommitHash; + if (token != undefined && token.length > 0) { + this.token = token; + } + this.httpClient = axios.create({ + maxRedirects: 2, + }); + } + + async checkFileExist(filepath: string): Promise<boolean> { + try { + await this.httpClient.head(this.fileUrl(filepath)); + } catch (e) { + return false; + } + return true; + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async downloadFile(filepath: string): Promise<any> { + try { + return await this.httpClient.get(await this.downloadFileUrl(filepath)); + } catch (e) { + return ""; + } + } + + async checkFilesExist( + files: string[], + raiseError = false, + ): Promise<boolean[]> { + const checks = Promise.all( + files.map((filepath) => this.checkFileExist(filepath)), + ); + const results = await checks; + if (raiseError) { + const missingFiles = files.filter((file, index) => !results[index]); + if (missingFiles.length > 0) { + throw new Error(missingFiles.reduce((a, b) => a + "," + b)); + } + } + return results; + } + + protected abstract fileUrl(filepath: string): string; + + protected abstract downloadFileUrl(filepath: string): Promise<string>; + + static buildRepository( + repoUrl: string, + gitCommitHash: string, + token?: string, + ): GitRepository { + if (repoUrl.includes("github")) { + return new GithubRepository(repoUrl, gitCommitHash, token); + } else if (repoUrl.includes("gitlab")) { + return new GitlabRepository(repoUrl, gitCommitHash, token); + } + throw new Error("Repository is not supported."); + } +} + +class GithubRepository extends GitRepository { + private readonly account: string; + private readonly repoName: string; + + constructor(repoUrl: string, gitCommitHash: string, token?: string) { + super(repoUrl, gitCommitHash, token); + const pathParts = this.repo.pathname.slice(1).split("/"); + this.account = pathParts[0]; + this.repoName = pathParts[1]; + if (token) { + this.httpClient.interceptors.request.use((req) => { + if (!req.url?.includes("raw")) { + req.auth = { + password: this.token, + username: this.account, + } as AxiosBasicCredentials; + } + return req; + }); + } + this.httpClient.interceptors.request.use((req) => { + if (!req.url?.includes("raw")) { + req.headers["X-GitHub-Api-Version"] = "2022-11-28"; + req.headers.setAccept("application/vnd.github.object+json"); + } + return req; + }); + } + + fileUrl(filepath: string): string { + return `https://api.github.com/repos/${this.account}/${ + this.repoName + }/contents/${encodeURIComponent(filepath)}?ref=${encodeURIComponent( + this.gitCommitHash, + )}`; + } + + protected async downloadFileUrl(filepath: string): Promise<string> { + if (this.token == undefined) { + return Promise.resolve( + `https://raw.githubusercontent.com/${this.account}/${this.repoName}/${this.gitCommitHash}/${filepath}`, + ); + } + return ( + await this.httpClient.get( + this.fileUrl(filepath) + `&time=${new Date().getTime()}`, + ) + ).data["download_url"]; + } +} + +class GitlabRepository extends GitRepository { + private readonly host: string; + private readonly project: string; + + constructor(repoUrl: string, gitCommitHash: string, token?: string) { + super(repoUrl, gitCommitHash, token); + const url = new URL(repoUrl); + this.host = url.host; + this.project = url.pathname.slice(1); + if (token != undefined) { + this.httpClient.interceptors.request.use((req) => { + req.headers.setAuthorization(`Bearer ${token}`); + return req; + }); + } + } + + fileUrl(filepath: string): string { + return `https://${this.host}/api/v4/projects/${encodeURIComponent( + this.project, + )}/repository/files/${encodeURIComponent( + filepath, + )}?ref=${encodeURIComponent(this.gitCommitHash)}`; + } + + protected downloadFileUrl(filepath: string): Promise<string> { + return Promise.resolve( + `https://${this.host}/api/v4/projects/${encodeURIComponent( + this.project, + )}/repository/files/${encodeURIComponent( + filepath, + )}/raw?ref=${encodeURIComponent(this.gitCommitHash)}`, + ); + } +} diff --git a/src/utils/Workflow.ts b/src/utils/Workflow.ts new file mode 100644 index 0000000000000000000000000000000000000000..e01237b68f4f3c5baaec652c5c10c5c3a36f6e2f --- /dev/null +++ b/src/utils/Workflow.ts @@ -0,0 +1,24 @@ +import type { WorkflowVersion } from "@/client/workflow"; + +export function sortedVersions( + versions: WorkflowVersion[], + desc = true, +): WorkflowVersion[] { + const vs = [...versions]; + if (desc) { + vs.sort((a, b) => (a.created_at < b.created_at ? 1 : -1)); + } else { + vs.sort((a, b) => (a.created_at < b.created_at ? -1 : 1)); + } + return vs; +} + +export function latestVersion( + versions: WorkflowVersion[], +): WorkflowVersion | undefined { + if (versions == undefined || versions.length == 0) { + return undefined; + } + const vs = sortedVersions(versions); + return vs[0]; +} diff --git a/src/views/LoginView.vue b/src/views/LoginView.vue index 6d36bf33b0bc4bd81c4b21adc1d3a588362f8a52..d9e1987acd5cf60c7093f05aee006c90f5fc6ffd 100644 --- a/src/views/LoginView.vue +++ b/src/views/LoginView.vue @@ -1,8 +1,8 @@ <script setup lang="ts"> import { onBeforeMount, onMounted } from "vue"; -import { useAuthStore } from "@/stores/auth"; +import { useAuthStore } from "@/stores/users"; import { useRouter, useRoute } from "vue-router"; -import { OpenAPI } from "@/client"; +import { OpenAPI as AuthOpenAPI } from "@/client/auth"; import { Toast } from "bootstrap"; const router = useRouter(); @@ -58,20 +58,107 @@ onMounted(() => { </div> </div> </div> + <div class="position-fixed start-50 translate-middle-x text-center"> + <img + src="/src/assets/images/clowm.svg" + class="img-fluid mb-3" + width="128" + height="128" + alt="CloWM Logo" + /> + <h1> + <span class="blue fw-bold">Clo</span><span class="red fw-bold">W</span + ><span class="green fw-bold">M</span> + </h1> + <h2> + The <span class="blue fw-semibold">Clo</span>ud-based + <span class="red fw-semibold">W</span>orkflow + <span class="green fw-semibold">M</span>anager + </h2> + </div> <div - class="card text-center bg-dark ms-md-auto position-fixed top-50 start-50 translate-middle" + class="card text-center ms-md-auto position-fixed top-50 start-50 translate-middle shadow" > - <div class="card-header text-dark bg-light">S3Proxy</div> - <div class="card-body p-5"> - <h5 class="card-title text-light">Login</h5> + <div class="card-header">Login</div> + <div class="card-body"> <p class="card-text text-secondary"> Login to this service with LifeScience </p> - <a :href="OpenAPI.BASE + '/auth/login'" class="m-2"> + <a :href="AuthOpenAPI.BASE + '/auth/login'" class="m-2"> <img src="/src/assets/images/ls-login.png" alt="[LS Login]" /> </a> </div> </div> + <div class="position-fixed bottom-0 w-100 start-0"> + <div class="d-flex flex-row justify-content-evenly align-items-center"> + <div class="border rounded p-4 icon text-center" hidden> + <h4 class="mb-4">A Service By</h4> + <a href="https://nfdi4microbiota.de/"> + <img + src="/src/assets/images/nfdi.svg" + alt="NFDI4Microbiota Logo" + height="50" + /> + </a> + </div> + <div class="border rounded p-4 icon text-center"> + <h4 class="mb-4">Powered By</h4> + <a href="https://www.denbi.de/"> + <img + src="/src/assets/images/denbi.svg" + alt="de.NBI Logo" + height="50" + /> + </a> + </div> + <div class="border rounded p-4 icon text-center"> + <h4 class="mb-4">Hosted By</h4> + <a href="https://bibi.uni-bielefeld.de/"> + <img src="/src/assets/images/bibi.png" alt="BiBi Logo" height="50" /> + </a> + </div> + <div class="border rounded p-4 icon text-center"> + <h4 class="mb-4">Funded By</h4> + <img src="/src/assets/images/dfg.png" alt="DFG Logo" height="50" /> + </div> + <div class="border rounded p-4 icon text-center"> + <img + src="/src/assets/images/unibi.svg" + alt="Bielefeld University Logo" + height="50" + /> + </div> + </div> + </div> </template> -<style scoped></style> +<style scoped> +a > img:hover { + filter: brightness(0.9); +} + +.green { + color: #198754; +} + +.red { + color: #dc3545; +} + +.blue { + color: #0d6efd; +} + +.bottom-0 { + bottom: 55px !important; +} + +.icon { + transition: transform 0.3s ease-out; +} + +.icon:hover { + transform: translate(0, -5px); + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; +} +</style> diff --git a/src/views/NotFoundView.vue b/src/views/NotFoundView.vue index 1bf21c077823b5aaf6135081d3e15e30045037a5..73393efccd69109bfc8e8619fe799737d26ddc05 100644 --- a/src/views/NotFoundView.vue +++ b/src/views/NotFoundView.vue @@ -2,11 +2,11 @@ <template> <div - class="card min-w-25 text-center bg-dark ms-md-auto position-fixed top-50 start-50 translate-middle" + class="card min-w-25 text-center ms-md-auto position-fixed top-50 start-50 translate-middle shadow" > - <div class="card-header text-dark bg-light fs-4">Something went wrong</div> + <div class="card-header fs-4">Something went wrong</div> <div class="card-body p-5"> - <h1 class="card-title text-light mb-5">Page Not Found</h1> + <h1 class="card-title mb-5">Page Not Found</h1> <p class="card-text text-secondary fs-4"> Back to the <router-link to="/">HomePage</router-link> </p> diff --git a/src/components/BucketView.vue b/src/views/object-storage/BucketView.vue similarity index 59% rename from src/components/BucketView.vue rename to src/views/object-storage/BucketView.vue index d2ac4ac9474d119fbc63a4fa916d0130bdbec1d0..b3bd3768dc2e75d1d7607400d5a777f9487cc8eb 100644 --- a/src/components/BucketView.vue +++ b/src/views/object-storage/BucketView.vue @@ -1,84 +1,31 @@ <script setup lang="ts"> import { onMounted, reactive, watch, computed } from "vue"; -import type { ComputedRef } from "vue"; import type { - S3ObjectMetaInformation, - BucketPermissionOut, - BucketOut, -} from "@/client"; -import { ObjectService } from "@/client"; -import BootstrapIcon from "@/components/BootstrapIcon.vue"; + FolderTree, + S3PseudoFolder, + S3ObjectWithFolder, +} from "@/types/PseudoFolder"; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; import { filesize } from "filesize"; import dayjs from "dayjs"; import { Toast, Tooltip } from "bootstrap"; -import PermissionListModal from "@/components/Modals/PermissionListModal.vue"; -import UploadObjectModal from "@/components/Modals/UploadObjectModal.vue"; -import CopyObjectModal from "@/components/Modals/CopyObjectModal.vue"; -import PermissionModal from "@/components/Modals/PermissionModal.vue"; -import ObjectDetailModal from "@/components/Modals/ObjectDetailModal.vue"; -import CreateFolderModal from "@/components/Modals/CreateFolderModal.vue"; -import DeleteModal from "@/components/Modals/DeleteModal.vue"; -import { - S3Client, - DeleteObjectCommand, - DeleteObjectsCommand, - GetObjectCommand, -} from "@aws-sdk/client-s3"; -import { getSignedUrl } from "@aws-sdk/s3-request-presigner"; -import { awsAuthMiddlewareOptions } from "@aws-sdk/middleware-signing"; -import { useAuthStore } from "@/stores/auth"; +import PermissionListModal from "@/components/object-storage/modals/PermissionListModal.vue"; +import UploadObjectModal from "@/components/object-storage/modals/UploadObjectModal.vue"; +import CopyObjectModal from "@/components/object-storage/modals/CopyObjectModal.vue"; +import PermissionModal from "@/components/object-storage/modals/PermissionModal.vue"; +import ObjectDetailModal from "@/components/object-storage/modals/ObjectDetailModal.vue"; +import CreateFolderModal from "@/components/object-storage/modals/CreateFolderModal.vue"; +import DeleteModal from "@/components/modals/DeleteModal.vue"; +import type { _Object as S3Object } from "@aws-sdk/client-s3"; +import { useAuthStore } from "@/stores/users"; +import { useBucketStore } from "@/stores/buckets"; +import { useS3ObjectStore } from "@/stores/s3objects"; +import { useS3KeyStore } from "@/stores/s3keys"; const authStore = useAuthStore(); - -const middleware = [ - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - (next) => async (args) => { - args.request.headers["host"] = import.meta.env.VITE_S3_URL.split("://")[1]; - return await next(args); - }, - { - relation: "before", - toMiddleware: awsAuthMiddlewareOptions?.name ?? "impossible", - }, -]; - -let client = new S3Client({ - region: "us-east-1", - endpoint: import.meta.env.VITE_S3_URL, - forcePathStyle: true, - credentials: { - accessKeyId: authStore.s3key?.access_key ?? "", - secretAccessKey: authStore.s3key?.secret_key ?? "", - }, - tls: import.meta.env.VITE_S3_URL.startsWith("https"), -}); -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore -client.middlewareStack.addRelativeTo(middleware[0], middleware[1]); - -// If S3 Key changes -authStore.$onAction(({ name, args }) => { - if (name === "setS3Key") { - if (args[0] === null) { - console.error("There are no S3 Keys"); - } else { - client = new S3Client({ - region: "us-east-1", - endpoint: import.meta.env.VITE_S3_URL, - forcePathStyle: true, - credentials: { - accessKeyId: args[0].access_key, - secretAccessKey: args[0].secret_key, - }, - tls: import.meta.env.VITE_S3_URL.startsWith("https"), - }); - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - client.middlewareStack.addRelativeTo(middleware[0], middleware[1]); - } - } -}); +const bucketRepository = useBucketStore(); +const objectRepository = useS3ObjectStore(); +const s3KeyRepository = useS3KeyStore(); // Constants // ----------------------------------------------------------------------------- @@ -86,103 +33,63 @@ authStore.$onAction(({ name, args }) => { const props = defineProps<{ bucketName: string; subFolders: string[] | string; - permission: BucketPermissionOut | undefined; - writableBuckets: BucketOut[]; }>(); -const randomIDSuffix = Math.random().toString(16).substr(2, 8); -let successToast: Toast | null = null; - -// Typescript types -// ----------------------------------------------------------------------------- -interface S3ObjectWithFolder extends S3ObjectMetaInformation { - folder: string[]; - pseudoFileName: string; -} -type S3PseudoFolder = { - size: number; - parentFolder: string[]; - last_modified: string; - name: string; - key: string; -}; - -type FolderTree = { - subFolders: Record<string, FolderTree>; - files: S3ObjectWithFolder[]; -}; +const randomIDSuffix = Math.random().toString(16).substring(2, 8); +let successToast: Toast | null = null; +let refreshTimeout: NodeJS.Timeout | undefined = undefined; // Reactive State // ----------------------------------------------------------------------------- - -const deleteObjectsState = reactive({ - deletedItem: "", - potentialObjectToDelete: "", - deleteFolder: true, -} as { +const deleteObjectsState = reactive<{ deletedItem: string; potentialObjectToDelete: string; deleteFolder: boolean; +}>({ + deletedItem: "", + potentialObjectToDelete: "", + deleteFolder: true, }); -const objectState = reactive({ - objects: [], +const objectState = reactive<{ + loading: boolean; + filterString: string; + bucketNotFoundError: boolean; + bucketPermissionError: boolean; + editObjectKey: string; + copyObject: S3Object; + viewDetailKey: string | undefined; +}>({ loading: true, filterString: "", bucketNotFoundError: false, bucketPermissionError: false, - createdPermission: undefined, editObjectKey: "", copyObject: { - key: "", - size: 0, - bucket: "", - last_modified: "2022-01-01", - content_type: "text/plain", - }, - viewDetailObject: { - key: "", - size: 0, - bucket: "", - last_modified: "2022-01-01", - content_type: "text/plain", + Key: "", + Size: 0, + LastModified: new Date(), }, -} as { - objects: S3ObjectMetaInformation[]; - loading: boolean; - filterString: string; - bucketNotFoundError: boolean; - bucketPermissionError: boolean; - createdPermission: undefined | BucketPermissionOut; - editObjectKey: string; - copyObject: S3ObjectMetaInformation; - viewDetailObject: S3ObjectMetaInformation; + viewDetailKey: undefined, }); -// Watcher -// ----------------------------------------------------------------------------- -watch( - () => props.bucketName, - (newBucketName, oldBucketName) => { - if (oldBucketName !== newBucketName) { - // If bucket is changed, update the objects - updateObjects(newBucketName); - } - } -); - // Computed Properties // ----------------------------------------------------------------------------- -const filteredObjects: ComputedRef<(S3ObjectWithFolder | S3PseudoFolder)[]> = - computed(() => { +const filteredObjects = computed<(S3ObjectWithFolder | S3PseudoFolder)[]>( + () => { return objectState.filterString.length > 0 - ? visibleObjects.value.filter((obj) => - obj.key.includes(objectState.filterString) + ? visibleObjects.value.filter( + (obj) => obj.Key?.includes(objectState.filterString), ) : visibleObjects.value; - }); + }, +); -const folderStructure: ComputedRef<FolderTree> = computed(() => { +const s3Objects = computed<S3Object[]>( + () => objectRepository.objectMapping[props.bucketName] ?? [], +); + +const folderStructure = computed<FolderTree>(() => { /** * Store the entire folder structure in a bucket in a tree-like data structure */ @@ -200,7 +107,7 @@ const folderStructure: ComputedRef<FolderTree> = computed(() => { // If the sub folder doesn't exist yet, create it if ( Object.keys(currentFolder.subFolders).find( - (subFolderName) => subFolderName === folderName + (subFolderName) => subFolderName === folderName, ) == undefined ) { currentFolder.subFolders[folderName] = { @@ -220,11 +127,11 @@ const folderStructure: ComputedRef<FolderTree> = computed(() => { { subFolders: {}, files: [], - } as FolderTree + } as FolderTree, ); }); -const objectsWithFolders: ComputedRef<S3ObjectWithFolder[]> = computed(() => { +const objectsWithFolders = computed<S3ObjectWithFolder[]>(() => { /** * Add to the meta information from objects the pseudo filename and their pseudo folder * This can be inferred from the key of the object where the '/' character is the delimiter, e.g. @@ -232,8 +139,8 @@ const objectsWithFolders: ComputedRef<S3ObjectWithFolder[]> = computed(() => { * folder: dir1, dir2 * filename: text.txt */ - return objectState.objects.map((obj) => { - const splittedKey = obj.key.split("/"); + return s3Objects.value.map((obj) => { + const splittedKey = obj.Key?.split("/") ?? [""]; return { ...obj, pseudoFileName: splittedKey[splittedKey.length - 1], @@ -242,7 +149,7 @@ const objectsWithFolders: ComputedRef<S3ObjectWithFolder[]> = computed(() => { }); }); -const currentSubFolders: ComputedRef<string[]> = computed(() => { +const currentSubFolders = computed<string[]>(() => { /** * Transform a single sub folder from a string to an array containing the string and * replace an empty string with an empty list @@ -254,64 +161,116 @@ const currentSubFolders: ComputedRef<string[]> = computed(() => { : []; }); -const visibleObjects: ComputedRef<(S3ObjectWithFolder | S3PseudoFolder)[]> = - computed(() => { - /** - * Compute the visible objects based on the current sub folder - */ - let currentFolder = folderStructure.value; - // Navigate into right sub folder - for (const subFolder of currentSubFolders.value) { - if (currentFolder.subFolders[subFolder] == null) { - // If sub folder doesn't exist, no object is visible - return []; - } else { - currentFolder = currentFolder.subFolders[subFolder]; - } +const visibleObjects = computed<(S3ObjectWithFolder | S3PseudoFolder)[]>(() => { + /** + * Compute the visible objects based on the current sub folder + */ + let currentFolder = folderStructure.value; + // Navigate into right sub folder + for (const subFolder of currentSubFolders.value) { + if (currentFolder.subFolders[subFolder] == null) { + // If sub folder doesn't exist, no object is visible + return []; + } else { + currentFolder = currentFolder.subFolders[subFolder]; } - // Add all objects and sub folders from the current sub folder as visible object - const arr = []; - arr.push(...currentFolder.files); - arr.push( - ...Object.keys(currentFolder.subFolders).map((subFolderName) => { - const folderSize = calculateFolderSize( - currentFolder.subFolders[subFolderName] - ); - const folderLastModified = dayjs( - calculateFolderLastModified(currentFolder.subFolders[subFolderName]) - ).toISOString(); - return { - name: subFolderName, - size: folderSize, - key: subFolderName, - parentFolder: currentSubFolders.value, - last_modified: folderLastModified, - } as S3PseudoFolder; - }) - ); - return arr.filter((obj) => !obj.key.endsWith(".s3keep")); - }); + } + // Add all objects and sub folders from the current sub folder as visible object + const arr = []; + arr.push(...currentFolder.files); + arr.push( + ...Object.keys(currentFolder.subFolders).map((subFolderName) => { + const folderSize = calculateFolderSize( + currentFolder.subFolders[subFolderName], + ); + const folderLastModified = dayjs( + calculateFolderLastModified(currentFolder.subFolders[subFolderName]), + ).toDate(); + return { + name: subFolderName, + Size: folderSize, + Key: subFolderName, + parentFolder: currentSubFolders.value, + LastModified: folderLastModified, + } as S3PseudoFolder; + }), + ); + return arr.filter( + (obj) => !obj.Key?.endsWith("/") && (obj.Key?.length ?? 0) > 0, + ); +}); -const subFolderInUrl: ComputedRef<boolean> = computed( - () => currentSubFolders.value.length > 0 +const subFolderInUrl = computed<boolean>( + () => currentSubFolders.value.length > 0, +); +const errorLoadingObjects = computed<boolean>( + () => objectState.bucketPermissionError || objectState.bucketNotFoundError, ); -const errorLoadingObjects: ComputedRef<boolean> = computed( - () => objectState.bucketPermissionError || objectState.bucketNotFoundError +const writableBucket = computed<boolean>(() => { + // Allow only upload in bucket folder with respect to permission prefix + let prefixWritable = true; + if ( + bucketRepository.ownPermissions[props.bucketName]?.file_prefix != undefined + ) { + prefixWritable = + bucketRepository.ownPermissions[props.bucketName]?.file_prefix === + currentSubFolders.value.join("/") + "/"; + } + return bucketRepository.writableBucket(props.bucketName) && prefixWritable; +}); +const readableBucket = computed<boolean>(() => + bucketRepository.readableBucket(props.bucketName), ); -const writeS3Permission: ComputedRef<boolean> = computed( - () => - props.permission == undefined || props.permission.permission == "READWRITE" +// Watchers +// ----------------------------------------------------------------------------- +watch( + () => props.bucketName, + (newBucketName, oldBucketName) => { + if (oldBucketName !== newBucketName) { + objectState.viewDetailKey = undefined; + // If bucket is changed, update the objects + objectState.bucketPermissionError = false; + objectState.bucketNotFoundError = false; + fetchObjects(); + objectState.filterString = ""; + } + }, +); + +watch( + visibleObjects, + (visObjs) => { + if (visObjs.length > 0) { + // Initialise tooltips after DOM changes + setTimeout(() => { + document + .querySelectorAll("span.date-tooltip") + .forEach((tooltipTriggerEl) => new Tooltip(tooltipTriggerEl)); + }, 500); + } + }, + { flush: "post" }, ); // Lifecycle Hooks // ----------------------------------------------------------------------------- onMounted(() => { - updateObjects(props.bucketName); + let counter = 0; + const onFinally = () => { + counter++; + if (counter > 1) { + fetchObjects(); + } + }; + // wait till s3keys and ownPermissions are available before fetching objects + s3KeyRepository.fetchS3Keys(onFinally); + bucketRepository.fetchOwnPermissions(onFinally); + document .querySelectorAll(".tooltip-container") .forEach( - (tooltipTriggerEl) => new Tooltip(tooltipTriggerEl, { trigger: "hover" }) + (tooltipTriggerEl) => new Tooltip(tooltipTriggerEl, { trigger: "hover" }), ); successToast = new Toast("#successToast-" + randomIDSuffix); }); @@ -325,7 +284,7 @@ onMounted(() => { */ function calculateFolderSize(folder: FolderTree): number { let folderSize = 0; - folderSize += folder.files.reduce((acc, file) => acc + file.size, 0); + folderSize += folder.files.reduce((acc, file) => acc + (file.Size ?? 0), 0); for (const subFolderName of Object.keys(folder.subFolders)) { folderSize += calculateFolderSize(folder.subFolders[subFolderName]); } @@ -340,14 +299,14 @@ function calculateFolderSize(folder: FolderTree): number { function calculateFolderLastModified(folder: FolderTree): string { let lastModified: dayjs.Dayjs; lastModified = folder.files - .map((f) => dayjs(f.last_modified)) + .map((f) => dayjs(f.LastModified)) .reduce( (acc, fileAccessed) => (fileAccessed.isAfter(acc) ? fileAccessed : acc), - dayjs("2000-01-01") + dayjs("2000-01-01"), ); for (const subFolderName of Object.keys(folder.subFolders)) { const lastModifiedSubFolder = dayjs( - calculateFolderLastModified(folder.subFolders[subFolderName]) + calculateFolderLastModified(folder.subFolders[subFolderName]), ); if (lastModifiedSubFolder.isAfter(lastModified)) { lastModified = lastModifiedSubFolder; @@ -357,61 +316,49 @@ function calculateFolderLastModified(folder: FolderTree): string { } /** - * Load the meta information about objects from a bucket - * @param bucketName Name of a bucket + * Fetch object from bucket with loading animation */ -function updateObjects(bucketName: string) { - objectState.bucketNotFoundError = false; - objectState.bucketPermissionError = false; +function fetchObjects() { objectState.loading = true; - ObjectService.objectGetBucketObjects(bucketName) - .then((objs) => { - objectState.objects = objs; + objectState.bucketPermissionError = false; + objectState.bucketNotFoundError = false; + const prefix: string | undefined = + bucketRepository.ownPermissions[props.bucketName]?.file_prefix ?? undefined; + objectRepository + .fetchS3Objects(props.bucketName, prefix, () => { + objectState.loading = false; + objectState.bucketPermissionError = false; + objectState.bucketNotFoundError = false; }) .catch((error) => { - if (error.status === 404) { - objectState.bucketNotFoundError = true; - } else if (error.status == 403) { + if (error.Code == "AccessDenied") { objectState.bucketPermissionError = true; + } else { + objectState.bucketNotFoundError = true; } - }) - .finally(() => { - objectState.loading = false; }); } -function isS3Object( - obj: S3PseudoFolder | S3ObjectWithFolder -): obj is S3ObjectWithFolder { - return (obj as S3ObjectWithFolder).folder !== undefined; -} - /** - * callback function when an object has been uploaded - * @param newObject Uploaded object + * Fetch the meta information about objects from a bucket */ -function objectUploaded(newObject: S3ObjectMetaInformation) { - const index = objectState.objects - .map((obj) => obj.key) - .indexOf(newObject.key); - if (index > -1) { - objectState.objects[index] = newObject; - } else { - objectState.objects.push(newObject); - } +function refreshObjects() { + clearTimeout(refreshTimeout); + refreshTimeout = setTimeout(() => { + fetchObjects(); + }, 500); } -/** - * callback function when an object has been copied - * @param copiedObject Uploaded object - */ -function objectCopied(copiedObject: S3ObjectMetaInformation) { - if (copiedObject.bucket === props.bucketName) { - objectState.objects.push(copiedObject); - } +function isS3Object( + obj: S3PseudoFolder | S3ObjectWithFolder, +): obj is S3ObjectWithFolder { + return (obj as S3ObjectWithFolder).folder !== undefined; } -function deleteObject(key: string) { +function deleteObject(key?: string) { + if (key == undefined) { + return; + } deleteObjectsState.potentialObjectToDelete = key; deleteObjectsState.deleteFolder = false; } @@ -421,23 +368,11 @@ function deleteObject(key: string) { * @param key Key of the Object */ function confirmedDeleteObject(key: string) { - const command = new DeleteObjectCommand({ - Bucket: props.bucketName, - Key: key, + objectRepository.deleteObject(props.bucketName, key).then(() => { + const splittedKey = key.split("/"); + deleteObjectsState.deletedItem = splittedKey[splittedKey.length - 1]; + successToast?.show(); }); - client - .send(command) - .then(() => { - const splittedKey = key.split("/"); - deleteObjectsState.deletedItem = splittedKey[splittedKey.length - 1]; - successToast?.show(); - objectState.objects = objectState.objects.filter( - (obj) => obj.key !== key - ); - }) - .catch((err) => { - console.error(err); - }); } /** @@ -445,16 +380,15 @@ function confirmedDeleteObject(key: string) { * @param key Key of the object * @param bucket Bucket of the object */ -async function downloadObject(key: string, bucket: string) { - const command = new GetObjectCommand({ - Bucket: bucket, - Key: key, - }); - const url = await getSignedUrl(client, command, { expiresIn: 30 }); +async function downloadObject(bucket: string, key?: string) { + if (key == undefined) { + return; + } + const url = await objectRepository.getPresignedUrl(bucket, key); //creating an invisible element const element = document.createElement("a"); element.setAttribute("href", url); - element.setAttribute("target", "_blank"); + element.setAttribute("download", ""); document.body.appendChild(element); element.click(); document.body.removeChild(element); @@ -470,28 +404,12 @@ function deleteFolder(folderPath: string) { * @param folderPath Path to the folder with a trailing "/", e.g. some/path/to/a/folder/ */ function confirmedDeleteFolder(folderPath: string) { - const command = new DeleteObjectsCommand({ - Bucket: props.bucketName, - Delete: { - Objects: objectState.objects - .filter((obj) => obj.key.startsWith(folderPath)) - .map((obj) => { - return { Key: obj.key }; - }), - }, - }); - client - .send(command) + objectRepository + .deleteObjectsWithPrefix(props.bucketName, folderPath) .then(() => { const splittedPath = folderPath.split("/"); deleteObjectsState.deletedItem = splittedPath[splittedPath.length - 2]; successToast?.show(); - objectState.objects = objectState.objects.filter( - (obj) => !obj.key.startsWith(folderPath) - ); - }) - .catch((err) => { - console.error(err); }); } @@ -499,21 +417,6 @@ function getObjectFileName(key: string): string { const splittedKey = key.split("/"); return splittedKey[splittedKey.length - 1]; } - -watch( - visibleObjects, - (visObjs) => { - if (visObjs.length > 0) { - // Initialise tooltips after DOM changes - setTimeout(() => { - document - .querySelectorAll("span.date-tooltip") - .forEach((tooltipTriggerEl) => new Tooltip(tooltipTriggerEl)); - }, 500); - } - }, - { flush: "post" } -); </script> <template> @@ -586,82 +489,88 @@ watch( </nav> <!-- Inputs on top --> <!-- Search bucket text input --> - <div class="row"> - <div class="col-8"> - <div class="input-group mt-2"> + <div class="d-flex justify-content-between align-items-center"> + <div class="flex-grow-1 me-2"> + <div class="input-group rounded shadow-sm"> <span class="input-group-text" id="objects-search-wrapping" - ><bootstrap-icon icon="search" :width="16" :height="16" + ><font-awesome-icon icon="fa-solid fa-magnifying-glass" /></span> <input + id="filterObjectNameInput" type="text" class="form-control" - placeholder="Search Objects" - aria-label="Search Objects" + placeholder="Search Files" + aria-label="Search Files" aria-describedby="objects-search-wrapping" + :disabled="errorLoadingObjects" v-model.trim="objectState.filterString" /> </div> </div> <!-- Upload object button --> - <div id="BucketViewButtons" class="col-auto"> + <div id="BucketViewButtons" class=""> + <button + type="button" + class="btn btn-light me-3 tooltip-container border shadow-sm" + :disabled="errorLoadingObjects" + data-bs-toggle="tooltip" + data-bs-title="Refresh Objects" + @click="refreshObjects" + > + <font-awesome-icon icon="fa-solid fa-arrow-rotate-right" /> + <span class="visually-hidden">Refresh Objects</span> + </button> <button type="button" - class="btn btn-secondary me-2 tooltip-container" - :disabled="errorLoadingObjects || !writeS3Permission" + class="btn btn-light me-2 tooltip-container border shadow-sm" + :disabled="errorLoadingObjects || !writableBucket" data-bs-toggle="modal" - data-bs-title="Upload Object" + data-bs-title="Upload File" data-bs-target="#upload-object-modal" > - <bootstrap-icon icon="upload" :width="16" :height="16" fill="white" /> - <span class="visually-hidden">Upload Object</span> + <font-awesome-icon icon="fa-solid fa-upload" /> + <span class="visually-hidden">Upload File</span> </button> <upload-object-modal :bucket-name="props.bucketName" - :s3-client="client" modalID="upload-object-modal" :key-prefix="currentSubFolders.join('/')" :edit-object-file-name="undefined" - @object-created="objectUploaded" /> <!-- Add folder button --> <button type="button" - class="btn btn-secondary m-2 tooltip-container" - :disabled="errorLoadingObjects || !writeS3Permission" + class="btn btn-light me-3 tooltip-container border shadow-sm" + :disabled="errorLoadingObjects || !writableBucket" data-bs-toggle="modal" data-bs-title="Create Folder" data-bs-target="#create-folder-modal" > - <bootstrap-icon icon="plus-lg" :width="16" :height="16" fill="white" /> + <font-awesome-icon icon="fa-solid fa-plus" /> Folder <span class="visually-hidden">Add Folder</span> </button> <create-folder-modal :bucket-name="props.bucketName" - :s3-client="client" modalID="create-folder-modal" :key-prefix="currentSubFolders.join('/')" - @folder-created="objectUploaded" /> <!-- Add bucket permission button --> <button - :hidden="props.permission != null" + v-if="!authStore.foreignUser" + :hidden="!bucketRepository.permissionFeatureAllowed(props.bucketName)" type="button" - class="btn btn-secondary m-2 tooltip-container" + class="btn btn-light me-2 tooltip-container border shadow-sm" :disabled="errorLoadingObjects" data-bs-toggle="modal" data-bs-title="Create Bucket Permission" data-bs-target="#create-permission-modal" > - <bootstrap-icon - icon="person-plus-fill" - :width="16" - :height="16" - fill="white" - /> + <font-awesome-icon icon="fa-solid fa-user-plus" /> <span class="visually-hidden">Add Bucket Permission</span> </button> <permission-modal + v-if="!authStore.foreignUser" modalID="create-permission-modal" :bucket-name="props.bucketName" :sub-folders="folderStructure" @@ -670,58 +579,67 @@ watch( :readonly="false" :deletable="false" :back-modal-id="undefined" - @permission-created=" - (newPermission) => (objectState.createdPermission = newPermission) - " /> <button - :hidden="props.permission != null" + v-if="!authStore.foreignUser" + :hidden="!bucketRepository.permissionFeatureAllowed(props.bucketName)" type="button" - class="btn btn-secondary m-2 tooltip-container" + class="btn btn-light tooltip-container border shadow-sm" :disabled="errorLoadingObjects" data-bs-title="List Bucket Permission" data-bs-toggle="modal" data-bs-target="#permission-list-modal" > - <bootstrap-icon - icon="person-lines-fill" - :width="16" - :height="16" - fill="white" - /> + <font-awesome-icon icon="fa-solid fa-users-line" /> <span class="visually-hidden">View Bucket Permissions</span> </button> <permission-list-modal - v-if="props.permission == null" + v-if=" + objectState.loading == false && + bucketRepository.ownPermissions[props.bucketName] == undefined && + !authStore.foreignUser + " :bucket-name="props.bucketName" :sub-folders="folderStructure" modalID="permission-list-modal" - :add-permission="objectState.createdPermission" /> </div> </div> <!-- Body --> <div class="pt-3"> <!-- If bucket not found --> - <div v-if="objectState.bucketNotFoundError"> - <p>Bucket not found</p> + <div v-if="objectState.bucketNotFoundError" class="text-center fs-2 mt-5"> + <font-awesome-icon + icon="fa-solid fa-magnifying-glass" + class="mb-3 fs-0" + style="color: var(--bs-secondary)" + /> + <p> + Bucket <i>{{ props.bucketName }}</i> not found + </p> </div> <!-- If no permission for bucket --> - <div v-else-if="objectState.bucketPermissionError"> - <p>No permission for this bucket</p> + <div + v-else-if="objectState.bucketPermissionError" + class="text-center fs-2 mt-5" + > + <font-awesome-icon + icon="fa-solid fa-folder-xmark" + class="mb-3 fs-0" + style="color: var(--bs-secondary)" + /> + <p>You don't have permission for this bucket</p> </div> <!-- Show content of bucket --> <div v-else> <!-- Table header --> - <table - class="table table-dark table-striped table-hover caption-top align-middle" - > + <table class="table table-sm table-hover caption-top align-middle"> <caption> Displaying {{ - objectState.loading ? 0 : visibleObjects.length + objectState.loading ? 0 : filteredObjects.length }} - Objects + Items </caption> <thead> <tr> @@ -752,7 +670,7 @@ watch( </tbody> <!-- Table body when showing objects --> <tbody v-else> - <tr v-for="obj in filteredObjects" :key="obj.key"> + <tr v-for="obj in filteredObjects" :key="obj.Key"> <th scope="row" class="text-truncate"> <!-- Show file name if row is an object --> <div v-if="isS3Object(obj)">{{ obj.pseudoFileName }}</div> @@ -776,12 +694,14 @@ watch( class="date-tooltip" data-bs-toggle="tooltip" :data-bs-title=" - dayjs(obj.last_modified).format('DD.MM.YYYY HH:mm:ss') + dayjs(obj.LastModified).format('DD.MM.YYYY HH:mm:ss') " - >{{ dayjs(obj.last_modified).fromNow() }}</span + >{{ dayjs(obj.LastModified).fromNow() }}</span > </td> - <td>{{ filesize(obj.size) }}</td> + <td> + {{ filesize(obj.Size ?? 0, { base: 2, standard: "jedec" }) }} + </td> <!-- Show buttons with dropdown menu if row is an object --> <td class="text-end"> <div @@ -792,7 +712,8 @@ watch( <button type="button" class="btn btn-secondary" - @click="downloadObject(obj.key, props.bucketName)" + @click="downloadObject(props.bucketName, obj.Key)" + :disabled="!readableBucket" > Download </button> @@ -805,14 +726,14 @@ watch( <span class="visually-hidden">Toggle Dropdown</span> </button> <!-- Dropdown menu --> - <ul class="dropdown-menu dropdown-menu-dark"> + <ul class="dropdown-menu dropdown-menu"> <li> <button class="dropdown-item" type="button" data-bs-toggle="modal" data-bs-target="#detail-object-modal" - @click="objectState.viewDetailObject = obj" + @click="objectState.viewDetailKey = obj.Key" > Details </button> @@ -821,10 +742,10 @@ watch( <button class="dropdown-item" type="button" - :disabled="!writeS3Permission" + :disabled="!writableBucket" data-bs-toggle="modal" data-bs-target="#edit-object-modal" - @click="objectState.editObjectKey = obj.key" + @click="objectState.editObjectKey = obj.Key ?? ''" > Edit </button> @@ -833,7 +754,7 @@ watch( <button class="dropdown-item" type="button" - :disabled="!writeS3Permission" + :disabled="!readableBucket" data-bs-toggle="modal" data-bs-target="#copy-object-modal" @click="objectState.copyObject = obj" @@ -845,18 +766,12 @@ watch( <button class="dropdown-item text-danger align-middle" type="button" - @click="deleteObject(obj.key)" + @click="deleteObject(obj.Key)" data-bs-toggle="modal" data-bs-target="#delete-object-modal" - :disabled="!writeS3Permission" + :disabled="!writableBucket" > - <bootstrap-icon - icon="trash-fill" - class="text-danger" - :width="13" - :height="13" - fill="currentColor" - /> + <font-awesome-icon icon="fa-solid fa-trash" /> <span class="ms-1">Delete</span> </button> </li> @@ -866,23 +781,17 @@ watch( <div v-else> <button type="button" - class="btn btn-danger btn-sm align-middle" - :disabled="!writeS3Permission" + class="btn btn-danger btn-sm align-baseline" + :disabled="!writableBucket" data-bs-toggle="modal" data-bs-target="#delete-object-modal" @click=" deleteFolder( - obj.parentFolder.concat(['']).join('/') + obj.name + '/' + obj.parentFolder.concat(['']).join('/') + obj.name + '/', ) " > - <bootstrap-icon - icon="trash-fill" - class="text-danger me-2" - :width="12" - :height="12" - fill="white" - /> + <font-awesome-icon icon="fa-solid fa-trash" class="me-2" /> <span>Delete</span> </button> </div> @@ -892,21 +801,18 @@ watch( </table> <upload-object-modal :bucket-name="props.bucketName" - :s3-client="client" modalID="edit-object-modal" :key-prefix="currentSubFolders.join('/')" :edit-object-file-name="getObjectFileName(objectState.editObjectKey)" - @object-created="objectUploaded" /> <copy-object-modal - :source-object="objectState.copyObject" - :s3-client="client" + :src-object="objectState.copyObject" + :src-bucket="bucketName" modalID="copy-object-modal" - :available-buckets="props.writableBuckets" - @object-copied="objectCopied" /> <object-detail-modal - :s3-object="objectState.viewDetailObject" + :bucket="bucketName" + :object-key="objectState.viewDetailKey" modalID="detail-object-modal" /> </div> diff --git a/src/views/object-storage/BucketsView.vue b/src/views/object-storage/BucketsView.vue index 572e517740c4dfed915e2292e95ee9ecc22907d3..ab979d2bf0c3db67201ae61bc94b2748831971a7 100644 --- a/src/views/object-storage/BucketsView.vue +++ b/src/views/object-storage/BucketsView.vue @@ -1,107 +1,81 @@ <script setup lang="ts"> -import type { ComputedRef } from "vue"; import { computed, onMounted, reactive } from "vue"; -import type { BucketOut, BucketPermissionOut } from "@/client"; -import { BucketPermissionsService, BucketService } from "@/client"; -import { useRoute, useRouter } from "vue-router"; -import BootstrapIcon from "@/components/BootstrapIcon.vue"; -import CreateBucketModal from "@/components/Modals/CreateBucketModal.vue"; -import DeleteModal from "@/components/Modals/DeleteModal.vue"; -import BucketListItem from "@/components/BucketListItem.vue"; -import { useAuthStore } from "@/stores/auth"; -import { Modal } from "bootstrap"; +import type { BucketOut } from "@/client/s3proxy"; +import { useRouter } from "vue-router"; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import CreateBucketModal from "@/components/object-storage/modals/CreateBucketModal.vue"; +import DeleteModal from "@/components/modals/DeleteModal.vue"; +import BucketListItem from "@/components/object-storage/BucketListItem.vue"; +import { useBucketStore } from "@/stores/buckets"; +import { Modal, Tooltip } from "bootstrap"; +import { useAuthStore } from "@/stores/users"; -const route = useRoute(); const router = useRouter(); +const bucketRepository = useBucketStore(); const authStore = useAuthStore(); -const bucketsState = reactive({ - buckets: [], - permissions: {}, - filterString: "", - potentialDeleteBucketName: "", - loading: true, -} as { - buckets: BucketOut[]; +const props = defineProps<{ + bucketName?: string; +}>(); + +const bucketsState = reactive<{ loading: boolean; filterString: string; - permissions: Record<string, BucketPermissionOut>; potentialDeleteBucketName: string; +}>({ + filterString: "", + potentialDeleteBucketName: "", + loading: true, }); let deleteModal: Modal | null = null; +let refreshTimeout: NodeJS.Timeout | undefined = undefined; function fetchBuckets() { - BucketService.bucketListBuckets() - .then((buckets) => { - bucketsState.buckets = buckets; - }) - .finally(() => { + bucketRepository.fetchOwnPermissions(); + bucketRepository + .fetchBuckets(() => { bucketsState.loading = false; + }) + .then((buckets) => { + buckets + .filter((bucket) => bucket.owner === authStore.currentUID) + .map((bucket) => bucketRepository.fetchBucketPermissions(bucket.name)); }); - if (authStore.user != null) { - BucketPermissionsService.bucketPermissionsListPermissionsPerUser( - authStore.user.uid - ).then((permissions) => { - const new_permissions: Record<string, BucketPermissionOut> = {}; - for (const perm of permissions) { - new_permissions[perm.bucket_name] = perm; - } - bucketsState.permissions = new_permissions; - }); - } } -const writableBuckets: ComputedRef<BucketOut[]> = computed(() => { - return bucketsState.buckets.filter( - (bucket) => - bucketsState.permissions[bucket.name] === undefined || - bucketsState.permissions[bucket.name].permission !== "READ" - ); -}); - -const currentPermission: ComputedRef<BucketPermissionOut | undefined> = - computed(() => { - return bucketsState.permissions[route.params.bucketName as string]; - }); - -const filteredBuckets: ComputedRef<BucketOut[]> = computed(() => { +const filteredBuckets = computed<BucketOut[]>(() => { return bucketsState.filterString.length > 0 - ? bucketsState.buckets.filter((bucket) => - bucket.name.includes(bucketsState.filterString) + ? bucketRepository.buckets.filter((bucket) => + bucket.name.includes(bucketsState.filterString), ) - : bucketsState.buckets; + : bucketRepository.buckets; }); -function addBucket(bucket: BucketOut) { - bucketsState.buckets.push(bucket); - bucketsState.buckets.sort((bucketA, bucketB) => - bucketA.name >= bucketB.name ? 1 : -1 - ); -} - function deleteBucket(bucketName: string) { bucketsState.potentialDeleteBucketName = bucketName; deleteModal?.show(); } function confirmedDeleteBucket(bucketName: string) { - BucketService.bucketDeleteBucket(bucketName, true).then(() => { - bucketDeleted(bucketName); + bucketRepository.deleteBucket(bucketName).then(() => { + router.push({ name: "buckets" }); }); } -function bucketDeleted(bucketName: string) { - if (bucketsState.buckets.map((bucket) => bucket.name).includes(bucketName)) { - router.push({ name: "buckets" }); - } - bucketsState.buckets = bucketsState.buckets.filter( - (bucket) => bucket.name !== bucketName - ); +function refreshBuckets() { + clearTimeout(refreshTimeout); + refreshTimeout = setTimeout(() => { + fetchBuckets(); + }, 500); } onMounted(() => { deleteModal = Modal.getOrCreateInstance("#delete-bucket-modal"); fetchBuckets(); + new Tooltip("#refreshBucketButton"); + if (!authStore.foreignUser) { + new Tooltip("#createBucketButton"); + } }); </script> @@ -114,40 +88,50 @@ onMounted(() => { confirmedDeleteBucket(bucketsState.potentialDeleteBucketName) " /> - <div class="row m-2 border-bottom border-light mt-4"> + <CreateBucketModal + modalID="create-bucket-modal" + v-if="!authStore.foreignUser" + /> + <div class="row m-2 border-bottom"> <div class="col-12"></div> - <h1 class="mb-2 text-light">Buckets</h1> + <h2 class="mb-2">My Data Buckets</h2> </div> <div class="row m-2 mt-4"> <div class="col-3"> <div class="d-flex justify-content-between"> <button type="button" - class="btn btn-light" - @click.stop.prevent="fetchBuckets" + id="refreshBucketButton" + class="btn btn-light border shadow-sm" + data-bs-title="Refresh Data Buckets" + data-bs-toggle="tooltip" + @click="refreshBuckets" > - <bootstrap-icon icon="arrow-clockwise" /> - <span class="visually-hidden">Refresh Buckets</span> + <font-awesome-icon + icon="fa-solid fa-arrow-rotate-right" + class="fs-5" + /> + <span class="visually-hidden">Refresh Data Buckets</span> </button> <button + v-if="!authStore.foreignUser" + id="createBucketButton" type="button" - class="btn btn-light" + class="btn btn-light border shadow-sm" data-bs-toggle="modal" + data-bs-title="Create New Data Bucket" data-bs-target="#create-bucket-modal" > - <bootstrap-icon icon="plus-lg" /> - <span class="visually-hidden">Create Bucket</span> + <font-awesome-icon icon="fa-solid fa-plus" class="fs-5" /> + <span class="visually-hidden">Create New Data Bucket</span> </button> </div> - <create-bucket-modal - modalID="create-bucket-modal" - @bucket-created="addBucket" - /> - <div class="input-group flex-nowrap mt-2"> + <div class="input-group mt-2 rounded shadow-sm"> <span class="input-group-text" id="buckets-search-wrapping" - ><bootstrap-icon icon="search" :width="16" :height="16" + ><font-awesome-icon icon="fa-solid fa-magnifying-glass" /></span> <input + id="filterBucketNameInput" type="text" class="form-control" placeholder="Search Buckets" @@ -163,26 +147,20 @@ onMounted(() => { <bucket-list-item v-for="bucket in filteredBuckets" :key="bucket.name" - :active=" - route.params.bucketName != null && - route.params.bucketName === bucket.name - " + :active="props.bucketName === bucket.name" + :deletable="!authStore.foreignUser" :bucket="bucket" :loading="false" - :permission="bucketsState.permissions[bucket.name]" @delete-bucket="deleteBucket" - @permission-deleted="(bucketName) => bucketDeleted(bucketName)" /> </div> <div v-else class="text-center fs-2 mt-5"> - <bootstrap-icon - icon="search" - class="mb-2" - :width="56" - :height="56" + <font-awesome-icon + icon="fa-solid fa-magnifying-glass" + class="mb-2 fs-0" style="color: var(--bs-secondary)" - fill="currentColor" - /><br /> + /> + <br /> Could not find any Buckets </div> </div> @@ -191,25 +169,36 @@ onMounted(() => { v-for="n in 5" :key="n" :active="false" - :loading="true" - :permission="undefined" + loading + :deletable="false" :bucket="{ name: '', description: '', - created_at: '', + created_at: 0, owner: '', size: 0, num_objects: 0, + owner_constraint: null, }" ></bucket-list-item> </div> </div> </div> <div class="col-9"> - <router-view - :permission="currentPermission" - :writable-buckets="writableBuckets" - ></router-view> + <router-view></router-view> + <div + v-if="router.currentRoute.value.name === 'buckets'" + class="text-center mt-5" + > + <font-awesome-icon + icon="fa-solid fa-hand-pointer" + class="mb-5" + style="color: var(--bs-secondary); font-size: 5em" + /> + <p class="fs-2">Click on a bucket to browse its content</p> + </div> </div> </div> </template> + +<style scoped></style> diff --git a/src/views/object-storage/S3KeyView.vue b/src/views/object-storage/S3KeyView.vue new file mode 100644 index 0000000000000000000000000000000000000000..b0afc9668715d7f703a932d26f7bad0e63c6ed40 --- /dev/null +++ b/src/views/object-storage/S3KeyView.vue @@ -0,0 +1,110 @@ +<script setup lang="ts"> +import type { S3Key } from "@/client/s3proxy"; +import { reactive, watch } from "vue"; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import DeleteModal from "@/components/modals/DeleteModal.vue"; +import { environment } from "@/environment"; +import CopyToClipboardIcon from "@/components/CopyToClipboardIcon.vue"; + +const props = defineProps<{ + s3key: S3Key; + deletable: boolean; + loading: boolean; +}>(); + +const emit = defineEmits<{ + (e: "delete-key", accessKey: string): void; +}>(); + +watch( + () => props.s3key.access_key, + () => { + visibleKeys.secret = false; + }, +); +const visibleKeys = reactive<{ + secret: boolean; + access: boolean; +}>({ + secret: false, + access: true, +}); + +function deleteKeyTrigger() { + if (props.deletable) { + emit("delete-key", props.s3key.access_key); + } +} +</script> + +<template> + <DeleteModal + modalID="delete-key-modal" + :object-name-delete="props.s3key.access_key.slice(0, 5) + '...'" + :back-modal-id="undefined" + @confirm-delete="deleteKeyTrigger" + /> + <h3>S3 Endpoint:</h3> + <div class="fs-4 mb-4">{{ environment.S3_URL }}</div> + <h4>Access Key:</h4> + <div v-if="props.loading" class="placeholder-glow"> + <span class="placeholder col-5 mt-3 mb-2 fs-4"></span><br /> + </div> + <div v-else class="input-group mb-2"> + <span + class="input-group-text cursor-pointer" + @click="visibleKeys.access = !visibleKeys.access" + > + <font-awesome-icon + :icon="visibleKeys.access ? 'fa-solid fa-eye' : 'fa-solid fa-eye-slash'" + /> + </span> + <input + id="s3-access-key" + class="form-control" + :type="visibleKeys.access ? 'text' : 'password'" + :value="props.s3key.access_key" + aria-label="S3 Access Key" + readonly + /> + <span class="input-group-text" id="s3-secret-key-copy" + ><copy-to-clipboard-icon :text="props.s3key.access_key" + /></span> + </div> + <h4>Secret Key:</h4> + <div v-if="props.loading" class="placeholder-glow"> + <span class="placeholder col-7 mt-3 mb-4 fs-4"></span><br /> + </div> + <div v-else class="input-group fs-4 mb-3"> + <span + class="input-group-text cursor-pointer" + @click="visibleKeys.secret = !visibleKeys.secret" + > + <font-awesome-icon + :icon="visibleKeys.secret ? 'fa-solid fa-eye' : 'fa-solid fa-eye-slash'" + /> + </span> + <input + id="s3-secret-key" + class="form-control" + :type="visibleKeys.secret ? 'text' : 'password'" + :value="props.s3key.secret_key" + aria-label="S3 Access Key" + readonly + /> + <span class="input-group-text" id="s3-secret-key-copy" + ><copy-to-clipboard-icon :text="props.s3key.secret_key" + /></span> + </div> + <button + type="button" + class="btn btn-danger fs-5" + :disabled="!props.deletable || props.loading" + data-bs-toggle="modal" + data-bs-target="#delete-key-modal" + > + Delete + </button> +</template> + +<style scoped></style> diff --git a/src/views/object-storage/S3KeysView.vue b/src/views/object-storage/S3KeysView.vue index c2a2d953761595e4ca9aefcf7222f90a2dfea9ff..12218064e3e4ca66cc8c1d832b4fcf47033cf9cd 100644 --- a/src/views/object-storage/S3KeysView.vue +++ b/src/views/object-storage/S3KeysView.vue @@ -1,61 +1,55 @@ <script setup lang="ts"> -import S3KeyView from "@/components/S3KeyView.vue"; -import BootstrapIcon from "@/components/BootstrapIcon.vue"; +import S3KeyView from "@/views/object-storage/S3KeyView.vue"; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; import { reactive, onMounted, computed } from "vue"; -import type { ComputedRef } from "vue"; -import type { S3Key } from "@/client"; -import { KeyService } from "@/client"; -import { useAuthStore } from "@/stores/auth"; -import { Toast } from "bootstrap"; +import { useAuthStore } from "@/stores/users"; +import { Toast, Tooltip } from "bootstrap"; +import { useS3KeyStore } from "@/stores/s3keys"; const authStore = useAuthStore(); - -authStore.$onAction(({ name, args }) => { - if (name === "updateUser") { - refreshKeys(args[0].uid); - } -}); +const keyRepository = useS3KeyStore(); let successToast: Toast | null = null; +let refreshTimeout: NodeJS.Timeout | undefined = undefined; +let addTimeout: NodeJS.Timeout | undefined = undefined; -const keyState = reactive({ - keys: [], - activeKey: 0, - initialLoading: true, - deletedKey: "", -} as { - keys: S3Key[]; +const keyState = reactive<{ activeKey: number; initialLoading: boolean; deletedKey: string; +}>({ + activeKey: 0, + initialLoading: true, + deletedKey: "", }); -const allowKeyDeletion: ComputedRef<boolean> = computed( - () => keyState.keys.length > 1 -); +const allowKeyDeletion = computed<boolean>(() => keyRepository.keys.length > 1); -function refreshKeys(uid: string) { - KeyService.keyGetUserKeys(uid) +function fetchKeys() { + keyRepository + .fetchS3Keys(() => (keyState.initialLoading = false)) .then((keys) => { if (keyState.activeKey >= keys.length) { keyState.activeKey = keys.length - 1; } - keyState.keys = keys; }) - .catch((err) => console.error(err)) - .finally(() => (keyState.initialLoading = false)); + .catch((err) => console.error(err)); +} + +function refreshKeys() { + clearTimeout(refreshTimeout); + refreshTimeout = setTimeout(() => { + fetchKeys(); + }, 500); } function deleteKey(accessKey: string) { - if (allowKeyDeletion.value && authStore.user != null) { - KeyService.keyDeleteUserKey(accessKey, authStore.user.uid) + if (allowKeyDeletion.value && authStore.authenticated) { + keyRepository + .deleteS3Key(accessKey) .then(() => { - keyState.deletedKey = accessKey; keyState.activeKey = 0; - keyState.keys = keyState.keys.filter( - (s3key) => s3key.access_key !== accessKey - ); - authStore.setS3Key(keyState.keys[0]); + keyState.deletedKey = accessKey; successToast?.show(); }) .catch((err) => console.error(err)); @@ -63,23 +57,21 @@ function deleteKey(accessKey: string) { } function createKey() { - if (authStore.user != null) { - KeyService.keyCreateUserKey(authStore.user.uid) - .then((s3key) => { - keyState.keys.push(s3key); - keyState.keys = [...keyState.keys].sort((keyA, keyB) => - keyA.access_key > keyB.access_key ? 1 : -1 - ); - }) - .catch((err) => console.error(err)); - } + clearTimeout(addTimeout); + addTimeout = setTimeout(() => { + if (authStore.authenticated) { + keyRepository.createS3Key().catch((err) => console.error(err)); + } + }, 500); } onMounted(() => { successToast = new Toast("#successKeyToast"); - if (authStore.user != null) { - refreshKeys(authStore.user.uid); + if (authStore.authenticated) { + fetchKeys(); } + new Tooltip("#createS3KeyButton"); + new Tooltip("#refreshS3KeysButton"); }); </script> @@ -95,7 +87,7 @@ onMounted(() => { > <div class="d-flex"> <div class="toast-body"> - Successfully deleted S3 Key {{ keyState.deletedKey }} + Successfully deleted S3 Key {{ keyState.deletedKey.slice(0, 5) }}... </div> <button type="button" @@ -106,23 +98,36 @@ onMounted(() => { </div> </div> </div> - <div class="row m-2 border-bottom border-light mt-4"> + <div class="row m-2 border-bottom mt-4"> <div class="col-12"></div> - <h1 class="mb-2 text-light">S3 Keys</h1> + <h2 class="mb-2">S3 Keys</h2> </div> <div class="row m-2 mt-4"> <div class="col-4"> <div class="d-flex justify-content-between mb-4"> <button type="button" - class="btn btn-light" - @click="refreshKeys(authStore.user?.uid ?? 'impossible')" + class="btn btn-light border shadow-sm" + id="refreshS3KeysButton" + data-bs-title="Refresh S3 Keys" + data-bs-toggle="tooltip" + @click="refreshKeys()" > - <bootstrap-icon icon="arrow-clockwise" /> + <font-awesome-icon + icon="fa-solid fa-arrow-rotate-right" + class="fs-5" + /> <span class="visually-hidden">Refresh S3 Keys</span> </button> - <button type="button" class="btn btn-light" @click="createKey"> - <bootstrap-icon icon="plus-lg" /> + <button + type="button" + class="btn btn-light border shadow-sm" + id="createS3KeyButton" + data-bs-title="Create S3 Key" + data-bs-toggle="tooltip" + @click="createKey" + > + <font-awesome-icon icon="fa-solid fa-plus" class="fs-5" /> <span class="visually-hidden">Create S3 Key</span> </button> </div> @@ -135,29 +140,30 @@ onMounted(() => { class="btn w-100 fs-5 mb-3 btn-secondary disabled placeholder" /> </div> - <div v-else> + <div v-else class="d-grid gap-3"> <button - v-for="(s3key, index) in keyState.keys" + v-for="(s3key, index) in keyRepository.keys" :key="s3key.access_key" - class="btn w-100 fs-5 mb-3" + class="btn fs-5 text-truncate border hover-shadow" type="button" @click="keyState.activeKey = index" :class="{ 'btn-light': keyState.activeKey !== index, 'btn-primary': keyState.activeKey === index, + shadow: keyState.activeKey === index, }" > - {{ s3key.access_key }} + {{ s3key.access_key.slice(0, 5) }}... </button> </div> </div> <div class="col-7 offset-md-1"> <s3-key-view - v-if="keyState.keys.length > 0 || keyState.initialLoading" + v-if="keyRepository.keys.length > 0 || keyState.initialLoading" :s3key=" keyState.initialLoading ? { user: '', access_key: '', secret_key: '' } - : keyState.keys[keyState.activeKey] + : keyRepository.keys[keyState.activeKey] ?? keyRepository.keys[0] " :deletable="allowKeyDeletion" :loading="keyState.initialLoading" diff --git a/src/views/workflows/ArbitraryWorkflowView.vue b/src/views/workflows/ArbitraryWorkflowView.vue new file mode 100644 index 0000000000000000000000000000000000000000..faedb73a65de83a07412979247856226b7bfd29b --- /dev/null +++ b/src/views/workflows/ArbitraryWorkflowView.vue @@ -0,0 +1,240 @@ +<script setup lang="ts"> +import WorkflowDocumentationTabs from "@/components/workflows/WorkflowDocumentationTabs.vue"; +import { onMounted, reactive, ref, watch } from "vue"; +import { GitRepository, requiredRepositoryFiles } from "@/utils/GitRepository"; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; + +import { useRouter } from "vue-router"; +import { Toast } from "bootstrap"; +import { useWorkflowStore } from "@/stores/workflows"; +import type { WorkflowIn } from "@/client/workflow"; +import { useWorkflowExecutionStore } from "@/stores/workflowExecutions"; +import ParameterSchemaFormComponent from "@/components/parameter-schema/ParameterSchemaFormComponent.vue"; + +const props = defineProps<{ + wid: string; +}>(); + +const router = useRouter(); +const workflowStore = useWorkflowStore(); +const executionRepository = useWorkflowExecutionStore(); + +const workflowState = reactive<{ + workflow?: WorkflowIn; + loading: boolean; + changelogMarkdown?: string; + descriptionMarkdown?: string; + usageMarkdown?: string; + outputMarkdown?: string; + parameterSchema?: Record<string, never>; + repo: GitRepository; +}>({ + loading: true, + workflow: undefined, + repo: GitRepository.buildRepository( + "https://github.de/eample/example", + "0123456789abcdef", + ), +}); + +const workflowExecutionState = reactive<{ + loading: boolean; + errorType?: string; +}>({ + loading: false, + errorType: undefined, +}); + +const showDocumentation = ref<boolean>(true); +let errorToast: Toast | null = null; + +function downloadVersionFiles() { + if (workflowState.workflow) { + workflowState.loading = true; + Promise.all( + requiredRepositoryFiles(workflowState.workflow.modes).map((file) => + workflowState.repo.downloadFile(file).then((response) => { + if (file.includes("README")) { + workflowState.descriptionMarkdown = response.data; + } else if (file.includes("CHANGELOG")) { + workflowState.changelogMarkdown = response.data; + } else if (file.includes("usage")) { + workflowState.usageMarkdown = response.data; + } else if (file.includes("output")) { + workflowState.outputMarkdown = response.data; + } else if (file.endsWith("json")) { + workflowState.parameterSchema = response.data; + } + }), + ), + ).finally(() => { + workflowState.loading = false; + }); + } +} + +watch( + () => workflowState.workflow, + (newWorkflow, oldWorkflow) => { + if ( + newWorkflow && + newWorkflow?.git_commit_hash !== oldWorkflow?.git_commit_hash + ) { + workflowState.repo = GitRepository.buildRepository( + newWorkflow.repository_url, + newWorkflow.git_commit_hash, + newWorkflow.token ?? undefined, + ); + downloadVersionFiles(); + } + }, +); + +function startWorkflow( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + parameters: Record<string, any>, + notes?: string, + logs_s3_path?: string, + debug_s3_path?: string, + provenance_s3_path?: string, +) { + if (workflowState.workflow) { + errorToast?.hide(); + workflowExecutionState.loading = true; + executionRepository + .startDevExecution({ + git_commit_hash: workflowState.workflow.git_commit_hash, + parameters: parameters, + logs_s3_path: logs_s3_path ? logs_s3_path : undefined, + debug_s3_path: debug_s3_path ? debug_s3_path : undefined, + provenance_s3_path: provenance_s3_path ? provenance_s3_path : undefined, + repository_url: workflowState.workflow.repository_url, + token: workflowState.workflow.token ?? undefined, + mode: + (workflowState.workflow.modes ?? []).length > 0 + ? { + name: "", + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + entrypoint: workflowState.workflow.modes![0].entrypoint, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + schema_path: workflowState.workflow.modes![0].schema_path, + } + : undefined, + }) + .then(() => { + router.push({ + name: "workflow-executions", + }); + }) + .catch((err) => { + console.error(err); + if (err.body["detail"].includes("workflow execution limit")) { + workflowExecutionState.errorType = "limit"; + } + errorToast?.show(); + }) + .finally(() => { + workflowExecutionState.loading = false; + }); + } +} + +onMounted(() => { + errorToast = new Toast("#arbitraryWorkflowExecutionViewErrorToast"); + workflowStore.getArbitraryWorkflow(props.wid).then((workflow) => { + workflowState.workflow = workflow; + }); +}); +</script> + +<template> + <div class="toast-container position-fixed top-toast end-0 p-3"> + <div + role="alert" + aria-live="assertive" + aria-atomic="true" + class="toast text-bg-danger align-items-center border-0" + data-bs-autohide="true" + id="arbitraryWorkflowExecutionViewErrorToast" + > + <div class="d-flex p-2 justify-content-between align-items-center"> + <div class="toast-body"> + <template v-if="workflowExecutionState.errorType === 'limit'"> + You have too many active workflow executions to start a new one. + </template> + <template v-else> + There was an error with starting the workflow execution. Look in the + console for more information. + </template> + </div> + <button + type="button" + class="btn-close btn-close-white" + data-bs-dismiss="toast" + aria-label="Close" + ></button> + </div> + </div> + </div> + <template v-if="workflowState.workflow"> + <div class="row m-1 border-bottom mb-4"> + <h1 class="mb-2">Arbitrary Workflow</h1> + </div> + <h5> + Git Repository: + <a target="_blank" :href="workflowState.workflow?.repository_url">{{ + workflowState.workflow?.repository_url + }}</a> + </h5> + <h5 :class="{ 'mb-5': workflowState.workflow.modes!.length < 1 }"> + Git Commit Hash: {{ workflowState.workflow?.git_commit_hash }} + </h5> + <template v-if="workflowState.workflow.modes!.length > 0"> + <h5>Entrypoint: {{ workflowState.workflow?.modes?.[0].entrypoint }}</h5> + <h5 class="mb-5"> + Schema File: + {{ workflowState.workflow?.modes?.[0].schema_path }} + </h5> + </template> + <div class="d-flex justify-content-center mb-5" v-if="showDocumentation"> + <a + role="button" + href="#" + class="btn btn-success btn-lg mx-auto fs-4" + :class="{ disabled: !workflowState.parameterSchema }" + @click="showDocumentation = false" + > + <font-awesome-icon icon="fa-solid fa-rocket" class="me-2" /> + <span class="align-middle">Launch</span> + </a> + </div> + <workflow-documentation-tabs + v-if="showDocumentation" + :loading="workflowState.loading" + :output-markdown="workflowState.outputMarkdown" + :usage-markdown="workflowState.usageMarkdown" + :description-markdown="workflowState.descriptionMarkdown" + :changelog-markdown="workflowState.changelogMarkdown" + :parameter-schema="workflowState.parameterSchema" + /> + <parameter-schema-form-component + v-else + :loading="workflowExecutionState.loading" + :schema="workflowState.parameterSchema" + @start-workflow="startWorkflow" + /> + </template> + <template v-else> + <div class="text-center fs-1 mt-5"> + <font-awesome-icon + icon="fa-solid fa-magnifying-glass" + class="my-5 fs-0" + style="color: var(--bs-secondary)" + /> + <p class="my-5">Could not find your workflow.<br />Please re-enter it.</p> + <router-link :to="{ name: 'workflows' }" class="mt-5">Back</router-link> + </div> + </template> +</template> + +<style scoped></style> diff --git a/src/views/workflows/ListWorkflowExecutionsView.vue b/src/views/workflows/ListWorkflowExecutionsView.vue new file mode 100644 index 0000000000000000000000000000000000000000..cbf7b1f06fd45f9af5a399a853ea5a78e7f20db7 --- /dev/null +++ b/src/views/workflows/ListWorkflowExecutionsView.vue @@ -0,0 +1,338 @@ +<script setup lang="ts"> +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import { onMounted, reactive, computed, onUnmounted } from "vue"; +import type { WorkflowExecutionOut } from "@/client/workflow"; +import dayjs from "dayjs"; +import { Tooltip } from "bootstrap"; +import DeleteModal from "@/components/modals/DeleteModal.vue"; +import { useWorkflowStore } from "@/stores/workflows"; +import { useWorkflowExecutionStore } from "@/stores/workflowExecutions"; +import ParameterModal from "@/components/workflows/modals/ParameterModal.vue"; +import { ExponentialBackoff } from "@/utils/BackoffStrategy"; + +const workflowRepository = useWorkflowStore(); +const executionRepository = useWorkflowExecutionStore(); +const backoff = new ExponentialBackoff(); + +let refreshTimeout: NodeJS.Timeout | undefined = undefined; +let pollingTimeout: NodeJS.Timeout | undefined = undefined; + +const executionsState = reactive<{ + loading: boolean; + executionToDelete?: WorkflowExecutionOut; + executionParameters?: string; +}>({ + loading: true, + executionToDelete: undefined, + executionParameters: undefined, +}); + +const statusToColorMapping = { + PENDING: "bg-warning", + SCHEDULED: "bg-warning", + RUNNING: "bg-info", + CANCELED: "bg-danger", + SUCCESS: "bg-success", + ERROR: "bg-danger", +}; + +const statusToIconMapping = { + PENDING: "fa-solid fa-circle-pause", + SCHEDULED: "fa-solid fa-circle-pause", + RUNNING: "fa-solid fa-circle-play", + CANCELED: "fa-solid fa-circle-xmark", + SUCCESS: "fa-solid fa-circle-check", + ERROR: "fa-solid fa-circle-xmark", +}; + +const sortedExecutions = computed<WorkflowExecutionOut[]>(() => { + const tempList = [...executionRepository.executions]; + tempList.sort((a, b) => { + // sort by start time descending + return dayjs.unix(a.start_time).isBefore(dayjs.unix(b.start_time)) ? 1 : -1; + }); + return tempList; +}); + +const deleteModalString = computed<string>(() => { + if (executionsState.executionToDelete === undefined) { + return ""; + } else if ( + !executionsState.executionToDelete.workflow_version_id || + !executionsState.executionToDelete.workflow_id + ) { + return `Workflow Execution from ${dayjs + .unix(executionsState.executionToDelete.start_time) + .format("DD.MM.YYYY HH:mm")}`; + } else { + return `Workflow Execution ${ + workflowRepository.workflowMapping[ + executionsState.executionToDelete.workflow_id + ].name + }@${ + workflowRepository.versionMapping[ + executionsState.executionToDelete.workflow_version_id + ].version + } from ${dayjs + .unix(executionsState.executionToDelete.start_time) + .format("DD.MM.YYYY HH:mm")}`; + } +}); + +// Functions +// ----------------------------------------------------------------------------- +function updateExecutions() { + backoff.reset(); + clearTimeout(pollingTimeout); + executionRepository + .fetchExecutions(() => { + executionsState.loading = false; + }) + .then(() => { + if (runningExecutions.value.length > 0) { + refreshRunningWorkflowExecutionTimer(); + } + }); +} + +function refreshExecutions() { + clearTimeout(refreshTimeout); + refreshTimeout = setTimeout(() => { + updateExecutions(); + }, 500); +} + +function workflowExecutionCancelable(execution: WorkflowExecutionOut): boolean { + return execution.end_time == undefined; +} + +function deleteWorkflowExecution(executionId?: string) { + if (executionId) { + executionRepository.deleteExecution(executionId); + } +} + +function cancelWorkflowExecution(executionId: string) { + executionRepository.cancelExecution(executionId); +} + +const runningExecutions = computed<WorkflowExecutionOut[]>(() => + executionRepository.executions.filter((execution) => + workflowExecutionCancelable(execution), + ), +); + +function refreshRunningWorkflowExecution() { + Promise.all( + runningExecutions.value.map((execution) => + executionRepository.fetchExecution(execution.execution_id), + ), + ); +} + +async function refreshRunningWorkflowExecutionTimer() { + for (const sleep of backoff.generator()) { + await new Promise((resolve) => { + pollingTimeout = setTimeout(resolve, sleep * 1000); + }); + refreshRunningWorkflowExecution(); + } +} + +onMounted(() => { + updateExecutions(); + workflowRepository.fetchWorkflows(); + new Tooltip("#refreshExecutionsButton"); +}); + +onUnmounted(() => { + clearTimeout(pollingTimeout); +}); +</script> + +<template> + <delete-modal + modal-i-d="deleteWorkflowExecutionModal" + :object-name-delete="deleteModalString" + @confirm-delete=" + deleteWorkflowExecution(executionsState.executionToDelete?.execution_id) + " + /> + <parameter-modal + modal-i-d="workflowExecutionParameterModal" + :execution-id="executionsState.executionParameters" + /> + <div + class="row m-2 border-bottom mb-4 justify-content-between align-items-center" + > + <h2 class="mb-2 w-fit">My Workflow Executions</h2> + <div class="w-fit"> + <button + class="btn btn-light me-2 shadow-sm border" + @click="refreshExecutions" + id="refreshExecutionsButton" + data-bs-title="Refresh Workflow Executions" + data-bs-toggle="tooltip" + > + <font-awesome-icon icon="fa-solid fa-arrow-rotate-right" /> + <span class="visually-hidden">Refresh Data Buckets</span> + </button> + <router-link + :to="{ name: 'workflows' }" + class="btn btn-primary shadow-sm border" + >Start Workflow Execution + </router-link> + </div> + </div> + <table class="table table-hover caption-top align-middle"> + <caption> + Displaying + {{ + executionRepository.executions.length + }} + Workflow Execution + </caption> + <thead> + <tr> + <th scope="col">Workflow</th> + <th scope="col">Status</th> + <th scope="col">Started</th> + <th scope="col">Ended</th> + <th scope="col"></th> + </tr> + </thead> + <tbody> + <template v-if="executionsState.loading"> + <tr v-for="n in 5" :key="n"> + <td class="placeholder-glow w-25"> + <span class="placeholder col-6"></span> + </td> + <td class="placeholder-glow" style="width: 15%"> + <span class="placeholder col-4"></span> + </td> + <td class="placeholder-glow" style="width: 15%"> + <span class="placeholder col-6"></span> + </td> + <td class="placeholder-glow" style="width: 15%"> + <span class="placeholder col-6"></span> + </td> + <td class="text-end"> + <div + class="btn-group btn-group-sm dropdown-center dropdown-menu-start" + > + <button type="button" class="btn btn-secondary border" disabled> + Details + </button> + <button + type="button" + class="btn btn-secondary dropdown-toggle dropdown-toggle-split" + disabled + > + <span class="visually-hidden">Toggle Dropdown</span> + </button> + </div> + </td> + </tr> + </template> + <template v-else-if="executionRepository.executions.length > 0"> + <tr v-for="execution in sortedExecutions" :key="execution.execution_id"> + <td> + <router-link + v-if="execution.workflow_id && execution.workflow_version_id" + :to="{ + name: 'workflow-version', + params: { + versionId: execution.workflow_version_id, + workflowId: execution.workflow_id, + }, + }" + > + {{ workflowRepository.getName(execution.workflow_id) }}@{{ + workflowRepository.getName(execution.workflow_version_id) + }} + </router-link> + </td> + <td> + <span + class="rounded-pill py-1 px-2 text-light" + :class="statusToColorMapping[execution.status]" + ><font-awesome-icon + class="me-2" + :icon="statusToIconMapping[execution.status]" + />{{ execution.status }}</span + > + </td> + <td> + {{ dayjs.unix(execution.start_time).format("DD.MM.YYYY HH:mm") }} + </td> + <td> + <template v-if="execution.end_time"> + {{ dayjs.unix(execution.end_time).format("DD.MM.YYYY HH:mm") }} + </template> + <template v-else> -</template> + </td> + <td class="text-end"> + <div + class="btn-group btn-group-sm dropdown-center dropdown-menu-start" + > + <button type="button" class="btn btn-secondary" disabled> + Details + </button> + <button + type="button" + class="btn btn-secondary dropdown-toggle dropdown-toggle-split" + data-bs-toggle="dropdown" + aria-expanded="false" + > + <span class="visually-hidden">Toggle Dropdown</span> + </button> + <ul class="dropdown-menu dropdown-menu"> + <li> + <button + class="dropdown-item align-middle" + type="button" + data-bs-toggle="modal" + data-bs-target="#workflowExecutionParameterModal" + @click=" + executionsState.executionParameters = + execution.execution_id + " + > + <span class="ms-1">Parameters</span> + </button> + </li> + <li v-if="workflowExecutionCancelable(execution)"> + <button + class="dropdown-item text-danger align-middle" + type="button" + @click="cancelWorkflowExecution(execution.execution_id)" + > + <font-awesome-icon icon="fa-solid fa-ban" /> + <span class="ms-1">Cancel</span> + </button> + </li> + <li v-if="!workflowExecutionCancelable(execution)"> + <button + class="dropdown-item text-danger align-middle" + type="button" + data-bs-toggle="modal" + data-bs-target="#deleteWorkflowExecutionModal" + @click="executionsState.executionToDelete = execution" + > + <font-awesome-icon icon="fa-solid fa-trash" /> + <span class="ms-1">Delete</span> + </button> + </li> + </ul> + </div> + </td> + </tr> + </template> + <tr v-else> + <td colspan="6" class="text-center"><i>No workflow executions</i></td> + </tr> + </tbody> + </table> +</template> + +<style scoped></style> diff --git a/src/views/workflows/ListWorkflowsView.vue b/src/views/workflows/ListWorkflowsView.vue new file mode 100644 index 0000000000000000000000000000000000000000..ac39acf8aed4fe2cb96107b67b4bce36ad79274f --- /dev/null +++ b/src/views/workflows/ListWorkflowsView.vue @@ -0,0 +1,211 @@ +<script setup lang="ts"> +import { computed, onMounted, reactive } from "vue"; +import type { WorkflowOut } from "@/client/workflow"; +import WorkflowCard from "@/components/workflows/WorkflowCard.vue"; +import CardTransitionGroup from "@/components/transitions/CardTransitionGroup.vue"; +import dayjs from "dayjs"; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import { environment } from "@/environment"; +import ArbitraryWorkflowModal from "@/components/workflows/modals/ArbitraryWorkflowModal.vue"; +import { useWorkflowStore } from "@/stores/workflows"; + +const workflowRepository = useWorkflowStore(); + +const workflowsState = reactive<{ + loading: boolean; + filterString: string; + sortByAttribute: string; + sortDesc: boolean; +}>({ + loading: true, + filterString: "", + sortByAttribute: "name", + sortDesc: true, +}); + +const filterFunctionMapping: Record< + string, + (a: WorkflowOut, b: WorkflowOut) => boolean +> = { + name: (a: WorkflowOut, b: WorkflowOut) => + workflowsState.sortDesc ? a.name > b.name : a.name < b.name, + release: (a: WorkflowOut, b: WorkflowOut) => { + const a_date = dayjs.unix(a.versions[0].created_at); + const b_date = dayjs.unix(b.versions[0].created_at); + return workflowsState.sortDesc + ? a_date.isBefore(b_date) + : a_date.isAfter(b_date); + }, +}; + +function filterWorkflowByString(workflow: WorkflowOut): boolean { + return workflowsState.filterString.length > 0 + ? workflow.name.includes(workflowsState.filterString) + : true; +} + +function filterWorkflowWithoutVersion(workflow: WorkflowOut): boolean { + return workflow.versions.length > 0; +} + +const processedWorkflows = computed<WorkflowOut[]>(() => { + return [ + ...workflowRepository.workflows.filter( + (workflow) => + filterWorkflowByString(workflow) && + filterWorkflowWithoutVersion(workflow), + ), + ].sort((a, b) => + filterFunctionMapping[workflowsState.sortByAttribute](a, b) ? 1 : -1, + ); +}); + +onMounted(() => { + workflowRepository.fetchWorkflows(() => { + workflowsState.loading = false; + }); +}); +</script> + +<template> + <div class="row m-2 border-bottom mb-4"> + <h2 class="mb-2">Select Workflow</h2> + </div> + <div class="d-flex m-2 mb-3 align-items-center justify-content-between"> + <div class="col-5 me-auto"> + <div class="input-group rounded shadow-sm"> + <span class="input-group-text" id="workflows-search-wrapping" + ><font-awesome-icon icon="fa-solid fa-magnifying-glass" + /></span> + <input + type="text" + id="filterWorkflowInput" + class="form-control" + placeholder="Filter Workflows" + aria-label="Filter Workflows" + aria-describedby="workflows-search-wrapping" + :disabled="workflowsState.loading" + v-model.trim="workflowsState.filterString" + maxlength="20" + /> + </div> + </div> + <span class="fs-5 me-3 text-shadow">Sort Workflows By</span> + <div + class="btn-group btn-group-sm w-fit shadow-sm" + role="group" + aria-label="Basic radio toggle button group" + > + <input + type="radio" + class="btn-check" + name="btnradio" + id="sortName" + autocomplete="off" + checked + v-model="workflowsState.sortByAttribute" + value="name" + /> + <label class="btn btn-outline-secondary" for="sortName" + >Alphabetical</label + > + + <input + type="radio" + class="btn-check" + name="btnradio" + id="sortLatestRelease" + autocomplete="off" + v-model="workflowsState.sortByAttribute" + value="release" + /> + <label class="btn btn-outline-secondary" for="sortLatestRelease" + >Latest Release</label + > + </div> + <font-awesome-icon + :icon=" + workflowsState.sortDesc + ? 'fa-solid fa-arrow-down-wide-short' + : 'fa-solid fa-arrow-up-wide-short' + " + @click="workflowsState.sortDesc = !workflowsState.sortDesc" + class="fs-5 ms-3 cursor-pointer" + /> + </div> + <div v-if="environment.DEV_SYSTEM" class="d-grid gap-2 col-4 mx-auto"> + <button + class="btn btn-success btn-lg fs-3" + role="button" + data-bs-toggle="modal" + data-bs-target="#arbitraryWorkflowModal" + > + Test my Workflow + </button> + <arbitrary-workflow-modal modal-i-d="arbitraryWorkflowModal" /> + </div> + <div v-if="!workflowsState.loading"> + <div + v-if="workflowRepository.workflows.length === 0" + class="text-center fs-2 mt-5" + > + <font-awesome-icon + icon="fa-solid fa-x" + class="my-5 fs-0" + style="color: var(--bs-secondary)" + /> + <p>There are no workflows in the system. Please come again later.</p> + </div> + <div + v-else-if="processedWorkflows.length === 0" + class="text-center fs-2 mt-5" + > + <font-awesome-icon + icon="fa-solid fa-magnifying-glass" + class="my-5 fs-0" + style="color: var(--bs-secondary)" + /> + <p> + Could not find any Workflows containing<br />'{{ + workflowsState.filterString + }}' + </p> + </div> + <CardTransitionGroup + v-else + class="d-flex flex-wrap align-items-center justify-content-between" + > + <workflow-card + v-for="workflow in processedWorkflows" + :key="workflow.workflow_id" + :workflow="workflow" + :loading="false" + /> + </CardTransitionGroup> + </div> + <div + v-else + class="d-flex flex-wrap align-items-center justify-content-between" + > + <workflow-card + v-for="workflow in 4" + :key="workflow" + :workflow="{ + name: '', + short_description: '', + repository_url: '', + workflow_id: '', + versions: [], + developer_id: '', + private: false, + }" + loading + /> + </div> +</template> + +<style scoped> +.text-shadow { + text-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; +} +</style> diff --git a/src/views/workflows/MyWorkflowsView.vue b/src/views/workflows/MyWorkflowsView.vue new file mode 100644 index 0000000000000000000000000000000000000000..2e1ecde8d926ed346ca30ee86bbf85bd76473d54 --- /dev/null +++ b/src/views/workflows/MyWorkflowsView.vue @@ -0,0 +1,172 @@ +<script setup lang="ts"> +import { onMounted, reactive } from "vue"; +import type { WorkflowOut, WorkflowVersion } from "@/client/workflow"; +import { Status } from "@/client/workflow"; +import WorkflowWithVersionsCard from "@/components/workflows/WorkflowWithVersionsCard.vue"; +import CreateWorkflowModal from "@/components/workflows/modals/CreateWorkflowModal.vue"; +import CardTransitionGroup from "@/components/transitions/CardTransitionGroup.vue"; +import UpdateWorkflowModal from "@/components/workflows/modals/UpdateWorkflowModal.vue"; +import DeleteModal from "@/components/modals/DeleteModal.vue"; +import UpdateWorkflowVersionIconModal from "@/components/workflows/modals/UpdateWorkflowVersionIconModal.vue"; +import UpdateWorkflowCredentialsModal from "@/components/workflows/modals/UpdateWorkflowCredentialsModal.vue"; +import { useWorkflowStore } from "@/stores/workflows"; +import { useWorkflowExecutionStore } from "@/stores/workflowExecutions"; + +const workflowRepository = useWorkflowStore(); +const workflowExecutionRepository = useWorkflowExecutionStore(); + +const workflowsState = reactive<{ + loading: boolean; + updateWorkflow: WorkflowOut; + potentialWorkflowDelete?: WorkflowOut; + updateIconVersion: WorkflowVersion; +}>({ + loading: true, + potentialWorkflowDelete: undefined, + updateWorkflow: { + short_description: "", + name: "", + versions: [ + { + version: "1.0.0", + created_at: 0, + git_commit_hash: "", + status: Status.CREATED, + workflow_id: "", + icon_url: "", + modes: [], + }, + ], + repository_url: "", + workflow_id: "", + developer_id: "", + private: false, + }, + updateIconVersion: { + version: "", + workflow_id: "", + git_commit_hash: "", + modes: [], + icon_url: null, + created_at: 0, + status: Status.CREATED, + }, +}); + +function workflowUpdateClicked(workflow: WorkflowOut) { + workflowsState.updateWorkflow = workflow; +} + +function iconUpdateClicked(version: WorkflowVersion) { + workflowsState.updateIconVersion = version; +} + +function workflowDeleteClicked(workflow: WorkflowOut) { + workflowsState.potentialWorkflowDelete = workflow; +} + +function confirmedWorkflowDelete(workflow_id?: string) { + if (workflow_id) { + workflowRepository.deleteWorkflow(workflow_id).finally(() => { + workflowsState.potentialWorkflowDelete = undefined; + }); + } +} + +function updateIconClicked(version: WorkflowVersion) { + workflowsState.updateIconVersion = version; +} + +onMounted(() => { + workflowRepository.fetchOwnWorkflows(() => { + workflowsState.loading = false; + }); + workflowExecutionRepository.fetchExecutionsForDevStatistics(); +}); +</script> + +<template> + <create-workflow-modal modal-i-d="createWorkflowModal" /> + <update-workflow-modal + :workflow="workflowsState.updateWorkflow" + modal-i-d="updateWorkflowModal" + /> + <delete-modal + modal-i-d="deleteWorkflowModal" + :object-name-delete="workflowsState.potentialWorkflowDelete?.name" + @confirm-delete=" + confirmedWorkflowDelete( + workflowsState.potentialWorkflowDelete?.workflow_id, + ) + " + /> + <update-workflow-version-icon-modal + modal-i-d="updateWorkflowVersionIconModal" + :workflow-name=" + workflowRepository.comprehensiveWorkflowMapping[ + workflowsState.updateIconVersion.workflow_id + ]?.name + " + :version="workflowsState.updateIconVersion" + /> + <update-workflow-credentials-modal + :workflow="workflowsState.updateWorkflow" + modal-i-d="updateWorkflowCredentialsModal" + /> + <div + class="row m-2 border-bottom mb-4 justify-content-between align-items-center pb-2" + > + <h2 class="w-fit">My Workflows</h2> + <button + class="btn btn-lg btn-primary w-fit" + data-bs-toggle="modal" + data-bs-target="#createWorkflowModal" + > + Create + </button> + </div> + <div v-if="!workflowsState.loading"> + <card-transition-group + v-if="workflowRepository.ownWorkflows.length > 0" + class="d-flex flex-wrap align-items-center justify-content-between mt-5" + > + <workflow-with-versions-card + v-for="workflow in workflowRepository.ownWorkflows" + :key="workflow.workflow_id" + :workflow="workflow" + :loading="false" + @workflow-update-click="workflowUpdateClicked" + @workflow-update-credentials-click="workflowUpdateClicked" + @workflow-delete-click="workflowDeleteClicked" + @workflow-update-icon-click="iconUpdateClicked" + /> + </card-transition-group> + <div v-else class="text-center mt-5 fs-2"> + There are currently no workflows that you created.<br /> + <a href="#" data-bs-toggle="modal" data-bs-target="#createWorkflowModal" + >Create a new one</a + > + </div> + </div> + <div + v-else + class="d-flex flex-wrap align-items-center justify-content-between mt-5" + > + <workflow-with-versions-card + v-for="n in 4" + :key="n" + :workflow="{ + workflow_id: '', + versions: [], + name: '', + repository_url: '', + short_description: '', + developer_id: '', + private: false, + }" + loading + @workflow-update-icon-click="updateIconClicked" + /> + </div> +</template> +<style scoped></style> diff --git a/src/views/workflows/ReviewWorkflowsView.vue b/src/views/workflows/ReviewWorkflowsView.vue new file mode 100644 index 0000000000000000000000000000000000000000..63ed00942e6f2e04d7c57e76b4a3544de0e07dcd --- /dev/null +++ b/src/views/workflows/ReviewWorkflowsView.vue @@ -0,0 +1,219 @@ +<script setup lang="ts"> +import { onMounted, reactive } from "vue"; +import { Status } from "@/client/workflow"; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import { determineGitIcon } from "@/utils/GitRepository"; +import { sortedVersions } from "@/utils/Workflow"; +import { useWorkflowStore } from "@/stores/workflows"; +import { useAuthStore } from "@/stores/users"; + +const workflowRepository = useWorkflowStore(); +const userRepository = useAuthStore(); + +const workflowsState = reactive<{ + loading: boolean; + versionUpdateLoading: string; +}>({ + loading: true, + versionUpdateLoading: "", +}); + +function updateWorkflowVersionStatus( + workflow_id: string, + git_commit_hash: string, + new_status: Status, +) { + workflowsState.versionUpdateLoading = git_commit_hash; + workflowRepository + .updateVersionStatus(workflow_id, git_commit_hash, new_status) + .finally(() => { + workflowsState.versionUpdateLoading = ""; + }); +} + +onMounted(() => { + workflowRepository + .fetchReviewableWorkflows(() => { + workflowsState.loading = false; + }) + .then((workflows) => workflows.map((workflow) => workflow.developer_id)) + .then(userRepository.fetchUsernames); +}); +</script> + +<template> + <div class="row m-2 border-bottom mb-4"> + <h2 class="mb-2">Workflow Reviews</h2> + </div> + <div v-if="workflowsState.loading" class="text-center mt-5"> + <div class="spinner-border" style="width: 3rem; height: 3rem" role="status"> + <span class="visually-hidden">Loading...</span> + </div> + </div> + <table + class="table table-striped mx-auto" + v-else-if="workflowRepository.reviewableWorkflows.length > 0" + > + <thead class="fs-5"> + <tr> + <th scope="col">Workflow Name</th> + <th scope="col" class="w-50">Description</th> + <th scope="col">Repository</th> + <th scope="col">Developer</th> + </tr> + </thead> + <tbody v-if="!workflowsState.loading"> + <template + v-for="workflow in workflowRepository.reviewableWorkflows" + :key="workflow.workflow_id" + > + <tr> + <td class="text-center">{{ workflow.name }}</td> + <td>{{ workflow.short_description }}</td> + <td> + <a :href="workflow.repository_url" target="_blank"> + <font-awesome-icon + :icon="determineGitIcon(workflow.repository_url)" + /> + {{ workflow.repository_url }} + </a> + </td> + <td v-if="userRepository.userMapping[workflow.developer_id]"> + {{ userRepository.userMapping[workflow.developer_id] }} + </td> + <td v-else class="placeholder-glow"> + <div class="placeholder w-75"></div> + </td> + </tr> + <tr> + <td colspan="4" class="px-5"> + <table class="table mb-0"> + <colgroup> + <col span="1" style="width: 1%" /> + </colgroup> + <tbody class="text-center"> + <tr + v-for="version in sortedVersions(workflow.versions)" + :key="version.git_commit_hash" + > + <td class="text-end"> + <img + v-if="version.icon_url" + :src="version.icon_url" + class="img-fluid" + alt="Workflow Icon" + /> + </td> + <td class="text-start">{{ version.version }}</td> + <td>{{ version.status }}</td> + <td> + <a + :href=" + workflow.repository_url + + '/tree/' + + version.git_commit_hash + " + target="_blank" + > + <font-awesome-icon + :icon="determineGitIcon(workflow.repository_url)" + /> + {{ version.git_commit_hash }} + </a> + </td> + <td>#Modes: {{ version.modes?.length ?? 0 }}</td> + <td> + <router-link + :to="{ + name: 'workflow-version', + params: { + workflowId: workflow.workflow_id, + versionId: version.git_commit_hash, + }, + query: { + developerView: 'true', + workflowModeId: (version.modes ?? [])[0], + }, + }" + > + View + </router-link> + </td> + <td class="text-end"> + <div + v-if=" + workflowsState.versionUpdateLoading === + version.git_commit_hash + " + class="spinner-border text-light spinner-border-sm" + role="status" + > + <span class="visually-hidden">Loading...</span> + </div> + <div v-else-if="version.status === Status.PUBLISHED"> + <font-awesome-icon + icon="fa-solid fa-circle-check" + class="text-success" + /> + </div> + <div v-else-if="version.status === Status.DENIED"> + <font-awesome-icon + icon="fa-solid fa-x" + class="text-danger" + /> + </div> + <div v-else-if="version.status === Status.DEPRECATED"> + <font-awesome-icon + icon="fa-solid fa-archive" + class="text-warning" + /> + </div> + <div v-else class="btn-group"> + <button + type="button" + class="btn btn-success btn-sm" + @click=" + updateWorkflowVersionStatus( + workflow.workflow_id, + version.git_commit_hash, + Status.PUBLISHED, + ) + " + > + Publish + </button> + <button + type="button" + class="btn btn-danger btn-sm" + @click=" + updateWorkflowVersionStatus( + workflow.workflow_id, + version.git_commit_hash, + Status.DENIED, + ) + " + > + Deny + </button> + </div> + </td> + </tr> + </tbody> + </table> + </td> + </tr> + </template> + </tbody> + </table> + <div v-else class="text-center mt-5 fs-4"> + There are currently no workflows to review + </div> +</template> + +<style scoped> +img { + padding: 0 !important; + max-width: 1.2em; + max-height: 1.2em; +} +</style> diff --git a/src/views/workflows/StartWorkflowView.vue b/src/views/workflows/StartWorkflowView.vue new file mode 100644 index 0000000000000000000000000000000000000000..a8d84cb7da764c53a97ec862daf979d21b76a14a --- /dev/null +++ b/src/views/workflows/StartWorkflowView.vue @@ -0,0 +1,148 @@ +<script setup lang="ts"> +import ParameterSchemaFormComponent from "@/components/parameter-schema/ParameterSchemaFormComponent.vue"; +import type { WorkflowVersion } from "@/client/workflow"; +import { + ApiError, + DocumentationEnum, + WorkflowVersionService, +} from "@/client/workflow"; +import { onMounted, ref, reactive, watch } from "vue"; +import { useRouter } from "vue-router"; +import { Toast } from "bootstrap"; +import { useWorkflowExecutionStore } from "@/stores/workflowExecutions"; + +const executionRepository = useWorkflowExecutionStore(); +const props = defineProps<{ + versionId: string; + workflowId: string; + workflowModeId?: string; +}>(); + +const parameterSchema = ref(undefined); +const router = useRouter(); +let errorToast: Toast | null = null; + +const versionState = reactive<{ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + parameterSchema?: Record<string, any>; + workflowVersion?: WorkflowVersion; + loading: boolean; + workflowExecutionError?: string; +}>({ + parameterSchema: undefined, + workflowVersion: undefined, + loading: false, + workflowExecutionError: undefined, +}); + +watch( + () => props.workflowModeId, + (newModeId, oldModeId) => { + if (newModeId !== oldModeId) { + downloadParameterSchema(); + } + }, +); + +function downloadParameterSchema() { + versionState.loading = true; + WorkflowVersionService.workflowVersionDownloadWorkflowDocumentation( + props.workflowId, + props.versionId, + DocumentationEnum.PARAMETER_SCHEMA, + props.workflowModeId, + ) + .then((schema) => { + parameterSchema.value = schema; + }) + .finally(() => { + versionState.loading = false; + }); +} + +function startWorkflow( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + parameters: Record<string, any>, + notes?: string, + logs_s3_path?: string, + debug_s3_path?: string, + provenance_s3_path?: string, +) { + if (props.versionId) { + versionState.workflowExecutionError = undefined; + versionState.loading = true; + executionRepository + .startExecution({ + workflow_version_id: props.versionId, + parameters: parameters, + notes: notes, + logs_s3_path: logs_s3_path?.length ?? 0 > 0 ? logs_s3_path : undefined, + debug_s3_path: + debug_s3_path?.length ?? 0 > 0 ? debug_s3_path : undefined, + provenance_s3_path: + provenance_s3_path?.length ?? 0 > 0 ? provenance_s3_path : undefined, + mode: props.workflowModeId, + }) + .then(() => { + router.push({ + name: "workflow-executions", + }); + }) + .catch((err: ApiError) => { + console.error(err); + if (err.body["detail"].includes("workflow execution limit")) { + versionState.workflowExecutionError = "limit"; + } + errorToast?.show(); + }) + .finally(() => { + versionState.loading = false; + }); + } +} + +onMounted(() => { + errorToast = new Toast("#workflowExecutionViewErrorToast"); + downloadParameterSchema(); +}); +</script> + +<template> + <div class="toast-container position-fixed top-toast end-0 p-3"> + <div + role="alert" + aria-live="assertive" + aria-atomic="true" + class="toast text-bg-danger align-items-center border-0" + data-bs-autohide="true" + id="workflowExecutionViewErrorToast" + > + <div class="d-flex p-2 justify-content-between align-items-center"> + <div class="toast-body"> + <template v-if="versionState.workflowExecutionError === 'limit'"> + You have too many active workflow executions to start a new one. + </template> + <template v-else> + There was an error with starting the workflow execution. Look in the + console for more information. + </template> + </div> + <button + type="button" + class="btn-close btn-close-white" + data-bs-dismiss="toast" + aria-label="Close" + ></button> + </div> + </div> + </div> + <parameter-schema-form-component + :workflow-version-id="versionId" + :schema="parameterSchema" + :loading="versionState.loading" + allow-notes + @start-workflow="startWorkflow" + /> +</template> + +<style scoped></style> diff --git a/src/views/workflows/WorkflowVersionView.vue b/src/views/workflows/WorkflowVersionView.vue new file mode 100644 index 0000000000000000000000000000000000000000..9aadf7b7cee1ee96c9f47510578b5f5d9fad5aaa --- /dev/null +++ b/src/views/workflows/WorkflowVersionView.vue @@ -0,0 +1,148 @@ +<script setup lang="ts"> +import { onMounted, reactive, watch } from "vue"; +import { DocumentationEnum, WorkflowVersionService } from "@/client/workflow"; +import WorkflowDocumentationTabs from "@/components/workflows/WorkflowDocumentationTabs.vue"; + +const props = defineProps<{ + versionId: string; + workflowId: string; + workflowModeId?: string; +}>(); + +const versionState = reactive<{ + loading: boolean; + fileLoading: boolean; + descriptionMarkdown: string; + changelogMarkdown: string; + usageMarkdown: string; + outputMarkdown: string; + errorLoading: boolean; + parameterSchema: Record<string, never>; +}>({ + loading: true, + fileLoading: true, + errorLoading: false, + descriptionMarkdown: "", + changelogMarkdown: "", + usageMarkdown: "", + outputMarkdown: "", + parameterSchema: {}, +}); + +watch( + () => props.versionId, + (newVersionId, oldVersionId) => { + if (newVersionId !== oldVersionId) { + // If bucket is changed, update the objects + downloadVersionFiles(); + } + }, +); + +watch( + () => props.workflowModeId, + (newModeId, oldModeId) => { + if (newModeId !== oldModeId) { + WorkflowVersionService.workflowVersionDownloadWorkflowDocumentation( + props.workflowId, + props.versionId, + DocumentationEnum.PARAMETER_SCHEMA, + newModeId, + ).then((schema) => { + versionState.parameterSchema = schema; + }); + } + }, +); + +function downloadVersionFiles() { + versionState.fileLoading = true; + const descriptionPromise = + WorkflowVersionService.workflowVersionDownloadWorkflowDocumentation( + props.workflowId, + props.versionId, + DocumentationEnum.USAGE, + ) + .then((markdown) => { + versionState.descriptionMarkdown = markdown; + }) + .catch(() => { + versionState.descriptionMarkdown = ""; + }); + const changelogPromise = + WorkflowVersionService.workflowVersionDownloadWorkflowDocumentation( + props.workflowId, + props.versionId, + DocumentationEnum.CHANGELOG, + ) + .then((markdown) => { + versionState.changelogMarkdown = markdown; + }) + .catch(() => { + versionState.changelogMarkdown = ""; + }); + const parameterPromise = + WorkflowVersionService.workflowVersionDownloadWorkflowDocumentation( + props.workflowId, + props.versionId, + DocumentationEnum.PARAMETER_SCHEMA, + props.workflowModeId, + ) + .then((schema) => { + versionState.parameterSchema = schema; + }) + .catch(() => { + versionState.parameterSchema = {}; + }); + const usagePromise = + WorkflowVersionService.workflowVersionDownloadWorkflowDocumentation( + props.workflowId, + props.versionId, + DocumentationEnum.INPUT, + ) + .then((markdown) => { + versionState.usageMarkdown = markdown; + }) + .catch(() => { + versionState.usageMarkdown = ""; + }); + const outputPromise = + WorkflowVersionService.workflowVersionDownloadWorkflowDocumentation( + props.workflowId, + props.versionId, + DocumentationEnum.OUTPUT, + ) + .then((markdown) => { + versionState.outputMarkdown = markdown; + }) + .catch(() => { + versionState.outputMarkdown = ""; + }); + Promise.all([ + descriptionPromise, + changelogPromise, + parameterPromise, + usagePromise, + outputPromise, + ]).finally(() => { + versionState.fileLoading = false; + }); +} + +onMounted(() => { + downloadVersionFiles(); +}); +</script> + +<template> + <workflow-documentation-tabs + :parameter-schema="versionState.parameterSchema" + :loading="versionState.fileLoading" + :changelog-markdown="versionState.changelogMarkdown" + :description-markdown="versionState.descriptionMarkdown" + :usage-markdown="versionState.usageMarkdown" + :output-markdown="versionState.outputMarkdown" + /> +</template> + +<style scoped></style> diff --git a/src/views/workflows/WorkflowView.vue b/src/views/workflows/WorkflowView.vue new file mode 100644 index 0000000000000000000000000000000000000000..2ece0235006271559b4ecc77ba7946f48e5f0a49 --- /dev/null +++ b/src/views/workflows/WorkflowView.vue @@ -0,0 +1,392 @@ +<script setup lang="ts"> +import { computed, onMounted, reactive, watch } from "vue"; +import type { + WorkflowOut, + WorkflowStatistic, + WorkflowVersion, +} from "@/client/workflow"; +import { Status, WorkflowService } from "@/client/workflow"; +import WorkflowStatisticsChart from "@/components/workflows/WorkflowStatisticsChart.vue"; +import { useRoute, useRouter } from "vue-router"; +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import { + latestVersion as calculateLatestVersion, + sortedVersions, +} from "@/utils/Workflow"; +import { determineGitIcon } from "@/utils/GitRepository"; +import { useAuthStore } from "@/stores/users"; +import { useWorkflowStore } from "@/stores/workflows"; + +const workflowRepository = useWorkflowStore(); +const userRepository = useAuthStore(); + +// Props +// ============================================================================= +const props = defineProps<{ + workflowId: string; + versionId?: string; + workflowModeId?: string; + developerView: boolean; +}>(); + +// Constants +// ============================================================================= +const router = useRouter(); +const route = useRoute(); + +// Reactive State +// ============================================================================= +const workflowState = reactive<{ + loading: boolean; + activeVersionId: string; + initialOpen: boolean; + stats: WorkflowStatistic[]; + activeModeId?: string; +}>({ + loading: true, + activeVersionId: props.versionId ?? "", + initialOpen: true, + stats: [], + activeModeId: props.workflowModeId, +}); + +// Watchers +// ============================================================================= +watch( + () => props.workflowId, + (newWorkflowId, oldWorkflowId) => { + if (newWorkflowId !== oldWorkflowId) { + updateWorkflow(newWorkflowId); + } + }, +); + +watch( + () => props.versionId, + (newWorkflowId) => { + workflowState.activeVersionId = newWorkflowId ?? ""; + }, +); + +watch( + () => props.workflowModeId, + (newModeId) => { + if (newModeId) { + workflowState.activeModeId = newModeId; + } + }, +); + +watch( + () => workflowState.activeVersionId, + (newVersionId, oldVersionId) => { + if ( + newVersionId && + newVersionId !== oldVersionId && + route.name !== "workflow-start" + ) { + // If mode does not exist in other version, select another mode + if ( + activeVersionModeIds.value.length > 0 && + activeVersionModeIds.value.findIndex( + (modeId) => modeId === workflowState.activeModeId, + ) == -1 + ) { + workflowState.activeModeId = activeVersionModeIds.value[0]; + } else if (activeVersionModeIds.value.length == 0) { + // If new version does not has any modes, then set mode id to none + workflowState.activeModeId = undefined; + } + router.push({ + name: "workflow-version", + params: { versionId: newVersionId }, + query: { + tab: route.query.tab, + workflowModeId: workflowState.activeModeId, + }, + }); + } + }, +); + +watch( + () => workflowState.activeModeId, + (newModeId, oldModeId) => { + if (newModeId != oldModeId) { + router.push({ + name: route.name ?? undefined, + params: { versionId: workflowState.activeVersionId }, + query: { tab: route.query.tab, workflowModeId: newModeId }, + }); + } + }, +); + +// Computed Properties +// ============================================================================= +const workflow = computed<WorkflowOut | undefined>(() => + props.developerView + ? workflowRepository.comprehensiveWorkflowMapping[props.workflowId] + : workflowRepository.workflowMapping[props.workflowId], +); + +const latestVersion = computed<WorkflowVersion | undefined>(() => + calculateLatestVersion( + workflow.value?.versions?.filter( + (version) => version.status == Status.PUBLISHED, + ) || [], + ), +); +const activeVersion = computed<WorkflowVersion | undefined>( + () => + workflow.value?.versions.find( + (w) => w.git_commit_hash === workflowState.activeVersionId, + ), +); + +const activeVersionModeIds = computed<string[]>( + () => activeVersion.value?.modes ?? [], +); + +const activeVersionString = computed<string>( + () => activeVersion.value?.version ?? "", +); + +const activeVersionIcon = computed<string | undefined>( + () => activeVersion.value?.icon_url ?? undefined, +); + +const versionLaunchable = computed<boolean>( + () => activeVersion.value?.status == Status.PUBLISHED ?? false, +); + +const gitIcon = computed<string>(() => + determineGitIcon(workflow.value?.repository_url), +); + +const allowVersionDeprecation = computed<boolean>(() => { + if (activeVersion.value?.status === Status.PUBLISHED) { + if (userRepository.workflowReviewer || userRepository.admin) { + return true; + } else if ( + userRepository.workflowDev && + workflow.value?.developer_id === userRepository.currentUID + ) { + return true; + } + } + return false; +}); + +// Functions +// ============================================================================= +function updateWorkflow(workflowId: string) { + workflowState.loading = true; + workflowRepository + .fetchWorkflow(props.workflowId, props.developerView, () => { + workflowState.loading = false; + workflowState.initialOpen = false; + }) + .then((workflow) => { + if (!workflowState.initialOpen || !route.params.versionId) { + workflowState.activeVersionId = + workflow.versions[workflow.versions.length - 1].git_commit_hash; + } else { + workflowState.activeVersionId = route.params.versionId as string; + } + workflowState.activeModeId = activeVersionModeIds.value[0] ?? undefined; + }); + + WorkflowService.workflowGetWorkflowStatistics(workflowId).then((stats) => { + workflowState.stats = stats; + }); +} + +function deprecateCurrentWorkflowVersion() { + if (props.versionId) { + workflowRepository.deprecateWorkflowVersion( + props.workflowId, + props.versionId, + ); + } +} + +// Lifecycle Events +// ============================================================================= +onMounted(() => { + updateWorkflow(props.workflowId); +}); +</script> + +<template> + <div v-if="workflowState.loading"> + <div + class="d-flex mt-5 justify-content-between align-items-center placeholder-glow" + > + <span class="fs-0 placeholder col-6"></span> + <span class="fs-0 placeholder col-1"></span> + </div> + <div class="fs-4 mb-5 mt-4 placeholder-glow"> + <span class="placeholder col-10"></span> + </div> + <div class="row align-items-center placeholder-glow my-1"> + <span class="mx-auto col-2 placeholder bg-success fs-0"></span> + <span class="position-absolute end-0 col-1 placeholder fs-2"></span> + </div> + <div class="row w-100 mb-4 mt-3 mx-0 placeholder-glow"> + <span class="placeholder col-3 mx-auto"></span> + </div> + </div> + <div v-else-if="workflow"> + <div class="d-flex justify-content-between align-items-center"> + <h2 class="w-fit"> + {{ workflow.name }} + <span v-if="activeVersionString">@{{ activeVersionString }}</span> + </h2> + <img + v-if="activeVersionIcon != null" + :src="activeVersionIcon" + class="img-fluid icon" + alt="Workflow icon" + /> + </div> + <p class="fs-4 mt-3">{{ workflow.short_description }}</p> + <div + v-if="activeVersionModeIds.length > 0" + class="row align-items-center mb-3 fs-5" + > + <label class="col-sm-1 col-form-label" for="workflowModeSelect" + ><b>Mode:</b></label + > + <div class="col-sm-11"> + <select + id="workflowModeSelect" + class="form-select w-fit" + v-model="workflowState.activeModeId" + > + <option + v-for="modeId of activeVersionModeIds" + :key="modeId" + :value="modeId" + > + {{ workflowRepository.modeMapping[modeId]?.name }} + </option> + </select> + </div> + </div> + <template v-if="route.name !== 'workflow-start'"> + <div + v-if="!versionLaunchable" + class="alert alert-warning w-fit mx-auto" + role="alert" + > + This version can not be used. + <router-link + v-if="latestVersion" + class="alert-link" + :to="{ + name: 'workflow-version', + params: { + versionId: latestVersion.git_commit_hash, + }, + query: { tab: route.query.tab }, + }" + >Try the latest version {{ latestVersion.version }}. + </router-link> + </div> + <div class="row align-items-center"> + <div class="w-fit position-absolute start-0"> + <button + v-if="props.versionId && allowVersionDeprecation" + type="button" + class="btn btn-warning" + @click="deprecateCurrentWorkflowVersion" + > + Deprecate version + </button> + </div> + <router-link + role="button" + class="btn btn-success btn-lg w-fit mx-auto" + :class="{ disabled: !versionLaunchable }" + :to="{ + name: 'workflow-start', + params: { + versionId: props.versionId, + workflowId: props.workflowId, + }, + query: { + workflowModeId: workflowState.activeModeId, + }, + }" + > + <font-awesome-icon icon="fa-solid fa-rocket" class="me-2" /> + <span class="align-middle">Launch {{ activeVersionString }}</span> + </router-link> + <div + v-if="latestVersion" + class="input-group w-fit position-absolute end-0" + > + <span class="input-group-text px-2" id="workflow-version-wrapping" + ><font-awesome-icon icon="fa-solid fa-tags" class="text-secondary" + /></span> + <select + id="workflowVersionSelect" + class="form-select form-select-sm" + aria-label="Workflow version selection" + aria-describedby="workflow-version-wrapping" + v-model="workflowState.activeVersionId" + > + <option + v-for="version in sortedVersions(workflow.versions)" + :key="version.git_commit_hash" + :value="version.git_commit_hash" + > + {{ version.version }} + </option> + </select> + </div> + </div> + <div class="row w-100 mb-4 mt-2 mx-0 border-bottom pb-2"> + <a + :href="workflow.repository_url" + target="_blank" + class="text-secondary text-decoration-none mx-auto w-fit p-0" + > + <font-awesome-icon :icon="gitIcon" class="me-1" /> + <span class="align-middle"> {{ workflow.repository_url }}</span> + <font-awesome-icon + v-if="workflow?.private" + icon="fa-solid fa-lock" + class="ms-1" + /> + </a> + </div> + <workflow-statistics-chart + :stats="workflowState.stats" + v-if="workflowState.stats" + /> + </template> + </div> + <router-view v-if="workflowState.loading || workflow" /> + <div v-else class="text-center fs-1 mt-5"> + <font-awesome-icon + icon="fa-solid fa-magnifying-glass" + class="my-5 fs-0" + style="color: var(--bs-secondary)" + /> + <p class="my-5"> + Could not find any Workflow with ID <br />'{{ workflowId }}' + </p> + <router-link :to="{ name: 'workflows' }" class="mt-5">Back</router-link> + </div> +</template> + +<style scoped> +.icon { + max-width: 64px; + max-height: 64px; + min-width: 50px; + min-height: 50px; +} +</style> diff --git a/tsconfig.json b/tsconfig.json index 0f216f1416aff7a546a0218b93976f2282c8460f..32d333fdaaf1d55c8b026efa8c95a87163d171f1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,18 +1,16 @@ { - "extends": "@vue/tsconfig/tsconfig.web.json", + "extends": [ + "@tsconfig/node18/tsconfig.json", + "@vue/tsconfig/tsconfig.json" + ], "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], "compilerOptions": { "lib": ["...", "dom"], "allowSyntheticDefaultImports": true, "baseUrl": ".", + "types": ["node"], "paths": { "@/*": ["./src/*"] } }, - - "references": [ - { - "path": "./tsconfig.config.json" - } - ] }