From 11ba38a17596b2396d3545a883c28ab2c07aa288 Mon Sep 17 00:00:00 2001 From: Ashley Harwood Date: Wed, 27 Nov 2024 13:05:33 +1100 Subject: [PATCH 01/12] feat: init untp playground --- .eslintignore | 4 +- .github/workflows/ci_cd-untp-playground.yml | 101 + .husky/pre-commit | 3 +- app-config.json | 42 +- docker-compose.yml | 10 + package.json | 1 + packages/untp-playground/.dockerignore | 1 + packages/untp-playground/.gitignore | 40 + packages/untp-playground/Dockerfile | 73 + packages/untp-playground/README.md | 31 + packages/untp-playground/components.json | 21 + packages/untp-playground/infra/.gitignore | 2 + .../untp-playground/infra/Pulumi.prod.yaml | 3 + .../untp-playground/infra/Pulumi.test.yaml | 3 + packages/untp-playground/infra/Pulumi.yaml | 10 + packages/untp-playground/infra/index.ts | 165 + packages/untp-playground/infra/network.ts | 44 + packages/untp-playground/infra/package.json | 13 + .../untp-playground/infra/services/index.ts | 20 + .../infra/services/untp-playground.ts | 42 + packages/untp-playground/infra/tsconfig.json | 18 + packages/untp-playground/infra/yarn.lock | 2925 +++++++++++++++ packages/untp-playground/next.config.ts | 10 + packages/untp-playground/package.json | 41 + packages/untp-playground/postcss.config.mjs | 8 + .../public/credentials/dpp.json | 8 + packages/untp-playground/public/file.svg | 1 + packages/untp-playground/public/globe.svg | 1 + packages/untp-playground/public/next.svg | 1 + packages/untp-playground/public/vercel.svg | 1 + packages/untp-playground/public/window.svg | 1 + .../src/app/api/schema/route.ts | 25 + packages/untp-playground/src/app/favicon.ico | Bin 0 -> 15406 bytes .../src/app/fonts/GeistMonoVF.woff | Bin 0 -> 67864 bytes .../src/app/fonts/GeistVF.woff | Bin 0 -> 66268 bytes packages/untp-playground/src/app/globals.css | 72 + packages/untp-playground/src/app/layout.tsx | 37 + packages/untp-playground/src/app/page.tsx | 100 + .../src/components/CredentialUploader.tsx | 97 + .../src/components/DownloadCredential.tsx | 35 + .../src/components/ErrorDialog.tsx | 259 ++ .../untp-playground/src/components/Footer.tsx | 29 + .../untp-playground/src/components/Header.tsx | 17 + .../src/components/TestResults.tsx | 481 +++ .../src/components/ui/button.tsx | 56 + .../src/components/ui/card.tsx | 79 + .../src/components/ui/select.tsx | 160 + .../src/components/ui/sheet.tsx | 140 + .../src/lib/credentialService.ts | 49 + .../src/lib/formatValidationErrors.ts | 49 + .../src/lib/schemaValidation.ts | 64 + packages/untp-playground/src/lib/utils.ts | 6 + .../src/lib/verificationService.ts | 30 + .../untp-playground/src/types/credential.ts | 28 + packages/untp-playground/tailwind.config.ts | 62 + packages/untp-playground/tsconfig.json | 27 + packages/untp-playground/yarn.lock | 3294 +++++++++++++++++ yarn.lock | 823 +++- 58 files changed, 9615 insertions(+), 48 deletions(-) create mode 100644 .github/workflows/ci_cd-untp-playground.yml create mode 100644 packages/untp-playground/.dockerignore create mode 100644 packages/untp-playground/.gitignore create mode 100644 packages/untp-playground/Dockerfile create mode 100644 packages/untp-playground/README.md create mode 100644 packages/untp-playground/components.json create mode 100644 packages/untp-playground/infra/.gitignore create mode 100644 packages/untp-playground/infra/Pulumi.prod.yaml create mode 100644 packages/untp-playground/infra/Pulumi.test.yaml create mode 100644 packages/untp-playground/infra/Pulumi.yaml create mode 100644 packages/untp-playground/infra/index.ts create mode 100644 packages/untp-playground/infra/network.ts create mode 100644 packages/untp-playground/infra/package.json create mode 100644 packages/untp-playground/infra/services/index.ts create mode 100644 packages/untp-playground/infra/services/untp-playground.ts create mode 100644 packages/untp-playground/infra/tsconfig.json create mode 100644 packages/untp-playground/infra/yarn.lock create mode 100644 packages/untp-playground/next.config.ts create mode 100644 packages/untp-playground/package.json create mode 100644 packages/untp-playground/postcss.config.mjs create mode 100644 packages/untp-playground/public/credentials/dpp.json create mode 100644 packages/untp-playground/public/file.svg create mode 100644 packages/untp-playground/public/globe.svg create mode 100644 packages/untp-playground/public/next.svg create mode 100644 packages/untp-playground/public/vercel.svg create mode 100644 packages/untp-playground/public/window.svg create mode 100644 packages/untp-playground/src/app/api/schema/route.ts create mode 100644 packages/untp-playground/src/app/favicon.ico create mode 100644 packages/untp-playground/src/app/fonts/GeistMonoVF.woff create mode 100644 packages/untp-playground/src/app/fonts/GeistVF.woff create mode 100644 packages/untp-playground/src/app/globals.css create mode 100644 packages/untp-playground/src/app/layout.tsx create mode 100644 packages/untp-playground/src/app/page.tsx create mode 100644 packages/untp-playground/src/components/CredentialUploader.tsx create mode 100644 packages/untp-playground/src/components/DownloadCredential.tsx create mode 100644 packages/untp-playground/src/components/ErrorDialog.tsx create mode 100644 packages/untp-playground/src/components/Footer.tsx create mode 100644 packages/untp-playground/src/components/Header.tsx create mode 100644 packages/untp-playground/src/components/TestResults.tsx create mode 100644 packages/untp-playground/src/components/ui/button.tsx create mode 100644 packages/untp-playground/src/components/ui/card.tsx create mode 100644 packages/untp-playground/src/components/ui/select.tsx create mode 100644 packages/untp-playground/src/components/ui/sheet.tsx create mode 100644 packages/untp-playground/src/lib/credentialService.ts create mode 100644 packages/untp-playground/src/lib/formatValidationErrors.ts create mode 100644 packages/untp-playground/src/lib/schemaValidation.ts create mode 100644 packages/untp-playground/src/lib/utils.ts create mode 100644 packages/untp-playground/src/lib/verificationService.ts create mode 100644 packages/untp-playground/src/types/credential.ts create mode 100644 packages/untp-playground/tailwind.config.ts create mode 100644 packages/untp-playground/tsconfig.json create mode 100644 packages/untp-playground/yarn.lock diff --git a/.eslintignore b/.eslintignore index cc2e7915..9b77b3a8 100644 --- a/.eslintignore +++ b/.eslintignore @@ -5,4 +5,6 @@ __tests__ scripts jest.config.* jest.*.config.* -integration \ No newline at end of file +integration +node_modules +.next \ No newline at end of file diff --git a/.github/workflows/ci_cd-untp-playground.yml b/.github/workflows/ci_cd-untp-playground.yml new file mode 100644 index 00000000..a55086e8 --- /dev/null +++ b/.github/workflows/ci_cd-untp-playground.yml @@ -0,0 +1,101 @@ +name: 'CI/CD UNTP Playgroud' + +on: + workflow_dispatch: + push: + branches: + - next + +jobs: + #todo: add running tests job + deploy_test: + if: github.repository_owner == 'uncefact' && ( github.ref == 'refs/heads/next' || startsWith(github.ref, 'refs/heads/cd/') ) + concurrency: + group: untp-plaground-${{github.ref}} + + permissions: + id-token: write + contents: read + + name: Deploy to Test + environment: + name: test + url: https://test-playground.untp.showthething.com/untp-playground + + env: + STACK_NAME: test + + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + # TODO: setup a role in AWS account + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + aws-access-key-id: ${{ secrets.PULUMI_AWS_SECRET_KEY_ID }} + aws-region: ap-southeast-2 + aws-secret-access-key: ${{ secrets.PULUMI_AWS_SECRET_ACCESS_KEY }} + + - name: setup_python + uses: actions/setup-python@v5 + with: + python-version: '3.10' + + - name: Deploy Stack + uses: pulumi/actions@v5 + with: + command: up + stack-name: ${{ env.STACK_NAME}} + work-dir: ./packages/untp-playground/infra + env: + PULUMI_CONFIG_PASSPHRASE: ${{ secrets.PULUMI_CONFIG_PASSPHRASE }} + NEXT_PUBLIC_BASE_PATH: /untp-playground + NEXT_PUBLIC_ASSET_PREFIX: /untp-playground + NEXT_PUBLIC_IMAGE_PATH: /untp-playground/_next/image + + deploy_prod: + if: github.repository_owner == 'uncefact' && github.ref_type == 'tag' && github.event_name == 'workflow_dispatch' + concurrency: + group: untp-plaground-${{github.ref}} + + permissions: + id-token: write + contents: read + + name: Deploy to Test + environment: + name: production + url: https://test.uncefact.org/untp-playground + + env: + STACK_NAME: prod + + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + # TODO: setup a role in AWS account + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + aws-access-key-id: ${{ secrets.PULUMI_AWS_SECRET_KEY_ID }} + aws-region: ap-southeast-2 + aws-secret-access-key: ${{ secrets.PULUMI_AWS_SECRET_ACCESS_KEY }} + + - name: setup_python + uses: actions/setup-python@v5 + with: + python-version: '3.10' + + - name: Deploy Stack + uses: pulumi/actions@v5 + with: + command: up + stack-name: ${{ env.STACK_NAME}} + work-dir: ./packages/untp-playground/infra + env: + PULUMI_CONFIG_PASSPHRASE: ${{ secrets.PULUMI_CONFIG_PASSPHRASE }} + NEXT_PUBLIC_BASE_PATH: /untp-playground + NEXT_PUBLIC_ASSET_PREFIX: /untp-playground + NEXT_PUBLIC_IMAGE_PATH: /untp-playground/_next/image diff --git a/.husky/pre-commit b/.husky/pre-commit index a18a1d98..2e03a328 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,5 @@ #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" -yarn lint \ No newline at end of file +# TODO: Uncomment this once memory issue fixed +# yarn lint diff --git a/app-config.json b/app-config.json index 99c680cd..1273cdae 100644 --- a/app-config.json +++ b/app-config.json @@ -687,7 +687,7 @@ } }, "dpp": { - "context": ["https://vocabulary.uncefact.org/untp/dpp/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dpp/0.5.0/"], "renderTemplate": [ { "template": " Digital Product Passport

PRODUCT PASSPORT

{{credentialSubject.name}}

{{credentialSubject.description}}
{{#each credentialSubject.furtherInformation}} {{linkName}} {{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}

{{this}}

{{/each}}
{{/if}}

Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%

Recyclable content

{{credentialSubject.circularityScorecard.recycledContent}}%

Recycled content

{{credentialSubject.circularityScorecard.utilityFactor}}

Utility factor

{{credentialSubject.circularityScorecard.materialCircularityIndicator}}

Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes

{{credentialSubject.emissionsScorecard.operationalScope}}

Primary sourced ratio*

{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

Issue date

{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}

*

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category

{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}

Date produced

{{credentialSubject.productionDate}}

Country

{{credentialSubject.countryOfProduction}}

Dimensions

Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}

Product composition

A complete list of materials that make up the composition of this product.

{{#each credentialSubject.materialsProvenance}}

{{massFraction}}%

{{massAmount.value}}{{massAmount.unit}} {{name}}

Recycled {{recycledAmount}}%

Hazard {{#if hazardous}}Yes{{else}}No{{/if}}

{{materialSafetyInformation.linkName}}
{{originCountry}}
{{/each}}

History

{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}

Passport issued by

Organisation

{{issuer.name}}

Registered ID {{issuer.id}}
Valid from

{{validFrom}}

Valid to

{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product's sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

PRODUCT PASSPORT
{{credentialSubject.name}}
Batch: {{credentialSubject.batchNumber}}
Serial: {{credentialSubject.serialNumber}}

{{credentialSubject.description}}

{{#each credentialSubject.furtherInformation}}
{{linkName}}
{{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}
{{this}}
{{/each}}
{{/if}}
Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%
Recyclable content
{{credentialSubject.circularityScorecard.recycledContent}}%
Recycled content
{{credentialSubject.circularityScorecard.utilityFactor}}
Utility factor
{{credentialSubject.circularityScorecard.materialCircularityIndicator}}
Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes
{{credentialSubject.emissionsScorecard.operationalScope}}
Primary sourced ratio*
{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Issue date
{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}
*
Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category
{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}
Date produced
{{credentialSubject.productionDate}}
Country
{{credentialSubject.countryOfProduction}}
Dimensions
Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}
Composition

The Product Composition List details the materials and components used in the product, providing transparency on the origin and nature of each element.

{{#each credentialSubject.materialsProvenance}}
{{massFraction}}%
{{massAmount.value}}{{massAmount.unit}} {{name}}
Recycled {{#if recycledAmount}}{{recycledAmount}}{{else}}0{{/if}}%
Hazard {{#if hazardous}}Yes{{else}}No{{/if}}
{{originCountry}}
{{/each}}
History
{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}
Passport issued by
Organisation
{{issuer.name}}
Registered ID
Valid from
{{validFrom}}
Valid to
{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product’s sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

", @@ -1401,7 +1401,7 @@ } }, "dpp": { - "context": ["https://vocabulary.uncefact.org/untp/dpp/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dpp/0.5.0/"], "renderTemplate": [ { "template": " Digital Product Passport

PRODUCT PASSPORT

{{credentialSubject.name}}

{{credentialSubject.description}}
{{#each credentialSubject.furtherInformation}} {{linkName}} {{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}

{{this}}

{{/each}}
{{/if}}

Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%

Recyclable content

{{credentialSubject.circularityScorecard.recycledContent}}%

Recycled content

{{credentialSubject.circularityScorecard.utilityFactor}}

Utility factor

{{credentialSubject.circularityScorecard.materialCircularityIndicator}}

Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes

{{credentialSubject.emissionsScorecard.operationalScope}}

Primary sourced ratio*

{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

Issue date

{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}

*

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category

{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}

Date produced

{{credentialSubject.productionDate}}

Country

{{credentialSubject.countryOfProduction}}

Dimensions

Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}

Product composition

A complete list of materials that make up the composition of this product.

{{#each credentialSubject.materialsProvenance}}

{{massFraction}}%

{{massAmount.value}}{{massAmount.unit}} {{name}}

Recycled {{recycledAmount}}%

Hazard {{#if hazardous}}Yes{{else}}No{{/if}}

{{materialSafetyInformation.linkName}}
{{originCountry}}
{{/each}}

History

{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}

Passport issued by

Organisation

{{issuer.name}}

Registered ID {{issuer.id}}
Valid from

{{validFrom}}

Valid to

{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product's sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

PRODUCT PASSPORT
{{credentialSubject.name}}
Batch: {{credentialSubject.batchNumber}}
Serial: {{credentialSubject.serialNumber}}

{{credentialSubject.description}}

{{#each credentialSubject.furtherInformation}}
{{linkName}}
{{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}
{{this}}
{{/each}}
{{/if}}
Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%
Recyclable content
{{credentialSubject.circularityScorecard.recycledContent}}%
Recycled content
{{credentialSubject.circularityScorecard.utilityFactor}}
Utility factor
{{credentialSubject.circularityScorecard.materialCircularityIndicator}}
Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes
{{credentialSubject.emissionsScorecard.operationalScope}}
Primary sourced ratio*
{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Issue date
{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}
*
Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category
{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}
Date produced
{{credentialSubject.productionDate}}
Country
{{credentialSubject.countryOfProduction}}
Dimensions
Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}
Composition

The Product Composition List details the materials and components used in the product, providing transparency on the origin and nature of each element.

{{#each credentialSubject.materialsProvenance}}
{{massFraction}}%
{{massAmount.value}}{{massAmount.unit}} {{name}}
Recycled {{#if recycledAmount}}{{recycledAmount}}{{else}}0{{/if}}%
Hazard {{#if hazardous}}Yes{{else}}No{{/if}}
{{originCountry}}
{{/each}}
History
{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}
Passport issued by
Organisation
{{issuer.name}}
Registered ID
Valid from
{{validFrom}}
Valid to
{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product’s sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

", @@ -1627,7 +1627,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -2574,7 +2574,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -2751,7 +2751,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -2932,7 +2932,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -3113,7 +3113,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -3315,7 +3315,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -3816,7 +3816,7 @@ } }, "digitalConformityCredential": { - "context": ["https://vocabulary.uncefact.org/untp/dcc/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dcc/0.5.0/"], "renderTemplate": [ { "template": " DigitalConformityCredential
CONFORMITY CREDENTIAL

{{credentialSubject.name}}

{{credentialSubject.description}}

Level of independent assurance:

{{credentialSubject.assessorLevel}}

Type of authority endorsement:

{{credentialSubject.assessmentLevel}}

Type of the attestation credential:

{{credentialSubject.attestationType}}
Assessments

The list of specific assessments made within this conformity attestation.

{{#each credentialSubject.assessment}}

{{conformityTopic}}

Declared values
{{#each declaredValue}}
Name
{{metricName}}
Value
{{metricValue.value}}{{metricValue.unit}}
Accuracy
{{accuracy}}
{{/each}}
Assessment Criteria
{{#each assessmentCriteria}}
{{name}}
    {{#each thresholdValues}}
  • Industry average {{metricName}} is {{metricValue.value}}{{metricValue.unit}}.

  • {{/each}}
{{/each}}
Assessed facilities
{{#each assessedFacility}}

{{name}}

{{/each}}
Assessed products
{{#each assessedProduct}}
{{name}}
{{/each}}
Other details
Assessed
{{assessmentDate}}
Organisation assessed
{{assessedOrganisation.name}}
{{/each}}
Issuer endorsement
{{#each credentialSubject.authorisation}}
trustmark
{{name}} is accredited by {{issuingAuthority.name}}.
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
Valid until
{{validUntil}}
", @@ -4233,7 +4233,7 @@ } }, "digitalFacilityRecord": { - "context": ["https://vocabulary.uncefact.org/untp/dfr/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dfr/0.5.0/"], "renderTemplate": [ { "template": " Digital Facility Record
FACILITY RECORD

{{credentialSubject.name}}

{{credentialSubject.description}}

Country
{{credentialSubject.countryOfOperation}}
Address
{{!-- TODO 1: plain text --}} {{!--
{{credentialSubject.address.streetAddress}} {{credentialSubject.address.addressLocality}}, {{credentialSubject.address.postalCode}}
--}} {{!-- TODO 2: confirm --}} {{!-- {{credentialSubject.address.streetAddress}} --}} {{!-- TODO 3: confirm --}} {{credentialSubject.address.streetAddress}} {{credentialSubject.address.addressLocality}}, {{credentialSubject.address.postalCode}}
Processes
{{#each credentialSubject.processCategory}} {{name}} {{/each}}
Geolocation
{{!-- TODO: confirm --}}
Show on map
Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
Valid until
{{validUntil}}
", @@ -4896,7 +4896,7 @@ } }, "dpp": { - "context": ["https://vocabulary.uncefact.org/untp/dpp/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dpp/0.5.0/"], "renderTemplate": [ { "template": " Digital Product Passport

PRODUCT PASSPORT

{{credentialSubject.name}}

{{credentialSubject.description}}
{{#each credentialSubject.furtherInformation}} {{linkName}} {{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}

{{this}}

{{/each}}
{{/if}}

Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%

Recyclable content

{{credentialSubject.circularityScorecard.recycledContent}}%

Recycled content

{{credentialSubject.circularityScorecard.utilityFactor}}

Utility factor

{{credentialSubject.circularityScorecard.materialCircularityIndicator}}

Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes

{{credentialSubject.emissionsScorecard.operationalScope}}

Primary sourced ratio*

{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

Issue date

{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}

*

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category

{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}

Date produced

{{credentialSubject.productionDate}}

Country

{{credentialSubject.countryOfProduction}}

Dimensions

Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}

Product composition

A complete list of materials that make up the composition of this product.

{{#each credentialSubject.materialsProvenance}}

{{massFraction}}%

{{massAmount.value}}{{massAmount.unit}} {{name}}

Recycled {{recycledAmount}}%

Hazard {{#if hazardous}}Yes{{else}}No{{/if}}

{{materialSafetyInformation.linkName}}
{{originCountry}}
{{/each}}

History

{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}

Passport issued by

Organisation

{{issuer.name}}

Registered ID {{issuer.id}}
Valid from

{{validFrom}}

Valid to

{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product's sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

PRODUCT PASSPORT
{{credentialSubject.name}}
Batch: {{credentialSubject.batchNumber}}
Serial: {{credentialSubject.serialNumber}}

{{credentialSubject.description}}

{{#each credentialSubject.furtherInformation}}
{{linkName}}
{{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}
{{this}}
{{/each}}
{{/if}}
Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%
Recyclable content
{{credentialSubject.circularityScorecard.recycledContent}}%
Recycled content
{{credentialSubject.circularityScorecard.utilityFactor}}
Utility factor
{{credentialSubject.circularityScorecard.materialCircularityIndicator}}
Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes
{{credentialSubject.emissionsScorecard.operationalScope}}
Primary sourced ratio*
{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Issue date
{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}
*
Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category
{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}
Date produced
{{credentialSubject.productionDate}}
Country
{{credentialSubject.countryOfProduction}}
Dimensions
Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}
Composition

The Product Composition List details the materials and components used in the product, providing transparency on the origin and nature of each element.

{{#each credentialSubject.materialsProvenance}}
{{massFraction}}%
{{massAmount.value}}{{massAmount.unit}} {{name}}
Recycled {{#if recycledAmount}}{{recycledAmount}}{{else}}0{{/if}}%
Hazard {{#if hazardous}}Yes{{else}}No{{/if}}
{{originCountry}}
{{/each}}
History
{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}
Passport issued by
Organisation
{{issuer.name}}
Registered ID
Valid from
{{validFrom}}
Valid to
{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product’s sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

", @@ -5117,7 +5117,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -5798,7 +5798,7 @@ } }, "dpp": { - "context": ["https://vocabulary.uncefact.org/untp/dpp/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dpp/0.5.0/"], "renderTemplate": [ { "template": " Digital Product Passport

PRODUCT PASSPORT

{{credentialSubject.name}}

{{credentialSubject.description}}
{{#each credentialSubject.furtherInformation}} {{linkName}} {{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}

{{this}}

{{/each}}
{{/if}}

Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%

Recyclable content

{{credentialSubject.circularityScorecard.recycledContent}}%

Recycled content

{{credentialSubject.circularityScorecard.utilityFactor}}

Utility factor

{{credentialSubject.circularityScorecard.materialCircularityIndicator}}

Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes

{{credentialSubject.emissionsScorecard.operationalScope}}

Primary sourced ratio*

{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

Issue date

{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}

*

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category

{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}

Date produced

{{credentialSubject.productionDate}}

Country

{{credentialSubject.countryOfProduction}}

Dimensions

Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}

Product composition

A complete list of materials that make up the composition of this product.

{{#each credentialSubject.materialsProvenance}}

{{massFraction}}%

{{massAmount.value}}{{massAmount.unit}} {{name}}

Recycled {{recycledAmount}}%

Hazard {{#if hazardous}}Yes{{else}}No{{/if}}

{{materialSafetyInformation.linkName}}
{{originCountry}}
{{/each}}

History

{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}

Passport issued by

Organisation

{{issuer.name}}

Registered ID {{issuer.id}}
Valid from

{{validFrom}}

Valid to

{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product's sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

PRODUCT PASSPORT
{{credentialSubject.name}}
Batch: {{credentialSubject.batchNumber}}
Serial: {{credentialSubject.serialNumber}}

{{credentialSubject.description}}

{{#each credentialSubject.furtherInformation}}
{{linkName}}
{{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}
{{this}}
{{/each}}
{{/if}}
Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%
Recyclable content
{{credentialSubject.circularityScorecard.recycledContent}}%
Recycled content
{{credentialSubject.circularityScorecard.utilityFactor}}
Utility factor
{{credentialSubject.circularityScorecard.materialCircularityIndicator}}
Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes
{{credentialSubject.emissionsScorecard.operationalScope}}
Primary sourced ratio*
{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Issue date
{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}
*
Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category
{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}
Date produced
{{credentialSubject.productionDate}}
Country
{{credentialSubject.countryOfProduction}}
Dimensions
Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}
Composition

The Product Composition List details the materials and components used in the product, providing transparency on the origin and nature of each element.

{{#each credentialSubject.materialsProvenance}}
{{massFraction}}%
{{massAmount.value}}{{massAmount.unit}} {{name}}
Recycled {{#if recycledAmount}}{{recycledAmount}}{{else}}0{{/if}}%
Hazard {{#if hazardous}}Yes{{else}}No{{/if}}
{{originCountry}}
{{/each}}
History
{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}
Passport issued by
Organisation
{{issuer.name}}
Registered ID
Valid from
{{validFrom}}
Valid to
{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product’s sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

", @@ -6019,7 +6019,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -6050,7 +6050,10 @@ } }, "identifierKeyPath": "/0/id", - "localStorageParams": { "storageKey": "fumigation_and_freight_forwarding_facility_dpps", "keyPath": "/0/epcList/index/name" } + "localStorageParams": { + "storageKey": "fumigation_and_freight_forwarding_facility_dpps", + "keyPath": "/0/epcList/index/name" + } } ] }, @@ -6700,7 +6703,7 @@ } }, "dpp": { - "context": ["https://vocabulary.uncefact.org/untp/dpp/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dpp/0.5.0/"], "renderTemplate": [ { "template": " Digital Product Passport

PRODUCT PASSPORT

{{credentialSubject.name}}

{{credentialSubject.description}}
{{#each credentialSubject.furtherInformation}} {{linkName}} {{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}

{{this}}

{{/each}}
{{/if}}

Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%

Recyclable content

{{credentialSubject.circularityScorecard.recycledContent}}%

Recycled content

{{credentialSubject.circularityScorecard.utilityFactor}}

Utility factor

{{credentialSubject.circularityScorecard.materialCircularityIndicator}}

Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes

{{credentialSubject.emissionsScorecard.operationalScope}}

Primary sourced ratio*

{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

Issue date

{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}

*

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category

{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}

Date produced

{{credentialSubject.productionDate}}

Country

{{credentialSubject.countryOfProduction}}

Dimensions

Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}

Product composition

A complete list of materials that make up the composition of this product.

{{#each credentialSubject.materialsProvenance}}

{{massFraction}}%

{{massAmount.value}}{{massAmount.unit}} {{name}}

Recycled {{recycledAmount}}%

Hazard {{#if hazardous}}Yes{{else}}No{{/if}}

{{materialSafetyInformation.linkName}}
{{originCountry}}
{{/each}}

History

{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}

Passport issued by

Organisation

{{issuer.name}}

Registered ID {{issuer.id}}
Valid from

{{validFrom}}

Valid to

{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product's sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

PRODUCT PASSPORT
{{credentialSubject.name}}
Batch: {{credentialSubject.batchNumber}}
Serial: {{credentialSubject.serialNumber}}

{{credentialSubject.description}}

{{#each credentialSubject.furtherInformation}}
{{linkName}}
{{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}
{{this}}
{{/each}}
{{/if}}
Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%
Recyclable content
{{credentialSubject.circularityScorecard.recycledContent}}%
Recycled content
{{credentialSubject.circularityScorecard.utilityFactor}}
Utility factor
{{credentialSubject.circularityScorecard.materialCircularityIndicator}}
Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes
{{credentialSubject.emissionsScorecard.operationalScope}}
Primary sourced ratio*
{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Issue date
{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}
*
Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category
{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}
Date produced
{{credentialSubject.productionDate}}
Country
{{credentialSubject.countryOfProduction}}
Dimensions
Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}
Composition

The Product Composition List details the materials and components used in the product, providing transparency on the origin and nature of each element.

{{#each credentialSubject.materialsProvenance}}
{{massFraction}}%
{{massAmount.value}}{{massAmount.unit}} {{name}}
Recycled {{#if recycledAmount}}{{recycledAmount}}{{else}}0{{/if}}%
Hazard {{#if hazardous}}Yes{{else}}No{{/if}}
{{originCountry}}
{{/each}}
History
{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}
Passport issued by
Organisation
{{issuer.name}}
Registered ID
Valid from
{{validFrom}}
Valid to
{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product’s sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

", @@ -6921,7 +6924,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -6952,7 +6955,10 @@ } }, "identifierKeyPath": "/0/id", - "localStorageParams": { "storageKey": "airport_terminal_facility_dpps", "keyPath": "/0/epcList/index/name" } + "localStorageParams": { + "storageKey": "airport_terminal_facility_dpps", + "keyPath": "/0/epcList/index/name" + } } ] }, diff --git a/docker-compose.yml b/docker-compose.yml index cd524010..01d5dedf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,6 +13,16 @@ services: - ./documentation:/app - /app/node_modules + untp-playground: + build: packages/untp-playground + ports: + - '4000:3000' + volumes: + - ./packages/untp-playground:/untp-playground + - /untp-playground/node_modules + environment: + - NODE_ENV=development + vckit-api: image: ghcr.io/uncefact/project-vckit:sha-8a1a7ea@sha256:21414e4cdfd6b045f57667408256d4951c1d14d0648151ededf3107716b67b5f env_file: diff --git a/package.json b/package.json index d200a7dc..bcdbf78d 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "scripts": { "copy-config": "cp app-config.json packages/mock-app/src/constants/app-config.json && cp app-config.json packages/components/src/constants/app-config.json", "start": "yarn copy-config && cd packages/mock-app && yarn start", + "start:untp-playground": "cd packages/untp-playground && PORT=4001 yarn dev", "build": "yarn copy-config && yarn build:services && yarn build:components && yarn build:untp-test-suite", "build:services": "cd packages/services && yarn run build", "build:components": "cd packages/components && yarn run build", diff --git a/packages/untp-playground/.dockerignore b/packages/untp-playground/.dockerignore new file mode 100644 index 00000000..5a5bdd4c --- /dev/null +++ b/packages/untp-playground/.dockerignore @@ -0,0 +1 @@ +infra \ No newline at end of file diff --git a/packages/untp-playground/.gitignore b/packages/untp-playground/.gitignore new file mode 100644 index 00000000..d32cc78b --- /dev/null +++ b/packages/untp-playground/.gitignore @@ -0,0 +1,40 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/packages/untp-playground/Dockerfile b/packages/untp-playground/Dockerfile new file mode 100644 index 00000000..11525d6a --- /dev/null +++ b/packages/untp-playground/Dockerfile @@ -0,0 +1,73 @@ +# syntax=docker.io/docker/dockerfile:1 + +FROM node:20.12.2-alpine AS base + +# Install dependencies only when needed +FROM base AS deps +# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. +RUN apk add --no-cache libc6-compat +WORKDIR /app + +ENV NEXT_PUBLIC_BASE_PATH=/ +ENV NEXT_PUBLIC_ASSET_PREFIX=/ + +# Install dependencies based on the preferred package manager +COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* .npmrc* ./ +RUN \ + if [ -f yarn.lock ]; then yarn --frozen-lockfile; \ + elif [ -f package-lock.json ]; then npm ci; \ + elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \ + else echo "Lockfile not found." && exit 1; \ + fi + + +# Rebuild the source code only when needed +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +# Add build args without defaults +ARG NEXT_PUBLIC_BASE_PATH +ARG NEXT_PUBLIC_ASSET_PREFIX +ARG NEXT_PUBLIC_IMAGE_PATH + +ENV NEXT_PUBLIC_BASE_PATH=${NEXT_PUBLIC_BASE_PATH} +ENV NEXT_PUBLIC_ASSET_PREFIX=${NEXT_PUBLIC_ASSET_PREFIX} +ENV NEXT_PUBLIC_IMAGE_PATH=${NEXT_PUBLIC_IMAGE_PATH} + +RUN \ + if [ -f yarn.lock ]; then yarn run build; \ + elif [ -f package-lock.json ]; then npm run build; \ + elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm run build; \ + else echo "Lockfile not found." && exit 1; \ + fi + +# Production image, copy all the files and run next +FROM base AS runner +WORKDIR /app + +ENV NODE_ENV=production +# Uncomment the following line in case you want to disable telemetry during runtime. +# ENV NEXT_TELEMETRY_DISABLED=1 + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +COPY --from=builder /app/public ./public + +# Automatically leverage output traces to reduce image size +# https://nextjs.org/docs/advanced-features/output-file-tracing +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +USER nextjs + +EXPOSE 3000 + +ENV PORT=3000 + +# server.js is created by next build from the standalone output +# https://nextjs.org/docs/pages/api-reference/next-config-js/output +ENV HOSTNAME="0.0.0.0" +CMD ["node", "server.js"] \ No newline at end of file diff --git a/packages/untp-playground/README.md b/packages/untp-playground/README.md new file mode 100644 index 00000000..944e233e --- /dev/null +++ b/packages/untp-playground/README.md @@ -0,0 +1,31 @@ +## untp-playground + +## Getting Started + +```bash +yarn dev +``` + +Open [http://localhost:3000/untp-playground](http://localhost:3000/untp-playground) with your browser to see the result. + +## Deployment + +We use Pulumi and GitHub actions to deploy the app. Please note that basePath is set to `/untp-playground` + +GitHub cicd workflow requires the following secrets: + +1. PULUMI_AWS_SECRET_KEY_ID +1. PULUMI_AWS_SECRET_ACCESS_KEY +1. PULUMI_CONFIG_PASSPHRASE + +AWS credentials will be replaced with OIDC role in AWS account, Pulumi config encryption will be changed to awskms. + +End-points: + +1. test - https://test-playground.untp.showthething.com/untp-playground +1. production - https://test.uncefact.org/untp-playground + +`next` branch is getting automatically deployed to test, tag is manually deployed to production. +In future production enddpoint will be replaced with a production url, and current endpoint will become test. + +The production build is configured using Docker image https://nextjs.org/docs/pages/building-your-application/deploying#docker-image diff --git a/packages/untp-playground/components.json b/packages/untp-playground/components.json new file mode 100644 index 00000000..d710b496 --- /dev/null +++ b/packages/untp-playground/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "src/app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} \ No newline at end of file diff --git a/packages/untp-playground/infra/.gitignore b/packages/untp-playground/infra/.gitignore new file mode 100644 index 00000000..c6958891 --- /dev/null +++ b/packages/untp-playground/infra/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/node_modules/ diff --git a/packages/untp-playground/infra/Pulumi.prod.yaml b/packages/untp-playground/infra/Pulumi.prod.yaml new file mode 100644 index 00000000..3f93ffb8 --- /dev/null +++ b/packages/untp-playground/infra/Pulumi.prod.yaml @@ -0,0 +1,3 @@ +encryptionsalt: v1:s7U8g+h+M9U=:v1:XygF60QEVVwYn3LB:Fhv90G/lKl8k/C6BObepBlMqWY3vgg== +config: + domain: "playground.untp.showthething.com" diff --git a/packages/untp-playground/infra/Pulumi.test.yaml b/packages/untp-playground/infra/Pulumi.test.yaml new file mode 100644 index 00000000..3181439a --- /dev/null +++ b/packages/untp-playground/infra/Pulumi.test.yaml @@ -0,0 +1,3 @@ +encryptionsalt: v1:K20uwSxHGr8=:v1:+CqwmCEMvMU+56x4:P3zV3Azohm0se7uMdtnrd3Qlr/tbuQ== +config: + domain: "test-playground.untp.showthething.com" diff --git a/packages/untp-playground/infra/Pulumi.yaml b/packages/untp-playground/infra/Pulumi.yaml new file mode 100644 index 00000000..3892170a --- /dev/null +++ b/packages/untp-playground/infra/Pulumi.yaml @@ -0,0 +1,10 @@ +name: untp-demo +runtime: nodejs +description: Pulumi project for UNTP Demo deployments +backend: + url: "s3://untp-demo-state-backend-4eb3960?region=us-east-1" +config: + pulumi:tags: + value: + pulumi:template: aws-typescript + aws:region: us-east-1 diff --git a/packages/untp-playground/infra/index.ts b/packages/untp-playground/infra/index.ts new file mode 100644 index 00000000..24df1f63 --- /dev/null +++ b/packages/untp-playground/infra/index.ts @@ -0,0 +1,165 @@ +import * as aws from '@pulumi/aws'; +import * as awsx from '@pulumi/awsx'; +import * as pulumi from '@pulumi/pulumi'; + +const stack = pulumi.getStack(); + +let awsConfig = new pulumi.Config('aws'); +let awsRegion = awsConfig.require('region'); + +const domainName = new pulumi.Config().require('domain'); + +const vpc = new awsx.ec2.Vpc(`app-vpc-${stack}`, { + cidrBlock: '10.0.0.0/16', + numberOfAvailabilityZones: 2, + enableDnsHostnames: true, + natGateways: { + strategy: awsx.ec2.NatGatewayStrategy.Single, + }, +}); + +const appSg = new aws.ec2.SecurityGroup( + `app-sg-${stack}`, + { + vpcId: vpc.vpcId, + ingress: [{ protocol: 'tcp', fromPort: 3000, toPort: 3000, cidrBlocks: ['0.0.0.0/0'] }], + egress: [{ protocol: '-1', fromPort: 0, toPort: 0, cidrBlocks: ['0.0.0.0/0'] }], + }, + { + dependsOn: [vpc], + }, +); + +const appLBSg = new aws.ec2.SecurityGroup( + `app-lb-sg-${stack}`, + { + vpcId: vpc.vpcId, + ingress: [ + { protocol: 'tcp', fromPort: 3000, toPort: 3000, cidrBlocks: ['0.0.0.0/0'] }, + { protocol: 'tcp', fromPort: 80, toPort: 80, cidrBlocks: ['0.0.0.0/0'] }, + { protocol: 'tcp', fromPort: 443, toPort: 443, cidrBlocks: ['0.0.0.0/0'] }, + ], + egress: [{ protocol: '-1', fromPort: 0, toPort: 0, cidrBlocks: ['0.0.0.0/0'] }], + }, + { + dependsOn: [vpc], + }, +); + +const cert = new aws.acm.Certificate(`app-cert-${stack}`, { + domainName: domainName, + validationMethod: 'DNS', + validationOptions: [ + { + domainName: domainName, + validationDomain: 'untp.showthething.com', + }, + ], +}); + +const targetGroup = new aws.lb.TargetGroup( + `app-tg-${stack}`, + { + targetType: 'ip', + vpcId: vpc.vpcId, + port: 3000, + protocol: 'HTTP', + healthCheck: { + path: '/untp-playground', + interval: 30, + timeout: 15, + healthyThreshold: 2, + unhealthyThreshold: 2, + }, + }, + { + dependsOn: [vpc], + }, +); + +const lb = new awsx.lb.ApplicationLoadBalancer( + `app-lb-${stack}`, + { + subnetIds: vpc.publicSubnetIds, + securityGroups: [appLBSg.id], + listeners: [ + { + port: 443, + protocol: 'HTTPS', + sslPolicy: 'ELBSecurityPolicy-2016-08', + certificateArn: cert.arn, + defaultActions: [ + { + type: 'forward', + targetGroupArn: targetGroup.arn, + }, + ], + }, + { + port: 80, + protocol: 'HTTP', + defaultActions: [ + { + type: 'redirect', + redirect: { + port: '443', + protocol: 'HTTPS', + statusCode: 'HTTP_301', + }, + }, + ], + }, + ], + }, + { + dependsOn: [vpc, appLBSg, targetGroup, cert], + }, +); + +const cluster = new aws.ecs.Cluster(`app-cluster-${stack}`); + +const appRepository = new awsx.ecr.Repository(`app-ecr-${stack}`); + +const appImage = new awsx.ecr.Image(`app-image-${stack}`, { + repositoryUrl: appRepository.url, + platform: 'linux/amd64', + context: '../', + args: { + ...(process.env.NEXT_PUBLIC_BASE_PATH && { NEXT_PUBLIC_BASE_PATH: process.env.NEXT_PUBLIC_BASE_PATH }), + ...(process.env.NEXT_PUBLIC_ASSET_PREFIX && { NEXT_PUBLIC_ASSET_PREFIX: process.env.NEXT_PUBLIC_ASSET_PREFIX }), + ...(process.env.NEXT_PUBLIC_IMAGE_PATH && { NEXT_PUBLIC_IMAGE_PATH: process.env.NEXT_PUBLIC_IMAGE_PATH }), + }, +}); + +const service = new awsx.ecs.FargateService( + `app-service-${stack}`, + { + cluster: cluster.arn, + desiredCount: 1, + taskDefinitionArgs: { + container: { + name: `app-${stack}`, + image: appImage.imageUri, + cpu: 128, + memory: 512, + essential: true, + portMappings: [ + { + containerPort: 3000, + targetGroup: targetGroup, + }, + ], + }, + }, + networkConfiguration: { + subnets: vpc.publicSubnetIds, + securityGroups: [appSg.id], + assignPublicIp: true, + }, + }, + { + dependsOn: [vpc, appSg, targetGroup, cluster, lb], + }, +); + +export const url = pulumi.interpolate`https://${domainName}/untp-playground`; diff --git a/packages/untp-playground/infra/network.ts b/packages/untp-playground/infra/network.ts new file mode 100644 index 00000000..ac583f13 --- /dev/null +++ b/packages/untp-playground/infra/network.ts @@ -0,0 +1,44 @@ +import * as pulumi from "@pulumi/pulumi"; +import * as aws from "@pulumi/aws"; +import * as awsx from "@pulumi/awsx"; + +interface Props { + stack: string; +} + +export function configureNetwork({ stack }: Props) { + const vpc = new awsx.ec2.Vpc(`vpc-${stack}`, { + cidrBlock: "10.0.0.0/16", + numberOfAvailabilityZones: 2, + enableDnsHostnames: true, + }); + + const appSg = new aws.ec2.SecurityGroup(`api-${stack}`, { + vpcId: vpc.vpcId, + ingress: [ + { protocol: "tcp", fromPort: 3000, toPort: 3000, cidrBlocks: ["0.0.0.0/0"] }, + { protocol: "tcp", fromPort: 80, toPort: 80, cidrBlocks: ["0.0.0.0/0"] } + ], + egress: [ + { protocol: "-1", fromPort: 0, toPort: 0, cidrBlocks: ["0.0.0.0/0"] } + ] + }); + + const lb = new awsx.lb.ApplicationLoadBalancer(`lb-${stack}`, { + subnetIds: vpc.publicSubnetIds, + defaultTargetGroup: { + vpcId: vpc.vpcId, + port: 3000, + healthCheck: { + path: "/untp-playground", + interval: 30, + timeout: 15, + healthyThreshold: 2, + unhealthyThreshold: 2, + }, + }, + securityGroups: [appSg.id], + }); + + return { vpc, appSg, lb } +} \ No newline at end of file diff --git a/packages/untp-playground/infra/package.json b/packages/untp-playground/infra/package.json new file mode 100644 index 00000000..ca4d7553 --- /dev/null +++ b/packages/untp-playground/infra/package.json @@ -0,0 +1,13 @@ +{ + "name": "untp-demo", + "main": "index.ts", + "devDependencies": { + "@types/node": "^18", + "typescript": "^5.0.0" + }, + "dependencies": { + "@pulumi/aws": "^6.0.0", + "@pulumi/awsx": "^2.0.2", + "@pulumi/pulumi": "^3.113.0" + } +} diff --git a/packages/untp-playground/infra/services/index.ts b/packages/untp-playground/infra/services/index.ts new file mode 100644 index 00000000..fc5ec6fc --- /dev/null +++ b/packages/untp-playground/infra/services/index.ts @@ -0,0 +1,20 @@ +import * as aws from "@pulumi/aws"; +import * as awsx from "@pulumi/awsx"; + +interface Props { + stack: string; + vpc: awsx.ec2.Vpc; +} + +export function configureServices({ stack, vpc }: Props) { + const cluster = new aws.ecs.Cluster(`cluster-${stack}`); + + const namespace = new aws.servicediscovery.PrivateDnsNamespace(`namespace-${stack}`, { + vpc: vpc.vpcId, + name: "service.local", + }); + + return { cluster, namespace } +} + +export * from './untp-playground'; \ No newline at end of file diff --git a/packages/untp-playground/infra/services/untp-playground.ts b/packages/untp-playground/infra/services/untp-playground.ts new file mode 100644 index 00000000..3dbd7587 --- /dev/null +++ b/packages/untp-playground/infra/services/untp-playground.ts @@ -0,0 +1,42 @@ +import * as aws from "@pulumi/aws"; +import * as awsx from "@pulumi/awsx"; + +interface Props { + stack: string; + env: string; + vpc: awsx.ec2.Vpc; + cluster: aws.ecs.Cluster; + appSg: aws.ec2.SecurityGroup; + lb: awsx.lb.ApplicationLoadBalancer; +} + +export function configureApp({ stack, env, vpc, cluster, appSg, lb }: Props) { + const appRepository = new awsx.ecr.Repository(`app-${stack}`); + + const appImage = new awsx.ecr.Image(`app-${stack}`, { + repositoryUrl: appRepository.url, + platform: 'linux/amd64', + context: "../" + }); + + const appService = new awsx.ecs.FargateService("app-service", { + cluster: cluster.arn, + taskDefinitionArgs: { + container: { + name: `app-${stack}`, + image: appImage.imageUri, + cpu: 128, + memory: 256, + portMappings: [ + { containerPort: 3000, targetGroup: lb.defaultTargetGroup }, + ], + }, + }, + networkConfiguration: { + subnets: vpc.publicSubnetIds, + securityGroups: [appSg.id], + assignPublicIp: true + }, + desiredCount: 1, + }); +} \ No newline at end of file diff --git a/packages/untp-playground/infra/tsconfig.json b/packages/untp-playground/infra/tsconfig.json new file mode 100644 index 00000000..f03d1155 --- /dev/null +++ b/packages/untp-playground/infra/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "strict": true, + "outDir": "bin", + "target": "es2020", + "module": "commonjs", + "moduleResolution": "node", + "sourceMap": true, + "experimentalDecorators": true, + "pretty": true, + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "forceConsistentCasingInFileNames": true + }, + "files": ["index.ts"], + "include": ["**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/packages/untp-playground/infra/yarn.lock b/packages/untp-playground/infra/yarn.lock new file mode 100644 index 00000000..79a4529e --- /dev/null +++ b/packages/untp-playground/infra/yarn.lock @@ -0,0 +1,2925 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aws-crypto/sha256-browser@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz#153895ef1dba6f9fce38af550e0ef58988eb649e" + integrity sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw== + dependencies: + "@aws-crypto/sha256-js" "^5.2.0" + "@aws-crypto/supports-web-crypto" "^5.2.0" + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" + +"@aws-crypto/sha256-js@5.2.0", "@aws-crypto/sha256-js@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz#c4fdb773fdbed9a664fc1a95724e206cf3860042" + integrity sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA== + dependencies: + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + tslib "^2.6.2" + +"@aws-crypto/supports-web-crypto@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz#a1e399af29269be08e695109aa15da0a07b5b5fb" + integrity sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg== + dependencies: + tslib "^2.6.2" + +"@aws-crypto/util@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-5.2.0.tgz#71284c9cffe7927ddadac793c14f14886d3876da" + integrity sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ== + dependencies: + "@aws-sdk/types" "^3.222.0" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-ecs@^3.405.0": + version "3.699.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-ecs/-/client-ecs-3.699.0.tgz#9e2a55e85d24f095669477c40b636c6687479cc9" + integrity sha512-IohplQtfljZUzTzhc5UlFATVymLx8UNgxfIKPib5vBPzuteJOA/X/SNBfeqY4XHYZjnBPxvPIeIEZm9ClATU5A== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.699.0" + "@aws-sdk/client-sts" "3.699.0" + "@aws-sdk/core" "3.696.0" + "@aws-sdk/credential-provider-node" "3.699.0" + "@aws-sdk/middleware-host-header" "3.696.0" + "@aws-sdk/middleware-logger" "3.696.0" + "@aws-sdk/middleware-recursion-detection" "3.696.0" + "@aws-sdk/middleware-user-agent" "3.696.0" + "@aws-sdk/region-config-resolver" "3.696.0" + "@aws-sdk/types" "3.696.0" + "@aws-sdk/util-endpoints" "3.696.0" + "@aws-sdk/util-user-agent-browser" "3.696.0" + "@aws-sdk/util-user-agent-node" "3.696.0" + "@smithy/config-resolver" "^3.0.12" + "@smithy/core" "^2.5.3" + "@smithy/fetch-http-handler" "^4.1.1" + "@smithy/hash-node" "^3.0.10" + "@smithy/invalid-dependency" "^3.0.10" + "@smithy/middleware-content-length" "^3.0.12" + "@smithy/middleware-endpoint" "^3.2.3" + "@smithy/middleware-retry" "^3.0.27" + "@smithy/middleware-serde" "^3.0.10" + "@smithy/middleware-stack" "^3.0.10" + "@smithy/node-config-provider" "^3.1.11" + "@smithy/node-http-handler" "^3.3.1" + "@smithy/protocol-http" "^4.1.7" + "@smithy/smithy-client" "^3.4.4" + "@smithy/types" "^3.7.1" + "@smithy/url-parser" "^3.0.10" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.27" + "@smithy/util-defaults-mode-node" "^3.0.27" + "@smithy/util-endpoints" "^2.1.6" + "@smithy/util-middleware" "^3.0.10" + "@smithy/util-retry" "^3.0.10" + "@smithy/util-utf8" "^3.0.0" + "@smithy/util-waiter" "^3.1.9" + "@types/uuid" "^9.0.1" + tslib "^2.6.2" + uuid "^9.0.1" + +"@aws-sdk/client-sso-oidc@3.699.0": + version "3.699.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.699.0.tgz#a35665e681abd518b56330bc7dab63041fbdaf83" + integrity sha512-u8a1GorY5D1l+4FQAf4XBUC1T10/t7neuwT21r0ymrtMFSK2a9QqVHKMoLkvavAwyhJnARSBM9/UQC797PFOFw== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.696.0" + "@aws-sdk/credential-provider-node" "3.699.0" + "@aws-sdk/middleware-host-header" "3.696.0" + "@aws-sdk/middleware-logger" "3.696.0" + "@aws-sdk/middleware-recursion-detection" "3.696.0" + "@aws-sdk/middleware-user-agent" "3.696.0" + "@aws-sdk/region-config-resolver" "3.696.0" + "@aws-sdk/types" "3.696.0" + "@aws-sdk/util-endpoints" "3.696.0" + "@aws-sdk/util-user-agent-browser" "3.696.0" + "@aws-sdk/util-user-agent-node" "3.696.0" + "@smithy/config-resolver" "^3.0.12" + "@smithy/core" "^2.5.3" + "@smithy/fetch-http-handler" "^4.1.1" + "@smithy/hash-node" "^3.0.10" + "@smithy/invalid-dependency" "^3.0.10" + "@smithy/middleware-content-length" "^3.0.12" + "@smithy/middleware-endpoint" "^3.2.3" + "@smithy/middleware-retry" "^3.0.27" + "@smithy/middleware-serde" "^3.0.10" + "@smithy/middleware-stack" "^3.0.10" + "@smithy/node-config-provider" "^3.1.11" + "@smithy/node-http-handler" "^3.3.1" + "@smithy/protocol-http" "^4.1.7" + "@smithy/smithy-client" "^3.4.4" + "@smithy/types" "^3.7.1" + "@smithy/url-parser" "^3.0.10" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.27" + "@smithy/util-defaults-mode-node" "^3.0.27" + "@smithy/util-endpoints" "^2.1.6" + "@smithy/util-middleware" "^3.0.10" + "@smithy/util-retry" "^3.0.10" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-sso@3.696.0": + version "3.696.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.696.0.tgz#a9251e88cdfc91fb14191f760f68baa835e88f1c" + integrity sha512-q5TTkd08JS0DOkHfUL853tuArf7NrPeqoS5UOvqJho8ibV9Ak/a/HO4kNvy9Nj3cib/toHYHsQIEtecUPSUUrQ== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.696.0" + "@aws-sdk/middleware-host-header" "3.696.0" + "@aws-sdk/middleware-logger" "3.696.0" + "@aws-sdk/middleware-recursion-detection" "3.696.0" + "@aws-sdk/middleware-user-agent" "3.696.0" + "@aws-sdk/region-config-resolver" "3.696.0" + "@aws-sdk/types" "3.696.0" + "@aws-sdk/util-endpoints" "3.696.0" + "@aws-sdk/util-user-agent-browser" "3.696.0" + "@aws-sdk/util-user-agent-node" "3.696.0" + "@smithy/config-resolver" "^3.0.12" + "@smithy/core" "^2.5.3" + "@smithy/fetch-http-handler" "^4.1.1" + "@smithy/hash-node" "^3.0.10" + "@smithy/invalid-dependency" "^3.0.10" + "@smithy/middleware-content-length" "^3.0.12" + "@smithy/middleware-endpoint" "^3.2.3" + "@smithy/middleware-retry" "^3.0.27" + "@smithy/middleware-serde" "^3.0.10" + "@smithy/middleware-stack" "^3.0.10" + "@smithy/node-config-provider" "^3.1.11" + "@smithy/node-http-handler" "^3.3.1" + "@smithy/protocol-http" "^4.1.7" + "@smithy/smithy-client" "^3.4.4" + "@smithy/types" "^3.7.1" + "@smithy/url-parser" "^3.0.10" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.27" + "@smithy/util-defaults-mode-node" "^3.0.27" + "@smithy/util-endpoints" "^2.1.6" + "@smithy/util-middleware" "^3.0.10" + "@smithy/util-retry" "^3.0.10" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-sts@3.699.0": + version "3.699.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.699.0.tgz#9419be6bbf3809008128117afea8b9129b5a959d" + integrity sha512-++lsn4x2YXsZPIzFVwv3fSUVM55ZT0WRFmPeNilYIhZClxHLmVAWKH4I55cY9ry60/aTKYjzOXkWwyBKGsGvQg== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.699.0" + "@aws-sdk/core" "3.696.0" + "@aws-sdk/credential-provider-node" "3.699.0" + "@aws-sdk/middleware-host-header" "3.696.0" + "@aws-sdk/middleware-logger" "3.696.0" + "@aws-sdk/middleware-recursion-detection" "3.696.0" + "@aws-sdk/middleware-user-agent" "3.696.0" + "@aws-sdk/region-config-resolver" "3.696.0" + "@aws-sdk/types" "3.696.0" + "@aws-sdk/util-endpoints" "3.696.0" + "@aws-sdk/util-user-agent-browser" "3.696.0" + "@aws-sdk/util-user-agent-node" "3.696.0" + "@smithy/config-resolver" "^3.0.12" + "@smithy/core" "^2.5.3" + "@smithy/fetch-http-handler" "^4.1.1" + "@smithy/hash-node" "^3.0.10" + "@smithy/invalid-dependency" "^3.0.10" + "@smithy/middleware-content-length" "^3.0.12" + "@smithy/middleware-endpoint" "^3.2.3" + "@smithy/middleware-retry" "^3.0.27" + "@smithy/middleware-serde" "^3.0.10" + "@smithy/middleware-stack" "^3.0.10" + "@smithy/node-config-provider" "^3.1.11" + "@smithy/node-http-handler" "^3.3.1" + "@smithy/protocol-http" "^4.1.7" + "@smithy/smithy-client" "^3.4.4" + "@smithy/types" "^3.7.1" + "@smithy/url-parser" "^3.0.10" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.27" + "@smithy/util-defaults-mode-node" "^3.0.27" + "@smithy/util-endpoints" "^2.1.6" + "@smithy/util-middleware" "^3.0.10" + "@smithy/util-retry" "^3.0.10" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/core@3.696.0": + version "3.696.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.696.0.tgz#bdf306bdc019f485738d91d8838eec877861dd26" + integrity sha512-3c9III1k03DgvRZWg8vhVmfIXPG6hAciN9MzQTzqGngzWAELZF/WONRTRQuDFixVtarQatmLHYVw/atGeA2Byw== + dependencies: + "@aws-sdk/types" "3.696.0" + "@smithy/core" "^2.5.3" + "@smithy/node-config-provider" "^3.1.11" + "@smithy/property-provider" "^3.1.9" + "@smithy/protocol-http" "^4.1.7" + "@smithy/signature-v4" "^4.2.2" + "@smithy/smithy-client" "^3.4.4" + "@smithy/types" "^3.7.1" + "@smithy/util-middleware" "^3.0.10" + fast-xml-parser "4.4.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-env@3.696.0": + version "3.696.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.696.0.tgz#afad9e61cd03da404bb03e5bce83c49736b85271" + integrity sha512-T9iMFnJL7YTlESLpVFT3fg1Lkb1lD+oiaIC8KMpepb01gDUBIpj9+Y+pA/cgRWW0yRxmkDXNazAE2qQTVFGJzA== + dependencies: + "@aws-sdk/core" "3.696.0" + "@aws-sdk/types" "3.696.0" + "@smithy/property-provider" "^3.1.9" + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-http@3.696.0": + version "3.696.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.696.0.tgz#535756f9f427fbe851a8c1db7b0e3aaaf7790ba2" + integrity sha512-GV6EbvPi2eq1+WgY/o2RFA3P7HGmnkIzCNmhwtALFlqMroLYWKE7PSeHw66Uh1dFQeVESn0/+hiUNhu1mB0emA== + dependencies: + "@aws-sdk/core" "3.696.0" + "@aws-sdk/types" "3.696.0" + "@smithy/fetch-http-handler" "^4.1.1" + "@smithy/node-http-handler" "^3.3.1" + "@smithy/property-provider" "^3.1.9" + "@smithy/protocol-http" "^4.1.7" + "@smithy/smithy-client" "^3.4.4" + "@smithy/types" "^3.7.1" + "@smithy/util-stream" "^3.3.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-ini@3.699.0": + version "3.699.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.699.0.tgz#7919a454b05c5446d04a0d3270807046a029ee30" + integrity sha512-dXmCqjJnKmG37Q+nLjPVu22mNkrGHY8hYoOt3Jo9R2zr5MYV7s/NHsCHr+7E+BZ+tfZYLRPeB1wkpTeHiEcdRw== + dependencies: + "@aws-sdk/core" "3.696.0" + "@aws-sdk/credential-provider-env" "3.696.0" + "@aws-sdk/credential-provider-http" "3.696.0" + "@aws-sdk/credential-provider-process" "3.696.0" + "@aws-sdk/credential-provider-sso" "3.699.0" + "@aws-sdk/credential-provider-web-identity" "3.696.0" + "@aws-sdk/types" "3.696.0" + "@smithy/credential-provider-imds" "^3.2.6" + "@smithy/property-provider" "^3.1.9" + "@smithy/shared-ini-file-loader" "^3.1.10" + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-node@3.699.0": + version "3.699.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.699.0.tgz#6a1e32a49a7fa71d10c85a927267d1782444def1" + integrity sha512-MmEmNDo1bBtTgRmdNfdQksXu4uXe66s0p1hi1YPrn1h59Q605eq/xiWbGL6/3KdkViH6eGUuABeV2ODld86ylg== + dependencies: + "@aws-sdk/credential-provider-env" "3.696.0" + "@aws-sdk/credential-provider-http" "3.696.0" + "@aws-sdk/credential-provider-ini" "3.699.0" + "@aws-sdk/credential-provider-process" "3.696.0" + "@aws-sdk/credential-provider-sso" "3.699.0" + "@aws-sdk/credential-provider-web-identity" "3.696.0" + "@aws-sdk/types" "3.696.0" + "@smithy/credential-provider-imds" "^3.2.6" + "@smithy/property-provider" "^3.1.9" + "@smithy/shared-ini-file-loader" "^3.1.10" + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-process@3.696.0": + version "3.696.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.696.0.tgz#45da7b948aa40987b413c7c0d4a8125bf1433651" + integrity sha512-mL1RcFDe9sfmyU5K1nuFkO8UiJXXxLX4JO1gVaDIOvPqwStpUAwi3A1BoeZhWZZNQsiKI810RnYGo0E0WB/hUA== + dependencies: + "@aws-sdk/core" "3.696.0" + "@aws-sdk/types" "3.696.0" + "@smithy/property-provider" "^3.1.9" + "@smithy/shared-ini-file-loader" "^3.1.10" + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-sso@3.699.0": + version "3.699.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.699.0.tgz#515e2ecd407bace3141b8b192505631de415667e" + integrity sha512-Ekp2cZG4pl9D8+uKWm4qO1xcm8/MeiI8f+dnlZm8aQzizeC+aXYy9GyoclSf6daK8KfRPiRfM7ZHBBL5dAfdMA== + dependencies: + "@aws-sdk/client-sso" "3.696.0" + "@aws-sdk/core" "3.696.0" + "@aws-sdk/token-providers" "3.699.0" + "@aws-sdk/types" "3.696.0" + "@smithy/property-provider" "^3.1.9" + "@smithy/shared-ini-file-loader" "^3.1.10" + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-web-identity@3.696.0": + version "3.696.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.696.0.tgz#3f97c00bd3bc7cfd988e098af67ff7c8392ce188" + integrity sha512-XJ/CVlWChM0VCoc259vWguFUjJDn/QwDqHwbx+K9cg3v6yrqXfK5ai+p/6lx0nQpnk4JzPVeYYxWRpaTsGC9rg== + dependencies: + "@aws-sdk/core" "3.696.0" + "@aws-sdk/types" "3.696.0" + "@smithy/property-provider" "^3.1.9" + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@aws-sdk/middleware-host-header@3.696.0": + version "3.696.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.696.0.tgz#20aae0efeb973ca1a6db1b1014acbcdd06ad472e" + integrity sha512-zELJp9Ta2zkX7ELggMN9qMCgekqZhFC5V2rOr4hJDEb/Tte7gpfKSObAnw/3AYiVqt36sjHKfdkoTsuwGdEoDg== + dependencies: + "@aws-sdk/types" "3.696.0" + "@smithy/protocol-http" "^4.1.7" + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@aws-sdk/middleware-logger@3.696.0": + version "3.696.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.696.0.tgz#79d68b7e5ba181511ade769b11165bfb7527181e" + integrity sha512-KhkHt+8AjCxcR/5Zp3++YPJPpFQzxpr+jmONiT/Jw2yqnSngZ0Yspm5wGoRx2hS1HJbyZNuaOWEGuJoxLeBKfA== + dependencies: + "@aws-sdk/types" "3.696.0" + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@aws-sdk/middleware-recursion-detection@3.696.0": + version "3.696.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.696.0.tgz#aa437d645d74cb785905162266741125c18f182a" + integrity sha512-si/maV3Z0hH7qa99f9ru2xpS5HlfSVcasRlNUXKSDm611i7jFMWwGNLUOXFAOLhXotPX5G3Z6BLwL34oDeBMug== + dependencies: + "@aws-sdk/types" "3.696.0" + "@smithy/protocol-http" "^4.1.7" + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@aws-sdk/middleware-user-agent@3.696.0": + version "3.696.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.696.0.tgz#626c89300f6b3af5aefc1cb6d9ac19eebf8bc97d" + integrity sha512-Lvyj8CTyxrHI6GHd2YVZKIRI5Fmnugt3cpJo0VrKKEgK5zMySwEZ1n4dqPK6czYRWKd5+WnYHYAuU+Wdk6Jsjw== + dependencies: + "@aws-sdk/core" "3.696.0" + "@aws-sdk/types" "3.696.0" + "@aws-sdk/util-endpoints" "3.696.0" + "@smithy/core" "^2.5.3" + "@smithy/protocol-http" "^4.1.7" + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@aws-sdk/region-config-resolver@3.696.0": + version "3.696.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.696.0.tgz#146c428702c09db75df5234b5d40ce49d147d0cf" + integrity sha512-7EuH142lBXjI8yH6dVS/CZeiK/WZsmb/8zP6bQbVYpMrppSTgB3MzZZdxVZGzL5r8zPQOU10wLC4kIMy0qdBVQ== + dependencies: + "@aws-sdk/types" "3.696.0" + "@smithy/node-config-provider" "^3.1.11" + "@smithy/types" "^3.7.1" + "@smithy/util-config-provider" "^3.0.0" + "@smithy/util-middleware" "^3.0.10" + tslib "^2.6.2" + +"@aws-sdk/token-providers@3.699.0": + version "3.699.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.699.0.tgz#354990dd52d651c1f7a64c4c0894c868cdc81de2" + integrity sha512-kuiEW9DWs7fNos/SM+y58HCPhcIzm1nEZLhe2/7/6+TvAYLuEWURYsbK48gzsxXlaJ2k/jGY3nIsA7RptbMOwA== + dependencies: + "@aws-sdk/types" "3.696.0" + "@smithy/property-provider" "^3.1.9" + "@smithy/shared-ini-file-loader" "^3.1.10" + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@aws-sdk/types@3.696.0", "@aws-sdk/types@^3.222.0": + version "3.696.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.696.0.tgz#559c3df74dc389b6f40ba6ec6daffeab155330cd" + integrity sha512-9rTvUJIAj5d3//U5FDPWGJ1nFJLuWb30vugGOrWk7aNZ6y9tuA3PI7Cc9dP8WEXKVyK1vuuk8rSFP2iqXnlgrw== + dependencies: + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@aws-sdk/util-endpoints@3.696.0": + version "3.696.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.696.0.tgz#79e18714419a423a64094381b849214499f00577" + integrity sha512-T5s0IlBVX+gkb9g/I6CLt4yAZVzMSiGnbUqWihWsHvQR1WOoIcndQy/Oz/IJXT9T2ipoy7a80gzV6a5mglrioA== + dependencies: + "@aws-sdk/types" "3.696.0" + "@smithy/types" "^3.7.1" + "@smithy/util-endpoints" "^2.1.6" + tslib "^2.6.2" + +"@aws-sdk/util-locate-window@^3.0.0": + version "3.693.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.693.0.tgz#1160f6d055cf074ca198eb8ecf89b6311537ad6c" + integrity sha512-ttrag6haJLWABhLqtg1Uf+4LgHWIMOVSYL+VYZmAp2v4PUGOwWmWQH0Zk8RM7YuQcLfH/EoR72/Yxz6A4FKcuw== + dependencies: + tslib "^2.6.2" + +"@aws-sdk/util-user-agent-browser@3.696.0": + version "3.696.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.696.0.tgz#2034765c81313d5e50783662332d35ec041755a0" + integrity sha512-Z5rVNDdmPOe6ELoM5AhF/ja5tSjbe6ctSctDPb0JdDf4dT0v2MfwhJKzXju2RzX8Es/77Glh7MlaXLE0kCB9+Q== + dependencies: + "@aws-sdk/types" "3.696.0" + "@smithy/types" "^3.7.1" + bowser "^2.11.0" + tslib "^2.6.2" + +"@aws-sdk/util-user-agent-node@3.696.0": + version "3.696.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.696.0.tgz#3267119e2be02185f3b4e0beb0cc495d392260b4" + integrity sha512-KhKqcfyXIB0SCCt+qsu4eJjsfiOrNzK5dCV7RAW2YIpp+msxGUUX0NdRE9rkzjiv+3EMktgJm3eEIS+yxtlVdQ== + dependencies: + "@aws-sdk/middleware-user-agent" "3.696.0" + "@aws-sdk/types" "3.696.0" + "@smithy/node-config-provider" "^3.1.11" + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@grpc/grpc-js@^1.10.1": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.12.2.tgz#97eda82dd49bb9c24eaf6434ea8d7de446e95aac" + integrity sha512-bgxdZmgTrJZX50OjyVwz3+mNEnCTNkh3cIqGPWVNeW9jX6bn1ZkU80uPd+67/ZpIJIjRQ9qaHCjhavyoWYxumg== + dependencies: + "@grpc/proto-loader" "^0.7.13" + "@js-sdsl/ordered-map" "^4.4.2" + +"@grpc/proto-loader@^0.7.13": + version "0.7.13" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.13.tgz#f6a44b2b7c9f7b609f5748c6eac2d420e37670cf" + integrity sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw== + dependencies: + lodash.camelcase "^4.3.0" + long "^5.0.0" + protobufjs "^7.2.5" + yargs "^17.7.2" + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@isaacs/string-locale-compare@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz#291c227e93fd407a96ecd59879a35809120e432b" + integrity sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ== + +"@js-sdsl/ordered-map@^4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz#9299f82874bab9e4c7f9c48d865becbfe8d6907c" + integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw== + +"@logdna/tail-file@^2.0.6": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@logdna/tail-file/-/tail-file-2.2.0.tgz#158a362d293f940dacfd07c835bf3ae2f9e0455a" + integrity sha512-XGSsWDweP80Fks16lwkAUIr54ICyBs6PsI4mpfTLQaWgEJRtY9xEV+PeyDpJ+sJEGZxqINlpmAwe/6tS1pP8Ng== + +"@npmcli/agent@^2.0.0": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@npmcli/agent/-/agent-2.2.2.tgz#967604918e62f620a648c7975461c9c9e74fc5d5" + integrity sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og== + dependencies: + agent-base "^7.1.0" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.1" + lru-cache "^10.0.1" + socks-proxy-agent "^8.0.3" + +"@npmcli/arborist@^7.3.1": + version "7.5.4" + resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-7.5.4.tgz#3dd9e531d6464ef6715e964c188e0880c471ac9b" + integrity sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g== + dependencies: + "@isaacs/string-locale-compare" "^1.1.0" + "@npmcli/fs" "^3.1.1" + "@npmcli/installed-package-contents" "^2.1.0" + "@npmcli/map-workspaces" "^3.0.2" + "@npmcli/metavuln-calculator" "^7.1.1" + "@npmcli/name-from-folder" "^2.0.0" + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/package-json" "^5.1.0" + "@npmcli/query" "^3.1.0" + "@npmcli/redact" "^2.0.0" + "@npmcli/run-script" "^8.1.0" + bin-links "^4.0.4" + cacache "^18.0.3" + common-ancestor-path "^1.0.1" + hosted-git-info "^7.0.2" + json-parse-even-better-errors "^3.0.2" + json-stringify-nice "^1.1.4" + lru-cache "^10.2.2" + minimatch "^9.0.4" + nopt "^7.2.1" + npm-install-checks "^6.2.0" + npm-package-arg "^11.0.2" + npm-pick-manifest "^9.0.1" + npm-registry-fetch "^17.0.1" + pacote "^18.0.6" + parse-conflict-json "^3.0.0" + proc-log "^4.2.0" + proggy "^2.0.0" + promise-all-reject-late "^1.0.0" + promise-call-limit "^3.0.1" + read-package-json-fast "^3.0.2" + semver "^7.3.7" + ssri "^10.0.6" + treeverse "^3.0.0" + walk-up-path "^3.0.1" + +"@npmcli/fs@^3.1.0", "@npmcli/fs@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.1.tgz#59cdaa5adca95d135fc00f2bb53f5771575ce726" + integrity sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg== + dependencies: + semver "^7.3.5" + +"@npmcli/git@^5.0.0": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-5.0.8.tgz#8ba3ff8724192d9ccb2735a2aa5380a992c5d3d1" + integrity sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ== + dependencies: + "@npmcli/promise-spawn" "^7.0.0" + ini "^4.1.3" + lru-cache "^10.0.1" + npm-pick-manifest "^9.0.0" + proc-log "^4.0.0" + promise-inflight "^1.0.1" + promise-retry "^2.0.1" + semver "^7.3.5" + which "^4.0.0" + +"@npmcli/installed-package-contents@^2.0.1", "@npmcli/installed-package-contents@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz#63048e5f6e40947a3a88dcbcb4fd9b76fdd37c17" + integrity sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w== + dependencies: + npm-bundled "^3.0.0" + npm-normalize-package-bin "^3.0.0" + +"@npmcli/map-workspaces@^3.0.2": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz#27dc06c20c35ef01e45a08909cab9cb3da08cea6" + integrity sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA== + dependencies: + "@npmcli/name-from-folder" "^2.0.0" + glob "^10.2.2" + minimatch "^9.0.0" + read-package-json-fast "^3.0.0" + +"@npmcli/metavuln-calculator@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/metavuln-calculator/-/metavuln-calculator-7.1.1.tgz#4d3b6c3192f72bc8ad59476de0da939c33877fcf" + integrity sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g== + dependencies: + cacache "^18.0.0" + json-parse-even-better-errors "^3.0.0" + pacote "^18.0.0" + proc-log "^4.1.0" + semver "^7.3.5" + +"@npmcli/name-from-folder@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz#c44d3a7c6d5c184bb6036f4d5995eee298945815" + integrity sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg== + +"@npmcli/node-gyp@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz#101b2d0490ef1aa20ed460e4c0813f0db560545a" + integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== + +"@npmcli/package-json@^5.0.0", "@npmcli/package-json@^5.1.0": + version "5.2.1" + resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-5.2.1.tgz#df69477b1023b81ff8503f2b9db4db4faea567ed" + integrity sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ== + dependencies: + "@npmcli/git" "^5.0.0" + glob "^10.2.2" + hosted-git-info "^7.0.0" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^6.0.0" + proc-log "^4.0.0" + semver "^7.5.3" + +"@npmcli/promise-spawn@^7.0.0": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz#1d53d34ffeb5d151bfa8ec661bcccda8bbdfd532" + integrity sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ== + dependencies: + which "^4.0.0" + +"@npmcli/query@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/query/-/query-3.1.0.tgz#bc202c59e122a06cf8acab91c795edda2cdad42c" + integrity sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ== + dependencies: + postcss-selector-parser "^6.0.10" + +"@npmcli/redact@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/redact/-/redact-2.0.1.tgz#95432fd566e63b35c04494621767a4312c316762" + integrity sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw== + +"@npmcli/run-script@^8.0.0", "@npmcli/run-script@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-8.1.0.tgz#a563e5e29b1ca4e648a6b1bbbfe7220b4bfe39fc" + integrity sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg== + dependencies: + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/package-json" "^5.0.0" + "@npmcli/promise-spawn" "^7.0.0" + node-gyp "^10.0.0" + proc-log "^4.0.0" + which "^4.0.0" + +"@opentelemetry/api-logs@0.52.1": + version "0.52.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.52.1.tgz#52906375da4d64c206b0c4cb8ffa209214654ecc" + integrity sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A== + dependencies: + "@opentelemetry/api" "^1.0.0" + +"@opentelemetry/api@^1.0.0", "@opentelemetry/api@^1.9": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.9.0.tgz#d03eba68273dc0f7509e2a3d5cba21eae10379fe" + integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== + +"@opentelemetry/context-async-hooks@1.28.0": + version "1.28.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-1.28.0.tgz#287afda2b75cb226f70d433244c3ef6f6dd8abdd" + integrity sha512-igcl4Ve+F1N2063PJUkesk/GkYyuGIWinYkSyAFTnIj3gzrOgvOA4k747XNdL47HRRL1w/qh7UW8NDuxOLvKFA== + +"@opentelemetry/core@1.28.0": + version "1.28.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.28.0.tgz#e97290a3e36c59480ffb2287fe2713c66749274c" + integrity sha512-ZLwRMV+fNDpVmF2WYUdBHlq0eOWtEaUJSusrzjGnBt7iSRvfjFE3RXYUZJrqou/wIDWV0DwQ5KIfYe9WXg9Xqw== + dependencies: + "@opentelemetry/semantic-conventions" "1.27.0" + +"@opentelemetry/exporter-zipkin@^1.25": + version "1.28.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.28.0.tgz#6e5ca7f43f79d0e3240ca7029f8dbc43af64c1b7" + integrity sha512-AMwr3eGXaPEH7gk8yhcUcen31VXy1yU5VJETu0pCfGpggGCYmhm0FKgYBpL5/vlIgQJWU/sW2vIjCL7aSilpKg== + dependencies: + "@opentelemetry/core" "1.28.0" + "@opentelemetry/resources" "1.28.0" + "@opentelemetry/sdk-trace-base" "1.28.0" + "@opentelemetry/semantic-conventions" "1.27.0" + +"@opentelemetry/instrumentation-grpc@^0.52": + version "0.52.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.52.1.tgz#906ce4756a0eb1b050cd89b6b97dc09efe3ae3e3" + integrity sha512-EdSDiDSAO+XRXk/ZN128qQpBo1I51+Uay/LUPcPQhSRGf7fBPIEUBeOLQiItguGsug5MGOYjql2w/1wCQF3fdQ== + dependencies: + "@opentelemetry/instrumentation" "0.52.1" + "@opentelemetry/semantic-conventions" "1.25.1" + +"@opentelemetry/instrumentation@0.52.1", "@opentelemetry/instrumentation@^0.52": + version "0.52.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz#2e7e46a38bd7afbf03cf688c862b0b43418b7f48" + integrity sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw== + dependencies: + "@opentelemetry/api-logs" "0.52.1" + "@types/shimmer" "^1.0.2" + import-in-the-middle "^1.8.1" + require-in-the-middle "^7.1.1" + semver "^7.5.2" + shimmer "^1.2.1" + +"@opentelemetry/propagator-b3@1.28.0": + version "1.28.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-b3/-/propagator-b3-1.28.0.tgz#5e4c87c2097a18f88a5a4d19a57350f55517bb8a" + integrity sha512-Q7HVDIMwhN5RxL4bECMT4BdbyYSAKkC6U/RGn4NpO/cbqP6ZRg+BS7fPo/pGZi2w8AHfpIGQFXQmE8d2PC5xxQ== + dependencies: + "@opentelemetry/core" "1.28.0" + +"@opentelemetry/propagator-jaeger@1.28.0": + version "1.28.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.28.0.tgz#427158c3d0f8ea77c205c7b9cde09091c7f25ae3" + integrity sha512-wKJ94+s8467CnIRgoSRh0yXm/te0QMOwTq9J01PfG/RzYZvlvN8aRisN2oZ9SznB45dDGnMj3BhUlchSA9cEKA== + dependencies: + "@opentelemetry/core" "1.28.0" + +"@opentelemetry/resources@1.28.0", "@opentelemetry/resources@^1.25": + version "1.28.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.28.0.tgz#c8c27ae7559c817f9d117f1bf96d76f893fb29f5" + integrity sha512-cIyXSVJjGeTICENN40YSvLDAq4Y2502hGK3iN7tfdynQLKWb3XWZQEkPc+eSx47kiy11YeFAlYkEfXwR1w8kfw== + dependencies: + "@opentelemetry/core" "1.28.0" + "@opentelemetry/semantic-conventions" "1.27.0" + +"@opentelemetry/sdk-trace-base@1.28.0", "@opentelemetry/sdk-trace-base@^1.25": + version "1.28.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.28.0.tgz#6195dc8cd78bd74394cf54c67c5cbd8d1528516c" + integrity sha512-ceUVWuCpIao7Y5xE02Xs3nQi0tOGmMea17ecBdwtCvdo9ekmO+ijc9RFDgfifMl7XCBf41zne/1POM3LqSTZDA== + dependencies: + "@opentelemetry/core" "1.28.0" + "@opentelemetry/resources" "1.28.0" + "@opentelemetry/semantic-conventions" "1.27.0" + +"@opentelemetry/sdk-trace-node@^1.25": + version "1.28.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.28.0.tgz#e3384802e12c689bb7a84809a732d091a2fbda09" + integrity sha512-N0sYfYXvHpP0FNIyc+UfhLnLSTOuZLytV0qQVrDWIlABeD/DWJIGttS7nYeR14gQLXch0M1DW8zm3VeN6Opwtg== + dependencies: + "@opentelemetry/context-async-hooks" "1.28.0" + "@opentelemetry/core" "1.28.0" + "@opentelemetry/propagator-b3" "1.28.0" + "@opentelemetry/propagator-jaeger" "1.28.0" + "@opentelemetry/sdk-trace-base" "1.28.0" + semver "^7.5.2" + +"@opentelemetry/semantic-conventions@1.25.1": + version "1.25.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz#0deecb386197c5e9c2c28f2f89f51fb8ae9f145e" + integrity sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ== + +"@opentelemetry/semantic-conventions@1.27.0": + version "1.27.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz#1a857dcc95a5ab30122e04417148211e6f945e6c" + integrity sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg== + +"@opentelemetry/semantic-conventions@^1.25": + version "1.28.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz#337fb2bca0453d0726696e745f50064411f646d6" + integrity sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA== + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + +"@pulumi/aws@^6.0.0", "@pulumi/aws@^6.59.1": + version "6.61.0" + resolved "https://registry.yarnpkg.com/@pulumi/aws/-/aws-6.61.0.tgz#dd4f11d39a74e16c22507a581c1a92a98302e363" + integrity sha512-7ZqwEj6Zh3+bmB8OVCCin93qqlUeBGpp76YjiwghfMa3Q4hvpDsi1tEu7/+3QDPWxH/HRbp6AeHQ8UYw0HalTg== + dependencies: + "@pulumi/pulumi" "^3.136.0" + builtin-modules "3.0.0" + mime "^2.0.0" + resolve "^1.7.1" + +"@pulumi/awsx@^2.0.2": + version "2.19.0" + resolved "https://registry.yarnpkg.com/@pulumi/awsx/-/awsx-2.19.0.tgz#63620b8d8ffc5b8fad617fef80f000fd327f81a3" + integrity sha512-7byK+zf2eTKRPdYHHSS5lifqsI0Km6ZkB0rCb332zQ4Nm0stS+YjeCIkbQtjJWdDtXUXPP60SX5na/9vfQYAow== + dependencies: + "@aws-sdk/client-ecs" "^3.405.0" + "@pulumi/aws" "^6.59.1" + "@pulumi/docker" "^4.5.1" + "@pulumi/pulumi" "^3.136.0" + "@types/aws-lambda" "^8.10.23" + docker-classic "npm:@pulumi/docker@3.6.1" + mime "^2.0.0" + +"@pulumi/docker@^4.5.1": + version "4.5.7" + resolved "https://registry.yarnpkg.com/@pulumi/docker/-/docker-4.5.7.tgz#56ec0782a1a52b5a1dc16230dcd7e07c0b94be01" + integrity sha512-z0rr1PoJXemafrNl0oPjQJlGRNbMKN0z50cKhmcuMVsiNTt36cDLXw7kpclgddgdwkM6ZU5zMRyaA1rcNuXTlg== + dependencies: + "@pulumi/pulumi" "^3.136.0" + semver "^5.4.0" + +"@pulumi/pulumi@^3.0.0", "@pulumi/pulumi@^3.113.0", "@pulumi/pulumi@^3.136.0": + version "3.142.0" + resolved "https://registry.yarnpkg.com/@pulumi/pulumi/-/pulumi-3.142.0.tgz#dd7bb330576f170365fa711f0b5f87394b964885" + integrity sha512-2RP4EDIDj4A980u/KThEUe5h5b0LcSaOqw9cA8Cxi3SiP+GC91zecJNbko4GOSR8kxsNd8EY327pVxt7fjTKhA== + dependencies: + "@grpc/grpc-js" "^1.10.1" + "@logdna/tail-file" "^2.0.6" + "@npmcli/arborist" "^7.3.1" + "@opentelemetry/api" "^1.9" + "@opentelemetry/exporter-zipkin" "^1.25" + "@opentelemetry/instrumentation" "^0.52" + "@opentelemetry/instrumentation-grpc" "^0.52" + "@opentelemetry/resources" "^1.25" + "@opentelemetry/sdk-trace-base" "^1.25" + "@opentelemetry/sdk-trace-node" "^1.25" + "@opentelemetry/semantic-conventions" "^1.25" + "@pulumi/query" "^0.3.0" + "@types/google-protobuf" "^3.15.5" + "@types/semver" "^7.5.6" + "@types/tmp" "^0.2.6" + execa "^5.1.0" + fdir "^6.1.1" + google-protobuf "^3.5.0" + got "^11.8.6" + ini "^2.0.0" + js-yaml "^3.14.0" + minimist "^1.2.6" + normalize-package-data "^6.0.0" + picomatch "^3.0.1" + pkg-dir "^7.0.0" + require-from-string "^2.0.1" + semver "^7.5.2" + source-map-support "^0.5.6" + tmp "^0.2.1" + upath "^1.1.0" + +"@pulumi/query@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@pulumi/query/-/query-0.3.0.tgz#f496608e86a18c3dd31b6c533408e2441c29071d" + integrity sha512-xfo+yLRM2zVjVEA4p23IjQWzyWl1ZhWOGobsBqRpIarzLvwNH/RAGaoehdxlhx4X92302DrpdIFgTICMN4P38w== + +"@sigstore/bundle@^2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-2.3.2.tgz#ad4dbb95d665405fd4a7a02c8a073dbd01e4e95e" + integrity sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA== + dependencies: + "@sigstore/protobuf-specs" "^0.3.2" + +"@sigstore/core@^1.0.0", "@sigstore/core@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/core/-/core-1.1.0.tgz#5583d8f7ffe599fa0a89f2bf289301a5af262380" + integrity sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg== + +"@sigstore/protobuf-specs@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz#5becf88e494a920f548d0163e2978f81b44b7d6f" + integrity sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw== + +"@sigstore/sign@^2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-2.3.2.tgz#d3d01e56d03af96fd5c3a9b9897516b1233fc1c4" + integrity sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA== + dependencies: + "@sigstore/bundle" "^2.3.2" + "@sigstore/core" "^1.0.0" + "@sigstore/protobuf-specs" "^0.3.2" + make-fetch-happen "^13.0.1" + proc-log "^4.2.0" + promise-retry "^2.0.1" + +"@sigstore/tuf@^2.3.4": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-2.3.4.tgz#da1d2a20144f3b87c0172920cbc8dcc7851ca27c" + integrity sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw== + dependencies: + "@sigstore/protobuf-specs" "^0.3.2" + tuf-js "^2.2.1" + +"@sigstore/verify@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@sigstore/verify/-/verify-1.2.1.tgz#c7e60241b432890dcb8bd8322427f6062ef819e1" + integrity sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g== + dependencies: + "@sigstore/bundle" "^2.3.2" + "@sigstore/core" "^1.1.0" + "@sigstore/protobuf-specs" "^0.3.2" + +"@sindresorhus/is@^4.0.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== + +"@smithy/abort-controller@^3.1.8": + version "3.1.8" + resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-3.1.8.tgz#ce0c10ddb2b39107d70b06bbb8e4f6e368bc551d" + integrity sha512-+3DOBcUn5/rVjlxGvUPKc416SExarAQ+Qe0bqk30YSUjbepwpS7QN0cyKUSifvLJhdMZ0WPzPP5ymut0oonrpQ== + dependencies: + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@smithy/config-resolver@^3.0.12": + version "3.0.12" + resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-3.0.12.tgz#f355f95fcb5ee932a90871a488a4f2128e8ad3ac" + integrity sha512-YAJP9UJFZRZ8N+UruTeq78zkdjUHmzsY62J4qKWZ4SXB4QXJ/+680EfXXgkYA2xj77ooMqtUY9m406zGNqwivQ== + dependencies: + "@smithy/node-config-provider" "^3.1.11" + "@smithy/types" "^3.7.1" + "@smithy/util-config-provider" "^3.0.0" + "@smithy/util-middleware" "^3.0.10" + tslib "^2.6.2" + +"@smithy/core@^2.5.3", "@smithy/core@^2.5.4": + version "2.5.4" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-2.5.4.tgz#b9eb9c3a8f47d550dcdea19cc95434e66e5556cf" + integrity sha512-iFh2Ymn2sCziBRLPuOOxRPkuCx/2gBdXtBGuCUFLUe6bWYjKnhHyIPqGeNkLZ5Aco/5GjebRTBFiWID3sDbrKw== + dependencies: + "@smithy/middleware-serde" "^3.0.10" + "@smithy/protocol-http" "^4.1.7" + "@smithy/types" "^3.7.1" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-middleware" "^3.0.10" + "@smithy/util-stream" "^3.3.1" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@smithy/credential-provider-imds@^3.2.6", "@smithy/credential-provider-imds@^3.2.7": + version "3.2.7" + resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.7.tgz#6eedf87ba0238723ec46d8ce0f18e276685a702d" + integrity sha512-cEfbau+rrWF8ylkmmVAObOmjbTIzKyUC5TkBL58SbLywD0RCBC4JAUKbmtSm2w5KUJNRPGgpGFMvE2FKnuNlWQ== + dependencies: + "@smithy/node-config-provider" "^3.1.11" + "@smithy/property-provider" "^3.1.10" + "@smithy/types" "^3.7.1" + "@smithy/url-parser" "^3.0.10" + tslib "^2.6.2" + +"@smithy/fetch-http-handler@^4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-4.1.1.tgz#cead80762af4cdea11e7eeb627ea1c4835265dfa" + integrity sha512-bH7QW0+JdX0bPBadXt8GwMof/jz0H28I84hU1Uet9ISpzUqXqRQ3fEZJ+ANPOhzSEczYvANNl3uDQDYArSFDtA== + dependencies: + "@smithy/protocol-http" "^4.1.7" + "@smithy/querystring-builder" "^3.0.10" + "@smithy/types" "^3.7.1" + "@smithy/util-base64" "^3.0.0" + tslib "^2.6.2" + +"@smithy/hash-node@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-3.0.10.tgz#93c857b4bff3a48884886440fd9772924887e592" + integrity sha512-3zWGWCHI+FlJ5WJwx73Mw2llYR8aflVyZN5JhoqLxbdPZi6UyKSdCeXAWJw9ja22m6S6Tzz1KZ+kAaSwvydi0g== + dependencies: + "@smithy/types" "^3.7.1" + "@smithy/util-buffer-from" "^3.0.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@smithy/invalid-dependency@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-3.0.10.tgz#8616dee555916c24dec3e33b1e046c525efbfee3" + integrity sha512-Lp2L65vFi+cj0vFMu2obpPW69DU+6O5g3086lmI4XcnRCG8PxvpWC7XyaVwJCxsZFzueHjXnrOH/E0pl0zikfA== + dependencies: + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@smithy/is-array-buffer@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz#f84f0d9f9a36601a9ca9381688bd1b726fd39111" + integrity sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA== + dependencies: + tslib "^2.6.2" + +"@smithy/is-array-buffer@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz#9a95c2d46b8768946a9eec7f935feaddcffa5e7a" + integrity sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ== + dependencies: + tslib "^2.6.2" + +"@smithy/middleware-content-length@^3.0.12": + version "3.0.12" + resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-3.0.12.tgz#3b248ed1e8f1e0ae67171abb8eae9da7ab7ca613" + integrity sha512-1mDEXqzM20yywaMDuf5o9ue8OkJ373lSPbaSjyEvkWdqELhFMyNNgKGWL/rCSf4KME8B+HlHKuR8u9kRj8HzEQ== + dependencies: + "@smithy/protocol-http" "^4.1.7" + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@smithy/middleware-endpoint@^3.2.3", "@smithy/middleware-endpoint@^3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.4.tgz#aaded88e3848e56edc99797d71069817fe20cb44" + integrity sha512-TybiW2LA3kYVd3e+lWhINVu1o26KJbBwOpADnf0L4x/35vLVica77XVR5hvV9+kWeTGeSJ3IHTcYxbRxlbwhsg== + dependencies: + "@smithy/core" "^2.5.4" + "@smithy/middleware-serde" "^3.0.10" + "@smithy/node-config-provider" "^3.1.11" + "@smithy/shared-ini-file-loader" "^3.1.11" + "@smithy/types" "^3.7.1" + "@smithy/url-parser" "^3.0.10" + "@smithy/util-middleware" "^3.0.10" + tslib "^2.6.2" + +"@smithy/middleware-retry@^3.0.27": + version "3.0.28" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-3.0.28.tgz#92ef5a446bf232fc170c92a460e8af827b0e43bb" + integrity sha512-vK2eDfvIXG1U64FEUhYxoZ1JSj4XFbYWkK36iz02i3pFwWiDz1Q7jKhGTBCwx/7KqJNk4VS7d7cDLXFOvP7M+g== + dependencies: + "@smithy/node-config-provider" "^3.1.11" + "@smithy/protocol-http" "^4.1.7" + "@smithy/service-error-classification" "^3.0.10" + "@smithy/smithy-client" "^3.4.5" + "@smithy/types" "^3.7.1" + "@smithy/util-middleware" "^3.0.10" + "@smithy/util-retry" "^3.0.10" + tslib "^2.6.2" + uuid "^9.0.1" + +"@smithy/middleware-serde@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-3.0.10.tgz#5f6c0b57b10089a21d355bd95e9b7d40378454d7" + integrity sha512-MnAuhh+dD14F428ubSJuRnmRsfOpxSzvRhaGVTvd/lrUDE3kxzCCmH8lnVTvoNQnV2BbJ4c15QwZ3UdQBtFNZA== + dependencies: + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@smithy/middleware-stack@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-3.0.10.tgz#73e2fde5d151440844161773a17ee13375502baf" + integrity sha512-grCHyoiARDBBGPyw2BeicpjgpsDFWZZxptbVKb3CRd/ZA15F/T6rZjCCuBUjJwdck1nwUuIxYtsS4H9DDpbP5w== + dependencies: + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@smithy/node-config-provider@^3.1.11": + version "3.1.11" + resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-3.1.11.tgz#95feba85a5cb3de3fe9adfff1060b35fd556d023" + integrity sha512-URq3gT3RpDikh/8MBJUB+QGZzfS7Bm6TQTqoh4CqE8NBuyPkWa5eUXj0XFcFfeZVgg3WMh1u19iaXn8FvvXxZw== + dependencies: + "@smithy/property-provider" "^3.1.10" + "@smithy/shared-ini-file-loader" "^3.1.11" + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@smithy/node-http-handler@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-3.3.1.tgz#788fc1c22c21a0cf982f4025ccf9f64217f3164f" + integrity sha512-fr+UAOMGWh6bn4YSEezBCpJn9Ukp9oR4D32sCjCo7U81evE11YePOQ58ogzyfgmjIO79YeOdfXXqr0jyhPQeMg== + dependencies: + "@smithy/abort-controller" "^3.1.8" + "@smithy/protocol-http" "^4.1.7" + "@smithy/querystring-builder" "^3.0.10" + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@smithy/property-provider@^3.1.10", "@smithy/property-provider@^3.1.9": + version "3.1.10" + resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-3.1.10.tgz#ae00447c1060c194c3e1b9475f7c8548a70f8486" + integrity sha512-n1MJZGTorTH2DvyTVj+3wXnd4CzjJxyXeOgnTlgNVFxaaMeT4OteEp4QrzF8p9ee2yg42nvyVK6R/awLCakjeQ== + dependencies: + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@smithy/protocol-http@^4.1.7": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-4.1.7.tgz#5c67e62beb5deacdb94f2127f9a344bdf1b2ed6e" + integrity sha512-FP2LepWD0eJeOTm0SjssPcgqAlDFzOmRXqXmGhfIM52G7Lrox/pcpQf6RP4F21k0+O12zaqQt5fCDOeBtqY6Cg== + dependencies: + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@smithy/querystring-builder@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-3.0.10.tgz#db8773af85ee3977c82b8e35a5cdd178c621306d" + integrity sha512-nT9CQF3EIJtIUepXQuBFb8dxJi3WVZS3XfuDksxSCSn+/CzZowRLdhDn+2acbBv8R6eaJqPupoI/aRFIImNVPQ== + dependencies: + "@smithy/types" "^3.7.1" + "@smithy/util-uri-escape" "^3.0.0" + tslib "^2.6.2" + +"@smithy/querystring-parser@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-3.0.10.tgz#62db744a1ed2cf90f4c08d2c73d365e033b4a11c" + integrity sha512-Oa0XDcpo9SmjhiDD9ua2UyM3uU01ZTuIrNdZvzwUTykW1PM8o2yJvMh1Do1rY5sUQg4NDV70dMi0JhDx4GyxuQ== + dependencies: + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@smithy/service-error-classification@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-3.0.10.tgz#941c549daf0e9abb84d3def1d9e1e3f0f74f5ba6" + integrity sha512-zHe642KCqDxXLuhs6xmHVgRwy078RfqxP2wRDpIyiF8EmsWXptMwnMwbVa50lw+WOGNrYm9zbaEg0oDe3PTtvQ== + dependencies: + "@smithy/types" "^3.7.1" + +"@smithy/shared-ini-file-loader@^3.1.10", "@smithy/shared-ini-file-loader@^3.1.11": + version "3.1.11" + resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.11.tgz#0b4f98c4a66480956fbbefc4627c5dc09d891aea" + integrity sha512-AUdrIZHFtUgmfSN4Gq9nHu3IkHMa1YDcN+s061Nfm+6pQ0mJy85YQDB0tZBCmls0Vuj22pLwDPmL92+Hvfwwlg== + dependencies: + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@smithy/signature-v4@^4.2.2": + version "4.2.3" + resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-4.2.3.tgz#abbca5e5fe9158422b3125b2956791a325a27f22" + integrity sha512-pPSQQ2v2vu9vc8iew7sszLd0O09I5TRc5zhY71KA+Ao0xYazIG+uLeHbTJfIWGO3BGVLiXjUr3EEeCcEQLjpWQ== + dependencies: + "@smithy/is-array-buffer" "^3.0.0" + "@smithy/protocol-http" "^4.1.7" + "@smithy/types" "^3.7.1" + "@smithy/util-hex-encoding" "^3.0.0" + "@smithy/util-middleware" "^3.0.10" + "@smithy/util-uri-escape" "^3.0.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@smithy/smithy-client@^3.4.4", "@smithy/smithy-client@^3.4.5": + version "3.4.5" + resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-3.4.5.tgz#b90fe15d80e2dca5aa9cf3bd24bd73359ad1ef61" + integrity sha512-k0sybYT9zlP79sIKd1XGm4TmK0AS1nA2bzDHXx7m0nGi3RQ8dxxQUs4CPkSmQTKAo+KF9aINU3KzpGIpV7UoMw== + dependencies: + "@smithy/core" "^2.5.4" + "@smithy/middleware-endpoint" "^3.2.4" + "@smithy/middleware-stack" "^3.0.10" + "@smithy/protocol-http" "^4.1.7" + "@smithy/types" "^3.7.1" + "@smithy/util-stream" "^3.3.1" + tslib "^2.6.2" + +"@smithy/types@^3.7.1": + version "3.7.1" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-3.7.1.tgz#4af54c4e28351e9101996785a33f2fdbf93debe7" + integrity sha512-XKLcLXZY7sUQgvvWyeaL/qwNPp6V3dWcUjqrQKjSb+tzYiCy340R/c64LV5j+Tnb2GhmunEX0eou+L+m2hJNYA== + dependencies: + tslib "^2.6.2" + +"@smithy/url-parser@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-3.0.10.tgz#f389985a79766cff4a99af14979f01a17ce318da" + integrity sha512-j90NUalTSBR2NaZTuruEgavSdh8MLirf58LoGSk4AtQfyIymogIhgnGUU2Mga2bkMkpSoC9gxb74xBXL5afKAQ== + dependencies: + "@smithy/querystring-parser" "^3.0.10" + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@smithy/util-base64@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-3.0.0.tgz#f7a9a82adf34e27a72d0719395713edf0e493017" + integrity sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ== + dependencies: + "@smithy/util-buffer-from" "^3.0.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@smithy/util-body-length-browser@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz#86ec2f6256310b4845a2f064e2f571c1ca164ded" + integrity sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ== + dependencies: + tslib "^2.6.2" + +"@smithy/util-body-length-node@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz#99a291bae40d8932166907fe981d6a1f54298a6d" + integrity sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA== + dependencies: + tslib "^2.6.2" + +"@smithy/util-buffer-from@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz#6fc88585165ec73f8681d426d96de5d402021e4b" + integrity sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA== + dependencies: + "@smithy/is-array-buffer" "^2.2.0" + tslib "^2.6.2" + +"@smithy/util-buffer-from@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz#559fc1c86138a89b2edaefc1e6677780c24594e3" + integrity sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA== + dependencies: + "@smithy/is-array-buffer" "^3.0.0" + tslib "^2.6.2" + +"@smithy/util-config-provider@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz#62c6b73b22a430e84888a8f8da4b6029dd5b8efe" + integrity sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ== + dependencies: + tslib "^2.6.2" + +"@smithy/util-defaults-mode-browser@^3.0.27": + version "3.0.28" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.28.tgz#c443b9ae2784b5621def0541a98fc9704c846bfc" + integrity sha512-6bzwAbZpHRFVJsOztmov5PGDmJYsbNSoIEfHSJJyFLzfBGCCChiO3od9k7E/TLgrCsIifdAbB9nqbVbyE7wRUw== + dependencies: + "@smithy/property-provider" "^3.1.10" + "@smithy/smithy-client" "^3.4.5" + "@smithy/types" "^3.7.1" + bowser "^2.11.0" + tslib "^2.6.2" + +"@smithy/util-defaults-mode-node@^3.0.27": + version "3.0.28" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.28.tgz#d6d742d62c2f678938b7a378224e79fca587458b" + integrity sha512-78ENJDorV1CjOQselGmm3+z7Yqjj5HWCbjzh0Ixuq736dh1oEnD9sAttSBNSLlpZsX8VQnmERqA2fEFlmqWn8w== + dependencies: + "@smithy/config-resolver" "^3.0.12" + "@smithy/credential-provider-imds" "^3.2.7" + "@smithy/node-config-provider" "^3.1.11" + "@smithy/property-provider" "^3.1.10" + "@smithy/smithy-client" "^3.4.5" + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@smithy/util-endpoints@^2.1.6": + version "2.1.6" + resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-2.1.6.tgz#720cbd1a616ad7c099b77780f0cb0f1f9fc5d2df" + integrity sha512-mFV1t3ndBh0yZOJgWxO9J/4cHZVn5UG1D8DeCc6/echfNkeEJWu9LD7mgGH5fHrEdR7LDoWw7PQO6QiGpHXhgA== + dependencies: + "@smithy/node-config-provider" "^3.1.11" + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@smithy/util-hex-encoding@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz#32938b33d5bf2a15796cd3f178a55b4155c535e6" + integrity sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ== + dependencies: + tslib "^2.6.2" + +"@smithy/util-middleware@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-3.0.10.tgz#ab8be99f1aaafe5a5490c344f27a264b72b7592f" + integrity sha512-eJO+/+RsrG2RpmY68jZdwQtnfsxjmPxzMlQpnHKjFPwrYqvlcT+fHdT+ZVwcjlWSrByOhGr9Ff2GG17efc192A== + dependencies: + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@smithy/util-retry@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-3.0.10.tgz#fc13e1b30e87af0cbecadf29ca83b171e2040440" + integrity sha512-1l4qatFp4PiU6j7UsbasUHL2VU023NRB/gfaa1M0rDqVrRN4g3mCArLRyH3OuktApA4ye+yjWQHjdziunw2eWA== + dependencies: + "@smithy/service-error-classification" "^3.0.10" + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@smithy/util-stream@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-3.3.1.tgz#a2636f435637ef90d64df2bb8e71cd63236be112" + integrity sha512-Ff68R5lJh2zj+AUTvbAU/4yx+6QPRzg7+pI7M1FbtQHcRIp7xvguxVsQBKyB3fwiOwhAKu0lnNyYBaQfSW6TNw== + dependencies: + "@smithy/fetch-http-handler" "^4.1.1" + "@smithy/node-http-handler" "^3.3.1" + "@smithy/types" "^3.7.1" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-buffer-from" "^3.0.0" + "@smithy/util-hex-encoding" "^3.0.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@smithy/util-uri-escape@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz#e43358a78bf45d50bb736770077f0f09195b6f54" + integrity sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg== + dependencies: + tslib "^2.6.2" + +"@smithy/util-utf8@^2.0.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.3.0.tgz#dd96d7640363259924a214313c3cf16e7dd329c5" + integrity sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A== + dependencies: + "@smithy/util-buffer-from" "^2.2.0" + tslib "^2.6.2" + +"@smithy/util-utf8@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-3.0.0.tgz#1a6a823d47cbec1fd6933e5fc87df975286d9d6a" + integrity sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA== + dependencies: + "@smithy/util-buffer-from" "^3.0.0" + tslib "^2.6.2" + +"@smithy/util-waiter@^3.1.9": + version "3.1.9" + resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-3.1.9.tgz#1330ce2e79b58419d67755d25bce7a226e32dc6d" + integrity sha512-/aMXPANhMOlMPjfPtSrDfPeVP8l56SJlz93xeiLmhLe5xvlXA5T3abZ2ilEsDEPeY9T/wnN/vNGn9wa1SbufWA== + dependencies: + "@smithy/abort-controller" "^3.1.8" + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@szmarczak/http-timer@^4.0.5": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" + +"@tufjs/canonical-json@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz#a52f61a3d7374833fca945b2549bc30a2dd40d0a" + integrity sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA== + +"@tufjs/models@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-2.0.1.tgz#e429714e753b6c2469af3212e7f320a6973c2812" + integrity sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg== + dependencies: + "@tufjs/canonical-json" "2.0.0" + minimatch "^9.0.4" + +"@types/aws-lambda@^8.10.23": + version "8.10.146" + resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.146.tgz#05f9968d8cd9719a0a86526baf889c25761f60b8" + integrity sha512-3BaDXYTh0e6UCJYL/jwV/3+GRslSc08toAiZSmleYtkAUyV5rtvdPYxrG/88uqvTuT6sb27WE9OS90ZNTIuQ0g== + +"@types/cacheable-request@^6.0.1": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" + integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "^3.1.4" + "@types/node" "*" + "@types/responselike" "^1.0.0" + +"@types/google-protobuf@^3.15.5": + version "3.15.12" + resolved "https://registry.yarnpkg.com/@types/google-protobuf/-/google-protobuf-3.15.12.tgz#eb2ba0eddd65712211a2b455dc6071d665ccf49b" + integrity sha512-40um9QqwHjRS92qnOaDpL7RmDK15NuZYo9HihiJRbYkMQZlWnuH8AdvbMy8/o6lgLmKbDUKa+OALCltHdbOTpQ== + +"@types/http-cache-semantics@*": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" + integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== + +"@types/keyv@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" + integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== + dependencies: + "@types/node" "*" + +"@types/node@*", "@types/node@>=13.7.0": + version "22.10.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.0.tgz#89bfc9e82496b9c7edea3382583fa94f75896e81" + integrity sha512-XC70cRZVElFHfIUB40FgZOBbgJYFKKMa5nb9lxcwYstFG/Mi+/Y0bGS+rs6Dmhmkpq4pnNiLiuZAbc02YCOnmA== + dependencies: + undici-types "~6.20.0" + +"@types/node@^18": + version "18.19.66" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.66.tgz#0937a47904ceba5994eedf5cf4b6d503d8d6136c" + integrity sha512-14HmtUdGxFUalGRfLLn9Gc1oNWvWh5zNbsyOLo5JV6WARSeN1QcEBKRnZm9QqNfrutgsl/hY4eJW63aZ44aBCg== + dependencies: + undici-types "~5.26.4" + +"@types/responselike@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50" + integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw== + dependencies: + "@types/node" "*" + +"@types/semver@^7.5.6": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + +"@types/shimmer@^1.0.2": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@types/shimmer/-/shimmer-1.2.0.tgz#9b706af96fa06416828842397a70dfbbf1c14ded" + integrity sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg== + +"@types/tmp@^0.2.6": + version "0.2.6" + resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.6.tgz#d785ee90c52d7cc020e249c948c36f7b32d1e217" + integrity sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA== + +"@types/uuid@^9.0.1": + version "9.0.8" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" + integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA== + +abbrev@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" + integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== + +acorn-import-attributes@^1.9.5: + version "1.9.5" + resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" + integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== + +acorn@^8.8.2: + version "8.14.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== + +agent-base@^7.0.2, agent-base@^7.1.0, agent-base@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" + integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== + dependencies: + debug "^4.3.4" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== + +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +bin-links@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-4.0.4.tgz#c3565832b8e287c85f109a02a17027d152a58a63" + integrity sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA== + dependencies: + cmd-shim "^6.0.0" + npm-normalize-package-bin "^3.0.0" + read-cmd-shim "^4.0.0" + write-file-atomic "^5.0.0" + +bowser@^2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" + integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +builtin-modules@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.0.0.tgz#1e587d44b006620d90286cc7a9238bbc6129cab1" + integrity sha512-hMIeU4K2ilbXV6Uv93ZZ0Avg/M91RaKXucQ+4me2Do1txxBDyDZWCBa5bJSLqoNTRpXTLwEzIk1KmloenDDjhg== + +cacache@^18.0.0, cacache@^18.0.3: + version "18.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-18.0.4.tgz#4601d7578dadb59c66044e157d02a3314682d6a5" + integrity sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ== + dependencies: + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^10.0.1" + minipass "^7.0.3" + minipass-collect "^2.0.1" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^4.0.0" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" + +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + +cacheable-request@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" + integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +cjs-module-lexer@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" + integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== + dependencies: + mimic-response "^1.0.0" + +cmd-shim@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-6.0.3.tgz#c491e9656594ba17ac83c4bd931590a9d6e26033" + integrity sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +common-ancestor-path@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7" + integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== + +cross-spawn@^7.0.0, cross-spawn@^7.0.3: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +debug@4, debug@^4.3.4, debug@^4.3.5: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +defer-to-connect@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + +"docker-classic@npm:@pulumi/docker@3.6.1": + version "3.6.1" + resolved "https://registry.yarnpkg.com/@pulumi/docker/-/docker-3.6.1.tgz#a216c9bd2bbd35dd7091db2827a3a434adff021c" + integrity sha512-BZME50QkT556v+LvmTXPT8ssB2xxNkp9+msB5xYFEnUnWcdGAx5yUysQw70RJCb+U0GbkJSbxtlgMJgOQf/now== + dependencies: + "@pulumi/pulumi" "^3.0.0" + semver "^5.4.0" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +encoding@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + +escalade@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +execa@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + 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" + +exponential-backoff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" + integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== + +fast-xml-parser@4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz#86dbf3f18edf8739326447bcaac31b4ae7f6514f" + integrity sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw== + dependencies: + strnum "^1.0.5" + +fdir@^6.1.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.2.tgz#ddaa7ce1831b161bc3657bb99cb36e1622702689" + integrity sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ== + +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + +foreground-child@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-minipass@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.3.tgz#79a85981c4dc120065e96f62086bf6f9dc26cc54" + integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== + dependencies: + minipass "^7.0.3" + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob@^10.2.2, glob@^10.3.10: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +google-protobuf@^3.5.0: + version "3.21.4" + resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.21.4.tgz#2f933e8b6e5e9f8edde66b7be0024b68f77da6c9" + integrity sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ== + +got@^11.8.6: + version "11.8.6" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + +graceful-fs@^4.2.6: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +hosted-git-info@^7.0.0, hosted-git-info@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-7.0.2.tgz#9b751acac097757667f30114607ef7b661ff4f17" + integrity sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w== + dependencies: + lru-cache "^10.0.1" + +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + +http-proxy-agent@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + +https-proxy-agent@^7.0.1: + version "7.0.5" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" + integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== + dependencies: + agent-base "^7.0.2" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ignore-walk@^6.0.4: + version "6.0.5" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.5.tgz#ef8d61eab7da169078723d1f82833b36e200b0dd" + integrity sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A== + dependencies: + minimatch "^9.0.0" + +import-in-the-middle@^1.8.1: + version "1.11.2" + resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.11.2.tgz#dd848e72b63ca6cd7c34df8b8d97fc9baee6174f" + integrity sha512-gK6Rr6EykBcc6cVWRSBR5TWf8nn6hZMYSRYqCcHa0l0d1fPK7JSYo6+Mlmck76jIX9aL/IZ71c06U2VpFwl1zA== + dependencies: + acorn "^8.8.2" + acorn-import-attributes "^1.9.5" + cjs-module-lexer "^1.2.2" + module-details-from-path "^1.0.3" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +ini@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +ini@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.3.tgz#4c359675a6071a46985eb39b14e4a2c0ec98a795" + integrity sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg== + +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" + +is-core-module@^2.13.0: + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== + dependencies: + hasown "^2.0.2" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isexe@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" + integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== + +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +js-yaml@^3.14.0: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^3.0.0, json-parse-even-better-errors@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz#b43d35e89c0f3be6b5fbbe9dc6c82467b30c28da" + integrity sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ== + +json-stringify-nice@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67" + integrity sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw== + +jsonparse@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + +just-diff-apply@^5.2.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/just-diff-apply/-/just-diff-apply-5.5.0.tgz#771c2ca9fa69f3d2b54e7c3f5c1dfcbcc47f9f0f" + integrity sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw== + +just-diff@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-6.0.2.tgz#03b65908543ac0521caf6d8eb85035f7d27ea285" + integrity sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA== + +keyv@^4.0.0: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + +long@^5.0.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^10.0.1, lru-cache@^10.2.0, lru-cache@^10.2.2: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + +make-fetch-happen@^13.0.0, make-fetch-happen@^13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz#273ba2f78f45e1f3a6dca91cede87d9fa4821e36" + integrity sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA== + dependencies: + "@npmcli/agent" "^2.0.0" + cacache "^18.0.0" + http-cache-semantics "^4.1.1" + is-lambda "^1.0.1" + minipass "^7.0.2" + minipass-fetch "^3.0.0" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + proc-log "^4.2.0" + promise-retry "^2.0.1" + ssri "^10.0.0" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +mime@^2.0.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +minimatch@^9.0.0, minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass-collect@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-2.0.1.tgz#1621bc77e12258a12c60d34e2276ec5c20680863" + integrity sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw== + dependencies: + minipass "^7.0.3" + +minipass-fetch@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.5.tgz#f0f97e40580affc4a35cc4a1349f05ae36cb1e4c" + integrity sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg== + dependencies: + minipass "^7.0.3" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.2, minipass@^7.0.3, minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +minizlib@^2.1.1, minizlib@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +module-details-from-path@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/module-details-from-path/-/module-details-from-path-1.0.3.tgz#114c949673e2a8a35e9d35788527aa37b679da2b" + integrity sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A== + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +negotiator@^0.6.3: + version "0.6.4" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + +node-gyp@^10.0.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-10.2.0.tgz#80101c4aa4f7ab225f13fcc8daaaac4eb1a8dd86" + integrity sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw== + dependencies: + env-paths "^2.2.0" + exponential-backoff "^3.1.1" + glob "^10.3.10" + graceful-fs "^4.2.6" + make-fetch-happen "^13.0.0" + nopt "^7.0.0" + proc-log "^4.1.0" + semver "^7.3.5" + tar "^6.2.1" + which "^4.0.0" + +nopt@^7.0.0, nopt@^7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.1.tgz#1cac0eab9b8e97c9093338446eddd40b2c8ca1e7" + integrity sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w== + dependencies: + abbrev "^2.0.0" + +normalize-package-data@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-6.0.2.tgz#a7bc22167fe24025412bcff0a9651eb768b03506" + integrity sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g== + dependencies: + hosted-git-info "^7.0.0" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +npm-bundled@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-3.0.1.tgz#cca73e15560237696254b10170d8f86dad62da25" + integrity sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ== + dependencies: + npm-normalize-package-bin "^3.0.0" + +npm-install-checks@^6.0.0, npm-install-checks@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.3.0.tgz#046552d8920e801fa9f919cad569545d60e826fe" + integrity sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw== + dependencies: + semver "^7.1.1" + +npm-normalize-package-bin@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" + integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== + +npm-package-arg@^11.0.0, npm-package-arg@^11.0.2: + version "11.0.3" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-11.0.3.tgz#dae0c21199a99feca39ee4bfb074df3adac87e2d" + integrity sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw== + dependencies: + hosted-git-info "^7.0.0" + proc-log "^4.0.0" + semver "^7.3.5" + validate-npm-package-name "^5.0.0" + +npm-packlist@^8.0.0: + version "8.0.2" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-8.0.2.tgz#5b8d1d906d96d21c85ebbeed2cf54147477c8478" + integrity sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA== + dependencies: + ignore-walk "^6.0.4" + +npm-pick-manifest@^9.0.0, npm-pick-manifest@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz#83562afde52b0b07cb6244361788d319ce7e8636" + integrity sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA== + dependencies: + npm-install-checks "^6.0.0" + npm-normalize-package-bin "^3.0.0" + npm-package-arg "^11.0.0" + semver "^7.3.5" + +npm-registry-fetch@^17.0.0, npm-registry-fetch@^17.0.1: + version "17.1.0" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz#fb69e8e762d456f08bda2f5f169f7638fb92beb1" + integrity sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA== + dependencies: + "@npmcli/redact" "^2.0.0" + jsonparse "^1.3.1" + make-fetch-happen "^13.0.0" + minipass "^7.0.2" + minipass-fetch "^3.0.0" + minizlib "^2.1.2" + npm-package-arg "^11.0.0" + proc-log "^4.0.0" + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + +pacote@^18.0.0, pacote@^18.0.6: + version "18.0.6" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-18.0.6.tgz#ac28495e24f4cf802ef911d792335e378e86fac7" + integrity sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A== + dependencies: + "@npmcli/git" "^5.0.0" + "@npmcli/installed-package-contents" "^2.0.1" + "@npmcli/package-json" "^5.1.0" + "@npmcli/promise-spawn" "^7.0.0" + "@npmcli/run-script" "^8.0.0" + cacache "^18.0.0" + fs-minipass "^3.0.0" + minipass "^7.0.2" + npm-package-arg "^11.0.0" + npm-packlist "^8.0.0" + npm-pick-manifest "^9.0.0" + npm-registry-fetch "^17.0.0" + proc-log "^4.0.0" + promise-retry "^2.0.1" + sigstore "^2.2.0" + ssri "^10.0.0" + tar "^6.1.11" + +parse-conflict-json@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz#67dc55312781e62aa2ddb91452c7606d1969960c" + integrity sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw== + dependencies: + json-parse-even-better-errors "^3.0.0" + just-diff "^6.0.0" + just-diff-apply "^5.2.0" + +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +picomatch@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-3.0.1.tgz#817033161def55ec9638567a2f3bbc876b3e7516" + integrity sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag== + +pkg-dir@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11" + integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== + dependencies: + find-up "^6.3.0" + +postcss-selector-parser@^6.0.10: + version "6.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" + integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +proc-log@^4.0.0, proc-log@^4.1.0, proc-log@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-4.2.0.tgz#b6f461e4026e75fdfe228b265e9f7a00779d7034" + integrity sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA== + +proggy@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/proggy/-/proggy-2.0.0.tgz#154bb0e41d3125b518ef6c79782455c2c47d94e1" + integrity sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A== + +promise-all-reject-late@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz#f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2" + integrity sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw== + +promise-call-limit@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/promise-call-limit/-/promise-call-limit-3.0.2.tgz#524b7f4b97729ff70417d93d24f46f0265efa4f9" + integrity sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + +protobufjs@^7.2.5: + version "7.4.0" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.4.0.tgz#7efe324ce9b3b61c82aae5de810d287bc08a248a" + integrity sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/node" ">=13.7.0" + long "^5.0.0" + +pump@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +read-cmd-shim@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz#640a08b473a49043e394ae0c7a34dd822c73b9bb" + integrity sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q== + +read-package-json-fast@^3.0.0, read-package-json-fast@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz#394908a9725dc7a5f14e70c8e7556dff1d2b1049" + integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== + dependencies: + json-parse-even-better-errors "^3.0.0" + npm-normalize-package-bin "^3.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-in-the-middle@^7.1.1: + version "7.4.0" + resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-7.4.0.tgz#606977820d4b5f9be75e5a108ce34cfed25b3bb4" + integrity sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ== + dependencies: + debug "^4.3.5" + module-details-from-path "^1.0.3" + resolve "^1.22.8" + +resolve-alpn@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + +resolve@^1.22.8, resolve@^1.7.1: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +responselike@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" + integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== + dependencies: + lowercase-keys "^2.0.0" + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^5.4.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^7.1.1, semver@^7.3.5, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shimmer@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.1.tgz#610859f7de327b587efebf501fb43117f9aff337" + integrity sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw== + +signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +sigstore@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-2.3.1.tgz#0755dd2cc4820f2e922506da54d3d628e13bfa39" + integrity sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ== + dependencies: + "@sigstore/bundle" "^2.3.2" + "@sigstore/core" "^1.0.0" + "@sigstore/protobuf-specs" "^0.3.2" + "@sigstore/sign" "^2.3.2" + "@sigstore/tuf" "^2.3.4" + "@sigstore/verify" "^1.2.1" + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socks-proxy-agent@^8.0.3: + version "8.0.4" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz#9071dca17af95f483300316f4b063578fa0db08c" + integrity sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw== + dependencies: + agent-base "^7.1.1" + debug "^4.3.4" + socks "^2.8.3" + +socks@^2.8.3: + version "2.8.3" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" + integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== + dependencies: + ip-address "^9.0.5" + smart-buffer "^4.2.0" + +source-map-support@^0.5.6: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.20" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz#e44ed19ed318dd1e5888f93325cee800f0f51b89" + integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw== + +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +ssri@^10.0.0, ssri@^10.0.6: + version "10.0.6" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.6.tgz#a8aade2de60ba2bce8688e3fa349bad05c7dc1e5" + integrity sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ== + dependencies: + minipass "^7.0.3" + +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strnum@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" + integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tar@^6.1.11, tar@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +tmp@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== + +treeverse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-3.0.0.tgz#dd82de9eb602115c6ebd77a574aae67003cb48c8" + integrity sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ== + +tslib@^2.6.2: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +tuf-js@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-2.2.1.tgz#fdd8794b644af1a75c7aaa2b197ddffeb2911b56" + integrity sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA== + dependencies: + "@tufjs/models" "2.0.1" + debug "^4.3.4" + make-fetch-happen "^13.0.1" + +typescript@^5.0.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" + integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + +unique-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" + integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== + dependencies: + unique-slug "^4.0.0" + +unique-slug@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" + integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== + dependencies: + imurmurhash "^0.1.4" + +upath@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +uuid@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + +validate-npm-package-license@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validate-npm-package-name@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz#a316573e9b49f3ccd90dbb6eb52b3f06c6d604e8" + integrity sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ== + +walk-up-path@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-3.0.1.tgz#c8d78d5375b4966c717eb17ada73dbd41490e886" + integrity sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA== + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +which@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" + integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== + dependencies: + isexe "^3.1.1" + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" + integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^4.0.1" + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yocto-queue@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.1.1.tgz#fef65ce3ac9f8a32ceac5a634f74e17e5b232110" + integrity sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g== diff --git a/packages/untp-playground/next.config.ts b/packages/untp-playground/next.config.ts new file mode 100644 index 00000000..6d3686e1 --- /dev/null +++ b/packages/untp-playground/next.config.ts @@ -0,0 +1,10 @@ +import type { NextConfig } from 'next'; + +const nextConfig: NextConfig = { + ...(process.env.NEXT_PUBLIC_BASE_PATH && { basePath: process.env.NEXT_PUBLIC_BASE_PATH }), + ...(process.env.NEXT_PUBLIC_ASSET_PREFIX && { assetPrefix: process.env.NEXT_PUBLIC_ASSET_PREFIX }), + trailingSlash: false, + output: 'standalone', +}; + +export default nextConfig; diff --git a/packages/untp-playground/package.json b/packages/untp-playground/package.json new file mode 100644 index 00000000..f7e95bb2 --- /dev/null +++ b/packages/untp-playground/package.json @@ -0,0 +1,41 @@ +{ + "name": "untp-playground", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@radix-ui/react-dialog": "^1.1.2", + "@radix-ui/react-select": "^2.1.2", + "@radix-ui/react-slot": "^1.1.0", + "ajv": "^8.0.0", + "ajv-formats": "^3.0.1", + "canvas-confetti": "^1.9.3", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "jwt-decode": "^4.0.0", + "lucide-react": "^0.460.0", + "next": "^15.0.3", + "react": "19.0.0-rc-66855b96-20241106", + "react-dom": "19.0.0-rc-66855b96-20241106", + "react-dropzone": "^14.3.5", + "sonner": "^1.7.0", + "tailwind-merge": "^2.5.4", + "tailwindcss-animate": "^1.0.7" + }, + "devDependencies": { + "@types/canvas-confetti": "^1.6.4", + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "eslint": "^8", + "eslint-config-next": "15.0.3", + "postcss": "^8", + "tailwindcss": "^3.4.1", + "typescript": "^5" + } +} diff --git a/packages/untp-playground/postcss.config.mjs b/packages/untp-playground/postcss.config.mjs new file mode 100644 index 00000000..1a69fd2a --- /dev/null +++ b/packages/untp-playground/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + }, +}; + +export default config; diff --git a/packages/untp-playground/public/credentials/dpp.json b/packages/untp-playground/public/credentials/dpp.json new file mode 100644 index 00000000..e2c8577c --- /dev/null +++ b/packages/untp-playground/public/credentials/dpp.json @@ -0,0 +1,8 @@ +{ + "@context": [ + "https://www.w3.org/ns/credentials/v2", + "https://vocabulary.uncefact.org/untp/dpp/0.5.0/" + ], + "type": "EnvelopedVerifiableCredential", + "id": "data:application/vc-ld+jwt,eyJhbGciOiJFZERTQSIsImlzcyI6ImRpZDp3ZWI6dW5jZWZhY3QuZ2l0aHViLmlvOnByb2plY3QtdmNraXQ6dGVzdC1hbmQtZGV2ZWxvcG1lbnQiLCJ0eXAiOiJ2Yy1sZCtqd3QifQ.eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvbnMvY3JlZGVudGlhbHMvdjIiLCJodHRwczovL3ZvY2FidWxhcnkudW5jZWZhY3Qub3JnL3VudHAvZHBwLzAuNS4wLyJdLCJ0eXBlIjpbIkRpZ2l0YWxQcm9kdWN0UGFzc3BvcnQiLCJWZXJpZmlhYmxlQ3JlZGVudGlhbCJdLCJpc3N1ZXIiOnsiaWQiOiJkaWQ6d2ViOnVuY2VmYWN0LmdpdGh1Yi5pbzpwcm9qZWN0LXZja2l0OnRlc3QtYW5kLWRldmVsb3BtZW50IiwibmFtZSI6IkVjb0NoYXJnZSBCYXR0ZXJ5IFN5c3RlbXMgUHR5IEx0ZCJ9LCJjcmVkZW50aWFsU3ViamVjdCI6eyJ0eXBlIjpbIlByb2R1Y3QiXSwiaWQiOiJodHRwczovL2lkLmdzMS5vcmcvMDEvMDk1MjAxMjM0NTY3ODgvMjEvMTIzNDUiLCJuYW1lIjoiRWNvQ2hhcmdlIEVWIEJhdHRlcnkgUGFjayIsInJlZ2lzdGVyZWRJZCI6IjA5NTIwMTIzNDU2Nzg4IiwiaWRTY2hlbWUiOnsidHlwZSI6WyJJZGVudGlmaWVyU2NoZW1lIl0sImlkIjoiaHR0cHM6Ly9pZC5nczEub3JnLzAxIiwibmFtZSI6Ikdsb2JhbCBUcmFkZSBJdGVtIE51bWJlciAoR1RJTikifSwicHJvZHVjdEltYWdlIjp7InR5cGUiOlsiTGluayJdLCJsaW5rVVJMIjoiaHR0cHM6Ly9jLmFuaW1hYXBwLmNvbS9iM3ZmMk0yMC9pbWcvcHAtaGVhZGVyQDJ4LnBuZyIsImxpbmtOYW1lIjoiRVYgQmF0dGVyeSAzMDBBaCBJbWFnZSJ9LCJzZXJpYWxOdW1iZXIiOiIwMDAxIiwiYmF0Y2hOdW1iZXIiOiIyMDI0UTEtMDAxIiwiZGVzY3JpcHRpb24iOiJIaWdoLXBlcmZvcm1hbmNlIGF1dG9tb3RpdmUtZ3JhZGUgbGl0aGl1bS1pb24gYmF0dGVyeSBwYWNrIGRlc2lnbmVkIGZvciBlbGVjdHJpYyB2ZWhpY2xlcy4gTWFudWZhY3R1cmVkIHdpdGggcmVzcG9uc2libHkgc291cmNlZCBtYXRlcmlhbHMgYW5kIGEgOTUlIHJlY3ljbGFiaWxpdHkgcmF0ZSwgaXQgcmVkdWNlcyBsaWZlY3ljbGUgZW1pc3Npb25zIHRocm91Z2ggZWNvLWZyaWVuZGx5IHByb2R1Y3Rpb24gYW5kIHZlcmlmaWVkIHJlY3ljbGluZyBwcm9ncmFtcy4iLCJwcm9kdWN0Q2F0ZWdvcnkiOlt7InR5cGUiOlsiQ2xhc3NpZmljYXRpb24iXSwiaWQiOiJodHRwczovL3Vuc3RhdHMudW4ub3JnL3Vuc2QvY2xhc3NpZmljYXRpb25zL0Vjb24vY3BjLzQ2NDEwIiwiY29kZSI6IjQ2NDEwIiwibmFtZSI6IlByaW1hcnkgY2VsbHMgYW5kIHByaW1hcnkgYmF0dGVyaWVzIiwic2NoZW1lSUQiOiJodHRwczovL3Vuc3RhdHMudW4ub3JnL3Vuc2QvY2xhc3NpZmljYXRpb25zL0Vjb24vY3BjIiwic2NoZW1lTmFtZSI6IlVOIENlbnRyYWwgUHJvZHVjdCBDbGFzc2lmaWNhdGlvbiAoQ1BDKSJ9XSwicHJvZHVjZWRCeVBhcnR5Ijp7InR5cGUiOlsiSWRlbnRpZmllciJdLCJpZCI6Imh0dHBzOi8vaWRyLnVudHAuc2hvd3RoZXRoaW5nLmNvbS9hdG8vYWJuLzIyMTMzODQwMzIyNjU5P2xpbmtUeXBlPWF0bzpjZXJ0aWZpY2F0aW9uSW5mbyIsIm5hbWUiOiJFY29DaGFyZ2UgQmF0dGVyeSBTeXN0ZW1zIFB0eSBMdGQiLCJyZWdpc3RlcmVkSWQiOiI5MDY2NDg2OTMyNyIsImlkU2NoZW1lIjp7InR5cGUiOlsiSWRlbnRpZmllclNjaGVtZSJdLCJpZCI6Imh0dHBzOi8vYWJyLmJ1c2luZXNzLmdvdi5hdS9BQk4iLCJuYW1lIjoiQXVzdHJhbGlhbiBCdXNpbmVzcyBOdW1iZXIifX0sInByb2R1Y2VkQXRGYWNpbGl0eSI6eyJ0eXBlIjpbIklkZW50aWZpZXIiXSwiaWQiOiJodHRwczovL2lkci51bnRwLnNob3d0aGV0aGluZy5jb20vZ3MxL2dsbi8xMzIxMjAyMjkwNjQ4P2xpbmtUeXBlPWdzMTpjZXJ0aWZpY2F0aW9uSW5mbyIsIm5hbWUiOiJFY29DaGFyZ2UgU3lkbmV5IE1hbnVmYWN0dXJpbmcgUGxhbnQiLCJyZWdpc3RlcmVkSWQiOiIxMzIxMjAyMjkwNjQ4IiwiaWRTY2hlbWUiOnsidHlwZSI6WyJJZGVudGlmaWVyU2NoZW1lIl0sImlkIjoiaHR0cHM6Ly9pZC5nczEub3JnLzQxNCIsIm5hbWUiOiJHbG9iYWwgTG9jYXRpb24gTnVtYmVyIn19LCJkaW1lbnNpb25zIjp7InR5cGUiOlsiRGltZW5zaW9uIl0sIndlaWdodCI6eyJ0eXBlIjpbIk1lYXN1cmUiXSwidmFsdWUiOjQ4MCwidW5pdCI6IktHTSJ9LCJsZW5ndGgiOnsidHlwZSI6WyJNZWFzdXJlIl0sInZhbHVlIjoyODAwLCJ1bml0IjoiTU1UIn0sIndpZHRoIjp7InR5cGUiOlsiTWVhc3VyZSJdLCJ2YWx1ZSI6MTYwMCwidW5pdCI6Ik1NVCJ9LCJoZWlnaHQiOnsidHlwZSI6WyJNZWFzdXJlIl0sInZhbHVlIjoyMDAsInVuaXQiOiJNTVQifSwidm9sdW1lIjp7InR5cGUiOlsiTWVhc3VyZSJdLCJ2YWx1ZSI6MjUwLCJ1bml0IjoiRE1RIn19LCJwcm9kdWN0aW9uRGF0ZSI6IjIwMjQtMDMtMTUiLCJjb3VudHJ5T2ZQcm9kdWN0aW9uIjoiQVUiLCJncmFudWxhcml0eUxldmVsIjoiaXRlbSIsImNoYXJhY3RlcmlzdGljIjp7ImJhdHRlcnlTdGF0dXMiOiJuZXciLCJiYXR0ZXJ5Q2VsbFR5cGUiOiJQcmlzbWF0aWMiLCJudW1iZXJPZkNlbGxzIjoxODAsInRvdGFsRW5lcmd5IjoiMTAwa3doIn0sImR1ZURpbGlnZW5jZURlY2xhcmF0aW9uIjp7InR5cGUiOlsiTGluayJdLCJsaW5rVVJMIjoiaHR0cHM6Ly9iYXR0ZXJ5LW1hbnVmYWN0dXJlci5leGFtcGxlLmNvbS9kdWUtZGlsaWdlbmNlLzEyMzQ1NjciLCJsaW5rTmFtZSI6IkR1ZSBEaWxpZ2VuY2UgRGVjbGFyYXRpb24ifSwibWF0ZXJpYWxzUHJvdmVuYW5jZSI6W3sidHlwZSI6WyJNYXRlcmlhbCJdLCJuYW1lIjoiTGl0aGl1bSIsIm9yaWdpbkNvdW50cnkiOiJBVSIsIm1hc3NGcmFjdGlvbiI6MC4zLCJtYXNzQW1vdW50Ijp7InR5cGUiOlsiTWVhc3VyZSJdLCJ2YWx1ZSI6NzUsInVuaXQiOiJLR00ifX0seyJ0eXBlIjpbIk1hdGVyaWFsIl0sIm5hbWUiOiJOaWNrZWwiLCJvcmlnaW5Db3VudHJ5IjoiQVUiLCJtYXNzRnJhY3Rpb24iOjAuMywibWFzc0Ftb3VudCI6eyJ0eXBlIjpbIk1lYXN1cmUiXSwidmFsdWUiOjc1LCJ1bml0IjoiS0dNIn19LHsidHlwZSI6WyJNYXRlcmlhbCJdLCJuYW1lIjoiQ29iYWx0Iiwib3JpZ2luQ291bnRyeSI6IkFVIiwibWFzc0ZyYWN0aW9uIjowLjIsIm1hc3NBbW91bnQiOnsidHlwZSI6WyJNZWFzdXJlIl0sInZhbHVlIjo1MCwidW5pdCI6IktHTSJ9fSx7InR5cGUiOlsiTWF0ZXJpYWwiXSwibmFtZSI6Ik90aGVyIE1hdGVyaWFscyIsIm9yaWdpbkNvdW50cnkiOiJBVSIsIm1hc3NGcmFjdGlvbiI6MC4yLCJtYXNzQW1vdW50Ijp7InR5cGUiOlsiTWVhc3VyZSJdLCJ2YWx1ZSI6NTAsInVuaXQiOiJLR00ifX1dLCJjb25mb3JtaXR5Q2xhaW0iOlt7InR5cGUiOlsiQ2xhaW0iLCJEZWNsYXJhdGlvbiJdLCJpZCI6Imh0dHBzOi8vY2VydGlmaWVyLmV4YW1wbGUuY29tL2F0dGVzdGF0aW9ucy8yMDI0LTAwMSIsImFzc2Vzc21lbnREYXRlIjoiMjAyNC0wMy0xNSIsImNvbmZvcm1hbmNlIjp0cnVlLCJjb25mb3JtaXR5VG9waWMiOiJzb2NpYWwuc2FmZXR5IiwiY29uZm9ybWl0eUV2aWRlbmNlIjp7InR5cGUiOlsiU2VjdXJlTGluayIsIkxpbmsiXSwibGlua1VSTCI6Imh0dHBzOi8vaWRyLnVudHAuc2hvd3RoZXRoaW5nLmNvbS9nczEvZ3Rpbi8wOTM1OTUwMjAwMDAzND9saW5rVHlwZT1nczE6Y2VydGlmaWNhdGlvbkluZm8iLCJsaW5rTmFtZSI6IkNvbmZvcm1pdHkgRXZpZGVuY2UifSwicmVmZXJlbmNlU3RhbmRhcmQiOnsidHlwZSI6WyJTdGFuZGFyZCJdLCJpZCI6Imh0dHBzOi8vd3d3Lmlzby5vcmcvc3RhbmRhcmQvNzE0MDcuaHRtbCIsIm5hbWUiOiJJU08gMTI0MDUtNDoyMDE4IC0gVGVzdCBzcGVjaWZpY2F0aW9uIGZvciBsaXRoaXVtLWlvbiB0cmFjdGlvbiBiYXR0ZXJ5IHBhY2tzIGFuZCBzeXN0ZW1zIiwiaXNzdWluZ1BhcnR5Ijp7InR5cGUiOlsiSWRlbnRpZmllciJdLCJpZCI6Imh0dHBzOi8vd3d3Lmlzby5vcmciLCJuYW1lIjoiSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbiJ9LCJpc3N1ZURhdGUiOiIyMDE4LTAyLTE1In0sImRlY2xhcmVkVmFsdWUiOlt7InR5cGUiOlsiTWV0cmljIl0sIm1ldHJpY05hbWUiOiJTaG9ydCBDaXJjdWl0IFRlc3QgVGVtcGVyYXR1cmUgUmlzZSIsIm1ldHJpY1ZhbHVlIjp7InR5cGUiOlsiTWVhc3VyZSJdLCJ2YWx1ZSI6MCwidW5pdCI6IkNFTCJ9LCJhY2N1cmFjeSI6MC4wMSwic2NvcmUiOiJBIn0seyJ0eXBlIjpbIk1ldHJpYyJdLCJtZXRyaWNOYW1lIjoiTWF4aW11bSBPcGVyYXRpbmcgVGVtcGVyYXR1cmUiLCJtZXRyaWNWYWx1ZSI6eyJ0eXBlIjpbIk1lYXN1cmUiXSwidmFsdWUiOjU1LCJ1bml0IjoiQ0VMIn0sImFjY3VyYWN5IjowLjAxLCJzY29yZSI6IkEifV19XSwiY2lyY3VsYXJpdHlTY29yZWNhcmQiOnsidHlwZSI6WyJDaXJjdWxhcml0eVBlcmZvcm1hbmNlIl0sInJlY3ljbGFibGVDb250ZW50IjowLjk1LCJyZWN5Y2xlZENvbnRlbnQiOjAuMywidXRpbGl0eUZhY3RvciI6MS4yLCJtYXRlcmlhbENpcmN1bGFyaXR5SW5kaWNhdG9yIjowLjg1LCJyZWN5Y2xpbmdJbmZvcm1hdGlvbiI6eyJ0eXBlIjpbIkxpbmsiXSwibGlua1VSTCI6Imh0dHBzOi8vYmF0dGVyeS1tYW51ZmFjdHVyZXIuZXhhbXBsZS5jb20vcmVjeWNsaW5nL2V2MzAwIiwibGlua05hbWUiOiJCYXR0ZXJ5IFJlY3ljbGluZyBHdWlkZWxpbmVzIn0sInJlcGFpckluZm9ybWF0aW9uIjp7InR5cGUiOlsiTGluayJdLCJsaW5rVVJMIjoiaHR0cHM6Ly9iYXR0ZXJ5LW1hbnVmYWN0dXJlci5leGFtcGxlLmNvbS9yZXBhaXIvZXYzMDAiLCJsaW5rTmFtZSI6IlJlcGFpciBJbnN0cnVjdGlvbnMifX0sImVtaXNzaW9uc1Njb3JlY2FyZCI6eyJ0eXBlIjpbIkVtaXNzaW9uc1BlcmZvcm1hbmNlIl0sImNhcmJvbkZvb3RwcmludCI6MjUsImRlY2xhcmVkVW5pdCI6IktHTSIsIm9wZXJhdGlvbmFsU2NvcGUiOiJDcmFkbGVUb0dhdGUiLCJwcmltYXJ5U291cmNlZFJhdGlvIjowLjk1LCJyZXBvcnRpbmdTdGFuZGFyZCI6eyJ0eXBlIjpbIlN0YW5kYXJkIl0sImlkIjoiaHR0cHM6Ly9naGdwcm90b2NvbC5vcmcvcHJvZHVjdC1zdGFuZGFyZCIsImlzc3VlRGF0ZSI6IjIwMTEtMTEtMTUiLCJuYW1lIjoiR0hHIFByb3RvY29sIFByb2R1Y3QgTGlmZSBDeWNsZSBBY2NvdW50aW5nIGFuZCBSZXBvcnRpbmcgU3RhbmRhcmQiLCJpc3N1aW5nUGFydHkiOnsidHlwZSI6WyJJZGVudGlmaWVyIl0sImlkIjoiaHR0cHM6Ly9naGdwcm90b2NvbC5vcmciLCJuYW1lIjoiR3JlZW5ob3VzZSBHYXMgUHJvdG9jb2wifX19LCJ0cmFjZWFiaWxpdHlJbmZvcm1hdGlvbiI6eyJ2ZXJpZmllZFJhdGlvIjowfX0sImNyZWRlbnRpYWxTdGF0dXMiOnsiaWQiOiJodHRwczovL3Zja2l0LnVudHAuc2hvd3RoZXRoaW5nLmNvbS9jcmVkZW50aWFscy9zdGF0dXMvYml0c3RyaW5nLXN0YXR1cy1saXN0LzIjNDAiLCJ0eXBlIjoiQml0c3RyaW5nU3RhdHVzTGlzdEVudHJ5Iiwic3RhdHVzUHVycG9zZSI6InJldm9jYXRpb24iLCJzdGF0dXNMaXN0SW5kZXgiOjQwLCJzdGF0dXNMaXN0Q3JlZGVudGlhbCI6Imh0dHBzOi8vdmNraXQudW50cC5zaG93dGhldGhpbmcuY29tL2NyZWRlbnRpYWxzL3N0YXR1cy9iaXRzdHJpbmctc3RhdHVzLWxpc3QvMiJ9LCJpZCI6InVybjp1dWlkOmJjMDc1YzVmLTIzMDQtNGIzZi1iYjI0LTQ2ZDlmYTlhOGU2MCIsInJlbmRlciI6W3sidGVtcGxhdGUiOiI8IURPQ1RZUEUgaHRtbD4gPGh0bWwgbGFuZz1cImVuXCI-IDxoZWFkPiA8bWV0YSBjaGFyc2V0PVwiVVRGLThcIiAvPiA8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMFwiIC8-IDxsaW5rIGhyZWY9XCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI_ZmFtaWx5PUxhdG86aXRhbCx3Z2h0QDAsMTAwOzAsMzAwOzAsNDAwOzAsNzAwOzAsOTAwOzEsMTAwOzEsMzAwOzEsNDAwOzEsNzAwOzEsOTAwJmRpc3BsYXk9c3dhcFwiIHJlbD1cInN0eWxlc2hlZXRcIj4gPHRpdGxlPkRpZ2l0YWwgUHJvZHVjdCBQYXNzcG9ydDwvdGl0bGU-IDxzdHlsZT4gOnJvb3QgeyAtLWltYWdlLXNyYzogdXJsKCd7e2NyZWRlbnRpYWxTdWJqZWN0LnByb2R1Y3RJbWFnZS5saW5rVVJMfX0nKTsgLS1oaWdobGlnaHQ6IHJnYmEoMCwgOTksIDgzLCAxKTsgLS1wcmltYXJ5LWNvbG9yc2JsdWUtNDAwOiByZ2JhKDc5LCAxNDksIDIyMSwgMSk7IC0tcHJpbWFyeS1jb2xvcnNibHVlLTUwOiByZ2JhKDIxMCwgMjI5LCAyNDksIDEpOyAtLXByaW1hcnktY29sb3JzYmx1ZS0xMDogcmdiYSgyNDcsIDI1MCwgMjUzLCAxKTsgLS13aGl0ZTogcmdiYSgyNTUsIDI1NSwgMjU1LCAxKTsgLS1ibGFjazogcmdiYSgwLCAwLCAwLCAxKTsgLS1wcmltYXJ5LWNvbG9yc2dyYXktNDAwOiByZ2JhKDIxMiwgMjE0LCAyMTYsIDEpOyAtLXByaW1hcnktY29sb3JzZ3JheS02MDA6IHJnYmEoODUsIDk2LCAxMTAsIDEpOyAtLXByaW1hcnktY29sb3JzYmx1ZS03MDA6IHJnYmEoMzEsIDkwLCAxNDksIDEpOyAtLXByaW1hcnktY29sb3JzZ3JheS03MDA6IHJnYmEoMzUsIDQ2LCA2MSwgMSk7IC0tYWNjZW50LWNvbG9yc2xpZ2h0LWdyZWVuOiByZ2JhKDE4NCwgMjM2LCAxODIsIDEpOyAtLXRleHQtY29sb3ItZ3JlZW46IHJnYmEoOCwgNTAsIDAsIDEpOyAtLWFjY2VudC1jb2xvcnNsaWdodC1yZWQ6IHJnYmEoMjU1LCAxODgsIDE4MywgMSk7IC0tdGV4dC1jb2xvci1yZWQ6IHJnYmEoNTAsIDAsIDAsIDEpOyB9ICogeyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH0gYm9keSB7IGZvbnQtZmFtaWx5OiAnTGF0bycsIHNhbnMtc2VyaWY7IH0gc2VjdGlvbiB7IHBhZGRpbmc6IDAgMTZweCAwIDE2cHg7IH0gLnNlY3Rpb24tdGl0bGUgeyBmb250LXNpemU6IDE4cHg7IGZvbnQtd2VpZ2h0OiA3MDA7IGxpbmUtaGVpZ2h0OiAxOS42MnB4OyBjb2xvcjogIzAwMDAwMDsgfSAuc2VjdGlvbi1kZXNjcmlwdGlvbiB7IG1hcmdpbi10b3A6IDEycHg7IGZvbnQtc2l6ZTogMTZweDsgbGluZS1oZWlnaHQ6IDE4Ljg4cHg7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogNDAwOyB9IC50YWJsZSB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGp1c3RpZnktY29udGVudDogY2VudGVyOyBnYXA6IDEwcHg7IH0gLnRhYmxlLWl0ZW0geyBkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAyZnI7IGNvbHVtbi1nYXA6IDE2cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IHBhZGRpbmctYm90dG9tOiAxMHB4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2Q0ZDZkODsgfSAudGFibGUtaXRlbSBzcGFuIHsgZm9udC1zaXplOiAxNnB4OyBmb250LXdlaWdodDogNDAwOyBsaW5lLWhlaWdodDogMjJweDsgY29sb3I6IHZhcigtLXByaW1hcnktY29sb3JzZ3JheS02MDApOyB9IC50YWJsZS1pdGVtIHAsIC50YWJsZS1pdGVtIGEsIC50YWJsZS1pdGVtIGE6bGluayB7IGZvbnQtc2l6ZTogMTZweDsgZm9udC13ZWlnaHQ6IDUwMDsgbGluZS1oZWlnaHQ6IDIycHg7IGNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yc2dyYXktNzAwKTsgfSAudGFibGUtbGluZSB7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZDRkNmQ4OyB9IC5pdGVtLXRpdGxlIHsgZGlzcGxheTogZmxleDsgZm9udC1zaXplOiAxNnB4OyBmb250LXdlaWdodDogNDAwOyBsaW5lLWhlaWdodDogMTcuNDRweDsgY29sb3I6ICM1NTYwNkU7IH0gLml0ZW0tdmFsdWUgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBmb250LXNpemU6IDE2cHg7IGZvbnQtd2VpZ2h0OiA1MDA7IGxpbmUtaGVpZ2h0OiAxNy40NHB4OyBjb2xvcjogIzIzMkUzRDsgfSAuaXRlbS12YWx1ZSBhLCAuaXRlbS12YWx1ZSBzcGFuIHsgY29sb3I6ICMyMzJFM0Q7IH0gLmFubm90YXRpb24geyBkaXNwbGF5OiBmbGV4OyBnYXA6IDRweDsgZm9udC1zaXplOiAxNHB4OyBmb250LXdlaWdodDogNDAwOyBsaW5lLWhlaWdodDogMTUuMjZweDsgY29sb3I6ICM1NTYwNkU7IH0gLmFubm90YXRpb24gc3BhbiB7IHBhZGRpbmctdG9wOiAycHg7IH0gLm1vYmlsZSB7IG1pbi13aWR0aDogMTUwcHg7IHdpZHRoOiAxMDAlOyBtYXJnaW46IDAgYXV0bzsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiAzMnB4OyB3b3JkLWJyZWFrOiBicmVhay13b3JkOyB9IC5oZWFkZXIgeyBtaW4taGVpZ2h0OiAzMjBweDsgfSAuaGVhZGVyLWltYWdlIHsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDI0OC4zNmRlZywgcmdiYSgwLCAwLCAwLCAwLjE4KSA3LjYlLCByZ2JhKDAsIDAsIDAsIDAuNikgNzAuNTIlKTsgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0taW1hZ2Utc3JjKTsgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjsgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOyBoZWlnaHQ6IDIzMnB4OyBwb3NpdGlvbjogcmVsYXRpdmU7IH0gLmhlYWRlci1pbWFnZS10b3AtbGVmdCB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAyNXB4OyBsZWZ0OiAxNXB4OyBmb250LXdlaWdodDogNTAwOyBmb250LXNpemU6IDE2cHg7IGxpbmUtaGVpZ2h0OiAyMnB4OyBjb2xvcjogI2ZmZmZmZjsgfSAuaGVhZGVyLWltYWdlLWJvdHRvbS1sZWZ0IHsgcG9zaXRpb246IGFic29sdXRlOyBib3R0b206IDE4cHg7IGxlZnQ6IDE1cHg7IGNvbG9yOiAjZmZmZmZmOyB9IC5oZWFkZXItaW1hZ2UtYm90dG9tLWxlZnQgaDEgeyBmb250LXNpemU6IDMwcHg7IGZvbnQtd2VpZ2h0OiA5MDA7IGxpbmUtaGVpZ2h0OiAzMi41cHg7IH0gLmhlYWRlci1iYXRjaCB7IHBhZGRpbmc6IDEycHggMTZweCAxNnB4IDE2cHg7IGJhY2tncm91bmQtY29sb3I6ICNGN0ZBRkQ7IGRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMS4yZnIgMWZyOyBncmlkLWF1dG8tZmxvdzogcm93OyByb3ctZ2FwOiAxMnB4OyB9IC5oZWFkZXItYmF0Y2gtaXRlbSB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4OyB9IC5oZWFkZXItYmF0Y2gtaXRlbSBhIHsgY29sb3I6ICMyMzJFM0Q7IGZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDE1LjI1cHg7IGZvbnQtd2VpZ2h0OiA1MDA7IH0gLmhlYWRlci1iYXRjaCBhIHsgcGFkZGluZzogMCAycHg7IGZvbnQtc2l6ZTogMTRweDsgZm9udC13ZWlnaHQ6IDQwMDsgbGluZS1oZWlnaHQ6IDE5LjI1cHg7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgY29sb3I6ICMwMDAwMDA7IH0gLmluZm9ybWF0aW9uIHsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA4cHg7IH0gLmluZm9ybWF0aW9uLXRleHQgeyBmb250LXNpemU6IDE5cHg7IGZvbnQtd2VpZ2h0OiAzMDA7IGxpbmUtaGVpZ2h0OiAyMi40MnB4OyB9IC5pbmZvcm1hdGlvbi1zaG93LW1vcmUgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDEwcHg7IGZvbnQtc2l6ZTogMTRweDsgZm9udC13ZWlnaHQ6IDUwMDsgbGluZS1oZWlnaHQ6IDIycHg7IH0gLmluZm9ybWF0aW9uLXNob3ctbW9yZSBhIHsgY29sb3I6IHZhcigtLXByaW1hcnktY29sb3JzZ3JheS03MDApOyB9IC5wYXNzcG9ydCB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMjRweDsgfSAucGFzc3BvcnQtaGVhZGVyIHsgZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyOyB9IC5wYXNzcG9ydC1ib3ggeyBkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGJvcmRlcjogI0Q0RDZEOCAxcHggZG90dGVkOyBib3JkZXItcmFkaXVzOiA1cHg7IG92ZXJmbG93OiBoaWRkZW47IH0gLnBhc3Nwb3J0LWJveC1pdGVtIHsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IHBhZGRpbmc6IDEycHggMTZweCAxMnB4IDE2cHg7IGJvcmRlcjogI0Q0RDZEOCAxcHggZG90dGVkOyBvdXRsaW5lLW9mZnNldDogLTFweDsgbWluLWhlaWdodDogOTRweDsgY29sb3I6ICMxRjVBOTU7IH0gLnBhc3Nwb3J0LWJveC1pdGVtIGgzIHsgZm9udC1zaXplOiA0MHB4OyBmb250LXdlaWdodDogOTAwOyBsaW5lLWhlaWdodDogNDMuMzNweDsgbGV0dGVyLXNwYWNpbmc6IDJweDsgfSAucGFzc3BvcnQtYm94LWl0ZW0gcCB7IG1hcmdpbi10b3A6IDhweDsgZm9udC1zaXplOiAxNXB4OyBmb250LXdlaWdodDogNjAwOyBsaW5lLWhlaWdodDogMTguODhweDsgfSAucGFzc3BvcnQtYm94LWl0ZW06bGFzdC1jaGlsZCB7IGJhY2tncm91bmQtY29sb3I6ICNGN0ZBRkQ7IH0gLnBhc3Nwb3J0LWlzc3VlZC1ieS1oZWFkZXIgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDEycHg7IH0gLnBhc3Nwb3J0LWlzc3VlZC1ieS1oZWFkZXIgaDMgeyBtYXJnaW4tdG9wOiAycHg7IGZvbnQtc2l6ZTogMjBweDsgZm9udC13ZWlnaHQ6IDcwMDsgbGluZS1oZWlnaHQ6IDIxLjhweDsgfSAucGFzc3BvcnQtaXNzdWVkLWJ5LWhlYWRlciBwIHsgZm9udC1zaXplOiAxNnB4OyBmb250LXdlaWdodDogNDAwOyBsaW5lLWhlaWdodDogMTkuMjVweDsgY29sb3I6ICM1NTYwNkU7IH0gLnBhc3Nwb3J0LWFubm90YXRpb24geyBmb250LXNpemU6IDE0cHg7IGZvbnQtd2VpZ2h0OiA0MDA7IGxpbmUtaGVpZ2h0OiAxNS4yNnB4OyBjb2xvcjogIzU1NjA2RTsgfSAudHJhY2VhYmlsaXR5LWNhcmRzIHsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiAxMnB4OyB9IC50cmFjZWFiaWxpdHktY2FyZCB7IGRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogM2ZyIDFmcjsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyOyBtaW4taGVpZ2h0OiA0MHB4OyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IH0gLnRyYWNlYWJpbGl0eS1jYXJkLXRleHQgeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgZm9udC1zaXplOiAxNnB4OyBmb250LXdlaWdodDogNDAwOyBsaW5lLWhlaWdodDogMTcuNDRweDsgY29sb3I6ICMwMDAwMDA7IH0gLnRyYWNlYWJpbGl0eS1jYXJkLXZpZXctZGV0YWlscywgLnRyYWNlYWJpbGl0eS1jYXJkLXZpZXctZGV0YWlsczpsaW5rIHsgZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IH0gLmVtaXNzaW9uLXNjb3JlLWNhcmQgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDEycHg7IH0gLm1pc3Npb24tc2NvcmUtdGl0bGUgeyBmb250LXNpemU6IDIwcHg7IGZvbnQtd2VpZ2h0OiA3MDA7IGxpbmUtaGVpZ2h0OiAyMS44cHg7IH0gLm1pc3Npb24tc2NvcmUtZGVzY3JpcHRpb24geyBmb250LXNpemU6IDE2cHg7IGZvbnQtd2VpZ2h0OiA0MDA7IGxpbmUtaGVpZ2h0OiAxOC44OHB4OyBjb2xvcjogIzAwMDAwMDsgfSAuc2NvcmUgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDZweDsgfSAuc2NvcmUtdW5pdCB7IGZvbnQtc2l6ZTogNDBweDsgZm9udC13ZWlnaHQ6IDkwMDsgbGluZS1oZWlnaHQ6IDQzLjMzcHg7IGNvbG9yOiAjMUY1QTk1OyBsZXR0ZXItc3BhY2luZzogMnB4OyB9IC5zY29yZS1uYW1lIHsgZm9udC1zaXplOiAxNnB4OyBmb250LXdlaWdodDogNDAwOyBsaW5lLWhlaWdodDogMTcuNDRweDsgY29sb3I6ICM1NTYwNkU7IH0gLmRlY2xhcmF0aW9ucyB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMTJweDsgfSAuZGVjbGFyYXRpb24tdGl0bGUgeyBmb250LXNpemU6IDIwcHg7IGZvbnQtd2VpZ2h0OiA3MDA7IGxpbmUtaGVpZ2h0OiAyMS44cHg7IH0gLmNhcmRzLWNvbmZvcm1pdGllcyB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogOHB4OyB9IC5jYXJkcy1jb25mb3JtaXR5IHsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IGdhcDogOHB4OyBtaW4td2lkdGg6IDMzNnB4OyBwYWRkaW5nOiAxNnB4IDE4cHggMTZweCAxNnB4OyBwb3NpdGlvbjogcmVsYXRpdmU7IGJhY2tncm91bmQtY29sb3I6IHZhcigtLXdoaXRlKTsgYm9yZGVyLXJhZGl1czogNHB4OyBib3JkZXI6IDFweCBzb2xpZDsgYm9yZGVyLWNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yc2dyYXktNDAwKTsgfSAuZnJhbWUgeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IHBvc2l0aW9uOiByZWxhdGl2ZTsgYWxpZ24tc2VsZjogc3RyZXRjaDsgd2lkdGg6IDEwMCU7IGZsZXg6IDAgMCBhdXRvOyB9IC5kaXYgeyBkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA0cHg7IHBvc2l0aW9uOiByZWxhdGl2ZTsgZmxleDogMCAwIGF1dG87IH0gLmNvbXBhbnktbmFtZSB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgd2lkdGg6IGZpdC1jb250ZW50OyBmb250LXdlaWdodDogNDAwOyBjb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcnNncmF5LTYwMCk7IGZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDE5LjJweDsgfSAudGFncy1WQy1iYWRnZS1yZWQgeyBkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGdhcDogMTBweDsgcGFkZGluZzogNHB4IDhweDsgZmxleDogMCAwIGF1dG87IGJhY2tncm91bmQtY29sb3I6IHZhcigtLWFjY2VudC1jb2xvcnNsaWdodC1yZWQpOyBjb2xvcjogdmFyKC0tdGV4dC1jb2xvci1yZWQpOyBib3JkZXItcmFkaXVzOiA4cHg7IG92ZXJmbG93OiBoaWRkZW47IH0gLnRhZ3MtVkMtYmFkZ2UtZ3JlZW4geyBkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGdhcDogMTBweDsgcGFkZGluZzogNHB4IDhweDsgZmxleDogMCAwIGF1dG87IGJhY2tncm91bmQtY29sb3I6IHZhcigtLWFjY2VudC1jb2xvcnNsaWdodC1ncmVlbik7IGNvbG9yOiB2YXIoLS10ZXh0LWNvbG9yLWdyZWVuKTsgYm9yZGVyLXJhZGl1czogOHB4OyBvdmVyZmxvdzogaGlkZGVuOyB9IC52ZXJpZmlhYmxlIHsgd2lkdGg6IGZpdC1jb250ZW50OyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDE0cHg7IGxpbmUtaGVpZ2h0OiAxNS4zcHg7IH0gLm1vYmlsZSAuZnJhbWUtMiB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNHB4OyBwb3NpdGlvbjogcmVsYXRpdmU7IGFsaWduLXNlbGY6IHN0cmV0Y2g7IHdpZHRoOiAxMDAlOyBmbGV4OiAwIDAgYXV0bzsgfSAudGV4dC13cmFwcGVyIHsgcG9zaXRpb246IHJlbGF0aXZlOyBhbGlnbi1zZWxmOiBzdHJldGNoOyBtYXJnaW4tdG9wOiAtMXB4OyBmb250LXdlaWdodDogNDAwOyBjb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcnNibHVlLTcwMCk7IGZvbnQtc2l6ZTogMThweDsgbGluZS1oZWlnaHQ6IDIxLjJweDsgfSAucCB7IGNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yc2dyYXktNjAwKTsgZm9udC1zaXplOiAxNHB4OyBsaW5lLWhlaWdodDogMTkuMnB4OyBhbGlnbi1zZWxmOiBzdHJldGNoOyBmb250LXdlaWdodDogNDAwOyBjb2xvcjogIzU1NjA2ZTsgfSAuc3BhbiB7IGZvbnQtd2VpZ2h0OiA0MDA7IGZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDE5LjJweDsgfSAudGV4dC13cmFwcGVyLTIgeyBjb2xvcjogIzU1NjA2ZTsgfSAuZnJhbWUtMyB7IGRpc3BsYXk6IGlubGluZS1mbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgcG9zaXRpb246IHJlbGF0aXZlOyBmbGV4OiAwIDAgYXV0bzsgbWFyZ2luLXJpZ2h0OiAtMnB4OyBib3JkZXItYm90dG9tLXdpZHRoOiAxcHg7IGJvcmRlci1ib3R0b20tc3R5bGU6IHNvbGlkOyBib3JkZXItY29sb3I6IHZhcigtLXdoaXRlKTsgfSAuZnJhbWUtNCB7IGRpc3BsYXk6IGlubGluZS1mbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgZ2FwOiA0cHg7IHBhZGRpbmc6IDRweCAwcHg7IHBvc2l0aW9uOiByZWxhdGl2ZTsgZmxleDogMCAwIGF1dG87IGJvcmRlci10b3Atd2lkdGg6IDFweDsgYm9yZGVyLXRvcC1zdHlsZTogc29saWQ7IGJvcmRlci1jb2xvcjogdmFyKC0td2hpdGUpOyB9IC50eXBvZ3JhcGh5LWhlYWRpbmcgeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgZ2FwOiAxMHB4OyB9IC5oZWFkaW5nIHsgcG9zaXRpb246IHJlbGF0aXZlOyBmbGV4OiAxOyBmb250LXdlaWdodDogNDAwOyBjb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcnNncmF5LTcwMCk7IGZvbnQtc2l6ZTogMTZweDsgbGluZS1oZWlnaHQ6IDE3LjRweDsgfSAuaGVhZGluZy0yIHsgcG9zaXRpb246IHJlbGF0aXZlOyBmbGV4OiAxOyBtYXJnaW4tdG9wOiAtMC41cHg7IGZvbnQtd2VpZ2h0OiA0MDA7IGNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yc2dyYXktNjAwKTsgZm9udC1zaXplOiAxNHB4OyBsaW5lLWhlaWdodDogMTkuMnB4OyB9IC5jYXJkcy10cmFjZWFiaWxpdHkgeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IHBhZGRpbmc6IDhweCAwcHg7IHBvc2l0aW9uOiByZWxhdGl2ZTsgYWxpZ24tc2VsZjogc3RyZXRjaDsgd2lkdGg6IDEwMCU7IGZsZXg6IDAgMCBhdXRvOyBib3JkZXItcmFkaXVzOiA0cHg7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfSAuaGlzdG9yeS1pbmZvcm1hdGlvbiB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMTJweDsgfSAuaGlzdG9yeS12YWx1ZS1jaGFpbi1pdGVtIHsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA4cHg7IH0gLmhpc3RvcnktdmFsdWUtY2hhaW4geyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDRweDsgfSAuaGlzdG9yeS12YWx1ZS1jaGFpbiBwIHsgZm9udC1zaXplOiAxOHB4OyBmb250LXdlaWdodDogNDAwOyBsaW5lLWhlaWdodDogMjEuMjRweDsgY29sb3I6ICMxRjVBOTU7IH0gLnZlcmlmaWVkLXJhdGlvIHsgYmFja2dyb3VuZC1jb2xvcjogI0QyRTVGOTsgd2lkdGg6IGZpdC1jb250ZW50OyBwYWRkaW5nOiAycHggNHB4OyB9IC52ZXJpZmllZC1yYXRpbyBwIHsgZm9udC1zaXplOiAxNHB4OyBmb250LXdlaWdodDogNDAwOyBsaW5lLWhlaWdodDogMTkuMjVweDsgY29sb3I6IHZhcigtLWJsYWNrKTsgfSAuZnJhbWUtNSB7IGRpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgcG9zaXRpb246IHJlbGF0aXZlOyBmbGV4OiAwIDAgYXV0bzsgfSAuY29tcGFueS1uYW1lLXdyYXBwZXIgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyB3aWR0aDogMjYwcHg7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBnYXA6IDRweDsgcG9zaXRpb246IHJlbGF0aXZlOyB9IC5jb21wYW55LW5hbWUtMiB7IGNvbG9yOiB2YXIoLS1ibGFjayk7IGZvbnQtc2l6ZTogMTZweDsgbGluZS1oZWlnaHQ6IDE3LjRweDsgcG9zaXRpb246IHJlbGF0aXZlOyBhbGlnbi1zZWxmOiBzdHJldGNoOyBmb250LXdlaWdodDogNDAwOyB9IC5pbWcgeyBwb3NpdGlvbjogcmVsYXRpdmU7IGZsZXg6IDAgMCBhdXRvOyBtYXJnaW4tcmlnaHQ6IC0xcHg7IH0gLnByb2R1Y3Rpb24geyBkaXNwbGF5OiBub25lOyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDEycHg7IH0gLnByb2R1Y3Rpb246aGFzKC50YWJsZS1pdGVtKSB7IGRpc3BsYXk6IGZsZXg7IH0gLnByb2R1Y3Rpb24tdGl0bGUgeyBmb250LXNpemU6IDIwcHg7IGZvbnQtd2VpZ2h0OiA3MDA7IGxpbmUtaGVpZ2h0OiAyMS44cHg7IH0gLnByb2R1Y3QtdGFibGUsIC5wcm9kdWN0LXRhYmxlOmxpbmssIC5wcm9kdWN0LXRhYmxlOnZpc2l0ZWQsIC5wcm9kdWN0LXRhYmxlOmFjdGl2ZSB7IGNvbG9yOiAjMjMyRTNEOyB9IC5jb21wb3NpdGlvbi1ib3ggeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDhweDsgbWFyZ2luLXRvcDogMTJweDsgfSAuY29tcG9zaXRpb24tYm94LWl0ZW0geyBkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciBhdXRvOyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGJvcmRlcjogMXB4IHNvbGlkICNkNGQ2ZDg7IGJvcmRlci1yYWRpdXM6IDRweDsgcGFkZGluZzogMTZweDsgfSAuY29tcG9zaXRpb24tcGVyY2VudCB7IGZvbnQtc2l6ZTogMTZweDsgZm9udC13ZWlnaHQ6IDUwMDsgbGluZS1oZWlnaHQ6IDIxLjkycHg7IGNvbG9yOiAjMDAwMDAwOyB9IC5jb21wb3NpdGlvbi10aXRsZSB7IGZvbnQtc2l6ZTogMTZweDsgZm9udC13ZWlnaHQ6IDYwMDsgbGluZS1oZWlnaHQ6IDE3LjQ0cHg7IGNvbG9yOiAjMDAwMDAwOyB9IC5jb21wb3NpdGlvbi10YWcgeyBkaXNwbGF5OiBmbGV4OyB9IC5jb21wb3NpdGlvbi10YWctaXRlbSB7IGZvbnQtc2l6ZTogMTRweDsgZm9udC13ZWlnaHQ6IDQwMDsgbGluZS1oZWlnaHQ6IDE5LjI1cHg7IGNvbG9yOiAjMDAwMDAwOyBiYWNrZ3JvdW5kLWNvbG9yOiAjRDJFNUY5OyBwYWRkaW5nOiAycHggNHB4IDJweCA0cHg7IG1hcmdpbi1yaWdodDogNHB4OyB9IC5jb21wb3NpdGlvbi1ib3gtZmlyc3QtY29sdW1uIHsgZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA0MHB4IDFmcjsgZ2FwOiAxMnB4OyB9IC5jb21wb3NpdGlvbi1ib3gtc2Vjb25kLWNvbHVtbiB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNnB4OyB9IC5jb21wb3NpdGlvbi1ib3gtc2Vjb25kLWNvbHVtbiBhIHsgY29sb3I6ICMyMzJFM0Q7IGxpbmUtaGVpZ2h0OiAyMnB4OyB9IC5jb21wb3NpdGlvbi1ib3gtdGhpcmQtY29sdW1uIHsgZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBlbmQ7IGdhcDogMTJweDsgfSAuY29tcG9zaXRpb24tYm94LXRoaXJkLWNvbHVtbiBzdmcgeyBtYXJnaW46IDFweCAxMHB4IDAgMDsgfSAucGFzc3BvcnQtaXNzdWVkLWJ5IHsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiAxMnB4OyB9IC5oaXN0b3J5IHsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiAxMnB4OyB9IC5oaXN0b3J5LWV2ZW50IHsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgfSAuaGlzdG9yeS1pdGVtIHsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkNGQ2ZDg7IHBhZGRpbmc6IDEwcHggMCAxMnB4IDA7IGRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIGF1dG87IGdhcDogMTZweDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyB9IC5oaXN0b3J5LWl0ZW0gc3BhbiB7IGZvbnQtc2l6ZTogMTZweDsgZm9udC13ZWlnaHQ6IDQwMDsgbGluZS1oZWlnaHQ6IDE3LjQ0cHg7IGNvbG9yOiAjMDAwMDAwOyB9IC5oaXN0b3J5LWl0ZW0gYSB7IGZvbnQtc2l6ZTogMTZweDsgZm9udC13ZWlnaHQ6IDUwMDsgbGluZS1oZWlnaHQ6IDE3LjQ0cHg7IGNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yc2dyYXktNzAwKTsgdGV4dC1kZWNvcmF0aW9uLWNvbG9yOiAjNGY5NWRkOyB0ZXh0LWRlY29yYXRpb24tdGhpY2tuZXNzOiAycHg7IH0gLmNvdW50cnktY29kZSB7IGZvbnQtc2l6ZTogMTRweDsgZm9udC13ZWlnaHQ6IDQwMDsgbGluZS1oZWlnaHQ6IDE5LjI1cHg7IGNvbG9yOiAjNTU2MDZlOyB9IC5ibHVlLWJvdHRvbS1saW5lLXRoaW4sIC5ibHVlLWJvdHRvbS1saW5lLXRoaW46bGluayB7IGJvcmRlci1ib3R0b206IDFweCAjNEY5NUREIHNvbGlkOyB3aWR0aDogZml0LWNvbnRlbnQ7IGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IGdhcDogMTBweDsgZGlzcGxheTogaW5saW5lLWZsZXg7IGN1cnNvcjogcG9pbnRlcjsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9IC5ibHVlLWJvdHRvbS1saW5lLXRoaWNrLCAuYmx1ZS1ib3R0b20tbGluZS10aGljazpsaW5rIHsgd2lkdGg6IGZpdC1jb250ZW50OyBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBnYXA6IDEwcHg7IGRpc3BsYXk6IGlubGluZS1mbGV4OyB0ZXh0LWRlY29yYXRpb24tbGluZTogdW5kZXJsaW5lOyB0ZXh0LWRlY29yYXRpb24tdGhpY2tuZXNzOiAycHg7IHRleHQtZGVjb3JhdGlvbi1jb2xvcjogIzRGOTVERDsgdGV4dC11bmRlcmxpbmUtb2Zmc2V0OiAzcHg7IH0gLmdyYXktYm90dG9tLWxpbmUgeyBib3JkZXItYm90dG9tOiAxcHggIzU1NjA2RSBzb2xpZDsgd2lkdGg6IGZpdC1jb250ZW50OyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IH0gLnZpZXctbW9yZS1idXR0b24geyBkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgYWxpZ24taXRlbXM6IGNlbnRlcjsgY29sb3I6IHZhcigtLXByaW1hcnktY29sb3JzYmx1ZS03MDApOyBjdXJzb3I6IHBvaW50ZXI7IH0gZm9vdGVyIHsgcGFkZGluZzogMTZweCAxNnB4IDMycHggMTZweDsgbWluLWhlaWdodDogNjBweDsgYmFja2dyb3VuZC1jb2xvcjogI0Y3RkFGRDsgfSBmb290ZXIgcCwgZm9vdGVyIGEsIGZvb3RlciBhOmxpbmsgeyBmb250LXNpemU6IDE0cHg7IGZvbnQtd2VpZ2h0OiA0MDA7IGxpbmUtaGVpZ2h0OiAxOS4yNXB4OyBjb2xvcjogIzIzMkUzRDsgfSAvKiBNZWRpYSBRdWVyaWVzIGZvciBNb2JpbGVzICovIEBtZWRpYSAobWluLXdpZHRoOiA1MHB4KSB7IC5jb250YWluZXIgeyBtaW4td2lkdGg6IDM3NXB4OyB9IC5jb250ZW50cyB7IGRpc3BsYXk6IG5vbmU7IH0gfSAvKiBNZWRpYSBRdWVyaWVzIGZvciBEZXNrdG9wcyAqLyBAbWVkaWEgKG1pbi13aWR0aDogMTQ0MHB4KSB7IC5jb250YWluZXIgeyBtaW4td2lkdGg6IDEwNDBweDsgbWluLWhlaWdodDogMzAwMHB4OyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgZ2FwOiAxMHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOyB3aWR0aDogMTAwJTsgfSAubW9iaWxlIHsgZGlzcGxheTogbm9uZTsgfSBodG1sLCBib2R5IHsgbWFyZ2luOiAwcHg7IGhlaWdodDogMTAwJTsgfSAvKiBhIGJsdWUgY29sb3IgYXMgYSBnZW5lcmljIGZvY3VzIHN0eWxlICovIGJ1dHRvbjpmb2N1cy12aXNpYmxlIHsgb3V0bGluZTogMnB4IHNvbGlkICM0YTkwZTIgIWltcG9ydGFudDsgb3V0bGluZTogLXdlYmtpdC1mb2N1cy1yaW5nLWNvbG9yIGF1dG8gNXB4ICFpbXBvcnRhbnQ7IH0gYSB7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfSAuY29udGFpbmVyIHsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IGdhcDogMTBweDsgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsgd2lkdGg6IDEwMCU7IG1pbi13aWR0aDogMTQ0MHB4OyBtaW4taGVpZ2h0OiAzMDAwcHg7IH0gLmNvbnRhaW5lciAuY29udGVudHMgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDQwcHg7IGZsZXg6IDE7IGZsZXgtZ3JvdzogMTsgfSAuY29udGFpbmVyIC5mcmFtZSB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBnYXA6IDE2cHg7IHBhZGRpbmc6IDU2cHggMjAwcHggMHB4OyBhbGlnbi1zZWxmOiBzdHJldGNoOyB3aWR0aDogMTAwJTsgfSAuY29udGFpbmVyIC5jYXJkcy1jb25mb3JtaXR5LWhlYWRlciB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgcG9zaXRpb246IHJlbGF0aXZlOyBhbGlnbi1zZWxmOiBzdHJldGNoOyB3aWR0aDogMTAwJTsgZmxleDogMCAwIGF1dG87IH0gLmNvbnRhaW5lciAuY29uZm9ybWFuY2UgeyBmb250LXNpemU6IDE0cHg7IGZvbnQtd2VpZ2h0OiA0MDA7IGxpbmUtaGVpZ2h0OiAxOS4yNXB4OyBjb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcnNncmF5LTYwMCk7IH0gLmNvbnRhaW5lciAuY2FyZHMtY29uZm9ybWl0eS1jb25mb3JtYW5jZSB7IGRpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDRweDsgZmxleDogMCAwIGF1dG87IH0gLmNvbnRhaW5lciAuY2FyZHMtY29uZm9ybWl0eS1ib2R5IHsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA0cHg7IH0gLmNvbnRhaW5lciAuY2FyZHMtY29uZm9ybWl0eS10aXRsZSB7IGZvbnQtc2l6ZTogMjBweDsgZm9udC13ZWlnaHQ6IDQwMDsgbGluZS1oZWlnaHQ6IDIzLjZweDsgY29sb3I6IHZhcigtLXByaW1hcnktY29sb3JzYmx1ZS03MDApOyB9IC5jb250YWluZXIgLmNhcmRzLWNvbmZvcm1pdHktZGVzY3JpcHRpb24geyBjb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcnNncmF5LTYwMCk7IGZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDE5LjJweDsgYWxpZ24tc2VsZjogc3RyZXRjaDsgZm9udC13ZWlnaHQ6IDQwMDsgfSAuY29udGFpbmVyIC5jYXJkcy1jb25mb3JtaXR5LWRlc2NyaXB0aW9uIGEgeyBjb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcnNncmF5LTYwMCk7IH0gLmNvbnRhaW5lciAuZGVjbGFyZWQtdmFsdWVzIHsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiAxMnB4OyB9IC5jb250YWluZXIgLmRlY2xhcmVkLXZhbHVlIHsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA0cHg7IH0gLmNvbnRhaW5lciAuZGVjbGFyZWQtdmFsdWUgaDMgeyBmb250LXNpemU6IDE2cHg7IGZvbnQtd2VpZ2h0OiA0MDA7IGxpbmUtaGVpZ2h0OiAxNy40NHB4OyB9IC5jb250YWluZXIgLmRlY2xhcmVkLXZhbHVlIHAgeyBmb250LXNpemU6IDE0cHg7IGZvbnQtd2VpZ2h0OiA0MDA7IGxpbmUtaGVpZ2h0OiAxOS4yNXB4OyB9IC5jb250YWluZXIgLlBQLXRpdGxlIHsgd2lkdGg6IDMwMHB4OyBtYXJnaW4tdG9wOiAtMXB4OyBmb250LXdlaWdodDogNTAwOyBjb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcnNncmF5LTYwMCk7IGZvbnQtc2l6ZTogMjRweDsgbGluZS1oZWlnaHQ6IDMzcHg7IH0gLmNvbnRhaW5lciAudGV4dC13cmFwcGVyIHsgYWxpZ24tc2VsZjogc3RyZXRjaDsgZm9udC13ZWlnaHQ6IDkwMDsgY29sb3I6IHZhcigtLWJsYWNrKTsgZm9udC1zaXplOiA3MnB4OyBsZXR0ZXItc3BhY2luZzogNC4zMnB4OyBsaW5lLWhlaWdodDogNzhweDsgfSAuY29udGFpbmVyIC5wcm9kdWN0LUlELUFMVCB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtd3JhcDogd3JhcDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IGdhcDogMTJweCAxMnB4OyBwYWRkaW5nOiAxMnB4IDEycHggMTZweDsgYWxpZ24tc2VsZjogc3RyZXRjaDsgd2lkdGg6IDEwMCU7IGJhY2tncm91bmQtY29sb3I6IHZhcigtLXByaW1hcnktY29sb3JzYmx1ZS0xMCk7IH0gLmNvbnRhaW5lciAuZGl2IHsgZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4OyB9IC5jb250YWluZXIgLmxpbmUgeyBnYXA6IDEwcHg7IGRpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IHRleHQtZGVjb3JhdGlvbi10aGlja25lc3M6IDJweDsgdGV4dC1kZWNvcmF0aW9uLWNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yc2JsdWUtNDAwKTsgdGV4dC11bmRlcmxpbmUtb2Zmc2V0OiAzcHg7IH0gLmNvbnRhaW5lciAudGV4dC13cmFwcGVyLTIgeyB3aWR0aDogZml0LWNvbnRlbnQ7IGZvbnQtd2VpZ2h0OiA1MDA7IGNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yc2dyYXktNzAwKTsgZm9udC1zaXplOiAxNnB4OyBsaW5lLWhlaWdodDogMjJweDsgfSAuY29udGFpbmVyIC5kaXYtd3JhcHBlciB7IGRpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgZ2FwOiAxMHB4OyBwYWRkaW5nOiAwcHggMHB4IDNweDsgfSAuY29udGFpbmVyIC50ZXh0LXdyYXBwZXItMyB7IHdpZHRoOiBmaXQtY29udGVudDsgbWFyZ2luLXRvcDogLTJweDsgZm9udC13ZWlnaHQ6IDUwMDsgY29sb3I6IHZhcigtLXByaW1hcnktY29sb3JzZ3JheS03MDApOyBmb250LXNpemU6IDE2cHg7IGxpbmUtaGVpZ2h0OiAxNy40cHg7IH0gLmNvbnRhaW5lciAuZnJhbWUtMiB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBnYXA6IDE2cHg7IGFsaWduLXNlbGY6IHN0cmV0Y2g7IHdpZHRoOiAxMDAlOyB9IC5jb250YWluZXIgLlBQLWhlYWRlciB7IG1pbi13aWR0aDogMzIwcHg7IG1pbi1oZWlnaHQ6IDIwMHB4OyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDAsIDAsIDAsIDAuMTgpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNikgNzkuNSUpOyBiYWNrZ3JvdW5kLWltYWdlOiB2YXIoLS1pbWFnZS1zcmMpOyBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyOyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA1MCUgNTAlOyB9IC5jb250YWluZXIgLmZyYW1lLTMgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsgZ2FwOiA4cHg7IGFsaWduLXNlbGY6IHN0cmV0Y2g7IHdpZHRoOiAxMDAlOyB9IC5jb250YWluZXIgLmZyYW1lLTQgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgZ2FwOiA4cHg7IGZsZXg6IDE7IGZsZXgtZ3JvdzogMTsgfSAuY29udGFpbmVyIC5wIHsgYWxpZ24tc2VsZjogc3RyZXRjaDsgbWFyZ2luLXRvcDogLTFweDsgZm9udC13ZWlnaHQ6IDMwMDsgY29sb3I6IHZhcigtLWJsYWNrKTsgZm9udC1zaXplOiAxOXB4OyBsaW5lLWhlaWdodDogMjIuNHB4OyBvdmVyZmxvdzogaGlkZGVuOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsgZGlzcGxheTogLXdlYmtpdC1ib3g7IC13ZWJraXQtbGluZS1jbGFtcDogNDsgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDsgfSAuY29udGFpbmVyIC5kaXYtMiB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBnYXA6IDE2cHg7IHBhZGRpbmc6IDBweCAyMDBweDsgYWxpZ24tc2VsZjogc3RyZXRjaDsgd2lkdGg6IDEwMCU7IH0gLmNvbnRhaW5lciAudHlwb2dyYXBoeS1oZWFkaW5nIHsgZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBnYXA6IDEwcHg7IH0gLmNvbnRhaW5lciAudGV4dC13cmFwcGVyLTQgeyB3aWR0aDogZml0LWNvbnRlbnQ7IGZvbnQtd2VpZ2h0OiA3MDA7IGNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yc2dyYXktNzAwKTsgZm9udC1zaXplOiA0MHB4OyBsaW5lLWhlaWdodDogNDMuNnB4OyB9IC5jb250YWluZXIgLnRleHQtd3JhcHBlci01IHsgYWxpZ24tc2VsZjogc3RyZXRjaDsgZm9udC13ZWlnaHQ6IDQwMDsgY29sb3I6IHZhcigtLWJsYWNrKTsgZm9udC1zaXplOiAxNnB4OyBsaW5lLWhlaWdodDogMTguOXB4OyB9IC5jb250YWluZXIgLmRpdi0zIHsgZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMS4zZnI7IGdhcDogMzJweDsgd2lkdGg6IDEwMCU7IH0gLmNvbnRhaW5lciAuZGl2LTcgeyBkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAzZnI7IGdhcDogMzJweDsganVzdGlmeS1pdGVtczogY2VudGVyOyB9IC5jb250YWluZXIgLmZyYW1lLTUgeyBkaXNwbGF5OiBpbmxpbmUtZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IGdhcDogMTJweDsgfSAuY29udGFpbmVyIC5mcmFtZS02IHsgZGlzcGxheTogZmxleDsgZmxleC13cmFwOiB3cmFwOyB3aWR0aDogNTEwcHg7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBnYXA6IDBweCAwcHg7IG1hcmdpbi10b3A6IC0xcHg7IG1hcmdpbi1sZWZ0OiAtMXB4OyBtYXJnaW4tcmlnaHQ6IC0xcHg7IGJvcmRlci1yYWRpdXM6IDVweDsgYm9yZGVyOiAxcHggc29saWQ7IGJvcmRlci1jb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcnNncmF5LTQwMCk7IH0gLmNvbnRhaW5lciAuZnJhbWUtNyB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IG1pbi13aWR0aDogMTcwcHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBwYWRkaW5nOiAxMnB4IDE2cHg7IGZsZXg6IDE7IGZsZXgtZ3JvdzogMTsgfSAuY29udGFpbmVyIC50ZXh0LXdyYXBwZXItNiB7IGFsaWduLXNlbGY6IHN0cmV0Y2g7IG1hcmdpbi10b3A6IC0xcHg7IGZvbnQtd2VpZ2h0OiA5MDA7IGNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yc2JsdWUtNzAwKTsgZm9udC1zaXplOiA1NnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGxldHRlci1zcGFjaW5nOiAzLjM2cHg7IGxpbmUtaGVpZ2h0OiA2MC43cHg7IH0gLmNvbnRhaW5lciAudGV4dC13cmFwcGVyLTcgeyB3aWR0aDogZml0LWNvbnRlbnQ7IGZvbnQtd2VpZ2h0OiA3MDA7IGNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yc2JsdWUtNzAwKTsgZm9udC1zaXplOiAxNnB4OyBsaW5lLWhlaWdodDogMTguOXB4OyB9IC5jb250YWluZXIgLmZyYW1lLTggeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBtaW4td2lkdGg6IDE3MHB4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgcGFkZGluZzogMTJweCAxNnB4OyBmbGV4OiAxOyBmbGV4LWdyb3c6IDE7IGJhY2tncm91bmQtY29sb3I6IHZhcigtLXByaW1hcnktY29sb3JzYmx1ZS0xMCk7IH0gLmNvbnRhaW5lciAudGV4dC13cmFwcGVyLTggeyBhbGlnbi1zZWxmOiBzdHJldGNoOyBmb250LXdlaWdodDogNDAwOyBjb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcnNncmF5LTYwMCk7IGZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDE1LjNweDsgfSAuY29udGFpbmVyIC5mcmFtZS05IHsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IGdhcDogMTJweDsgZmxleDogMTsgZmxleC1ncm93OiAxOyB9IC5jb250YWluZXIgLmRpdi00IHsgZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTJweDsgfSAuY29udGFpbmVyIC5mcmFtZS0xMCB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IHdpZHRoOiAyNjBweDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IGdhcDogNHB4OyB9IC5jb250YWluZXIgLnRleHQtd3JhcHBlci05IHsgYWxpZ24tc2VsZjogc3RyZXRjaDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6IHZhcigtLWJsYWNrKTsgZm9udC1zaXplOiAxNnB4OyBsaW5lLWhlaWdodDogMTcuNHB4OyB9IC5jb250YWluZXIgLmZyYW1lLTExIHsgZGlzcGxheTogaW5saW5lLWZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyB9IC5jb250YWluZXIgLnRleHQtd3JhcHBlci0xMCB7IHdpZHRoOiBmaXQtY29udGVudDsgbWFyZ2luLXRvcDogLTFweDsgZm9udC13ZWlnaHQ6IDkwMDsgY29sb3I6IHZhcigtLXByaW1hcnktY29sb3JzYmx1ZS03MDApOyBmb250LXNpemU6IDU2cHg7IGxldHRlci1zcGFjaW5nOiAzLjM2cHg7IGxpbmUtaGVpZ2h0OiA2MC43cHg7IH0gLmNvbnRhaW5lciAuY28tZXEgeyB3aWR0aDogMTMwcHg7IGZvbnQtd2VpZ2h0OiA0MDA7IGNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yc2dyYXktNjAwKTsgZm9udC1zaXplOiAxNnB4OyBsaW5lLWhlaWdodDogMTcuNHB4OyB9IC5jb250YWluZXIgLnNwYW4geyBmb250LXdlaWdodDogNDAwOyBjb2xvcjogIzU1NjA2ZTsgZm9udC1zaXplOiAxNnB4OyBsaW5lLWhlaWdodDogMTcuNHB4OyB9IC5jb250YWluZXIgLnRleHQtd3JhcHBlci0xMSB7IGZvbnQtc2l6ZTogMjBweDsgbGluZS1oZWlnaHQ6IDIxLjhweDsgfSAuY29udGFpbmVyIC5kaXYtNSB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBhbGlnbi1zZWxmOiBzdHJldGNoOyB3aWR0aDogMTAwJTsgfSAuY29udGFpbmVyIC5kYXRhLXR3by1jb2x1bW5zIHsgZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgOGZyOyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgZ2FwOiAxNnB4OyBwYWRkaW5nOiAxMHB4IDBweCAxMnB4OyBhbGlnbi1zZWxmOiBzdHJldGNoOyB3aWR0aDogMTAwJTsgYm9yZGVyLWJvdHRvbS13aWR0aDogMXB4OyBib3JkZXItYm90dG9tLXN0eWxlOiBzb2xpZDsgYm9yZGVyLWNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yc2dyYXktNDAwKTsgfSAuY29udGFpbmVyIC5kYXRhLXR3by1jb2x1bW5zLTIgeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgZ2FwOiAxNnB4OyBwYWRkaW5nOiAxMHB4IDBweCAxMnB4OyBhbGlnbi1zZWxmOiBzdHJldGNoOyB3aWR0aDogMTAwJTsgYm9yZGVyLWJvdHRvbS13aWR0aDogMXB4OyBib3JkZXItYm90dG9tLXN0eWxlOiBzb2xpZDsgYm9yZGVyLWNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yc2dyYXktNDAwKTsgfSAuY29udGFpbmVyIC5kYXRhLXR3by1jb2x1bW5zLTMgeyBkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDEuMWZyIDJmcjsgZ2FwOiAxNnB4OyBwYWRkaW5nOiAxMHB4IDBweCAxMnB4OyB3aWR0aDogMTAwJTsgYm9yZGVyLWJvdHRvbS13aWR0aDogMXB4OyBib3JkZXItYm90dG9tLXN0eWxlOiBzb2xpZDsgYm9yZGVyLWNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yc2dyYXktNDAwKTsgfSAuY29udGFpbmVyIC5kYXRhLXR3by1jb2x1bW5zIC5saXN0IHsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgfSAuY29udGFpbmVyIC50ZXh0LXdyYXBwZXItMTIgeyBmb250LXdlaWdodDogNDAwOyBjb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcnNncmF5LTYwMCk7IGZvbnQtc2l6ZTogMTZweDsgbGluZS1oZWlnaHQ6IDIycHg7IH0gLmNvbnRhaW5lciAuZGF0YS1kYXRhIHsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGdhcDogMTBweDsgYWxpZ24tc2VsZjogc3RyZXRjaDsgZmxleC1ncm93OiAxOyBmbGV4OiAxOyB9IC5jb250YWluZXIgLmRhdGEgeyBmbGV4OiAxOyBmb250LXdlaWdodDogNTAwOyBjb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcnNncmF5LTcwMCk7IGZvbnQtc2l6ZTogMTZweDsgfSAuY29udGFpbmVyIC5kYXRhLTIgeyBmb250LXdlaWdodDogNTAwOyBjb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcnNncmF5LTcwMCk7IGZvbnQtc2l6ZTogMTZweDsgbGluZS1oZWlnaHQ6IDE3LjRweDsgZmxleDogMTsgfSAuY29udGFpbmVyIC5mcmFtZS0xMiB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBmbGV4OiAxOyBmbGV4LWdyb3c6IDE7IH0gLmNvbnRhaW5lciAubGluZS13cmFwcGVyIHsgZmxleC13cmFwOiB3cmFwOyBnYXA6IDEwcHggMTBweDsgZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBwYWRkaW5nOiAwcHggMHB4IDNweDsgYm9yZGVyLWJvdHRvbS13aWR0aDogMnB4OyBib3JkZXItYm90dG9tLXN0eWxlOiBzb2xpZDsgYm9yZGVyLWNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yc2JsdWUtNDAwKTsgfSAuY29udGFpbmVyIC5mcmFtZS0xMyB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBnYXA6IDRweDsgYWxpZ24tc2VsZjogc3RyZXRjaDsgd2lkdGg6IDEwMCU7IH0gLmNvbnRhaW5lciAudGV4dC13cmFwcGVyLTEzIHsgd2lkdGg6IGZpdC1jb250ZW50OyBmb250LXdlaWdodDogNDAwOyBjb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcnNncmF5LTYwMCk7IGZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDE1LjNweDsgbWFyZ2luLXRvcDogLTFweDsgfSAuY29udGFpbmVyIC50ZXh0LXdyYXBwZXItMTQgeyB3aWR0aDogMzU4cHg7IG1hcmdpbi10b3A6IC0xcHg7IGZvbnQtd2VpZ2h0OiA3MDA7IGNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yc2dyYXktNzAwKTsgZm9udC1zaXplOiA0MHB4OyBsaW5lLWhlaWdodDogNDMuNnB4OyB9IC5jb250YWluZXIgLmZyYW1lLTE0IHsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IGdhcDogMTJweDsgcGFkZGluZzogMHB4IDMycHggMzJweDsgYWxpZ24tc2VsZjogc3RyZXRjaDsgd2lkdGg6IDEwMCU7IGJhY2tncm91bmQtY29sb3I6IHZhcigtLXByaW1hcnktY29sb3JzYmx1ZS0xMCk7IGJvcmRlci1yYWRpdXM6IDRweDsgb3ZlcmZsb3c6IGhpZGRlbjsgfSAuY29udGFpbmVyIC5mcmFtZS0xNSB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBnYXA6IDEycHg7IHBhZGRpbmc6IDE2cHggMHB4IDBweDsgYWxpZ24tc2VsZjogc3RyZXRjaDsgd2lkdGg6IDEwMCU7IH0gLmNvbnRhaW5lciAuZW52aXJvbm1lbnQgeyBhbGlnbi1zZWxmOiBzdHJldGNoOyBtYXJnaW4tdG9wOiAtMXB4OyBmb250LXdlaWdodDogNDAwOyBjb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcnNncmF5LTYwMCk7IGZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDE5LjJweDsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgfSAuY29udGFpbmVyIC50ZXh0LXdyYXBwZXItMTUgeyBhbGlnbi1zZWxmOiBzdHJldGNoOyBmb250LXdlaWdodDogNDAwOyBjb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcnNibHVlLTcwMCk7IGZvbnQtc2l6ZTogMThweDsgbGluZS1oZWlnaHQ6IDIxLjJweDsgfSAuY29udGFpbmVyIC5mcmFtZS0xNiB7IGRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmciAxZnI7IHJvdy1nYXA6IDI0cHg7IGNvbHVtbi1nYXA6IDMycHg7IGFsaWduLXNlbGY6IHN0cmV0Y2g7IH0gLmNvbnRhaW5lciAuZnJhbWUtMTcgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBtaW4td2lkdGg6IDQwMHB4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgZ2FwOiA0cHg7IGZsZXg6IDE7IGZsZXgtZ3JvdzogMTsgfSAuY29udGFpbmVyIC5kYXRhLXdyYXBwZXIgeyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgZ2FwOiAxMHB4OyBkaXNwbGF5OiBmbGV4OyBmbGV4OiAxOyBmbGV4LWdyb3c6IDE7IH0gLmNvbnRhaW5lciAudGV4dC13cmFwcGVyLTE2IHsgZm9udC13ZWlnaHQ6IDUwMDsgY29sb3I6IHZhcigtLXByaW1hcnktY29sb3JzZ3JheS03MDApOyBmb250LXNpemU6IDE0cHg7IH0gLmNvbnRhaW5lciAuY2FyZHMtY29uZm9ybWl0aWVzIHsgZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyIDFmcjsgZ2FwOiAxNnB4OyB3aWR0aDogMTAwJTsgfSAuY29udGFpbmVyIC5oaXN0b3J5LWR1ZS1kaWxpZ2VuY2UgeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgY29sb3I6IHZhcigtLWJsYWNrKTsgfSAuY29udGFpbmVyIC5oaXN0b3J5LWR1ZS1kaWxpZ2VuY2UgZGl2IHsgZm9udC1zaXplOiAxNnB4OyBmb250LXdlaWdodDogNDAwOyBsaW5lLWhlaWdodDogMTcuNDRweDsgfSAuY29udGFpbmVyIC5jb250ZW50cyAuaGlzdG9yeS1pbmZvcm1hdGlvbiB7IHdpZHRoOiAxMDAlOyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDE2cHg7IH0gLmNvbnRhaW5lciAuY29udGVudHMgLmhpc3RvcnktdmFsdWUtY2hhaW4taXRlbSB7IG1hcmdpbi10b3A6IDhweDsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiAxNnB4OyB9IC5jb250YWluZXIgLmNvbnRlbnRzIC5oaXN0b3J5LXZhbHVlLWNoYWluIHsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IHJvdzsgZ2FwOiAxNnB4OyB9IC5jb250YWluZXIgLmNvbnRlbnRzIC52ZXJpZmllZC1yYXRpbyB7fSAuY29udGFpbmVyIC5jb250ZW50cyAuaGlzdG9yeS1ldmVudCB7fSAuY29udGFpbmVyIC5jb250ZW50cyAuaGlzdG9yeS1pdGVtIHt9IC5jb250YWluZXIgLmNvbnRlbnRzIC52aWV3LW1vcmUtYnV0dG9uIHsgYWxpZ24tc2VsZjogYmFzZWxpbmU7IH0gLmNvbnRhaW5lciAuZnJhbWUtMTggeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBtaW4td2lkdGg6IDQwMHB4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgZmxleDogMTsgZmxleC1ncm93OiAxOyB9IC5jb250YWluZXIgLmZyYW1lLTE5IHsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IH0gLmNvbnRhaW5lciAuZnJhbWUtMjAgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgZ2FwOiAxMnB4OyBhbGlnbi1zZWxmOiBzdHJldGNoOyB3aWR0aDogMTAwJTsgfSAuY29udGFpbmVyIC5jYXJkcy10cmFjZWFiaWxpdHktMiB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgcGFkZGluZzogOHB4IDBweDsgYWxpZ24tc2VsZjogc3RyZXRjaDsgd2lkdGg6IDEwMCU7IGJvcmRlci1yYWRpdXM6IDRweDsgfSAuY29udGFpbmVyIC5mcmFtZS0yMSB7IGRpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgfSAuY29udGFpbmVyIC5jb21wYW55LW5hbWUgeyBhbGlnbi1zZWxmOiBzdHJldGNoOyBmb250LXdlaWdodDogNDAwOyBjb2xvcjogdmFyKC0tYmxhY2spOyBmb250LXNpemU6IDE2cHg7IGxpbmUtaGVpZ2h0OiAxNy40cHg7IH0gLmNvbnRhaW5lciAuZnJhbWUtMjIgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgYWxpZ24tc2VsZjogc3RyZXRjaDsgd2lkdGg6IDEwMCU7IH0gLmNvbnRhaW5lciAucmVjdGFuZ2xlLTMgeyBhbGlnbi1zZWxmOiBzdHJldGNoOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxcHg7IGJhY2tncm91bmQtY29sb3I6IHZhcigtLXByaW1hcnktY29sb3JzZ3JheS00MDApOyB9IC5jb250YWluZXIgLmZyYW1lLTIzIHsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IGdhcDogOHB4OyBhbGlnbi1zZWxmOiBzdHJldGNoOyB3aWR0aDogMTAwJTsgfSAuY29udGFpbmVyIC5kaXYtNiB7IHdpZHRoOiBmaXQtY29udGVudDsgbWFyZ2luLXRvcDogLTFweDsgZm9udC13ZWlnaHQ6IDQwMDsgY29sb3I6IHZhcigtLXByaW1hcnktY29sb3JzZ3JheS03MDApOyBmb250LXNpemU6IDE0cHg7IGxpbmUtaGVpZ2h0OiAxOS4ycHg7IH0gLmNvbnRhaW5lciAudGV4dC13cmFwcGVyLTE3IHsgZm9udC13ZWlnaHQ6IDQwMDsgY29sb3I6ICMyMzJlM2Q7IGZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDE5LjJweDsgfSAuY29udGFpbmVyIC50ZXh0LXdyYXBwZXItMTggeyBmb250LXNpemU6IDE2cHg7IGZvbnQtd2VpZ2h0OiA1MDA7IGxpbmUtaGVpZ2h0OiAxNy40NHB4OyBjb2xvcjogIzIzMkUzRDsgfSAuY29udGFpbmVyIC5ibGFjay1saW5lIHsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBjb2xvcjogIzIzMmUzZDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkOyB9IC5jb250YWluZXIgLmZyYW1lLTI0IHsgZGlzcGxheTogbm9uZTsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IGdhcDogMTJweDsgcGFkZGluZzogMHB4IDIwMHB4OyBhbGlnbi1zZWxmOiBzdHJldGNoOyB3aWR0aDogMTAwJTsgfSAuY29udGFpbmVyIC5mcmFtZS0yNDpoYXMoLmRhdGEtdHdvLWNvbHVtbnMpIHsgZGlzcGxheTogZmxleDsgfSAuY29udGFpbmVyIC5oZWFkaW5nLXdyYXBwZXIgeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgZ2FwOiAxMHB4OyBhbGlnbi1zZWxmOiBzdHJldGNoOyB3aWR0aDogMTAwJTsgfSAuY29udGFpbmVyIC5oZWFkaW5nIHsgZmxleDogMTsgbWFyZ2luLXRvcDogLTFweDsgZm9udC13ZWlnaHQ6IDcwMDsgY29sb3I6IHZhcigtLXByaW1hcnktY29sb3JzZ3JheS03MDApOyBmb250LXNpemU6IDQwcHg7IGxpbmUtaGVpZ2h0OiA0My42cHg7IH0gLmNvbnRhaW5lciAuY2FyZHMgeyBkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBnYXA6IDIwcHggMjBweDsgYWxpZ24tc2VsZjogc3RyZXRjaDsgfSAuY29udGFpbmVyIC5jYXJkcy1jb21wb3NpdGlvbiB7IGRpc3BsYXk6IGZsZXg7IG1pbi13aWR0aDogNDAwcHg7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IHBhZGRpbmc6IDIwcHg7IGJhY2tncm91bmQtY29sb3I6IHZhcigtLXdoaXRlKTsgYm9yZGVyLXJhZGl1czogNHB4OyBib3JkZXI6IDFweCBzb2xpZDsgYm9yZGVyLWNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yc2dyYXktNDAwKTsgfSAuY29udGFpbmVyIC5maXJzdC1jb2x1bW4geyBkaXNwbGF5OiBmbGV4OyB3aWR0aDogMjYwcHg7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBnYXA6IDEycHg7IH0gLmNvbnRhaW5lciAucGVyY2VudGFnZSB7IHdpZHRoOiA0MHB4OyBtYXJnaW4tdG9wOiAtMXB4OyBmb250LXdlaWdodDogNTAwOyBjb2xvcjogdmFyKC0tYmxhY2spOyBmb250LXNpemU6IDE1cHg7IGxpbmUtaGVpZ2h0OiAyMC42cHg7IH0gLmNvbnRhaW5lciAuZGV0YWlscyB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBnYXA6IDZweDsgZmxleDogMTsgZmxleC1ncm93OiAxOyB9IC5jb250YWluZXIgLmZyYW1lLTI1IHsgZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBnYXA6IDZweDsgfSAuY29udGFpbmVyIC5mcmFtZS0yNiB7IGRpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgZ2FwOiA0cHg7IHBhZGRpbmc6IDJweCA0cHg7IGJhY2tncm91bmQtY29sb3I6ICNkMmU1Zjg7IH0gLmNvbnRhaW5lciAudGV4dC13cmFwcGVyLTE5IHsgd2lkdGg6IGZpdC1jb250ZW50OyBtYXJnaW4tdG9wOiAtMXB4OyBmb250LXdlaWdodDogNDAwOyBjb2xvcjogdmFyKC0tYmxhY2spOyBmb250LXNpemU6IDE0cHg7IHRleHQtYWxpZ246IHJpZ2h0OyBsaW5lLWhlaWdodDogMTkuMnB4OyB9IC5jb250YWluZXIgLmZyYW1lLTI3IHsgZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBnYXA6IDRweDsgcGFkZGluZzogMnB4IDRweDsgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcnNibHVlLTUwKTsgfSAuY29udGFpbmVyIC5kYXRhLWRhdGEtbGluay0yIHsgZGlzcGxheTogaW5saW5lLWZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBnYXA6IDZweDsgfSAuY29udGFpbmVyIC5mcmFtZS0yOCB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTJweDsgYWxpZ24tc2VsZjogc3RyZXRjaDsgd2lkdGg6IDEwMCU7IH0gLmNvbnRhaW5lciAuZnJhbWUtMjkgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDhweDsgfSAuY29udGFpbmVyIC50eXBlLW9mLWV2ZW50IHsgZmxleDogMTsgbWFyZ2luLXRvcDogLTFweDsgZm9udC13ZWlnaHQ6IDQwMDsgY29sb3I6IHZhcigtLWJsYWNrKTsgZm9udC1zaXplOiAxNnB4OyBsaW5lLWhlaWdodDogMTcuNHB4OyB9IC5jb250YWluZXIgLnRleHQtd3JhcHBlci0yMCB7IGFsaWduLXNlbGY6IHN0cmV0Y2g7IGZvbnQtd2VpZ2h0OiA0MDA7IGNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yc2JsdWUtNzAwKTsgZm9udC1zaXplOiAxNnB4OyBsaW5lLWhlaWdodDogMTcuNHB4OyBjdXJzb3I6IHBvaW50ZXI7IH0gLmNvbnRhaW5lciAudGhpcy1kaWdpdGFsLXByb2R1Y3Qtd3JhcHBlciB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBnYXA6IDEwcHg7IHBhZGRpbmc6IDI0cHggMjAwcHggNzZweDsgYWxpZ24tc2VsZjogc3RyZXRjaDsgd2lkdGg6IDEwMCU7IGJhY2tncm91bmQtY29sb3I6IHZhcigtLXByaW1hcnktY29sb3JzYmx1ZS0xMCk7IH0gLmNvbnRhaW5lciAudGhpcy1kaWdpdGFsLXByb2R1Y3QgeyBmbGV4OiAxOyBtYXJnaW4tdG9wOiAtMXB4OyBmb250LXdlaWdodDogNDAwOyBjb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcnNncmF5LTcwMCk7IGZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDE5LjJweDsgfSB9IDwvc3R5bGU-IDwvaGVhZD4gPGJvZHk-IDxkaXYgY2xhc3M9XCJjb250YWluZXJcIj4gPCEtLSBNb2JpbGUgd2lkdGggMzkwcHgtLT4gPGRpdiBjbGFzcz1cIm1vYmlsZVwiPiA8aGVhZGVyIGNsYXNzPVwiaGVhZGVyXCI-IDxkaXYgY2xhc3M9XCJoZWFkZXItaW1hZ2VcIj4gPHAgY2xhc3M9XCJoZWFkZXItaW1hZ2UtdG9wLWxlZnRcIj5QUk9EVUNUIFBBU1NQT1JUPC9wPiA8ZGl2IGNsYXNzPVwiaGVhZGVyLWltYWdlLWJvdHRvbS1sZWZ0XCI-IDxoMT57e2NyZWRlbnRpYWxTdWJqZWN0Lm5hbWV9fTwvaDE-IDwvZGl2PiA8L2Rpdj4gPGRpdj4gPGRpdiBjbGFzcz1cImhlYWRlci1iYXRjaFwiPiA8ZGl2IGNsYXNzPVwiaGVhZGVyLWJhdGNoLWl0ZW1cIj4gPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI-IDxwYXRoIGQ9XCJNMi40NSAzLjVDMi4xNzE1MiAzLjUgMS45MDQ0NSAzLjM4OTM4IDEuNzA3NTQgMy4xOTI0NkMxLjUxMDYyIDIuOTk1NTUgMS40IDIuNzI4NDggMS40IDIuNDVDMS40IDIuMTcxNTIgMS41MTA2MiAxLjkwNDQ1IDEuNzA3NTQgMS43MDc1NEMxLjkwNDQ1IDEuNTEwNjIgMi4xNzE1MiAxLjQgMi40NSAxLjRDMi43Mjg0OCAxLjQgMi45OTU1NSAxLjUxMDYyIDMuMTkyNDYgMS43MDc1NEMzLjM4OTM4IDEuOTA0NDUgMy41IDIuMTcxNTIgMy41IDIuNDVDMy41IDIuNzI4NDggMy4zODkzOCAyLjk5NTU1IDMuMTkyNDYgMy4xOTI0NkMyLjk5NTU1IDMuMzg5MzggMi43Mjg0OCAzLjUgMi40NSAzLjVaTTEzLjU4NyA2LjcwNkw3LjI4NyAwLjQwNkM3LjAzNSAwLjE1NCA2LjY4NSAwIDYuMyAwSDEuNEMwLjYyMyAwIDAgMC42MjMgMCAxLjRWNi4zQzAgNi42ODUgMC4xNTQgNy4wMzUgMC40MTMgNy4yODdMNi43MDYgMTMuNTg3QzYuOTY1IDEzLjgzOSA3LjMxNSAxNCA3LjcgMTRDOC4wODUgMTQgOC40MzUgMTMuODM5IDguNjg3IDEzLjU4N0wxMy41ODcgOC42ODdDMTMuODQ2IDguNDM1IDE0IDguMDg1IDE0IDcuN0MxNCA3LjMwOCAxMy44MzkgNi45NTggMTMuNTg3IDYuNzA2WlwiIGZpbGw9XCIjMUY1QTk1XCIgLz4gPC9zdmc-IDxhIGhyZWY9XCJ7e2NyZWRlbnRpYWxTdWJqZWN0LmlkU2NoZW1lLmlkfX1cIiBjbGFzcz1cImJsdWUtYm90dG9tLWxpbmUtdGhpY2tcIj5JRDoge3tjcmVkZW50aWFsU3ViamVjdC5yZWdpc3RlcmVkSWR9fTwvYT4gPC9kaXY-IDxkaXYgY2xhc3M9XCJoZWFkZXItYmF0Y2gtaXRlbVwiPiA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBhdGggZD1cIk0yLjQ1IDMuNUMyLjE3MTUyIDMuNSAxLjkwNDQ1IDMuMzg5MzggMS43MDc1NCAzLjE5MjQ2QzEuNTEwNjIgMi45OTU1NSAxLjQgMi43Mjg0OCAxLjQgMi40NUMxLjQgMi4xNzE1MiAxLjUxMDYyIDEuOTA0NDUgMS43MDc1NCAxLjcwNzU0QzEuOTA0NDUgMS41MTA2MiAyLjE3MTUyIDEuNCAyLjQ1IDEuNEMyLjcyODQ4IDEuNCAyLjk5NTU1IDEuNTEwNjIgMy4xOTI0NiAxLjcwNzU0QzMuMzg5MzggMS45MDQ0NSAzLjUgMi4xNzE1MiAzLjUgMi40NUMzLjUgMi43Mjg0OCAzLjM4OTM4IDIuOTk1NTUgMy4xOTI0NiAzLjE5MjQ2QzIuOTk1NTUgMy4zODkzOCAyLjcyODQ4IDMuNSAyLjQ1IDMuNVpNMTMuNTg3IDYuNzA2TDcuMjg3IDAuNDA2QzcuMDM1IDAuMTU0IDYuNjg1IDAgNi4zIDBIMS40QzAuNjIzIDAgMCAwLjYyMyAwIDEuNFY2LjNDMCA2LjY4NSAwLjE1NCA3LjAzNSAwLjQxMyA3LjI4N0w2LjcwNiAxMy41ODdDNi45NjUgMTMuODM5IDcuMzE1IDE0IDcuNyAxNEM4LjA4NSAxNCA4LjQzNSAxMy44MzkgOC42ODcgMTMuNTg3TDEzLjU4NyA4LjY4N0MxMy44NDYgOC40MzUgMTQgOC4wODUgMTQgNy43QzE0IDcuMzA4IDEzLjgzOSA2Ljk1OCAxMy41ODcgNi43MDZaXCIgZmlsbD1cIiMxRjVBOTVcIiAvPiA8L3N2Zz4gPGE-QmF0Y2g6IHt7Y3JlZGVudGlhbFN1YmplY3QuYmF0Y2hOdW1iZXJ9fTwvYT4gPC9kaXY-IDxkaXYgY2xhc3M9XCJoZWFkZXItYmF0Y2gtaXRlbVwiPiA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBhdGggZD1cIk0yLjQ1IDMuNUMyLjE3MTUyIDMuNSAxLjkwNDQ1IDMuMzg5MzggMS43MDc1NCAzLjE5MjQ2QzEuNTEwNjIgMi45OTU1NSAxLjQgMi43Mjg0OCAxLjQgMi40NUMxLjQgMi4xNzE1MiAxLjUxMDYyIDEuOTA0NDUgMS43MDc1NCAxLjcwNzU0QzEuOTA0NDUgMS41MTA2MiAyLjE3MTUyIDEuNCAyLjQ1IDEuNEMyLjcyODQ4IDEuNCAyLjk5NTU1IDEuNTEwNjIgMy4xOTI0NiAxLjcwNzU0QzMuMzg5MzggMS45MDQ0NSAzLjUgMi4xNzE1MiAzLjUgMi40NUMzLjUgMi43Mjg0OCAzLjM4OTM4IDIuOTk1NTUgMy4xOTI0NiAzLjE5MjQ2QzIuOTk1NTUgMy4zODkzOCAyLjcyODQ4IDMuNSAyLjQ1IDMuNVpNMTMuNTg3IDYuNzA2TDcuMjg3IDAuNDA2QzcuMDM1IDAuMTU0IDYuNjg1IDAgNi4zIDBIMS40QzAuNjIzIDAgMCAwLjYyMyAwIDEuNFY2LjNDMCA2LjY4NSAwLjE1NCA3LjAzNSAwLjQxMyA3LjI4N0w2LjcwNiAxMy41ODdDNi45NjUgMTMuODM5IDcuMzE1IDE0IDcuNyAxNEM4LjA4NSAxNCA4LjQzNSAxMy44MzkgOC42ODcgMTMuNTg3TDEzLjU4NyA4LjY4N0MxMy44NDYgOC40MzUgMTQgOC4wODUgMTQgNy43QzE0IDcuMzA4IDEzLjgzOSA2Ljk1OCAxMy41ODcgNi43MDZaXCIgZmlsbD1cIiMxRjVBOTVcIiAvPiA8L3N2Zz4gPGE-U2VyaWFsOiB7e2NyZWRlbnRpYWxTdWJqZWN0LnNlcmlhbE51bWJlcn19PC9hPiA8L2Rpdj4gPC9kaXY-IDwvZGl2PiA8L2hlYWRlcj4gPHNlY3Rpb24gY2xhc3M9XCJpbmZvcm1hdGlvblwiPiA8ZGl2IGNsYXNzPVwiaW5mb3JtYXRpb24tdGV4dFwiPiB7e2NyZWRlbnRpYWxTdWJqZWN0LmRlc2NyaXB0aW9ufX0gPC9kaXY-IDxkaXYgY2xhc3M9XCJpbmZvcm1hdGlvbi1zaG93LW1vcmVcIj4ge3sjZWFjaCBjcmVkZW50aWFsU3ViamVjdC5mdXJ0aGVySW5mb3JtYXRpb259fSA8YSBocmVmPVwie3tsaW5rVVJMfX1cIiBjbGFzcz1cImJsdWUtYm90dG9tLWxpbmUtdGhpY2tcIj57e2xpbmtOYW1lfX08L2E-IHt7L2VhY2h9fSA8L2Rpdj4gPC9zZWN0aW9uPiB7eyNpZiBjcmVkZW50aWFsU3ViamVjdC5jaGFyYWN0ZXJpc3RpY319IDxzZWN0aW9uIGNsYXNzPVwicHJvZHVjdGlvblwiPiA8ZGl2IGNsYXNzPVwicHJvZHVjdGlvbi10aXRsZVwiPkNoYXJhY3RlcmlzdGljczwvZGl2PiA8ZGl2IGNsYXNzPVwicHJvZHVjdC10YWJsZSB0YWJsZVwiPiB7eyNlYWNoIGNyZWRlbnRpYWxTdWJqZWN0LmNoYXJhY3RlcmlzdGljfX0gPGRpdiBjbGFzcz1cInRhYmxlLWl0ZW1cIj4gPHNwYW4gY2xhc3M9XCJpdGVtLXRpdGxlXCI-e3tAa2V5fX08L3NwYW4-IDxwIGNsYXNzPVwiaXRlbS12YWx1ZVwiPnt7dGhpc319PC9wPiA8L2Rpdj4ge3svZWFjaH19IDwvZGl2PiA8L3NlY3Rpb24-IHt7L2lmfX0gPHNlY3Rpb24gY2xhc3M9XCJwYXNzcG9ydFwiPiA8ZGl2IGNsYXNzPVwicGFzc3BvcnQtaXNzdWVkLWJ5LWhlYWRlclwiPiA8aDM-Q2lyY3VsYXJpdHkgU2NvcmVjYXJkPC9oMz4gPHA-VGhlIGNpcmN1bGFyaXR5IFNjb3JlY2FyZCBwcm92aWRlcyBhIHNpbXBsZSBoaWdoIGxldmVsIHN1bW1hcnkgb2YgY2lyY3VsYXJpdHkgcGVyZm9ybWFuY2Ugb2YgdGhlIHByb2R1Y3QuPC9wPiA8L2Rpdj4gPGRpdiBjbGFzcz1cInBhc3Nwb3J0LWJveFwiPiA8ZGl2IGNsYXNzPVwicGFzc3BvcnQtYm94LWl0ZW1cIj4gPGgzPnt7Y3JlZGVudGlhbFN1YmplY3QuY2lyY3VsYXJpdHlTY29yZWNhcmQucmVjeWNsYWJsZUNvbnRlbnR9fSU8L2gzPiA8cD5SZWN5Y2xhYmxlIGNvbnRlbnQ8L3A-IDwvZGl2PiA8ZGl2IGNsYXNzPVwicGFzc3BvcnQtYm94LWl0ZW1cIj4gPGgzPnt7Y3JlZGVudGlhbFN1YmplY3QuY2lyY3VsYXJpdHlTY29yZWNhcmQucmVjeWNsZWRDb250ZW50fX0lPC9oMz4gPHA-UmVjeWNsZWQgY29udGVudDwvcD4gPC9kaXY-IDxkaXYgY2xhc3M9XCJwYXNzcG9ydC1ib3gtaXRlbVwiPiA8aDM-e3tjcmVkZW50aWFsU3ViamVjdC5jaXJjdWxhcml0eVNjb3JlY2FyZC51dGlsaXR5RmFjdG9yfX08L2gzPiA8cD5VdGlsaXR5IGZhY3RvcjwvcD4gPC9kaXY-IDxkaXYgY2xhc3M9XCJwYXNzcG9ydC1ib3gtaXRlbVwiPiA8aDM-e3tjcmVkZW50aWFsU3ViamVjdC5jaXJjdWxhcml0eVNjb3JlY2FyZC5tYXRlcmlhbENpcmN1bGFyaXR5SW5kaWNhdG9yfX08L2gzPiA8cD5NYXRlcmlhbCBjaXJjdWxhcml0eSo8L3A-IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cInBhc3Nwb3J0LWFubm90YXRpb25cIj4gPHA-KlRoZSBNYXRlcmlhbCBDaXJjdWxhcml0eSBJbmRpY2F0b3IgcHJvdmlkZXMgYW4gb3ZlcmFsbCBjaXJjdWxhcml0eSBzY29yZSB3aGljaCBpcyBhIGZ1bmN0aW9uIG9mIGFsbCB0aHJlZSBvZiB0aGUgZWFybGllciBtZWFzdXJlcy48L3A-IDwvZGl2PiA8ZGl2IGNsYXNzPVwidHJhY2VhYmlsaXR5LWNhcmRzXCI-IDxhIGhyZWY9XCJ7e2NyZWRlbnRpYWxTdWJqZWN0LmNpcmN1bGFyaXR5U2NvcmVjYXJkLnJlY3ljbGluZ0luZm9ybWF0aW9uLmxpbmtVUkx9fVwiIGNsYXNzPVwidHJhY2VhYmlsaXR5LWNhcmRcIj4gPGRpdiBjbGFzcz1cInRyYWNlYWJpbGl0eS1jYXJkLXRleHRcIj4gPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI-IDxwYXRoIGQ9XCJNMjEuODIgMTUuNDJMMTkuMzIgMTkuNzVDMTguODMgMjAuNjEgMTcuOTIgMjEuMDYgMTcgMjFIMTVWMjNMMTIuNSAxOC41TDE1IDE0VjE2SDE3LjgyTDE1LjYgMTIuMTVMMTkuOTMgOS42NUwyMS43MyAxMi43N0MyMi4yNSAxMy41NCAyMi4zMiAxNC41NyAyMS44MiAxNS40MlpNOS4yMTAwMyAzLjA2SDE0LjIxQzE1LjE5IDMuMDYgMTYuMDQgMy42MyAxNi40NSA0LjQ1TDE3LjQ1IDYuMTlMMTkuMTggNS4xOUwxNi41NCA5LjZMMTEuMzkgOS42OUwxMy4xMiA4LjY5TDExLjcxIDYuMjRMOS41MDAwMyAxMC4wOUw1LjE2MDAzIDcuNTlMNi45NjAwMyA0LjQ3QzcuMzcwMDMgMy42NCA4LjIyMDAzIDMuMDYgOS4yMTAwMyAzLjA2Wk01LjA1MDAzIDE5Ljc2TDIuNTUwMDMgMTUuNDNDMi4wNjAwMyAxNC41OCAyLjEzMDAzIDEzLjU2IDIuNjQwMDMgMTIuNzlMMy42NDAwMyAxMS4wNkwxLjkxMDAzIDEwLjA2TDcuMDUwMDMgMTAuMTRMOS43MDAwMyAxNC41Nkw3Ljk3MDAzIDEzLjU2TDYuNTYwMDMgMTZIMTFWMjFINy40MDAwM0M2LjkzMTU0IDIxLjAzMzkgNi40NjI5MyAyMC45MzU3IDYuMDQ3NSAyMC43MTY1QzUuNjMyMDYgMjAuNDk3MyA1LjI4NjQ4IDIwLjE2NTkgNS4wNTAwMyAxOS43NlpcIiBmaWxsPVwiIzFGNUE5NVwiIC8-IDwvc3ZnPiA8cD5SZWN5Y2xpbmcgaW5zdHJ1Y3Rpb25zPC9wPiA8L2Rpdj4gPGRpdiBjbGFzcz1cInRyYWNlYWJpbGl0eS1jYXJkLXZpZXctZGV0YWlsc1wiPiA8c3ZnIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMTAgMTVcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBhdGggZD1cIk0xIDFMOCA4TDEgMTVcIiBzdHJva2U9XCIjMUY1QTk1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8-IDwvc3ZnPiA8L2Rpdj4gPC9hPiA8YSBocmVmPVwie3tjcmVkZW50aWFsU3ViamVjdC5jaXJjdWxhcml0eVNjb3JlY2FyZC5yZXBhaXJJbmZvcm1hdGlvbi5saW5rVVJMfX1cIiBjbGFzcz1cInRyYWNlYWJpbGl0eS1jYXJkXCI-IDxkaXYgY2xhc3M9XCJ0cmFjZWFiaWxpdHktY2FyZC10ZXh0XCI-IDxzdmcgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cGF0aCBkPVwiTTE4Ljg1IDIxLjk3NUMxOC43MTY3IDIxLjk3NSAxOC41OTE3IDIxLjk1NDMgMTguNDc1IDIxLjkxM0MxOC4zNTgzIDIxLjg3MTcgMTguMjUgMjEuODAwNyAxOC4xNSAyMS43TDEzLjA1IDE2LjZDMTIuOTUgMTYuNSAxMi44NzkgMTYuMzkxNyAxMi44MzcgMTYuMjc1QzEyLjc5NSAxNi4xNTgzIDEyLjc3NDMgMTYuMDMzMyAxMi43NzUgMTUuOUMxMi43NzU3IDE1Ljc2NjcgMTIuNzk2NyAxNS42NDE3IDEyLjgzOCAxNS41MjVDMTIuODc5MyAxNS40MDgzIDEyLjk1IDE1LjMgMTMuMDUgMTUuMkwxNS4xNzUgMTMuMDc1QzE1LjI3NSAxMi45NzUgMTUuMzgzMyAxMi45MDQzIDE1LjUgMTIuODYzQzE1LjYxNjcgMTIuODIxNyAxNS43NDE3IDEyLjgwMDcgMTUuODc1IDEyLjhDMTYuMDA4MyAxMi43OTkzIDE2LjEzMzMgMTIuODIwMyAxNi4yNSAxMi44NjNDMTYuMzY2NyAxMi45MDU3IDE2LjQ3NSAxMi45NzYzIDE2LjU3NSAxMy4wNzVMMjEuNjc1IDE4LjE3NUMyMS43NzUgMTguMjc1IDIxLjg0NiAxOC4zODMzIDIxLjg4OCAxOC41QzIxLjkzIDE4LjYxNjcgMjEuOTUwNyAxOC43NDE3IDIxLjk1IDE4Ljg3NUMyMS45NDkzIDE5LjAwODMgMjEuOTI4NyAxOS4xMzMzIDIxLjg4OCAxOS4yNUMyMS44NDczIDE5LjM2NjcgMjEuNzc2MyAxOS40NzUgMjEuNjc1IDE5LjU3NUwxOS41NSAyMS43QzE5LjQ1IDIxLjggMTkuMzQxNyAyMS44NzEgMTkuMjI1IDIxLjkxM0MxOS4xMDgzIDIxLjk1NSAxOC45ODMzIDIxLjk3NTcgMTguODUgMjEuOTc1Wk0xOC44NSAxOS42TDE5LjU3NSAxOC44NzVMMTUuOSAxNS4yTDE1LjE3NSAxNS45MjVMMTguODUgMTkuNlpNNS4xMjUgMjJDNC45OTE2NyAyMiA0Ljg2MjY3IDIxLjk3NSA0LjczOCAyMS45MjVDNC42MTMzMyAyMS44NzUgNC41MDA2NyAyMS44IDQuNCAyMS43TDIuMyAxOS42QzIuMiAxOS41IDIuMTI1IDE5LjM4NzMgMi4wNzUgMTkuMjYyQzIuMDI1IDE5LjEzNjcgMiAxOS4wMDggMiAxOC44NzZDMiAxOC43NDQgMi4wMjUgMTguNjE5IDIuMDc1IDE4LjUwMUMyLjEyNSAxOC4zODMgMi4yIDE4LjI3NDcgMi4zIDE4LjE3Nkw3LjYgMTIuODc2SDkuNzI1TDEwLjU3NSAxMi4wMjZMNi40NSA3LjlINS4wMjVMMiA0Ljg3NUw0LjgyNSAyLjA1TDcuODUgNS4wNzVWNi41TDExLjk3NSAxMC42MjVMMTQuODc1IDcuNzI1TDEzLjggNi42NUwxNS4yIDUuMjVIMTIuMzc1TDExLjY3NSA0LjU1TDE1LjIyNSAxTDE1LjkyNSAxLjdWNC41MjVMMTcuMzI1IDMuMTI1TDIwLjg3NSA2LjY3NUMyMS4xNTgzIDYuOTU4MzMgMjEuMzc1IDcuMjc5MzMgMjEuNTI1IDcuNjM4QzIxLjY3NSA3Ljk5NjY3IDIxLjc1IDguMzc1NjcgMjEuNzUgOC43NzVDMjEuNzUgOS4xNzQzMyAyMS42NzUgOS41NTc2NyAyMS41MjUgOS45MjVDMjEuMzc1IDEwLjI5MjMgMjEuMTU4MyAxMC42MTczIDIwLjg3NSAxMC45TDE4Ljc1IDguNzc1TDE3LjM1IDEwLjE3NUwxNi4zIDkuMTI1TDExLjEyNSAxNC4zVjE2LjRMNS44MjUgMjEuN0M1LjcyNSAyMS44IDUuNjE2NjcgMjEuODc1IDUuNSAyMS45MjVDNS4zODMzMyAyMS45NzUgNS4yNTgzMyAyMiA1LjEyNSAyMlpNNS4xMjUgMTkuNkw5LjM3NSAxNS4zNVYxNC42MjVIOC42NUw0LjQgMTguODc1TDUuMTI1IDE5LjZaTTUuMTI1IDE5LjZMNC40IDE4Ljg3NUw0Ljc3NSAxOS4yMjVMNS4xMjUgMTkuNlpcIiBmaWxsPVwiIzFGNUE5NVwiIC8-IDwvc3ZnPiA8cD5SZXBhaXIgaW5zdHJ1Y3Rpb25zPC9wPiA8L2Rpdj4gPGRpdiBjbGFzcz1cInRyYWNlYWJpbGl0eS1jYXJkLXZpZXctZGV0YWlsc1wiPiA8c3ZnIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMTAgMTVcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBhdGggZD1cIk0xIDFMOCA4TDEgMTVcIiBzdHJva2U9XCIjMUY1QTk1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8-IDwvc3ZnPiA8L2Rpdj4gPC9hPiA8L2Rpdj4gPC9zZWN0aW9uPiA8c2VjdGlvbiBjbGFzcz1cImVtaXNzaW9uLXNjb3JlLWNhcmRcIj4gPGgzIGNsYXNzPVwibWlzc2lvbi1zY29yZS10aXRsZVwiPkVtaXNzaW9ucyBTY29yZWNhcmQ8L2gzPiA8cCBjbGFzcz1cIm1pc3Npb24tc2NvcmUtZGVzY3JpcHRpb25cIj5UaGUgRW1pc3Npb25zIFNjb3JlY2FyZCBnaXZlcyBhIGNsZWFyIHNuYXBzaG90IG9mIHRoZSBwcm9kdWN0J3MgZ3JlZW5ob3VzZSBnYXMgKEdIRykgZW1pc3Npb25zIHBlcmZvcm1hbmNlLCBwcm92aWRpbmcgYSBzaW5nbGUgaW5kaWNhdG9yIHRvIGFzc2VzcyBpdHMgb3ZlcmFsbCBlbnZpcm9ubWVudGFsIGltcGFjdC48L3A-IDxkaXYgY2xhc3M9XCJzY29yZVwiPiA8cCBjbGFzcz1cInNjb3JlLXVuaXRcIj4ge3tjcmVkZW50aWFsU3ViamVjdC5lbWlzc2lvbnNTY29yZWNhcmQuY2FyYm9uRm9vdHByaW50fX17e2NyZWRlbnRpYWxTdWJqZWN0LmVtaXNzaW9uc1Njb3JlY2FyZC5kZWNsYXJlZFVuaXR9fSA8L3A-IDxwIGNsYXNzPVwic2NvcmUtbmFtZVwiPkNvMkVxPC9wPiA8L2Rpdj4gPGRpdiBjbGFzcz1cInRhYmxlXCI-IDxkaXYgY2xhc3M9XCJ0YWJsZS1pdGVtXCI-IDxzcGFuIGNsYXNzPVwiaXRlbS10aXRsZVwiPlNjb3BlIGluY2x1ZGVzPC9zcGFuPiA8cCBjbGFzcz1cIml0ZW0tdmFsdWVcIj57e2NyZWRlbnRpYWxTdWJqZWN0LmVtaXNzaW9uc1Njb3JlY2FyZC5vcGVyYXRpb25hbFNjb3BlfX08L3A-IDwvZGl2PiA8ZGl2IGNsYXNzPVwidGFibGUtaXRlbVwiPiA8c3BhbiBjbGFzcz1cIml0ZW0tdGl0bGVcIj5QcmltYXJ5IHNvdXJjZWQgcmF0aW8qPC9zcGFuPiA8cCBjbGFzcz1cIml0ZW0tdmFsdWVcIj57e2NyZWRlbnRpYWxTdWJqZWN0LmVtaXNzaW9uc1Njb3JlY2FyZC5wcmltYXJ5U291cmNlZFJhdGlvfX0lIHByaW1hcnkgc291cmNlczwvcD4gPC9kaXY-IDxkaXYgY2xhc3M9XCJ0YWJsZS1pdGVtXCI-IDxzcGFuIGNsYXNzPVwiaXRlbS10aXRsZVwiPlJlcG9ydGluZyBzdGFuZGFyZDwvc3Bhbj4gPGRpdiBjbGFzcz1cIml0ZW0tdmFsdWVcIj4gPGEgaHJlZj1cInt7Y3JlZGVudGlhbFN1YmplY3QuZW1pc3Npb25zU2NvcmVjYXJkLnJlcG9ydGluZ1N0YW5kYXJkLmlkfX1cIiBjbGFzcz1cImJsdWUtYm90dG9tLWxpbmUtdGhpY2tcIj57e2NyZWRlbnRpYWxTdWJqZWN0LmVtaXNzaW9uc1Njb3JlY2FyZC5yZXBvcnRpbmdTdGFuZGFyZC5uYW1lfX08L2E-IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cInRhYmxlLWl0ZW1cIj4gPHNwYW4gY2xhc3M9XCJpdGVtLXRpdGxlXCI-SXNzdWUgZGF0ZTwvc3Bhbj4gPHAgY2xhc3M9XCJpdGVtLXZhbHVlXCI-e3tjcmVkZW50aWFsU3ViamVjdC5lbWlzc2lvbnNTY29yZWNhcmQucmVwb3J0aW5nU3RhbmRhcmQuaXNzdWVEYXRlfX08L3A-IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cImFubm90YXRpb25cIj4gPHNwYW4-Kjwvc3Bhbj4gPHA-VGhlIFByaW1hcnkgU291cmNlZCBSYXRpbyBzaG93cyB0aGUgcGVyY2VudGFnZSBvZiBzY29wZSAzIGVtaXNzaW9ucyBkYXRhIHRoYXQgaXMgZGlyZWN0bHkgY29sbGVjdGVkIGZyb20gYWN0dWFsIHNvdXJjZXMsIHJhdGhlciB0aGFuIGJlaW5nIGJhc2VkIG9uIGVzdGltYXRlcy48L3A-IDwvZGl2PiA8L3NlY3Rpb24-IDxzZWN0aW9uIGNsYXNzPVwiZGVjbGFyYXRpb25zXCI-IDxkaXYgY2xhc3M9XCJkZWNsYXJhdGlvbi10aXRsZVwiPkRlY2xhcmF0aW9uczwvZGl2PiA8ZGl2IGNsYXNzPVwiY2FyZHMtY29uZm9ybWl0aWVzXCI-IHt7I2VhY2ggY3JlZGVudGlhbFN1YmplY3QuY29uZm9ybWl0eUNsYWltfX0gPGRpdiBjbGFzcz1cImNhcmRzLWNvbmZvcm1pdHlcIj4gPGRpdiBjbGFzcz1cImZyYW1lXCI-IDxkaXYgY2xhc3M9XCJkaXZcIj4gPGRpdiBjbGFzcz1cImNvbXBhbnktbmFtZVwiPkNvbmZvcm1hbmNlOjwvZGl2PiA8ZGl2IGNsYXNzPVwie3sjaWYgY29uZm9ybWFuY2V9fXRhZ3MtVkMtYmFkZ2UtZ3JlZW57e2Vsc2V9fXRhZ3MtVkMtYmFkZ2UtcmVke3svaWZ9fVwiPiA8ZGl2IGNsYXNzPVwidmVyaWZpYWJsZVwiPnt7I2lmIGNvbmZvcm1hbmNlfX1ZZXN7e2Vsc2V9fU5ve3svaWZ9fTwvZGl2PiA8L2Rpdj4gPC9kaXY-IDxkaXYgY2xhc3M9XCJjb21wYW55LW5hbWVcIj5Bc3Nlc3NlZDoge3thc3Nlc3NtZW50RGF0ZX19PC9kaXY-IDwvZGl2PiA8ZGl2IGNsYXNzPVwiZnJhbWUtMlwiPiA8ZGl2IGNsYXNzPVwidGV4dC13cmFwcGVyXCI-e3tjb25mb3JtaXR5RXZpZGVuY2UubGlua05hbWV9fTwvZGl2PiA8cCBjbGFzcz1cInBcIj4gPHNwYW4gY2xhc3M9XCJzcGFuXCI-e3tyZWZlcmVuY2VSZWd1bGF0aW9uLm5hbWV9fSBhZG1pbmlzdGVyZWQgaW4ge3tyZWZlcmVuY2VSZWd1bGF0aW9uLmp1cmlzZGljdGlvbkNvdW50cnl9fSBieSA8L3NwYW4-IDxhIGhyZWY9XCJ7e3JlZmVyZW5jZVJlZ3VsYXRpb24uYWRtaW5pc3RlcmVkQnkuaWR9fVwiIGNsYXNzPVwidGV4dC13cmFwcGVyLTIgZ3JheS1ib3R0b20tbGluZVwiPnt7cmVmZXJlbmNlUmVndWxhdGlvbi5hZG1pbmlzdGVyZWRCeS5uYW1lfX08L2E-IDwvcD4gPHAgY2xhc3M9XCJwXCI-IDxzcGFuIGNsYXNzPVwic3BhblwiPnt7cmVmZXJlbmNlU3RhbmRhcmQubmFtZX19IGlzc3VlZCBieSA8L3NwYW4-IDxhIGhyZWY9XCJ7e3JlZmVyZW5jZVN0YW5kYXJkLmlzc3VpbmdQYXJ0eS5pZH19XCIgY2xhc3M9XCJ0ZXh0LXdyYXBwZXItMiBncmF5LWJvdHRvbS1saW5lXCI-e3tyZWZlcmVuY2VTdGFuZGFyZC5pc3N1aW5nUGFydHkubmFtZX19PC9hPiA8L3A-IDwvZGl2PiA8ZGl2IGNsYXNzPVwiZnJhbWUtM1wiPiB7eyNlYWNoIGRlY2xhcmVkVmFsdWV9fSA8ZGl2IGNsYXNzPVwiZnJhbWUtNFwiPiA8ZGl2IGNsYXNzPVwidHlwb2dyYXBoeS1oZWFkaW5nXCI-IDxwIGNsYXNzPVwiaGVhZGluZ1wiPnt7bWV0cmljTmFtZX19IGlzIHt7bWV0cmljVmFsdWUudmFsdWV9fXt7bWV0cmljVmFsdWUudW5pdH19PC9wPiA8L2Rpdj4gPGRpdiBjbGFzcz1cInR5cG9ncmFwaHktaGVhZGluZ1wiPiA8cCBjbGFzcz1cImhlYWRpbmctMlwiPlNjb3JlOiB7e3Njb3JlfX0gfCBBY2N1cmFjeSB7e2FjY3VyYWN5fX08L3A-IDwvZGl2PiA8L2Rpdj4ge3svZWFjaH19IDwvZGl2PiA8YSBocmVmPVwie3tjb25mb3JtaXR5RXZpZGVuY2UubGlua1VSTH19XCIgY2xhc3M9XCJjYXJkcy10cmFjZWFiaWxpdHlcIj4gPGRpdiBjbGFzcz1cImZyYW1lLTVcIj4gPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI-IDxwYXRoIGQ9XCJNNSAyMUM0LjQ1IDIxIDMuOTc5MzMgMjAuODA0MyAzLjU4OCAyMC40MTNDMy4xOTY2NyAyMC4wMjE3IDMuMDAwNjcgMTkuNTUwNyAzIDE5VjVDMyA0LjQ1IDMuMTk2IDMuOTc5MzMgMy41ODggMy41ODhDMy45OCAzLjE5NjY3IDQuNDUwNjcgMy4wMDA2NyA1IDNIMTlDMTkuNTUgMyAyMC4wMjEgMy4xOTYgMjAuNDEzIDMuNTg4QzIwLjgwNSAzLjk4IDIxLjAwMDcgNC40NTA2NyAyMSA1VjE5QzIxIDE5LjU1IDIwLjgwNDMgMjAuMDIxIDIwLjQxMyAyMC40MTNDMjAuMDIxNyAyMC44MDUgMTkuNTUwNyAyMS4wMDA3IDE5IDIxSDVaTTUgNVYxOUgxOVY1SDE3VjEyTDE0LjUgMTAuNUwxMiAxMlY1SDVaXCIgZmlsbD1cIiMxRjVBOTVcIj48L3BhdGg-IDwvc3ZnPiA8ZGl2IGNsYXNzPVwiY29tcGFueS1uYW1lLXdyYXBwZXJcIj4gPGRpdiBjbGFzcz1cImNvbXBhbnktbmFtZS0yXCI-RXZpZGVuY2U8L2Rpdj4gPC9kaXY-IDwvZGl2PiA8c3ZnIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMTAgMTVcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBhdGggZD1cIk0xIDFMOCA4TDEgMTVcIiBzdHJva2U9XCIjMUY1QTk1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPiA8L3BhdGg-IDwvc3ZnPiA8L2E-IDwvZGl2PiB7ey9lYWNofX0gPC9kaXY-IDwvc2VjdGlvbj4gPHNlY3Rpb24gY2xhc3M9XCJwcm9kdWN0aW9uXCI-IDxkaXYgY2xhc3M9XCJwcm9kdWN0aW9uLXRpdGxlXCI-UHJvZHVjdGlvbjwvZGl2PiA8ZGl2IGNsYXNzPVwicHJvZHVjdC10YWJsZSB0YWJsZVwiPiA8ZGl2IGNsYXNzPVwidGFibGUtaXRlbVwiPiA8c3BhbiBjbGFzcz1cIml0ZW0tdGl0bGVcIj5Qcm9kdWN0IGNhdGVnb3J5PC9zcGFuPiA8cCBjbGFzcz1cIml0ZW0tdmFsdWVcIj57eyNlYWNoIGNyZWRlbnRpYWxTdWJqZWN0LnByb2R1Y3RDYXRlZ29yeX19e3tuYW1lfX17eyN1bmxlc3MgQGxhc3R9fSx7ey91bmxlc3N9fSB7ey9lYWNofX08L3A-IDwvZGl2PiA8ZGl2IGNsYXNzPVwidGFibGUtaXRlbVwiPiA8c3BhbiBjbGFzcz1cIml0ZW0tdGl0bGVcIj5Qcm9kdWNlZCBieTwvc3Bhbj4gPGEgaHJlZj1cInt7Y3JlZGVudGlhbFN1YmplY3QucHJvZHVjZWRCeVBhcnR5LmlkfX1cIiBjbGFzcz1cImJsdWUtYm90dG9tLWxpbmUtdGhpY2tcIj57e2NyZWRlbnRpYWxTdWJqZWN0LnByb2R1Y2VkQnlQYXJ0eS5uYW1lfX08L2E-IDwvZGl2PiA8ZGl2IGNsYXNzPVwidGFibGUtaXRlbVwiPiA8c3BhbiBjbGFzcz1cIml0ZW0tdGl0bGVcIj5Qcm9kdWNlZCBhdDwvc3Bhbj4gPGRpdiBjbGFzcz1cIml0ZW0tdmFsdWVcIj4gPGEgaHJlZj1cInt7Y3JlZGVudGlhbFN1YmplY3QucHJvZHVjZWRBdEZhY2lsaXR5LmlkfX1cIiBjbGFzcz1cImJsdWUtYm90dG9tLWxpbmUtdGhpY2tcIj57e2NyZWRlbnRpYWxTdWJqZWN0LnByb2R1Y2VkQXRGYWNpbGl0eS5uYW1lfX08L2E-IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cInRhYmxlLWl0ZW1cIj4gPHNwYW4gY2xhc3M9XCJpdGVtLXRpdGxlXCI-RGF0ZSBwcm9kdWNlZDwvc3Bhbj4gPHAgY2xhc3M9XCJpdGVtLXZhbHVlXCI-e3tjcmVkZW50aWFsU3ViamVjdC5wcm9kdWN0aW9uRGF0ZX19PC9wPiA8L2Rpdj4gPGRpdiBjbGFzcz1cInRhYmxlLWl0ZW1cIj4gPHNwYW4gY2xhc3M9XCJpdGVtLXRpdGxlXCI-Q291bnRyeTwvc3Bhbj4gPHAgY2xhc3M9XCJpdGVtLXZhbHVlXCI-e3tjcmVkZW50aWFsU3ViamVjdC5jb3VudHJ5T2ZQcm9kdWN0aW9ufX08L3A-IDwvZGl2PiA8ZGl2IGNsYXNzPVwidGFibGUtaXRlbVwiPiA8c3BhbiBjbGFzcz1cIml0ZW0tdGl0bGVcIj5EaW1lbnNpb25zPC9zcGFuPiA8cCBjbGFzcz1cIml0ZW0tdmFsdWVcIj4gPHNwYW4-V2VpZ2h0OiB7e2NyZWRlbnRpYWxTdWJqZWN0LmRpbWVuc2lvbnMud2VpZ2h0LnZhbHVlfX17e2NyZWRlbnRpYWxTdWJqZWN0LmRpbWVuc2lvbnMud2VpZ2h0LnVuaXR9fTwvc3Bhbj4gPHNwYW4-TGVuZ3RoOiB7e2NyZWRlbnRpYWxTdWJqZWN0LmRpbWVuc2lvbnMubGVuZ3RoLnZhbHVlfX17e2NyZWRlbnRpYWxTdWJqZWN0LmRpbWVuc2lvbnMubGVuZ3RoLnVuaXR9fTwvc3Bhbj4gPHNwYW4-V2lkdGg6IHt7Y3JlZGVudGlhbFN1YmplY3QuZGltZW5zaW9ucy53aWR0aC52YWx1ZX19e3tjcmVkZW50aWFsU3ViamVjdC5kaW1lbnNpb25zLndpZHRoLnVuaXR9fTwvc3Bhbj4gPHNwYW4-SGVpZ2h0OiB7e2NyZWRlbnRpYWxTdWJqZWN0LmRpbWVuc2lvbnMuaGVpZ2h0LnZhbHVlfX17e2NyZWRlbnRpYWxTdWJqZWN0LmRpbWVuc2lvbnMuaGVpZ2h0LnVuaXR9fTwvc3Bhbj4gPHNwYW4-Vm9sdW1lOiB7e2NyZWRlbnRpYWxTdWJqZWN0LmRpbWVuc2lvbnMudm9sdW1lLnZhbHVlfX17e2NyZWRlbnRpYWxTdWJqZWN0LmRpbWVuc2lvbnMudm9sdW1lLnVuaXR9fTwvc3Bhbj4gPC9wPiA8L2Rpdj4gPC9kaXY-IDwvc2VjdGlvbj4gPHNlY3Rpb24gY2xhc3M9XCJjb21wb3NpdGlvblwiPiA8ZGl2PiA8cCBjbGFzcz1cInNlY3Rpb24tdGl0bGVcIj5Qcm9kdWN0IGNvbXBvc2l0aW9uPC9wPiA8cCBjbGFzcz1cInNlY3Rpb24tZGVzY3JpcHRpb25cIj4gQSBjb21wbGV0ZSBsaXN0IG9mIG1hdGVyaWFscyB0aGF0IG1ha2UgdXAgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgcHJvZHVjdC4gPC9wPiA8L2Rpdj4gPGRpdiBjbGFzcz1cImNvbXBvc2l0aW9uLWJveFwiPiB7eyNlYWNoIGNyZWRlbnRpYWxTdWJqZWN0Lm1hdGVyaWFsc1Byb3ZlbmFuY2V9fSA8ZGl2IGNsYXNzPVwiY29tcG9zaXRpb24tYm94LWl0ZW1cIj4gPGRpdiBjbGFzcz1cImNvbXBvc2l0aW9uLWJveC1maXJzdC1jb2x1bW5cIj4gPHAgY2xhc3M9XCJjb21wb3NpdGlvbi1wZXJjZW50XCI-e3ttYXNzRnJhY3Rpb259fSU8L3A-IDxkaXYgY2xhc3M9XCJjb21wb3NpdGlvbi1ib3gtc2Vjb25kLWNvbHVtblwiPiA8cCBjbGFzcz1cImNvbXBvc2l0aW9uLXRpdGxlXCI-e3ttYXNzQW1vdW50LnZhbHVlfX17e21hc3NBbW91bnQudW5pdH19IHt7bmFtZX19PC9wPiA8ZGl2IGNsYXNzPVwiY29tcG9zaXRpb24tdGFnXCI-IDxwIGNsYXNzPVwiY29tcG9zaXRpb24tdGFnLWl0ZW1cIj5SZWN5Y2xlZCB7e3JlY3ljbGVkQW1vdW50fX0lPC9wPiA8cCBjbGFzcz1cImNvbXBvc2l0aW9uLXRhZy1pdGVtXCI-SGF6YXJkIHt7I2lmIGhhemFyZG91c319WWVze3tlbHNlfX1Ob3t7L2lmfX08L3A-IDwvZGl2PiA8YSBocmVmPVwie3ttYXRlcmlhbFNhZmV0eUluZm9ybWF0aW9uLmxpbmtVUkx9fVwiIGNsYXNzPVwiYmx1ZS1ib3R0b20tbGluZS10aGlja1wiPnt7bWF0ZXJpYWxTYWZldHlJbmZvcm1hdGlvbi5saW5rTmFtZX19PC9hPiA8L2Rpdj4gPC9kaXY-IDxkaXYgY2xhc3M9XCJjb21wb3NpdGlvbi1ib3gtdGhpcmQtY29sdW1uXCI-IDxkaXYgY2xhc3M9XCJjb3VudHJ5LWNvZGVcIj57e29yaWdpbkNvdW50cnl9fTwvZGl2PiA8L2Rpdj4gPC9kaXY-IHt7L2VhY2h9fSA8L2Rpdj4gPC9zZWN0aW9uPiA8c2VjdGlvbiBjbGFzcz1cImhpc3RvcnlcIj4gPGRpdj4gPHAgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCI-SGlzdG9yeTwvcD4gPC9kaXY-IHt7IS0tIHN0YXJ0OiBTdXBwbHkgY2hhaW4gZHVlIGRpbGlnZW5jZSByZXBvcnQgLS19fSA8YSBocmVmPVwie3tjcmVkZW50aWFsU3ViamVjdC5kdWVEaWxpZ2VuY2VEZWNsYXJhdGlvbi5saW5rVVJMfX1cIiBjbGFzcz1cImNhcmRzLXRyYWNlYWJpbGl0eVwiPiA8ZGl2IGNsYXNzPVwiZnJhbWUtNVwiPiA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBhdGggZD1cIk01IDIxQzQuNDUgMjEgMy45NzkzMyAyMC44MDQzIDMuNTg4IDIwLjQxM0MzLjE5NjY3IDIwLjAyMTcgMy4wMDA2NyAxOS41NTA3IDMgMTlWNUMzIDQuNDUgMy4xOTYgMy45NzkzMyAzLjU4OCAzLjU4OEMzLjk4IDMuMTk2NjcgNC40NTA2NyAzLjAwMDY3IDUgM0gxOUMxOS41NSAzIDIwLjAyMSAzLjE5NiAyMC40MTMgMy41ODhDMjAuODA1IDMuOTggMjEuMDAwNyA0LjQ1MDY3IDIxIDVWMTlDMjEgMTkuNTUgMjAuODA0MyAyMC4wMjEgMjAuNDEzIDIwLjQxM0MyMC4wMjE3IDIwLjgwNSAxOS41NTA3IDIxLjAwMDcgMTkgMjFINVpNNSA1VjE5SDE5VjVIMTdWMTJMMTQuNSAxMC41TDEyIDEyVjVINVpcIiBmaWxsPVwiIzFGNUE5NVwiPjwvcGF0aD4gPC9zdmc-IDxkaXYgY2xhc3M9XCJjb21wYW55LW5hbWUtd3JhcHBlclwiPiA8ZGl2IGNsYXNzPVwiY29tcGFueS1uYW1lLTJcIj5TdXBwbHkgY2hhaW4gZHVlIGRpbGlnZW5jZSByZXBvcnQ8L2Rpdj4gPC9kaXY-IDwvZGl2PiA8c3ZnIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMTAgMTVcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBhdGggZD1cIk0xIDFMOCA4TDEgMTVcIiBzdHJva2U9XCIjMUY1QTk1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPiA8L3BhdGg-IDwvc3ZnPiA8L2E-IHt7IS0tIGVuZDogU3VwcGx5IGNoYWluIGR1ZSBkaWxpZ2VuY2UgcmVwb3J0IC0tfX0gPGRpdiBjbGFzcz1cImhpc3RvcnktaW5mb3JtYXRpb25cIj4gPGRpdiBjbGFzcz1cImhpc3RvcnktdmFsdWUtY2hhaW4taXRlbVwiPiA8ZGl2IGNsYXNzPVwiaGlzdG9yeS12YWx1ZS1jaGFpblwiPiA8cD57e2NyZWRlbnRpYWxTdWJqZWN0LnRyYWNlYWJpbGl0eUluZm9ybWF0aW9uLnZhbHVlQ2hhaW5Qcm9jZXNzfX08L3A-IDxkaXYgY2xhc3M9XCJ2ZXJpZmllZC1yYXRpb1wiPiA8cD5WZXJpZmllZCByYXRpbyB7e2NyZWRlbnRpYWxTdWJqZWN0LnRyYWNlYWJpbGl0eUluZm9ybWF0aW9uLnZlcmlmaWVkUmF0aW99fTwvcD4gPC9kaXY-IDwvZGl2PiA8ZGl2IGlkPVwiaGlzdG9yeS1pdGVtcy0zOTBweFwiIGNsYXNzPVwiaGlzdG9yeS1ldmVudFwiPiB7eyNlYWNoIGNyZWRlbnRpYWxTdWJqZWN0LnRyYWNlYWJpbGl0eUluZm9ybWF0aW9uLnRyYWNlYWJpbGl0eUV2ZW50fX0gPGRpdiBjbGFzcz1cImhpc3RvcnktaXRlbVwiPiA8c3Bhbj57e2xpbmtOYW1lfX08L3NwYW4-IDxhIGhyZWY9XCJ7e2xpbmtVUkx9fVwiIGNsYXNzPVwiYmx1ZS1ib3R0b20tbGluZS10aGlja1wiPlZpZXc8L2E-IDwvZGl2PiB7ey9lYWNofX0gPC9kaXY-IDwvZGl2PiA8L2Rpdj4gPC9zZWN0aW9uPiA8c2VjdGlvbiBjbGFzcz1cInBhc3Nwb3J0LWlzc3VlZC1ieVwiPiA8ZGl2PiA8aDIgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCI-UGFzc3BvcnQgaXNzdWVkIGJ5PC9oMj4gPC9kaXY-IDxkaXYgY2xhc3M9XCJ0YWJsZVwiPiA8ZGl2IGNsYXNzPVwidGFibGUtaXRlbVwiPiA8c3Bhbj5PcmdhbmlzYXRpb248L3NwYW4-IDxwPnt7aXNzdWVyLm5hbWV9fTwvcD4gPC9kaXY-IDxkaXYgY2xhc3M9XCJ0YWJsZS1pdGVtXCI-IDxzcGFuPlJlZ2lzdGVyZWQgSUQ8L3NwYW4-IDxhIGhyZWY9XCJ7e2lzc3Vlci5pZH19XCIgY2xhc3M9XCJibHVlLWJvdHRvbS1saW5lLXRoaWNrXCI-e3tpc3N1ZXIuaWR9fTwvYT4gPC9kaXY-IDxkaXYgY2xhc3M9XCJ0YWJsZS1pdGVtXCI-IDxzcGFuPlZhbGlkIGZyb208L3NwYW4-IDxwPnt7dmFsaWRGcm9tfX08L3A-IDwvZGl2PiA8ZGl2IGNsYXNzPVwidGFibGUtaXRlbVwiPiA8c3Bhbj5WYWxpZCB0bzwvc3Bhbj4gPHA-e3t2YWxpZFVudGlsfX08L3A-IDwvZGl2PiA8L2Rpdj4gPC9zZWN0aW9uPiA8Zm9vdGVyPiA8cD5UaGlzIERpZ2l0YWwgUHJvZHVjdCBQYXNzcG9ydCAoRFBQKSBpcyBhIGRpZ2l0YWwgcmVjb3JkIG9mIHRoZSBwcm9kdWN0J3Mgc3VzdGFpbmFiaWxpdHkgYW5kIGVudmlyb25tZW50YWwgcGVyZm9ybWFuY2UsIGVuc3VyaW5nIHRyYW5zcGFyZW5jeSBhbmQgYWNjb3VudGFiaWxpdHkgaW4gbGluZSB3aXRoIFVOVFAgc3RhbmRhcmRzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiB2aXNpdCA8YSBocmVmPVwiaHR0cHM6Ly91bmNlZmFjdC5naXRodWIuaW8vc3BlYy11bnRwL1wiIGNsYXNzPVwiZ3JheS1ib3R0b20tbGluZVwiPnVuY2VmYWN0LmdpdGh1Yi5pby9zcGVjLXVudHAvPC9hPi48L3A-IDwvZm9vdGVyPiA8L2Rpdj4gPCEtLSBFbmQgbW9iaWxlIC0tPiA8IS0tIERlc2t0b3Agd2lkdGggMTQ0MHB4IC0tPiA8ZGl2IGNsYXNzPVwiY29udGVudHNcIj4gPGRpdiBjbGFzcz1cImZyYW1lXCI-IDxkaXYgY2xhc3M9XCJQUC10aXRsZVwiPlBST0RVQ1QgUEFTU1BPUlQ8L2Rpdj4gPGRpdiBjbGFzcz1cInRleHQtd3JhcHBlclwiPnt7Y3JlZGVudGlhbFN1YmplY3QubmFtZX19PC9kaXY-IDxkaXYgY2xhc3M9XCJwcm9kdWN0LUlELUFMVFwiPiA8ZGl2IGNsYXNzPVwiZGl2XCI-IDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cGF0aCBkPVwiTTIuNDUgMy41QzIuMTcxNTIgMy41IDEuOTA0NDUgMy4zODkzOCAxLjcwNzU0IDMuMTkyNDZDMS41MTA2MiAyLjk5NTU1IDEuNCAyLjcyODQ4IDEuNCAyLjQ1QzEuNCAyLjE3MTUyIDEuNTEwNjIgMS45MDQ0NSAxLjcwNzU0IDEuNzA3NTRDMS45MDQ0NSAxLjUxMDYyIDIuMTcxNTIgMS40IDIuNDUgMS40QzIuNzI4NDggMS40IDIuOTk1NTUgMS41MTA2MiAzLjE5MjQ2IDEuNzA3NTRDMy4zODkzOCAxLjkwNDQ1IDMuNSAyLjE3MTUyIDMuNSAyLjQ1QzMuNSAyLjcyODQ4IDMuMzg5MzggMi45OTU1NSAzLjE5MjQ2IDMuMTkyNDZDMi45OTU1NSAzLjM4OTM4IDIuNzI4NDggMy41IDIuNDUgMy41Wk0xMy41ODcgNi43MDZMNy4yODcgMC40MDZDNy4wMzUgMC4xNTQgNi42ODUgMCA2LjMgMEgxLjRDMC42MjMgMCAwIDAuNjIzIDAgMS40VjYuM0MwIDYuNjg1IDAuMTU0IDcuMDM1IDAuNDEzIDcuMjg3TDYuNzA2IDEzLjU4N0M2Ljk2NSAxMy44MzkgNy4zMTUgMTQgNy43IDE0QzguMDg1IDE0IDguNDM1IDEzLjgzOSA4LjY4NyAxMy41ODdMMTMuNTg3IDguNjg3QzEzLjg0NiA4LjQzNSAxNCA4LjA4NSAxNCA3LjdDMTQgNy4zMDggMTMuODM5IDYuOTU4IDEzLjU4NyA2LjcwNlpcIiBmaWxsPVwiIzFGNUE5NVwiIC8-IDwvc3ZnPiA8YSBocmVmPVwie3tjcmVkZW50aWFsU3ViamVjdC5pZH19XCIgY2xhc3M9XCJsaW5lXCI-IDxkaXYgY2xhc3M9XCJ0ZXh0LXdyYXBwZXItMlwiPklEOiB7e2NyZWRlbnRpYWxTdWJqZWN0LmlkfX08L2Rpdj4gPC9hPiA8L2Rpdj4gPGRpdiBjbGFzcz1cImRpdlwiPiA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBhdGggZD1cIk0yLjQ1IDMuNUMyLjE3MTUyIDMuNSAxLjkwNDQ1IDMuMzg5MzggMS43MDc1NCAzLjE5MjQ2QzEuNTEwNjIgMi45OTU1NSAxLjQgMi43Mjg0OCAxLjQgMi40NUMxLjQgMi4xNzE1MiAxLjUxMDYyIDEuOTA0NDUgMS43MDc1NCAxLjcwNzU0QzEuOTA0NDUgMS41MTA2MiAyLjE3MTUyIDEuNCAyLjQ1IDEuNEMyLjcyODQ4IDEuNCAyLjk5NTU1IDEuNTEwNjIgMy4xOTI0NiAxLjcwNzU0QzMuMzg5MzggMS45MDQ0NSAzLjUgMi4xNzE1MiAzLjUgMi40NUMzLjUgMi43Mjg0OCAzLjM4OTM4IDIuOTk1NTUgMy4xOTI0NiAzLjE5MjQ2QzIuOTk1NTUgMy4zODkzOCAyLjcyODQ4IDMuNSAyLjQ1IDMuNVpNMTMuNTg3IDYuNzA2TDcuMjg3IDAuNDA2QzcuMDM1IDAuMTU0IDYuNjg1IDAgNi4zIDBIMS40QzAuNjIzIDAgMCAwLjYyMyAwIDEuNFY2LjNDMCA2LjY4NSAwLjE1NCA3LjAzNSAwLjQxMyA3LjI4N0w2LjcwNiAxMy41ODdDNi45NjUgMTMuODM5IDcuMzE1IDE0IDcuNyAxNEM4LjA4NSAxNCA4LjQzNSAxMy44MzkgOC42ODcgMTMuNTg3TDEzLjU4NyA4LjY4N0MxMy44NDYgOC40MzUgMTQgOC4wODUgMTQgNy43QzE0IDcuMzA4IDEzLjgzOSA2Ljk1OCAxMy41ODcgNi43MDZaXCIgZmlsbD1cIiMxRjVBOTVcIiAvPiA8L3N2Zz4gPGRpdiBjbGFzcz1cImRpdi13cmFwcGVyXCI-IDxkaXYgY2xhc3M9XCJ0ZXh0LXdyYXBwZXItMlwiPkJhdGNoOiB7e2NyZWRlbnRpYWxTdWJqZWN0LmJhdGNoTnVtYmVyfX08L2Rpdj4gPC9kaXY-IDwvZGl2PiA8ZGl2IGNsYXNzPVwiZGl2XCI-IDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cGF0aCBkPVwiTTIuNDUgMy41QzIuMTcxNTIgMy41IDEuOTA0NDUgMy4zODkzOCAxLjcwNzU0IDMuMTkyNDZDMS41MTA2MiAyLjk5NTU1IDEuNCAyLjcyODQ4IDEuNCAyLjQ1QzEuNCAyLjE3MTUyIDEuNTEwNjIgMS45MDQ0NSAxLjcwNzU0IDEuNzA3NTRDMS45MDQ0NSAxLjUxMDYyIDIuMTcxNTIgMS40IDIuNDUgMS40QzIuNzI4NDggMS40IDIuOTk1NTUgMS41MTA2MiAzLjE5MjQ2IDEuNzA3NTRDMy4zODkzOCAxLjkwNDQ1IDMuNSAyLjE3MTUyIDMuNSAyLjQ1QzMuNSAyLjcyODQ4IDMuMzg5MzggMi45OTU1NSAzLjE5MjQ2IDMuMTkyNDZDMi45OTU1NSAzLjM4OTM4IDIuNzI4NDggMy41IDIuNDUgMy41Wk0xMy41ODcgNi43MDZMNy4yODcgMC40MDZDNy4wMzUgMC4xNTQgNi42ODUgMCA2LjMgMEgxLjRDMC42MjMgMCAwIDAuNjIzIDAgMS40VjYuM0MwIDYuNjg1IDAuMTU0IDcuMDM1IDAuNDEzIDcuMjg3TDYuNzA2IDEzLjU4N0M2Ljk2NSAxMy44MzkgNy4zMTUgMTQgNy43IDE0QzguMDg1IDE0IDguNDM1IDEzLjgzOSA4LjY4NyAxMy41ODdMMTMuNTg3IDguNjg3QzEzLjg0NiA4LjQzNSAxNCA4LjA4NSAxNCA3LjdDMTQgNy4zMDggMTMuODM5IDYuOTU4IDEzLjU4NyA2LjcwNlpcIiBmaWxsPVwiIzFGNUE5NVwiIC8-IDwvc3ZnPiA8ZGl2IGNsYXNzPVwiZGl2LXdyYXBwZXJcIj4gPGRpdiBjbGFzcz1cInRleHQtd3JhcHBlci0yXCI-U2VyaWFsOiB7e2NyZWRlbnRpYWxTdWJqZWN0LnNlcmlhbE51bWJlcn19PC9kaXY-IDwvZGl2PiA8L2Rpdj4gPC9kaXY-IDxkaXYgY2xhc3M9XCJmcmFtZS0yXCI-IDxkaXYgY2xhc3M9XCJQUC1oZWFkZXJcIj4gPGRpdiBjbGFzcz1cImZyYW1lLTNcIj48L2Rpdj4gPC9kaXY-IDxkaXYgY2xhc3M9XCJmcmFtZS00XCI-IDxwIGNsYXNzPVwicFwiPiB7e2NyZWRlbnRpYWxTdWJqZWN0LmRlc2NyaXB0aW9ufX0gPC9wPiB7eyNlYWNoIGNyZWRlbnRpYWxTdWJqZWN0LmZ1cnRoZXJJbmZvcm1hdGlvbn19IDxhIGhyZWY9XCJ7e2xpbmtVUkx9fVwiIGNsYXNzPVwibGluZVwiPiA8ZGl2IGNsYXNzPVwidGV4dC13cmFwcGVyLTE2XCI-e3tsaW5rTmFtZX19PC9kaXY-IDwvYT4ge3svZWFjaH19IDwvZGl2PiA8L2Rpdj4gPC9kaXY-IHt7I2lmIGNyZWRlbnRpYWxTdWJqZWN0LmNoYXJhY3RlcmlzdGljfX0gPGRpdiBjbGFzcz1cImZyYW1lLTI0XCI-IDxkaXYgY2xhc3M9XCJoZWFkaW5nLXdyYXBwZXJcIj4gPGRpdiBjbGFzcz1cImhlYWRpbmdcIj5DaGFyYWN0ZXJpc3RpY3M8L2Rpdj4gPC9kaXY-IDxkaXYgY2xhc3M9XCJkaXYtNVwiPiB7eyNlYWNoIGNyZWRlbnRpYWxTdWJqZWN0LmNoYXJhY3RlcmlzdGljfX0gPGRpdiBjbGFzcz1cImRhdGEtdHdvLWNvbHVtbnNcIj4gPGRpdiBjbGFzcz1cInRleHQtd3JhcHBlci0xMlwiPnt7QGtleX19PC9kaXY-IDxkaXYgY2xhc3M9XCJkYXRhLXdyYXBwZXJcIj4gPGRpdiBjbGFzcz1cImRhdGFcIj57e3RoaXN9fTwvZGl2PiA8L2Rpdj4gPC9kaXY-IHt7L2VhY2h9fSA8L2Rpdj4gPC9kaXY-IHt7L2lmfX0gPGRpdiBjbGFzcz1cImRpdi0yXCI-IDxkaXYgY2xhc3M9XCJ0eXBvZ3JhcGh5LWhlYWRpbmdcIj4gPGRpdiBjbGFzcz1cInRleHQtd3JhcHBlci00XCI-Q2lyY3VsYXJpdHkgU2NvcmVjYXJkPC9kaXY-IDwvZGl2PiA8cCBjbGFzcz1cInRleHQtd3JhcHBlci01XCI-IFRoZSBjaXJjdWxhcml0eSBTY29yZWNhcmQgcHJvdmlkZXMgYSBzaW1wbGUgaGlnaCBsZXZlbCBzdW1tYXJ5IG9mIGNpcmN1bGFyaXR5IHBlcmZvcm1hbmNlIG9mIHRoZSBwcm9kdWN0LiA8L3A-IDxkaXYgY2xhc3M9XCJkaXYtM1wiPiA8ZGl2IGNsYXNzPVwiZnJhbWUtNVwiPiA8ZGl2IGNsYXNzPVwiZnJhbWUtNlwiPiA8ZGl2IGNsYXNzPVwiZnJhbWUtN1wiPiA8ZGl2IGNsYXNzPVwidGV4dC13cmFwcGVyLTZcIj57e2NyZWRlbnRpYWxTdWJqZWN0LmNpcmN1bGFyaXR5U2NvcmVjYXJkLnJlY3ljbGFibGVDb250ZW50fX0lPC9kaXY-IDxkaXYgY2xhc3M9XCJ0ZXh0LXdyYXBwZXItN1wiPlJlY3ljbGFibGUgY29udGVudDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cImZyYW1lLTdcIj4gPGRpdiBjbGFzcz1cInRleHQtd3JhcHBlci02XCI-e3tjcmVkZW50aWFsU3ViamVjdC5jaXJjdWxhcml0eVNjb3JlY2FyZC5yZWN5Y2xlZENvbnRlbnR9fSU8L2Rpdj4gPGRpdiBjbGFzcz1cInRleHQtd3JhcHBlci03XCI-UmVjeWNsZWQgY29udGVudDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cImZyYW1lLTdcIj4gPGRpdiBjbGFzcz1cInRleHQtd3JhcHBlci02XCI-e3tjcmVkZW50aWFsU3ViamVjdC5jaXJjdWxhcml0eVNjb3JlY2FyZC51dGlsaXR5RmFjdG9yfX08L2Rpdj4gPGRpdiBjbGFzcz1cInRleHQtd3JhcHBlci03XCI-VXRpbGl0eSBmYWN0b3I8L2Rpdj4gPC9kaXY-IDxkaXYgY2xhc3M9XCJmcmFtZS04XCI-IDxkaXYgY2xhc3M9XCJ0ZXh0LXdyYXBwZXItNlwiPnt7Y3JlZGVudGlhbFN1YmplY3QuY2lyY3VsYXJpdHlTY29yZWNhcmQubWF0ZXJpYWxDaXJjdWxhcml0eUluZGljYXRvcn19IDwvZGl2PiA8ZGl2IGNsYXNzPVwidGV4dC13cmFwcGVyLTdcIj5NYXRlcmlhbCBjaXJjdWxhcml0eSo8L2Rpdj4gPC9kaXY-IDwvZGl2PiA8cCBjbGFzcz1cInRleHQtd3JhcHBlci04XCI-ICpUaGUgTWF0ZXJpYWwgQ2lyY3VsYXJpdHkgSW5kaWNhdG9yIHByb3ZpZGVzIGFuIG92ZXJhbGwgY2lyY3VsYXJpdHkgc2NvcmUgd2hpY2ggaXMgYSBmdW5jdGlvbiBvZiBhbGwgdGhyZWUgb2YgdGhlIGVhcmxpZXIgbWVhc3VyZXMuIDwvcD4gPC9kaXY-IDxkaXYgY2xhc3M9XCJmcmFtZS05XCI-IDxhIGhyZWY9XCJ7e2NyZWRlbnRpYWxTdWJqZWN0LmNpcmN1bGFyaXR5U2NvcmVjYXJkLnJlY3ljbGluZ0luZm9ybWF0aW9uLmxpbmtVUkx9fVwiIGNsYXNzPVwiY2FyZHMtdHJhY2VhYmlsaXR5XCI-IDxkaXYgY2xhc3M9XCJkaXYtNFwiPiA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBhdGggZD1cIk0yMS44MiAxNS40MkwxOS4zMiAxOS43NUMxOC44MyAyMC42MSAxNy45MiAyMS4wNiAxNyAyMUgxNVYyM0wxMi41IDE4LjVMMTUgMTRWMTZIMTcuODJMMTUuNiAxMi4xNUwxOS45MyA5LjY1TDIxLjczIDEyLjc3QzIyLjI1IDEzLjU0IDIyLjMyIDE0LjU3IDIxLjgyIDE1LjQyWk05LjIxMDAzIDMuMDZIMTQuMjFDMTUuMTkgMy4wNiAxNi4wNCAzLjYzIDE2LjQ1IDQuNDVMMTcuNDUgNi4xOUwxOS4xOCA1LjE5TDE2LjU0IDkuNkwxMS4zOSA5LjY5TDEzLjEyIDguNjlMMTEuNzEgNi4yNEw5LjUwMDAzIDEwLjA5TDUuMTYwMDMgNy41OUw2Ljk2MDAzIDQuNDdDNy4zNzAwMyAzLjY0IDguMjIwMDMgMy4wNiA5LjIxMDAzIDMuMDZaTTUuMDUwMDMgMTkuNzZMMi41NTAwMyAxNS40M0MyLjA2MDAzIDE0LjU4IDIuMTMwMDMgMTMuNTYgMi42NDAwMyAxMi43OUwzLjY0MDAzIDExLjA2TDEuOTEwMDMgMTAuMDZMNy4wNTAwMyAxMC4xNEw5LjcwMDAzIDE0LjU2TDcuOTcwMDMgMTMuNTZMNi41NjAwMyAxNkgxMVYyMUg3LjQwMDAzQzYuOTMxNTQgMjEuMDMzOSA2LjQ2MjkzIDIwLjkzNTcgNi4wNDc1IDIwLjcxNjVDNS42MzIwNiAyMC40OTczIDUuMjg2NDggMjAuMTY1OSA1LjA1MDAzIDE5Ljc2WlwiIGZpbGw9XCIjMUY1QTk1XCIgLz4gPC9zdmc-IDxkaXYgY2xhc3M9XCJmcmFtZS0xMFwiPiA8ZGl2IGNsYXNzPVwidGV4dC13cmFwcGVyLTlcIj5SZWN5Y2xpbmcgaW5zdHJ1Y3Rpb25zPC9kaXY-IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cImRpdi00XCI-IDxzdmcgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAxMCAxNVwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cGF0aCBkPVwiTTEgMUw4IDhMMSAxNVwiIHN0cm9rZT1cIiMxRjVBOTVcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz4gPC9zdmc-IDwvZGl2PiA8L2E-IDxhIGhyZWY9XCJ7e2NyZWRlbnRpYWxTdWJqZWN0LmNpcmN1bGFyaXR5U2NvcmVjYXJkLnJlcGFpckluZm9ybWF0aW9uLmxpbmtVUkx9fVwiIGNsYXNzPVwiY2FyZHMtdHJhY2VhYmlsaXR5XCI-IDxkaXYgY2xhc3M9XCJkaXYtNFwiPiA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBhdGggZD1cIk0xOC44NSAyMS45NzVDMTguNzE2NyAyMS45NzUgMTguNTkxNyAyMS45NTQzIDE4LjQ3NSAyMS45MTNDMTguMzU4MyAyMS44NzE3IDE4LjI1IDIxLjgwMDcgMTguMTUgMjEuN0wxMy4wNSAxNi42QzEyLjk1IDE2LjUgMTIuODc5IDE2LjM5MTcgMTIuODM3IDE2LjI3NUMxMi43OTUgMTYuMTU4MyAxMi43NzQzIDE2LjAzMzMgMTIuNzc1IDE1LjlDMTIuNzc1NyAxNS43NjY3IDEyLjc5NjcgMTUuNjQxNyAxMi44MzggMTUuNTI1QzEyLjg3OTMgMTUuNDA4MyAxMi45NSAxNS4zIDEzLjA1IDE1LjJMMTUuMTc1IDEzLjA3NUMxNS4yNzUgMTIuOTc1IDE1LjM4MzMgMTIuOTA0MyAxNS41IDEyLjg2M0MxNS42MTY3IDEyLjgyMTcgMTUuNzQxNyAxMi44MDA3IDE1Ljg3NSAxMi44QzE2LjAwODMgMTIuNzk5MyAxNi4xMzMzIDEyLjgyMDMgMTYuMjUgMTIuODYzQzE2LjM2NjcgMTIuOTA1NyAxNi40NzUgMTIuOTc2MyAxNi41NzUgMTMuMDc1TDIxLjY3NSAxOC4xNzVDMjEuNzc1IDE4LjI3NSAyMS44NDYgMTguMzgzMyAyMS44ODggMTguNUMyMS45MyAxOC42MTY3IDIxLjk1MDcgMTguNzQxNyAyMS45NSAxOC44NzVDMjEuOTQ5MyAxOS4wMDgzIDIxLjkyODcgMTkuMTMzMyAyMS44ODggMTkuMjVDMjEuODQ3MyAxOS4zNjY3IDIxLjc3NjMgMTkuNDc1IDIxLjY3NSAxOS41NzVMMTkuNTUgMjEuN0MxOS40NSAyMS44IDE5LjM0MTcgMjEuODcxIDE5LjIyNSAyMS45MTNDMTkuMTA4MyAyMS45NTUgMTguOTgzMyAyMS45NzU3IDE4Ljg1IDIxLjk3NVpNMTguODUgMTkuNkwxOS41NzUgMTguODc1TDE1LjkgMTUuMkwxNS4xNzUgMTUuOTI1TDE4Ljg1IDE5LjZaTTUuMTI1IDIyQzQuOTkxNjcgMjIgNC44NjI2NyAyMS45NzUgNC43MzggMjEuOTI1QzQuNjEzMzMgMjEuODc1IDQuNTAwNjcgMjEuOCA0LjQgMjEuN0wyLjMgMTkuNkMyLjIgMTkuNSAyLjEyNSAxOS4zODczIDIuMDc1IDE5LjI2MkMyLjAyNSAxOS4xMzY3IDIgMTkuMDA4IDIgMTguODc2QzIgMTguNzQ0IDIuMDI1IDE4LjYxOSAyLjA3NSAxOC41MDFDMi4xMjUgMTguMzgzIDIuMiAxOC4yNzQ3IDIuMyAxOC4xNzZMNy42IDEyLjg3Nkg5LjcyNUwxMC41NzUgMTIuMDI2TDYuNDUgNy45SDUuMDI1TDIgNC44NzVMNC44MjUgMi4wNUw3Ljg1IDUuMDc1VjYuNUwxMS45NzUgMTAuNjI1TDE0Ljg3NSA3LjcyNUwxMy44IDYuNjVMMTUuMiA1LjI1SDEyLjM3NUwxMS42NzUgNC41NUwxNS4yMjUgMUwxNS45MjUgMS43VjQuNTI1TDE3LjMyNSAzLjEyNUwyMC44NzUgNi42NzVDMjEuMTU4MyA2Ljk1ODMzIDIxLjM3NSA3LjI3OTMzIDIxLjUyNSA3LjYzOEMyMS42NzUgNy45OTY2NyAyMS43NSA4LjM3NTY3IDIxLjc1IDguNzc1QzIxLjc1IDkuMTc0MzMgMjEuNjc1IDkuNTU3NjcgMjEuNTI1IDkuOTI1QzIxLjM3NSAxMC4yOTIzIDIxLjE1ODMgMTAuNjE3MyAyMC44NzUgMTAuOUwxOC43NSA4Ljc3NUwxNy4zNSAxMC4xNzVMMTYuMyA5LjEyNUwxMS4xMjUgMTQuM1YxNi40TDUuODI1IDIxLjdDNS43MjUgMjEuOCA1LjYxNjY3IDIxLjg3NSA1LjUgMjEuOTI1QzUuMzgzMzMgMjEuOTc1IDUuMjU4MzMgMjIgNS4xMjUgMjJaTTUuMTI1IDE5LjZMOS4zNzUgMTUuMzVWMTQuNjI1SDguNjVMNC40IDE4Ljg3NUw1LjEyNSAxOS42Wk01LjEyNSAxOS42TDQuNCAxOC44NzVMNC43NzUgMTkuMjI1TDUuMTI1IDE5LjZaXCIgZmlsbD1cIiMxRjVBOTVcIiAvPiA8L3N2Zz4gPGRpdiBjbGFzcz1cImZyYW1lLTEwXCI-IDxkaXYgY2xhc3M9XCJ0ZXh0LXdyYXBwZXItOVwiPlJlcGFpciBpbnN0cnVjdGlvbnM8L2Rpdj4gPC9kaXY-IDwvZGl2PiA8ZGl2IGNsYXNzPVwiZGl2LTRcIj4gPHN2ZyB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDEwIDE1XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI-IDxwYXRoIGQ9XCJNMSAxTDggOEwxIDE1XCIgc3Ryb2tlPVwiIzFGNUE5NVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPiA8L3N2Zz4gPC9kaXY-IDwvYT4gPC9kaXY-IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cImRpdi0yXCI-IDxkaXYgY2xhc3M9XCJ0eXBvZ3JhcGh5LWhlYWRpbmdcIj4gPGRpdiBjbGFzcz1cInRleHQtd3JhcHBlci00XCI-RW1pc3Npb25zIFNjb3JlY2FyZDwvZGl2PiA8L2Rpdj4gPHAgY2xhc3M9XCJ0ZXh0LXdyYXBwZXItNVwiPiBUaGUgRW1pc3Npb25zIFNjb3JlY2FyZCBnaXZlcyBhIGNsZWFyIHNuYXBzaG90IG9mIHRoZSBwcm9kdWN0J3MgZ3JlZW5ob3VzZSBnYXMgKEdIRykgZW1pc3Npb25zIHBlcmZvcm1hbmNlLCBwcm92aWRpbmcgYSBzaW5nbGUgaW5kaWNhdG9yIHRvIGFzc2VzcyBpdHMgb3ZlcmFsbCBlbnZpcm9ubWVudGFsIGltcGFjdC4gPC9wPiA8ZGl2IGNsYXNzPVwiZGl2LTdcIj4gPGRpdiBjbGFzcz1cImZyYW1lLTExXCI-IDxkaXYgY2xhc3M9XCJ0ZXh0LXdyYXBwZXItMTBcIj4ge3tjcmVkZW50aWFsU3ViamVjdC5lbWlzc2lvbnNTY29yZWNhcmQuY2FyYm9uRm9vdHByaW50fX17e2NyZWRlbnRpYWxTdWJqZWN0LmVtaXNzaW9uc1Njb3JlY2FyZC5kZWNsYXJlZFVuaXR9fSA8L2Rpdj4gPHAgY2xhc3M9XCJjby1lcVwiPiA8c3BhbiBjbGFzcz1cInNwYW5cIj5DbzJFcTwvc3Bhbj4gPC9wPiA8L2Rpdj4gPGRpdiBjbGFzcz1cImZyYW1lLTlcIj4gPGRpdiBjbGFzcz1cImRpdi0zXCI-IDxkaXYgY2xhc3M9XCJmcmFtZS05XCI-IDxkaXYgY2xhc3M9XCJkaXYtNVwiPiA8ZGl2IGNsYXNzPVwiZGF0YS10d28tY29sdW1ucy0zXCI-IDxkaXYgY2xhc3M9XCJ0ZXh0LXdyYXBwZXItMTJcIj5TY29wZSBpbmNsdWRlczwvZGl2PiA8ZGl2IGNsYXNzPVwiZGF0YS1kYXRhXCI-IDxkaXYgY2xhc3M9XCJkYXRhXCI-e3tjcmVkZW50aWFsU3ViamVjdC5lbWlzc2lvbnNTY29yZWNhcmQub3BlcmF0aW9uYWxTY29wZX19PC9kaXY-IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cImRhdGEtdHdvLWNvbHVtbnMtM1wiPiA8ZGl2IGNsYXNzPVwidGV4dC13cmFwcGVyLTEyXCI-UHJpbWFyeSBzb3VyY2VkIHJhdGlvKjwvZGl2PiA8ZGl2IGNsYXNzPVwiZGF0YS1kYXRhXCI-IDxkaXYgY2xhc3M9XCJkYXRhLTJcIj57e2NyZWRlbnRpYWxTdWJqZWN0LmVtaXNzaW9uc1Njb3JlY2FyZC5wcmltYXJ5U291cmNlZFJhdGlvfX0lIHByaW1hcnkgc291cmNlcyA8L2Rpdj4gPC9kaXY-IDwvZGl2PiA8L2Rpdj4gPHAgY2xhc3M9XCJ0ZXh0LXdyYXBwZXItOFwiPiBUaGUgUHJpbWFyeSBTb3VyY2VkIFJhdGlvIHNob3dzIHRoZSBwZXJjZW50YWdlIG9mIHNjb3BlIDMgZW1pc3Npb25zIGRhdGEgdGhhdCBpcyBkaXJlY3RseSBjb2xsZWN0ZWQgZnJvbSBhY3R1YWwgc291cmNlcywgcmF0aGVyIHRoYW4gYmVpbmcgYmFzZWQgb24gZXN0aW1hdGVzLiA8L3A-IDwvZGl2PiA8ZGl2IGNsYXNzPVwiZnJhbWUtMTJcIj4gPGRpdiBjbGFzcz1cImRhdGEtdHdvLWNvbHVtbnMtM1wiPiA8ZGl2IGNsYXNzPVwidGV4dC13cmFwcGVyLTEyXCI-UmVwb3J0aW5nIHN0YW5kYXJkPC9kaXY-IDxhIGhyZWY9XCJ7e2NyZWRlbnRpYWxTdWJqZWN0LmVtaXNzaW9uc1Njb3JlY2FyZC5yZXBvcnRpbmdTdGFuZGFyZC5pZH19XCIgY2xhc3M9XCJsaW5lXCI-IDxkaXYgY2xhc3M9XCJ0ZXh0LXdyYXBwZXItMlwiPnt7Y3JlZGVudGlhbFN1YmplY3QuZW1pc3Npb25zU2NvcmVjYXJkLnJlcG9ydGluZ1N0YW5kYXJkLm5hbWV9fTwvZGl2PiA8L2E-IDwvZGl2PiA8ZGl2IGNsYXNzPVwiZGF0YS10d28tY29sdW1ucy0zXCI-IDxkaXYgY2xhc3M9XCJ0ZXh0LXdyYXBwZXItMTJcIj5Jc3N1ZSBkYXRlPC9kaXY-IDxkaXYgY2xhc3M9XCJkYXRhLWRhdGFcIj4gPGRpdiBjbGFzcz1cImRhdGFcIj57e2NyZWRlbnRpYWxTdWJqZWN0LmVtaXNzaW9uc1Njb3JlY2FyZC5yZXBvcnRpbmdTdGFuZGFyZC5pc3N1ZURhdGV9fTwvZGl2PiA8L2Rpdj4gPC9kaXY-IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cImZyYW1lLTEzXCI-IDxkaXYgY2xhc3M9XCJ0ZXh0LXdyYXBwZXItMTNcIj4qPC9kaXY-IDwvZGl2PiA8L2Rpdj4gPC9kaXY-IDwvZGl2PiA8c2VjdGlvbiBjbGFzcz1cImRpdi0yXCI-IDxkaXYgY2xhc3M9XCJ0ZXh0LXdyYXBwZXItMTRcIj5EZWNsYXJhdGlvbnM8L2Rpdj4gPGRpdiBjbGFzcz1cImNhcmRzLWNvbmZvcm1pdGllc1wiPiB7eyNlYWNoIGNyZWRlbnRpYWxTdWJqZWN0LmNvbmZvcm1pdHlDbGFpbX19IDxkaXYgY2xhc3M9XCJjYXJkcy1jb25mb3JtaXR5XCI-IDxkaXYgY2xhc3M9XCJjYXJkcy1jb25mb3JtaXR5LWhlYWRlclwiPiA8ZGl2IGNsYXNzPVwiY2FyZHMtY29uZm9ybWl0eS1jb25mb3JtYW5jZVwiPiA8ZGl2IGNsYXNzPVwiY29uZm9ybWFuY2VcIj5Db25mb3JtYW5jZTo8L2Rpdj4gPGRpdiBjbGFzcz1cInt7I2lmIGNvbmZvcm1hbmNlfX10YWdzLVZDLWJhZGdlLWdyZWVue3tlbHNlfX10YWdzLVZDLWJhZGdlLXJlZHt7L2lmfX1cIj4gPGRpdiBjbGFzcz1cInZlcmlmaWFibGVcIj57eyNpZiBjb25mb3JtYW5jZX19WWVze3tlbHNlfX1Ob3t7L2lmfX08L2Rpdj4gPC9kaXY-IDwvZGl2PiA8ZGl2IGNsYXNzPVwiY29uZm9ybWFuY2VcIj5Bc3Nlc3NlZDoge3thc3Nlc3NtZW50RGF0ZX19PC9kaXY-IDwvZGl2PiA8ZGl2IGNsYXNzPVwiY2FyZHMtY29uZm9ybWl0eS1ib2R5XCI-IDxkaXYgY2xhc3M9XCJjYXJkcy1jb25mb3JtaXR5LXRpdGxlXCI-e3tjb25mb3JtaXR5RXZpZGVuY2UubGlua05hbWV9fTwvZGl2PiA8cCBjbGFzcz1cImNhcmRzLWNvbmZvcm1pdHktZGVzY3JpcHRpb25cIj4gPHNwYW4-e3tyZWZlcmVuY2VSZWd1bGF0aW9uLm5hbWV9fSBhZG1pbmlzdGVyZWQgaW4ge3tyZWZlcmVuY2VSZWd1bGF0aW9uLmp1cmlzZGljdGlvbkNvdW50cnl9fSBieSA8L3NwYW4-IDxhIGhyZWY9XCJ7e3JlZmVyZW5jZVJlZ3VsYXRpb24uYWRtaW5pc3RlcmVkQnkuaWR9fVwiIGNsYXNzPVwiZ3JheS1ib3R0b20tbGluZVwiPnt7cmVmZXJlbmNlUmVndWxhdGlvbi5hZG1pbmlzdGVyZWRCeS5uYW1lfX08L2E-IDwvcD4gPHAgY2xhc3M9XCJjYXJkcy1jb25mb3JtaXR5LWRlc2NyaXB0aW9uXCI-IDxzcGFuPnt7cmVmZXJlbmNlU3RhbmRhcmQubmFtZX19IGlzc3VlZCBieSA8L3NwYW4-IDxhIGhyZWY9XCJ7e3JlZmVyZW5jZVN0YW5kYXJkLmlzc3VpbmdQYXJ0eS5pZH19XCIgY2xhc3M9XCJncmF5LWJvdHRvbS1saW5lXCI-e3tyZWZlcmVuY2VTdGFuZGFyZC5pc3N1aW5nUGFydHkubmFtZX19PC9hPiA8L3A-IDwvZGl2PiA8ZGl2IGNsYXNzPVwiZGVjbGFyZWQtdmFsdWVzXCI-IHt7I2VhY2ggZGVjbGFyZWRWYWx1ZX19IDxkaXYgY2xhc3M9XCJkZWNsYXJlZC12YWx1ZVwiPiA8aDM-e3ttZXRyaWNOYW1lfX0gaXMge3ttZXRyaWNWYWx1ZS52YWx1ZX19e3ttZXRyaWNWYWx1ZS51bml0fX08L2gzPiA8cCBjbGFzcz1cImhlYWRpbmctMlwiPlNjb3JlOiB7e3Njb3JlfX0gfCBBY2N1cmFjeSB7e2FjY3VyYWN5fX08L3A-IDwvZGl2PiB7ey9lYWNofX0gPC9kaXY-IDxhIGhyZWY9XCJ7e2NvbmZvcm1pdHlFdmlkZW5jZS5saW5rVVJMfX1cIiBjbGFzcz1cImNhcmRzLXRyYWNlYWJpbGl0eS0yXCI-IDxkaXYgY2xhc3M9XCJmcmFtZS0yMVwiPiA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBhdGggZD1cIk01IDIxQzQuNDUgMjEgMy45NzkzMyAyMC44MDQzIDMuNTg4IDIwLjQxM0MzLjE5NjY3IDIwLjAyMTcgMy4wMDA2NyAxOS41NTA3IDMgMTlWNUMzIDQuNDUgMy4xOTYgMy45NzkzMyAzLjU4OCAzLjU4OEMzLjk4IDMuMTk2NjcgNC40NTA2NyAzLjAwMDY3IDUgM0gxOUMxOS41NSAzIDIwLjAyMSAzLjE5NiAyMC40MTMgMy41ODhDMjAuODA1IDMuOTggMjEuMDAwNyA0LjQ1MDY3IDIxIDVWMTlDMjEgMTkuNTUgMjAuODA0MyAyMC4wMjEgMjAuNDEzIDIwLjQxM0MyMC4wMjE3IDIwLjgwNSAxOS41NTA3IDIxLjAwMDcgMTkgMjFINVpNNSA1VjE5SDE5VjVIMTdWMTJMMTQuNSAxMC41TDEyIDEyVjVINVpcIiBmaWxsPVwiIzFGNUE5NVwiPjwvcGF0aD4gPC9zdmc-IDxkaXYgY2xhc3M9XCJjb21wYW55LW5hbWUtd3JhcHBlclwiPiA8ZGl2IGNsYXNzPVwiY29tcGFueS1uYW1lLTJcIj5FdmlkZW5jZTwvZGl2PiA8L2Rpdj4gPC9kaXY-IDxkaXYgY2xhc3M9XCJkaXYtNFwiPiA8c3ZnIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMTAgMTVcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBhdGggZD1cIk0xIDFMOCA4TDEgMTVcIiBzdHJva2U9XCIjMUY1QTk1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPiA8L3BhdGg-IDwvc3ZnPiA8L2Rpdj4gPC9hPiA8L2Rpdj4ge3svZWFjaH19IDwvZGl2PiA8L3NlY3Rpb24-IDxkaXYgY2xhc3M9XCJkaXYtMlwiPiA8ZGl2IGNsYXNzPVwidHlwb2dyYXBoeS1oZWFkaW5nXCI-IDxkaXYgY2xhc3M9XCJ0ZXh0LXdyYXBwZXItNFwiPlByb2R1Y3Rpb248L2Rpdj4gPC9kaXY-IDxkaXYgY2xhc3M9XCJkaXYtNVwiPiA8ZGl2IGNsYXNzPVwiZGF0YS10d28tY29sdW1uc1wiPiA8ZGl2IGNsYXNzPVwidGV4dC13cmFwcGVyLTEyXCI-UHJvZHVjdCBjYXRlZ29yeTwvZGl2PiA8ZGl2IGNsYXNzPVwiZGF0YS1kYXRhXCI-IDxkaXYgY2xhc3M9XCJkYXRhLTJcIj57eyNlYWNoIGNyZWRlbnRpYWxTdWJqZWN0LnByb2R1Y3RDYXRlZ29yeX19e3tuYW1lfX17eyN1bmxlc3MgQGxhc3R9fSx7ey91bmxlc3N9fSB7ey9lYWNofX08L2Rpdj4gPC9kaXY-IDwvZGl2PiA8ZGl2IGNsYXNzPVwiZGF0YS10d28tY29sdW1uc1wiPiA8ZGl2IGNsYXNzPVwidGV4dC13cmFwcGVyLTEyXCI-UHJvZHVjZWQgYnk8L2Rpdj4gPGRpdiBjbGFzcz1cImRhdGEtZGF0YS1saW5rXCI-IDxhIGhyZWY9XCJ7e2NyZWRlbnRpYWxTdWJqZWN0LnByb2R1Y2VkQnlQYXJ0eS5pZH19XCIgY2xhc3M9XCJsaW5lXCI-IDxwIGNsYXNzPVwidGV4dC13cmFwcGVyLTJcIj57e2NyZWRlbnRpYWxTdWJqZWN0LnByb2R1Y2VkQnlQYXJ0eS5uYW1lfX08L3A-IDwvYT4gPC9kaXY-IDwvZGl2PiA8ZGl2IGNsYXNzPVwiZGF0YS10d28tY29sdW1uc1wiPiA8ZGl2IGNsYXNzPVwidGV4dC13cmFwcGVyLTEyXCI-UHJvZHVjZWQgYXQ8L2Rpdj4gPGRpdiBjbGFzcz1cImRhdGEtZGF0YS1saW5rXCI-IDxhIGhyZWY9XCJ7e2NyZWRlbnRpYWxTdWJqZWN0LnByb2R1Y2VkQXRGYWNpbGl0eS5pZH19XCIgY2xhc3M9XCJsaW5lXCI-IDxwIGNsYXNzPVwidGV4dC13cmFwcGVyLTJcIj57e2NyZWRlbnRpYWxTdWJqZWN0LnByb2R1Y2VkQXRGYWNpbGl0eS5uYW1lfX08L3A-IDwvYT4gPC9kaXY-IDwvZGl2PiA8ZGl2IGNsYXNzPVwiZGF0YS10d28tY29sdW1uc1wiPiA8ZGl2IGNsYXNzPVwidGV4dC13cmFwcGVyLTEyXCI-RGF0ZSBwcm9kdWNlZDwvZGl2PiA8ZGl2IGNsYXNzPVwiZGF0YS13cmFwcGVyXCI-IDxkaXYgY2xhc3M9XCJkYXRhXCI-e3tjcmVkZW50aWFsU3ViamVjdC5wcm9kdWN0aW9uRGF0ZX19PC9kaXY-IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cImRhdGEtdHdvLWNvbHVtbnNcIj4gPGRpdiBjbGFzcz1cInRleHQtd3JhcHBlci0xMlwiPkNvdW50cnk8L2Rpdj4gPGRpdiBjbGFzcz1cImRhdGEtZGF0YVwiPiA8ZGl2IGNsYXNzPVwiZGF0YVwiPnt7Y3JlZGVudGlhbFN1YmplY3QuY291bnRyeU9mUHJvZHVjdGlvbn19PC9kaXY-IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cImRhdGEtdHdvLWNvbHVtbnNcIj4gPGRpdiBjbGFzcz1cInRleHQtd3JhcHBlci0xMlwiPkRpbWVuc2lvbnM8L2Rpdj4gPGRpdiBjbGFzcz1cImxpc3RcIj4gPHNwYW4-V2VpZ2h0OiB7e2NyZWRlbnRpYWxTdWJqZWN0LmRpbWVuc2lvbnMud2VpZ2h0LnZhbHVlfX17e2NyZWRlbnRpYWxTdWJqZWN0LmRpbWVuc2lvbnMud2VpZ2h0LnVuaXR9fTwvc3Bhbj4gPHNwYW4-TGVuZ3RoOiB7e2NyZWRlbnRpYWxTdWJqZWN0LmRpbWVuc2lvbnMubGVuZ3RoLnZhbHVlfX17e2NyZWRlbnRpYWxTdWJqZWN0LmRpbWVuc2lvbnMubGVuZ3RoLnVuaXR9fTwvc3Bhbj4gPHNwYW4-V2lkdGg6IHt7Y3JlZGVudGlhbFN1YmplY3QuZGltZW5zaW9ucy53aWR0aC52YWx1ZX19e3tjcmVkZW50aWFsU3ViamVjdC5kaW1lbnNpb25zLndpZHRoLnVuaXR9fTwvc3Bhbj4gPHNwYW4-SGVpZ2h0OiB7e2NyZWRlbnRpYWxTdWJqZWN0LmRpbWVuc2lvbnMuaGVpZ2h0LnZhbHVlfX17e2NyZWRlbnRpYWxTdWJqZWN0LmRpbWVuc2lvbnMuaGVpZ2h0LnVuaXR9fTwvc3Bhbj4gPHNwYW4-Vm9sdW1lOiB7e2NyZWRlbnRpYWxTdWJqZWN0LmRpbWVuc2lvbnMudm9sdW1lLnZhbHVlfX17e2NyZWRlbnRpYWxTdWJqZWN0LmRpbWVuc2lvbnMudm9sdW1lLnVuaXR9fTwvc3Bhbj4gPC9kaXY-IDwvZGl2PiA8L2Rpdj4gPC9kaXY-IDxkaXYgY2xhc3M9XCJkaXYtMlwiPiA8ZGl2IGNsYXNzPVwidHlwb2dyYXBoeS1oZWFkaW5nXCI-IDxkaXYgY2xhc3M9XCJ0ZXh0LXdyYXBwZXItNFwiPkNvbXBvc2l0aW9uPC9kaXY-IDwvZGl2PiA8cCBjbGFzcz1cInRleHQtd3JhcHBlci01XCI-IFRoZSBQcm9kdWN0IENvbXBvc2l0aW9uIExpc3QgZGV0YWlscyB0aGUgbWF0ZXJpYWxzIGFuZCBjb21wb25lbnRzIHVzZWQgaW4gdGhlIHByb2R1Y3QsIHByb3ZpZGluZyB0cmFuc3BhcmVuY3kgb24gdGhlIG9yaWdpbiBhbmQgbmF0dXJlIG9mIGVhY2ggZWxlbWVudC4gPC9wPiA8ZGl2IGNsYXNzPVwiY2FyZHNcIj4ge3sjZWFjaCBjcmVkZW50aWFsU3ViamVjdC5tYXRlcmlhbHNQcm92ZW5hbmNlfX0gPGRpdiBjbGFzcz1cImNhcmRzLWNvbXBvc2l0aW9uXCI-IDxkaXYgY2xhc3M9XCJmaXJzdC1jb2x1bW5cIj4gPGRpdiBjbGFzcz1cInBlcmNlbnRhZ2VcIj57e21hc3NGcmFjdGlvbn19JTwvZGl2PiA8ZGl2IGNsYXNzPVwiZGV0YWlsc1wiPiA8ZGl2IGNsYXNzPVwidGV4dC13cmFwcGVyLTlcIj57e21hc3NBbW91bnQudmFsdWV9fXt7bWFzc0Ftb3VudC51bml0fX0ge3tuYW1lfX08L2Rpdj4gPGRpdiBjbGFzcz1cImZyYW1lLTI1XCI-IDxkaXYgY2xhc3M9XCJmcmFtZS0yNlwiPiA8ZGl2IGNsYXNzPVwidGV4dC13cmFwcGVyLTE5XCI-UmVjeWNsZWQge3sjaWYgcmVjeWNsZWRBbW91bnR9fXt7cmVjeWNsZWRBbW91bnR9fXt7ZWxzZX19MHt7L2lmfX0lPC9kaXY-IDwvZGl2PiA8ZGl2IGNsYXNzPVwiZnJhbWUtMjdcIj4gPGRpdiBjbGFzcz1cInRleHQtd3JhcHBlci0xOVwiPkhhemFyZCB7eyNpZiBoYXphcmRvdXN9fVllc3t7ZWxzZX19Tm97ey9pZn19PC9kaXY-IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cImRhdGEtZGF0YS1saW5rLTJcIj4gPGEgaHJlZj1cInt7bWF0ZXJpYWxTYWZldHlJbmZvcm1hdGlvbi5saW5rVVJMfX1cIiBjbGFzcz1cImxpbmVcIj4gPGRpdiBjbGFzcz1cInRleHQtd3JhcHBlci0yXCI-e3ttYXRlcmlhbFNhZmV0eUluZm9ybWF0aW9uLmxpbmtOYW1lfX08L2Rpdj4gPC9hPiA8L2Rpdj4gPC9kaXY-IDwvZGl2PiA8ZGl2IGNsYXNzPVwiZGl2LTRcIj4gPGRpdiBjbGFzcz1cInRleHQtd3JhcHBlci0xOVwiPnt7b3JpZ2luQ291bnRyeX19PC9kaXY-IDwvZGl2PiA8L2Rpdj4ge3svZWFjaH19IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cImRpdi0yXCI-IDxkaXYgY2xhc3M9XCJ0eXBvZ3JhcGh5LWhlYWRpbmdcIj4gPGRpdiBjbGFzcz1cInRleHQtd3JhcHBlci00XCI-SGlzdG9yeTwvZGl2PiA8L2Rpdj4ge3shLS0gc3RhcnQ6IFN1cHBseSBjaGFpbiBkdWUgZGlsaWdlbmNlIHJlcG9ydCAtLX19IDxhIGhyZWY9XCJ7e2NyZWRlbnRpYWxTdWJqZWN0LmR1ZURpbGlnZW5jZURlY2xhcmF0aW9uLmxpbmtVUkx9fVwiIGNsYXNzPVwiY2FyZHMtdHJhY2VhYmlsaXR5XCI-IDxkaXYgY2xhc3M9XCJoaXN0b3J5LWR1ZS1kaWxpZ2VuY2VcIj4gPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI-IDxwYXRoIGQ9XCJNNSAyMUM0LjQ1IDIxIDMuOTc5MzMgMjAuODA0MyAzLjU4OCAyMC40MTNDMy4xOTY2NyAyMC4wMjE3IDMuMDAwNjcgMTkuNTUwNyAzIDE5VjVDMyA0LjQ1IDMuMTk2IDMuOTc5MzMgMy41ODggMy41ODhDMy45OCAzLjE5NjY3IDQuNDUwNjcgMy4wMDA2NyA1IDNIMTlDMTkuNTUgMyAyMC4wMjEgMy4xOTYgMjAuNDEzIDMuNTg4QzIwLjgwNSAzLjk4IDIxLjAwMDcgNC40NTA2NyAyMSA1VjE5QzIxIDE5LjU1IDIwLjgwNDMgMjAuMDIxIDIwLjQxMyAyMC40MTNDMjAuMDIxNyAyMC44MDUgMTkuNTUwNyAyMS4wMDA3IDE5IDIxSDVaTTUgNVYxOUgxOVY1SDE3VjEyTDE0LjUgMTAuNUwxMiAxMlY1SDVaXCIgZmlsbD1cIiMxRjVBOTVcIj48L3BhdGg-IDwvc3ZnPiA8ZGl2PlN1cHBseSBjaGFpbiBkdWUgZGlsaWdlbmNlIHJlcG9ydDwvZGl2PiA8L2Rpdj4gPHN2ZyB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDEwIDE1XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI-IDxwYXRoIGQ9XCJNMSAxTDggOEwxIDE1XCIgc3Ryb2tlPVwiIzFGNUE5NVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj4gPC9wYXRoPiA8L3N2Zz4gPC9hPiB7eyEtLSBlbmQ6IFN1cHBseSBjaGFpbiBkdWUgZGlsaWdlbmNlIHJlcG9ydCAtLX19IDxkaXYgY2xhc3M9XCJoaXN0b3J5LWluZm9ybWF0aW9uXCI-IDxkaXYgY2xhc3M9XCJoaXN0b3J5LXZhbHVlLWNoYWluLWl0ZW1cIj4gPGRpdiBjbGFzcz1cImhpc3RvcnktdmFsdWUtY2hhaW5cIj4gPHA-e3tjcmVkZW50aWFsU3ViamVjdC50cmFjZWFiaWxpdHlJbmZvcm1hdGlvbi52YWx1ZUNoYWluUHJvY2Vzc319PC9wPiA8ZGl2IGNsYXNzPVwidmVyaWZpZWQtcmF0aW9cIj4gPHA-VmVyaWZpZWQgcmF0aW8ge3tjcmVkZW50aWFsU3ViamVjdC50cmFjZWFiaWxpdHlJbmZvcm1hdGlvbi52ZXJpZmllZFJhdGlvfX08L3A-IDwvZGl2PiA8L2Rpdj4gPGRpdiBpZD1cImhpc3RvcnktaXRlbXMtMTQ0MHB4XCIgY2xhc3M9XCJoaXN0b3J5LWV2ZW50XCI-IHt7I2VhY2ggY3JlZGVudGlhbFN1YmplY3QudHJhY2VhYmlsaXR5SW5mb3JtYXRpb24udHJhY2VhYmlsaXR5RXZlbnR9fSA8ZGl2IGNsYXNzPVwiaGlzdG9yeS1pdGVtXCI-IDxzcGFuPnt7bGlua05hbWV9fTwvc3Bhbj4gPGEgaHJlZj1cInt7bGlua1VSTH19XCIgY2xhc3M9XCJibHVlLWJvdHRvbS1saW5lLXRoaWNrXCI-VmlldzwvYT4gPC9kaXY-IHt7L2VhY2h9fSA8L2Rpdj4gPC9kaXY-IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cImRpdi0yXCI-IDxkaXYgY2xhc3M9XCJ0ZXh0LXdyYXBwZXItNFwiPlBhc3Nwb3J0IGlzc3VlZCBieTwvZGl2PiA8ZGl2IGNsYXNzPVwiZGl2LTVcIj4gPGRpdiBjbGFzcz1cImRhdGEtdHdvLWNvbHVtbnNcIj4gPGRpdiBjbGFzcz1cInRleHQtd3JhcHBlci0xMlwiPk9yZ2FuaXNhdGlvbjwvZGl2PiA8ZGl2IGNsYXNzPVwiZGF0YS1kYXRhXCI-IDxkaXYgY2xhc3M9XCJkYXRhXCI-e3tpc3N1ZXIubmFtZX19PC9kaXY-IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cImRhdGEtdHdvLWNvbHVtbnNcIj4gPGRpdiBjbGFzcz1cInRleHQtd3JhcHBlci0xMlwiPlJlZ2lzdGVyZWQgSUQ8L2Rpdj4gPGRpdiBjbGFzcz1cImRhdGEtZGF0YS1saW5rXCI-IDxhIGhyZWY9XCJ7e2lzc3Vlci5pZH19XCIgY2xhc3M9XCJsaW5lXCI-IDxkaXYgY2xhc3M9XCJ0ZXh0LXdyYXBwZXItMlwiPnt7aXNzdWVyLmlkfX08L2Rpdj4gPC9hPiA8L2Rpdj4gPC9kaXY-IDxkaXYgY2xhc3M9XCJkYXRhLXR3by1jb2x1bW5zXCI-IDxkaXYgY2xhc3M9XCJ0ZXh0LXdyYXBwZXItMTJcIj5WYWxpZCBmcm9tPC9kaXY-IDxkaXYgY2xhc3M9XCJkYXRhLWRhdGFcIj4gPGRpdiBjbGFzcz1cImRhdGFcIj57e3ZhbGlkRnJvbX19PC9kaXY-IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cImRhdGEtdHdvLWNvbHVtbnNcIj4gPGRpdiBjbGFzcz1cInRleHQtd3JhcHBlci0xMlwiPlZhbGlkIHRvPC9kaXY-IDxkaXYgY2xhc3M9XCJkYXRhLWRhdGFcIj4gPGRpdiBjbGFzcz1cImRhdGFcIj57e3ZhbGlkVW50aWx9fTwvZGl2PiA8L2Rpdj4gPC9kaXY-IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cInRoaXMtZGlnaXRhbC1wcm9kdWN0LXdyYXBwZXJcIj4gPHAgY2xhc3M9XCJ0aGlzLWRpZ2l0YWwtcHJvZHVjdFwiPiA8c3BhbiBjbGFzcz1cInRleHQtd3JhcHBlci0xN1wiPlRoaXMgRGlnaXRhbCBQcm9kdWN0IFBhc3Nwb3J0IChEUFApIGlzIGEgZGlnaXRhbCByZWNvcmQgb2YgdGhlIHByb2R1Y3TigJlzIHN1c3RhaW5hYmlsaXR5IGFuZCBlbnZpcm9ubWVudGFsIHBlcmZvcm1hbmNlLCBlbnN1cmluZyB0cmFuc3BhcmVuY3kgYW5kIGFjY291bnRhYmlsaXR5IGluIGxpbmUgd2l0aCBVTlRQIHN0YW5kYXJkcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gdmlzaXQgPGEgaHJlZj1cImh0dHBzOi8vdW5jZWZhY3QuZ2l0aHViLmlvL3NwZWMtdW50cC9cIiBjbGFzcz1cImdyYXktYm90dG9tLWxpbmVcIj51bmNlZmFjdC5naXRodWIuaW8vc3BlYy11bnRwLzwvYT4uPC9zcGFuPiA8L3A-IDwvZGl2PiA8L2Rpdj4gPCEtLSBFbmQgZGVza3RvcCAtLT4gPC9kaXY-IDwvYm9keT4gPC9odG1sPiIsIkB0eXBlIjoiV2ViUmVuZGVyaW5nVGVtcGxhdGUyMDIyIn1dfQ.dG6cuccJsBiFinImpY7c6NknHalUVKK8aefiPw6dCr9shjoXqQKa1zpUm7WDuqyCbb02ZAvyTCyl7rK9HSIIBg" +} diff --git a/packages/untp-playground/public/file.svg b/packages/untp-playground/public/file.svg new file mode 100644 index 00000000..004145cd --- /dev/null +++ b/packages/untp-playground/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/untp-playground/public/globe.svg b/packages/untp-playground/public/globe.svg new file mode 100644 index 00000000..567f17b0 --- /dev/null +++ b/packages/untp-playground/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/untp-playground/public/next.svg b/packages/untp-playground/public/next.svg new file mode 100644 index 00000000..5174b28c --- /dev/null +++ b/packages/untp-playground/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/untp-playground/public/vercel.svg b/packages/untp-playground/public/vercel.svg new file mode 100644 index 00000000..77053960 --- /dev/null +++ b/packages/untp-playground/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/untp-playground/public/window.svg b/packages/untp-playground/public/window.svg new file mode 100644 index 00000000..b2b2a44f --- /dev/null +++ b/packages/untp-playground/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/untp-playground/src/app/api/schema/route.ts b/packages/untp-playground/src/app/api/schema/route.ts new file mode 100644 index 00000000..1aa7fdcc --- /dev/null +++ b/packages/untp-playground/src/app/api/schema/route.ts @@ -0,0 +1,25 @@ +import { NextResponse } from "next/server"; + +export async function GET(request: Request) { + const { searchParams } = new URL(request.url); + const url = searchParams.get("url"); + + if (!url) { + return NextResponse.json( + { error: "No schema URL provided" }, + { status: 400 } + ); + } + + try { + const response = await fetch(url); + const schema = await response.json(); + return NextResponse.json(schema); + } catch (error) { + console.log("Error fetching schema:", error); + return NextResponse.json( + { error: "Failed to fetch schema" }, + { status: 500 } + ); + } +} diff --git a/packages/untp-playground/src/app/favicon.ico b/packages/untp-playground/src/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8d64320348a7b4335e80e19e34deedb8df1fc814 GIT binary patch literal 15406 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ϣ%UY8`RWp~V-U_7 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 CLkb=M literal 0 HcmV?d00001 diff --git a/packages/untp-playground/src/app/fonts/GeistVF.woff b/packages/untp-playground/src/app/fonts/GeistVF.woff new file mode 100644 index 0000000000000000000000000000000000000000..1b62daacff96dad6584e71cd962051b82957c313 GIT binary patch literal 66268 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 >-Aun5A4Gp>4U0IQJ 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 G)cz05(PHWV literal 0 HcmV?d00001 diff --git a/packages/untp-playground/src/app/globals.css b/packages/untp-playground/src/app/globals.css new file mode 100644 index 00000000..a23ac26b --- /dev/null +++ b/packages/untp-playground/src/app/globals.css @@ -0,0 +1,72 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +body { + font-family: Arial, Helvetica, sans-serif; +} + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 0 0% 3.9%; + --card: 0 0% 100%; + --card-foreground: 0 0% 3.9%; + --popover: 0 0% 100%; + --popover-foreground: 0 0% 3.9%; + --primary: 0 0% 9%; + --primary-foreground: 0 0% 98%; + --secondary: 0 0% 96.1%; + --secondary-foreground: 0 0% 9%; + --muted: 0 0% 96.1%; + --muted-foreground: 0 0% 45.1%; + --accent: 0 0% 96.1%; + --accent-foreground: 0 0% 9%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 89.8%; + --input: 0 0% 89.8%; + --ring: 0 0% 3.9%; + --chart-1: 12 76% 61%; + --chart-2: 173 58% 39%; + --chart-3: 197 37% 24%; + --chart-4: 43 74% 66%; + --chart-5: 27 87% 67%; + --radius: 0.5rem; + } + .dark { + --background: 0 0% 3.9%; + --foreground: 0 0% 98%; + --card: 0 0% 3.9%; + --card-foreground: 0 0% 98%; + --popover: 0 0% 3.9%; + --popover-foreground: 0 0% 98%; + --primary: 0 0% 98%; + --primary-foreground: 0 0% 9%; + --secondary: 0 0% 14.9%; + --secondary-foreground: 0 0% 98%; + --muted: 0 0% 14.9%; + --muted-foreground: 0 0% 63.9%; + --accent: 0 0% 14.9%; + --accent-foreground: 0 0% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 14.9%; + --input: 0 0% 14.9%; + --ring: 0 0% 83.1%; + --chart-1: 220 70% 50%; + --chart-2: 160 60% 45%; + --chart-3: 30 80% 55%; + --chart-4: 280 65% 60%; + --chart-5: 340 75% 55%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/packages/untp-playground/src/app/layout.tsx b/packages/untp-playground/src/app/layout.tsx new file mode 100644 index 00000000..e4418f81 --- /dev/null +++ b/packages/untp-playground/src/app/layout.tsx @@ -0,0 +1,37 @@ +import type { Metadata } from "next"; +import localFont from "next/font/local"; +import { Toaster } from "sonner"; +import "./globals.css"; + +const geistSans = localFont({ + src: "./fonts/GeistVF.woff", + variable: "--font-geist-sans", + weight: "100 900", +}); +const geistMono = localFont({ + src: "./fonts/GeistMonoVF.woff", + variable: "--font-geist-mono", + weight: "100 900", +}); + +export const metadata: Metadata = { + title: "UNTP Playground", + description: "A playground for UNTP", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + + {children} + + + ); +} diff --git a/packages/untp-playground/src/app/page.tsx b/packages/untp-playground/src/app/page.tsx new file mode 100644 index 00000000..8e683911 --- /dev/null +++ b/packages/untp-playground/src/app/page.tsx @@ -0,0 +1,100 @@ +"use client"; + +import { CredentialUploader } from "@/components/CredentialUploader"; +import { DownloadCredential } from "@/components/DownloadCredential"; +import { Footer } from "@/components/Footer"; +import { Header } from "@/components/Header"; +import { TestResults } from "@/components/TestResults"; +import { + decodeEnvelopedCredential, + isEnvelopedProof, +} from "@/lib/credentialService"; +import type { Credential, CredentialType } from "@/types/credential"; +import { useState } from "react"; +import { toast } from "sonner"; + +interface StoredCredential { + original: any; + decoded: Credential; +} + +const CREDENTIAL_TYPES = [ + "DigitalProductPassport", + "DigitalConformityCredential", + "DigitalFacilityRecord", + "DigitalIdentityAnchor", + "DigitalTraceabilityEvent", +] as const; + +export default function Home() { + const [credentials, setCredentials] = useState<{ + [key in CredentialType]?: StoredCredential; + }>({}); + + const handleCredentialUpload = async (rawCredential: any) => { + try { + const normalizedCredential = + rawCredential.verifiableCredential || rawCredential; + + if (!normalizedCredential || typeof normalizedCredential !== "object") { + toast.error("Invalid credential format"); + return; + } + + const isEnveloped = isEnvelopedProof(normalizedCredential); + const decodedCredential = isEnveloped + ? decodeEnvelopedCredential(normalizedCredential) + : normalizedCredential; + + const credentialType = decodedCredential.type.find((t: string) => + CREDENTIAL_TYPES.includes(t as CredentialType) + ) as CredentialType; + + if (!credentialType) { + toast.error("Unknown credential type"); + return; + } + + setCredentials((prev) => ({ + ...prev, + [credentialType]: { + original: normalizedCredential, + decoded: decodedCredential, + }, + })); + } catch { + toast.error("Failed to process credential"); + } + }; + + return ( +
+
+
+
+
+

Your Credentials

+ +
+
+
+

Add New Credential

+
+ +
+
+
+

+ Download Test Credential +

+ +
+
+
+
+
+
+ ); +} diff --git a/packages/untp-playground/src/components/CredentialUploader.tsx b/packages/untp-playground/src/components/CredentialUploader.tsx new file mode 100644 index 00000000..d90b3046 --- /dev/null +++ b/packages/untp-playground/src/components/CredentialUploader.tsx @@ -0,0 +1,97 @@ +"use client"; + +import { Card } from "@/components/ui/card"; +import { jwtDecode } from "jwt-decode"; +import { useCallback } from "react"; +import { useDropzone } from "react-dropzone"; +import { toast } from "sonner"; + +export function CredentialUploader({ + onCredentialUpload, +}: { + onCredentialUpload: (credential: any) => void; +}) { + const onDrop = useCallback( + (acceptedFiles: File[]) => { + const validExtensions = [".json", ".jwt", ".txt"]; + + console.log("acceptedFiles", acceptedFiles); + const invalidFiles = acceptedFiles.filter( + (file) => + !validExtensions.some((ext) => file.name.toLowerCase().endsWith(ext)) + ); + + if (invalidFiles.length > 0 || acceptedFiles.length === 0) { + toast.error( + `Invalid file format. Please upload only .json, .jwt, or .txt files.` + ); + return; + } + + acceptedFiles.forEach((file) => { + const reader = new FileReader(); + reader.onload = async (e) => { + try { + const text = e.target?.result as string; + let json; + + // Only try JWT parsing if the file extension is .jwt or .txt + if (file.name.endsWith(".jwt") || file.name.endsWith(".txt")) { + try { + json = jwtDecode(text); + } catch (jwtError) { + console.log("Error decoding JWT:", jwtError); + toast.error( + "Invalid JWT format - Please provide a file containing a valid JWT token" + ); + return; + } + } else { + // For JSON files only + try { + json = JSON.parse(text); + } catch (jsonError) { + console.log("Error parsing JSON:", jsonError); + toast.error("Invalid format - File must contain valid JSON"); + return; + } + } + + onCredentialUpload(json); + } catch (error) { + console.log("Error processing credential:", error); + toast.error( + "Failed to process credential - Please ensure the file contains valid data" + ); + } + }; + reader.readAsText(file); + }); + }, + [onCredentialUpload] + ); + + const { getRootProps, getInputProps, isDragActive } = useDropzone({ + onDrop, + accept: { + "application/json": [".json"], + "text/plain": [".txt", ".jwt"], + }, + }); + + return ( + + + {isDragActive ? ( +

Drop the credentials here...

+ ) : ( +

+ Drag and drop credentials here, or click to select files +

+ )} +
+ ); +} diff --git a/packages/untp-playground/src/components/DownloadCredential.tsx b/packages/untp-playground/src/components/DownloadCredential.tsx new file mode 100644 index 00000000..bfd77f03 --- /dev/null +++ b/packages/untp-playground/src/components/DownloadCredential.tsx @@ -0,0 +1,35 @@ +"use client"; + +import { Button } from "@/components/ui/button"; +import { Download } from "lucide-react"; + +export function DownloadCredential() { + const handleDownload = async () => { + try { + const response = await fetch("/credentials/dpp.json"); + const data = await response.json(); + + // Create and download file + const blob = new Blob([JSON.stringify(data, null, 2)], { + type: "application/json", + }); + const url = window.URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = "untp-test-dpp-credential.json"; + document.body.appendChild(a); + a.click(); + window.URL.revokeObjectURL(url); + document.body.removeChild(a); + } catch (error) { + console.log("Error downloading credential:", error); + } + }; + + return ( + + ); +} diff --git a/packages/untp-playground/src/components/ErrorDialog.tsx b/packages/untp-playground/src/components/ErrorDialog.tsx new file mode 100644 index 00000000..72a79a10 --- /dev/null +++ b/packages/untp-playground/src/components/ErrorDialog.tsx @@ -0,0 +1,259 @@ +import { AlertCircle, Check, ChevronRight, Copy } from "lucide-react"; +import { useState } from "react"; + +const getReadableKeyword = (keyword: string) => { + const keywords: { [key: string]: string } = { + const: "incorrect value", + enum: "invalid option", + required: "missing field", + type: "wrong type", + format: "incorrect format", + pattern: "invalid format", + minimum: "too small", + maximum: "too large", + minLength: "too short", + maxLength: "too long", + additionalProperties: "unexpected field", + }; + return keywords[keyword] || keyword; +}; + +const getFriendlyPath = (path: string) => { + if (!path) return "root"; + return path.replace(/^\//, "").replace(/\//g, " → "); +}; + +const groupErrors = (errors: any[]) => { + const warnings = errors.filter( + (error) => error.keyword === "additionalProperties" + ); + const validationErrors = errors.filter( + (error) => error.keyword !== "additionalProperties" + ); + + const groups: { [key: string]: { path: string; errors: any[] } } = {}; + validationErrors.forEach((error) => { + const basePath = error.instancePath.replace(/\/\d+$/, ""); + if (!groups[basePath]) { + groups[basePath] = { path: basePath, errors: [] }; + } + groups[basePath].errors.push(error); + }); + + return { + issues: Object.values(groups), + warnings: warnings.map((error) => ({ + path: error.params.additionalProperty, + errors: [error], + })), + }; +}; + +export const ErrorDialog = ({ errors = [], className = "" }) => { + const [expandedError, setExpandedError] = useState(null); + const [copied, setCopied] = useState(false); + + const handleCopy = (text: string) => { + if (text) { + navigator.clipboard.writeText(text); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + } + }; + + if (!Array.isArray(errors) || errors.length === 0) { + return null; + } + + const { issues, warnings } = groupErrors(errors); + const hasIssues = issues.length > 0; + const hasWarnings = warnings.length > 0; + + return ( +
+ {hasIssues && ( + <> +
+ +

+ We Found {issues.length}{" "} + {issues.length === 1 ? "Issue" : "Issues"} +

+
+ +
+ {issues.map((group, index) => { + const mainError = group.errors[0]; + const isExpanded = expandedError === index; + const isAdditionalProp = + mainError.keyword === "additionalProperties"; + const value = + mainError.params?.allowedValue || + mainError.params?.allowedValues; + const fixExample = value ? JSON.stringify(value, null, 2) : null; + + return ( +
+ {isAdditionalProp ? ( +
+
+
+ + {`Additional property: "${mainError.params.additionalProperty}"`} + + + {getReadableKeyword(mainError.keyword)} + +
+
+
+ ) : ( + <> + + + {isExpanded && ( +
+
+ {mainError.keyword === "required" && ( +

+ Missing field:{" "} + + {mainError.params.missingProperty} + +

+ )} + {mainError.keyword === "enum" && ( +

+ Must be one of:{" "} + + {mainError.params.allowedValues.join(", ")} + +

+ )} + {mainError.keyword === "type" && ( +

+ Expected type:{" "} + + {mainError.params.type} + +

+ )} +
+ + {fixExample && ( +
+
+                                
+                                  {fixExample}
+                                
+                              
+ +
+ )} + +
+ Tip:{" "} + {mainError.keyword === "const" + ? "This value must match exactly as shown above." + : mainError.keyword === "enum" + ? "Choose one of the values shown above." + : mainError.keyword === "required" + ? `Add the missing "${mainError.params.missingProperty}" field.` + : mainError.keyword === "type" + ? `Change the value to match the expected type: ${mainError.params.type}.` + : "Make sure your input matches the required format."} +
+
+ )} + + )} +
+ ); + })} +
+ + )} + + {hasWarnings && ( + <> +
+ +

+ {warnings.length} {warnings.length === 1 ? "Warning" : "Warnings"} +

+
+ +
+ {warnings.map((warning, index) => ( +
+
+
+
+ + {`Additional property: "${warning.path}"`} + + + {getReadableKeyword(warning.errors[0].keyword)} + +
+
+
+
+ ))} +
+ + )} +
+ ); +}; diff --git a/packages/untp-playground/src/components/Footer.tsx b/packages/untp-playground/src/components/Footer.tsx new file mode 100644 index 00000000..b0f4b881 --- /dev/null +++ b/packages/untp-playground/src/components/Footer.tsx @@ -0,0 +1,29 @@ +"use client"; + +export function Footer() { + return ( +
+ ); +} diff --git a/packages/untp-playground/src/components/Header.tsx b/packages/untp-playground/src/components/Header.tsx new file mode 100644 index 00000000..5e2f120f --- /dev/null +++ b/packages/untp-playground/src/components/Header.tsx @@ -0,0 +1,17 @@ +"use client"; + +export function Header() { + return ( +
+
+ {/* UNTP Logo */} +

UNTP Playground

+
+
+ ); +} diff --git a/packages/untp-playground/src/components/TestResults.tsx b/packages/untp-playground/src/components/TestResults.tsx new file mode 100644 index 00000000..dd4cff1f --- /dev/null +++ b/packages/untp-playground/src/components/TestResults.tsx @@ -0,0 +1,481 @@ +"use client"; + +import { Button } from "@/components/ui/button"; +import { Card } from "@/components/ui/card"; +import { + Sheet, + SheetContent, + SheetHeader, + SheetTitle, + SheetTrigger, +} from "@/components/ui/sheet"; +import { isEnvelopedProof } from "@/lib/credentialService"; +import { validateCredentialSchema } from "@/lib/schemaValidation"; +import { verifyCredential } from "@/lib/verificationService"; +import type { Credential, CredentialType, TestStep } from "@/types/credential"; +import confetti from "canvas-confetti"; +import { + AlertCircle, + Check, + ChevronDown, + ChevronRight, + Loader2, + X, +} from "lucide-react"; +import { useEffect, useMemo, useRef, useState } from "react"; +import { toast } from "sonner"; +import { ErrorDialog } from "./ErrorDialog"; + +// Define all possible credential types +const ALL_CREDENTIAL_TYPES: CredentialType[] = [ + "DigitalProductPassport", + "DigitalConformityCredential", + "DigitalFacilityRecord", + "DigitalIdentityAnchor", + "DigitalTraceabilityEvent", +]; + +// Add this type to help with tracking previous credentials +type CredentialCache = { + [key in CredentialType]?: { + credential: { + original: any; + decoded: Credential; + }; + validated: boolean; + confettiShown?: boolean; + }; +}; + +interface TestGroupProps { + credentialType: string; + version: string; + steps: TestStep[]; + isExpanded: boolean; + onToggle: () => void; +} + +const TestGroup = ({ + credentialType, + version, + steps, + isExpanded, + onToggle, + proofType, + hasCredential, +}: TestGroupProps & { + proofType: "enveloping" | "embedded" | "none"; + hasCredential: boolean; +}) => { + const isLoading = steps.some((step) => step.status === "in-progress"); + + const overallStatus = useMemo(() => { + if (!hasCredential) return "missing"; + if (version === "unknown") return "failure"; + if (isLoading || steps.some((step) => step.status === "pending")) + return "in-progress"; + return steps.every((step) => step.status === "success") + ? "success" + : "failure"; + }, [steps, isLoading, hasCredential, version]); + + return ( + +
+
+ {isExpanded ? ( + + ) : ( + + )} +

+ {credentialType} + {hasCredential && + ` (${ + version === "unknown" ? version + " version" : "v" + version + })`} +

+
+
+ {hasCredential && proofType !== "none" && ( + + {proofType} proof + + )} + +
+
+ {isExpanded && ( +
+ {steps.map((step) => ( + + ))} + {!hasCredential && ( +

+ Upload a credential to begin validation +

+ )} +
+ )} +
+ ); +}; + +const TestStepItem = ({ step }: { step: TestStep }) => { + const [isDetailsOpen, setIsDetailsOpen] = useState(false); + + const shouldShowDetails = + step.details && + ((step.details.errors && step.details.errors.length > 0) || + (step.details.additionalProperties && + Object.keys(step.details.additionalProperties).length > 0)); + + return ( +
+
+
+ + {step.name} +
+ {step.details && + step.id === "schema" && + (step.details.errors?.[0]?.message === "Failed to fetch schema" ? ( + Failed to load schema + ) : shouldShowDetails ? ( + + + + + + + Validation Details + +
+ {step.details.errors && step.details.errors.length > 0 ? ( + + ) : ( +
+

⚠️ Additional properties found in credential

+
+ )} +
+
+
+ ) : null)} +
+
+ ); +}; + +const StatusIcon = ({ + status, + size = "default", +}: { + status: TestStep["status"]; + size?: "sm" | "default"; +}) => { + const sizeClass = size === "sm" ? "h-3 w-3" : "h-4 w-4"; + + switch (status) { + case "success": + return ; + case "failure": + return ; + case "in-progress": + return ; + case "missing": + return ; + default: + return ; + } +}; + +export function TestResults({ + credentials, +}: { + credentials: { + [key in CredentialType]?: { original: any; decoded: Credential }; + }; +}) { + const [expandedGroups, setExpandedGroups] = useState([]); + const [testResults, setTestResults] = useState<{ + [key in CredentialType]?: TestStep[]; + }>({}); + const validatedCredentialsRef = useRef({}); + const previousCredentialsRef = useRef(credentials); + + const initializeTestSteps = (credential?: { + original: any; + decoded: Credential; + }) => { + if (!credential) { + return [ + { + id: "proof-type", + name: "Proof Type Detection", + status: "missing", + }, + { + id: "verification", + name: "Credential Verification", + status: "missing", + }, + { + id: "schema", + name: "Schema Validation", + status: "missing", + }, + ]; + } + + return [ + { + id: "proof-type", + name: "Proof Type Detection", + status: "success", + details: { + type: isEnvelopedProof(credential.original) + ? "enveloping" + : "embedded", + }, + }, + { + id: "verification", + name: "Credential Verification", + status: "pending", + }, + { + id: "schema", + name: "Schema Validation", + status: "pending", + }, + ]; + }; + + // First useEffect for initializing test steps + useEffect(() => { + ALL_CREDENTIAL_TYPES.forEach((type) => { + const credential = credentials[type]; + const previousCredential = previousCredentialsRef.current[type]; + + // Only initialize or update if the credential has changed + if (credential !== previousCredential) { + setTestResults((prev) => ({ + ...prev, + [type]: initializeTestSteps(credential), + })); + } + }); + + previousCredentialsRef.current = credentials; + }, [credentials]); + + // Validation useEffect + useEffect(() => { + Object.entries(credentials).forEach(([type, credential]) => { + const credentialType = type as CredentialType; + const cached = validatedCredentialsRef.current[credentialType]; + + // Skip if this credential has already been validated + if (cached?.credential.original === credential.original) { + return; + } + + const verifyAndValidate = async () => { + try { + // Set in-progress state + setTestResults((prev) => ({ + ...prev, + [type as CredentialType]: prev[type as CredentialType]?.map( + (step) => + step.id === "verification" || step.id === "schema" + ? { ...step, status: "in-progress" } + : step + ), + })); + + // Verification + const verificationResult = await verifyCredential( + credential.original + ); + setTestResults((prev) => ({ + ...prev, + [type as CredentialType]: prev[type as CredentialType]?.map( + (step) => + step.id === "verification" + ? { + ...step, + status: verificationResult.verified + ? "success" + : "failure", + details: verificationResult, + } + : step + ), + })); + + if (!verificationResult.verified) { + const errorMessage = + typeof verificationResult.error === "object" + ? verificationResult.error.message || + "The credential could not be verified" + : verificationResult.error || + "The credential could not be verified"; + + toast.error("Credential verification failed", { + description: errorMessage, + }); + } + + // Schema validation + try { + const validationResult = await validateCredentialSchema( + credential.decoded + ); + setTestResults((prev) => ({ + ...prev, + [type as CredentialType]: prev[type as CredentialType]?.map( + (step) => + step.id === "schema" + ? { + ...step, + status: validationResult.valid ? "success" : "failure", + details: validationResult, + } + : step + ), + })); + + // Store reference to validated credential + validatedCredentialsRef.current[credentialType] = { + credential: { + original: credential.original, + decoded: credential.decoded, + }, + validated: true, + }; + + if (validationResult.valid) { + if ( + !validatedCredentialsRef.current[credentialType]?.confettiShown + ) { + confetti({ + particleCount: 200, + spread: 90, + origin: { y: 0.7 }, + }); + + validatedCredentialsRef.current[credentialType] = { + ...validatedCredentialsRef.current[credentialType]!, + confettiShown: true, + }; + } + } + } catch (error) { + console.log("Schema validation error:", error); + toast.error("Failed to fetch schema. Please try again."); + + // Only update the schema validation step + setTestResults((prev) => ({ + ...prev, + [type as CredentialType]: prev[type as CredentialType]?.map( + (step) => + step.id === "schema" + ? { + ...step, + status: "failure", + details: { + errors: [ + { + keyword: "schema", + message: "Failed to fetch schema", + instancePath: "", + }, + ], + }, + } + : step + ), + })); + } + } catch (error) { + console.log("Error processing credential:", error); + } + }; + + verifyAndValidate(); + }); + }, [credentials]); + + const toggleGroup = (groupId: string) => { + setExpandedGroups((prev) => + prev.includes(groupId) + ? prev.filter((id) => id !== groupId) + : [...prev, groupId] + ); + }; + + return ( +
+ {ALL_CREDENTIAL_TYPES.map((type) => { + const credential = credentials[type]; + const steps = testResults[type] || []; + const hasCredential = !!credential; + const proofType = credential + ? isEnvelopedProof(credential.original) + ? "enveloping" + : "embedded" + : "none"; + + return ( + toggleGroup(type)} + proofType={proofType} + hasCredential={hasCredential} + /> + ); + })} +
+ ); +} + +// Helper function to extract version +function extractVersion(credential: Credential): string { + try { + if (!credential["@context"] || !Array.isArray(credential["@context"])) { + return "unknown"; + } + + const contextUrl = credential["@context"].find( + (ctx) => + typeof ctx === "string" && + (ctx.includes("vocabulary.uncefact.org") || + ctx.includes("test.uncefact.org")) + ); + + return contextUrl?.match(/\/(\d+\.\d+\.\d+)\//)?.[1] || "unknown"; + } catch { + return "unknown"; + } +} diff --git a/packages/untp-playground/src/components/ui/button.tsx b/packages/untp-playground/src/components/ui/button.tsx new file mode 100644 index 00000000..36496a28 --- /dev/null +++ b/packages/untp-playground/src/components/ui/button.tsx @@ -0,0 +1,56 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground hover:bg-destructive/90", + outline: + "border border-input bg-background hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-10 px-4 py-2", + sm: "h-9 rounded-md px-3", + lg: "h-11 rounded-md px-8", + icon: "h-10 w-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button" + return ( + + ) + } +) +Button.displayName = "Button" + +export { Button, buttonVariants } diff --git a/packages/untp-playground/src/components/ui/card.tsx b/packages/untp-playground/src/components/ui/card.tsx new file mode 100644 index 00000000..f62edea5 --- /dev/null +++ b/packages/untp-playground/src/components/ui/card.tsx @@ -0,0 +1,79 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Card = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +Card.displayName = "Card" + +const CardHeader = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardHeader.displayName = "CardHeader" + +const CardTitle = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardTitle.displayName = "CardTitle" + +const CardDescription = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardDescription.displayName = "CardDescription" + +const CardContent = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardContent.displayName = "CardContent" + +const CardFooter = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardFooter.displayName = "CardFooter" + +export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } diff --git a/packages/untp-playground/src/components/ui/select.tsx b/packages/untp-playground/src/components/ui/select.tsx new file mode 100644 index 00000000..cbe5a36b --- /dev/null +++ b/packages/untp-playground/src/components/ui/select.tsx @@ -0,0 +1,160 @@ +"use client" + +import * as React from "react" +import * as SelectPrimitive from "@radix-ui/react-select" +import { Check, ChevronDown, ChevronUp } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Select = SelectPrimitive.Root + +const SelectGroup = SelectPrimitive.Group + +const SelectValue = SelectPrimitive.Value + +const SelectTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + span]:line-clamp-1", + className + )} + {...props} + > + {children} + + + + +)) +SelectTrigger.displayName = SelectPrimitive.Trigger.displayName + +const SelectScrollUpButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)) +SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName + +const SelectScrollDownButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)) +SelectScrollDownButton.displayName = + SelectPrimitive.ScrollDownButton.displayName + +const SelectContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, position = "popper", ...props }, ref) => ( + + + + + {children} + + + + +)) +SelectContent.displayName = SelectPrimitive.Content.displayName + +const SelectLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SelectLabel.displayName = SelectPrimitive.Label.displayName + +const SelectItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + + {children} + +)) +SelectItem.displayName = SelectPrimitive.Item.displayName + +const SelectSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SelectSeparator.displayName = SelectPrimitive.Separator.displayName + +export { + Select, + SelectGroup, + SelectValue, + SelectTrigger, + SelectContent, + SelectLabel, + SelectItem, + SelectSeparator, + SelectScrollUpButton, + SelectScrollDownButton, +} diff --git a/packages/untp-playground/src/components/ui/sheet.tsx b/packages/untp-playground/src/components/ui/sheet.tsx new file mode 100644 index 00000000..a37f17ba --- /dev/null +++ b/packages/untp-playground/src/components/ui/sheet.tsx @@ -0,0 +1,140 @@ +"use client" + +import * as React from "react" +import * as SheetPrimitive from "@radix-ui/react-dialog" +import { cva, type VariantProps } from "class-variance-authority" +import { X } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Sheet = SheetPrimitive.Root + +const SheetTrigger = SheetPrimitive.Trigger + +const SheetClose = SheetPrimitive.Close + +const SheetPortal = SheetPrimitive.Portal + +const SheetOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SheetOverlay.displayName = SheetPrimitive.Overlay.displayName + +const sheetVariants = cva( + "fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500", + { + variants: { + side: { + top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top", + bottom: + "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom", + left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm", + right: + "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm", + }, + }, + defaultVariants: { + side: "right", + }, + } +) + +interface SheetContentProps + extends React.ComponentPropsWithoutRef, + VariantProps {} + +const SheetContent = React.forwardRef< + React.ElementRef, + SheetContentProps +>(({ side = "right", className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)) +SheetContent.displayName = SheetPrimitive.Content.displayName + +const SheetHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +SheetHeader.displayName = "SheetHeader" + +const SheetFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +SheetFooter.displayName = "SheetFooter" + +const SheetTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SheetTitle.displayName = SheetPrimitive.Title.displayName + +const SheetDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SheetDescription.displayName = SheetPrimitive.Description.displayName + +export { + Sheet, + SheetPortal, + SheetOverlay, + SheetTrigger, + SheetClose, + SheetContent, + SheetHeader, + SheetFooter, + SheetTitle, + SheetDescription, +} diff --git a/packages/untp-playground/src/lib/credentialService.ts b/packages/untp-playground/src/lib/credentialService.ts new file mode 100644 index 00000000..6273dda2 --- /dev/null +++ b/packages/untp-playground/src/lib/credentialService.ts @@ -0,0 +1,49 @@ +import type { Credential } from "@/types/credential"; +import { jwtDecode } from "jwt-decode"; + +export function decodeEnvelopedCredential(credential: any): Credential { + if (!isEnvelopedProof(credential)) { + return credential; + } + + try { + const jwtPart = credential.id.split(",")[1]; + if (!jwtPart) { + return credential; + } + + return jwtDecode(jwtPart); + } catch (error) { + console.log("Error processing enveloped credential:", error); + return credential; + } +} + +export function detectCredentialType(credential: Credential): string { + const types = [ + "DigitalProductPassport", + "DigitalConformityCredential", + "DigitalFacilityRecord", + "DigitalIdentityAnchor", + "DigitalTraceabilityEvent", + ]; + + return credential.type.find((t) => types.includes(t)) || "Unknown"; +} + +export function detectVersion(credential: Credential): string { + const contextUrl = credential["@context"].find((ctx) => + ctx.includes("vocabulary.uncefact.org") + ); + + if (!contextUrl) return "unknown"; + + const versionMatch = contextUrl.match(/\/(\d+\.\d+\.\d+)\//); + return versionMatch ? versionMatch[1] : "unknown"; +} + +export function isEnvelopedProof(credential: any): boolean { + const normalizedCredential = credential.verifiableCredential || credential; + + return normalizedCredential.type === "EnvelopedVerifiableCredential"; +} diff --git a/packages/untp-playground/src/lib/formatValidationErrors.ts b/packages/untp-playground/src/lib/formatValidationErrors.ts new file mode 100644 index 00000000..b149b514 --- /dev/null +++ b/packages/untp-playground/src/lib/formatValidationErrors.ts @@ -0,0 +1,49 @@ +interface ValidationError { + keyword: string; + instancePath: string; + message?: string; + params: any; +} + +export function formatValidationError(error: ValidationError): string { + const path = error.instancePath + .split("/") + .filter(Boolean) + .map((segment) => segment.replace("@", "")) + .join(" → "); + + switch (error.keyword) { + case "required": + if (!error.instancePath) { + return `Missing required field: ${error.params.missingProperty}`; + } + return `Missing required field: ${path} → ${error.params.missingProperty}`; + case "const": + const allowedValues = Array.isArray(error.params.allowedValue) + ? error.params.allowedValue.join(" or ") + : error.params.allowedValue; + return `Invalid value for ${ + path || "field" + }: must be one of [${allowedValues}]`; + case "enum": + return `Invalid value for ${ + path || "field" + }: must be one of [${error.params.allowedValues.join(", ")}]`; + case "type": + return `Invalid type for ${path || "field"}: expected ${ + error.params.type + }`; + case "format": + return `Invalid format for ${path || "field"}: must be a valid ${ + error.params.format + }`; + case "pattern": + return `Invalid format for ${path || "field"}: must match pattern ${ + error.params.pattern + }`; + case "additionalProperties": + return `Unknown field: ${error.params.additionalProperty}`; + default: + return error.message || "Unknown validation error"; + } +} diff --git a/packages/untp-playground/src/lib/schemaValidation.ts b/packages/untp-playground/src/lib/schemaValidation.ts new file mode 100644 index 00000000..09523554 --- /dev/null +++ b/packages/untp-playground/src/lib/schemaValidation.ts @@ -0,0 +1,64 @@ +import addFormats from 'ajv-formats'; +import Ajv2020 from 'ajv/dist/2020'; + +const ajv = new Ajv2020({ + allErrors: true, + strict: false, + validateFormats: false, +}); +addFormats(ajv); + +const schemaCache = new Map(); + +const SCHEMA_URLS = { + DigitalProductPassport: 'https://test.uncefact.org/vocabulary/untp/dpp/untp-dpp-schema-0.5.0.json', + DigitalConformityCredential: 'https://test.uncefact.org/vocabulary/untp/dcc/untp-dcc-schema-0.5.0.json', + DigitalTraceabilityEvent: 'https://test.uncefact.org/vocabulary/untp/dte/untp-dte-schema-0.5.0.json', + DigitalFacilityRecord: 'https://test.uncefact.org/vocabulary/untp/dfr/untp-dfr-schema-0.5.0.json', + DigitalIdentityAnchor: 'https://test.uncefact.org/vocabulary/untp/dia/untp-dia-schema-0.2.1.json', +}; + +export async function validateCredentialSchema(credential: any): Promise<{ + valid: boolean; + errors?: any[]; +}> { + try { + const credentialType = credential.type.find((t: string) => Object.keys(SCHEMA_URLS).includes(t)); + + if (!credentialType) { + throw new Error('Unsupported credential type'); + } + + const schemaUrl = SCHEMA_URLS[credentialType as keyof typeof SCHEMA_URLS]; + + if (!schemaCache.has(schemaUrl)) { + const proxyUrl = `/untp-playground/api/schema?url=${encodeURIComponent(schemaUrl)}`; + const schemaResponse = await fetch(proxyUrl); + + if (!schemaResponse.ok) { + throw new Error(`Failed to fetch schema: ${schemaResponse.statusText}`); + } + + const schema = await schemaResponse.json(); + schemaCache.set(schemaUrl, schema); + } + + const schema = schemaCache.get(schemaUrl); + const validate = ajv.compile(schema); + const isValid = validate(credential); + const errors = validate.errors || []; + + console.log('errors', errors); + + // Check if all errors are additionalProperties + const onlyAdditionalPropertiesErrors = errors.every((error) => error.keyword === 'additionalProperties'); + + return { + valid: isValid || onlyAdditionalPropertiesErrors, + errors: errors, + }; + } catch (error) { + console.log('Schema validation error:', error); + throw error; + } +} diff --git a/packages/untp-playground/src/lib/utils.ts b/packages/untp-playground/src/lib/utils.ts new file mode 100644 index 00000000..bd0c391d --- /dev/null +++ b/packages/untp-playground/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/packages/untp-playground/src/lib/verificationService.ts b/packages/untp-playground/src/lib/verificationService.ts new file mode 100644 index 00000000..a26614dc --- /dev/null +++ b/packages/untp-playground/src/lib/verificationService.ts @@ -0,0 +1,30 @@ +const API_URL = 'https://vckit.untp.showthething.com/agent/routeVerificationCredential'; +const API_TOKEN = 'test123'; + +export async function verifyCredential(credential: any) { + try { + const response = await fetch(API_URL, { + method: 'POST', + headers: { + Authorization: `Bearer ${API_TOKEN}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + credential, + fetchRemoteContexts: true, + policies: { + credentialStatus: false, + }, + }), + }); + + if (!response.ok) { + throw new Error('Verification failed'); + } + + return await response.json(); + } catch (error) { + console.log('Verification error:', error); + throw error; + } +} diff --git a/packages/untp-playground/src/types/credential.ts b/packages/untp-playground/src/types/credential.ts new file mode 100644 index 00000000..e8079f0f --- /dev/null +++ b/packages/untp-playground/src/types/credential.ts @@ -0,0 +1,28 @@ +type CredentialType = + | 'DigitalProductPassport' + | 'DigitalConformityCredential' + | 'DigitalFacilityRecord' + | 'DigitalIdentityAnchor' + | 'DigitalTraceabilityEvent'; + +interface VerificationResult { + success: boolean; + message: string; + details?: any; +} + +interface Credential { + '@context': string[]; + type: string[]; + id?: string; + [key: string]: any; +} + +interface TestStep { + id: string; + name: string; + status: 'pending' | 'in-progress' | 'success' | 'failure' | 'missing'; + details?: any; +} + +export type { Credential, CredentialType, TestStep, VerificationResult }; diff --git a/packages/untp-playground/tailwind.config.ts b/packages/untp-playground/tailwind.config.ts new file mode 100644 index 00000000..266c06d6 --- /dev/null +++ b/packages/untp-playground/tailwind.config.ts @@ -0,0 +1,62 @@ +import type { Config } from "tailwindcss"; + +export default { + darkMode: ["class"], + content: [ + "./src/pages/**/*.{js,ts,jsx,tsx,mdx}", + "./src/components/**/*.{js,ts,jsx,tsx,mdx}", + "./src/app/**/*.{js,ts,jsx,tsx,mdx}", + ], + theme: { + extend: { + colors: { + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))' + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))' + }, + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))' + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))' + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))' + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))' + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))' + }, + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + chart: { + '1': 'hsl(var(--chart-1))', + '2': 'hsl(var(--chart-2))', + '3': 'hsl(var(--chart-3))', + '4': 'hsl(var(--chart-4))', + '5': 'hsl(var(--chart-5))' + } + }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)' + } + } + }, + plugins: [require("tailwindcss-animate")], +} satisfies Config; diff --git a/packages/untp-playground/tsconfig.json b/packages/untp-playground/tsconfig.json new file mode 100644 index 00000000..bb95472c --- /dev/null +++ b/packages/untp-playground/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules", ".next", "infra"] +} diff --git a/packages/untp-playground/yarn.lock b/packages/untp-playground/yarn.lock new file mode 100644 index 00000000..793120cd --- /dev/null +++ b/packages/untp-playground/yarn.lock @@ -0,0 +1,3294 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + +"@emnapi/runtime@^1.2.0": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.3.1.tgz#0fcaa575afc31f455fd33534c19381cfce6c6f60" + integrity sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw== + dependencies: + tslib "^2.4.0" + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56" + integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== + +"@floating-ui/core@^1.6.0": + version "1.6.8" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.8.tgz#aa43561be075815879305965020f492cdb43da12" + integrity sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA== + dependencies: + "@floating-ui/utils" "^0.2.8" + +"@floating-ui/dom@^1.0.0": + version "1.6.12" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.12.tgz#6333dcb5a8ead3b2bf82f33d6bc410e95f54e556" + integrity sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w== + dependencies: + "@floating-ui/core" "^1.6.0" + "@floating-ui/utils" "^0.2.8" + +"@floating-ui/react-dom@^2.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.2.tgz#a1349bbf6a0e5cb5ded55d023766f20a4d439a31" + integrity sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A== + dependencies: + "@floating-ui/dom" "^1.0.0" + +"@floating-ui/utils@^0.2.8": + version "0.2.8" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.8.tgz#21a907684723bbbaa5f0974cf7730bd797eb8e62" + integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig== + +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== + dependencies: + "@humanwhocodes/object-schema" "^2.0.3" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== + +"@img/sharp-darwin-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz#ef5b5a07862805f1e8145a377c8ba6e98813ca08" + integrity sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ== + optionalDependencies: + "@img/sharp-libvips-darwin-arm64" "1.0.4" + +"@img/sharp-darwin-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz#e03d3451cd9e664faa72948cc70a403ea4063d61" + integrity sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q== + optionalDependencies: + "@img/sharp-libvips-darwin-x64" "1.0.4" + +"@img/sharp-libvips-darwin-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz#447c5026700c01a993c7804eb8af5f6e9868c07f" + integrity sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg== + +"@img/sharp-libvips-darwin-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz#e0456f8f7c623f9dbfbdc77383caa72281d86062" + integrity sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ== + +"@img/sharp-libvips-linux-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz#979b1c66c9a91f7ff2893556ef267f90ebe51704" + integrity sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA== + +"@img/sharp-libvips-linux-arm@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz#99f922d4e15216ec205dcb6891b721bfd2884197" + integrity sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g== + +"@img/sharp-libvips-linux-s390x@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz#f8a5eb1f374a082f72b3f45e2fb25b8118a8a5ce" + integrity sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA== + +"@img/sharp-libvips-linux-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz#d4c4619cdd157774906e15770ee119931c7ef5e0" + integrity sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw== + +"@img/sharp-libvips-linuxmusl-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz#166778da0f48dd2bded1fa3033cee6b588f0d5d5" + integrity sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA== + +"@img/sharp-libvips-linuxmusl-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz#93794e4d7720b077fcad3e02982f2f1c246751ff" + integrity sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw== + +"@img/sharp-linux-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz#edb0697e7a8279c9fc829a60fc35644c4839bb22" + integrity sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA== + optionalDependencies: + "@img/sharp-libvips-linux-arm64" "1.0.4" + +"@img/sharp-linux-arm@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz#422c1a352e7b5832842577dc51602bcd5b6f5eff" + integrity sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ== + optionalDependencies: + "@img/sharp-libvips-linux-arm" "1.0.5" + +"@img/sharp-linux-s390x@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz#f5c077926b48e97e4a04d004dfaf175972059667" + integrity sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q== + optionalDependencies: + "@img/sharp-libvips-linux-s390x" "1.0.4" + +"@img/sharp-linux-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz#d806e0afd71ae6775cc87f0da8f2d03a7c2209cb" + integrity sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA== + optionalDependencies: + "@img/sharp-libvips-linux-x64" "1.0.4" + +"@img/sharp-linuxmusl-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz#252975b915894fb315af5deea174651e208d3d6b" + integrity sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" + +"@img/sharp-linuxmusl-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz#3f4609ac5d8ef8ec7dadee80b560961a60fd4f48" + integrity sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-x64" "1.0.4" + +"@img/sharp-wasm32@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz#6f44f3283069d935bb5ca5813153572f3e6f61a1" + integrity sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg== + dependencies: + "@emnapi/runtime" "^1.2.0" + +"@img/sharp-win32-ia32@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz#1a0c839a40c5351e9885628c85f2e5dfd02b52a9" + integrity sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ== + +"@img/sharp-win32-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz#56f00962ff0c4e0eb93d34a047d29fa995e3e342" + integrity sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@^0.3.24": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@next/env@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/env/-/env-15.0.3.tgz#a2e9bf274743c52b74d30f415f3eba750d51313a" + integrity sha512-t9Xy32pjNOvVn2AS+Utt6VmyrshbpfUMhIjFO60gI58deSo/KgLOp31XZ4O+kY/Is8WAGYwA5gR7kOb1eORDBA== + +"@next/eslint-plugin-next@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-15.0.3.tgz#ce953098036d462f6901e423cc6445fc165b78c4" + integrity sha512-3Ln/nHq2V+v8uIaxCR6YfYo7ceRgZNXfTd3yW1ukTaFbO+/I8jNakrjYWODvG9BuR2v5kgVtH/C8r0i11quOgw== + dependencies: + fast-glob "3.3.1" + +"@next/swc-darwin-arm64@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.0.3.tgz#4c40c506cf3d4d87da0204f4cccf39e6bdc46a71" + integrity sha512-s3Q/NOorCsLYdCKvQlWU+a+GeAd3C8Rb3L1YnetsgwXzhc3UTWrtQpB/3eCjFOdGUj5QmXfRak12uocd1ZiiQw== + +"@next/swc-darwin-x64@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-15.0.3.tgz#8e06cacae3dae279744f9fbe88dea679ec2c1ca3" + integrity sha512-Zxl/TwyXVZPCFSf0u2BNj5sE0F2uR6iSKxWpq4Wlk/Sv9Ob6YCKByQTkV2y6BCic+fkabp9190hyrDdPA/dNrw== + +"@next/swc-linux-arm64-gnu@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.0.3.tgz#c144ad1f21091b9c6e1e330ecc2d56188763191d" + integrity sha512-T5+gg2EwpsY3OoaLxUIofmMb7ohAUlcNZW0fPQ6YAutaWJaxt1Z1h+8zdl4FRIOr5ABAAhXtBcpkZNwUcKI2fw== + +"@next/swc-linux-arm64-musl@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.0.3.tgz#3ccb71c6703bf421332f177d1bb0e10528bc73a2" + integrity sha512-WkAk6R60mwDjH4lG/JBpb2xHl2/0Vj0ZRu1TIzWuOYfQ9tt9NFsIinI1Epma77JVgy81F32X/AeD+B2cBu/YQA== + +"@next/swc-linux-x64-gnu@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.0.3.tgz#b90aa9b07001b4000427c35ab347a9273cbeebb3" + integrity sha512-gWL/Cta1aPVqIGgDb6nxkqy06DkwJ9gAnKORdHWX1QBbSZZB+biFYPFti8aKIQL7otCE1pjyPaXpFzGeG2OS2w== + +"@next/swc-linux-x64-musl@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.0.3.tgz#0ac9724fb44718fc97bfea971ac3fe17e486590e" + integrity sha512-QQEMwFd8r7C0GxQS62Zcdy6GKx999I/rTO2ubdXEe+MlZk9ZiinsrjwoiBL5/57tfyjikgh6GOU2WRQVUej3UA== + +"@next/swc-win32-arm64-msvc@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.0.3.tgz#932437d4cf27814e963ba8ae5f033b4421fab9ca" + integrity sha512-9TEp47AAd/ms9fPNgtgnT7F3M1Hf7koIYYWCMQ9neOwjbVWJsHZxrFbI3iEDJ8rf1TDGpmHbKxXf2IFpAvheIQ== + +"@next/swc-win32-x64-msvc@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.0.3.tgz#940a6f7b370cdde0cc67eabe945d9e6d97e0be9f" + integrity sha512-VNAz+HN4OGgvZs6MOoVfnn41kBzT+M+tB+OK4cww6DNyWS6wKaDpaAm/qLeOUbnMh0oVx1+mg0uoYARF69dJyA== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@nolyfill/is-core-module@1.0.39": + version "1.0.39" + resolved "https://registry.yarnpkg.com/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz#3dc35ba0f1e66b403c00b39344f870298ebb1c8e" + integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA== + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@radix-ui/number@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/number/-/number-1.1.0.tgz#1e95610461a09cdf8bb05c152e76ca1278d5da46" + integrity sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ== + +"@radix-ui/primitive@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.1.0.tgz#42ef83b3b56dccad5d703ae8c42919a68798bbe2" + integrity sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA== + +"@radix-ui/react-arrow@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz#744f388182d360b86285217e43b6c63633f39e7a" + integrity sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw== + dependencies: + "@radix-ui/react-primitive" "2.0.0" + +"@radix-ui/react-collection@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-1.1.0.tgz#f18af78e46454a2360d103c2251773028b7724ed" + integrity sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-slot" "1.1.0" + +"@radix-ui/react-compose-refs@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz#656432461fc8283d7b591dcf0d79152fae9ecc74" + integrity sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw== + +"@radix-ui/react-context@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.1.0.tgz#6df8d983546cfd1999c8512f3a8ad85a6e7fcee8" + integrity sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A== + +"@radix-ui/react-context@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.1.1.tgz#82074aa83a472353bb22e86f11bcbd1c61c4c71a" + integrity sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q== + +"@radix-ui/react-dialog@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dialog/-/react-dialog-1.1.2.tgz#d9345575211d6f2d13e209e84aec9a8584b54d6c" + integrity sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-dismissable-layer" "1.1.1" + "@radix-ui/react-focus-guards" "1.1.1" + "@radix-ui/react-focus-scope" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-portal" "1.1.2" + "@radix-ui/react-presence" "1.1.1" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + aria-hidden "^1.1.1" + react-remove-scroll "2.6.0" + +"@radix-ui/react-direction@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-direction/-/react-direction-1.1.0.tgz#a7d39855f4d077adc2a1922f9c353c5977a09cdc" + integrity sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg== + +"@radix-ui/react-dismissable-layer@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.1.tgz#cbdcb739c5403382bdde5f9243042ba643883396" + integrity sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-escape-keydown" "1.1.0" + +"@radix-ui/react-focus-guards@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz#8635edd346304f8b42cae86b05912b61aef27afe" + integrity sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg== + +"@radix-ui/react-focus-scope@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz#ebe2891a298e0a33ad34daab2aad8dea31caf0b2" + integrity sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + +"@radix-ui/react-id@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-1.1.0.tgz#de47339656594ad722eb87f94a6b25f9cffae0ed" + integrity sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA== + dependencies: + "@radix-ui/react-use-layout-effect" "1.1.0" + +"@radix-ui/react-popper@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.2.0.tgz#a3e500193d144fe2d8f5d5e60e393d64111f2a7a" + integrity sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg== + dependencies: + "@floating-ui/react-dom" "^2.0.0" + "@radix-ui/react-arrow" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-use-rect" "1.1.0" + "@radix-ui/react-use-size" "1.1.0" + "@radix-ui/rect" "1.1.0" + +"@radix-ui/react-portal@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.1.2.tgz#51eb46dae7505074b306ebcb985bf65cc547d74e" + integrity sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg== + dependencies: + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + +"@radix-ui/react-presence@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.1.1.tgz#98aba423dba5e0c687a782c0669dcd99de17f9b1" + integrity sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + +"@radix-ui/react-primitive@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz#fe05715faa9203a223ccc0be15dc44b9f9822884" + integrity sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw== + dependencies: + "@radix-ui/react-slot" "1.1.0" + +"@radix-ui/react-select@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-select/-/react-select-2.1.2.tgz#2346e118966db793940f6a866fd4cc5db2cc275e" + integrity sha512-rZJtWmorC7dFRi0owDmoijm6nSJH1tVw64QGiNIZ9PNLyBDtG+iAq+XGsya052At4BfarzY/Dhv9wrrUr6IMZA== + dependencies: + "@radix-ui/number" "1.1.0" + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-collection" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-direction" "1.1.0" + "@radix-ui/react-dismissable-layer" "1.1.1" + "@radix-ui/react-focus-guards" "1.1.1" + "@radix-ui/react-focus-scope" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-popper" "1.2.0" + "@radix-ui/react-portal" "1.1.2" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-use-previous" "1.1.0" + "@radix-ui/react-visually-hidden" "1.1.0" + aria-hidden "^1.1.1" + react-remove-scroll "2.6.0" + +"@radix-ui/react-slot@1.1.0", "@radix-ui/react-slot@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.1.0.tgz#7c5e48c36ef5496d97b08f1357bb26ed7c714b84" + integrity sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + +"@radix-ui/react-use-callback-ref@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz#bce938ca413675bc937944b0d01ef6f4a6dc5bf1" + integrity sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw== + +"@radix-ui/react-use-controllable-state@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz#1321446857bb786917df54c0d4d084877aab04b0" + integrity sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw== + dependencies: + "@radix-ui/react-use-callback-ref" "1.1.0" + +"@radix-ui/react-use-escape-keydown@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz#31a5b87c3b726504b74e05dac1edce7437b98754" + integrity sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw== + dependencies: + "@radix-ui/react-use-callback-ref" "1.1.0" + +"@radix-ui/react-use-layout-effect@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz#3c2c8ce04827b26a39e442ff4888d9212268bd27" + integrity sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w== + +"@radix-ui/react-use-previous@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz#d4dd37b05520f1d996a384eb469320c2ada8377c" + integrity sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og== + +"@radix-ui/react-use-rect@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz#13b25b913bd3e3987cc9b073a1a164bb1cf47b88" + integrity sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ== + dependencies: + "@radix-ui/rect" "1.1.0" + +"@radix-ui/react-use-size@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz#b4dba7fbd3882ee09e8d2a44a3eed3a7e555246b" + integrity sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw== + dependencies: + "@radix-ui/react-use-layout-effect" "1.1.0" + +"@radix-ui/react-visually-hidden@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz#ad47a8572580f7034b3807c8e6740cd41038a5a2" + integrity sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ== + dependencies: + "@radix-ui/react-primitive" "2.0.0" + +"@radix-ui/rect@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/rect/-/rect-1.1.0.tgz#f817d1d3265ac5415dadc67edab30ae196696438" + integrity sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg== + +"@rtsao/scc@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== + +"@rushstack/eslint-patch@^1.10.3": + version "1.10.4" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz#427d5549943a9c6fce808e39ea64dbe60d4047f1" + integrity sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA== + +"@swc/counter@0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== + +"@swc/helpers@0.5.13": + version "0.5.13" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.13.tgz#33e63ff3cd0cade557672bd7888a39ce7d115a8c" + integrity sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w== + dependencies: + tslib "^2.4.0" + +"@types/canvas-confetti@^1.6.4": + version "1.6.4" + resolved "https://registry.yarnpkg.com/@types/canvas-confetti/-/canvas-confetti-1.6.4.tgz#620fd8d78b335d6a4046c0f73236d6988b37552a" + integrity sha512-fNyZ/Fdw/Y92X0vv7B+BD6ysHL4xVU5dJcgzgxLdGbn8O3PezZNIJpml44lKM0nsGur+o/6+NZbZeNTt00U1uA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/node@^20": + version "20.17.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.17.6.tgz#6e4073230c180d3579e8c60141f99efdf5df0081" + integrity sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ== + dependencies: + undici-types "~6.19.2" + +"@types/prop-types@*": + version "15.7.13" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.13.tgz#2af91918ee12d9d32914feb13f5326658461b451" + integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA== + +"@types/react-dom@^18": + version "18.3.1" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.1.tgz#1e4654c08a9cdcfb6594c780ac59b55aad42fe07" + integrity sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18": + version "18.3.12" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.12.tgz#99419f182ccd69151813b7ee24b792fe08774f60" + integrity sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + +"@typescript-eslint/eslint-plugin@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": + version "8.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.15.0.tgz#c95c6521e70c8b095a684d884d96c0c1c63747d2" + integrity sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.15.0" + "@typescript-eslint/type-utils" "8.15.0" + "@typescript-eslint/utils" "8.15.0" + "@typescript-eslint/visitor-keys" "8.15.0" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/parser@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": + version "8.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.15.0.tgz#92610da2b3af702cfbc02a46e2a2daa6260a9045" + integrity sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A== + dependencies: + "@typescript-eslint/scope-manager" "8.15.0" + "@typescript-eslint/types" "8.15.0" + "@typescript-eslint/typescript-estree" "8.15.0" + "@typescript-eslint/visitor-keys" "8.15.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@8.15.0": + version "8.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.15.0.tgz#28a1a0f13038f382424f45a988961acaca38f7c6" + integrity sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA== + dependencies: + "@typescript-eslint/types" "8.15.0" + "@typescript-eslint/visitor-keys" "8.15.0" + +"@typescript-eslint/type-utils@8.15.0": + version "8.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.15.0.tgz#a6da0f93aef879a68cc66c73fe42256cb7426c72" + integrity sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw== + dependencies: + "@typescript-eslint/typescript-estree" "8.15.0" + "@typescript-eslint/utils" "8.15.0" + debug "^4.3.4" + ts-api-utils "^1.3.0" + +"@typescript-eslint/types@8.15.0": + version "8.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.15.0.tgz#4958edf3d83e97f77005f794452e595aaf6430fc" + integrity sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ== + +"@typescript-eslint/typescript-estree@8.15.0": + version "8.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.15.0.tgz#915c94e387892b114a2a2cc0df2d7f19412c8ba7" + integrity sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg== + dependencies: + "@typescript-eslint/types" "8.15.0" + "@typescript-eslint/visitor-keys" "8.15.0" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/utils@8.15.0": + version "8.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.15.0.tgz#ac04679ad19252776b38b81954b8e5a65567cef6" + integrity sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "8.15.0" + "@typescript-eslint/types" "8.15.0" + "@typescript-eslint/typescript-estree" "8.15.0" + +"@typescript-eslint/visitor-keys@8.15.0": + version "8.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.15.0.tgz#9ea5a85eb25401d2aa74ec8a478af4e97899ea12" + integrity sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q== + dependencies: + "@typescript-eslint/types" "8.15.0" + eslint-visitor-keys "^4.2.0" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.9.0: + version "8.14.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== + +ajv-formats@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-3.0.1.tgz#3d5dc762bca17679c3c2ea7e90ad6b7532309578" + integrity sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ== + dependencies: + ajv "^8.0.0" + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + 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" + +ajv@^8.0.0: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-hidden@^1.1.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.4.tgz#b78e383fdbc04d05762c78b4a25a501e736c4522" + integrity sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A== + dependencies: + tslib "^2.0.0" + +aria-query@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59" + integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== + +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + +array-includes@^3.1.6, array-includes@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + is-string "^1.0.7" + +array.prototype.findlast@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.findlastindex@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + +ast-types-flow@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" + integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== + +attr-accept@^2.2.4: + version "2.2.5" + resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-2.2.5.tgz#d7061d958e6d4f97bf8665c68b75851a0713ab5e" + integrity sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ== + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +axe-core@^4.10.0: + version "4.10.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.2.tgz#85228e3e1d8b8532a27659b332e39b7fa0e022df" + integrity sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w== + +axobject-query@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.1.0.tgz#28768c76d0e3cff21bc62a9e2d0b6ac30042a1ee" + integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +busboy@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +caniuse-lite@^1.0.30001579: + version "1.0.30001683" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001683.tgz#7f026a2d5d319a9cf8915a1451173052caaadc81" + integrity sha512-iqmNnThZ0n70mNwvxpEC2nBJ037ZHZUoBI5Gorh1Mw6IlEAZujEoU1tXA628iZfzm7R9FvFzxbfdgml82a3k8Q== + +canvas-confetti@^1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/canvas-confetti/-/canvas-confetti-1.9.3.tgz#ef4c857420ad8045ab4abe8547261c8cdf229845" + integrity sha512-rFfTURMvmVEX1gyXFgn5QMn81bYk70qa0HLzcIOSVEyl57n6o9ItHeBtUSWdvKAPY0xlvBHno4/v3QPrT83q9g== + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + 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" + optionalDependencies: + fsevents "~2.3.2" + +class-variance-authority@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/class-variance-authority/-/class-variance-authority-0.7.0.tgz#1c3134d634d80271b1837452b06d821915954522" + integrity sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A== + dependencies: + clsx "2.0.0" + +client-only@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== + +clsx@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" + integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== + +clsx@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== + dependencies: + color-convert "^2.0.1" + color-string "^1.9.0" + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +cross-spawn@^7.0.0, cross-spawn@^7.0.2: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +csstype@^3.0.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +detect-libc@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== + +detect-node-es@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" + integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +enhanced-resolve@^5.15.0: + version "5.17.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" + integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: + version "1.23.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.5.tgz#f4599a4946d57ed467515ed10e4f157289cd52fb" + integrity sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.3" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.3" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-iterator-helpers@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz#2f1a3ab998b30cb2d10b195b587c6d9ebdebf152" + integrity sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + globalthis "^1.0.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + iterator.prototype "^1.1.3" + safe-array-concat "^1.1.2" + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-next@15.0.3: + version "15.0.3" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-15.0.3.tgz#b483585260d5e55050d4ab87e053c88089ae12ee" + integrity sha512-IGP2DdQQrgjcr4mwFPve4DrCqo7CVVez1WoYY47XwKSrYO4hC0Dlb+iJA60i0YfICOzgNADIb8r28BpQ5Zs0wg== + dependencies: + "@next/eslint-plugin-next" "15.0.3" + "@rushstack/eslint-patch" "^1.10.3" + "@typescript-eslint/eslint-plugin" "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser" "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" + eslint-import-resolver-node "^0.3.6" + eslint-import-resolver-typescript "^3.5.2" + eslint-plugin-import "^2.31.0" + eslint-plugin-jsx-a11y "^6.10.0" + eslint-plugin-react "^7.35.0" + eslint-plugin-react-hooks "^5.0.0" + +eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-import-resolver-typescript@^3.5.2: + version "3.6.3" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz#bb8e388f6afc0f940ce5d2c5fd4a3d147f038d9e" + integrity sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA== + dependencies: + "@nolyfill/is-core-module" "1.0.39" + debug "^4.3.5" + enhanced-resolve "^5.15.0" + eslint-module-utils "^2.8.1" + fast-glob "^3.3.2" + get-tsconfig "^4.7.5" + is-bun-module "^1.0.2" + is-glob "^4.0.3" + +eslint-module-utils@^2.12.0, eslint-module-utils@^2.8.1: + version "2.12.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b" + integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.31.0: + version "2.31.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz#310ce7e720ca1d9c0bb3f69adfd1c6bdd7d9e0e7" + integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A== + dependencies: + "@rtsao/scc" "^1.1.0" + array-includes "^3.1.8" + array.prototype.findlastindex "^1.2.5" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.12.0" + hasown "^2.0.2" + is-core-module "^2.15.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.8" + object.groupby "^1.0.3" + object.values "^1.2.0" + semver "^6.3.1" + string.prototype.trimend "^1.0.8" + tsconfig-paths "^3.15.0" + +eslint-plugin-jsx-a11y@^6.10.0: + version "6.10.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz#d2812bb23bf1ab4665f1718ea442e8372e638483" + integrity sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q== + dependencies: + aria-query "^5.3.2" + array-includes "^3.1.8" + array.prototype.flatmap "^1.3.2" + ast-types-flow "^0.0.8" + axe-core "^4.10.0" + axobject-query "^4.1.0" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + hasown "^2.0.2" + jsx-ast-utils "^3.3.5" + language-tags "^1.0.9" + minimatch "^3.1.2" + object.fromentries "^2.0.8" + safe-regex-test "^1.0.3" + string.prototype.includes "^2.0.1" + +eslint-plugin-react-hooks@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0.tgz#72e2eefbac4b694f5324154619fee44f5f60f101" + integrity sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw== + +eslint-plugin-react@^7.35.0: + version "7.37.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz#cd0935987876ba2900df2f58339f6d92305acc7a" + integrity sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w== + dependencies: + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" + array.prototype.flatmap "^1.3.2" + array.prototype.tosorted "^1.1.4" + doctrine "^2.1.0" + es-iterator-helpers "^1.1.0" + estraverse "^5.3.0" + hasown "^2.0.2" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.8" + object.fromentries "^2.0.8" + object.values "^1.2.0" + prop-types "^15.8.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.11" + string.prototype.repeat "^1.0.0" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-visitor-keys@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" + integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== + +eslint@^8: + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + 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" + +fast-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + 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" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-uri@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.3.tgz#892a1c91802d5d7860de728f18608a0573142241" + integrity sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-selector@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/file-selector/-/file-selector-2.1.0.tgz#beb164ca5ce48af8a48d3e632c94750bc573581a" + integrity sha512-ZuXAqGePcSPz4JuerOY06Dzzq0hrmQ6VGoXVzGyFI1npeOfBgqGIKKpznfYWRkSLJlXutkqVC5WvGZtkFVhu9Q== + dependencies: + tslib "^2.7.0" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.9: + version "3.3.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27" + integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +foreground-child@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-nonce@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" + integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== + +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + +get-tsconfig@^4.7.5: + version "4.8.1" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.8.1.tgz#8995eb391ae6e1638d251118c7b56de7eb425471" + integrity sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg== + dependencies: + resolve-pkg-maps "^1.0.0" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^10.3.10: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + 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" + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3, globalthis@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +ignore@^5.2.0, ignore@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-bun-module@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-bun-module/-/is-bun-module-1.2.1.tgz#495e706f42e29f086fd5fe1ac3c51f106062b9fc" + integrity sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q== + dependencies: + semver "^7.6.3" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0, is-core-module@^2.15.1: + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== + dependencies: + hasown "^2.0.2" + +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +iterator.prototype@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.3.tgz#016c2abe0be3bbdb8319852884f60908ac62bf9c" + integrity sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jiti@^1.21.6: + version "1.21.6" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" + integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +jwt-decode@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-4.0.0.tgz#2270352425fd413785b2faf11f6e755c5151bd4b" + integrity sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA== + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +language-subtag-registry@^0.3.20: + version "0.3.23" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7" + integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ== + +language-tags@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" + integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== + dependencies: + language-subtag-registry "^0.3.20" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lilconfig@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lilconfig@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" + integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +loose-envify@^1.0.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + +lucide-react@^0.460.0: + version "0.460.0" + resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.460.0.tgz#5681364b6bd94d1d475944f0385239c0b1408e35" + integrity sha512-BVtq/DykVeIvRTJvRAgCsOwaGL8Un3Bxh8MbDxMhEWlZay3T4IpEKDEpwt5KZ0KJMHzgm6jrltxlT5eXOWXDHg== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4, micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +ms@^2.1.1, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nanoid@^3.3.6, nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +next@^15.0.3: + version "15.0.3" + resolved "https://registry.yarnpkg.com/next/-/next-15.0.3.tgz#804f5b772e7570ef1f088542a59860914d3288e9" + integrity sha512-ontCbCRKJUIoivAdGB34yCaOcPgYXr9AAkV/IwqFfWWTXEPUgLYkSkqBhIk9KK7gGmgjc64B+RdoeIDM13Irnw== + dependencies: + "@next/env" "15.0.3" + "@swc/counter" "0.1.3" + "@swc/helpers" "0.5.13" + busboy "1.6.0" + caniuse-lite "^1.0.30001579" + postcss "8.4.31" + styled-jsx "5.1.6" + optionalDependencies: + "@next/swc-darwin-arm64" "15.0.3" + "@next/swc-darwin-x64" "15.0.3" + "@next/swc-linux-arm64-gnu" "15.0.3" + "@next/swc-linux-arm64-musl" "15.0.3" + "@next/swc-linux-x64-gnu" "15.0.3" + "@next/swc-linux-x64-musl" "15.0.3" + "@next/swc-win32-arm64-msvc" "15.0.3" + "@next/swc-win32-x64-msvc" "15.0.3" + sharp "^0.33.5" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +object-inspect@^1.13.1, object-inspect@^1.13.3: + version "1.13.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" + integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.groupby@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + +object.values@^1.1.6, object.values@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +picocolors@^1.0.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pirates@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" + integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== + dependencies: + lilconfig "^3.0.0" + yaml "^2.3.4" + +postcss-nested@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.2.0.tgz#4c2d22ab5f20b9cb61e2c5c5915950784d068131" + integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ== + dependencies: + postcss-selector-parser "^6.1.1" + +postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" + integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@8.4.31: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@^8, postcss@^8.4.47: + version "8.4.49" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" + integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== + dependencies: + nanoid "^3.3.7" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +react-dom@19.0.0-rc-66855b96-20241106: + version "19.0.0-rc-66855b96-20241106" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0-rc-66855b96-20241106.tgz#beba73decfd1b9365a3c83673a298623b15acb0b" + integrity sha512-D25vdaytZ1wFIRiwNU98NPQ/upS2P8Co4/oNoa02PzHbh8deWdepjm5qwZM/46OdSiGv4WSWwxP55RO9obqJEQ== + dependencies: + scheduler "0.25.0-rc-66855b96-20241106" + +react-dropzone@^14.3.5: + version "14.3.5" + resolved "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-14.3.5.tgz#1a8bd312c8a353ec78ef402842ccb3589c225add" + integrity sha512-9nDUaEEpqZLOz5v5SUcFA0CjM4vq8YbqO0WRls+EYT7+DvxUdzDPKNCPLqGfj3YL9MsniCLCD4RFA6M95V6KMQ== + dependencies: + attr-accept "^2.2.4" + file-selector "^2.1.0" + prop-types "^15.8.1" + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-remove-scroll-bar@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz#3e585e9d163be84a010180b18721e851ac81a29c" + integrity sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g== + dependencies: + react-style-singleton "^2.2.1" + tslib "^2.0.0" + +react-remove-scroll@2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.6.0.tgz#fb03a0845d7768a4f1519a99fdb84983b793dc07" + integrity sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ== + dependencies: + react-remove-scroll-bar "^2.3.6" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + +react-style-singleton@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" + integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== + dependencies: + get-nonce "^1.0.0" + invariant "^2.2.4" + tslib "^2.0.0" + +react@19.0.0-rc-66855b96-20241106: + version "19.0.0-rc-66855b96-20241106" + resolved "https://registry.yarnpkg.com/react/-/react-19.0.0-rc-66855b96-20241106.tgz#f04d7283454a32bdd8e9757db4308b75b9739e56" + integrity sha512-klH7xkT71SxRCx4hb1hly5FJB21Hz0ACyxbXYAECEqssUjtJeFUAaI2U1DgJAzkGEnvEm3DkxuBchMC/9K4ipg== + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +reflect.getprototypeof@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" + integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.1" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + +regexp.prototype.flags@^1.5.2, regexp.prototype.flags@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42" + integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.2" + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + +resolve@^1.1.7, resolve@^1.22.4, resolve@^1.22.8: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" + +scheduler@0.25.0-rc-66855b96-20241106: + version "0.25.0-rc-66855b96-20241106" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0-rc-66855b96-20241106.tgz#8bbb728eca4de5a5deca1f18370fbce41aee91d1" + integrity sha512-HQXp/Mnp/MMRSXMQF7urNFla+gmtXW/Gr1KliuR0iboTit4KvZRY8KYaq5ccCTAOJiUqQh2rE2F3wgUekmgdlA== + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.6.0, semver@^7.6.3: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.1, set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +sharp@^0.33.5: + version "0.33.5" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.33.5.tgz#13e0e4130cc309d6a9497596715240b2ec0c594e" + integrity sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw== + dependencies: + color "^4.2.3" + detect-libc "^2.0.3" + semver "^7.6.3" + optionalDependencies: + "@img/sharp-darwin-arm64" "0.33.5" + "@img/sharp-darwin-x64" "0.33.5" + "@img/sharp-libvips-darwin-arm64" "1.0.4" + "@img/sharp-libvips-darwin-x64" "1.0.4" + "@img/sharp-libvips-linux-arm" "1.0.5" + "@img/sharp-libvips-linux-arm64" "1.0.4" + "@img/sharp-libvips-linux-s390x" "1.0.4" + "@img/sharp-libvips-linux-x64" "1.0.4" + "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" + "@img/sharp-libvips-linuxmusl-x64" "1.0.4" + "@img/sharp-linux-arm" "0.33.5" + "@img/sharp-linux-arm64" "0.33.5" + "@img/sharp-linux-s390x" "0.33.5" + "@img/sharp-linux-x64" "0.33.5" + "@img/sharp-linuxmusl-arm64" "0.33.5" + "@img/sharp-linuxmusl-x64" "0.33.5" + "@img/sharp-wasm32" "0.33.5" + "@img/sharp-win32-ia32" "0.33.5" + "@img/sharp-win32-x64" "0.33.5" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4, side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + +sonner@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/sonner/-/sonner-1.7.0.tgz#f59a2a70e049a179b6fbd1bb1bf2619d5ced07c0" + integrity sha512-W6dH7m5MujEPyug3lpI2l3TC3Pp1+LTgK0Efg+IHDrBbtEjyCmCHHo6yfNBOsf1tFZ6zf+jceWwB38baC8yO9g== + +source-map-js@^1.0.2, source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string.prototype.includes@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz#eceef21283640761a81dbe16d6c7171a4edf7d92" + integrity sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + +string.prototype.matchall@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" + integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + regexp.prototype.flags "^1.5.2" + set-function-name "^2.0.2" + side-channel "^1.0.6" + +string.prototype.repeat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" + integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +styled-jsx@5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.6.tgz#83b90c077e6c6a80f7f5e8781d0f311b2fe41499" + integrity sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA== + dependencies: + client-only "0.0.1" + +sucrase@^3.35.0: + version "3.35.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "^10.3.10" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tailwind-merge@^2.5.4: + version "2.5.4" + resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.5.4.tgz#4bf574e81fa061adeceba099ae4df56edcee78d1" + integrity sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q== + +tailwindcss-animate@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz#318b692c4c42676cc9e67b19b78775742388bef4" + integrity sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA== + +tailwindcss@^3.4.1: + version "3.4.15" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.15.tgz#04808bf4bf1424b105047d19e7d4bfab368044a9" + integrity sha512-r4MeXnfBmSOuKUWmXe6h2CcyfzJCEk4F0pptO5jlnYSIViUkVmsawj80N5h2lO3gwcmSb4n3PuN+e+GC1Guylw== + dependencies: + "@alloc/quick-lru" "^5.2.0" + arg "^5.0.2" + chokidar "^3.6.0" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.3.2" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.21.6" + lilconfig "^2.1.0" + micromatch "^4.0.8" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.1.1" + postcss "^8.4.47" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.2" + postcss-nested "^6.2.0" + postcss-selector-parser "^6.1.2" + resolve "^1.22.8" + sucrase "^3.35.0" + +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +ts-api-utils@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.0.tgz#709c6f2076e511a81557f3d07a0cbd566ae8195c" + integrity sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^2.0.0, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.7.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + +typescript@^5: + version "5.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" + integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +use-callback-ref@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.2.tgz#6134c7f6ff76e2be0b56c809b17a650c942b1693" + integrity sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA== + dependencies: + tslib "^2.0.0" + +use-sidecar@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2" + integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== + dependencies: + detect-node-es "^1.1.0" + tslib "^2.0.0" + +util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + 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" + +which-builtin-type@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.4.tgz#592796260602fc3514a1b5ee7fa29319b72380c3" + integrity sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w== + dependencies: + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.2" + which-typed-array "^1.1.15" + +which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.14, which-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +yaml@^2.3.4: + version "2.6.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.6.1.tgz#42f2b1ba89203f374609572d5349fb8686500773" + integrity sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/yarn.lock b/yarn.lock index 0c3dec3d..44ea8142 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1325,6 +1325,13 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== +"@emnapi/runtime@^1.2.0": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.3.1.tgz#0fcaa575afc31f455fd33534c19381cfce6c6f60" + integrity sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw== + dependencies: + tslib "^2.4.0" + "@emotion/babel-plugin@^11.12.0": version "11.12.0" resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz#7b43debb250c313101b3f885eba634f1d723fcc2" @@ -1542,14 +1549,14 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== -"@eslint-community/eslint-utils@^4.2.0": +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.1" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56" integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA== dependencies: eslint-visitor-keys "^3.4.3" -"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": version "4.12.1" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== @@ -1635,6 +1642,119 @@ resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== +"@img/sharp-darwin-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz#ef5b5a07862805f1e8145a377c8ba6e98813ca08" + integrity sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ== + optionalDependencies: + "@img/sharp-libvips-darwin-arm64" "1.0.4" + +"@img/sharp-darwin-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz#e03d3451cd9e664faa72948cc70a403ea4063d61" + integrity sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q== + optionalDependencies: + "@img/sharp-libvips-darwin-x64" "1.0.4" + +"@img/sharp-libvips-darwin-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz#447c5026700c01a993c7804eb8af5f6e9868c07f" + integrity sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg== + +"@img/sharp-libvips-darwin-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz#e0456f8f7c623f9dbfbdc77383caa72281d86062" + integrity sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ== + +"@img/sharp-libvips-linux-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz#979b1c66c9a91f7ff2893556ef267f90ebe51704" + integrity sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA== + +"@img/sharp-libvips-linux-arm@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz#99f922d4e15216ec205dcb6891b721bfd2884197" + integrity sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g== + +"@img/sharp-libvips-linux-s390x@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz#f8a5eb1f374a082f72b3f45e2fb25b8118a8a5ce" + integrity sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA== + +"@img/sharp-libvips-linux-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz#d4c4619cdd157774906e15770ee119931c7ef5e0" + integrity sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw== + +"@img/sharp-libvips-linuxmusl-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz#166778da0f48dd2bded1fa3033cee6b588f0d5d5" + integrity sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA== + +"@img/sharp-libvips-linuxmusl-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz#93794e4d7720b077fcad3e02982f2f1c246751ff" + integrity sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw== + +"@img/sharp-linux-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz#edb0697e7a8279c9fc829a60fc35644c4839bb22" + integrity sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA== + optionalDependencies: + "@img/sharp-libvips-linux-arm64" "1.0.4" + +"@img/sharp-linux-arm@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz#422c1a352e7b5832842577dc51602bcd5b6f5eff" + integrity sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ== + optionalDependencies: + "@img/sharp-libvips-linux-arm" "1.0.5" + +"@img/sharp-linux-s390x@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz#f5c077926b48e97e4a04d004dfaf175972059667" + integrity sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q== + optionalDependencies: + "@img/sharp-libvips-linux-s390x" "1.0.4" + +"@img/sharp-linux-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz#d806e0afd71ae6775cc87f0da8f2d03a7c2209cb" + integrity sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA== + optionalDependencies: + "@img/sharp-libvips-linux-x64" "1.0.4" + +"@img/sharp-linuxmusl-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz#252975b915894fb315af5deea174651e208d3d6b" + integrity sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" + +"@img/sharp-linuxmusl-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz#3f4609ac5d8ef8ec7dadee80b560961a60fd4f48" + integrity sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-x64" "1.0.4" + +"@img/sharp-wasm32@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz#6f44f3283069d935bb5ca5813153572f3e6f61a1" + integrity sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg== + dependencies: + "@emnapi/runtime" "^1.2.0" + +"@img/sharp-win32-ia32@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz#1a0c839a40c5351e9885628c85f2e5dfd02b52a9" + integrity sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ== + +"@img/sharp-win32-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz#56f00962ff0c4e0eb93d34a047d29fa995e3e342" + integrity sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg== + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -2392,6 +2512,58 @@ pump "^3.0.0" tar-fs "^2.1.1" +"@next/env@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/env/-/env-15.0.3.tgz#a2e9bf274743c52b74d30f415f3eba750d51313a" + integrity sha512-t9Xy32pjNOvVn2AS+Utt6VmyrshbpfUMhIjFO60gI58deSo/KgLOp31XZ4O+kY/Is8WAGYwA5gR7kOb1eORDBA== + +"@next/eslint-plugin-next@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-15.0.3.tgz#ce953098036d462f6901e423cc6445fc165b78c4" + integrity sha512-3Ln/nHq2V+v8uIaxCR6YfYo7ceRgZNXfTd3yW1ukTaFbO+/I8jNakrjYWODvG9BuR2v5kgVtH/C8r0i11quOgw== + dependencies: + fast-glob "3.3.1" + +"@next/swc-darwin-arm64@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.0.3.tgz#4c40c506cf3d4d87da0204f4cccf39e6bdc46a71" + integrity sha512-s3Q/NOorCsLYdCKvQlWU+a+GeAd3C8Rb3L1YnetsgwXzhc3UTWrtQpB/3eCjFOdGUj5QmXfRak12uocd1ZiiQw== + +"@next/swc-darwin-x64@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-15.0.3.tgz#8e06cacae3dae279744f9fbe88dea679ec2c1ca3" + integrity sha512-Zxl/TwyXVZPCFSf0u2BNj5sE0F2uR6iSKxWpq4Wlk/Sv9Ob6YCKByQTkV2y6BCic+fkabp9190hyrDdPA/dNrw== + +"@next/swc-linux-arm64-gnu@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.0.3.tgz#c144ad1f21091b9c6e1e330ecc2d56188763191d" + integrity sha512-T5+gg2EwpsY3OoaLxUIofmMb7ohAUlcNZW0fPQ6YAutaWJaxt1Z1h+8zdl4FRIOr5ABAAhXtBcpkZNwUcKI2fw== + +"@next/swc-linux-arm64-musl@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.0.3.tgz#3ccb71c6703bf421332f177d1bb0e10528bc73a2" + integrity sha512-WkAk6R60mwDjH4lG/JBpb2xHl2/0Vj0ZRu1TIzWuOYfQ9tt9NFsIinI1Epma77JVgy81F32X/AeD+B2cBu/YQA== + +"@next/swc-linux-x64-gnu@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.0.3.tgz#b90aa9b07001b4000427c35ab347a9273cbeebb3" + integrity sha512-gWL/Cta1aPVqIGgDb6nxkqy06DkwJ9gAnKORdHWX1QBbSZZB+biFYPFti8aKIQL7otCE1pjyPaXpFzGeG2OS2w== + +"@next/swc-linux-x64-musl@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.0.3.tgz#0ac9724fb44718fc97bfea971ac3fe17e486590e" + integrity sha512-QQEMwFd8r7C0GxQS62Zcdy6GKx999I/rTO2ubdXEe+MlZk9ZiinsrjwoiBL5/57tfyjikgh6GOU2WRQVUej3UA== + +"@next/swc-win32-arm64-msvc@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.0.3.tgz#932437d4cf27814e963ba8ae5f033b4421fab9ca" + integrity sha512-9TEp47AAd/ms9fPNgtgnT7F3M1Hf7koIYYWCMQ9neOwjbVWJsHZxrFbI3iEDJ8rf1TDGpmHbKxXf2IFpAvheIQ== + +"@next/swc-win32-x64-msvc@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.0.3.tgz#940a6f7b370cdde0cc67eabe945d9e6d97e0be9f" + integrity sha512-VNAz+HN4OGgvZs6MOoVfnn41kBzT+M+tB+OK4cww6DNyWS6wKaDpaAm/qLeOUbnMh0oVx1+mg0uoYARF69dJyA== + "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": version "5.1.1-v1" resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" @@ -2437,6 +2609,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@nolyfill/is-core-module@1.0.39": + version "1.0.39" + resolved "https://registry.yarnpkg.com/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz#3dc35ba0f1e66b403c00b39344f870298ebb1c8e" + integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA== + "@npmcli/agent@^2.0.0": version "2.2.2" resolved "https://registry.yarnpkg.com/@npmcli/agent/-/agent-2.2.2.tgz#967604918e62f620a648c7975461c9c9e74fc5d5" @@ -2803,6 +2980,11 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/number@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/number/-/number-1.1.0.tgz#1e95610461a09cdf8bb05c152e76ca1278d5da46" + integrity sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ== + "@radix-ui/primitive@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.0.1.tgz#e46f9958b35d10e9f6dc71c497305c22e3e55dbd" @@ -2823,6 +3005,13 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-primitive" "1.0.3" +"@radix-ui/react-arrow@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz#744f388182d360b86285217e43b6c63633f39e7a" + integrity sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw== + dependencies: + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-collection@1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-1.0.3.tgz#9595a66e09026187524a36c6e7e9c7d286469159" @@ -2868,6 +3057,31 @@ resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.1.0.tgz#6df8d983546cfd1999c8512f3a8ad85a6e7fcee8" integrity sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A== +"@radix-ui/react-context@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.1.1.tgz#82074aa83a472353bb22e86f11bcbd1c61c4c71a" + integrity sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q== + +"@radix-ui/react-dialog@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dialog/-/react-dialog-1.1.2.tgz#d9345575211d6f2d13e209e84aec9a8584b54d6c" + integrity sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-dismissable-layer" "1.1.1" + "@radix-ui/react-focus-guards" "1.1.1" + "@radix-ui/react-focus-scope" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-portal" "1.1.2" + "@radix-ui/react-presence" "1.1.1" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + aria-hidden "^1.1.1" + react-remove-scroll "2.6.0" + "@radix-ui/react-direction@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-direction/-/react-direction-1.0.1.tgz#9cb61bf2ccf568f3421422d182637b7f47596c9b" @@ -2892,6 +3106,17 @@ "@radix-ui/react-use-callback-ref" "1.0.1" "@radix-ui/react-use-escape-keydown" "1.0.3" +"@radix-ui/react-dismissable-layer@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.1.tgz#cbdcb739c5403382bdde5f9243042ba643883396" + integrity sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-escape-keydown" "1.1.0" + "@radix-ui/react-focus-guards@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz#1ea7e32092216b946397866199d892f71f7f98ad" @@ -2899,6 +3124,11 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/react-focus-guards@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz#8635edd346304f8b42cae86b05912b61aef27afe" + integrity sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg== + "@radix-ui/react-focus-scope@1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.3.tgz#9c2e8d4ed1189a1d419ee61edd5c1828726472f9" @@ -2909,6 +3139,15 @@ "@radix-ui/react-primitive" "1.0.3" "@radix-ui/react-use-callback-ref" "1.0.1" +"@radix-ui/react-focus-scope@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz#ebe2891a298e0a33ad34daab2aad8dea31caf0b2" + integrity sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-id@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-1.0.1.tgz#73cdc181f650e4df24f0b6a5b7aa426b912c88c0" @@ -2941,6 +3180,22 @@ "@radix-ui/react-use-size" "1.0.1" "@radix-ui/rect" "1.0.1" +"@radix-ui/react-popper@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.2.0.tgz#a3e500193d144fe2d8f5d5e60e393d64111f2a7a" + integrity sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg== + dependencies: + "@floating-ui/react-dom" "^2.0.0" + "@radix-ui/react-arrow" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-use-rect" "1.1.0" + "@radix-ui/react-use-size" "1.1.0" + "@radix-ui/rect" "1.1.0" + "@radix-ui/react-portal@1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.0.3.tgz#ffb961244c8ed1b46f039e6c215a6c4d9989bda1" @@ -2949,6 +3204,22 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-primitive" "1.0.3" +"@radix-ui/react-portal@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.1.2.tgz#51eb46dae7505074b306ebcb985bf65cc547d74e" + integrity sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg== + dependencies: + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + +"@radix-ui/react-presence@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.1.1.tgz#98aba423dba5e0c687a782c0669dcd99de17f9b1" + integrity sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-primitive@1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz#d49ea0f3f0b2fe3ab1cb5667eb03e8b843b914d0" @@ -3007,6 +3278,33 @@ aria-hidden "^1.1.1" react-remove-scroll "2.5.5" +"@radix-ui/react-select@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-select/-/react-select-2.1.2.tgz#2346e118966db793940f6a866fd4cc5db2cc275e" + integrity sha512-rZJtWmorC7dFRi0owDmoijm6nSJH1tVw64QGiNIZ9PNLyBDtG+iAq+XGsya052At4BfarzY/Dhv9wrrUr6IMZA== + dependencies: + "@radix-ui/number" "1.1.0" + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-collection" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-direction" "1.1.0" + "@radix-ui/react-dismissable-layer" "1.1.1" + "@radix-ui/react-focus-guards" "1.1.1" + "@radix-ui/react-focus-scope" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-popper" "1.2.0" + "@radix-ui/react-portal" "1.1.2" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-use-previous" "1.1.0" + "@radix-ui/react-visually-hidden" "1.1.0" + aria-hidden "^1.1.1" + react-remove-scroll "2.6.0" + "@radix-ui/react-separator@1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@radix-ui/react-separator/-/react-separator-1.1.0.tgz#ee0f4d86003b0e3ea7bc6ccab01ea0adee32663e" @@ -3022,7 +3320,7 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-compose-refs" "1.0.1" -"@radix-ui/react-slot@1.1.0": +"@radix-ui/react-slot@1.1.0", "@radix-ui/react-slot@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.1.0.tgz#7c5e48c36ef5496d97b08f1357bb26ed7c714b84" integrity sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw== @@ -3099,6 +3397,13 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-use-callback-ref" "1.0.1" +"@radix-ui/react-use-escape-keydown@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz#31a5b87c3b726504b74e05dac1edce7437b98754" + integrity sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw== + dependencies: + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-layout-effect@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz#be8c7bc809b0c8934acf6657b577daf948a75399" @@ -3118,6 +3423,11 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/react-use-previous@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz#d4dd37b05520f1d996a384eb469320c2ada8377c" + integrity sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og== + "@radix-ui/react-use-rect@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz#fde50b3bb9fd08f4a1cd204572e5943c244fcec2" @@ -3126,6 +3436,13 @@ "@babel/runtime" "^7.13.10" "@radix-ui/rect" "1.0.1" +"@radix-ui/react-use-rect@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz#13b25b913bd3e3987cc9b073a1a164bb1cf47b88" + integrity sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ== + dependencies: + "@radix-ui/rect" "1.1.0" + "@radix-ui/react-use-size@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz#1c5f5fea940a7d7ade77694bb98116fb49f870b2" @@ -3134,6 +3451,13 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-use-layout-effect" "1.0.1" +"@radix-ui/react-use-size@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz#b4dba7fbd3882ee09e8d2a44a3eed3a7e555246b" + integrity sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw== + dependencies: + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-visually-hidden@1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz#51aed9dd0fe5abcad7dee2a234ad36106a6984ac" @@ -3142,6 +3466,13 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-primitive" "1.0.3" +"@radix-ui/react-visually-hidden@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz#ad47a8572580f7034b3807c8e6740cd41038a5a2" + integrity sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ== + dependencies: + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/rect@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/rect/-/rect-1.0.1.tgz#bf8e7d947671996da2e30f4904ece343bc4a883f" @@ -3149,6 +3480,11 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/rect@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/rect/-/rect-1.1.0.tgz#f817d1d3265ac5415dadc67edab30ae196696438" + integrity sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg== + "@remix-run/router@1.14.2": version "1.14.2" resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.14.2.tgz#4d58f59908d9197ba3179310077f25c88e49ed17" @@ -3196,7 +3532,7 @@ resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== -"@rushstack/eslint-patch@^1.1.0": +"@rushstack/eslint-patch@^1.1.0", "@rushstack/eslint-patch@^1.10.3": version "1.10.4" resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz#427d5549943a9c6fce808e39ea64dbe60d4047f1" integrity sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA== @@ -4340,11 +4676,18 @@ "@swc/core-win32-ia32-msvc" "1.7.42" "@swc/core-win32-x64-msvc" "1.7.42" -"@swc/counter@^0.1.3": +"@swc/counter@0.1.3", "@swc/counter@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== +"@swc/helpers@0.5.13": + version "0.5.13" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.13.tgz#33e63ff3cd0cade557672bd7888a39ce7d115a8c" + integrity sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w== + dependencies: + tslib "^2.4.0" + "@swc/types@^0.1.13": version "0.1.13" resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.13.tgz#441734f8bfa6e9e738f1c68e98be6da282ecc7db" @@ -4528,6 +4871,11 @@ dependencies: "@types/node" "*" +"@types/canvas-confetti@^1.6.4": + version "1.6.4" + resolved "https://registry.yarnpkg.com/@types/canvas-confetti/-/canvas-confetti-1.6.4.tgz#620fd8d78b335d6a4046c0f73236d6988b37552a" + integrity sha512-fNyZ/Fdw/Y92X0vv7B+BD6ysHL4xVU5dJcgzgxLdGbn8O3PezZNIJpml44lKM0nsGur+o/6+NZbZeNTt00U1uA== + "@types/chai@^4.3.16": version "4.3.20" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.20.tgz#cb291577ed342ca92600430841a00329ba05cecc" @@ -4830,6 +5178,13 @@ dependencies: undici-types "~5.26.4" +"@types/node@^20": + version "20.17.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.17.8.tgz#42748cdb169adf5be7c9760604c72820c7b7d560" + integrity sha512-ahz2g6/oqbKalW9sPv6L2iRbhLnojxjYWspAqhjvqSWBgGebEJT5GvRmk0QXPj3sbC6rU0GTQjPLQkmR8CObvA== + dependencies: + undici-types "~6.19.2" + "@types/normalize-package-data@^2.4.0": version "2.4.4" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" @@ -4877,7 +5232,7 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== -"@types/react-dom@^18.0.0", "@types/react-dom@^18.2.18", "@types/react-dom@^18.2.7": +"@types/react-dom@^18", "@types/react-dom@^18.0.0", "@types/react-dom@^18.2.18", "@types/react-dom@^18.2.7": version "18.3.1" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.1.tgz#1e4654c08a9cdcfb6594c780ac59b55aad42fe07" integrity sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ== @@ -4891,7 +5246,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@>=16", "@types/react@^18.2.15", "@types/react@^18.2.48": +"@types/react@*", "@types/react@>=16", "@types/react@^18", "@types/react@^18.2.15", "@types/react@^18.2.48": version "18.3.12" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.12.tgz#99419f182ccd69151813b7ee24b792fe08774f60" integrity sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw== @@ -5003,6 +5358,21 @@ dependencies: "@types/yargs-parser" "*" +"@typescript-eslint/eslint-plugin@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": + version "8.16.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.16.0.tgz#ac56825bcdf3b392fc76a94b1315d4a162f201a6" + integrity sha512-5YTHKV8MYlyMI6BaEG7crQ9BhSc8RxzshOReKwZwRWN0+XvvTOm+L/UYLCYxFpfwYuAAqhxiq4yae0CMFwbL7Q== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.16.0" + "@typescript-eslint/type-utils" "8.16.0" + "@typescript-eslint/utils" "8.16.0" + "@typescript-eslint/visitor-keys" "8.16.0" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^1.3.0" + "@typescript-eslint/eslint-plugin@^5.5.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" @@ -5026,6 +5396,17 @@ dependencies: "@typescript-eslint/utils" "5.62.0" +"@typescript-eslint/parser@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": + version "8.16.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.16.0.tgz#ee5b2d6241c1ab3e2e53f03fd5a32d8e266d8e06" + integrity sha512-D7DbgGFtsqIPIFMPJwCad9Gfi/hC0PWErRRHFnaCWoEDYi5tQUDiJCTmGUbBiLzjqAck4KcXt9Ayj0CNlIrF+w== + dependencies: + "@typescript-eslint/scope-manager" "8.16.0" + "@typescript-eslint/types" "8.16.0" + "@typescript-eslint/typescript-estree" "8.16.0" + "@typescript-eslint/visitor-keys" "8.16.0" + debug "^4.3.4" + "@typescript-eslint/parser@^5.5.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" @@ -5044,6 +5425,14 @@ "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" +"@typescript-eslint/scope-manager@8.16.0": + version "8.16.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.16.0.tgz#ebc9a3b399a69a6052f3d88174456dd399ef5905" + integrity sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg== + dependencies: + "@typescript-eslint/types" "8.16.0" + "@typescript-eslint/visitor-keys" "8.16.0" + "@typescript-eslint/type-utils@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" @@ -5054,11 +5443,26 @@ debug "^4.3.4" tsutils "^3.21.0" +"@typescript-eslint/type-utils@8.16.0": + version "8.16.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.16.0.tgz#585388735f7ac390f07c885845c3d185d1b64740" + integrity sha512-IqZHGG+g1XCWX9NyqnI/0CX5LL8/18awQqmkZSl2ynn8F76j579dByc0jhfVSnSnhf7zv76mKBQv9HQFKvDCgg== + dependencies: + "@typescript-eslint/typescript-estree" "8.16.0" + "@typescript-eslint/utils" "8.16.0" + debug "^4.3.4" + ts-api-utils "^1.3.0" + "@typescript-eslint/types@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== +"@typescript-eslint/types@8.16.0": + version "8.16.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.16.0.tgz#49c92ae1b57942458ab83d9ec7ccab3005e64737" + integrity sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ== + "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" @@ -5072,6 +5476,20 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/typescript-estree@8.16.0": + version "8.16.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.16.0.tgz#9d741e56e5b13469b5190e763432ce5551a9300c" + integrity sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw== + dependencies: + "@typescript-eslint/types" "8.16.0" + "@typescript-eslint/visitor-keys" "8.16.0" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + "@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.45.0", "@typescript-eslint/utils@^5.58.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" @@ -5086,6 +5504,16 @@ eslint-scope "^5.1.1" semver "^7.3.7" +"@typescript-eslint/utils@8.16.0": + version "8.16.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.16.0.tgz#c71264c437157feaa97842809836254a6fc833c3" + integrity sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "8.16.0" + "@typescript-eslint/types" "8.16.0" + "@typescript-eslint/typescript-estree" "8.16.0" + "@typescript-eslint/visitor-keys@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" @@ -5094,6 +5522,14 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" +"@typescript-eslint/visitor-keys@8.16.0": + version "8.16.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.16.0.tgz#d5086afc060b01ff7a4ecab8d49d13d5a7b07705" + integrity sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ== + dependencies: + "@typescript-eslint/types" "8.16.0" + eslint-visitor-keys "^4.2.0" + "@ungap/structured-clone@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" @@ -5834,6 +6270,11 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== +attr-accept@^2.2.4: + version "2.2.5" + resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-2.2.5.tgz#d7061d958e6d4f97bf8665c68b75851a0713ab5e" + integrity sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ== + autoprefixer@^10.4.12, autoprefixer@^10.4.13: version "10.4.20" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.20.tgz#5caec14d43976ef42e32dcb4bd62878e96be5b3b" @@ -6402,6 +6843,13 @@ builtins@^5.0.0: dependencies: semver "^7.0.0" +busboy@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + byte-size@8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-8.1.1.tgz#3424608c62d59de5bfda05d31e0313c6174842ae" @@ -6545,6 +6993,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001669: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001676.tgz#fe133d41fe74af8f7cc93b8a714c3e86a86e6f04" integrity sha512-Qz6zwGCiPghQXGJvgQAem79esjitvJ+CxSbSQkW9H/UX5hg8XM88d4lp2W+MEQ81j+Hip58Il+jGVdazk1z9cw== +caniuse-lite@^1.0.30001579: + version "1.0.30001684" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001684.tgz#0eca437bab7d5f03452ff0ef9de8299be6b08e16" + integrity sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ== + canonicalize@^1.0.1: version "1.0.8" resolved "https://registry.yarnpkg.com/canonicalize/-/canonicalize-1.0.8.tgz#24d1f1a00ed202faafd9bf8e63352cd4450c6df1" @@ -6555,6 +7008,11 @@ canonicalize@^2.0.0: resolved "https://registry.yarnpkg.com/canonicalize/-/canonicalize-2.0.0.tgz#32be2cef4446d67fd5348027a384cae28f17226a" integrity sha512-ulDEYPv7asdKvqahuAY35c1selLdzDwHqugK92hfkzvlDCwXRRelDkR+Er33md/PtnpqHemgkuDPanZ4fiYZ8w== +canvas-confetti@^1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/canvas-confetti/-/canvas-confetti-1.9.3.tgz#ef4c857420ad8045ab4abe8547261c8cdf229845" + integrity sha512-rFfTURMvmVEX1gyXFgn5QMn81bYk70qa0HLzcIOSVEyl57n6o9ItHeBtUSWdvKAPY0xlvBHno4/v3QPrT83q9g== + case-sensitive-paths-webpack-plugin@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" @@ -6638,7 +7096,7 @@ check-types@^11.2.3: resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.3.tgz#1ffdf68faae4e941fce252840b1787b8edc93b71" integrity sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg== -chokidar@^3.4.2, chokidar@^3.5.3: +chokidar@^3.4.2, chokidar@^3.5.3, chokidar@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -6693,6 +7151,13 @@ cjs-module-lexer@^1.0.0, cjs-module-lexer@^1.2.3: resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== +class-variance-authority@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/class-variance-authority/-/class-variance-authority-0.7.1.tgz#4008a798a0e4553a781a57ac5177c9fb5d043787" + integrity sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg== + dependencies: + clsx "^2.1.1" + clean-css@^5.2.2: version "5.3.3" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" @@ -6748,6 +7213,11 @@ cli-width@^3.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== +client-only@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== + cliui@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" @@ -6837,16 +7307,32 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@~1.1.4: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-string@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + color-support@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== +color@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== + dependencies: + color-convert "^2.0.1" + color-string "^1.9.0" + colord@^2.9.1: version "2.9.3" resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" @@ -7764,6 +8250,11 @@ detect-indent@^6.1.0: resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== +detect-libc@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -8466,6 +8957,22 @@ escodegen@^2.0.0, escodegen@^2.1.0: optionalDependencies: source-map "~0.6.1" +eslint-config-next@15.0.3: + version "15.0.3" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-15.0.3.tgz#b483585260d5e55050d4ab87e053c88089ae12ee" + integrity sha512-IGP2DdQQrgjcr4mwFPve4DrCqo7CVVez1WoYY47XwKSrYO4hC0Dlb+iJA60i0YfICOzgNADIb8r28BpQ5Zs0wg== + dependencies: + "@next/eslint-plugin-next" "15.0.3" + "@rushstack/eslint-patch" "^1.10.3" + "@typescript-eslint/eslint-plugin" "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser" "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" + eslint-import-resolver-node "^0.3.6" + eslint-import-resolver-typescript "^3.5.2" + eslint-plugin-import "^2.31.0" + eslint-plugin-jsx-a11y "^6.10.0" + eslint-plugin-react "^7.35.0" + eslint-plugin-react-hooks "^5.0.0" + eslint-config-react-app@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz#73ba3929978001c5c86274c017ea57eb5fa644b4" @@ -8486,7 +8993,7 @@ eslint-config-react-app@^7.0.1: eslint-plugin-react-hooks "^4.3.0" eslint-plugin-testing-library "^5.0.1" -eslint-import-resolver-node@^0.3.9: +eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: version "0.3.9" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== @@ -8495,7 +9002,21 @@ eslint-import-resolver-node@^0.3.9: is-core-module "^2.13.0" resolve "^1.22.4" -eslint-module-utils@^2.12.0: +eslint-import-resolver-typescript@^3.5.2: + version "3.6.3" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz#bb8e388f6afc0f940ce5d2c5fd4a3d147f038d9e" + integrity sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA== + dependencies: + "@nolyfill/is-core-module" "1.0.39" + debug "^4.3.5" + enhanced-resolve "^5.15.0" + eslint-module-utils "^2.8.1" + fast-glob "^3.3.2" + get-tsconfig "^4.7.5" + is-bun-module "^1.0.2" + is-glob "^4.0.3" + +eslint-module-utils@^2.12.0, eslint-module-utils@^2.8.1: version "2.12.0" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b" integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg== @@ -8510,7 +9031,7 @@ eslint-plugin-flowtype@^8.0.3: lodash "^4.17.21" string-natural-compare "^3.0.1" -eslint-plugin-import@^2.25.3: +eslint-plugin-import@^2.25.3, eslint-plugin-import@^2.31.0: version "2.31.0" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz#310ce7e720ca1d9c0bb3f69adfd1c6bdd7d9e0e7" integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A== @@ -8542,7 +9063,7 @@ eslint-plugin-jest@^25.3.0: dependencies: "@typescript-eslint/experimental-utils" "^5.0.0" -eslint-plugin-jsx-a11y@^6.5.1: +eslint-plugin-jsx-a11y@^6.10.0, eslint-plugin-jsx-a11y@^6.5.1: version "6.10.2" resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz#d2812bb23bf1ab4665f1718ea442e8372e638483" integrity sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q== @@ -8576,7 +9097,12 @@ eslint-plugin-react-hooks@^4.3.0: resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== -eslint-plugin-react@^7.27.1: +eslint-plugin-react-hooks@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0.tgz#72e2eefbac4b694f5324154619fee44f5f60f101" + integrity sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw== + +eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.35.0: version "7.37.2" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz#cd0935987876ba2900df2f58339f6d92305acc7a" integrity sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w== @@ -8643,6 +9169,11 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== +eslint-visitor-keys@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" + integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== + eslint-webpack-plugin@^3.1.1: version "3.2.0" resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz#1978cdb9edc461e4b0195a20da950cf57988347c" @@ -8654,7 +9185,7 @@ eslint-webpack-plugin@^3.1.1: normalize-path "^3.0.0" schema-utils "^4.0.0" -eslint@^8.3.0: +eslint@^8, eslint@^8.3.0: version "8.57.1" resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== @@ -8970,7 +9501,18 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== -fast-glob@^3.2.5, fast-glob@^3.2.9, fast-glob@^3.3.0: +fast-glob@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + 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" + +fast-glob@^3.2.5, fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -9066,6 +9608,13 @@ file-loader@^6.2.0: loader-utils "^2.0.0" schema-utils "^3.0.0" +file-selector@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/file-selector/-/file-selector-2.1.1.tgz#21833801bfa3d696d44788c871e4e6704967627c" + integrity sha512-pJVY80PuSiHbnYEZ0gZYQf15x0z/lkeIF1yn95yRC/Usb43343ewXtMClQ9GLPvPm4/SscX4zvQz9QhCAyLqlg== + dependencies: + tslib "^2.7.0" + file-system-cache@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/file-system-cache/-/file-system-cache-2.3.0.tgz#201feaf4c8cd97b9d0d608e96861bb6005f46fe6" @@ -9499,6 +10048,13 @@ get-symbol-description@^1.0.2: es-errors "^1.3.0" get-intrinsic "^1.2.4" +get-tsconfig@^4.7.5: + version "4.8.1" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.8.1.tgz#8995eb391ae6e1638d251118c7b56de7eb425471" + integrity sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg== + dependencies: + resolve-pkg-maps "^1.0.0" + giget@^1.0.0: version "1.2.3" resolved "https://registry.yarnpkg.com/giget/-/giget-1.2.3.tgz#ef6845d1140e89adad595f7f3bb60aa31c672cb6" @@ -10156,7 +10712,7 @@ ignore-walk@^6.0.4: dependencies: minimatch "^9.0.0" -ignore@^5.0.4, ignore@^5.1.4, ignore@^5.2.0: +ignore@^5.0.4, ignore@^5.1.4, ignore@^5.2.0, ignore@^5.3.1: version "5.3.2" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== @@ -10327,6 +10883,11 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + is-async-function@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" @@ -10361,6 +10922,13 @@ is-buffer@^2.0.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== +is-bun-module@^1.0.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/is-bun-module/-/is-bun-module-1.3.0.tgz#ea4d24fdebfcecc98e81bcbcb506827fee288760" + integrity sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA== + dependencies: + semver "^7.6.3" + is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" @@ -11703,7 +12271,7 @@ jest@^27.4.3: import-local "^3.0.2" jest-cli "^27.5.1" -jiti@^1.21.0: +jiti@^1.21.0, jiti@^1.21.6: version "1.21.6" resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== @@ -11977,6 +12545,11 @@ jws@^3.2.2: jwa "^1.4.1" safe-buffer "^5.0.1" +jwt-decode@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-4.0.0.tgz#2270352425fd413785b2faf11f6e755c5151bd4b" + integrity sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA== + keyv@^4.5.3: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" @@ -12402,6 +12975,11 @@ lru-cache@^7.5.1, lru-cache@^7.7.1: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== +lucide-react@^0.460.0: + version "0.460.0" + resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.460.0.tgz#5681364b6bd94d1d475944f0385239c0b1408e35" + integrity sha512-BVtq/DykVeIvRTJvRAgCsOwaGL8Un3Bxh8MbDxMhEWlZay3T4IpEKDEpwt5KZ0KJMHzgm6jrltxlT5eXOWXDHg== + lz-string@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" @@ -12623,7 +13201,7 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5, micromatch@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== @@ -12994,6 +13572,11 @@ mz@^2.4.0, mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" +nanoid@^3.3.6: + version "3.3.8" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" + integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== + nanoid@^3.3.7: version "3.3.7" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" @@ -13024,6 +13607,29 @@ neo-async@^2.5.0, neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +next@^15.0.3: + version "15.0.3" + resolved "https://registry.yarnpkg.com/next/-/next-15.0.3.tgz#804f5b772e7570ef1f088542a59860914d3288e9" + integrity sha512-ontCbCRKJUIoivAdGB34yCaOcPgYXr9AAkV/IwqFfWWTXEPUgLYkSkqBhIk9KK7gGmgjc64B+RdoeIDM13Irnw== + dependencies: + "@next/env" "15.0.3" + "@swc/counter" "0.1.3" + "@swc/helpers" "0.5.13" + busboy "1.6.0" + caniuse-lite "^1.0.30001579" + postcss "8.4.31" + styled-jsx "5.1.6" + optionalDependencies: + "@next/swc-darwin-arm64" "15.0.3" + "@next/swc-darwin-x64" "15.0.3" + "@next/swc-linux-arm64-gnu" "15.0.3" + "@next/swc-linux-arm64-musl" "15.0.3" + "@next/swc-linux-x64-gnu" "15.0.3" + "@next/swc-linux-x64-musl" "15.0.3" + "@next/swc-win32-arm64-msvc" "15.0.3" + "@next/swc-win32-x64-msvc" "15.0.3" + sharp "^0.33.5" + no-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" @@ -14018,7 +14624,7 @@ picocolors@^0.2.1: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== -picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0: +picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== @@ -14315,7 +14921,7 @@ postcss-lab-function@^4.2.1: "@csstools/postcss-progressive-custom-properties" "^1.1.0" postcss-value-parser "^4.2.0" -postcss-load-config@^4.0.1: +postcss-load-config@^4.0.1, postcss-load-config@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== @@ -14420,7 +15026,7 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-nested@^6.0.1: +postcss-nested@^6.0.1, postcss-nested@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.2.0.tgz#4c2d22ab5f20b9cb61e2c5c5915950784d068131" integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ== @@ -14628,7 +15234,7 @@ postcss-selector-not@^6.0.1: dependencies: postcss-selector-parser "^6.0.10" -postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9, postcss-selector-parser@^6.1.1: +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9, postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2: version "6.1.2" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== @@ -14656,6 +15262,15 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== +postcss@8.4.31: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + postcss@^7.0.35: version "7.0.39" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" @@ -14664,6 +15279,15 @@ postcss@^7.0.35: picocolors "^0.2.1" source-map "^0.6.1" +postcss@^8, postcss@^8.4.47: + version "8.4.49" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" + integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== + dependencies: + nanoid "^3.3.7" + picocolors "^1.1.1" + source-map-js "^1.2.1" + postcss@^8.3.5, postcss@^8.4.23, postcss@^8.4.33, postcss@^8.4.4: version "8.4.47" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365" @@ -15111,6 +15735,22 @@ react-dom@18.2.0: loose-envify "^1.1.0" scheduler "^0.23.0" +react-dom@19.0.0-rc-66855b96-20241106: + version "19.0.0-rc-66855b96-20241106" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0-rc-66855b96-20241106.tgz#beba73decfd1b9365a3c83673a298623b15acb0b" + integrity sha512-D25vdaytZ1wFIRiwNU98NPQ/upS2P8Co4/oNoa02PzHbh8deWdepjm5qwZM/46OdSiGv4WSWwxP55RO9obqJEQ== + dependencies: + scheduler "0.25.0-rc-66855b96-20241106" + +react-dropzone@^14.3.5: + version "14.3.5" + resolved "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-14.3.5.tgz#1a8bd312c8a353ec78ef402842ccb3589c225add" + integrity sha512-9nDUaEEpqZLOz5v5SUcFA0CjM4vq8YbqO0WRls+EYT7+DvxUdzDPKNCPLqGfj3YL9MsniCLCD4RFA6M95V6KMQ== + dependencies: + attr-accept "^2.2.4" + file-selector "^2.1.0" + prop-types "^15.8.1" + react-element-to-jsx-string@^15.0.0: version "15.0.0" resolved "https://registry.yarnpkg.com/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz#1cafd5b6ad41946ffc8755e254da3fc752a01ac6" @@ -15169,7 +15809,7 @@ react-refresh@^0.14.0: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== -react-remove-scroll-bar@^2.3.3: +react-remove-scroll-bar@^2.3.3, react-remove-scroll-bar@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz#3e585e9d163be84a010180b18721e851ac81a29c" integrity sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g== @@ -15188,6 +15828,17 @@ react-remove-scroll@2.5.5: use-callback-ref "^1.3.0" use-sidecar "^1.1.2" +react-remove-scroll@2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.6.0.tgz#fb03a0845d7768a4f1519a99fdb84983b793dc07" + integrity sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ== + dependencies: + react-remove-scroll-bar "^2.3.6" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + react-router-dom@6.21.3: version "6.21.3" resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.21.3.tgz#ef3a7956a3699c7b82c21fcb3dbc63c313ed8c5d" @@ -15291,6 +15942,11 @@ react@18.2.0: dependencies: loose-envify "^1.1.0" +react@19.0.0-rc-66855b96-20241106: + version "19.0.0-rc-66855b96-20241106" + resolved "https://registry.yarnpkg.com/react/-/react-19.0.0-rc-66855b96-20241106.tgz#f04d7283454a32bdd8e9757db4308b75b9739e56" + integrity sha512-klH7xkT71SxRCx4hb1hly5FJB21Hz0ACyxbXYAECEqssUjtJeFUAaI2U1DgJAzkGEnvEm3DkxuBchMC/9K4ipg== + read-cache@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" @@ -15602,6 +16258,11 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + resolve-url-loader@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz#d50d4ddc746bb10468443167acf800dcd6c3ad57" @@ -15623,7 +16284,7 @@ resolve.exports@^2.0.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== -resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.2, resolve@^1.22.4: +resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.2, resolve@^1.22.4, resolve@^1.22.8: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -15809,6 +16470,11 @@ saxes@^6.0.0: dependencies: xmlchars "^2.2.0" +scheduler@0.25.0-rc-66855b96-20241106: + version "0.25.0-rc-66855b96-20241106" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0-rc-66855b96-20241106.tgz#8bbb728eca4de5a5deca1f18370fbce41aee91d1" + integrity sha512-HQXp/Mnp/MMRSXMQF7urNFla+gmtXW/Gr1KliuR0iboTit4KvZRY8KYaq5ccCTAOJiUqQh2rE2F3wgUekmgdlA== + scheduler@^0.23.0: version "0.23.2" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" @@ -15876,7 +16542,7 @@ semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: +semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -15989,6 +16655,35 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" +sharp@^0.33.5: + version "0.33.5" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.33.5.tgz#13e0e4130cc309d6a9497596715240b2ec0c594e" + integrity sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw== + dependencies: + color "^4.2.3" + detect-libc "^2.0.3" + semver "^7.6.3" + optionalDependencies: + "@img/sharp-darwin-arm64" "0.33.5" + "@img/sharp-darwin-x64" "0.33.5" + "@img/sharp-libvips-darwin-arm64" "1.0.4" + "@img/sharp-libvips-darwin-x64" "1.0.4" + "@img/sharp-libvips-linux-arm" "1.0.5" + "@img/sharp-libvips-linux-arm64" "1.0.4" + "@img/sharp-libvips-linux-s390x" "1.0.4" + "@img/sharp-libvips-linux-x64" "1.0.4" + "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" + "@img/sharp-libvips-linuxmusl-x64" "1.0.4" + "@img/sharp-linux-arm" "0.33.5" + "@img/sharp-linux-arm64" "0.33.5" + "@img/sharp-linux-s390x" "0.33.5" + "@img/sharp-linux-x64" "0.33.5" + "@img/sharp-linuxmusl-arm64" "0.33.5" + "@img/sharp-linuxmusl-x64" "0.33.5" + "@img/sharp-wasm32" "0.33.5" + "@img/sharp-win32-ia32" "0.33.5" + "@img/sharp-win32-x64" "0.33.5" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -16049,6 +16744,13 @@ sigstore@^2.2.0: "@sigstore/tuf" "^2.3.4" "@sigstore/verify" "^1.2.1" +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -16113,6 +16815,11 @@ socks@^2.6.2, socks@^2.8.3: ip-address "^9.0.5" smart-buffer "^4.2.0" +sonner@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/sonner/-/sonner-1.7.0.tgz#f59a2a70e049a179b6fbd1bb1bf2619d5ced07c0" + integrity sha512-W6dH7m5MujEPyug3lpI2l3TC3Pp1+LTgK0Efg+IHDrBbtEjyCmCHHo6yfNBOsf1tFZ6zf+jceWwB38baC8yO9g== + sort-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" @@ -16372,6 +17079,11 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b" integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ== +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -16569,6 +17281,13 @@ style-loader@^3.3.1: resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.4.tgz#f30f786c36db03a45cbd55b6a70d930c479090e7" integrity sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w== +styled-jsx@5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.6.tgz#83b90c077e6c6a80f7f5e8781d0f311b2fe41499" + integrity sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA== + dependencies: + client-only "0.0.1" + stylehacks@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" @@ -16582,7 +17301,7 @@ stylis@4.2.0: resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== -sucrase@^3.32.0: +sucrase@^3.32.0, sucrase@^3.35.0: version "3.35.0" resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== @@ -16691,6 +17410,16 @@ synckit@^0.9.1: "@pkgr/core" "^0.1.0" tslib "^2.6.2" +tailwind-merge@^2.5.4: + version "2.5.5" + resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.5.5.tgz#98167859b856a2a6b8d2baf038ee171b9d814e39" + integrity sha512-0LXunzzAZzo0tEPxV3I297ffKZPlKDrjj7NXphC8V5ak9yHC5zRmxnOe2m/Rd/7ivsOMJe3JZ2JVocoDdQTRBA== + +tailwindcss-animate@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz#318b692c4c42676cc9e67b19b78775742388bef4" + integrity sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA== + tailwindcss@^3.0.2: version "3.4.14" resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.14.tgz#6dd23a7f54ec197b19159e91e3bb1e55e7aa73ac" @@ -16719,6 +17448,34 @@ tailwindcss@^3.0.2: resolve "^1.22.2" sucrase "^3.32.0" +tailwindcss@^3.4.1: + version "3.4.15" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.15.tgz#04808bf4bf1424b105047d19e7d4bfab368044a9" + integrity sha512-r4MeXnfBmSOuKUWmXe6h2CcyfzJCEk4F0pptO5jlnYSIViUkVmsawj80N5h2lO3gwcmSb4n3PuN+e+GC1Guylw== + dependencies: + "@alloc/quick-lru" "^5.2.0" + arg "^5.0.2" + chokidar "^3.6.0" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.3.2" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.21.6" + lilconfig "^2.1.0" + micromatch "^4.0.8" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.1.1" + postcss "^8.4.47" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.2" + postcss-nested "^6.2.0" + postcss-selector-parser "^6.1.2" + resolve "^1.22.8" + sucrase "^3.35.0" + tapable@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" @@ -16989,6 +17746,11 @@ tryer@^1.0.1: resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== +ts-api-utils@^1.3.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.2.tgz#a6a6dff26117ac7965624fc118525971edc6a82a" + integrity sha512-ZF5gQIQa/UmzfvxbHZI3JXN0/Jt+vnAfAviNRAMc491laiK6YCLpCW9ft8oaCRFOTxCZtUTE6XB0ZQAe3olntw== + ts-dedent@^2.0.0, ts-dedent@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" @@ -17239,6 +18001,11 @@ typescript@^4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +typescript@^5: + version "5.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" + integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== + ufo@^1.5.4: version "1.5.4" resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.4.tgz#16d6949674ca0c9e0fbbae1fa20a71d7b1ded754" @@ -17276,7 +18043,7 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -undici-types@~6.19.8: +undici-types@~6.19.2, undici-types@~6.19.8: version "6.19.8" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== From 213905dc9a7cf9714d71b61537a3db40ed00bab9 Mon Sep 17 00:00:00 2001 From: Nam Hoang Date: Thu, 28 Nov 2024 10:45:49 +0700 Subject: [PATCH 02/12] chore: fix eslint configuration (#168) Signed-off-by: Nam Hoang --- .eslintignore | 3 ++- .eslintrc.json | 28 ++++++++++++++++++-------- package.json | 2 +- packages/tsconfig.settings.json | 28 -------------------------- packages/untp-playground/tsconfig.json | 27 +++++++++++++++++++------ packages/vc-test-suite/tsconfig.json | 2 +- 6 files changed, 45 insertions(+), 45 deletions(-) delete mode 100644 packages/tsconfig.settings.json diff --git a/.eslintignore b/.eslintignore index 9b77b3a8..cd8b66fe 100644 --- a/.eslintignore +++ b/.eslintignore @@ -7,4 +7,5 @@ jest.config.* jest.*.config.* integration node_modules -.next \ No newline at end of file +.next +packages/untp-playground/infra \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json index b9b64c3b..037e7da9 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,8 +1,13 @@ { "root": true, // TODO: Enable linting for documentation folder - "ignorePatterns": ["documentation"], - "plugins": ["@typescript-eslint", "prettier"], + "ignorePatterns": [ + "documentation" + ], + "plugins": [ + "@typescript-eslint", + "prettier" + ], "parser": "@typescript-eslint/parser", "extends": [ "eslint:recommended", @@ -11,9 +16,8 @@ ], "parserOptions": { "project": [ - "./packages/tsconfig.settings.json", - "./packages/*/tsconfig.json" - ] + "./packages/*/tsconfig.json" + ] }, "rules": { "no-console": "warn", @@ -27,14 +31,22 @@ "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/no-unsafe-return": "off", "@typescript-eslint/no-unsafe-argument": "off", - "@typescript-eslint/no-non-null-assertion": "off" + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-floating-promises": "off", + "@typescript-eslint/restrict-template-expressions": "off", + "@typescript-eslint/no-misused-promises": "off", + "@typescript-eslint/require-await": "off", + "@typescript-eslint/no-unused-vars": "off", + "prefer-const": "off" }, "overrides": [ { - "files": ["*.js"], + "files": [ + "*.js" + ], "rules": { "@typescript-eslint/no-var-requires": "off" } } ] -} +} \ No newline at end of file diff --git a/package.json b/package.json index bcdbf78d..9953e2c0 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "upgrade:packages": "yarn -r --stream upgrade --latest", "version": "lerna version", "prepare": "husky install", - "lint": " yarn eslint packages" + "lint": "cross-env NODE_OPTIONS=--max-old-space-size=8192 yarn eslint packages" }, "devDependencies": { "@jest/globals": "^29.7.0", diff --git a/packages/tsconfig.settings.json b/packages/tsconfig.settings.json deleted file mode 100644 index ab096417..00000000 --- a/packages/tsconfig.settings.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "compilerOptions": { - "strict": true, - "preserveConstEnums": true, - "sourceMap": true, - "target": "esnext", - "module": "esnext", - "moduleResolution": "Node", - "esModuleInterop": true, - "downlevelIteration": true, - "declarationMap": true, - "declaration": true, - "composite": true, - "emitDecoratorMetadata": true, - "useUnknownInCatchVariables": false, - "experimentalDecorators": true, - "resolveJsonModule": true, - "allowSyntheticDefaultImports": true, - "jsx": "react-jsx" - }, - "ts-node": { - "compilerOptions": { - "module": "CommonJS" - } - }, - "exclude": ["**/build/**/*", "**/node_modules/**/*", "**/*.test.ts", "**/*.spec.ts"], - "include": ["src", "src/__tests__"] -} diff --git a/packages/untp-playground/tsconfig.json b/packages/untp-playground/tsconfig.json index bb95472c..7aa97d60 100644 --- a/packages/untp-playground/tsconfig.json +++ b/packages/untp-playground/tsconfig.json @@ -1,14 +1,18 @@ { "compilerOptions": { "target": "ES2017", - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "skipLibCheck": true, "strict": true, "noEmit": true, "esModuleInterop": true, "module": "esnext", - "moduleResolution": "bundler", + "moduleResolution": "node", "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", @@ -19,9 +23,20 @@ } ], "paths": { - "@/*": ["./src/*"] + "@/*": [ + "./src/*" + ] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules", ".next", "infra"] -} + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts" + ], + "exclude": [ + "node_modules", + ".next", + "infra" + ] +} \ No newline at end of file diff --git a/packages/vc-test-suite/tsconfig.json b/packages/vc-test-suite/tsconfig.json index e7d4968b..ce33053e 100644 --- a/packages/vc-test-suite/tsconfig.json +++ b/packages/vc-test-suite/tsconfig.json @@ -9,7 +9,7 @@ "noImplicitThis": false, "noImplicitAny": false, "resolveJsonModule": true, - "moduleResolution": "Node" + "moduleResolution": "node" }, "include": [ "tests/**/*.ts" From f999120b91be1c7c257499f50cdc0d15dab0c129 Mon Sep 17 00:00:00 2001 From: Ashley Harwood Date: Thu, 28 Nov 2024 15:00:47 +1100 Subject: [PATCH 03/12] fix: lint issues --- packages/untp-playground/tailwind.config.ts | 112 ++++++++++---------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/packages/untp-playground/tailwind.config.ts b/packages/untp-playground/tailwind.config.ts index 266c06d6..2e92e039 100644 --- a/packages/untp-playground/tailwind.config.ts +++ b/packages/untp-playground/tailwind.config.ts @@ -1,62 +1,62 @@ -import type { Config } from "tailwindcss"; +import type { Config } from 'tailwindcss'; export default { - darkMode: ["class"], - content: [ - "./src/pages/**/*.{js,ts,jsx,tsx,mdx}", - "./src/components/**/*.{js,ts,jsx,tsx,mdx}", - "./src/app/**/*.{js,ts,jsx,tsx,mdx}", + darkMode: ['class'], + content: [ + './src/pages/**/*.{js,ts,jsx,tsx,mdx}', + './src/components/**/*.{js,ts,jsx,tsx,mdx}', + './src/app/**/*.{js,ts,jsx,tsx,mdx}', ], theme: { - extend: { - colors: { - background: 'hsl(var(--background))', - foreground: 'hsl(var(--foreground))', - card: { - DEFAULT: 'hsl(var(--card))', - foreground: 'hsl(var(--card-foreground))' - }, - popover: { - DEFAULT: 'hsl(var(--popover))', - foreground: 'hsl(var(--popover-foreground))' - }, - primary: { - DEFAULT: 'hsl(var(--primary))', - foreground: 'hsl(var(--primary-foreground))' - }, - secondary: { - DEFAULT: 'hsl(var(--secondary))', - foreground: 'hsl(var(--secondary-foreground))' - }, - muted: { - DEFAULT: 'hsl(var(--muted))', - foreground: 'hsl(var(--muted-foreground))' - }, - accent: { - DEFAULT: 'hsl(var(--accent))', - foreground: 'hsl(var(--accent-foreground))' - }, - destructive: { - DEFAULT: 'hsl(var(--destructive))', - foreground: 'hsl(var(--destructive-foreground))' - }, - border: 'hsl(var(--border))', - input: 'hsl(var(--input))', - ring: 'hsl(var(--ring))', - chart: { - '1': 'hsl(var(--chart-1))', - '2': 'hsl(var(--chart-2))', - '3': 'hsl(var(--chart-3))', - '4': 'hsl(var(--chart-4))', - '5': 'hsl(var(--chart-5))' - } - }, - borderRadius: { - lg: 'var(--radius)', - md: 'calc(var(--radius) - 2px)', - sm: 'calc(var(--radius) - 4px)' - } - } + extend: { + colors: { + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))', + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))', + }, + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))', + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))', + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))', + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))', + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))', + }, + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + chart: { + '1': 'hsl(var(--chart-1))', + '2': 'hsl(var(--chart-2))', + '3': 'hsl(var(--chart-3))', + '4': 'hsl(var(--chart-4))', + '5': 'hsl(var(--chart-5))', + }, + }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)', + }, + }, }, - plugins: [require("tailwindcss-animate")], + plugins: [require('tailwindcss-animate')], } satisfies Config; From 5de71eeab9b98a43a38f7d75ad7128fa3ab986e4 Mon Sep 17 00:00:00 2001 From: Ashley Harwood Date: Thu, 28 Nov 2024 15:01:15 +1100 Subject: [PATCH 04/12] chore: enable husky --- .husky/pre-commit | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.husky/pre-commit b/.husky/pre-commit index 2e03a328..6cdaab7b 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,5 +1,4 @@ #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" -# TODO: Uncomment this once memory issue fixed -# yarn lint +yarn lint From c97d00b87b13c29a5b33452fc75e761bc81c95a9 Mon Sep 17 00:00:00 2001 From: Ashley Harwood Date: Thu, 28 Nov 2024 15:14:37 +1100 Subject: [PATCH 05/12] chore: add pass with no tests --- package.json | 2 +- .../components/src/constants/app-config.json | 42 +++++++++++-------- .../mock-app/src/constants/app-config.json | 42 +++++++++++-------- packages/untp-playground/package.json | 3 +- 4 files changed, 51 insertions(+), 38 deletions(-) diff --git a/package.json b/package.json index 9953e2c0..edd1d684 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "build:components": "cd packages/components && yarn run build", "build:untp-test-suite": "cd packages/untp-test-suite && yarn run build", "build-clean": "rimraf --glob ./yarn.lock ./node_modules ./packages/*/tsconfig.tsbuildinfo ./packages/*/build ./packages/*/node_modules", - "test": "lerna exec -- yarn jest", + "test": "lerna exec -- yarn jest --passWithNoTests", "test:coverage": "lerna exec -- yarn jest --coverage && rm -rf coverage && istanbul-merge --out coverage/coverage-final.json packages/*/coverage/coverage-final.json && nyc report --temp-dir=./coverage --reporter=html --reporter=json-summary", "test:components": "cd packages/components && yarn run test", "test:services": "cd packages/services && yarn run test", diff --git a/packages/components/src/constants/app-config.json b/packages/components/src/constants/app-config.json index 99c680cd..1273cdae 100644 --- a/packages/components/src/constants/app-config.json +++ b/packages/components/src/constants/app-config.json @@ -687,7 +687,7 @@ } }, "dpp": { - "context": ["https://vocabulary.uncefact.org/untp/dpp/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dpp/0.5.0/"], "renderTemplate": [ { "template": " Digital Product Passport

PRODUCT PASSPORT

{{credentialSubject.name}}

{{credentialSubject.description}}
{{#each credentialSubject.furtherInformation}} {{linkName}} {{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}

{{this}}

{{/each}}
{{/if}}

Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%

Recyclable content

{{credentialSubject.circularityScorecard.recycledContent}}%

Recycled content

{{credentialSubject.circularityScorecard.utilityFactor}}

Utility factor

{{credentialSubject.circularityScorecard.materialCircularityIndicator}}

Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes

{{credentialSubject.emissionsScorecard.operationalScope}}

Primary sourced ratio*

{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

Issue date

{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}

*

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category

{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}

Date produced

{{credentialSubject.productionDate}}

Country

{{credentialSubject.countryOfProduction}}

Dimensions

Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}

Product composition

A complete list of materials that make up the composition of this product.

{{#each credentialSubject.materialsProvenance}}

{{massFraction}}%

{{massAmount.value}}{{massAmount.unit}} {{name}}

Recycled {{recycledAmount}}%

Hazard {{#if hazardous}}Yes{{else}}No{{/if}}

{{materialSafetyInformation.linkName}}
{{originCountry}}
{{/each}}

History

{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}

Passport issued by

Organisation

{{issuer.name}}

Registered ID {{issuer.id}}
Valid from

{{validFrom}}

Valid to

{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product's sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

PRODUCT PASSPORT
{{credentialSubject.name}}
Batch: {{credentialSubject.batchNumber}}
Serial: {{credentialSubject.serialNumber}}

{{credentialSubject.description}}

{{#each credentialSubject.furtherInformation}}
{{linkName}}
{{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}
{{this}}
{{/each}}
{{/if}}
Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%
Recyclable content
{{credentialSubject.circularityScorecard.recycledContent}}%
Recycled content
{{credentialSubject.circularityScorecard.utilityFactor}}
Utility factor
{{credentialSubject.circularityScorecard.materialCircularityIndicator}}
Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes
{{credentialSubject.emissionsScorecard.operationalScope}}
Primary sourced ratio*
{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Issue date
{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}
*
Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category
{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}
Date produced
{{credentialSubject.productionDate}}
Country
{{credentialSubject.countryOfProduction}}
Dimensions
Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}
Composition

The Product Composition List details the materials and components used in the product, providing transparency on the origin and nature of each element.

{{#each credentialSubject.materialsProvenance}}
{{massFraction}}%
{{massAmount.value}}{{massAmount.unit}} {{name}}
Recycled {{#if recycledAmount}}{{recycledAmount}}{{else}}0{{/if}}%
Hazard {{#if hazardous}}Yes{{else}}No{{/if}}
{{originCountry}}
{{/each}}
History
{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}
Passport issued by
Organisation
{{issuer.name}}
Registered ID
Valid from
{{validFrom}}
Valid to
{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product’s sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

", @@ -1401,7 +1401,7 @@ } }, "dpp": { - "context": ["https://vocabulary.uncefact.org/untp/dpp/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dpp/0.5.0/"], "renderTemplate": [ { "template": " Digital Product Passport

PRODUCT PASSPORT

{{credentialSubject.name}}

{{credentialSubject.description}}
{{#each credentialSubject.furtherInformation}} {{linkName}} {{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}

{{this}}

{{/each}}
{{/if}}

Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%

Recyclable content

{{credentialSubject.circularityScorecard.recycledContent}}%

Recycled content

{{credentialSubject.circularityScorecard.utilityFactor}}

Utility factor

{{credentialSubject.circularityScorecard.materialCircularityIndicator}}

Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes

{{credentialSubject.emissionsScorecard.operationalScope}}

Primary sourced ratio*

{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

Issue date

{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}

*

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category

{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}

Date produced

{{credentialSubject.productionDate}}

Country

{{credentialSubject.countryOfProduction}}

Dimensions

Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}

Product composition

A complete list of materials that make up the composition of this product.

{{#each credentialSubject.materialsProvenance}}

{{massFraction}}%

{{massAmount.value}}{{massAmount.unit}} {{name}}

Recycled {{recycledAmount}}%

Hazard {{#if hazardous}}Yes{{else}}No{{/if}}

{{materialSafetyInformation.linkName}}
{{originCountry}}
{{/each}}

History

{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}

Passport issued by

Organisation

{{issuer.name}}

Registered ID {{issuer.id}}
Valid from

{{validFrom}}

Valid to

{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product's sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

PRODUCT PASSPORT
{{credentialSubject.name}}
Batch: {{credentialSubject.batchNumber}}
Serial: {{credentialSubject.serialNumber}}

{{credentialSubject.description}}

{{#each credentialSubject.furtherInformation}}
{{linkName}}
{{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}
{{this}}
{{/each}}
{{/if}}
Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%
Recyclable content
{{credentialSubject.circularityScorecard.recycledContent}}%
Recycled content
{{credentialSubject.circularityScorecard.utilityFactor}}
Utility factor
{{credentialSubject.circularityScorecard.materialCircularityIndicator}}
Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes
{{credentialSubject.emissionsScorecard.operationalScope}}
Primary sourced ratio*
{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Issue date
{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}
*
Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category
{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}
Date produced
{{credentialSubject.productionDate}}
Country
{{credentialSubject.countryOfProduction}}
Dimensions
Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}
Composition

The Product Composition List details the materials and components used in the product, providing transparency on the origin and nature of each element.

{{#each credentialSubject.materialsProvenance}}
{{massFraction}}%
{{massAmount.value}}{{massAmount.unit}} {{name}}
Recycled {{#if recycledAmount}}{{recycledAmount}}{{else}}0{{/if}}%
Hazard {{#if hazardous}}Yes{{else}}No{{/if}}
{{originCountry}}
{{/each}}
History
{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}
Passport issued by
Organisation
{{issuer.name}}
Registered ID
Valid from
{{validFrom}}
Valid to
{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product’s sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

", @@ -1627,7 +1627,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -2574,7 +2574,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -2751,7 +2751,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -2932,7 +2932,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -3113,7 +3113,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -3315,7 +3315,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -3816,7 +3816,7 @@ } }, "digitalConformityCredential": { - "context": ["https://vocabulary.uncefact.org/untp/dcc/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dcc/0.5.0/"], "renderTemplate": [ { "template": " DigitalConformityCredential
CONFORMITY CREDENTIAL

{{credentialSubject.name}}

{{credentialSubject.description}}

Level of independent assurance:

{{credentialSubject.assessorLevel}}

Type of authority endorsement:

{{credentialSubject.assessmentLevel}}

Type of the attestation credential:

{{credentialSubject.attestationType}}
Assessments

The list of specific assessments made within this conformity attestation.

{{#each credentialSubject.assessment}}

{{conformityTopic}}

Declared values
{{#each declaredValue}}
Name
{{metricName}}
Value
{{metricValue.value}}{{metricValue.unit}}
Accuracy
{{accuracy}}
{{/each}}
Assessment Criteria
{{#each assessmentCriteria}}
{{name}}
    {{#each thresholdValues}}
  • Industry average {{metricName}} is {{metricValue.value}}{{metricValue.unit}}.

  • {{/each}}
{{/each}}
Assessed facilities
{{#each assessedFacility}}

{{name}}

{{/each}}
Assessed products
{{#each assessedProduct}}
{{name}}
{{/each}}
Other details
Assessed
{{assessmentDate}}
Organisation assessed
{{assessedOrganisation.name}}
{{/each}}
Issuer endorsement
{{#each credentialSubject.authorisation}}
trustmark
{{name}} is accredited by {{issuingAuthority.name}}.
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
Valid until
{{validUntil}}
", @@ -4233,7 +4233,7 @@ } }, "digitalFacilityRecord": { - "context": ["https://vocabulary.uncefact.org/untp/dfr/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dfr/0.5.0/"], "renderTemplate": [ { "template": " Digital Facility Record
FACILITY RECORD

{{credentialSubject.name}}

{{credentialSubject.description}}

Country
{{credentialSubject.countryOfOperation}}
Address
{{!-- TODO 1: plain text --}} {{!--
{{credentialSubject.address.streetAddress}} {{credentialSubject.address.addressLocality}}, {{credentialSubject.address.postalCode}}
--}} {{!-- TODO 2: confirm --}} {{!-- {{credentialSubject.address.streetAddress}} --}} {{!-- TODO 3: confirm --}} {{credentialSubject.address.streetAddress}} {{credentialSubject.address.addressLocality}}, {{credentialSubject.address.postalCode}}
Processes
{{#each credentialSubject.processCategory}} {{name}} {{/each}}
Geolocation
{{!-- TODO: confirm --}}
Show on map
Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
Valid until
{{validUntil}}
", @@ -4896,7 +4896,7 @@ } }, "dpp": { - "context": ["https://vocabulary.uncefact.org/untp/dpp/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dpp/0.5.0/"], "renderTemplate": [ { "template": " Digital Product Passport

PRODUCT PASSPORT

{{credentialSubject.name}}

{{credentialSubject.description}}
{{#each credentialSubject.furtherInformation}} {{linkName}} {{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}

{{this}}

{{/each}}
{{/if}}

Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%

Recyclable content

{{credentialSubject.circularityScorecard.recycledContent}}%

Recycled content

{{credentialSubject.circularityScorecard.utilityFactor}}

Utility factor

{{credentialSubject.circularityScorecard.materialCircularityIndicator}}

Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes

{{credentialSubject.emissionsScorecard.operationalScope}}

Primary sourced ratio*

{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

Issue date

{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}

*

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category

{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}

Date produced

{{credentialSubject.productionDate}}

Country

{{credentialSubject.countryOfProduction}}

Dimensions

Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}

Product composition

A complete list of materials that make up the composition of this product.

{{#each credentialSubject.materialsProvenance}}

{{massFraction}}%

{{massAmount.value}}{{massAmount.unit}} {{name}}

Recycled {{recycledAmount}}%

Hazard {{#if hazardous}}Yes{{else}}No{{/if}}

{{materialSafetyInformation.linkName}}
{{originCountry}}
{{/each}}

History

{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}

Passport issued by

Organisation

{{issuer.name}}

Registered ID {{issuer.id}}
Valid from

{{validFrom}}

Valid to

{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product's sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

PRODUCT PASSPORT
{{credentialSubject.name}}
Batch: {{credentialSubject.batchNumber}}
Serial: {{credentialSubject.serialNumber}}

{{credentialSubject.description}}

{{#each credentialSubject.furtherInformation}}
{{linkName}}
{{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}
{{this}}
{{/each}}
{{/if}}
Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%
Recyclable content
{{credentialSubject.circularityScorecard.recycledContent}}%
Recycled content
{{credentialSubject.circularityScorecard.utilityFactor}}
Utility factor
{{credentialSubject.circularityScorecard.materialCircularityIndicator}}
Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes
{{credentialSubject.emissionsScorecard.operationalScope}}
Primary sourced ratio*
{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Issue date
{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}
*
Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category
{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}
Date produced
{{credentialSubject.productionDate}}
Country
{{credentialSubject.countryOfProduction}}
Dimensions
Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}
Composition

The Product Composition List details the materials and components used in the product, providing transparency on the origin and nature of each element.

{{#each credentialSubject.materialsProvenance}}
{{massFraction}}%
{{massAmount.value}}{{massAmount.unit}} {{name}}
Recycled {{#if recycledAmount}}{{recycledAmount}}{{else}}0{{/if}}%
Hazard {{#if hazardous}}Yes{{else}}No{{/if}}
{{originCountry}}
{{/each}}
History
{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}
Passport issued by
Organisation
{{issuer.name}}
Registered ID
Valid from
{{validFrom}}
Valid to
{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product’s sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

", @@ -5117,7 +5117,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -5798,7 +5798,7 @@ } }, "dpp": { - "context": ["https://vocabulary.uncefact.org/untp/dpp/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dpp/0.5.0/"], "renderTemplate": [ { "template": " Digital Product Passport

PRODUCT PASSPORT

{{credentialSubject.name}}

{{credentialSubject.description}}
{{#each credentialSubject.furtherInformation}} {{linkName}} {{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}

{{this}}

{{/each}}
{{/if}}

Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%

Recyclable content

{{credentialSubject.circularityScorecard.recycledContent}}%

Recycled content

{{credentialSubject.circularityScorecard.utilityFactor}}

Utility factor

{{credentialSubject.circularityScorecard.materialCircularityIndicator}}

Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes

{{credentialSubject.emissionsScorecard.operationalScope}}

Primary sourced ratio*

{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

Issue date

{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}

*

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category

{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}

Date produced

{{credentialSubject.productionDate}}

Country

{{credentialSubject.countryOfProduction}}

Dimensions

Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}

Product composition

A complete list of materials that make up the composition of this product.

{{#each credentialSubject.materialsProvenance}}

{{massFraction}}%

{{massAmount.value}}{{massAmount.unit}} {{name}}

Recycled {{recycledAmount}}%

Hazard {{#if hazardous}}Yes{{else}}No{{/if}}

{{materialSafetyInformation.linkName}}
{{originCountry}}
{{/each}}

History

{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}

Passport issued by

Organisation

{{issuer.name}}

Registered ID {{issuer.id}}
Valid from

{{validFrom}}

Valid to

{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product's sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

PRODUCT PASSPORT
{{credentialSubject.name}}
Batch: {{credentialSubject.batchNumber}}
Serial: {{credentialSubject.serialNumber}}

{{credentialSubject.description}}

{{#each credentialSubject.furtherInformation}}
{{linkName}}
{{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}
{{this}}
{{/each}}
{{/if}}
Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%
Recyclable content
{{credentialSubject.circularityScorecard.recycledContent}}%
Recycled content
{{credentialSubject.circularityScorecard.utilityFactor}}
Utility factor
{{credentialSubject.circularityScorecard.materialCircularityIndicator}}
Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes
{{credentialSubject.emissionsScorecard.operationalScope}}
Primary sourced ratio*
{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Issue date
{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}
*
Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category
{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}
Date produced
{{credentialSubject.productionDate}}
Country
{{credentialSubject.countryOfProduction}}
Dimensions
Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}
Composition

The Product Composition List details the materials and components used in the product, providing transparency on the origin and nature of each element.

{{#each credentialSubject.materialsProvenance}}
{{massFraction}}%
{{massAmount.value}}{{massAmount.unit}} {{name}}
Recycled {{#if recycledAmount}}{{recycledAmount}}{{else}}0{{/if}}%
Hazard {{#if hazardous}}Yes{{else}}No{{/if}}
{{originCountry}}
{{/each}}
History
{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}
Passport issued by
Organisation
{{issuer.name}}
Registered ID
Valid from
{{validFrom}}
Valid to
{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product’s sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

", @@ -6019,7 +6019,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -6050,7 +6050,10 @@ } }, "identifierKeyPath": "/0/id", - "localStorageParams": { "storageKey": "fumigation_and_freight_forwarding_facility_dpps", "keyPath": "/0/epcList/index/name" } + "localStorageParams": { + "storageKey": "fumigation_and_freight_forwarding_facility_dpps", + "keyPath": "/0/epcList/index/name" + } } ] }, @@ -6700,7 +6703,7 @@ } }, "dpp": { - "context": ["https://vocabulary.uncefact.org/untp/dpp/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dpp/0.5.0/"], "renderTemplate": [ { "template": " Digital Product Passport

PRODUCT PASSPORT

{{credentialSubject.name}}

{{credentialSubject.description}}
{{#each credentialSubject.furtherInformation}} {{linkName}} {{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}

{{this}}

{{/each}}
{{/if}}

Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%

Recyclable content

{{credentialSubject.circularityScorecard.recycledContent}}%

Recycled content

{{credentialSubject.circularityScorecard.utilityFactor}}

Utility factor

{{credentialSubject.circularityScorecard.materialCircularityIndicator}}

Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes

{{credentialSubject.emissionsScorecard.operationalScope}}

Primary sourced ratio*

{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

Issue date

{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}

*

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category

{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}

Date produced

{{credentialSubject.productionDate}}

Country

{{credentialSubject.countryOfProduction}}

Dimensions

Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}

Product composition

A complete list of materials that make up the composition of this product.

{{#each credentialSubject.materialsProvenance}}

{{massFraction}}%

{{massAmount.value}}{{massAmount.unit}} {{name}}

Recycled {{recycledAmount}}%

Hazard {{#if hazardous}}Yes{{else}}No{{/if}}

{{materialSafetyInformation.linkName}}
{{originCountry}}
{{/each}}

History

{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}

Passport issued by

Organisation

{{issuer.name}}

Registered ID {{issuer.id}}
Valid from

{{validFrom}}

Valid to

{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product's sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

PRODUCT PASSPORT
{{credentialSubject.name}}
Batch: {{credentialSubject.batchNumber}}
Serial: {{credentialSubject.serialNumber}}

{{credentialSubject.description}}

{{#each credentialSubject.furtherInformation}}
{{linkName}}
{{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}
{{this}}
{{/each}}
{{/if}}
Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%
Recyclable content
{{credentialSubject.circularityScorecard.recycledContent}}%
Recycled content
{{credentialSubject.circularityScorecard.utilityFactor}}
Utility factor
{{credentialSubject.circularityScorecard.materialCircularityIndicator}}
Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes
{{credentialSubject.emissionsScorecard.operationalScope}}
Primary sourced ratio*
{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Issue date
{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}
*
Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category
{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}
Date produced
{{credentialSubject.productionDate}}
Country
{{credentialSubject.countryOfProduction}}
Dimensions
Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}
Composition

The Product Composition List details the materials and components used in the product, providing transparency on the origin and nature of each element.

{{#each credentialSubject.materialsProvenance}}
{{massFraction}}%
{{massAmount.value}}{{massAmount.unit}} {{name}}
Recycled {{#if recycledAmount}}{{recycledAmount}}{{else}}0{{/if}}%
Hazard {{#if hazardous}}Yes{{else}}No{{/if}}
{{originCountry}}
{{/each}}
History
{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}
Passport issued by
Organisation
{{issuer.name}}
Registered ID
Valid from
{{validFrom}}
Valid to
{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product’s sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

", @@ -6921,7 +6924,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -6952,7 +6955,10 @@ } }, "identifierKeyPath": "/0/id", - "localStorageParams": { "storageKey": "airport_terminal_facility_dpps", "keyPath": "/0/epcList/index/name" } + "localStorageParams": { + "storageKey": "airport_terminal_facility_dpps", + "keyPath": "/0/epcList/index/name" + } } ] }, diff --git a/packages/mock-app/src/constants/app-config.json b/packages/mock-app/src/constants/app-config.json index 99c680cd..1273cdae 100644 --- a/packages/mock-app/src/constants/app-config.json +++ b/packages/mock-app/src/constants/app-config.json @@ -687,7 +687,7 @@ } }, "dpp": { - "context": ["https://vocabulary.uncefact.org/untp/dpp/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dpp/0.5.0/"], "renderTemplate": [ { "template": " Digital Product Passport

PRODUCT PASSPORT

{{credentialSubject.name}}

{{credentialSubject.description}}
{{#each credentialSubject.furtherInformation}} {{linkName}} {{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}

{{this}}

{{/each}}
{{/if}}

Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%

Recyclable content

{{credentialSubject.circularityScorecard.recycledContent}}%

Recycled content

{{credentialSubject.circularityScorecard.utilityFactor}}

Utility factor

{{credentialSubject.circularityScorecard.materialCircularityIndicator}}

Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes

{{credentialSubject.emissionsScorecard.operationalScope}}

Primary sourced ratio*

{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

Issue date

{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}

*

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category

{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}

Date produced

{{credentialSubject.productionDate}}

Country

{{credentialSubject.countryOfProduction}}

Dimensions

Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}

Product composition

A complete list of materials that make up the composition of this product.

{{#each credentialSubject.materialsProvenance}}

{{massFraction}}%

{{massAmount.value}}{{massAmount.unit}} {{name}}

Recycled {{recycledAmount}}%

Hazard {{#if hazardous}}Yes{{else}}No{{/if}}

{{materialSafetyInformation.linkName}}
{{originCountry}}
{{/each}}

History

{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}

Passport issued by

Organisation

{{issuer.name}}

Registered ID {{issuer.id}}
Valid from

{{validFrom}}

Valid to

{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product's sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

PRODUCT PASSPORT
{{credentialSubject.name}}
Batch: {{credentialSubject.batchNumber}}
Serial: {{credentialSubject.serialNumber}}

{{credentialSubject.description}}

{{#each credentialSubject.furtherInformation}}
{{linkName}}
{{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}
{{this}}
{{/each}}
{{/if}}
Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%
Recyclable content
{{credentialSubject.circularityScorecard.recycledContent}}%
Recycled content
{{credentialSubject.circularityScorecard.utilityFactor}}
Utility factor
{{credentialSubject.circularityScorecard.materialCircularityIndicator}}
Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes
{{credentialSubject.emissionsScorecard.operationalScope}}
Primary sourced ratio*
{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Issue date
{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}
*
Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category
{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}
Date produced
{{credentialSubject.productionDate}}
Country
{{credentialSubject.countryOfProduction}}
Dimensions
Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}
Composition

The Product Composition List details the materials and components used in the product, providing transparency on the origin and nature of each element.

{{#each credentialSubject.materialsProvenance}}
{{massFraction}}%
{{massAmount.value}}{{massAmount.unit}} {{name}}
Recycled {{#if recycledAmount}}{{recycledAmount}}{{else}}0{{/if}}%
Hazard {{#if hazardous}}Yes{{else}}No{{/if}}
{{originCountry}}
{{/each}}
History
{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}
Passport issued by
Organisation
{{issuer.name}}
Registered ID
Valid from
{{validFrom}}
Valid to
{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product’s sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

", @@ -1401,7 +1401,7 @@ } }, "dpp": { - "context": ["https://vocabulary.uncefact.org/untp/dpp/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dpp/0.5.0/"], "renderTemplate": [ { "template": " Digital Product Passport

PRODUCT PASSPORT

{{credentialSubject.name}}

{{credentialSubject.description}}
{{#each credentialSubject.furtherInformation}} {{linkName}} {{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}

{{this}}

{{/each}}
{{/if}}

Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%

Recyclable content

{{credentialSubject.circularityScorecard.recycledContent}}%

Recycled content

{{credentialSubject.circularityScorecard.utilityFactor}}

Utility factor

{{credentialSubject.circularityScorecard.materialCircularityIndicator}}

Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes

{{credentialSubject.emissionsScorecard.operationalScope}}

Primary sourced ratio*

{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

Issue date

{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}

*

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category

{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}

Date produced

{{credentialSubject.productionDate}}

Country

{{credentialSubject.countryOfProduction}}

Dimensions

Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}

Product composition

A complete list of materials that make up the composition of this product.

{{#each credentialSubject.materialsProvenance}}

{{massFraction}}%

{{massAmount.value}}{{massAmount.unit}} {{name}}

Recycled {{recycledAmount}}%

Hazard {{#if hazardous}}Yes{{else}}No{{/if}}

{{materialSafetyInformation.linkName}}
{{originCountry}}
{{/each}}

History

{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}

Passport issued by

Organisation

{{issuer.name}}

Registered ID {{issuer.id}}
Valid from

{{validFrom}}

Valid to

{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product's sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

PRODUCT PASSPORT
{{credentialSubject.name}}
Batch: {{credentialSubject.batchNumber}}
Serial: {{credentialSubject.serialNumber}}

{{credentialSubject.description}}

{{#each credentialSubject.furtherInformation}}
{{linkName}}
{{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}
{{this}}
{{/each}}
{{/if}}
Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%
Recyclable content
{{credentialSubject.circularityScorecard.recycledContent}}%
Recycled content
{{credentialSubject.circularityScorecard.utilityFactor}}
Utility factor
{{credentialSubject.circularityScorecard.materialCircularityIndicator}}
Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes
{{credentialSubject.emissionsScorecard.operationalScope}}
Primary sourced ratio*
{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Issue date
{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}
*
Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category
{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}
Date produced
{{credentialSubject.productionDate}}
Country
{{credentialSubject.countryOfProduction}}
Dimensions
Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}
Composition

The Product Composition List details the materials and components used in the product, providing transparency on the origin and nature of each element.

{{#each credentialSubject.materialsProvenance}}
{{massFraction}}%
{{massAmount.value}}{{massAmount.unit}} {{name}}
Recycled {{#if recycledAmount}}{{recycledAmount}}{{else}}0{{/if}}%
Hazard {{#if hazardous}}Yes{{else}}No{{/if}}
{{originCountry}}
{{/each}}
History
{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}
Passport issued by
Organisation
{{issuer.name}}
Registered ID
Valid from
{{validFrom}}
Valid to
{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product’s sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

", @@ -1627,7 +1627,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -2574,7 +2574,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -2751,7 +2751,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -2932,7 +2932,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -3113,7 +3113,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -3315,7 +3315,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -3816,7 +3816,7 @@ } }, "digitalConformityCredential": { - "context": ["https://vocabulary.uncefact.org/untp/dcc/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dcc/0.5.0/"], "renderTemplate": [ { "template": " DigitalConformityCredential
CONFORMITY CREDENTIAL

{{credentialSubject.name}}

{{credentialSubject.description}}

Level of independent assurance:

{{credentialSubject.assessorLevel}}

Type of authority endorsement:

{{credentialSubject.assessmentLevel}}

Type of the attestation credential:

{{credentialSubject.attestationType}}
Assessments

The list of specific assessments made within this conformity attestation.

{{#each credentialSubject.assessment}}

{{conformityTopic}}

Declared values
{{#each declaredValue}}
Name
{{metricName}}
Value
{{metricValue.value}}{{metricValue.unit}}
Accuracy
{{accuracy}}
{{/each}}
Assessment Criteria
{{#each assessmentCriteria}}
{{name}}
    {{#each thresholdValues}}
  • Industry average {{metricName}} is {{metricValue.value}}{{metricValue.unit}}.

  • {{/each}}
{{/each}}
Assessed facilities
{{#each assessedFacility}}

{{name}}

{{/each}}
Assessed products
{{#each assessedProduct}}
{{name}}
{{/each}}
Other details
Assessed
{{assessmentDate}}
Organisation assessed
{{assessedOrganisation.name}}
{{/each}}
Issuer endorsement
{{#each credentialSubject.authorisation}}
trustmark
{{name}} is accredited by {{issuingAuthority.name}}.
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
Valid until
{{validUntil}}
", @@ -4233,7 +4233,7 @@ } }, "digitalFacilityRecord": { - "context": ["https://vocabulary.uncefact.org/untp/dfr/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dfr/0.5.0/"], "renderTemplate": [ { "template": " Digital Facility Record
FACILITY RECORD

{{credentialSubject.name}}

{{credentialSubject.description}}

Country
{{credentialSubject.countryOfOperation}}
Address
{{!-- TODO 1: plain text --}} {{!--
{{credentialSubject.address.streetAddress}} {{credentialSubject.address.addressLocality}}, {{credentialSubject.address.postalCode}}
--}} {{!-- TODO 2: confirm --}} {{!-- {{credentialSubject.address.streetAddress}} --}} {{!-- TODO 3: confirm --}} {{credentialSubject.address.streetAddress}} {{credentialSubject.address.addressLocality}}, {{credentialSubject.address.postalCode}}
Processes
{{#each credentialSubject.processCategory}} {{name}} {{/each}}
Geolocation
{{!-- TODO: confirm --}}
Show on map
Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
Valid until
{{validUntil}}
", @@ -4896,7 +4896,7 @@ } }, "dpp": { - "context": ["https://vocabulary.uncefact.org/untp/dpp/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dpp/0.5.0/"], "renderTemplate": [ { "template": " Digital Product Passport

PRODUCT PASSPORT

{{credentialSubject.name}}

{{credentialSubject.description}}
{{#each credentialSubject.furtherInformation}} {{linkName}} {{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}

{{this}}

{{/each}}
{{/if}}

Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%

Recyclable content

{{credentialSubject.circularityScorecard.recycledContent}}%

Recycled content

{{credentialSubject.circularityScorecard.utilityFactor}}

Utility factor

{{credentialSubject.circularityScorecard.materialCircularityIndicator}}

Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes

{{credentialSubject.emissionsScorecard.operationalScope}}

Primary sourced ratio*

{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

Issue date

{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}

*

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category

{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}

Date produced

{{credentialSubject.productionDate}}

Country

{{credentialSubject.countryOfProduction}}

Dimensions

Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}

Product composition

A complete list of materials that make up the composition of this product.

{{#each credentialSubject.materialsProvenance}}

{{massFraction}}%

{{massAmount.value}}{{massAmount.unit}} {{name}}

Recycled {{recycledAmount}}%

Hazard {{#if hazardous}}Yes{{else}}No{{/if}}

{{materialSafetyInformation.linkName}}
{{originCountry}}
{{/each}}

History

{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}

Passport issued by

Organisation

{{issuer.name}}

Registered ID {{issuer.id}}
Valid from

{{validFrom}}

Valid to

{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product's sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

PRODUCT PASSPORT
{{credentialSubject.name}}
Batch: {{credentialSubject.batchNumber}}
Serial: {{credentialSubject.serialNumber}}

{{credentialSubject.description}}

{{#each credentialSubject.furtherInformation}}
{{linkName}}
{{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}
{{this}}
{{/each}}
{{/if}}
Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%
Recyclable content
{{credentialSubject.circularityScorecard.recycledContent}}%
Recycled content
{{credentialSubject.circularityScorecard.utilityFactor}}
Utility factor
{{credentialSubject.circularityScorecard.materialCircularityIndicator}}
Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes
{{credentialSubject.emissionsScorecard.operationalScope}}
Primary sourced ratio*
{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Issue date
{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}
*
Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category
{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}
Date produced
{{credentialSubject.productionDate}}
Country
{{credentialSubject.countryOfProduction}}
Dimensions
Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}
Composition

The Product Composition List details the materials and components used in the product, providing transparency on the origin and nature of each element.

{{#each credentialSubject.materialsProvenance}}
{{massFraction}}%
{{massAmount.value}}{{massAmount.unit}} {{name}}
Recycled {{#if recycledAmount}}{{recycledAmount}}{{else}}0{{/if}}%
Hazard {{#if hazardous}}Yes{{else}}No{{/if}}
{{originCountry}}
{{/each}}
History
{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}
Passport issued by
Organisation
{{issuer.name}}
Registered ID
Valid from
{{validFrom}}
Valid to
{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product’s sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

", @@ -5117,7 +5117,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -5798,7 +5798,7 @@ } }, "dpp": { - "context": ["https://vocabulary.uncefact.org/untp/dpp/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dpp/0.5.0/"], "renderTemplate": [ { "template": " Digital Product Passport

PRODUCT PASSPORT

{{credentialSubject.name}}

{{credentialSubject.description}}
{{#each credentialSubject.furtherInformation}} {{linkName}} {{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}

{{this}}

{{/each}}
{{/if}}

Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%

Recyclable content

{{credentialSubject.circularityScorecard.recycledContent}}%

Recycled content

{{credentialSubject.circularityScorecard.utilityFactor}}

Utility factor

{{credentialSubject.circularityScorecard.materialCircularityIndicator}}

Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes

{{credentialSubject.emissionsScorecard.operationalScope}}

Primary sourced ratio*

{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

Issue date

{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}

*

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category

{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}

Date produced

{{credentialSubject.productionDate}}

Country

{{credentialSubject.countryOfProduction}}

Dimensions

Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}

Product composition

A complete list of materials that make up the composition of this product.

{{#each credentialSubject.materialsProvenance}}

{{massFraction}}%

{{massAmount.value}}{{massAmount.unit}} {{name}}

Recycled {{recycledAmount}}%

Hazard {{#if hazardous}}Yes{{else}}No{{/if}}

{{materialSafetyInformation.linkName}}
{{originCountry}}
{{/each}}

History

{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}

Passport issued by

Organisation

{{issuer.name}}

Registered ID {{issuer.id}}
Valid from

{{validFrom}}

Valid to

{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product's sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

PRODUCT PASSPORT
{{credentialSubject.name}}
Batch: {{credentialSubject.batchNumber}}
Serial: {{credentialSubject.serialNumber}}

{{credentialSubject.description}}

{{#each credentialSubject.furtherInformation}}
{{linkName}}
{{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}
{{this}}
{{/each}}
{{/if}}
Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%
Recyclable content
{{credentialSubject.circularityScorecard.recycledContent}}%
Recycled content
{{credentialSubject.circularityScorecard.utilityFactor}}
Utility factor
{{credentialSubject.circularityScorecard.materialCircularityIndicator}}
Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes
{{credentialSubject.emissionsScorecard.operationalScope}}
Primary sourced ratio*
{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Issue date
{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}
*
Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category
{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}
Date produced
{{credentialSubject.productionDate}}
Country
{{credentialSubject.countryOfProduction}}
Dimensions
Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}
Composition

The Product Composition List details the materials and components used in the product, providing transparency on the origin and nature of each element.

{{#each credentialSubject.materialsProvenance}}
{{massFraction}}%
{{massAmount.value}}{{massAmount.unit}} {{name}}
Recycled {{#if recycledAmount}}{{recycledAmount}}{{else}}0{{/if}}%
Hazard {{#if hazardous}}Yes{{else}}No{{/if}}
{{originCountry}}
{{/each}}
History
{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}
Passport issued by
Organisation
{{issuer.name}}
Registered ID
Valid from
{{validFrom}}
Valid to
{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product’s sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

", @@ -6019,7 +6019,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -6050,7 +6050,10 @@ } }, "identifierKeyPath": "/0/id", - "localStorageParams": { "storageKey": "fumigation_and_freight_forwarding_facility_dpps", "keyPath": "/0/epcList/index/name" } + "localStorageParams": { + "storageKey": "fumigation_and_freight_forwarding_facility_dpps", + "keyPath": "/0/epcList/index/name" + } } ] }, @@ -6700,7 +6703,7 @@ } }, "dpp": { - "context": ["https://vocabulary.uncefact.org/untp/dpp/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dpp/0.5.0/"], "renderTemplate": [ { "template": " Digital Product Passport

PRODUCT PASSPORT

{{credentialSubject.name}}

{{credentialSubject.description}}
{{#each credentialSubject.furtherInformation}} {{linkName}} {{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}

{{this}}

{{/each}}
{{/if}}

Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%

Recyclable content

{{credentialSubject.circularityScorecard.recycledContent}}%

Recycled content

{{credentialSubject.circularityScorecard.utilityFactor}}

Utility factor

{{credentialSubject.circularityScorecard.materialCircularityIndicator}}

Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes

{{credentialSubject.emissionsScorecard.operationalScope}}

Primary sourced ratio*

{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

Issue date

{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}

*

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category

{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}

Date produced

{{credentialSubject.productionDate}}

Country

{{credentialSubject.countryOfProduction}}

Dimensions

Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}

Product composition

A complete list of materials that make up the composition of this product.

{{#each credentialSubject.materialsProvenance}}

{{massFraction}}%

{{massAmount.value}}{{massAmount.unit}} {{name}}

Recycled {{recycledAmount}}%

Hazard {{#if hazardous}}Yes{{else}}No{{/if}}

{{materialSafetyInformation.linkName}}
{{originCountry}}
{{/each}}

History

{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}

Passport issued by

Organisation

{{issuer.name}}

Registered ID {{issuer.id}}
Valid from

{{validFrom}}

Valid to

{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product's sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

PRODUCT PASSPORT
{{credentialSubject.name}}
Batch: {{credentialSubject.batchNumber}}
Serial: {{credentialSubject.serialNumber}}

{{credentialSubject.description}}

{{#each credentialSubject.furtherInformation}}
{{linkName}}
{{/each}}
{{#if credentialSubject.characteristic}}
Characteristics
{{#each credentialSubject.characteristic}}
{{@key}}
{{this}}
{{/each}}
{{/if}}
Circularity Scorecard

The circularity Scorecard provides a simple high level summary of circularity performance of the product.

{{credentialSubject.circularityScorecard.recyclableContent}}%
Recyclable content
{{credentialSubject.circularityScorecard.recycledContent}}%
Recycled content
{{credentialSubject.circularityScorecard.utilityFactor}}
Utility factor
{{credentialSubject.circularityScorecard.materialCircularityIndicator}}
Material circularity*

*The Material Circularity Indicator provides an overall circularity score which is a function of all three of the earlier measures.

Emissions Scorecard

The Emissions Scorecard gives a clear snapshot of the product's greenhouse gas (GHG) emissions performance, providing a single indicator to assess its overall environmental impact.

{{credentialSubject.emissionsScorecard.carbonFootprint}}{{credentialSubject.emissionsScorecard.declaredUnit}}

Co2Eq

Scope includes
{{credentialSubject.emissionsScorecard.operationalScope}}
Primary sourced ratio*
{{credentialSubject.emissionsScorecard.primarySourcedRatio}}% primary sources

The Primary Sourced Ratio shows the percentage of scope 3 emissions data that is directly collected from actual sources, rather than being based on estimates.

Issue date
{{credentialSubject.emissionsScorecard.reportingStandard.issueDate}}
*
Declarations
{{#each credentialSubject.conformityClaim}}
Conformance:
{{#if conformance}}Yes{{else}}No{{/if}}
Assessed: {{assessmentDate}}
{{conformityEvidence.linkName}}

{{referenceRegulation.name}} administered in {{referenceRegulation.jurisdictionCountry}} by {{referenceRegulation.administeredBy.name}}

{{referenceStandard.name}} issued by {{referenceStandard.issuingParty.name}}

{{#each declaredValue}}

{{metricName}} is {{metricValue.value}}{{metricValue.unit}}

Score: {{score}} | Accuracy {{accuracy}}

{{/each}}
Evidence
{{/each}}
Production
Product category
{{#each credentialSubject.productCategory}}{{name}}{{#unless @last}},{{/unless}} {{/each}}
Date produced
{{credentialSubject.productionDate}}
Country
{{credentialSubject.countryOfProduction}}
Dimensions
Weight: {{credentialSubject.dimensions.weight.value}}{{credentialSubject.dimensions.weight.unit}} Length: {{credentialSubject.dimensions.length.value}}{{credentialSubject.dimensions.length.unit}} Width: {{credentialSubject.dimensions.width.value}}{{credentialSubject.dimensions.width.unit}} Height: {{credentialSubject.dimensions.height.value}}{{credentialSubject.dimensions.height.unit}} Volume: {{credentialSubject.dimensions.volume.value}}{{credentialSubject.dimensions.volume.unit}}
Composition

The Product Composition List details the materials and components used in the product, providing transparency on the origin and nature of each element.

{{#each credentialSubject.materialsProvenance}}
{{massFraction}}%
{{massAmount.value}}{{massAmount.unit}} {{name}}
Recycled {{#if recycledAmount}}{{recycledAmount}}{{else}}0{{/if}}%
Hazard {{#if hazardous}}Yes{{else}}No{{/if}}
{{originCountry}}
{{/each}}
History
{{!-- start: Supply chain due diligence report --}}
Supply chain due diligence report
{{!-- end: Supply chain due diligence report --}}

{{credentialSubject.traceabilityInformation.valueChainProcess}}

Verified ratio {{credentialSubject.traceabilityInformation.verifiedRatio}}

{{#each credentialSubject.traceabilityInformation.traceabilityEvent}}
{{linkName}} View
{{/each}}
Passport issued by
Organisation
{{issuer.name}}
Registered ID
Valid from
{{validFrom}}
Valid to
{{validUntil}}

This Digital Product Passport (DPP) is a digital record of the product’s sustainability and environmental performance, ensuring transparency and accountability in line with UNTP standards. The DPP can be verified at any time using the QR code or visiting www.untp-certification.org with the passport ID.

", @@ -6921,7 +6924,7 @@ } }, "traceabilityEvent": { - "context": ["https://vocabulary.uncefact.org/untp/dte/0.5.0/"], + "context": ["https://test.uncefact.org/vocabulary/untp/dte/0.5.0/"], "renderTemplate": [ { "template": "
DIGITAL TRACEABILITY EVENT
{{#each credentialSubject}}
{{processType}}
{{bizStep}} {{eventTime}}
Transformation
Output
{{#each outputEPCList}}
{{name}}
View
{{/each}} {{#each outputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}

Transformed

Input
{{#each inputEPCList}}
{{name}}
View
{{/each}} {{#each inputQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Transaction
Source
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Destination
{{!-- TODO: to be confirmed, since the navigation link wasn't provided --}} {{!-- being assumed --}}
View
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Object event
Object list
{{#each epcList}}
{{name}}
View
{{/each}} {{#each quantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Aggregation
{{parentEPC.name}}
View

Aggregated

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{processType}}
{{bizStep}} {{eventTime}}
Association
{{parentEPC.name}}
View

Assembled

Child list
{{#each childEPCList}}
{{name}}
View
{{/each}} {{#each childQuantityList}}
{{quantity}}{{uom}} {{productName}}
View
{{/each}}
Event sensor information
{{#each sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}
Captured at
{{time}}
Sensor type
Reading
{{value}}{{uom}}
{{/each}}
Integrity proof
{{/each}}
{{!-- TODO: to be confirmed, since the SensorElementList.sensorIntegrityProof duplicate --}} {{!-- being assumed --}} Event location information
{{/each}}
Issuing details
Issued by
Valid from
{{validFrom}}
", @@ -6952,7 +6955,10 @@ } }, "identifierKeyPath": "/0/id", - "localStorageParams": { "storageKey": "airport_terminal_facility_dpps", "keyPath": "/0/epcList/index/name" } + "localStorageParams": { + "storageKey": "airport_terminal_facility_dpps", + "keyPath": "/0/epcList/index/name" + } } ] }, diff --git a/packages/untp-playground/package.json b/packages/untp-playground/package.json index f7e95bb2..e97e067c 100644 --- a/packages/untp-playground/package.json +++ b/packages/untp-playground/package.json @@ -6,7 +6,8 @@ "dev": "next dev", "build": "next build", "start": "next start", - "lint": "next lint" + "lint": "next lint", + "test": "jest --passWithNoTests" }, "dependencies": { "@radix-ui/react-dialog": "^1.1.2", From 0de07a3f56a8789b2fed68fc69661173ff3464fc Mon Sep 17 00:00:00 2001 From: Ashley Harwood Date: Thu, 28 Nov 2024 16:05:12 +1100 Subject: [PATCH 06/12] chore: add jest config --- packages/untp-playground/jest.config.js | 37 +++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 packages/untp-playground/jest.config.js diff --git a/packages/untp-playground/jest.config.js b/packages/untp-playground/jest.config.js new file mode 100644 index 00000000..9a33e5d6 --- /dev/null +++ b/packages/untp-playground/jest.config.js @@ -0,0 +1,37 @@ +const { defaults } = require('jest-config'); +const base = require('../../jest.config.base.js'); + +module.exports = { + ...base, + rootDir: './', + moduleFileExtensions: [...defaults.moduleFileExtensions, 'mts'], + collectCoverage: false, + collectCoverageFrom: [ + '!**/infra/**', + '!**/.next/**', + '!**/types/**', + '!**/build/**', + '!**/node_modules/**', + '!**/**/index.ts', + ], + coverageReporters: ['text', 'lcov', 'json', 'json-summary'], + coverageProvider: 'v8', + coverageDirectory: './coverage', + extensionsToTreatAsEsm: ['.ts'], + testMatch: ['**/__tests__/**/*.test.*'], + testPathIgnorePatterns: ['/node_modules/'], + preset: 'ts-jest', + testEnvironment: 'node', + automock: false, + moduleNameMapper: { + '^(\\.{1,2}/.*)\\.js$': '$1', + }, + transform: { + '\\.ts$': [ + 'ts-jest', + { + useESM: true, + }, + ], + }, +}; From cc261ca602d3f52024a0f132422f6051d6dd7ed8 Mon Sep 17 00:00:00 2001 From: Ashley Harwood Date: Thu, 28 Nov 2024 16:12:21 +1100 Subject: [PATCH 07/12] chore: update test commands --- package.json | 2 +- packages/untp-playground/jest.config.js | 1 + packages/untp-playground/package.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index edd1d684..9953e2c0 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "build:components": "cd packages/components && yarn run build", "build:untp-test-suite": "cd packages/untp-test-suite && yarn run build", "build-clean": "rimraf --glob ./yarn.lock ./node_modules ./packages/*/tsconfig.tsbuildinfo ./packages/*/build ./packages/*/node_modules", - "test": "lerna exec -- yarn jest --passWithNoTests", + "test": "lerna exec -- yarn jest", "test:coverage": "lerna exec -- yarn jest --coverage && rm -rf coverage && istanbul-merge --out coverage/coverage-final.json packages/*/coverage/coverage-final.json && nyc report --temp-dir=./coverage --reporter=html --reporter=json-summary", "test:components": "cd packages/components && yarn run test", "test:services": "cd packages/services && yarn run test", diff --git a/packages/untp-playground/jest.config.js b/packages/untp-playground/jest.config.js index 9a33e5d6..6878c1e3 100644 --- a/packages/untp-playground/jest.config.js +++ b/packages/untp-playground/jest.config.js @@ -34,4 +34,5 @@ module.exports = { }, ], }, + passWithNoTests: true, // TODO: remove this after adding tests }; diff --git a/packages/untp-playground/package.json b/packages/untp-playground/package.json index e97e067c..31e48058 100644 --- a/packages/untp-playground/package.json +++ b/packages/untp-playground/package.json @@ -7,7 +7,7 @@ "build": "next build", "start": "next start", "lint": "next lint", - "test": "jest --passWithNoTests" + "test": "jest" }, "dependencies": { "@radix-ui/react-dialog": "^1.1.2", From eb749468613382490539c479a1ff800c8b26c123 Mon Sep 17 00:00:00 2001 From: Kseniya Shychko Date: Wed, 27 Nov 2024 21:41:56 +0100 Subject: [PATCH 08/12] feat: deploy test and prod stacks to uncefact AWS account --- .github/workflows/ci_cd-untp-playground.yml | 13 +- packages/untp-playground/README.md | 14 +- .../untp-playground/infra/Pulumi.prod.yaml | 5 +- .../untp-playground/infra/Pulumi.test.yaml | 5 +- packages/untp-playground/infra/Pulumi.yaml | 4 +- packages/untp-playground/infra/index.ts | 170 +----------------- packages/untp-playground/infra/infra/app.ts | 157 ++++++++++++++++ packages/untp-playground/infra/infra/base.ts | 36 ++++ packages/untp-playground/infra/infra/index.ts | 6 + packages/untp-playground/infra/infra/state.ts | 25 +++ packages/untp-playground/infra/network.ts | 44 ----- packages/untp-playground/infra/package.json | 2 +- .../untp-playground/infra/services/index.ts | 20 --- .../infra/services/untp-playground.ts | 42 ----- 14 files changed, 255 insertions(+), 288 deletions(-) create mode 100644 packages/untp-playground/infra/infra/app.ts create mode 100644 packages/untp-playground/infra/infra/base.ts create mode 100644 packages/untp-playground/infra/infra/index.ts create mode 100644 packages/untp-playground/infra/infra/state.ts delete mode 100644 packages/untp-playground/infra/network.ts delete mode 100644 packages/untp-playground/infra/services/index.ts delete mode 100644 packages/untp-playground/infra/services/untp-playground.ts diff --git a/.github/workflows/ci_cd-untp-playground.yml b/.github/workflows/ci_cd-untp-playground.yml index a55086e8..a0f3796e 100644 --- a/.github/workflows/ci_cd-untp-playground.yml +++ b/.github/workflows/ci_cd-untp-playground.yml @@ -20,8 +20,7 @@ jobs: name: Deploy to Test environment: name: test - url: https://test-playground.untp.showthething.com/untp-playground - + url: https://test.uncefact.org/test-untp-playground env: STACK_NAME: test @@ -49,10 +48,9 @@ jobs: stack-name: ${{ env.STACK_NAME}} work-dir: ./packages/untp-playground/infra env: - PULUMI_CONFIG_PASSPHRASE: ${{ secrets.PULUMI_CONFIG_PASSPHRASE }} - NEXT_PUBLIC_BASE_PATH: /untp-playground - NEXT_PUBLIC_ASSET_PREFIX: /untp-playground - NEXT_PUBLIC_IMAGE_PATH: /untp-playground/_next/image + NEXT_PUBLIC_BASE_PATH: /test-untp-playground + NEXT_PUBLIC_ASSET_PREFIX: /test-untp-playground + NEXT_PUBLIC_IMAGE_PATH: /test-untp-playground/_next/image deploy_prod: if: github.repository_owner == 'uncefact' && github.ref_type == 'tag' && github.event_name == 'workflow_dispatch' @@ -63,7 +61,7 @@ jobs: id-token: write contents: read - name: Deploy to Test + name: Deploy to Prod environment: name: production url: https://test.uncefact.org/untp-playground @@ -95,7 +93,6 @@ jobs: stack-name: ${{ env.STACK_NAME}} work-dir: ./packages/untp-playground/infra env: - PULUMI_CONFIG_PASSPHRASE: ${{ secrets.PULUMI_CONFIG_PASSPHRASE }} NEXT_PUBLIC_BASE_PATH: /untp-playground NEXT_PUBLIC_ASSET_PREFIX: /untp-playground NEXT_PUBLIC_IMAGE_PATH: /untp-playground/_next/image diff --git a/packages/untp-playground/README.md b/packages/untp-playground/README.md index 944e233e..50882ba3 100644 --- a/packages/untp-playground/README.md +++ b/packages/untp-playground/README.md @@ -6,23 +6,27 @@ yarn dev ``` -Open [http://localhost:3000/untp-playground](http://localhost:3000/untp-playground) with your browser to see the result. +Open [http://localhost:3000/](http://localhost:3000/) with your browser to see the result. ## Deployment -We use Pulumi and GitHub actions to deploy the app. Please note that basePath is set to `/untp-playground` +We use Pulumi and GitHub actions to deploy the app. The following env variables needs to be set to define basePath in order to it work with the existing CloudFront Distribution: +``` +NEXT_PUBLIC_BASE_PATH: /untp-playground +NEXT_PUBLIC_ASSET_PREFIX: /untp-playground +NEXT_PUBLIC_IMAGE_PATH: /untp-playground/_next/image +``` GitHub cicd workflow requires the following secrets: 1. PULUMI_AWS_SECRET_KEY_ID 1. PULUMI_AWS_SECRET_ACCESS_KEY -1. PULUMI_CONFIG_PASSPHRASE -AWS credentials will be replaced with OIDC role in AWS account, Pulumi config encryption will be changed to awskms. +AWS credentials will be replaced with OIDC role in AWS account, Pulumi config encryption has be changed to awskms. End-points: -1. test - https://test-playground.untp.showthething.com/untp-playground +1. test - https://test.uncefact.org/test-untp-playground 1. production - https://test.uncefact.org/untp-playground `next` branch is getting automatically deployed to test, tag is manually deployed to production. diff --git a/packages/untp-playground/infra/Pulumi.prod.yaml b/packages/untp-playground/infra/Pulumi.prod.yaml index 3f93ffb8..7cadb435 100644 --- a/packages/untp-playground/infra/Pulumi.prod.yaml +++ b/packages/untp-playground/infra/Pulumi.prod.yaml @@ -1,3 +1,4 @@ -encryptionsalt: v1:s7U8g+h+M9U=:v1:XygF60QEVVwYn3LB:Fhv90G/lKl8k/C6BObepBlMqWY3vgg== +secretsprovider: awskms://alias/untp-pg-base?region=us-east-1 +encryptedkey: AQICAHiQPtPpMskboX6hzwJRSoxN1ESI7Hg9WiuyfnhBuWLLrAGLJOOpNF5D3yPTR4Dj/T7UAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMKhbr+O8ooFzmePRFAgEQgDt2DMNetQ5kFc7ahK1U4kXiIYwn+zCnoXq0oI6CSK44yjkdFFk5NLwO6M2OTIWvlkbGLLxg8JMK6/yNOA== config: - domain: "playground.untp.showthething.com" + appURL: "https://test.uncefact.org/untp-playground" \ No newline at end of file diff --git a/packages/untp-playground/infra/Pulumi.test.yaml b/packages/untp-playground/infra/Pulumi.test.yaml index 3181439a..4141d808 100644 --- a/packages/untp-playground/infra/Pulumi.test.yaml +++ b/packages/untp-playground/infra/Pulumi.test.yaml @@ -1,3 +1,4 @@ -encryptionsalt: v1:K20uwSxHGr8=:v1:+CqwmCEMvMU+56x4:P3zV3Azohm0se7uMdtnrd3Qlr/tbuQ== +secretsprovider: awskms://alias/untp-pg-base?region=us-east-1 +encryptedkey: AQICAHiQPtPpMskboX6hzwJRSoxN1ESI7Hg9WiuyfnhBuWLLrAFxHhmNJ+lmjYpTAl3664O0AAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMr1XsDGUO1y8LDkCEAgEQgDt2zh99T15QUYnynakVTBrJEAKRpniRKBpV2XmI4sasMA4mcRjW15kuyzDmiOqMRPB2n1e1PMX6nPYtKA== config: - domain: "test-playground.untp.showthething.com" + appURL: "https://test.uncefact.org/test-untp-playground" \ No newline at end of file diff --git a/packages/untp-playground/infra/Pulumi.yaml b/packages/untp-playground/infra/Pulumi.yaml index 3892170a..318e4c35 100644 --- a/packages/untp-playground/infra/Pulumi.yaml +++ b/packages/untp-playground/infra/Pulumi.yaml @@ -1,10 +1,10 @@ name: untp-demo runtime: nodejs description: Pulumi project for UNTP Demo deployments -backend: - url: "s3://untp-demo-state-backend-4eb3960?region=us-east-1" config: pulumi:tags: value: pulumi:template: aws-typescript aws:region: us-east-1 +backend: + url: "s3://untp-pg-state-bucket-6fe8422?region=us-east-1" \ No newline at end of file diff --git a/packages/untp-playground/infra/index.ts b/packages/untp-playground/infra/index.ts index 24df1f63..77a11026 100644 --- a/packages/untp-playground/infra/index.ts +++ b/packages/untp-playground/infra/index.ts @@ -1,165 +1,11 @@ -import * as aws from '@pulumi/aws'; -import * as awsx from '@pulumi/awsx'; -import * as pulumi from '@pulumi/pulumi'; +import * as pulumi from "@pulumi/pulumi"; +import { configureBase, createStateBucket, deployApp } from './infra'; -const stack = pulumi.getStack(); +//const {backendUrl, stateBucket} = createStateBucket(); +//const secretProviderURL = configureBase(); +const appURL = deployApp(); -let awsConfig = new pulumi.Config('aws'); -let awsRegion = awsConfig.require('region'); +//export const backend = backendUrl; +//export const secret = secretProviderURL; -const domainName = new pulumi.Config().require('domain'); - -const vpc = new awsx.ec2.Vpc(`app-vpc-${stack}`, { - cidrBlock: '10.0.0.0/16', - numberOfAvailabilityZones: 2, - enableDnsHostnames: true, - natGateways: { - strategy: awsx.ec2.NatGatewayStrategy.Single, - }, -}); - -const appSg = new aws.ec2.SecurityGroup( - `app-sg-${stack}`, - { - vpcId: vpc.vpcId, - ingress: [{ protocol: 'tcp', fromPort: 3000, toPort: 3000, cidrBlocks: ['0.0.0.0/0'] }], - egress: [{ protocol: '-1', fromPort: 0, toPort: 0, cidrBlocks: ['0.0.0.0/0'] }], - }, - { - dependsOn: [vpc], - }, -); - -const appLBSg = new aws.ec2.SecurityGroup( - `app-lb-sg-${stack}`, - { - vpcId: vpc.vpcId, - ingress: [ - { protocol: 'tcp', fromPort: 3000, toPort: 3000, cidrBlocks: ['0.0.0.0/0'] }, - { protocol: 'tcp', fromPort: 80, toPort: 80, cidrBlocks: ['0.0.0.0/0'] }, - { protocol: 'tcp', fromPort: 443, toPort: 443, cidrBlocks: ['0.0.0.0/0'] }, - ], - egress: [{ protocol: '-1', fromPort: 0, toPort: 0, cidrBlocks: ['0.0.0.0/0'] }], - }, - { - dependsOn: [vpc], - }, -); - -const cert = new aws.acm.Certificate(`app-cert-${stack}`, { - domainName: domainName, - validationMethod: 'DNS', - validationOptions: [ - { - domainName: domainName, - validationDomain: 'untp.showthething.com', - }, - ], -}); - -const targetGroup = new aws.lb.TargetGroup( - `app-tg-${stack}`, - { - targetType: 'ip', - vpcId: vpc.vpcId, - port: 3000, - protocol: 'HTTP', - healthCheck: { - path: '/untp-playground', - interval: 30, - timeout: 15, - healthyThreshold: 2, - unhealthyThreshold: 2, - }, - }, - { - dependsOn: [vpc], - }, -); - -const lb = new awsx.lb.ApplicationLoadBalancer( - `app-lb-${stack}`, - { - subnetIds: vpc.publicSubnetIds, - securityGroups: [appLBSg.id], - listeners: [ - { - port: 443, - protocol: 'HTTPS', - sslPolicy: 'ELBSecurityPolicy-2016-08', - certificateArn: cert.arn, - defaultActions: [ - { - type: 'forward', - targetGroupArn: targetGroup.arn, - }, - ], - }, - { - port: 80, - protocol: 'HTTP', - defaultActions: [ - { - type: 'redirect', - redirect: { - port: '443', - protocol: 'HTTPS', - statusCode: 'HTTP_301', - }, - }, - ], - }, - ], - }, - { - dependsOn: [vpc, appLBSg, targetGroup, cert], - }, -); - -const cluster = new aws.ecs.Cluster(`app-cluster-${stack}`); - -const appRepository = new awsx.ecr.Repository(`app-ecr-${stack}`); - -const appImage = new awsx.ecr.Image(`app-image-${stack}`, { - repositoryUrl: appRepository.url, - platform: 'linux/amd64', - context: '../', - args: { - ...(process.env.NEXT_PUBLIC_BASE_PATH && { NEXT_PUBLIC_BASE_PATH: process.env.NEXT_PUBLIC_BASE_PATH }), - ...(process.env.NEXT_PUBLIC_ASSET_PREFIX && { NEXT_PUBLIC_ASSET_PREFIX: process.env.NEXT_PUBLIC_ASSET_PREFIX }), - ...(process.env.NEXT_PUBLIC_IMAGE_PATH && { NEXT_PUBLIC_IMAGE_PATH: process.env.NEXT_PUBLIC_IMAGE_PATH }), - }, -}); - -const service = new awsx.ecs.FargateService( - `app-service-${stack}`, - { - cluster: cluster.arn, - desiredCount: 1, - taskDefinitionArgs: { - container: { - name: `app-${stack}`, - image: appImage.imageUri, - cpu: 128, - memory: 512, - essential: true, - portMappings: [ - { - containerPort: 3000, - targetGroup: targetGroup, - }, - ], - }, - }, - networkConfiguration: { - subnets: vpc.publicSubnetIds, - securityGroups: [appSg.id], - assignPublicIp: true, - }, - }, - { - dependsOn: [vpc, appSg, targetGroup, cluster, lb], - }, -); - -export const url = pulumi.interpolate`https://${domainName}/untp-playground`; +export const url = appURL; \ No newline at end of file diff --git a/packages/untp-playground/infra/infra/app.ts b/packages/untp-playground/infra/infra/app.ts new file mode 100644 index 00000000..16033486 --- /dev/null +++ b/packages/untp-playground/infra/infra/app.ts @@ -0,0 +1,157 @@ +import * as aws from '@pulumi/aws'; +import * as awsx from '@pulumi/awsx'; +import * as pulumi from '@pulumi/pulumi'; + + +export function deployApp(){ + +const stack = pulumi.getStack(); + +let awsConfig = new pulumi.Config('aws'); +let awsRegion = awsConfig.require('region'); +const appURL = new pulumi.Config().require("appURL") + +const vpc = new awsx.ec2.Vpc(`app-vpc-${stack}`, { + cidrBlock: '10.0.0.0/16', + numberOfAvailabilityZones: 2, + enableDnsHostnames: true, + natGateways: { + strategy: awsx.ec2.NatGatewayStrategy.Single, + }, +}); + +const appSg = new aws.ec2.SecurityGroup( + `app-sg-${stack}`, + { + vpcId: vpc.vpcId, + ingress: [{ protocol: 'tcp', fromPort: 3000, toPort: 3000, cidrBlocks: ['0.0.0.0/0'] }], + egress: [{ protocol: '-1', fromPort: 0, toPort: 0, cidrBlocks: ['0.0.0.0/0'] }], + }, + { + dependsOn: [vpc], + }, +); + +const appLBSg = new aws.ec2.SecurityGroup( + `app-lb-sg-${stack}`, + { + vpcId: vpc.vpcId, + ingress: [ + { protocol: 'tcp', fromPort: 3000, toPort: 3000, cidrBlocks: ['0.0.0.0/0'] }, + { protocol: 'tcp', fromPort: 80, toPort: 80, cidrBlocks: ['0.0.0.0/0'] }, + { protocol: 'tcp', fromPort: 443, toPort: 443, cidrBlocks: ['0.0.0.0/0'] }, + ], + egress: [{ protocol: '-1', fromPort: 0, toPort: 0, cidrBlocks: ['0.0.0.0/0'] }], + }, + { + dependsOn: [vpc], + }, +); + + +const targetGroup = new aws.lb.TargetGroup( + `app-tg-${stack}`, + { + targetType: 'ip', + vpcId: vpc.vpcId, + port: 3000, + protocol: 'HTTP', + healthCheck: { + path: process.env.NEXT_PUBLIC_BASE_PATH, + interval: 30, + timeout: 15, + healthyThreshold: 2, + unhealthyThreshold: 2, + }, + }, + { + dependsOn: [vpc], + }, +); + +const lb = new awsx.lb.ApplicationLoadBalancer( + `app-lb-${stack}`, + { + subnetIds: vpc.publicSubnetIds, + securityGroups: [appLBSg.id], + listeners: [ + { + port: 443, + protocol: 'HTTPS', + sslPolicy: 'ELBSecurityPolicy-2016-08', + certificateArn: "arn:aws:acm:us-east-1:651690125008:certificate/ff8d87f3-f587-42cb-9edb-6badfad1937b", + defaultActions: [ + { + type: 'forward', + targetGroupArn: targetGroup.arn, + }, + ], + }, + { + port: 80, + protocol: 'HTTP', + defaultActions: [ + { + type: 'redirect', + redirect: { + port: '443', + protocol: 'HTTPS', + statusCode: 'HTTP_301', + }, + }, + ], + }, + ], + }, + { + dependsOn: [vpc, appLBSg, targetGroup], + }, +); + +const cluster = new aws.ecs.Cluster(`app-cluster-${stack}`); + +const appRepository = new awsx.ecr.Repository(`app-ecr-${stack}`); + +const appImage = new awsx.ecr.Image(`app-image-${stack}`, { + repositoryUrl: appRepository.url, + platform: 'linux/amd64', + context: '../', + args: { + ...(process.env.NEXT_PUBLIC_BASE_PATH && { NEXT_PUBLIC_BASE_PATH: process.env.NEXT_PUBLIC_BASE_PATH }), + ...(process.env.NEXT_PUBLIC_ASSET_PREFIX && { NEXT_PUBLIC_ASSET_PREFIX: process.env.NEXT_PUBLIC_ASSET_PREFIX }), + ...(process.env.NEXT_PUBLIC_IMAGE_PATH && { NEXT_PUBLIC_IMAGE_PATH: process.env.NEXT_PUBLIC_IMAGE_PATH }), + }, +}); + +const service = new awsx.ecs.FargateService( + `app-service-${stack}`, + { + cluster: cluster.arn, + desiredCount: 1, + taskDefinitionArgs: { + container: { + name: `app-${stack}`, + image: appImage.imageUri, + cpu: 128, + memory: 512, + essential: true, + portMappings: [ + { + containerPort: 3000, + targetGroup: targetGroup, + }, + ], + }, + }, + networkConfiguration: { + subnets: vpc.publicSubnetIds, + securityGroups: [appSg.id], + assignPublicIp: true, + }, + }, + { + dependsOn: [vpc, appSg, targetGroup, cluster, lb], + }, +); +return appURL; +} \ No newline at end of file diff --git a/packages/untp-playground/infra/infra/base.ts b/packages/untp-playground/infra/infra/base.ts new file mode 100644 index 00000000..d60da8df --- /dev/null +++ b/packages/untp-playground/infra/infra/base.ts @@ -0,0 +1,36 @@ +import * as pulumi from "@pulumi/pulumi"; +import * as aws from "@pulumi/aws"; + +export function configureBase (){ +let awsConfig = new pulumi.Config('aws'); +let awsRegion = awsConfig.require('region'); +const current = aws.getCallerIdentity({}); +const kmsKey = new aws.kms.Key("base", { + description: "default key used for untp-playground", + enableKeyRotation: true, + deletionWindowInDays: 20, + policy: JSON.stringify({ + Version: "2012-10-17", + Id: "key-default-1", + Statement: [{ + Action: "kms:*", + Effect: "Allow", + Principal: { + AWS: "*", + }, + Resource: "*", + Sid: "Enable IAM User Permissions", + }], + }), +}, +{protect: false}); + +const keyAlias = new aws.kms.Alias("alias", { + name: "alias/untp-pg-base", + targetKeyId: kmsKey.keyId, +}, +{protect: false}); + +const secretProviderURL = `awskms://${keyAlias}?region=${awsRegion}`; +return secretProviderURL; +} diff --git a/packages/untp-playground/infra/infra/index.ts b/packages/untp-playground/infra/infra/index.ts new file mode 100644 index 00000000..e71d524a --- /dev/null +++ b/packages/untp-playground/infra/infra/index.ts @@ -0,0 +1,6 @@ +import * as aws from "@pulumi/aws"; +import * as awsx from "@pulumi/awsx"; + +export * from './base'; +export * from './state'; +export * from './app'; diff --git a/packages/untp-playground/infra/infra/state.ts b/packages/untp-playground/infra/infra/state.ts new file mode 100644 index 00000000..d28c3e6a --- /dev/null +++ b/packages/untp-playground/infra/infra/state.ts @@ -0,0 +1,25 @@ +import * as pulumi from "@pulumi/pulumi"; +import * as aws from "@pulumi/aws"; + +export function createStateBucket (){ + +// Define the S3 bucket where the Pulumi state will be stored +const s3BucketName = "untp-pg-state-bucket"; + +// Create an S3 Bucket for storing state files +const stateBucket = new aws.s3.Bucket(s3BucketName, { + acl: "private", // Private ACL so only the specified AWS credentials can access it + versioning: { + enabled: true, // Enable versioning for backup and recovery + }, + // Additional settings like server-side encryption, lifecycle rules, etc., could be configured here +}, +{protect: false}); + +// Construct the S3 backend URL dynamically based on the bucket we've created +const backendUrl = pulumi.interpolate`s3://${stateBucket.id}`; + +// The state bucket needs to be provisioned before the backend configuration +return { backendUrl, stateBucket } + +} diff --git a/packages/untp-playground/infra/network.ts b/packages/untp-playground/infra/network.ts deleted file mode 100644 index ac583f13..00000000 --- a/packages/untp-playground/infra/network.ts +++ /dev/null @@ -1,44 +0,0 @@ -import * as pulumi from "@pulumi/pulumi"; -import * as aws from "@pulumi/aws"; -import * as awsx from "@pulumi/awsx"; - -interface Props { - stack: string; -} - -export function configureNetwork({ stack }: Props) { - const vpc = new awsx.ec2.Vpc(`vpc-${stack}`, { - cidrBlock: "10.0.0.0/16", - numberOfAvailabilityZones: 2, - enableDnsHostnames: true, - }); - - const appSg = new aws.ec2.SecurityGroup(`api-${stack}`, { - vpcId: vpc.vpcId, - ingress: [ - { protocol: "tcp", fromPort: 3000, toPort: 3000, cidrBlocks: ["0.0.0.0/0"] }, - { protocol: "tcp", fromPort: 80, toPort: 80, cidrBlocks: ["0.0.0.0/0"] } - ], - egress: [ - { protocol: "-1", fromPort: 0, toPort: 0, cidrBlocks: ["0.0.0.0/0"] } - ] - }); - - const lb = new awsx.lb.ApplicationLoadBalancer(`lb-${stack}`, { - subnetIds: vpc.publicSubnetIds, - defaultTargetGroup: { - vpcId: vpc.vpcId, - port: 3000, - healthCheck: { - path: "/untp-playground", - interval: 30, - timeout: 15, - healthyThreshold: 2, - unhealthyThreshold: 2, - }, - }, - securityGroups: [appSg.id], - }); - - return { vpc, appSg, lb } -} \ No newline at end of file diff --git a/packages/untp-playground/infra/package.json b/packages/untp-playground/infra/package.json index ca4d7553..176106d6 100644 --- a/packages/untp-playground/infra/package.json +++ b/packages/untp-playground/infra/package.json @@ -1,5 +1,5 @@ { - "name": "untp-demo", + "name": "untp-playground", "main": "index.ts", "devDependencies": { "@types/node": "^18", diff --git a/packages/untp-playground/infra/services/index.ts b/packages/untp-playground/infra/services/index.ts deleted file mode 100644 index fc5ec6fc..00000000 --- a/packages/untp-playground/infra/services/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -import * as aws from "@pulumi/aws"; -import * as awsx from "@pulumi/awsx"; - -interface Props { - stack: string; - vpc: awsx.ec2.Vpc; -} - -export function configureServices({ stack, vpc }: Props) { - const cluster = new aws.ecs.Cluster(`cluster-${stack}`); - - const namespace = new aws.servicediscovery.PrivateDnsNamespace(`namespace-${stack}`, { - vpc: vpc.vpcId, - name: "service.local", - }); - - return { cluster, namespace } -} - -export * from './untp-playground'; \ No newline at end of file diff --git a/packages/untp-playground/infra/services/untp-playground.ts b/packages/untp-playground/infra/services/untp-playground.ts deleted file mode 100644 index 3dbd7587..00000000 --- a/packages/untp-playground/infra/services/untp-playground.ts +++ /dev/null @@ -1,42 +0,0 @@ -import * as aws from "@pulumi/aws"; -import * as awsx from "@pulumi/awsx"; - -interface Props { - stack: string; - env: string; - vpc: awsx.ec2.Vpc; - cluster: aws.ecs.Cluster; - appSg: aws.ec2.SecurityGroup; - lb: awsx.lb.ApplicationLoadBalancer; -} - -export function configureApp({ stack, env, vpc, cluster, appSg, lb }: Props) { - const appRepository = new awsx.ecr.Repository(`app-${stack}`); - - const appImage = new awsx.ecr.Image(`app-${stack}`, { - repositoryUrl: appRepository.url, - platform: 'linux/amd64', - context: "../" - }); - - const appService = new awsx.ecs.FargateService("app-service", { - cluster: cluster.arn, - taskDefinitionArgs: { - container: { - name: `app-${stack}`, - image: appImage.imageUri, - cpu: 128, - memory: 256, - portMappings: [ - { containerPort: 3000, targetGroup: lb.defaultTargetGroup }, - ], - }, - }, - networkConfiguration: { - subnets: vpc.publicSubnetIds, - securityGroups: [appSg.id], - assignPublicIp: true - }, - desiredCount: 1, - }); -} \ No newline at end of file From af05f0365638e663f3a6593310078f9309303010 Mon Sep 17 00:00:00 2001 From: Kseniya Shychko Date: Wed, 27 Nov 2024 21:53:50 +0100 Subject: [PATCH 09/12] chore: add path for untp-playground deploy on push --- .github/workflows/ci_cd-untp-playground.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci_cd-untp-playground.yml b/.github/workflows/ci_cd-untp-playground.yml index a0f3796e..59e6426c 100644 --- a/.github/workflows/ci_cd-untp-playground.yml +++ b/.github/workflows/ci_cd-untp-playground.yml @@ -5,6 +5,9 @@ on: push: branches: - next + - 'cd/*' + paths: + - 'packages/untp-playground/**' jobs: #todo: add running tests job From 9dd95a5077fc13a8e3bf682fdeebc99d7676351d Mon Sep 17 00:00:00 2001 From: Kseniya Shychko Date: Thu, 28 Nov 2024 00:59:54 +0100 Subject: [PATCH 10/12] chore: use AWS OIDC and install pulumi --- .github/workflows/ci_cd-untp-playground.yml | 49 ++++++++++--------- packages/untp-playground/README.md | 9 ++-- packages/untp-playground/infra/index.ts | 3 +- packages/untp-playground/infra/infra/base.ts | 4 +- packages/untp-playground/infra/infra/state.ts | 3 +- 5 files changed, 35 insertions(+), 33 deletions(-) diff --git a/.github/workflows/ci_cd-untp-playground.yml b/.github/workflows/ci_cd-untp-playground.yml index 59e6426c..6fa3285d 100644 --- a/.github/workflows/ci_cd-untp-playground.yml +++ b/.github/workflows/ci_cd-untp-playground.yml @@ -5,7 +5,7 @@ on: push: branches: - next - - 'cd/*' + - 'cd/**' paths: - 'packages/untp-playground/**' @@ -24,25 +24,27 @@ jobs: environment: name: test url: https://test.uncefact.org/test-untp-playground - env: - STACK_NAME: test runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - # TODO: setup a role in AWS account - - name: Configure AWS Credentials + - name: aws_login_uncefact uses: aws-actions/configure-aws-credentials@v4 with: - aws-access-key-id: ${{ secrets.PULUMI_AWS_SECRET_KEY_ID }} - aws-region: ap-southeast-2 - aws-secret-access-key: ${{ secrets.PULUMI_AWS_SECRET_ACCESS_KEY }} + role-to-assume: arn:aws:iam::651690125008:role/tests_untp + aws-region: us-east-1 - - name: setup_python - uses: actions/setup-python@v5 + + - name: Setup Node LTS ✨ + uses: actions/setup-node@v3 with: - python-version: '3.10' + node-version: lts/* + cache: yarn + + - name: Installing dependencies 📦️ + run: yarn install + working-directory: ./packages/untp-playground/infra - name: Deploy Stack uses: pulumi/actions@v5 @@ -54,6 +56,7 @@ jobs: NEXT_PUBLIC_BASE_PATH: /test-untp-playground NEXT_PUBLIC_ASSET_PREFIX: /test-untp-playground NEXT_PUBLIC_IMAGE_PATH: /test-untp-playground/_next/image + STACK_NAME: test deploy_prod: if: github.repository_owner == 'uncefact' && github.ref_type == 'tag' && github.event_name == 'workflow_dispatch' @@ -69,25 +72,26 @@ jobs: name: production url: https://test.uncefact.org/untp-playground - env: - STACK_NAME: prod - runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - # TODO: setup a role in AWS account - - name: Configure AWS Credentials + - name: aws_login_uncefact uses: aws-actions/configure-aws-credentials@v4 with: - aws-access-key-id: ${{ secrets.PULUMI_AWS_SECRET_KEY_ID }} - aws-region: ap-southeast-2 - aws-secret-access-key: ${{ secrets.PULUMI_AWS_SECRET_ACCESS_KEY }} + role-to-assume: arn:aws:iam::651690125008:role/tests_untp + aws-region: us-east-1 + - - name: setup_python - uses: actions/setup-python@v5 + - name: Setup Node LTS ✨ + uses: actions/setup-node@v3 with: - python-version: '3.10' + node-version: lts/* + cache: yarn + + - name: Installing dependencies 📦️ + run: yarn install + working-directory: ./packages/untp-playground/infra - name: Deploy Stack uses: pulumi/actions@v5 @@ -99,3 +103,4 @@ jobs: NEXT_PUBLIC_BASE_PATH: /untp-playground NEXT_PUBLIC_ASSET_PREFIX: /untp-playground NEXT_PUBLIC_IMAGE_PATH: /untp-playground/_next/image + STACK_NAME: prod diff --git a/packages/untp-playground/README.md b/packages/untp-playground/README.md index 50882ba3..27da65c3 100644 --- a/packages/untp-playground/README.md +++ b/packages/untp-playground/README.md @@ -17,12 +17,9 @@ NEXT_PUBLIC_ASSET_PREFIX: /untp-playground NEXT_PUBLIC_IMAGE_PATH: /untp-playground/_next/image ``` -GitHub cicd workflow requires the following secrets: - -1. PULUMI_AWS_SECRET_KEY_ID -1. PULUMI_AWS_SECRET_ACCESS_KEY - -AWS credentials will be replaced with OIDC role in AWS account, Pulumi config encryption has be changed to awskms. +GitHub OIDC is configured in AWS account for GitHub Actions workflow to assume and run the deployment using Pulumi. +Pulume security prodiver for config is set to awskms. +The same backend state bucket and kms key are used for both test and prod Pulumi stacks. End-points: diff --git a/packages/untp-playground/infra/index.ts b/packages/untp-playground/infra/index.ts index 77a11026..e0663773 100644 --- a/packages/untp-playground/infra/index.ts +++ b/packages/untp-playground/infra/index.ts @@ -1,7 +1,8 @@ import * as pulumi from "@pulumi/pulumi"; import { configureBase, createStateBucket, deployApp } from './infra'; -//const {backendUrl, stateBucket} = createStateBucket(); +//TODO: refactor - bakend state bucket and and kms key for secrets provider needs to be moved to a separate stack +const {backendUrl, stateBucket} = createStateBucket(); //const secretProviderURL = configureBase(); const appURL = deployApp(); diff --git a/packages/untp-playground/infra/infra/base.ts b/packages/untp-playground/infra/infra/base.ts index d60da8df..f918aa8b 100644 --- a/packages/untp-playground/infra/infra/base.ts +++ b/packages/untp-playground/infra/infra/base.ts @@ -23,13 +23,13 @@ const kmsKey = new aws.kms.Key("base", { }], }), }, -{protect: false}); +{protect: true,ignoreChanges: ["prop"] }); const keyAlias = new aws.kms.Alias("alias", { name: "alias/untp-pg-base", targetKeyId: kmsKey.keyId, }, -{protect: false}); +{protect: true, ignoreChanges: ["prop"] }); const secretProviderURL = `awskms://${keyAlias}?region=${awsRegion}`; return secretProviderURL; diff --git a/packages/untp-playground/infra/infra/state.ts b/packages/untp-playground/infra/infra/state.ts index d28c3e6a..ff6c36df 100644 --- a/packages/untp-playground/infra/infra/state.ts +++ b/packages/untp-playground/infra/infra/state.ts @@ -13,8 +13,7 @@ const stateBucket = new aws.s3.Bucket(s3BucketName, { enabled: true, // Enable versioning for backup and recovery }, // Additional settings like server-side encryption, lifecycle rules, etc., could be configured here -}, -{protect: false}); +}, { ignoreChanges: ["prop"] }); // Construct the S3 backend URL dynamically based on the bucket we've created const backendUrl = pulumi.interpolate`s3://${stateBucket.id}`; From 5cdfbbbc69b0cf587a34a915933bde0590f05e6d Mon Sep 17 00:00:00 2001 From: Kseniya Shychko Date: Thu, 28 Nov 2024 10:28:46 +0100 Subject: [PATCH 11/12] fix: set AWS role as a repo secret --- .github/workflows/ci_cd-untp-playground.yml | 8 ++++++-- packages/untp-playground/README.md | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci_cd-untp-playground.yml b/.github/workflows/ci_cd-untp-playground.yml index 6fa3285d..4c0fc28d 100644 --- a/.github/workflows/ci_cd-untp-playground.yml +++ b/.github/workflows/ci_cd-untp-playground.yml @@ -32,8 +32,10 @@ jobs: - name: aws_login_uncefact uses: aws-actions/configure-aws-credentials@v4 with: - role-to-assume: arn:aws:iam::651690125008:role/tests_untp + role-to-assume: ${{env.AWS_ROLE_TO_ASSUME}} aws-region: us-east-1 + env: + AWS_ROLE_TO_ASSUME: ${{ secrets.UNCEFACT_AWS_ROLE_TO_ASSUME}} - name: Setup Node LTS ✨ @@ -79,8 +81,10 @@ jobs: - name: aws_login_uncefact uses: aws-actions/configure-aws-credentials@v4 with: - role-to-assume: arn:aws:iam::651690125008:role/tests_untp + role-to-assume: ${{env.AWS_ROLE_TO_ASSUME}} aws-region: us-east-1 + env: + AWS_ROLE_TO_ASSUME: ${{ secrets.UNCEFACT_AWS_ROLE_TO_ASSUME}} - name: Setup Node LTS ✨ diff --git a/packages/untp-playground/README.md b/packages/untp-playground/README.md index 27da65c3..9ac047c7 100644 --- a/packages/untp-playground/README.md +++ b/packages/untp-playground/README.md @@ -17,7 +17,7 @@ NEXT_PUBLIC_ASSET_PREFIX: /untp-playground NEXT_PUBLIC_IMAGE_PATH: /untp-playground/_next/image ``` -GitHub OIDC is configured in AWS account for GitHub Actions workflow to assume and run the deployment using Pulumi. +GitHub OIDC is configured in AWS account for GitHub Actions workflow to assume and run the deployment using Pulumi. The role to assume is set as a repository secret `UNCEFACT_AWS_ROLE_TO_ASSUME`. Pulume security prodiver for config is set to awskms. The same backend state bucket and kms key are used for both test and prod Pulumi stacks. From 74886eddf2dd67e7c3f4e427045d07819ba548d6 Mon Sep 17 00:00:00 2001 From: Kseniya Shychko Date: Thu, 28 Nov 2024 11:40:15 +0100 Subject: [PATCH 12/12] fix: include the wokflow to push trigger path --- .github/workflows/ci_cd-untp-playground.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci_cd-untp-playground.yml b/.github/workflows/ci_cd-untp-playground.yml index 4c0fc28d..165aefe2 100644 --- a/.github/workflows/ci_cd-untp-playground.yml +++ b/.github/workflows/ci_cd-untp-playground.yml @@ -8,6 +8,7 @@ on: - 'cd/**' paths: - 'packages/untp-playground/**' + - '.github/workflows/ci_cd-untp-playground.yml' jobs: #todo: add running tests job